cereal/assets/doxygen/polymorphic__impl_8hpp_source.html
2022-02-27 19:48:38 -08:00

824 lines
150 KiB
HTML
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.17"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>cereal: polymorphic_impl.hpp Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">cereal
</div>
<div id="projectbrief">A C++11 library for serialization</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.17 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
var searchBox = new SearchBox("searchBox", "search",false,'Search');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */</script>
<div id="main-nav"></div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div id="nav-path" class="navpath">
<ul>
<li class="navelem"><a class="el" href="dir_d44c64559bbebec7f509842c48db8b23.html">include</a></li><li class="navelem"><a class="el" href="dir_d445d0c097210746bce3afd9a77bcad9.html">cereal</a></li><li class="navelem"><a class="el" href="dir_68487379e3503fe9d657f67af15dc5dc.html">details</a></li> </ul>
</div>
</div><!-- top -->
<div class="header">
<div class="headertitle">
<div class="title">polymorphic_impl.hpp</div> </div>
</div><!--header-->
<div class="contents">
<a href="polymorphic__impl_8hpp.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160; </div>
<div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="comment">/*</span></div>
<div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="comment"> Copyright (c) 2014, Randolph Voorhies, Shane Grant</span></div>
<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="comment"> All rights reserved.</span></div>
<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;<span class="comment"></span> </div>
<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="comment"> Redistribution and use in source and binary forms, with or without</span></div>
<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="comment"> modification, are permitted provided that the following conditions are met:</span></div>
<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="comment"> * Redistributions of source code must retain the above copyright</span></div>
<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="comment"> notice, this list of conditions and the following disclaimer.</span></div>
<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;<span class="comment"> * Redistributions in binary form must reproduce the above copyright</span></div>
<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160;<span class="comment"> notice, this list of conditions and the following disclaimer in the</span></div>
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160;<span class="comment"> documentation and/or other materials provided with the distribution.</span></div>
<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;<span class="comment"> * Neither the name of the copyright holder nor the</span></div>
<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160;<span class="comment"> names of its contributors may be used to endorse or promote products</span></div>
<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;<span class="comment"> derived from this software without specific prior written permission.</span></div>
<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;<span class="comment"></span> </div>
<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160;<span class="comment"> THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS IS&quot; AND</span></div>
<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160;<span class="comment"> ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED</span></div>
<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160;<span class="comment"> WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE</span></div>
<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160;<span class="comment"> DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY</span></div>
<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160;<span class="comment"> DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES</span></div>
<div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160;<span class="comment"> (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;</span></div>
<div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160;<span class="comment"> LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND</span></div>
<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160;<span class="comment"> ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</span></div>
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160;<span class="comment"> (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS</span></div>
<div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160;<span class="comment"> SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span></div>
<div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160;<span class="comment">*/</span></div>
<div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160; </div>
<div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160;<span class="comment">/* This code is heavily inspired by the boost serialization implementation by the following authors</span></div>
<div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160;<span class="comment"></span> </div>
<div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160;<span class="comment"> (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .</span></div>
<div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160;<span class="comment"> Use, modification and distribution is subject to the Boost Software</span></div>
<div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160;<span class="comment"> License, Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt)</span></div>
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160;<span class="comment"></span> </div>
<div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160;<span class="comment"> See http://www.boost.org for updates, documentation, and revision history.</span></div>
<div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160;<span class="comment"></span> </div>
<div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160;<span class="comment"> (C) Copyright 2006 David Abrahams - http://www.boost.org.</span></div>
<div class="line"><a name="l00040"></a><span class="lineno"> 40</span>&#160;<span class="comment"></span> </div>
<div class="line"><a name="l00041"></a><span class="lineno"> 41</span>&#160;<span class="comment"> See /boost/serialization/export.hpp, /boost/archive/detail/register_archive.hpp,</span></div>
<div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160;<span class="comment"> and /boost/serialization/void_cast.hpp for their implementation. Additional details</span></div>
<div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160;<span class="comment"> found in other files split across serialization and archive.</span></div>
<div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160;<span class="comment">*/</span></div>
<div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160;<span class="preprocessor">#ifndef CEREAL_DETAILS_POLYMORPHIC_IMPL_HPP_</span></div>
<div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160;<span class="preprocessor">#define CEREAL_DETAILS_POLYMORPHIC_IMPL_HPP_</span></div>
<div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160; </div>
<div class="line"><a name="l00048"></a><span class="lineno"> 48</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="polymorphic__impl__fwd_8hpp.html">cereal/details/polymorphic_impl_fwd.hpp</a>&quot;</span></div>
<div class="line"><a name="l00049"></a><span class="lineno"> 49</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="static__object_8hpp.html">cereal/details/static_object.hpp</a>&quot;</span></div>
<div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="memory_8hpp.html">cereal/types/memory.hpp</a>&quot;</span></div>
<div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="string_8hpp.html">cereal/types/string.hpp</a>&quot;</span></div>
<div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160;<span class="preprocessor">#include &lt;functional&gt;</span></div>
<div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160;<span class="preprocessor">#include &lt;typeindex&gt;</span></div>
<div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160;<span class="preprocessor">#include &lt;map&gt;</span></div>
<div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160;<span class="preprocessor">#include &lt;limits&gt;</span></div>
<div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160;<span class="preprocessor">#include &lt;set&gt;</span></div>
<div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160;<span class="preprocessor">#include &lt;stack&gt;</span></div>
<div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160; </div>
<div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160;<span class="preprocessor">#if defined(__GNUC__)</span></div>
<div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160; <span class="comment">// GCC / clang don&#39;t want the function</span></div>
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160;<span class="preprocessor"> #define CEREAL_BIND_TO_ARCHIVES_UNUSED_FUNCTION</span></div>
<div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160;<span class="preprocessor">#else</span></div>
<div class="line"><a name="l00064"></a><span class="lineno"><a class="line" href="polymorphic__impl_8hpp.html#a447a2becefa10fee587b8cd1d04c7dfc"> 64</a></span>&#160;<span class="preprocessor"> #define CEREAL_BIND_TO_ARCHIVES_UNUSED_FUNCTION static void unused() { (void)b; }</span></div>
<div class="line"><a name="l00065"></a><span class="lineno"> 65</span>&#160;<span class="preprocessor">#endif</span></div>
<div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160; </div>
<div class="line"><a name="l00068"></a><span class="lineno"> 68</span>&#160; </div>
<div class="line"><a name="l00072"></a><span class="lineno"> 72</span>&#160;<span class="preprocessor">#ifdef CEREAL_HAS_CPP17</span></div>
<div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160;<span class="preprocessor">#define CEREAL_BIND_TO_ARCHIVES(...) \</span></div>
<div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160;<span class="preprocessor"> namespace cereal { \</span></div>
<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160;<span class="preprocessor"> namespace detail { \</span></div>
<div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160;<span class="preprocessor"> template&lt;&gt; \</span></div>
<div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160;<span class="preprocessor"> struct init_binding&lt;__VA_ARGS__&gt; { \</span></div>
<div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160;<span class="preprocessor"> static inline bind_to_archives&lt;__VA_ARGS__&gt; const &amp; b= \</span></div>
<div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160;<span class="preprocessor"> ::cereal::detail::StaticObject&lt; \</span></div>
<div class="line"><a name="l00080"></a><span class="lineno"> 80</span>&#160;<span class="preprocessor"> bind_to_archives&lt;__VA_ARGS__&gt; \</span></div>
<div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160;<span class="preprocessor"> &gt;::getInstance().bind(); \</span></div>
<div class="line"><a name="l00082"></a><span class="lineno"> 82</span>&#160;<span class="preprocessor"> CEREAL_BIND_TO_ARCHIVES_UNUSED_FUNCTION \</span></div>
<div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160;<span class="preprocessor"> }; \</span></div>
<div class="line"><a name="l00084"></a><span class="lineno"> 84</span>&#160;<span class="preprocessor"> }} </span><span class="comment">/* end namespaces */</span><span class="preprocessor"></span></div>
<div class="line"><a name="l00085"></a><span class="lineno"> 85</span>&#160;<span class="preprocessor">#else</span></div>
<div class="line"><a name="l00086"></a><span class="lineno"><a class="line" href="polymorphic__impl_8hpp.html#a1287e4a45e8a9ce5d50d65c122d49d5f"> 86</a></span>&#160;<span class="preprocessor">#define CEREAL_BIND_TO_ARCHIVES(...) \</span></div>
<div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160;<span class="preprocessor"> namespace cereal { \</span></div>
<div class="line"><a name="l00088"></a><span class="lineno"> 88</span>&#160;<span class="preprocessor"> namespace detail { \</span></div>
<div class="line"><a name="l00089"></a><span class="lineno"> 89</span>&#160;<span class="preprocessor"> template&lt;&gt; \</span></div>
<div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160;<span class="preprocessor"> struct init_binding&lt;__VA_ARGS__&gt; { \</span></div>
<div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160;<span class="preprocessor"> static bind_to_archives&lt;__VA_ARGS__&gt; const&amp; b; \</span></div>
<div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160;<span class="preprocessor"> CEREAL_BIND_TO_ARCHIVES_UNUSED_FUNCTION \</span></div>
<div class="line"><a name="l00093"></a><span class="lineno"> 93</span>&#160;<span class="preprocessor"> }; \</span></div>
<div class="line"><a name="l00094"></a><span class="lineno"> 94</span>&#160;<span class="preprocessor"> bind_to_archives&lt;__VA_ARGS__&gt; const &amp; init_binding&lt;__VA_ARGS__&gt;::b = \</span></div>
<div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160;<span class="preprocessor"> ::cereal::detail::StaticObject&lt; \</span></div>
<div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160;<span class="preprocessor"> bind_to_archives&lt;__VA_ARGS__&gt; \</span></div>
<div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160;<span class="preprocessor"> &gt;::getInstance().bind(); \</span></div>
<div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160;<span class="preprocessor"> }} </span><span class="comment">/* end namespaces */</span><span class="preprocessor"></span></div>
<div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160;<span class="preprocessor">#endif</span></div>
<div class="line"><a name="l00100"></a><span class="lineno"> 100</span>&#160; </div>
<div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160;<span class="keyword">namespace </span>cereal</div>
<div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160;{</div>
<div class="line"><a name="l00103"></a><span class="lineno"> 103</span>&#160; <span class="comment">/* Polymorphic casting support */</span></div>
<div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160; <span class="keyword">namespace </span>detail</div>
<div class="line"><a name="l00105"></a><span class="lineno"> 105</span>&#160; {</div>
<div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160; </div>
<div class="line"><a name="l00119"></a><span class="lineno"><a class="line" href="structcereal_1_1detail_1_1PolymorphicCaster.html"> 119</a></span>&#160; <span class="keyword">struct </span><a class="code" href="structcereal_1_1detail_1_1PolymorphicCaster.html">PolymorphicCaster</a></div>
<div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160; {</div>
<div class="line"><a name="l00121"></a><span class="lineno"> 121</span>&#160; <a class="code" href="structcereal_1_1detail_1_1PolymorphicCaster.html">PolymorphicCaster</a>() = <span class="keywordflow">default</span>;</div>
<div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160; <a class="code" href="structcereal_1_1detail_1_1PolymorphicCaster.html">PolymorphicCaster</a>( <span class="keyword">const</span> <a class="code" href="structcereal_1_1detail_1_1PolymorphicCaster.html">PolymorphicCaster</a> &amp; ) = <span class="keywordflow">default</span>;</div>
<div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160; <a class="code" href="structcereal_1_1detail_1_1PolymorphicCaster.html">PolymorphicCaster</a> &amp; operator=( <span class="keyword">const</span> <a class="code" href="structcereal_1_1detail_1_1PolymorphicCaster.html">PolymorphicCaster</a> &amp; ) = <span class="keywordflow">default</span>;</div>
<div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160; <a class="code" href="structcereal_1_1detail_1_1PolymorphicCaster.html">PolymorphicCaster</a>( <a class="code" href="structcereal_1_1detail_1_1PolymorphicCaster.html">PolymorphicCaster</a> &amp;&amp; ) <a class="code" href="macros_8hpp.html#a6c37b2307b83bbe2a3de58d78a2b8c0b">CEREAL_NOEXCEPT</a> {}</div>
<div class="line"><a name="l00125"></a><span class="lineno"> 125</span>&#160; <a class="code" href="structcereal_1_1detail_1_1PolymorphicCaster.html">PolymorphicCaster</a> &amp; operator=( <a class="code" href="structcereal_1_1detail_1_1PolymorphicCaster.html">PolymorphicCaster</a> &amp;&amp; ) <a class="code" href="macros_8hpp.html#a6c37b2307b83bbe2a3de58d78a2b8c0b">CEREAL_NOEXCEPT</a> { <span class="keywordflow">return</span> *<span class="keyword">this</span>; }</div>
<div class="line"><a name="l00126"></a><span class="lineno"> 126</span>&#160; <span class="keyword">virtual</span> ~<a class="code" href="structcereal_1_1detail_1_1PolymorphicCaster.html">PolymorphicCaster</a>() <a class="code" href="macros_8hpp.html#a6c37b2307b83bbe2a3de58d78a2b8c0b">CEREAL_NOEXCEPT</a> = <span class="keywordflow">default</span>;</div>
<div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160; </div>
<div class="line"><a name="l00129"></a><span class="lineno"> 129</span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">void</span> <span class="keyword">const</span> * <a class="code" href="structcereal_1_1detail_1_1PolymorphicCaster.html#a7c3d1b95aae77fe87104dffb28073bcf">downcast</a>( <span class="keywordtype">void</span> <span class="keyword">const</span> * <span class="keyword">const</span> ptr ) <span class="keyword">const</span> = 0;</div>
<div class="line"><a name="l00131"></a><span class="lineno"> 131</span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">void</span> * <a class="code" href="structcereal_1_1detail_1_1PolymorphicCaster.html#a7310f43706216cbae275fd1f2a579470">upcast</a>( <span class="keywordtype">void</span> * <span class="keyword">const</span> ptr ) <span class="keyword">const</span> = 0;</div>
<div class="line"><a name="l00133"></a><span class="lineno"> 133</span>&#160; <span class="keyword">virtual</span> std::shared_ptr&lt;void&gt; <a class="code" href="structcereal_1_1detail_1_1PolymorphicCaster.html#a7310f43706216cbae275fd1f2a579470">upcast</a>( std::shared_ptr&lt;void&gt; <span class="keyword">const</span> &amp; ptr ) <span class="keyword">const</span> = 0;</div>
<div class="line"><a name="l00134"></a><span class="lineno"> 134</span>&#160; };</div>
<div class="line"><a name="l00135"></a><span class="lineno"> 135</span>&#160; </div>
<div class="line"><a name="l00137"></a><span class="lineno"> 137</span>&#160; </div>
<div class="line"><a name="l00139"></a><span class="lineno"><a class="line" href="structcereal_1_1detail_1_1PolymorphicCasters.html"> 139</a></span>&#160; <span class="keyword">struct </span><a class="code" href="structcereal_1_1detail_1_1PolymorphicCasters.html">PolymorphicCasters</a></div>
<div class="line"><a name="l00140"></a><span class="lineno"> 140</span>&#160; {</div>
<div class="line"><a name="l00142"></a><span class="lineno"><a class="line" href="structcereal_1_1detail_1_1PolymorphicCasters.html#a9d79b7d0b85c988ef102c07509094cf7"> 142</a></span>&#160; <span class="keyword">using</span> <a class="code" href="structcereal_1_1detail_1_1PolymorphicCasters.html#a9d79b7d0b85c988ef102c07509094cf7">DerivedCasterMap</a> = std::unordered_map&lt;std::type_index, std::vector&lt;PolymorphicCaster const *&gt;&gt;;</div>
<div class="line"><a name="l00144"></a><span class="lineno"><a class="line" href="structcereal_1_1detail_1_1PolymorphicCasters.html#ab73d51a06e51c40527b5356befe2d6cf"> 144</a></span>&#160; std::unordered_map&lt;std::type_index, DerivedCasterMap&gt; <a class="code" href="structcereal_1_1detail_1_1PolymorphicCasters.html#ab73d51a06e51c40527b5356befe2d6cf">map</a>;</div>
<div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160; </div>
<div class="line"><a name="l00146"></a><span class="lineno"> 146</span>&#160; std::multimap&lt;std::type_index, std::type_index&gt; reverseMap;</div>
<div class="line"><a name="l00147"></a><span class="lineno"> 147</span>&#160; </div>
<div class="line"><a name="l00149"></a><span class="lineno"><a class="line" href="polymorphic__impl_8hpp.html#aebe09f7b847560c8d63b9224008001df"> 149</a></span>&#160;<span class="preprocessor"> #define UNREGISTERED_POLYMORPHIC_CAST_EXCEPTION(LoadSave) \</span></div>
<div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160;<span class="preprocessor"> throw cereal::Exception(&quot;Trying to &quot; #LoadSave &quot; a registered polymorphic type with an unregistered polymorphic cast.\n&quot; \</span></div>
<div class="line"><a name="l00151"></a><span class="lineno"> 151</span>&#160;<span class="preprocessor"> &quot;Could not find a path to a base class (&quot; + util::demangle(baseInfo.name()) + &quot;) for type: &quot; + ::cereal::util::demangledName&lt;Derived&gt;() + &quot;\n&quot; \</span></div>
<div class="line"><a name="l00152"></a><span class="lineno"> 152</span>&#160;<span class="preprocessor"> &quot;Make sure you either serialize the base class at some point via cereal::base_class or cereal::virtual_base_class.\n&quot; \</span></div>
<div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160;<span class="preprocessor"> &quot;Alternatively, manually register the association with CEREAL_REGISTER_POLYMORPHIC_RELATION.&quot;);</span></div>
<div class="line"><a name="l00154"></a><span class="lineno"> 154</span>&#160; </div>
<div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160; </div>
<div class="line"><a name="l00159"></a><span class="lineno"> 159</span>&#160; <span class="keyword">static</span> std::pair&lt;bool, std::vector&lt;PolymorphicCaster const *&gt; <span class="keyword">const</span> &amp;&gt;</div>
<div class="line"><a name="l00160"></a><span class="lineno"><a class="line" href="structcereal_1_1detail_1_1PolymorphicCasters.html#ab1ab88bd3370d3327d5035d233b48292"> 160</a></span>&#160; <a class="code" href="structcereal_1_1detail_1_1PolymorphicCasters.html#ab1ab88bd3370d3327d5035d233b48292">lookup_if_exists</a>( std::type_index <span class="keyword">const</span> &amp; baseIndex, std::type_index <span class="keyword">const</span> &amp; derivedIndex )</div>
<div class="line"><a name="l00161"></a><span class="lineno"> 161</span>&#160; {</div>
<div class="line"><a name="l00162"></a><span class="lineno"> 162</span>&#160; <span class="comment">// First phase of lookup - match base type index</span></div>
<div class="line"><a name="l00163"></a><span class="lineno"> 163</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> &amp; baseMap = <a class="code" href="classcereal_1_1detail_1_1StaticObject.html">StaticObject&lt;PolymorphicCasters&gt;::getInstance</a>().map;</div>
<div class="line"><a name="l00164"></a><span class="lineno"> 164</span>&#160; <span class="keyword">auto</span> baseIter = baseMap.find( baseIndex );</div>
<div class="line"><a name="l00165"></a><span class="lineno"> 165</span>&#160; <span class="keywordflow">if</span> (baseIter == baseMap.end())</div>
<div class="line"><a name="l00166"></a><span class="lineno"> 166</span>&#160; <span class="keywordflow">return</span> {<span class="keyword">false</span>, {}};</div>
<div class="line"><a name="l00167"></a><span class="lineno"> 167</span>&#160; </div>
<div class="line"><a name="l00168"></a><span class="lineno"> 168</span>&#160; <span class="comment">// Second phase - find a match from base to derived</span></div>
<div class="line"><a name="l00169"></a><span class="lineno"> 169</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> &amp; derivedMap = baseIter-&gt;second;</div>
<div class="line"><a name="l00170"></a><span class="lineno"> 170</span>&#160; <span class="keyword">auto</span> derivedIter = derivedMap.find( derivedIndex );</div>
<div class="line"><a name="l00171"></a><span class="lineno"> 171</span>&#160; <span class="keywordflow">if</span> (derivedIter == derivedMap.end())</div>
<div class="line"><a name="l00172"></a><span class="lineno"> 172</span>&#160; <span class="keywordflow">return</span> {<span class="keyword">false</span>, {}};</div>
<div class="line"><a name="l00173"></a><span class="lineno"> 173</span>&#160; </div>
<div class="line"><a name="l00174"></a><span class="lineno"> 174</span>&#160; <span class="keywordflow">return</span> {<span class="keyword">true</span>, derivedIter-&gt;second};</div>
<div class="line"><a name="l00175"></a><span class="lineno"> 175</span>&#160; }</div>
<div class="line"><a name="l00176"></a><span class="lineno"> 176</span>&#160; </div>
<div class="line"><a name="l00178"></a><span class="lineno"> 178</span>&#160; </div>
<div class="line"><a name="l00182"></a><span class="lineno"> 182</span>&#160; <span class="keyword">template</span> &lt;<span class="keyword">class</span> F&gt; <span class="keyword">inline</span></div>
<div class="line"><a name="l00183"></a><span class="lineno"><a class="line" href="structcereal_1_1detail_1_1PolymorphicCasters.html#a5e0a5c9c5f4e858b1c12edc72e527735"> 183</a></span>&#160; <span class="keyword">static</span> std::vector&lt;PolymorphicCaster const *&gt; <span class="keyword">const</span> &amp; <a class="code" href="structcereal_1_1detail_1_1PolymorphicCasters.html#a5e0a5c9c5f4e858b1c12edc72e527735">lookup</a>( std::type_index <span class="keyword">const</span> &amp; baseIndex, std::type_index <span class="keyword">const</span> &amp; derivedIndex, F &amp;&amp; exceptionFunc )</div>
<div class="line"><a name="l00184"></a><span class="lineno"> 184</span>&#160; {</div>
<div class="line"><a name="l00185"></a><span class="lineno"> 185</span>&#160; <span class="comment">// First phase of lookup - match base type index</span></div>
<div class="line"><a name="l00186"></a><span class="lineno"> 186</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> &amp; baseMap = <a class="code" href="classcereal_1_1detail_1_1StaticObject.html">StaticObject&lt;PolymorphicCasters&gt;::getInstance</a>().map;</div>
<div class="line"><a name="l00187"></a><span class="lineno"> 187</span>&#160; <span class="keyword">auto</span> baseIter = baseMap.find( baseIndex );</div>
<div class="line"><a name="l00188"></a><span class="lineno"> 188</span>&#160; <span class="keywordflow">if</span>( baseIter == baseMap.end() )</div>
<div class="line"><a name="l00189"></a><span class="lineno"> 189</span>&#160; exceptionFunc();</div>
<div class="line"><a name="l00190"></a><span class="lineno"> 190</span>&#160; </div>
<div class="line"><a name="l00191"></a><span class="lineno"> 191</span>&#160; <span class="comment">// Second phase - find a match from base to derived</span></div>
<div class="line"><a name="l00192"></a><span class="lineno"> 192</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> &amp; derivedMap = baseIter-&gt;second;</div>
<div class="line"><a name="l00193"></a><span class="lineno"> 193</span>&#160; <span class="keyword">auto</span> derivedIter = derivedMap.find( derivedIndex );</div>
<div class="line"><a name="l00194"></a><span class="lineno"> 194</span>&#160; <span class="keywordflow">if</span>( derivedIter == derivedMap.end() )</div>
<div class="line"><a name="l00195"></a><span class="lineno"> 195</span>&#160; exceptionFunc();</div>
<div class="line"><a name="l00196"></a><span class="lineno"> 196</span>&#160; </div>
<div class="line"><a name="l00197"></a><span class="lineno"> 197</span>&#160; <span class="keywordflow">return</span> derivedIter-&gt;second;</div>
<div class="line"><a name="l00198"></a><span class="lineno"> 198</span>&#160; }</div>
<div class="line"><a name="l00199"></a><span class="lineno"> 199</span>&#160; </div>
<div class="line"><a name="l00201"></a><span class="lineno"> 201</span>&#160; <span class="keyword">template</span> &lt;<span class="keyword">class</span> Derived&gt; <span class="keyword">inline</span></div>
<div class="line"><a name="l00202"></a><span class="lineno"><a class="line" href="structcereal_1_1detail_1_1PolymorphicCasters.html#ad4983e7aae8a92d717162fc0e1f1dd49"> 202</a></span>&#160; <span class="keyword">static</span> <span class="keyword">const</span> Derived * <a class="code" href="structcereal_1_1detail_1_1PolymorphicCasters.html#ad4983e7aae8a92d717162fc0e1f1dd49">downcast</a>( <span class="keyword">const</span> <span class="keywordtype">void</span> * dptr, std::type_info <span class="keyword">const</span> &amp; baseInfo )</div>
<div class="line"><a name="l00203"></a><span class="lineno"> 203</span>&#160; {</div>
<div class="line"><a name="l00204"></a><span class="lineno"> 204</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> &amp; mapping = <a class="code" href="structcereal_1_1detail_1_1PolymorphicCasters.html#a5e0a5c9c5f4e858b1c12edc72e527735">lookup</a>( baseInfo, <span class="keyword">typeid</span>(Derived), [&amp;](){ <a class="code" href="polymorphic__impl_8hpp.html#aebe09f7b847560c8d63b9224008001df">UNREGISTERED_POLYMORPHIC_CAST_EXCEPTION</a>(save) } );</div>
<div class="line"><a name="l00205"></a><span class="lineno"> 205</span>&#160; </div>
<div class="line"><a name="l00206"></a><span class="lineno"> 206</span>&#160; <span class="keywordflow">for</span>( <span class="keyword">auto</span> <span class="keyword">const</span> * dmap : mapping )</div>
<div class="line"><a name="l00207"></a><span class="lineno"> 207</span>&#160; dptr = dmap-&gt;downcast( dptr );</div>
<div class="line"><a name="l00208"></a><span class="lineno"> 208</span>&#160; </div>
<div class="line"><a name="l00209"></a><span class="lineno"> 209</span>&#160; <span class="keywordflow">return</span> <span class="keyword">static_cast&lt;</span>Derived <span class="keyword">const </span>*<span class="keyword">&gt;</span>( dptr );</div>
<div class="line"><a name="l00210"></a><span class="lineno"> 210</span>&#160; }</div>
<div class="line"><a name="l00211"></a><span class="lineno"> 211</span>&#160; </div>
<div class="line"><a name="l00213"></a><span class="lineno"> 213</span>&#160; </div>
<div class="line"><a name="l00215"></a><span class="lineno"> 215</span>&#160; <span class="keyword">template</span> &lt;<span class="keyword">class</span> Derived&gt; <span class="keyword">inline</span></div>
<div class="line"><a name="l00216"></a><span class="lineno"><a class="line" href="structcereal_1_1detail_1_1PolymorphicCasters.html#a82ba78ff9ce36c6c1062b2db62bd1e1d"> 216</a></span>&#160; <span class="keyword">static</span> <span class="keywordtype">void</span> * <a class="code" href="structcereal_1_1detail_1_1PolymorphicCasters.html#a82ba78ff9ce36c6c1062b2db62bd1e1d">upcast</a>( Derived * <span class="keyword">const</span> dptr, std::type_info <span class="keyword">const</span> &amp; baseInfo )</div>
<div class="line"><a name="l00217"></a><span class="lineno"> 217</span>&#160; {</div>
<div class="line"><a name="l00218"></a><span class="lineno"> 218</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> &amp; mapping = <a class="code" href="structcereal_1_1detail_1_1PolymorphicCasters.html#a5e0a5c9c5f4e858b1c12edc72e527735">lookup</a>( baseInfo, <span class="keyword">typeid</span>(Derived), [&amp;](){ <a class="code" href="polymorphic__impl_8hpp.html#aebe09f7b847560c8d63b9224008001df">UNREGISTERED_POLYMORPHIC_CAST_EXCEPTION</a>(load) } );</div>
<div class="line"><a name="l00219"></a><span class="lineno"> 219</span>&#160; </div>
<div class="line"><a name="l00220"></a><span class="lineno"> 220</span>&#160; <span class="keywordtype">void</span> * uptr = dptr;</div>
<div class="line"><a name="l00221"></a><span class="lineno"> 221</span>&#160; <span class="keywordflow">for</span>( <span class="keyword">auto</span> mIter = mapping.rbegin(), mEnd = mapping.rend(); mIter != mEnd; ++mIter )</div>
<div class="line"><a name="l00222"></a><span class="lineno"> 222</span>&#160; uptr = (*mIter)-&gt;upcast( uptr );</div>
<div class="line"><a name="l00223"></a><span class="lineno"> 223</span>&#160; </div>
<div class="line"><a name="l00224"></a><span class="lineno"> 224</span>&#160; <span class="keywordflow">return</span> uptr;</div>
<div class="line"><a name="l00225"></a><span class="lineno"> 225</span>&#160; }</div>
<div class="line"><a name="l00226"></a><span class="lineno"> 226</span>&#160; </div>
<div class="line"><a name="l00228"></a><span class="lineno"> 228</span>&#160; <span class="keyword">template</span> &lt;<span class="keyword">class</span> Derived&gt; <span class="keyword">inline</span></div>
<div class="line"><a name="l00229"></a><span class="lineno"><a class="line" href="structcereal_1_1detail_1_1PolymorphicCasters.html#aac0ca1d11af2db4cb6aedcbc976c3d9e"> 229</a></span>&#160; <span class="keyword">static</span> std::shared_ptr&lt;void&gt; <a class="code" href="structcereal_1_1detail_1_1PolymorphicCasters.html#aac0ca1d11af2db4cb6aedcbc976c3d9e">upcast</a>( std::shared_ptr&lt;Derived&gt; <span class="keyword">const</span> &amp; dptr, std::type_info <span class="keyword">const</span> &amp; baseInfo )</div>
<div class="line"><a name="l00230"></a><span class="lineno"> 230</span>&#160; {</div>
<div class="line"><a name="l00231"></a><span class="lineno"> 231</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> &amp; mapping = <a class="code" href="structcereal_1_1detail_1_1PolymorphicCasters.html#a5e0a5c9c5f4e858b1c12edc72e527735">lookup</a>( baseInfo, <span class="keyword">typeid</span>(Derived), [&amp;](){ <a class="code" href="polymorphic__impl_8hpp.html#aebe09f7b847560c8d63b9224008001df">UNREGISTERED_POLYMORPHIC_CAST_EXCEPTION</a>(load) } );</div>
<div class="line"><a name="l00232"></a><span class="lineno"> 232</span>&#160; </div>
<div class="line"><a name="l00233"></a><span class="lineno"> 233</span>&#160; std::shared_ptr&lt;void&gt; uptr = dptr;</div>
<div class="line"><a name="l00234"></a><span class="lineno"> 234</span>&#160; <span class="keywordflow">for</span>( <span class="keyword">auto</span> mIter = mapping.rbegin(), mEnd = mapping.rend(); mIter != mEnd; ++mIter )</div>
<div class="line"><a name="l00235"></a><span class="lineno"> 235</span>&#160; uptr = (*mIter)-&gt;upcast( uptr );</div>
<div class="line"><a name="l00236"></a><span class="lineno"> 236</span>&#160; </div>
<div class="line"><a name="l00237"></a><span class="lineno"> 237</span>&#160; <span class="keywordflow">return</span> uptr;</div>
<div class="line"><a name="l00238"></a><span class="lineno"> 238</span>&#160; }</div>
<div class="line"><a name="l00239"></a><span class="lineno"> 239</span>&#160; </div>
<div class="line"><a name="l00240"></a><span class="lineno"> 240</span>&#160;<span class="preprocessor"> #undef UNREGISTERED_POLYMORPHIC_CAST_EXCEPTION</span></div>
<div class="line"><a name="l00241"></a><span class="lineno"> 241</span>&#160; };</div>
<div class="line"><a name="l00242"></a><span class="lineno"> 242</span>&#160; </div>
<div class="line"><a name="l00243"></a><span class="lineno"> 243</span>&#160;<span class="preprocessor"> #ifdef CEREAL_OLDER_GCC</span></div>
<div class="line"><a name="l00244"></a><span class="lineno"> 244</span>&#160;<span class="preprocessor"> #define CEREAL_EMPLACE_MAP(map, key, value) \</span></div>
<div class="line"><a name="l00245"></a><span class="lineno"> 245</span>&#160;<span class="preprocessor"> map.insert( std::make_pair(std::move(key), std::move(value)) );</span></div>
<div class="line"><a name="l00246"></a><span class="lineno"> 246</span>&#160;<span class="preprocessor"> #else // NOT CEREAL_OLDER_GCC</span></div>
<div class="line"><a name="l00247"></a><span class="lineno"> 247</span>&#160;<span class="preprocessor"> #define CEREAL_EMPLACE_MAP(map, key, value) \</span></div>
<div class="line"><a name="l00248"></a><span class="lineno"> 248</span>&#160;<span class="preprocessor"> map.emplace( key, value );</span></div>
<div class="line"><a name="l00249"></a><span class="lineno"> 249</span>&#160;<span class="preprocessor"> #endif // NOT_CEREAL_OLDER_GCC</span></div>
<div class="line"><a name="l00250"></a><span class="lineno"> 250</span>&#160; </div>
<div class="line"><a name="l00252"></a><span class="lineno"> 252</span>&#160; <span class="keyword">template</span> &lt;<span class="keyword">class</span> Base, <span class="keyword">class</span> Derived&gt;</div>
<div class="line"><a name="l00253"></a><span class="lineno"><a class="line" href="structcereal_1_1detail_1_1PolymorphicVirtualCaster.html"> 253</a></span>&#160; <span class="keyword">struct </span><a class="code" href="structcereal_1_1detail_1_1PolymorphicVirtualCaster.html">PolymorphicVirtualCaster</a> : <a class="code" href="structcereal_1_1detail_1_1PolymorphicCaster.html">PolymorphicCaster</a></div>
<div class="line"><a name="l00254"></a><span class="lineno"> 254</span>&#160; {</div>
<div class="line"><a name="l00256"></a><span class="lineno"> 256</span>&#160; </div>
<div class="line"><a name="l00259"></a><span class="lineno"><a class="line" href="structcereal_1_1detail_1_1PolymorphicVirtualCaster.html#a8bef2d14f5bb2d295263d41659c4f1f0"> 259</a></span>&#160; <a class="code" href="structcereal_1_1detail_1_1PolymorphicVirtualCaster.html#a8bef2d14f5bb2d295263d41659c4f1f0">PolymorphicVirtualCaster</a>()</div>
<div class="line"><a name="l00260"></a><span class="lineno"> 260</span>&#160; {</div>
<div class="line"><a name="l00261"></a><span class="lineno"> 261</span>&#160; <span class="keyword">const</span> <span class="keyword">auto</span> baseKey = std::type_index(<span class="keyword">typeid</span>(Base));</div>
<div class="line"><a name="l00262"></a><span class="lineno"> 262</span>&#160; <span class="keyword">const</span> <span class="keyword">auto</span> derivedKey = std::type_index(<span class="keyword">typeid</span>(Derived));</div>
<div class="line"><a name="l00263"></a><span class="lineno"> 263</span>&#160; </div>
<div class="line"><a name="l00264"></a><span class="lineno"> 264</span>&#160; <span class="comment">// First insert the relation Base-&gt;Derived</span></div>
<div class="line"><a name="l00265"></a><span class="lineno"> 265</span>&#160; <span class="keyword">const</span> <span class="keyword">auto</span> lock = <a class="code" href="classcereal_1_1detail_1_1StaticObject.html#aec75ae3fd5f5ad79132a368f984b385f">StaticObject&lt;PolymorphicCasters&gt;::lock</a>();</div>
<div class="line"><a name="l00266"></a><span class="lineno"> 266</span>&#160; <span class="keyword">auto</span> &amp; baseMap = <a class="code" href="classcereal_1_1detail_1_1StaticObject.html">StaticObject&lt;PolymorphicCasters&gt;::getInstance</a>().map;</div>
<div class="line"><a name="l00267"></a><span class="lineno"> 267</span>&#160; </div>
<div class="line"><a name="l00268"></a><span class="lineno"> 268</span>&#160; {</div>
<div class="line"><a name="l00269"></a><span class="lineno"> 269</span>&#160; <span class="keyword">auto</span> &amp; derivedMap = baseMap.insert( {baseKey, <a class="code" href="structcereal_1_1detail_1_1PolymorphicCasters.html#a9d79b7d0b85c988ef102c07509094cf7">PolymorphicCasters::DerivedCasterMap</a>{}} ).first-&gt;second;</div>
<div class="line"><a name="l00270"></a><span class="lineno"> 270</span>&#160; <span class="keyword">auto</span> &amp; derivedVec = derivedMap.insert( {derivedKey, {}} ).first-&gt;second;</div>
<div class="line"><a name="l00271"></a><span class="lineno"> 271</span>&#160; derivedVec.push_back( <span class="keyword">this</span> );</div>
<div class="line"><a name="l00272"></a><span class="lineno"> 272</span>&#160; }</div>
<div class="line"><a name="l00273"></a><span class="lineno"> 273</span>&#160; </div>
<div class="line"><a name="l00274"></a><span class="lineno"> 274</span>&#160; <span class="comment">// Insert reverse relation Derived-&gt;Base</span></div>
<div class="line"><a name="l00275"></a><span class="lineno"> 275</span>&#160; <span class="keyword">auto</span> &amp; reverseMap = <a class="code" href="classcereal_1_1detail_1_1StaticObject.html">StaticObject&lt;PolymorphicCasters&gt;::getInstance</a>().reverseMap;</div>
<div class="line"><a name="l00276"></a><span class="lineno"> 276</span>&#160; CEREAL_EMPLACE_MAP(reverseMap, derivedKey, baseKey);</div>
<div class="line"><a name="l00277"></a><span class="lineno"> 277</span>&#160; </div>
<div class="line"><a name="l00278"></a><span class="lineno"> 278</span>&#160; <span class="comment">// Find all chainable unregistered relations</span></div>
<div class="line"><a name="l00279"></a><span class="lineno"> 279</span>&#160; <span class="comment">/* The strategy here is to process only the nodes in the class hierarchy graph that have been</span></div>
<div class="line"><a name="l00280"></a><span class="lineno"> 280</span>&#160;<span class="comment"> affected by the new insertion. The aglorithm iteratively processes a node an ensures that it</span></div>
<div class="line"><a name="l00281"></a><span class="lineno"> 281</span>&#160;<span class="comment"> is updated with all new shortest length paths. It then rocesses the parents of the active node,</span></div>
<div class="line"><a name="l00282"></a><span class="lineno"> 282</span>&#160;<span class="comment"> with the knowledge that all children have already been processed.</span></div>
<div class="line"><a name="l00283"></a><span class="lineno"> 283</span>&#160;<span class="comment"></span> </div>
<div class="line"><a name="l00284"></a><span class="lineno"> 284</span>&#160;<span class="comment"> Note that for the following, we&#39;ll use the nomenclature of parent and child to not confuse with</span></div>
<div class="line"><a name="l00285"></a><span class="lineno"> 285</span>&#160;<span class="comment"> the inserted base derived relationship */</span></div>
<div class="line"><a name="l00286"></a><span class="lineno"> 286</span>&#160; {</div>
<div class="line"><a name="l00287"></a><span class="lineno"> 287</span>&#160; <span class="comment">// Checks whether there is a path from parent-&gt;child and returns a &lt;dist, path&gt; pair</span></div>
<div class="line"><a name="l00288"></a><span class="lineno"> 288</span>&#160; <span class="comment">// dist is set to MAX if the path does not exist</span></div>
<div class="line"><a name="l00289"></a><span class="lineno"> 289</span>&#160; <span class="keyword">auto</span> checkRelation = [](std::type_index <span class="keyword">const</span> &amp; parentInfo, std::type_index <span class="keyword">const</span> &amp; childInfo) -&gt;</div>
<div class="line"><a name="l00290"></a><span class="lineno"> 290</span>&#160; std::pair&lt;<span class="keywordtype">size_t</span>, std::vector&lt;PolymorphicCaster const *&gt; <span class="keyword">const</span> &amp;&gt;</div>
<div class="line"><a name="l00291"></a><span class="lineno"> 291</span>&#160; {</div>
<div class="line"><a name="l00292"></a><span class="lineno"> 292</span>&#160; <span class="keyword">auto</span> result = <a class="code" href="structcereal_1_1detail_1_1PolymorphicCasters.html#ab1ab88bd3370d3327d5035d233b48292">PolymorphicCasters::lookup_if_exists</a>( parentInfo, childInfo );</div>
<div class="line"><a name="l00293"></a><span class="lineno"> 293</span>&#160; <span class="keywordflow">if</span>( result.first )</div>
<div class="line"><a name="l00294"></a><span class="lineno"> 294</span>&#160; {</div>
<div class="line"><a name="l00295"></a><span class="lineno"> 295</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> &amp; path = result.second;</div>
<div class="line"><a name="l00296"></a><span class="lineno"> 296</span>&#160; <span class="keywordflow">return</span> {path.size(), path};</div>
<div class="line"><a name="l00297"></a><span class="lineno"> 297</span>&#160; }</div>
<div class="line"><a name="l00298"></a><span class="lineno"> 298</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l00299"></a><span class="lineno"> 299</span>&#160; <span class="keywordflow">return</span> {(std::numeric_limits&lt;size_t&gt;::max)(), {}};</div>
<div class="line"><a name="l00300"></a><span class="lineno"> 300</span>&#160; };</div>
<div class="line"><a name="l00301"></a><span class="lineno"> 301</span>&#160; </div>
<div class="line"><a name="l00302"></a><span class="lineno"> 302</span>&#160; std::stack&lt;std::type_index&gt; parentStack; <span class="comment">// Holds the parent nodes to be processed</span></div>
<div class="line"><a name="l00303"></a><span class="lineno"> 303</span>&#160; std::vector&lt;std::type_index&gt; dirtySet; <span class="comment">// Marks child nodes that have been changed</span></div>
<div class="line"><a name="l00304"></a><span class="lineno"> 304</span>&#160; std::unordered_set&lt;std::type_index&gt; processedParents; <span class="comment">// Marks parent nodes that have been processed</span></div>
<div class="line"><a name="l00305"></a><span class="lineno"> 305</span>&#160; </div>
<div class="line"><a name="l00306"></a><span class="lineno"> 306</span>&#160; <span class="comment">// Checks if a child has been marked dirty</span></div>
<div class="line"><a name="l00307"></a><span class="lineno"> 307</span>&#160; <span class="keyword">auto</span> isDirty = [&amp;](std::type_index <span class="keyword">const</span> &amp; c)</div>
<div class="line"><a name="l00308"></a><span class="lineno"> 308</span>&#160; {</div>
<div class="line"><a name="l00309"></a><span class="lineno"> 309</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> dirtySetSize = dirtySet.size();</div>
<div class="line"><a name="l00310"></a><span class="lineno"> 310</span>&#160; <span class="keywordflow">for</span>( <span class="keywordtype">size_t</span> i = 0; i &lt; dirtySetSize; ++i )</div>
<div class="line"><a name="l00311"></a><span class="lineno"> 311</span>&#160; <span class="keywordflow">if</span>( dirtySet[i] == c )</div>
<div class="line"><a name="l00312"></a><span class="lineno"> 312</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l00313"></a><span class="lineno"> 313</span>&#160; </div>
<div class="line"><a name="l00314"></a><span class="lineno"> 314</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l00315"></a><span class="lineno"> 315</span>&#160; };</div>
<div class="line"><a name="l00316"></a><span class="lineno"> 316</span>&#160; </div>
<div class="line"><a name="l00317"></a><span class="lineno"> 317</span>&#160; <span class="comment">// Begin processing the base key and mark derived as dirty</span></div>
<div class="line"><a name="l00318"></a><span class="lineno"> 318</span>&#160; parentStack.push( baseKey );</div>
<div class="line"><a name="l00319"></a><span class="lineno"> 319</span>&#160; dirtySet.emplace_back( derivedKey );</div>
<div class="line"><a name="l00320"></a><span class="lineno"> 320</span>&#160; </div>
<div class="line"><a name="l00321"></a><span class="lineno"> 321</span>&#160; <span class="keywordflow">while</span>( !parentStack.empty() )</div>
<div class="line"><a name="l00322"></a><span class="lineno"> 322</span>&#160; {</div>
<div class="line"><a name="l00323"></a><span class="lineno"> 323</span>&#160; <span class="keyword">using</span> Relations = std::unordered_multimap&lt;std::type_index, std::pair&lt;std::type_index, std::vector&lt;PolymorphicCaster const *&gt;&gt;&gt;;</div>
<div class="line"><a name="l00324"></a><span class="lineno"> 324</span>&#160; Relations unregisteredRelations; <span class="comment">// Defer insertions until after main loop to prevent iterator invalidation</span></div>
<div class="line"><a name="l00325"></a><span class="lineno"> 325</span>&#160; </div>
<div class="line"><a name="l00326"></a><span class="lineno"> 326</span>&#160; <span class="keyword">const</span> <span class="keyword">auto</span> parent = parentStack.top();</div>
<div class="line"><a name="l00327"></a><span class="lineno"> 327</span>&#160; parentStack.pop();</div>
<div class="line"><a name="l00328"></a><span class="lineno"> 328</span>&#160; </div>
<div class="line"><a name="l00329"></a><span class="lineno"> 329</span>&#160; <span class="comment">// Update paths to all children marked dirty</span></div>
<div class="line"><a name="l00330"></a><span class="lineno"> 330</span>&#160; <span class="keywordflow">for</span>( <span class="keyword">auto</span> <span class="keyword">const</span> &amp; childPair : baseMap[parent] )</div>
<div class="line"><a name="l00331"></a><span class="lineno"> 331</span>&#160; {</div>
<div class="line"><a name="l00332"></a><span class="lineno"> 332</span>&#160; <span class="keyword">const</span> <span class="keyword">auto</span> child = childPair.first;</div>
<div class="line"><a name="l00333"></a><span class="lineno"> 333</span>&#160; <span class="keywordflow">if</span>( isDirty( child ) &amp;&amp; baseMap.count( child ) )</div>
<div class="line"><a name="l00334"></a><span class="lineno"> 334</span>&#160; {</div>
<div class="line"><a name="l00335"></a><span class="lineno"> 335</span>&#160; <span class="keyword">auto</span> parentChildPath = checkRelation( parent, child );</div>
<div class="line"><a name="l00336"></a><span class="lineno"> 336</span>&#160; </div>
<div class="line"><a name="l00337"></a><span class="lineno"> 337</span>&#160; <span class="comment">// Search all paths from the child to its own children (finalChild),</span></div>
<div class="line"><a name="l00338"></a><span class="lineno"> 338</span>&#160; <span class="comment">// looking for a shorter parth from parent to finalChild</span></div>
<div class="line"><a name="l00339"></a><span class="lineno"> 339</span>&#160; <span class="keywordflow">for</span>( <span class="keyword">auto</span> <span class="keyword">const</span> &amp; finalChildPair : baseMap[child] )</div>
<div class="line"><a name="l00340"></a><span class="lineno"> 340</span>&#160; {</div>
<div class="line"><a name="l00341"></a><span class="lineno"> 341</span>&#160; <span class="keyword">const</span> <span class="keyword">auto</span> finalChild = finalChildPair.first;</div>
<div class="line"><a name="l00342"></a><span class="lineno"> 342</span>&#160; </div>
<div class="line"><a name="l00343"></a><span class="lineno"> 343</span>&#160; <span class="keyword">auto</span> parentFinalChildPath = checkRelation( parent, finalChild );</div>
<div class="line"><a name="l00344"></a><span class="lineno"> 344</span>&#160; <span class="keyword">auto</span> childFinalChildPath = checkRelation( child, finalChild );</div>
<div class="line"><a name="l00345"></a><span class="lineno"> 345</span>&#160; </div>
<div class="line"><a name="l00346"></a><span class="lineno"> 346</span>&#160; <span class="keyword">const</span> <span class="keywordtype">size_t</span> newLength = 1u + parentChildPath.first;</div>
<div class="line"><a name="l00347"></a><span class="lineno"> 347</span>&#160; </div>
<div class="line"><a name="l00348"></a><span class="lineno"> 348</span>&#160; <span class="keywordflow">if</span>( newLength &lt; parentFinalChildPath.first )</div>
<div class="line"><a name="l00349"></a><span class="lineno"> 349</span>&#160; {</div>
<div class="line"><a name="l00350"></a><span class="lineno"> 350</span>&#160; std::vector&lt;PolymorphicCaster const *&gt; path = parentChildPath.second;</div>
<div class="line"><a name="l00351"></a><span class="lineno"> 351</span>&#160; path.insert( path.end(), childFinalChildPath.second.begin(), childFinalChildPath.second.end() );</div>
<div class="line"><a name="l00352"></a><span class="lineno"> 352</span>&#160; </div>
<div class="line"><a name="l00353"></a><span class="lineno"> 353</span>&#160; <span class="comment">// Check to see if we have a previous uncommitted path in unregisteredRelations</span></div>
<div class="line"><a name="l00354"></a><span class="lineno"> 354</span>&#160; <span class="comment">// that is shorter. If so, ignore this path</span></div>
<div class="line"><a name="l00355"></a><span class="lineno"> 355</span>&#160; <span class="keyword">auto</span> hintRange = unregisteredRelations.equal_range( parent );</div>
<div class="line"><a name="l00356"></a><span class="lineno"> 356</span>&#160; <span class="keyword">auto</span> hint = hintRange.first;</div>
<div class="line"><a name="l00357"></a><span class="lineno"> 357</span>&#160; <span class="keywordflow">for</span>( ; hint != hintRange.second; ++hint )</div>
<div class="line"><a name="l00358"></a><span class="lineno"> 358</span>&#160; <span class="keywordflow">if</span>( hint-&gt;second.first == finalChild )</div>
<div class="line"><a name="l00359"></a><span class="lineno"> 359</span>&#160; <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00360"></a><span class="lineno"> 360</span>&#160; </div>
<div class="line"><a name="l00361"></a><span class="lineno"> 361</span>&#160; <span class="keyword">const</span> <span class="keywordtype">bool</span> uncommittedExists = hint != unregisteredRelations.end();</div>
<div class="line"><a name="l00362"></a><span class="lineno"> 362</span>&#160; <span class="keywordflow">if</span>( uncommittedExists &amp;&amp; (hint-&gt;second.second.size() &lt;= newLength) )</div>
<div class="line"><a name="l00363"></a><span class="lineno"> 363</span>&#160; <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00364"></a><span class="lineno"> 364</span>&#160; </div>
<div class="line"><a name="l00365"></a><span class="lineno"> 365</span>&#160; <span class="keyword">auto</span> newPath = std::pair&lt;std::type_index, std::vector&lt;PolymorphicCaster const *&gt;&gt;{finalChild, std::move(path)};</div>
<div class="line"><a name="l00366"></a><span class="lineno"> 366</span>&#160; </div>
<div class="line"><a name="l00367"></a><span class="lineno"> 367</span>&#160; <span class="comment">// Insert the new path if it doesn&#39;t exist, otherwise this will just lookup where to do the</span></div>
<div class="line"><a name="l00368"></a><span class="lineno"> 368</span>&#160; <span class="comment">// replacement</span></div>
<div class="line"><a name="l00369"></a><span class="lineno"> 369</span>&#160;<span class="preprocessor"> #ifdef CEREAL_OLDER_GCC</span></div>
<div class="line"><a name="l00370"></a><span class="lineno"> 370</span>&#160; <span class="keyword">auto</span> old = unregisteredRelations.insert( hint, std::make_pair(parent, newPath) );</div>
<div class="line"><a name="l00371"></a><span class="lineno"> 371</span>&#160;<span class="preprocessor"> #else // NOT CEREAL_OLDER_GCC</span></div>
<div class="line"><a name="l00372"></a><span class="lineno"> 372</span>&#160; <span class="keyword">auto</span> old = unregisteredRelations.emplace_hint( hint, parent, newPath );</div>
<div class="line"><a name="l00373"></a><span class="lineno"> 373</span>&#160;<span class="preprocessor"> #endif // NOT CEREAL_OLDER_GCC</span></div>
<div class="line"><a name="l00374"></a><span class="lineno"> 374</span>&#160; </div>
<div class="line"><a name="l00375"></a><span class="lineno"> 375</span>&#160; <span class="comment">// If there was an uncommitted path, we need to perform a replacement</span></div>
<div class="line"><a name="l00376"></a><span class="lineno"> 376</span>&#160; <span class="keywordflow">if</span>( uncommittedExists )</div>
<div class="line"><a name="l00377"></a><span class="lineno"> 377</span>&#160; old-&gt;second = newPath;</div>
<div class="line"><a name="l00378"></a><span class="lineno"> 378</span>&#160; }</div>
<div class="line"><a name="l00379"></a><span class="lineno"> 379</span>&#160; } <span class="comment">// end loop over child&#39;s children</span></div>
<div class="line"><a name="l00380"></a><span class="lineno"> 380</span>&#160; } <span class="comment">// end if dirty and child has children</span></div>
<div class="line"><a name="l00381"></a><span class="lineno"> 381</span>&#160; } <span class="comment">// end loop over children</span></div>
<div class="line"><a name="l00382"></a><span class="lineno"> 382</span>&#160; </div>
<div class="line"><a name="l00383"></a><span class="lineno"> 383</span>&#160; <span class="comment">// Insert chained relations</span></div>
<div class="line"><a name="l00384"></a><span class="lineno"> 384</span>&#160; <span class="keywordflow">for</span>( <span class="keyword">auto</span> <span class="keyword">const</span> &amp; it : unregisteredRelations )</div>
<div class="line"><a name="l00385"></a><span class="lineno"> 385</span>&#160; {</div>
<div class="line"><a name="l00386"></a><span class="lineno"> 386</span>&#160; <span class="keyword">auto</span> &amp; derivedMap = baseMap.find( it.first )-&gt;second;</div>
<div class="line"><a name="l00387"></a><span class="lineno"> 387</span>&#160; derivedMap[it.second.first] = it.second.second;</div>
<div class="line"><a name="l00388"></a><span class="lineno"> 388</span>&#160; CEREAL_EMPLACE_MAP(reverseMap, it.second.first, it.first );</div>
<div class="line"><a name="l00389"></a><span class="lineno"> 389</span>&#160; }</div>
<div class="line"><a name="l00390"></a><span class="lineno"> 390</span>&#160; </div>
<div class="line"><a name="l00391"></a><span class="lineno"> 391</span>&#160; <span class="comment">// Mark current parent as modified</span></div>
<div class="line"><a name="l00392"></a><span class="lineno"> 392</span>&#160; dirtySet.emplace_back( parent );</div>
<div class="line"><a name="l00393"></a><span class="lineno"> 393</span>&#160; </div>
<div class="line"><a name="l00394"></a><span class="lineno"> 394</span>&#160; <span class="comment">// Insert all parents of the current parent node that haven&#39;t yet been processed</span></div>
<div class="line"><a name="l00395"></a><span class="lineno"> 395</span>&#160; <span class="keyword">auto</span> parentRange = reverseMap.equal_range( parent );</div>
<div class="line"><a name="l00396"></a><span class="lineno"> 396</span>&#160; <span class="keywordflow">for</span>( <span class="keyword">auto</span> pIter = parentRange.first; pIter != parentRange.second; ++pIter )</div>
<div class="line"><a name="l00397"></a><span class="lineno"> 397</span>&#160; {</div>
<div class="line"><a name="l00398"></a><span class="lineno"> 398</span>&#160; <span class="keyword">const</span> <span class="keyword">auto</span> pParent = pIter-&gt;second;</div>
<div class="line"><a name="l00399"></a><span class="lineno"> 399</span>&#160; <span class="keywordflow">if</span>( !processedParents.count( pParent ) )</div>
<div class="line"><a name="l00400"></a><span class="lineno"> 400</span>&#160; {</div>
<div class="line"><a name="l00401"></a><span class="lineno"> 401</span>&#160; parentStack.push( pParent );</div>
<div class="line"><a name="l00402"></a><span class="lineno"> 402</span>&#160; processedParents.insert( pParent );</div>
<div class="line"><a name="l00403"></a><span class="lineno"> 403</span>&#160; }</div>
<div class="line"><a name="l00404"></a><span class="lineno"> 404</span>&#160; }</div>
<div class="line"><a name="l00405"></a><span class="lineno"> 405</span>&#160; } <span class="comment">// end loop over parent stack</span></div>
<div class="line"><a name="l00406"></a><span class="lineno"> 406</span>&#160; } <span class="comment">// end chainable relations</span></div>
<div class="line"><a name="l00407"></a><span class="lineno"> 407</span>&#160; } <span class="comment">// end PolymorphicVirtualCaster()</span></div>
<div class="line"><a name="l00408"></a><span class="lineno"> 408</span>&#160; </div>
<div class="line"><a name="l00409"></a><span class="lineno"> 409</span>&#160;<span class="preprocessor"> #undef CEREAL_EMPLACE_MAP</span></div>
<div class="line"><a name="l00410"></a><span class="lineno"> 410</span>&#160; </div>
<div class="line"><a name="l00412"></a><span class="lineno"><a class="line" href="structcereal_1_1detail_1_1PolymorphicVirtualCaster.html#a77434b14bd95cf53dc4218140682e399"> 412</a></span>&#160; <span class="keywordtype">void</span> <span class="keyword">const</span> * <a class="code" href="structcereal_1_1detail_1_1PolymorphicVirtualCaster.html#a77434b14bd95cf53dc4218140682e399">downcast</a>( <span class="keywordtype">void</span> <span class="keyword">const</span> * <span class="keyword">const</span> ptr )<span class="keyword"> const override</span></div>
<div class="line"><a name="l00413"></a><span class="lineno"> 413</span>&#160;<span class="keyword"> </span>{</div>
<div class="line"><a name="l00414"></a><span class="lineno"> 414</span>&#160; <span class="keywordflow">return</span> <span class="keyword">dynamic_cast&lt;</span>Derived const*<span class="keyword">&gt;</span>( <span class="keyword">static_cast&lt;</span>Base const*<span class="keyword">&gt;</span>( ptr ) );</div>
<div class="line"><a name="l00415"></a><span class="lineno"> 415</span>&#160; }</div>
<div class="line"><a name="l00416"></a><span class="lineno"> 416</span>&#160; </div>
<div class="line"><a name="l00418"></a><span class="lineno"><a class="line" href="structcereal_1_1detail_1_1PolymorphicVirtualCaster.html#ad16c1ab78ccdcf8826ce707adc3fa969"> 418</a></span>&#160; <span class="keywordtype">void</span> * <a class="code" href="structcereal_1_1detail_1_1PolymorphicVirtualCaster.html#ad16c1ab78ccdcf8826ce707adc3fa969">upcast</a>( <span class="keywordtype">void</span> * <span class="keyword">const</span> ptr )<span class="keyword"> const override</span></div>
<div class="line"><a name="l00419"></a><span class="lineno"> 419</span>&#160;<span class="keyword"> </span>{</div>
<div class="line"><a name="l00420"></a><span class="lineno"> 420</span>&#160; <span class="keywordflow">return</span> <span class="keyword">dynamic_cast&lt;</span>Base*<span class="keyword">&gt;</span>( <span class="keyword">static_cast&lt;</span>Derived*<span class="keyword">&gt;</span>( ptr ) );</div>
<div class="line"><a name="l00421"></a><span class="lineno"> 421</span>&#160; }</div>
<div class="line"><a name="l00422"></a><span class="lineno"> 422</span>&#160; </div>
<div class="line"><a name="l00424"></a><span class="lineno"><a class="line" href="structcereal_1_1detail_1_1PolymorphicVirtualCaster.html#a7233787834faaab0ddec22437471aa96"> 424</a></span>&#160; std::shared_ptr&lt;void&gt; <a class="code" href="structcereal_1_1detail_1_1PolymorphicVirtualCaster.html#a7233787834faaab0ddec22437471aa96">upcast</a>( std::shared_ptr&lt;void&gt; <span class="keyword">const</span> &amp; ptr )<span class="keyword"> const override</span></div>
<div class="line"><a name="l00425"></a><span class="lineno"> 425</span>&#160;<span class="keyword"> </span>{</div>
<div class="line"><a name="l00426"></a><span class="lineno"> 426</span>&#160; <span class="keywordflow">return</span> std::dynamic_pointer_cast&lt;Base&gt;( std::static_pointer_cast&lt;Derived&gt;( ptr ) );</div>
<div class="line"><a name="l00427"></a><span class="lineno"> 427</span>&#160; }</div>
<div class="line"><a name="l00428"></a><span class="lineno"> 428</span>&#160; };</div>
<div class="line"><a name="l00429"></a><span class="lineno"> 429</span>&#160; </div>
<div class="line"><a name="l00431"></a><span class="lineno"> 431</span>&#160; </div>
<div class="line"><a name="l00437"></a><span class="lineno"> 437</span>&#160; <span class="keyword">template</span> &lt;<span class="keyword">class</span> Base, <span class="keyword">class</span> Derived&gt;</div>
<div class="line"><a name="l00438"></a><span class="lineno"><a class="line" href="structcereal_1_1detail_1_1RegisterPolymorphicCaster.html"> 438</a></span>&#160; <span class="keyword">struct </span><a class="code" href="structcereal_1_1detail_1_1RegisterPolymorphicCaster.html">RegisterPolymorphicCaster</a></div>
<div class="line"><a name="l00439"></a><span class="lineno"> 439</span>&#160; {</div>
<div class="line"><a name="l00440"></a><span class="lineno"> 440</span>&#160; <span class="keyword">static</span> <a class="code" href="structcereal_1_1detail_1_1PolymorphicCaster.html">PolymorphicCaster</a> <span class="keyword">const</span> * bind( std::true_type <span class="comment">/* is_polymorphic&lt;Base&gt; */</span>)</div>
<div class="line"><a name="l00441"></a><span class="lineno"> 441</span>&#160; {</div>
<div class="line"><a name="l00442"></a><span class="lineno"> 442</span>&#160; <span class="keywordflow">return</span> &amp;<a class="code" href="classcereal_1_1detail_1_1StaticObject.html">StaticObject&lt;PolymorphicVirtualCaster&lt;Base, Derived&gt;</a>&gt;::getInstance();</div>
<div class="line"><a name="l00443"></a><span class="lineno"> 443</span>&#160; }</div>
<div class="line"><a name="l00444"></a><span class="lineno"> 444</span>&#160; </div>
<div class="line"><a name="l00445"></a><span class="lineno"> 445</span>&#160; <span class="keyword">static</span> <a class="code" href="structcereal_1_1detail_1_1PolymorphicCaster.html">PolymorphicCaster</a> <span class="keyword">const</span> * bind( std::false_type <span class="comment">/* is_polymorphic&lt;Base&gt; */</span> )</div>
<div class="line"><a name="l00446"></a><span class="lineno"> 446</span>&#160; { <span class="keywordflow">return</span> <span class="keyword">nullptr</span>; }</div>
<div class="line"><a name="l00447"></a><span class="lineno"> 447</span>&#160; </div>
<div class="line"><a name="l00449"></a><span class="lineno"> 449</span>&#160; </div>
<div class="line"><a name="l00450"></a><span class="lineno"><a class="line" href="structcereal_1_1detail_1_1RegisterPolymorphicCaster.html#a14f9cd6827498e31efbd8c94dc786e44"> 450</a></span>&#160; <span class="keyword">static</span> <a class="code" href="structcereal_1_1detail_1_1PolymorphicCaster.html">PolymorphicCaster</a> <span class="keyword">const</span> * <a class="code" href="structcereal_1_1detail_1_1RegisterPolymorphicCaster.html#a14f9cd6827498e31efbd8c94dc786e44">bind</a>()</div>
<div class="line"><a name="l00451"></a><span class="lineno"> 451</span>&#160; { <span class="keywordflow">return</span> bind( <span class="keyword">typename</span> std::is_polymorphic&lt;Base&gt;::type() ); }</div>
<div class="line"><a name="l00452"></a><span class="lineno"> 452</span>&#160; };</div>
<div class="line"><a name="l00453"></a><span class="lineno"> 453</span>&#160; }</div>
<div class="line"><a name="l00454"></a><span class="lineno"> 454</span>&#160; </div>
<div class="line"><a name="l00455"></a><span class="lineno"> 455</span>&#160; <span class="comment">/* General polymorphism support */</span></div>
<div class="line"><a name="l00456"></a><span class="lineno"> 456</span>&#160; <span class="keyword">namespace </span>detail</div>
<div class="line"><a name="l00457"></a><span class="lineno"> 457</span>&#160; {</div>
<div class="line"><a name="l00459"></a><span class="lineno"> 459</span>&#160; <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;</div>
<div class="line"><a name="l00460"></a><span class="lineno"><a class="line" href="structcereal_1_1detail_1_1binding__name.html"> 460</a></span>&#160; <span class="keyword">struct </span><a class="code" href="structcereal_1_1detail_1_1binding__name.html">binding_name</a> {};</div>
<div class="line"><a name="l00461"></a><span class="lineno"> 461</span>&#160; </div>
<div class="line"><a name="l00463"></a><span class="lineno"> 463</span>&#160; </div>
<div class="line"><a name="l00467"></a><span class="lineno"> 467</span>&#160; <span class="keyword">template</span> &lt;<span class="keyword">class</span> Archive&gt;</div>
<div class="line"><a name="l00468"></a><span class="lineno"><a class="line" href="structcereal_1_1detail_1_1OutputBindingMap.html"> 468</a></span>&#160; <span class="keyword">struct </span><a class="code" href="structcereal_1_1detail_1_1OutputBindingMap.html">OutputBindingMap</a></div>
<div class="line"><a name="l00469"></a><span class="lineno"> 469</span>&#160; {</div>
<div class="line"><a name="l00471"></a><span class="lineno"> 471</span>&#160; </div>
<div class="line"><a name="l00476"></a><span class="lineno"><a class="line" href="structcereal_1_1detail_1_1OutputBindingMap.html#a8494ac316e305ffcaae1636b092cb916"> 476</a></span>&#160; <span class="keyword">typedef</span> std::function&lt;void(<span class="keywordtype">void</span>*, <span class="keywordtype">void</span> <span class="keyword">const</span> *, std::type_info <span class="keyword">const</span> &amp;)&gt; <a class="code" href="structcereal_1_1detail_1_1OutputBindingMap.html#a8494ac316e305ffcaae1636b092cb916">Serializer</a>;</div>
<div class="line"><a name="l00477"></a><span class="lineno"> 477</span>&#160; </div>
<div class="line"><a name="l00479"></a><span class="lineno"><a class="line" href="structcereal_1_1detail_1_1OutputBindingMap_1_1Serializers.html"> 479</a></span>&#160; <span class="keyword">struct </span><a class="code" href="structcereal_1_1detail_1_1OutputBindingMap_1_1Serializers.html">Serializers</a></div>
<div class="line"><a name="l00480"></a><span class="lineno"> 480</span>&#160; {</div>
<div class="line"><a name="l00481"></a><span class="lineno"><a class="line" href="structcereal_1_1detail_1_1OutputBindingMap_1_1Serializers.html#a8602064aeec6a847f1fe81fe9461ea18"> 481</a></span>&#160; <a class="code" href="structcereal_1_1detail_1_1OutputBindingMap.html#a8494ac316e305ffcaae1636b092cb916">Serializer</a> <a class="code" href="structcereal_1_1detail_1_1OutputBindingMap_1_1Serializers.html#a8602064aeec6a847f1fe81fe9461ea18">shared_ptr</a>, </div>
<div class="line"><a name="l00482"></a><span class="lineno"><a class="line" href="structcereal_1_1detail_1_1OutputBindingMap_1_1Serializers.html#ab4c2f8544bdbe179ef4664de9589f825"> 482</a></span>&#160; <a class="code" href="structcereal_1_1detail_1_1OutputBindingMap_1_1Serializers.html#ab4c2f8544bdbe179ef4664de9589f825">unique_ptr</a>; </div>
<div class="line"><a name="l00483"></a><span class="lineno"> 483</span>&#160; };</div>
<div class="line"><a name="l00484"></a><span class="lineno"> 484</span>&#160; </div>
<div class="line"><a name="l00486"></a><span class="lineno"><a class="line" href="structcereal_1_1detail_1_1OutputBindingMap.html#ab62be8e24369a6350592d3bd12abfecc"> 486</a></span>&#160; std::map&lt;std::type_index, Serializers&gt; <a class="code" href="structcereal_1_1detail_1_1OutputBindingMap.html#ab62be8e24369a6350592d3bd12abfecc">map</a>;</div>
<div class="line"><a name="l00487"></a><span class="lineno"> 487</span>&#160; };</div>
<div class="line"><a name="l00488"></a><span class="lineno"> 488</span>&#160; </div>
<div class="line"><a name="l00490"></a><span class="lineno"><a class="line" href="structcereal_1_1detail_1_1EmptyDeleter.html"> 490</a></span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> T&gt; <span class="keyword">struct </span><a class="code" href="structcereal_1_1detail_1_1EmptyDeleter.html">EmptyDeleter</a> { <span class="keywordtype">void</span> operator()(T *)<span class="keyword"> const </span>{} };</div>
<div class="line"><a name="l00491"></a><span class="lineno"> 491</span>&#160; </div>
<div class="line"><a name="l00493"></a><span class="lineno"> 493</span>&#160; </div>
<div class="line"><a name="l00497"></a><span class="lineno"> 497</span>&#160; <span class="keyword">template</span> &lt;<span class="keyword">class</span> Archive&gt;</div>
<div class="line"><a name="l00498"></a><span class="lineno"><a class="line" href="structcereal_1_1detail_1_1InputBindingMap.html"> 498</a></span>&#160; <span class="keyword">struct </span><a class="code" href="structcereal_1_1detail_1_1InputBindingMap.html">InputBindingMap</a></div>
<div class="line"><a name="l00499"></a><span class="lineno"> 499</span>&#160; {</div>
<div class="line"><a name="l00501"></a><span class="lineno"> 501</span>&#160; </div>
<div class="line"><a name="l00506"></a><span class="lineno"><a class="line" href="structcereal_1_1detail_1_1InputBindingMap.html#a8b3e4f742e4cd9f5210930e0f272383b"> 506</a></span>&#160; <span class="keyword">typedef</span> std::function&lt;void(<span class="keywordtype">void</span>*, std::shared_ptr&lt;void&gt; &amp;, std::type_info <span class="keyword">const</span> &amp;)&gt; <a class="code" href="structcereal_1_1detail_1_1InputBindingMap.html#a8b3e4f742e4cd9f5210930e0f272383b">SharedSerializer</a>;</div>
<div class="line"><a name="l00508"></a><span class="lineno"><a class="line" href="structcereal_1_1detail_1_1InputBindingMap.html#a429d50a04386c8de48e99723564bfbeb"> 508</a></span>&#160; <span class="keyword">typedef</span> std::function&lt;void(<span class="keywordtype">void</span>*, std::unique_ptr&lt;<span class="keywordtype">void</span>, <a class="code" href="structcereal_1_1detail_1_1EmptyDeleter.html">EmptyDeleter&lt;void&gt;</a>&gt; &amp;, std::type_info <span class="keyword">const</span> &amp;)&gt; <a class="code" href="structcereal_1_1detail_1_1InputBindingMap.html#a429d50a04386c8de48e99723564bfbeb">UniqueSerializer</a>;</div>
<div class="line"><a name="l00509"></a><span class="lineno"> 509</span>&#160; </div>
<div class="line"><a name="l00511"></a><span class="lineno"><a class="line" href="structcereal_1_1detail_1_1InputBindingMap_1_1Serializers.html"> 511</a></span>&#160; <span class="keyword">struct </span><a class="code" href="structcereal_1_1detail_1_1InputBindingMap_1_1Serializers.html">Serializers</a></div>
<div class="line"><a name="l00512"></a><span class="lineno"> 512</span>&#160; {</div>
<div class="line"><a name="l00513"></a><span class="lineno"><a class="line" href="structcereal_1_1detail_1_1InputBindingMap_1_1Serializers.html#ae4043c36202a1c63655df1734b048210"> 513</a></span>&#160; <a class="code" href="structcereal_1_1detail_1_1InputBindingMap.html#a8b3e4f742e4cd9f5210930e0f272383b">SharedSerializer</a> <a class="code" href="structcereal_1_1detail_1_1InputBindingMap_1_1Serializers.html#ae4043c36202a1c63655df1734b048210">shared_ptr</a>; </div>
<div class="line"><a name="l00514"></a><span class="lineno"><a class="line" href="structcereal_1_1detail_1_1InputBindingMap_1_1Serializers.html#a94620847674f5398454cbdb9660b8532"> 514</a></span>&#160; <a class="code" href="structcereal_1_1detail_1_1InputBindingMap.html#a429d50a04386c8de48e99723564bfbeb">UniqueSerializer</a> <a class="code" href="structcereal_1_1detail_1_1InputBindingMap_1_1Serializers.html#a94620847674f5398454cbdb9660b8532">unique_ptr</a>; </div>
<div class="line"><a name="l00515"></a><span class="lineno"> 515</span>&#160; };</div>
<div class="line"><a name="l00516"></a><span class="lineno"> 516</span>&#160; </div>
<div class="line"><a name="l00518"></a><span class="lineno"><a class="line" href="structcereal_1_1detail_1_1InputBindingMap.html#a92bc21af466e376f1fd9a97e4571dc43"> 518</a></span>&#160; std::map&lt;std::string, Serializers&gt; <a class="code" href="structcereal_1_1detail_1_1InputBindingMap.html#a92bc21af466e376f1fd9a97e4571dc43">map</a>;</div>
<div class="line"><a name="l00519"></a><span class="lineno"> 519</span>&#160; };</div>
<div class="line"><a name="l00520"></a><span class="lineno"> 520</span>&#160; </div>
<div class="line"><a name="l00521"></a><span class="lineno"> 521</span>&#160; <span class="comment">// forward decls for archives from cereal.hpp</span></div>
<div class="line"><a name="l00522"></a><span class="lineno"> 522</span>&#160; <span class="keyword">class </span><a class="code" href="classcereal_1_1detail_1_1InputArchiveBase.html">InputArchiveBase</a>;</div>
<div class="line"><a name="l00523"></a><span class="lineno"> 523</span>&#160; <span class="keyword">class </span><a class="code" href="classcereal_1_1detail_1_1OutputArchiveBase.html">OutputArchiveBase</a>;</div>
<div class="line"><a name="l00524"></a><span class="lineno"> 524</span>&#160; </div>
<div class="line"><a name="l00526"></a><span class="lineno"> 526</span>&#160; </div>
<div class="line"><a name="l00530"></a><span class="lineno"><a class="line" href="structcereal_1_1detail_1_1InputBindingCreator.html"> 530</a></span>&#160; <span class="keyword">template</span> &lt;<span class="keyword">class</span> Archive, <span class="keyword">class</span> T&gt; <span class="keyword">struct </span><a class="code" href="structcereal_1_1detail_1_1InputBindingCreator.html">InputBindingCreator</a></div>
<div class="line"><a name="l00531"></a><span class="lineno"> 531</span>&#160; {</div>
<div class="line"><a name="l00533"></a><span class="lineno"><a class="line" href="structcereal_1_1detail_1_1InputBindingCreator.html#a0844036ce968019290e32f9ab183e9e1"> 533</a></span>&#160; <a class="code" href="structcereal_1_1detail_1_1InputBindingCreator.html#a0844036ce968019290e32f9ab183e9e1">InputBindingCreator</a>()</div>
<div class="line"><a name="l00534"></a><span class="lineno"> 534</span>&#160; {</div>
<div class="line"><a name="l00535"></a><span class="lineno"> 535</span>&#160; <span class="keyword">auto</span> &amp; map = <a class="code" href="classcereal_1_1detail_1_1StaticObject.html">StaticObject&lt;InputBindingMap&lt;Archive&gt;</a>&gt;::getInstance().map;</div>
<div class="line"><a name="l00536"></a><span class="lineno"> 536</span>&#160; <span class="keyword">auto</span> lock = <a class="code" href="classcereal_1_1detail_1_1StaticObject.html">StaticObject&lt;InputBindingMap&lt;Archive&gt;</a>&gt;::lock();</div>
<div class="line"><a name="l00537"></a><span class="lineno"> 537</span>&#160; <span class="keyword">auto</span> key = std::string(<a class="code" href="structcereal_1_1detail_1_1binding__name.html">binding_name&lt;T&gt;::name</a>());</div>
<div class="line"><a name="l00538"></a><span class="lineno"> 538</span>&#160; <span class="keyword">auto</span> lb = map.lower_bound(key);</div>
<div class="line"><a name="l00539"></a><span class="lineno"> 539</span>&#160; </div>
<div class="line"><a name="l00540"></a><span class="lineno"> 540</span>&#160; <span class="keywordflow">if</span> (lb != map.end() &amp;&amp; lb-&gt;first == key)</div>
<div class="line"><a name="l00541"></a><span class="lineno"> 541</span>&#160; <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00542"></a><span class="lineno"> 542</span>&#160; </div>
<div class="line"><a name="l00543"></a><span class="lineno"> 543</span>&#160; <span class="keyword">typename</span> <a class="code" href="structcereal_1_1detail_1_1InputBindingMap_1_1Serializers.html">InputBindingMap&lt;Archive&gt;::Serializers</a> serializers;</div>
<div class="line"><a name="l00544"></a><span class="lineno"> 544</span>&#160; </div>
<div class="line"><a name="l00545"></a><span class="lineno"> 545</span>&#160; serializers.<a class="code" href="structcereal_1_1detail_1_1InputBindingMap_1_1Serializers.html#ae4043c36202a1c63655df1734b048210">shared_ptr</a> =</div>
<div class="line"><a name="l00546"></a><span class="lineno"> 546</span>&#160; [](<span class="keywordtype">void</span> * arptr, std::shared_ptr&lt;void&gt; &amp; dptr, std::type_info <span class="keyword">const</span> &amp; baseInfo)</div>
<div class="line"><a name="l00547"></a><span class="lineno"> 547</span>&#160; {</div>
<div class="line"><a name="l00548"></a><span class="lineno"> 548</span>&#160; Archive &amp; ar = *<span class="keyword">static_cast&lt;</span>Archive*<span class="keyword">&gt;</span>(arptr);</div>
<div class="line"><a name="l00549"></a><span class="lineno"> 549</span>&#160; std::shared_ptr&lt;T&gt; ptr;</div>
<div class="line"><a name="l00550"></a><span class="lineno"> 550</span>&#160; </div>
<div class="line"><a name="l00551"></a><span class="lineno"> 551</span>&#160; ar( <a class="code" href="helpers_8hpp.html#a45c4798e6de29f0f970b658771a4fbf0">CEREAL_NVP_</a>(<span class="stringliteral">&quot;ptr_wrapper&quot;</span>, ::cereal::memory_detail::make_ptr_wrapper(ptr)) );</div>
<div class="line"><a name="l00552"></a><span class="lineno"> 552</span>&#160; </div>
<div class="line"><a name="l00553"></a><span class="lineno"> 553</span>&#160; dptr = PolymorphicCasters::template upcast&lt;T&gt;( ptr, baseInfo );</div>
<div class="line"><a name="l00554"></a><span class="lineno"> 554</span>&#160; };</div>
<div class="line"><a name="l00555"></a><span class="lineno"> 555</span>&#160; </div>
<div class="line"><a name="l00556"></a><span class="lineno"> 556</span>&#160; serializers.<a class="code" href="structcereal_1_1detail_1_1InputBindingMap_1_1Serializers.html#a94620847674f5398454cbdb9660b8532">unique_ptr</a> =</div>
<div class="line"><a name="l00557"></a><span class="lineno"> 557</span>&#160; [](<span class="keywordtype">void</span> * arptr, std::unique_ptr&lt;void, EmptyDeleter&lt;void&gt;&gt; &amp; dptr, std::type_info <span class="keyword">const</span> &amp; baseInfo)</div>
<div class="line"><a name="l00558"></a><span class="lineno"> 558</span>&#160; {</div>
<div class="line"><a name="l00559"></a><span class="lineno"> 559</span>&#160; Archive &amp; ar = *<span class="keyword">static_cast&lt;</span>Archive*<span class="keyword">&gt;</span>(arptr);</div>
<div class="line"><a name="l00560"></a><span class="lineno"> 560</span>&#160; std::unique_ptr&lt;T&gt; ptr;</div>
<div class="line"><a name="l00561"></a><span class="lineno"> 561</span>&#160; </div>
<div class="line"><a name="l00562"></a><span class="lineno"> 562</span>&#160; ar( <a class="code" href="helpers_8hpp.html#a45c4798e6de29f0f970b658771a4fbf0">CEREAL_NVP_</a>(<span class="stringliteral">&quot;ptr_wrapper&quot;</span>, ::cereal::memory_detail::make_ptr_wrapper(ptr)) );</div>
<div class="line"><a name="l00563"></a><span class="lineno"> 563</span>&#160; </div>
<div class="line"><a name="l00564"></a><span class="lineno"> 564</span>&#160; dptr.reset( PolymorphicCasters::template upcast&lt;T&gt;( ptr.release(), baseInfo ));</div>
<div class="line"><a name="l00565"></a><span class="lineno"> 565</span>&#160; };</div>
<div class="line"><a name="l00566"></a><span class="lineno"> 566</span>&#160; </div>
<div class="line"><a name="l00567"></a><span class="lineno"> 567</span>&#160; map.insert( lb, { std::move(key), std::move(serializers) } );</div>
<div class="line"><a name="l00568"></a><span class="lineno"> 568</span>&#160; }</div>
<div class="line"><a name="l00569"></a><span class="lineno"> 569</span>&#160; };</div>
<div class="line"><a name="l00570"></a><span class="lineno"> 570</span>&#160; </div>
<div class="line"><a name="l00572"></a><span class="lineno"> 572</span>&#160; </div>
<div class="line"><a name="l00576"></a><span class="lineno"><a class="line" href="structcereal_1_1detail_1_1OutputBindingCreator.html"> 576</a></span>&#160; <span class="keyword">template</span> &lt;<span class="keyword">class</span> Archive, <span class="keyword">class</span> T&gt; <span class="keyword">struct </span><a class="code" href="structcereal_1_1detail_1_1OutputBindingCreator.html">OutputBindingCreator</a></div>
<div class="line"><a name="l00577"></a><span class="lineno"> 577</span>&#160; {</div>
<div class="line"><a name="l00579"></a><span class="lineno"><a class="line" href="structcereal_1_1detail_1_1OutputBindingCreator.html#aa8421ea2f60481abd46f3fd59ab3680a"> 579</a></span>&#160; <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="structcereal_1_1detail_1_1OutputBindingCreator.html#aa8421ea2f60481abd46f3fd59ab3680a">writeMetadata</a>(Archive &amp; ar)</div>
<div class="line"><a name="l00580"></a><span class="lineno"> 580</span>&#160; {</div>
<div class="line"><a name="l00581"></a><span class="lineno"> 581</span>&#160; <span class="comment">// Register the polymorphic type name with the archive, and get the id</span></div>
<div class="line"><a name="l00582"></a><span class="lineno"> 582</span>&#160; <span class="keywordtype">char</span> <span class="keyword">const</span> * name = <a class="code" href="structcereal_1_1detail_1_1binding__name.html">binding_name&lt;T&gt;::name</a>();</div>
<div class="line"><a name="l00583"></a><span class="lineno"> 583</span>&#160; std::uint32_t <span class="keywordtype">id</span> = ar.registerPolymorphicType(name);</div>
<div class="line"><a name="l00584"></a><span class="lineno"> 584</span>&#160; </div>
<div class="line"><a name="l00585"></a><span class="lineno"> 585</span>&#160; <span class="comment">// Serialize the id</span></div>
<div class="line"><a name="l00586"></a><span class="lineno"> 586</span>&#160; ar( <a class="code" href="helpers_8hpp.html#a45c4798e6de29f0f970b658771a4fbf0">CEREAL_NVP_</a>(<span class="stringliteral">&quot;polymorphic_id&quot;</span>, <span class="keywordtype">id</span>) );</div>
<div class="line"><a name="l00587"></a><span class="lineno"> 587</span>&#160; </div>
<div class="line"><a name="l00588"></a><span class="lineno"> 588</span>&#160; <span class="comment">// If the msb of the id is 1, then the type name is new, and we should serialize it</span></div>
<div class="line"><a name="l00589"></a><span class="lineno"> 589</span>&#160; <span class="keywordflow">if</span>( <span class="keywordtype">id</span> &amp; detail::msb_32bit )</div>
<div class="line"><a name="l00590"></a><span class="lineno"> 590</span>&#160; {</div>
<div class="line"><a name="l00591"></a><span class="lineno"> 591</span>&#160; std::string namestring(name);</div>
<div class="line"><a name="l00592"></a><span class="lineno"> 592</span>&#160; ar( <a class="code" href="helpers_8hpp.html#a45c4798e6de29f0f970b658771a4fbf0">CEREAL_NVP_</a>(<span class="stringliteral">&quot;polymorphic_name&quot;</span>, namestring) );</div>
<div class="line"><a name="l00593"></a><span class="lineno"> 593</span>&#160; }</div>
<div class="line"><a name="l00594"></a><span class="lineno"> 594</span>&#160; }</div>
<div class="line"><a name="l00595"></a><span class="lineno"> 595</span>&#160; </div>
<div class="line"><a name="l00597"></a><span class="lineno"><a class="line" href="classcereal_1_1detail_1_1OutputBindingCreator_1_1PolymorphicSharedPointerWrapper.html"> 597</a></span>&#160; <span class="keyword">class </span><a class="code" href="classcereal_1_1detail_1_1OutputBindingCreator_1_1PolymorphicSharedPointerWrapper.html">PolymorphicSharedPointerWrapper</a></div>
<div class="line"><a name="l00598"></a><span class="lineno"> 598</span>&#160; {</div>
<div class="line"><a name="l00599"></a><span class="lineno"> 599</span>&#160; <span class="keyword">public</span>:</div>
<div class="line"><a name="l00612"></a><span class="lineno"><a class="line" href="classcereal_1_1detail_1_1OutputBindingCreator_1_1PolymorphicSharedPointerWrapper.html#a5829b5ea0be50c066261fcf36b4fb6fd"> 612</a></span>&#160; <a class="code" href="classcereal_1_1detail_1_1OutputBindingCreator_1_1PolymorphicSharedPointerWrapper.html#a5829b5ea0be50c066261fcf36b4fb6fd">PolymorphicSharedPointerWrapper</a>( T <span class="keyword">const</span> * dptr ) : refCount(), wrappedPtr( refCount, dptr )</div>
<div class="line"><a name="l00613"></a><span class="lineno"> 613</span>&#160; { }</div>
<div class="line"><a name="l00614"></a><span class="lineno"> 614</span>&#160; </div>
<div class="line"><a name="l00616"></a><span class="lineno"><a class="line" href="classcereal_1_1detail_1_1OutputBindingCreator_1_1PolymorphicSharedPointerWrapper.html#a511860a91f458bd67df933b7cfc23bba"> 616</a></span>&#160; <span class="keyword">inline</span> std::shared_ptr&lt;T const&gt; <span class="keyword">const</span> &amp; <a class="code" href="classcereal_1_1detail_1_1OutputBindingCreator_1_1PolymorphicSharedPointerWrapper.html#a511860a91f458bd67df933b7cfc23bba">operator()</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> wrappedPtr; }</div>
<div class="line"><a name="l00617"></a><span class="lineno"> 617</span>&#160; </div>
<div class="line"><a name="l00618"></a><span class="lineno"> 618</span>&#160; <span class="keyword">private</span>:</div>
<div class="line"><a name="l00619"></a><span class="lineno"> 619</span>&#160; std::shared_ptr&lt;void&gt; refCount; </div>
<div class="line"><a name="l00620"></a><span class="lineno"> 620</span>&#160; std::shared_ptr&lt;T const&gt; wrappedPtr; </div>
<div class="line"><a name="l00621"></a><span class="lineno"> 621</span>&#160; };</div>
<div class="line"><a name="l00622"></a><span class="lineno"> 622</span>&#160; </div>
<div class="line"><a name="l00624"></a><span class="lineno"> 624</span>&#160; </div>
<div class="line"><a name="l00631"></a><span class="lineno"><a class="line" href="structcereal_1_1detail_1_1OutputBindingCreator.html#a75f9c27414802737b3a040edf9ab9555"> 631</a></span>&#160; <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="structcereal_1_1detail_1_1OutputBindingCreator.html#a75f9c27414802737b3a040edf9ab9555">savePolymorphicSharedPtr</a>( Archive &amp; ar, T <span class="keyword">const</span> * dptr, std::true_type <span class="comment">/* has_shared_from_this */</span> )</div>
<div class="line"><a name="l00632"></a><span class="lineno"> 632</span>&#160; {</div>
<div class="line"><a name="l00633"></a><span class="lineno"> 633</span>&#160; <a class="code" href="classcereal_1_1memory__detail_1_1EnableSharedStateHelper.html">::cereal::memory_detail::EnableSharedStateHelper&lt;T&gt;</a> state( <span class="keyword">const_cast&lt;</span>T *<span class="keyword">&gt;</span>(dptr) );</div>
<div class="line"><a name="l00634"></a><span class="lineno"> 634</span>&#160; <a class="code" href="classcereal_1_1detail_1_1OutputBindingCreator_1_1PolymorphicSharedPointerWrapper.html">PolymorphicSharedPointerWrapper</a> psptr( dptr );</div>
<div class="line"><a name="l00635"></a><span class="lineno"> 635</span>&#160; ar( <a class="code" href="helpers_8hpp.html#a45c4798e6de29f0f970b658771a4fbf0">CEREAL_NVP_</a>(<span class="stringliteral">&quot;ptr_wrapper&quot;</span>, memory_detail::make_ptr_wrapper( psptr() ) ) );</div>
<div class="line"><a name="l00636"></a><span class="lineno"> 636</span>&#160; }</div>
<div class="line"><a name="l00637"></a><span class="lineno"> 637</span>&#160; </div>
<div class="line"><a name="l00639"></a><span class="lineno"> 639</span>&#160; </div>
<div class="line"><a name="l00646"></a><span class="lineno"><a class="line" href="structcereal_1_1detail_1_1OutputBindingCreator.html#a9ece659f4e7b869b6a8295e8be3847ab"> 646</a></span>&#160; <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="structcereal_1_1detail_1_1OutputBindingCreator.html#a9ece659f4e7b869b6a8295e8be3847ab">savePolymorphicSharedPtr</a>( Archive &amp; ar, T <span class="keyword">const</span> * dptr, std::false_type <span class="comment">/* has_shared_from_this */</span> )</div>
<div class="line"><a name="l00647"></a><span class="lineno"> 647</span>&#160; {</div>
<div class="line"><a name="l00648"></a><span class="lineno"> 648</span>&#160; <a class="code" href="classcereal_1_1detail_1_1OutputBindingCreator_1_1PolymorphicSharedPointerWrapper.html">PolymorphicSharedPointerWrapper</a> psptr( dptr );</div>
<div class="line"><a name="l00649"></a><span class="lineno"> 649</span>&#160; ar( <a class="code" href="helpers_8hpp.html#a45c4798e6de29f0f970b658771a4fbf0">CEREAL_NVP_</a>(<span class="stringliteral">&quot;ptr_wrapper&quot;</span>, memory_detail::make_ptr_wrapper( psptr() ) ) );</div>
<div class="line"><a name="l00650"></a><span class="lineno"> 650</span>&#160; }</div>
<div class="line"><a name="l00651"></a><span class="lineno"> 651</span>&#160; </div>
<div class="line"><a name="l00653"></a><span class="lineno"><a class="line" href="structcereal_1_1detail_1_1OutputBindingCreator.html#ae7fd60f4fd68a90e0fa53141141ed467"> 653</a></span>&#160; <a class="code" href="structcereal_1_1detail_1_1OutputBindingCreator.html#ae7fd60f4fd68a90e0fa53141141ed467">OutputBindingCreator</a>()</div>
<div class="line"><a name="l00654"></a><span class="lineno"> 654</span>&#160; {</div>
<div class="line"><a name="l00655"></a><span class="lineno"> 655</span>&#160; <span class="keyword">auto</span> &amp; map = <a class="code" href="classcereal_1_1detail_1_1StaticObject.html">StaticObject&lt;OutputBindingMap&lt;Archive&gt;</a>&gt;::getInstance().map;</div>
<div class="line"><a name="l00656"></a><span class="lineno"> 656</span>&#160; <span class="keyword">auto</span> key = std::type_index(<span class="keyword">typeid</span>(T));</div>
<div class="line"><a name="l00657"></a><span class="lineno"> 657</span>&#160; <span class="keyword">auto</span> lb = map.lower_bound(key);</div>
<div class="line"><a name="l00658"></a><span class="lineno"> 658</span>&#160; </div>
<div class="line"><a name="l00659"></a><span class="lineno"> 659</span>&#160; <span class="keywordflow">if</span> (lb != map.end() &amp;&amp; lb-&gt;first == key)</div>
<div class="line"><a name="l00660"></a><span class="lineno"> 660</span>&#160; <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00661"></a><span class="lineno"> 661</span>&#160; </div>
<div class="line"><a name="l00662"></a><span class="lineno"> 662</span>&#160; <span class="keyword">typename</span> <a class="code" href="structcereal_1_1detail_1_1OutputBindingMap_1_1Serializers.html">OutputBindingMap&lt;Archive&gt;::Serializers</a> serializers;</div>
<div class="line"><a name="l00663"></a><span class="lineno"> 663</span>&#160; </div>
<div class="line"><a name="l00664"></a><span class="lineno"> 664</span>&#160; serializers.<a class="code" href="structcereal_1_1detail_1_1OutputBindingMap_1_1Serializers.html#a8602064aeec6a847f1fe81fe9461ea18">shared_ptr</a> =</div>
<div class="line"><a name="l00665"></a><span class="lineno"> 665</span>&#160; [&amp;](<span class="keywordtype">void</span> * arptr, <span class="keywordtype">void</span> <span class="keyword">const</span> * dptr, std::type_info <span class="keyword">const</span> &amp; baseInfo)</div>
<div class="line"><a name="l00666"></a><span class="lineno"> 666</span>&#160; {</div>
<div class="line"><a name="l00667"></a><span class="lineno"> 667</span>&#160; Archive &amp; ar = *<span class="keyword">static_cast&lt;</span>Archive*<span class="keyword">&gt;</span>(arptr);</div>
<div class="line"><a name="l00668"></a><span class="lineno"> 668</span>&#160; writeMetadata(ar);</div>
<div class="line"><a name="l00669"></a><span class="lineno"> 669</span>&#160; </div>
<div class="line"><a name="l00670"></a><span class="lineno"> 670</span>&#160; <span class="keyword">auto</span> ptr = PolymorphicCasters::template downcast&lt;T&gt;( dptr, baseInfo );</div>
<div class="line"><a name="l00671"></a><span class="lineno"> 671</span>&#160; </div>
<div class="line"><a name="l00672"></a><span class="lineno"> 672</span>&#160;<span class="preprocessor"> #if defined(_MSC_VER) &amp;&amp; _MSC_VER &lt; 1916 &amp;&amp; !defined(__clang__)</span></div>
<div class="line"><a name="l00673"></a><span class="lineno"> 673</span>&#160; savePolymorphicSharedPtr( ar, ptr, ::<a class="code" href="structcereal_1_1traits_1_1has__shared__from__this.html">cereal::traits::has_shared_from_this&lt;T&gt;::type</a>() ); <span class="comment">// MSVC doesn&#39;t like typename here</span></div>
<div class="line"><a name="l00674"></a><span class="lineno"> 674</span>&#160;<span class="preprocessor"> #else // not _MSC_VER</span></div>
<div class="line"><a name="l00675"></a><span class="lineno"> 675</span>&#160; savePolymorphicSharedPtr( ar, ptr, typename ::cereal::traits::has_shared_from_this&lt;T&gt;::type() );</div>
<div class="line"><a name="l00676"></a><span class="lineno"> 676</span>&#160;<span class="preprocessor"> #endif // _MSC_VER</span></div>
<div class="line"><a name="l00677"></a><span class="lineno"> 677</span>&#160; };</div>
<div class="line"><a name="l00678"></a><span class="lineno"> 678</span>&#160; </div>
<div class="line"><a name="l00679"></a><span class="lineno"> 679</span>&#160; serializers.<a class="code" href="structcereal_1_1detail_1_1OutputBindingMap_1_1Serializers.html#ab4c2f8544bdbe179ef4664de9589f825">unique_ptr</a> =</div>
<div class="line"><a name="l00680"></a><span class="lineno"> 680</span>&#160; [&amp;](<span class="keywordtype">void</span> * arptr, <span class="keywordtype">void</span> <span class="keyword">const</span> * dptr, std::type_info <span class="keyword">const</span> &amp; baseInfo)</div>
<div class="line"><a name="l00681"></a><span class="lineno"> 681</span>&#160; {</div>
<div class="line"><a name="l00682"></a><span class="lineno"> 682</span>&#160; Archive &amp; ar = *<span class="keyword">static_cast&lt;</span>Archive*<span class="keyword">&gt;</span>(arptr);</div>
<div class="line"><a name="l00683"></a><span class="lineno"> 683</span>&#160; writeMetadata(ar);</div>
<div class="line"><a name="l00684"></a><span class="lineno"> 684</span>&#160; </div>
<div class="line"><a name="l00685"></a><span class="lineno"> 685</span>&#160; std::unique_ptr&lt;T const, EmptyDeleter&lt;T const&gt;&gt; <span class="keyword">const</span> ptr( PolymorphicCasters::template downcast&lt;T&gt;( dptr, baseInfo ) );</div>
<div class="line"><a name="l00686"></a><span class="lineno"> 686</span>&#160; </div>
<div class="line"><a name="l00687"></a><span class="lineno"> 687</span>&#160; ar( <a class="code" href="helpers_8hpp.html#a45c4798e6de29f0f970b658771a4fbf0">CEREAL_NVP_</a>(<span class="stringliteral">&quot;ptr_wrapper&quot;</span>, memory_detail::make_ptr_wrapper(ptr)) );</div>
<div class="line"><a name="l00688"></a><span class="lineno"> 688</span>&#160; };</div>
<div class="line"><a name="l00689"></a><span class="lineno"> 689</span>&#160; </div>
<div class="line"><a name="l00690"></a><span class="lineno"> 690</span>&#160; map.insert( { std::move(key), std::move(serializers) } );</div>
<div class="line"><a name="l00691"></a><span class="lineno"> 691</span>&#160; }</div>
<div class="line"><a name="l00692"></a><span class="lineno"> 692</span>&#160; };</div>
<div class="line"><a name="l00693"></a><span class="lineno"> 693</span>&#160; </div>
<div class="line"><a name="l00696"></a><span class="lineno"><a class="line" href="structcereal_1_1detail_1_1adl__tag.html"> 696</a></span>&#160; <span class="keyword">struct </span><a class="code" href="structcereal_1_1detail_1_1adl__tag.html">adl_tag</a> {};</div>
<div class="line"><a name="l00697"></a><span class="lineno"> 697</span>&#160; </div>
<div class="line"><a name="l00709"></a><span class="lineno"> 709</span>&#160;<span class="preprocessor">#ifdef CEREAL_HAS_CPP17</span></div>
<div class="line"><a name="l00710"></a><span class="lineno"> 710</span>&#160; <span class="keyword">struct </span>polymorphic_binding_tag {};</div>
<div class="line"><a name="l00711"></a><span class="lineno"> 711</span>&#160;<span class="preprocessor">#else</span></div>
<div class="line"><a name="l00712"></a><span class="lineno"> 712</span>&#160; <span class="keyword">namespace </span>{ <span class="keyword">struct </span>polymorphic_binding_tag {}; }</div>
<div class="line"><a name="l00713"></a><span class="lineno"> 713</span>&#160;<span class="preprocessor">#endif</span></div>
<div class="line"><a name="l00714"></a><span class="lineno"> 714</span>&#160; </div>
<div class="line"><a name="l00715"></a><span class="lineno"> 715</span>&#160; </div>
<div class="line"><a name="l00717"></a><span class="lineno"> 717</span>&#160; <span class="keyword">template</span> &lt;<span class="keyword">class</span> Archive, <span class="keyword">class</span> T&gt;</div>
<div class="line"><a name="l00718"></a><span class="lineno"><a class="line" href="structcereal_1_1detail_1_1create__bindings.html"> 718</a></span>&#160; <span class="keyword">struct </span><a class="code" href="structcereal_1_1detail_1_1create__bindings.html">create_bindings</a></div>
<div class="line"><a name="l00719"></a><span class="lineno"> 719</span>&#160; {</div>
<div class="line"><a name="l00720"></a><span class="lineno"> 720</span>&#160; <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="structcereal_1_1detail_1_1InputBindingCreator.html">InputBindingCreator&lt;Archive, T&gt;</a> &amp;</div>
<div class="line"><a name="l00721"></a><span class="lineno"> 721</span>&#160; load(std::true_type)</div>
<div class="line"><a name="l00722"></a><span class="lineno"> 722</span>&#160; {</div>
<div class="line"><a name="l00723"></a><span class="lineno"> 723</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classcereal_1_1detail_1_1StaticObject.html">cereal::detail::StaticObject&lt;InputBindingCreator&lt;Archive, T&gt;</a>&gt;::getInstance();</div>
<div class="line"><a name="l00724"></a><span class="lineno"> 724</span>&#160; }</div>
<div class="line"><a name="l00725"></a><span class="lineno"> 725</span>&#160; </div>
<div class="line"><a name="l00726"></a><span class="lineno"> 726</span>&#160; <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="structcereal_1_1detail_1_1OutputBindingCreator.html">OutputBindingCreator&lt;Archive, T&gt;</a> &amp;</div>
<div class="line"><a name="l00727"></a><span class="lineno"> 727</span>&#160; save(std::true_type)</div>
<div class="line"><a name="l00728"></a><span class="lineno"> 728</span>&#160; {</div>
<div class="line"><a name="l00729"></a><span class="lineno"> 729</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classcereal_1_1detail_1_1StaticObject.html">cereal::detail::StaticObject&lt;OutputBindingCreator&lt;Archive, T&gt;</a>&gt;::getInstance();</div>
<div class="line"><a name="l00730"></a><span class="lineno"> 730</span>&#160; }</div>
<div class="line"><a name="l00731"></a><span class="lineno"> 731</span>&#160; </div>
<div class="line"><a name="l00732"></a><span class="lineno"> 732</span>&#160; <span class="keyword">inline</span> <span class="keyword">static</span> <span class="keywordtype">void</span> load(std::false_type) {}</div>
<div class="line"><a name="l00733"></a><span class="lineno"> 733</span>&#160; <span class="keyword">inline</span> <span class="keyword">static</span> <span class="keywordtype">void</span> save(std::false_type) {}</div>
<div class="line"><a name="l00734"></a><span class="lineno"> 734</span>&#160; };</div>
<div class="line"><a name="l00735"></a><span class="lineno"> 735</span>&#160; </div>
<div class="line"><a name="l00737"></a><span class="lineno"> 737</span>&#160; <span class="keyword">template</span> &lt;<span class="keywordtype">void</span>(*)()&gt;</div>
<div class="line"><a name="l00738"></a><span class="lineno"><a class="line" href="structcereal_1_1detail_1_1instantiate__function.html"> 738</a></span>&#160; <span class="keyword">struct </span><a class="code" href="structcereal_1_1detail_1_1instantiate__function.html">instantiate_function</a> {};</div>
<div class="line"><a name="l00739"></a><span class="lineno"> 739</span>&#160; </div>
<div class="line"><a name="l00745"></a><span class="lineno"> 745</span>&#160; <span class="keyword">template</span> &lt;<span class="keyword">class</span> Archive, <span class="keyword">class</span> T&gt;</div>
<div class="line"><a name="l00746"></a><span class="lineno"> 746</span>&#160; <span class="keyword">struct </span><a class="code" href="structcereal_1_1detail_1_1polymorphic__serialization__support.html">polymorphic_serialization_support</a></div>
<div class="line"><a name="l00747"></a><span class="lineno"> 747</span>&#160; {</div>
<div class="line"><a name="l00748"></a><span class="lineno"> 748</span>&#160;<span class="preprocessor"> #if defined(_MSC_VER) &amp;&amp; !defined(__INTEL_COMPILER)</span></div>
<div class="line"><a name="l00749"></a><span class="lineno"> 749</span>&#160; <span class="keyword">virtual</span> <a class="code" href="static__object_8hpp.html#afde52a096f363ebe6869a9c0f9ef4cbb">CEREAL_DLL_EXPORT</a> <span class="keywordtype">void</span> instantiate() CEREAL_USED;</div>
<div class="line"><a name="l00752"></a><span class="lineno"> 752</span>&#160; <span class="preprocessor">#else // NOT _MSC_VER</span></div>
<div class="line"><a name="l00753"></a><span class="lineno"> 753</span>&#160; <span class="keyword">static</span> <a class="code" href="static__object_8hpp.html#afde52a096f363ebe6869a9c0f9ef4cbb">CEREAL_DLL_EXPORT</a> <span class="keywordtype">void</span> instantiate() CEREAL_USED;</div>
<div class="line"><a name="l00757"></a><span class="lineno"><a class="line" href="structcereal_1_1detail_1_1polymorphic__serialization__support.html#af32ebd1e93fee3dbed819bf1cfbfd073"> 757</a></span>&#160; typedef <a class="code" href="structcereal_1_1detail_1_1instantiate__function.html">instantiate_function</a>&lt;instantiate&gt; <a class="code" href="structcereal_1_1detail_1_1instantiate__function.html">unused</a>;</div>
<div class="line"><a name="l00758"></a><span class="lineno"> 758</span>&#160; <span class="preprocessor">#endif // _MSC_VER</span></div>
<div class="line"><a name="l00759"></a><span class="lineno"> 759</span>&#160; };</div>
<div class="line"><a name="l00760"></a><span class="lineno"> 760</span>&#160; </div>
<div class="line"><a name="l00761"></a><span class="lineno"> 761</span>&#160; <span class="comment">// instantiate implementation</span></div>
<div class="line"><a name="l00762"></a><span class="lineno"> 762</span>&#160; <span class="keyword">template</span> &lt;<span class="keyword">class</span> Archive, <span class="keyword">class</span> T&gt;</div>
<div class="line"><a name="l00763"></a><span class="lineno"><a class="line" href="structcereal_1_1detail_1_1polymorphic__serialization__support.html#af36d034f2aa70a683dc198fc4de9192d"> 763</a></span>&#160; <a class="code" href="static__object_8hpp.html#afde52a096f363ebe6869a9c0f9ef4cbb">CEREAL_DLL_EXPORT</a> <span class="keywordtype">void</span> <a class="code" href="structcereal_1_1detail_1_1polymorphic__serialization__support.html">polymorphic_serialization_support&lt;Archive,T&gt;::instantiate</a>()</div>
<div class="line"><a name="l00764"></a><span class="lineno"> 764</span>&#160; {</div>
<div class="line"><a name="l00765"></a><span class="lineno"> 765</span>&#160; <a class="code" href="structcereal_1_1detail_1_1create__bindings.html">create_bindings&lt;Archive,T&gt;::save</a>( std::integral_constant&lt;<span class="keywordtype">bool</span>,</div>
<div class="line"><a name="l00766"></a><span class="lineno"> 766</span>&#160; std::is_base_of&lt;detail::OutputArchiveBase, Archive&gt;::value &amp;&amp;</div>
<div class="line"><a name="l00767"></a><span class="lineno"> 767</span>&#160; <a class="code" href="structcereal_1_1traits_1_1is__output__serializable.html">traits::is_output_serializable&lt;T, Archive&gt;::value</a>&gt;{} );</div>
<div class="line"><a name="l00768"></a><span class="lineno"> 768</span>&#160; </div>
<div class="line"><a name="l00769"></a><span class="lineno"> 769</span>&#160; <a class="code" href="structcereal_1_1detail_1_1create__bindings.html">create_bindings&lt;Archive,T&gt;::load</a>( std::integral_constant&lt;<span class="keywordtype">bool</span>,</div>
<div class="line"><a name="l00770"></a><span class="lineno"> 770</span>&#160; std::is_base_of&lt;detail::InputArchiveBase, Archive&gt;::value &amp;&amp;</div>
<div class="line"><a name="l00771"></a><span class="lineno"> 771</span>&#160; <a class="code" href="structcereal_1_1traits_1_1is__input__serializable.html">traits::is_input_serializable&lt;T, Archive&gt;::value</a>&gt;{} );</div>
<div class="line"><a name="l00772"></a><span class="lineno"> 772</span>&#160; }</div>
<div class="line"><a name="l00773"></a><span class="lineno"> 773</span>&#160; </div>
<div class="line"><a name="l00775"></a><span class="lineno"> 775</span>&#160; </div>
<div class="line"><a name="l00779"></a><span class="lineno"> 779</span>&#160; <span class="keyword">template</span> &lt;<span class="keyword">class</span> T, <span class="keyword">class</span> Tag = polymorphic_binding_tag&gt;</div>
<div class="line"><a name="l00780"></a><span class="lineno"><a class="line" href="structcereal_1_1detail_1_1bind__to__archives.html"> 780</a></span>&#160; <span class="keyword">struct </span><a class="code" href="structcereal_1_1detail_1_1bind__to__archives.html">bind_to_archives</a></div>
<div class="line"><a name="l00781"></a><span class="lineno"> 781</span>&#160; {</div>
<div class="line"><a name="l00783"></a><span class="lineno"><a class="line" href="structcereal_1_1detail_1_1bind__to__archives.html#a691a82f3c9926493923725dd468779c1"> 783</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="structcereal_1_1detail_1_1bind__to__archives.html#a691a82f3c9926493923725dd468779c1">bind</a>(std::false_type)<span class="keyword"> const</span></div>
<div class="line"><a name="l00784"></a><span class="lineno"> 784</span>&#160;<span class="keyword"> </span>{</div>
<div class="line"><a name="l00785"></a><span class="lineno"> 785</span>&#160; <a class="code" href="polymorphic__impl_8hpp.html#a9c34d32da6bee20cb6609e78efc69174">instantiate_polymorphic_binding</a>(<span class="keyword">static_cast&lt;</span>T*<span class="keyword">&gt;</span>(<span class="keyword">nullptr</span>), 0, Tag{}, <a class="code" href="structcereal_1_1detail_1_1adl__tag.html">adl_tag</a>{});</div>
<div class="line"><a name="l00786"></a><span class="lineno"> 786</span>&#160; }</div>
<div class="line"><a name="l00787"></a><span class="lineno"> 787</span>&#160; </div>
<div class="line"><a name="l00789"></a><span class="lineno"><a class="line" href="structcereal_1_1detail_1_1bind__to__archives.html#a6c61fc1dddb581a47b331eda2b366083"> 789</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="structcereal_1_1detail_1_1bind__to__archives.html#a6c61fc1dddb581a47b331eda2b366083">bind</a>(std::true_type)<span class="keyword"> const</span></div>
<div class="line"><a name="l00790"></a><span class="lineno"> 790</span>&#160;<span class="keyword"> </span>{ }</div>
<div class="line"><a name="l00791"></a><span class="lineno"> 791</span>&#160; </div>
<div class="line"><a name="l00793"></a><span class="lineno"> 793</span>&#160; </div>
<div class="line"><a name="l00795"></a><span class="lineno"><a class="line" href="structcereal_1_1detail_1_1bind__to__archives.html#a195579d563d83eee353e74ab332455c0"> 795</a></span>&#160; <a class="code" href="structcereal_1_1detail_1_1bind__to__archives.html">bind_to_archives</a> <span class="keyword">const</span> &amp; <a class="code" href="structcereal_1_1detail_1_1bind__to__archives.html#a195579d563d83eee353e74ab332455c0">bind</a>()<span class="keyword"> const</span></div>
<div class="line"><a name="l00796"></a><span class="lineno"> 796</span>&#160;<span class="keyword"> </span>{</div>
<div class="line"><a name="l00797"></a><span class="lineno"> 797</span>&#160; static_assert( std::is_polymorphic&lt;T&gt;::value,</div>
<div class="line"><a name="l00798"></a><span class="lineno"> 798</span>&#160; <span class="stringliteral">&quot;Attempting to register non polymorphic type&quot;</span> );</div>
<div class="line"><a name="l00799"></a><span class="lineno"> 799</span>&#160; bind( std::is_abstract&lt;T&gt;() );</div>
<div class="line"><a name="l00800"></a><span class="lineno"> 800</span>&#160; <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div>
<div class="line"><a name="l00801"></a><span class="lineno"> 801</span>&#160; }</div>
<div class="line"><a name="l00802"></a><span class="lineno"> 802</span>&#160; };</div>
<div class="line"><a name="l00803"></a><span class="lineno"> 803</span>&#160; </div>
<div class="line"><a name="l00805"></a><span class="lineno"> 805</span>&#160; <span class="keyword">template</span> &lt;<span class="keyword">class</span> T, <span class="keyword">class</span> Tag = polymorphic_binding_tag&gt;</div>
<div class="line"><a name="l00806"></a><span class="lineno"><a class="line" href="structcereal_1_1detail_1_1init__binding.html"> 806</a></span>&#160; <span class="keyword">struct </span><a class="code" href="structcereal_1_1detail_1_1init__binding.html">init_binding</a>;</div>
<div class="line"><a name="l00807"></a><span class="lineno"> 807</span>&#160; </div>
<div class="line"><a name="l00809"></a><span class="lineno"> 809</span>&#160; </div>
<div class="line"><a name="l00820"></a><span class="lineno"> 820</span>&#160; <span class="keyword">template</span> &lt;<span class="keyword">class</span> T, <span class="keyword">typename</span> BindingTag&gt;</div>
<div class="line"><a name="l00821"></a><span class="lineno"><a class="line" href="polymorphic__impl_8hpp.html#a9c34d32da6bee20cb6609e78efc69174"> 821</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="polymorphic__impl_8hpp.html#a9c34d32da6bee20cb6609e78efc69174">instantiate_polymorphic_binding</a>( T*, <span class="keywordtype">int</span>, BindingTag, <a class="code" href="structcereal_1_1detail_1_1adl__tag.html">adl_tag</a> ) {}</div>
<div class="line"><a name="l00822"></a><span class="lineno"> 822</span>&#160; } <span class="comment">// namespace detail</span></div>
<div class="line"><a name="l00823"></a><span class="lineno"> 823</span>&#160;} <span class="comment">// namespace cereal</span></div>
<div class="line"><a name="l00824"></a><span class="lineno"> 824</span>&#160; </div>
<div class="line"><a name="l00825"></a><span class="lineno"> 825</span>&#160;<span class="preprocessor">#endif // CEREAL_DETAILS_POLYMORPHIC_IMPL_HPP_</span></div>
</div><!-- fragment --></div><!-- contents -->
<div class="ttc" id="apolymorphic__impl_8hpp_html_a9c34d32da6bee20cb6609e78efc69174"><div class="ttname"><a href="polymorphic__impl_8hpp.html#a9c34d32da6bee20cb6609e78efc69174">cereal::detail::instantiate_polymorphic_binding</a></div><div class="ttdeci">void instantiate_polymorphic_binding(T *, int, BindingTag, adl_tag)</div><div class="ttdoc">Base case overload for instantiation.</div><div class="ttdef"><b>Definition:</b> polymorphic_impl.hpp:821</div></div>
<div class="ttc" id="aclasscereal_1_1detail_1_1OutputBindingCreator_1_1PolymorphicSharedPointerWrapper_html_a511860a91f458bd67df933b7cfc23bba"><div class="ttname"><a href="classcereal_1_1detail_1_1OutputBindingCreator_1_1PolymorphicSharedPointerWrapper.html#a511860a91f458bd67df933b7cfc23bba">cereal::detail::OutputBindingCreator::PolymorphicSharedPointerWrapper::operator()</a></div><div class="ttdeci">const std::shared_ptr&lt; T const &gt; &amp; operator()() const</div><div class="ttdoc">Get the wrapped shared_ptr */.</div><div class="ttdef"><b>Definition:</b> polymorphic_impl.hpp:616</div></div>
<div class="ttc" id="ahelpers_8hpp_html_a45c4798e6de29f0f970b658771a4fbf0"><div class="ttname"><a href="helpers_8hpp.html#a45c4798e6de29f0f970b658771a4fbf0">CEREAL_NVP_</a></div><div class="ttdeci">#define CEREAL_NVP_(name, value)</div><div class="ttdoc">Convenience for creating a templated NVP.</div><div class="ttdef"><b>Definition:</b> helpers.hpp:201</div></div>
<div class="ttc" id="astructcereal_1_1detail_1_1InputBindingMap_html_a8b3e4f742e4cd9f5210930e0f272383b"><div class="ttname"><a href="structcereal_1_1detail_1_1InputBindingMap.html#a8b3e4f742e4cd9f5210930e0f272383b">cereal::detail::InputBindingMap::SharedSerializer</a></div><div class="ttdeci">std::function&lt; void(void *, std::shared_ptr&lt; void &gt; &amp;, std::type_info const &amp;)&gt; SharedSerializer</div><div class="ttdoc">Shared ptr serializer function.</div><div class="ttdef"><b>Definition:</b> polymorphic_impl.hpp:506</div></div>
<div class="ttc" id="astructcereal_1_1detail_1_1InputBindingMap_1_1Serializers_html_ae4043c36202a1c63655df1734b048210"><div class="ttname"><a href="structcereal_1_1detail_1_1InputBindingMap_1_1Serializers.html#ae4043c36202a1c63655df1734b048210">cereal::detail::InputBindingMap::Serializers::shared_ptr</a></div><div class="ttdeci">SharedSerializer shared_ptr</div><div class="ttdoc">Serializer function for shared/weak pointers.</div><div class="ttdef"><b>Definition:</b> polymorphic_impl.hpp:513</div></div>
<div class="ttc" id="aclasscereal_1_1detail_1_1OutputArchiveBase_html"><div class="ttname"><a href="classcereal_1_1detail_1_1OutputArchiveBase.html">cereal::detail::OutputArchiveBase</a></div><div class="ttdef"><b>Definition:</b> helpers.hpp:269</div></div>
<div class="ttc" id="astructcereal_1_1detail_1_1OutputBindingMap_1_1Serializers_html_a8602064aeec6a847f1fe81fe9461ea18"><div class="ttname"><a href="structcereal_1_1detail_1_1OutputBindingMap_1_1Serializers.html#a8602064aeec6a847f1fe81fe9461ea18">cereal::detail::OutputBindingMap::Serializers::shared_ptr</a></div><div class="ttdeci">Serializer shared_ptr</div><div class="ttdoc">Serializer function for shared/weak pointers.</div><div class="ttdef"><b>Definition:</b> polymorphic_impl.hpp:481</div></div>
<div class="ttc" id="astructcereal_1_1detail_1_1PolymorphicVirtualCaster_html_a7233787834faaab0ddec22437471aa96"><div class="ttname"><a href="structcereal_1_1detail_1_1PolymorphicVirtualCaster.html#a7233787834faaab0ddec22437471aa96">cereal::detail::PolymorphicVirtualCaster::upcast</a></div><div class="ttdeci">std::shared_ptr&lt; void &gt; upcast(std::shared_ptr&lt; void &gt; const &amp;ptr) const override</div><div class="ttdoc">Performs the proper upcast with the templated types (shared_ptr version)</div><div class="ttdef"><b>Definition:</b> polymorphic_impl.hpp:424</div></div>
<div class="ttc" id="astructcereal_1_1detail_1_1PolymorphicCaster_html_a7c3d1b95aae77fe87104dffb28073bcf"><div class="ttname"><a href="structcereal_1_1detail_1_1PolymorphicCaster.html#a7c3d1b95aae77fe87104dffb28073bcf">cereal::detail::PolymorphicCaster::downcast</a></div><div class="ttdeci">virtual const void * downcast(void const *const ptr) const =0</div><div class="ttdoc">Downcasts to the proper derived type.</div></div>
<div class="ttc" id="astructcereal_1_1detail_1_1init__binding_html"><div class="ttname"><a href="structcereal_1_1detail_1_1init__binding.html">cereal::detail::init_binding</a></div><div class="ttdoc">Used to hide the static object used to bind T to registered archives.</div><div class="ttdef"><b>Definition:</b> polymorphic_impl.hpp:806</div></div>
<div class="ttc" id="astructcereal_1_1detail_1_1InputBindingCreator_html"><div class="ttname"><a href="structcereal_1_1detail_1_1InputBindingCreator.html">cereal::detail::InputBindingCreator</a></div><div class="ttdoc">Creates a binding (map entry) between an input archive type and a polymorphic type.</div><div class="ttdef"><b>Definition:</b> polymorphic_impl.hpp:530</div></div>
<div class="ttc" id="astructcereal_1_1detail_1_1PolymorphicCasters_html_ab1ab88bd3370d3327d5035d233b48292"><div class="ttname"><a href="structcereal_1_1detail_1_1PolymorphicCasters.html#ab1ab88bd3370d3327d5035d233b48292">cereal::detail::PolymorphicCasters::lookup_if_exists</a></div><div class="ttdeci">static std::pair&lt; bool, std::vector&lt; PolymorphicCaster const * &gt; const &amp; &gt; lookup_if_exists(std::type_index const &amp;baseIndex, std::type_index const &amp;derivedIndex)</div><div class="ttdoc">Checks if the mapping object that can perform the upcast or downcast exists, and returns it if so.</div><div class="ttdef"><b>Definition:</b> polymorphic_impl.hpp:160</div></div>
<div class="ttc" id="amemory_8hpp_html"><div class="ttname"><a href="memory_8hpp.html">memory.hpp</a></div><div class="ttdoc">Support for types found in &lt;memory&gt;</div></div>
<div class="ttc" id="astructcereal_1_1detail_1_1OutputBindingMap_1_1Serializers_html_ab4c2f8544bdbe179ef4664de9589f825"><div class="ttname"><a href="structcereal_1_1detail_1_1OutputBindingMap_1_1Serializers.html#ab4c2f8544bdbe179ef4664de9589f825">cereal::detail::OutputBindingMap::Serializers::unique_ptr</a></div><div class="ttdeci">Serializer unique_ptr</div><div class="ttdoc">Serializer function for unique pointers.</div><div class="ttdef"><b>Definition:</b> polymorphic_impl.hpp:482</div></div>
<div class="ttc" id="astructcereal_1_1detail_1_1polymorphic__serialization__support_html"><div class="ttname"><a href="structcereal_1_1detail_1_1polymorphic__serialization__support.html">cereal::detail::polymorphic_serialization_support</a></div><div class="ttdef"><b>Definition:</b> helpers.hpp:294</div></div>
<div class="ttc" id="astructcereal_1_1detail_1_1PolymorphicCasters_html"><div class="ttname"><a href="structcereal_1_1detail_1_1PolymorphicCasters.html">cereal::detail::PolymorphicCasters</a></div><div class="ttdoc">Holds registered mappings between base and derived types for casting.</div><div class="ttdef"><b>Definition:</b> polymorphic_impl.hpp:139</div></div>
<div class="ttc" id="astructcereal_1_1detail_1_1instantiate__function_html"><div class="ttname"><a href="structcereal_1_1detail_1_1instantiate__function.html">cereal::detail::instantiate_function</a></div><div class="ttdoc">When specialized, causes the compiler to instantiate its parameter.</div><div class="ttdef"><b>Definition:</b> polymorphic_impl.hpp:738</div></div>
<div class="ttc" id="astructcereal_1_1detail_1_1OutputBindingMap_html_ab62be8e24369a6350592d3bd12abfecc"><div class="ttname"><a href="structcereal_1_1detail_1_1OutputBindingMap.html#ab62be8e24369a6350592d3bd12abfecc">cereal::detail::OutputBindingMap::map</a></div><div class="ttdeci">std::map&lt; std::type_index, Serializers &gt; map</div><div class="ttdoc">A map of serializers for pointers of all registered types.</div><div class="ttdef"><b>Definition:</b> polymorphic_impl.hpp:486</div></div>
<div class="ttc" id="astring_8hpp_html"><div class="ttname"><a href="string_8hpp.html">string.hpp</a></div><div class="ttdoc">Support for types found in &lt;string&gt;</div></div>
<div class="ttc" id="astructcereal_1_1detail_1_1PolymorphicCaster_html"><div class="ttname"><a href="structcereal_1_1detail_1_1PolymorphicCaster.html">cereal::detail::PolymorphicCaster</a></div><div class="ttdoc">Base type for polymorphic void casting.</div><div class="ttdef"><b>Definition:</b> polymorphic_impl.hpp:119</div></div>
<div class="ttc" id="astatic__object_8hpp_html_afde52a096f363ebe6869a9c0f9ef4cbb"><div class="ttname"><a href="static__object_8hpp.html#afde52a096f363ebe6869a9c0f9ef4cbb">CEREAL_DLL_EXPORT</a></div><div class="ttdeci">#define CEREAL_DLL_EXPORT</div><div class="ttdoc">Prevent link optimization from removing non-referenced static objects.</div><div class="ttdef"><b>Definition:</b> static_object.hpp:51</div></div>
<div class="ttc" id="aclasscereal_1_1detail_1_1StaticObject_html"><div class="ttname"><a href="classcereal_1_1detail_1_1StaticObject.html">cereal::detail::StaticObject</a></div><div class="ttdoc">A static, pre-execution object.</div><div class="ttdef"><b>Definition:</b> static_object.hpp:67</div></div>
<div class="ttc" id="astructcereal_1_1detail_1_1PolymorphicCasters_html_a5e0a5c9c5f4e858b1c12edc72e527735"><div class="ttname"><a href="structcereal_1_1detail_1_1PolymorphicCasters.html#a5e0a5c9c5f4e858b1c12edc72e527735">cereal::detail::PolymorphicCasters::lookup</a></div><div class="ttdeci">static const std::vector&lt; PolymorphicCaster const * &gt; &amp; lookup(std::type_index const &amp;baseIndex, std::type_index const &amp;derivedIndex, F &amp;&amp;exceptionFunc)</div><div class="ttdoc">Gets the mapping object that can perform the upcast or downcast.</div><div class="ttdef"><b>Definition:</b> polymorphic_impl.hpp:183</div></div>
<div class="ttc" id="astructcereal_1_1detail_1_1PolymorphicVirtualCaster_html"><div class="ttname"><a href="structcereal_1_1detail_1_1PolymorphicVirtualCaster.html">cereal::detail::PolymorphicVirtualCaster</a></div><div class="ttdoc">Strongly typed derivation of PolymorphicCaster.</div><div class="ttdef"><b>Definition:</b> polymorphic_impl.hpp:253</div></div>
<div class="ttc" id="aclasscereal_1_1detail_1_1StaticObject_html_aec75ae3fd5f5ad79132a368f984b385f"><div class="ttname"><a href="classcereal_1_1detail_1_1StaticObject.html#aec75ae3fd5f5ad79132a368f984b385f">cereal::detail::StaticObject::lock</a></div><div class="ttdeci">static LockGuard lock()</div><div class="ttdoc">Attempts to lock this static object for the current scope.</div><div class="ttdef"><b>Definition:</b> static_object.hpp:110</div></div>
<div class="ttc" id="astructcereal_1_1detail_1_1InputBindingCreator_html_a0844036ce968019290e32f9ab183e9e1"><div class="ttname"><a href="structcereal_1_1detail_1_1InputBindingCreator.html#a0844036ce968019290e32f9ab183e9e1">cereal::detail::InputBindingCreator::InputBindingCreator</a></div><div class="ttdeci">InputBindingCreator()</div><div class="ttdoc">Initialize the binding.</div><div class="ttdef"><b>Definition:</b> polymorphic_impl.hpp:533</div></div>
<div class="ttc" id="aclasscereal_1_1detail_1_1OutputBindingCreator_1_1PolymorphicSharedPointerWrapper_html"><div class="ttname"><a href="classcereal_1_1detail_1_1OutputBindingCreator_1_1PolymorphicSharedPointerWrapper.html">cereal::detail::OutputBindingCreator::PolymorphicSharedPointerWrapper</a></div><div class="ttdoc">Holds a properly typed shared_ptr to the polymorphic type.</div><div class="ttdef"><b>Definition:</b> polymorphic_impl.hpp:597</div></div>
<div class="ttc" id="apolymorphic__impl_8hpp_html_aebe09f7b847560c8d63b9224008001df"><div class="ttname"><a href="polymorphic__impl_8hpp.html#aebe09f7b847560c8d63b9224008001df">UNREGISTERED_POLYMORPHIC_CAST_EXCEPTION</a></div><div class="ttdeci">#define UNREGISTERED_POLYMORPHIC_CAST_EXCEPTION(LoadSave)</div><div class="ttdoc">Error message used for unregistered polymorphic casts.</div><div class="ttdef"><b>Definition:</b> polymorphic_impl.hpp:149</div></div>
<div class="ttc" id="astructcereal_1_1detail_1_1PolymorphicCasters_html_aac0ca1d11af2db4cb6aedcbc976c3d9e"><div class="ttname"><a href="structcereal_1_1detail_1_1PolymorphicCasters.html#aac0ca1d11af2db4cb6aedcbc976c3d9e">cereal::detail::PolymorphicCasters::upcast</a></div><div class="ttdeci">static std::shared_ptr&lt; void &gt; upcast(std::shared_ptr&lt; Derived &gt; const &amp;dptr, std::type_info const &amp;baseInfo)</div><div class="ttdoc">Upcasts for shared pointers.</div><div class="ttdef"><b>Definition:</b> polymorphic_impl.hpp:229</div></div>
<div class="ttc" id="astructcereal_1_1detail_1_1adl__tag_html"><div class="ttname"><a href="structcereal_1_1detail_1_1adl__tag.html">cereal::detail::adl_tag</a></div><div class="ttdef"><b>Definition:</b> polymorphic_impl.hpp:696</div></div>
<div class="ttc" id="astructcereal_1_1detail_1_1OutputBindingMap_1_1Serializers_html"><div class="ttname"><a href="structcereal_1_1detail_1_1OutputBindingMap_1_1Serializers.html">cereal::detail::OutputBindingMap::Serializers</a></div><div class="ttdoc">Struct containing the serializer functions for all pointer types.</div><div class="ttdef"><b>Definition:</b> polymorphic_impl.hpp:479</div></div>
<div class="ttc" id="astructcereal_1_1traits_1_1is__output__serializable_html"><div class="ttname"><a href="structcereal_1_1traits_1_1is__output__serializable.html">cereal::traits::is_output_serializable</a></div><div class="ttdef"><b>Definition:</b> traits.hpp:1111</div></div>
<div class="ttc" id="astructcereal_1_1detail_1_1InputBindingMap_1_1Serializers_html_a94620847674f5398454cbdb9660b8532"><div class="ttname"><a href="structcereal_1_1detail_1_1InputBindingMap_1_1Serializers.html#a94620847674f5398454cbdb9660b8532">cereal::detail::InputBindingMap::Serializers::unique_ptr</a></div><div class="ttdeci">UniqueSerializer unique_ptr</div><div class="ttdoc">Serializer function for unique pointers.</div><div class="ttdef"><b>Definition:</b> polymorphic_impl.hpp:514</div></div>
<div class="ttc" id="astructcereal_1_1detail_1_1OutputBindingMap_html"><div class="ttname"><a href="structcereal_1_1detail_1_1OutputBindingMap.html">cereal::detail::OutputBindingMap</a></div><div class="ttdoc">A structure holding a map from type_indices to output serializer functions.</div><div class="ttdef"><b>Definition:</b> polymorphic_impl.hpp:468</div></div>
<div class="ttc" id="astructcereal_1_1detail_1_1PolymorphicCasters_html_ad4983e7aae8a92d717162fc0e1f1dd49"><div class="ttname"><a href="structcereal_1_1detail_1_1PolymorphicCasters.html#ad4983e7aae8a92d717162fc0e1f1dd49">cereal::detail::PolymorphicCasters::downcast</a></div><div class="ttdeci">static const Derived * downcast(const void *dptr, std::type_info const &amp;baseInfo)</div><div class="ttdoc">Performs a downcast to the derived type using a registered mapping.</div><div class="ttdef"><b>Definition:</b> polymorphic_impl.hpp:202</div></div>
<div class="ttc" id="astructcereal_1_1detail_1_1binding__name_html"><div class="ttname"><a href="structcereal_1_1detail_1_1binding__name.html">cereal::detail::binding_name</a></div><div class="ttdoc">Binds a compile time type with a user defined string.</div><div class="ttdef"><b>Definition:</b> polymorphic_impl.hpp:460</div></div>
<div class="ttc" id="aclasscereal_1_1memory__detail_1_1EnableSharedStateHelper_html"><div class="ttname"><a href="classcereal_1_1memory__detail_1_1EnableSharedStateHelper.html">cereal::memory_detail::EnableSharedStateHelper</a></div><div class="ttdef"><b>Definition:</b> memory.hpp:132</div></div>
<div class="ttc" id="astructcereal_1_1detail_1_1PolymorphicCaster_html_a7310f43706216cbae275fd1f2a579470"><div class="ttname"><a href="structcereal_1_1detail_1_1PolymorphicCaster.html#a7310f43706216cbae275fd1f2a579470">cereal::detail::PolymorphicCaster::upcast</a></div><div class="ttdeci">virtual void * upcast(void *const ptr) const =0</div><div class="ttdoc">Upcast to proper base type.</div></div>
<div class="ttc" id="astructcereal_1_1detail_1_1PolymorphicCasters_html_a9d79b7d0b85c988ef102c07509094cf7"><div class="ttname"><a href="structcereal_1_1detail_1_1PolymorphicCasters.html#a9d79b7d0b85c988ef102c07509094cf7">cereal::detail::PolymorphicCasters::DerivedCasterMap</a></div><div class="ttdeci">std::unordered_map&lt; std::type_index, std::vector&lt; PolymorphicCaster const * &gt; &gt; DerivedCasterMap</div><div class="ttdoc">Maps from a derived type index to a set of chainable casters.</div><div class="ttdef"><b>Definition:</b> polymorphic_impl.hpp:142</div></div>
<div class="ttc" id="astructcereal_1_1detail_1_1PolymorphicCasters_html_a82ba78ff9ce36c6c1062b2db62bd1e1d"><div class="ttname"><a href="structcereal_1_1detail_1_1PolymorphicCasters.html#a82ba78ff9ce36c6c1062b2db62bd1e1d">cereal::detail::PolymorphicCasters::upcast</a></div><div class="ttdeci">static void * upcast(Derived *const dptr, std::type_info const &amp;baseInfo)</div><div class="ttdoc">Performs an upcast to the registered base type using the given a derived type.</div><div class="ttdef"><b>Definition:</b> polymorphic_impl.hpp:216</div></div>
<div class="ttc" id="aclasscereal_1_1detail_1_1OutputBindingCreator_1_1PolymorphicSharedPointerWrapper_html_a5829b5ea0be50c066261fcf36b4fb6fd"><div class="ttname"><a href="classcereal_1_1detail_1_1OutputBindingCreator_1_1PolymorphicSharedPointerWrapper.html#a5829b5ea0be50c066261fcf36b4fb6fd">cereal::detail::OutputBindingCreator::PolymorphicSharedPointerWrapper::PolymorphicSharedPointerWrapper</a></div><div class="ttdeci">PolymorphicSharedPointerWrapper(T const *dptr)</div><div class="ttdef"><b>Definition:</b> polymorphic_impl.hpp:612</div></div>
<div class="ttc" id="astructcereal_1_1detail_1_1InputBindingMap_1_1Serializers_html"><div class="ttname"><a href="structcereal_1_1detail_1_1InputBindingMap_1_1Serializers.html">cereal::detail::InputBindingMap::Serializers</a></div><div class="ttdoc">Struct containing the serializer functions for all pointer types.</div><div class="ttdef"><b>Definition:</b> polymorphic_impl.hpp:511</div></div>
<div class="ttc" id="astructcereal_1_1detail_1_1bind__to__archives_html_a6c61fc1dddb581a47b331eda2b366083"><div class="ttname"><a href="structcereal_1_1detail_1_1bind__to__archives.html#a6c61fc1dddb581a47b331eda2b366083">cereal::detail::bind_to_archives::bind</a></div><div class="ttdeci">void bind(std::true_type) const</div><div class="ttdoc">Binding for abstract types.</div><div class="ttdef"><b>Definition:</b> polymorphic_impl.hpp:789</div></div>
<div class="ttc" id="astructcereal_1_1detail_1_1OutputBindingCreator_html_aa8421ea2f60481abd46f3fd59ab3680a"><div class="ttname"><a href="structcereal_1_1detail_1_1OutputBindingCreator.html#aa8421ea2f60481abd46f3fd59ab3680a">cereal::detail::OutputBindingCreator::writeMetadata</a></div><div class="ttdeci">static void writeMetadata(Archive &amp;ar)</div><div class="ttdoc">Writes appropriate metadata to the archive for this polymorphic type.</div><div class="ttdef"><b>Definition:</b> polymorphic_impl.hpp:579</div></div>
<div class="ttc" id="astructcereal_1_1detail_1_1OutputBindingCreator_html_ae7fd60f4fd68a90e0fa53141141ed467"><div class="ttname"><a href="structcereal_1_1detail_1_1OutputBindingCreator.html#ae7fd60f4fd68a90e0fa53141141ed467">cereal::detail::OutputBindingCreator::OutputBindingCreator</a></div><div class="ttdeci">OutputBindingCreator()</div><div class="ttdoc">Initialize the binding.</div><div class="ttdef"><b>Definition:</b> polymorphic_impl.hpp:653</div></div>
<div class="ttc" id="astructcereal_1_1detail_1_1OutputBindingCreator_html_a75f9c27414802737b3a040edf9ab9555"><div class="ttname"><a href="structcereal_1_1detail_1_1OutputBindingCreator.html#a75f9c27414802737b3a040edf9ab9555">cereal::detail::OutputBindingCreator::savePolymorphicSharedPtr</a></div><div class="ttdeci">static void savePolymorphicSharedPtr(Archive &amp;ar, T const *dptr, std::true_type)</div><div class="ttdoc">Does the actual work of saving a polymorphic shared_ptr.</div><div class="ttdef"><b>Definition:</b> polymorphic_impl.hpp:631</div></div>
<div class="ttc" id="astructcereal_1_1traits_1_1has__shared__from__this_html"><div class="ttname"><a href="structcereal_1_1traits_1_1has__shared__from__this.html">cereal::traits::has_shared_from_this</a></div><div class="ttdoc">Determine if T or any base class of T has inherited from std::enable_shared_from_this.</div><div class="ttdef"><b>Definition:</b> traits.hpp:1216</div></div>
<div class="ttc" id="amacros_8hpp_html_a6c37b2307b83bbe2a3de58d78a2b8c0b"><div class="ttname"><a href="macros_8hpp.html#a6c37b2307b83bbe2a3de58d78a2b8c0b">CEREAL_NOEXCEPT</a></div><div class="ttdeci">#define CEREAL_NOEXCEPT</div><div class="ttdoc">Defines the CEREAL_NOEXCEPT macro to use instead of noexcept.</div><div class="ttdef"><b>Definition:</b> macros.hpp:130</div></div>
<div class="ttc" id="astructcereal_1_1detail_1_1EmptyDeleter_html"><div class="ttname"><a href="structcereal_1_1detail_1_1EmptyDeleter.html">cereal::detail::EmptyDeleter</a></div><div class="ttdoc">An empty noop deleter.</div><div class="ttdef"><b>Definition:</b> polymorphic_impl.hpp:490</div></div>
<div class="ttc" id="astatic__object_8hpp_html"><div class="ttname"><a href="static__object_8hpp.html">static_object.hpp</a></div><div class="ttdoc">Internal polymorphism static object support.</div></div>
<div class="ttc" id="astructcereal_1_1detail_1_1OutputBindingCreator_html_a9ece659f4e7b869b6a8295e8be3847ab"><div class="ttname"><a href="structcereal_1_1detail_1_1OutputBindingCreator.html#a9ece659f4e7b869b6a8295e8be3847ab">cereal::detail::OutputBindingCreator::savePolymorphicSharedPtr</a></div><div class="ttdeci">static void savePolymorphicSharedPtr(Archive &amp;ar, T const *dptr, std::false_type)</div><div class="ttdoc">Does the actual work of saving a polymorphic shared_ptr.</div><div class="ttdef"><b>Definition:</b> polymorphic_impl.hpp:646</div></div>
<div class="ttc" id="astructcereal_1_1detail_1_1bind__to__archives_html_a195579d563d83eee353e74ab332455c0"><div class="ttname"><a href="structcereal_1_1detail_1_1bind__to__archives.html#a195579d563d83eee353e74ab332455c0">cereal::detail::bind_to_archives::bind</a></div><div class="ttdeci">const bind_to_archives &amp; bind() const</div><div class="ttdoc">Binds the type T to all registered archives.</div><div class="ttdef"><b>Definition:</b> polymorphic_impl.hpp:795</div></div>
<div class="ttc" id="astructcereal_1_1detail_1_1create__bindings_html"><div class="ttname"><a href="structcereal_1_1detail_1_1create__bindings.html">cereal::detail::create_bindings</a></div><div class="ttdoc">Causes the static object bindings between an archive type and a serializable type T.</div><div class="ttdef"><b>Definition:</b> polymorphic_impl.hpp:718</div></div>
<div class="ttc" id="apolymorphic__impl__fwd_8hpp_html"><div class="ttname"><a href="polymorphic__impl__fwd_8hpp.html">polymorphic_impl_fwd.hpp</a></div><div class="ttdoc">Internal polymorphism support forward declarations.</div></div>
<div class="ttc" id="astructcereal_1_1detail_1_1RegisterPolymorphicCaster_html"><div class="ttname"><a href="structcereal_1_1detail_1_1RegisterPolymorphicCaster.html">cereal::detail::RegisterPolymorphicCaster</a></div><div class="ttdoc">Registers a polymorphic casting relation between a Base and Derived type.</div><div class="ttdef"><b>Definition:</b> polymorphic_impl.hpp:438</div></div>
<div class="ttc" id="astructcereal_1_1detail_1_1OutputBindingCreator_html"><div class="ttname"><a href="structcereal_1_1detail_1_1OutputBindingCreator.html">cereal::detail::OutputBindingCreator</a></div><div class="ttdoc">Creates a binding (map entry) between an output archive type and a polymorphic type.</div><div class="ttdef"><b>Definition:</b> polymorphic_impl.hpp:576</div></div>
<div class="ttc" id="astructcereal_1_1detail_1_1InputBindingMap_html"><div class="ttname"><a href="structcereal_1_1detail_1_1InputBindingMap.html">cereal::detail::InputBindingMap</a></div><div class="ttdoc">A structure holding a map from type name strings to input serializer functions.</div><div class="ttdef"><b>Definition:</b> polymorphic_impl.hpp:498</div></div>
<div class="ttc" id="astructcereal_1_1detail_1_1InputBindingMap_html_a92bc21af466e376f1fd9a97e4571dc43"><div class="ttname"><a href="structcereal_1_1detail_1_1InputBindingMap.html#a92bc21af466e376f1fd9a97e4571dc43">cereal::detail::InputBindingMap::map</a></div><div class="ttdeci">std::map&lt; std::string, Serializers &gt; map</div><div class="ttdoc">A map of serializers for pointers of all registered types.</div><div class="ttdef"><b>Definition:</b> polymorphic_impl.hpp:518</div></div>
<div class="ttc" id="astructcereal_1_1detail_1_1PolymorphicCasters_html_ab73d51a06e51c40527b5356befe2d6cf"><div class="ttname"><a href="structcereal_1_1detail_1_1PolymorphicCasters.html#ab73d51a06e51c40527b5356befe2d6cf">cereal::detail::PolymorphicCasters::map</a></div><div class="ttdeci">std::unordered_map&lt; std::type_index, DerivedCasterMap &gt; map</div><div class="ttdoc">Maps from base type index to a map from derived type index to caster.</div><div class="ttdef"><b>Definition:</b> polymorphic_impl.hpp:144</div></div>
<div class="ttc" id="astructcereal_1_1detail_1_1RegisterPolymorphicCaster_html_a14f9cd6827498e31efbd8c94dc786e44"><div class="ttname"><a href="structcereal_1_1detail_1_1RegisterPolymorphicCaster.html#a14f9cd6827498e31efbd8c94dc786e44">cereal::detail::RegisterPolymorphicCaster::bind</a></div><div class="ttdeci">static const PolymorphicCaster * bind()</div><div class="ttdoc">Performs registration (binding) between Base and Derived.</div><div class="ttdef"><b>Definition:</b> polymorphic_impl.hpp:450</div></div>
<div class="ttc" id="aclasscereal_1_1detail_1_1InputArchiveBase_html"><div class="ttname"><a href="classcereal_1_1detail_1_1InputArchiveBase.html">cereal::detail::InputArchiveBase</a></div><div class="ttdef"><b>Definition:</b> helpers.hpp:281</div></div>
<div class="ttc" id="astructcereal_1_1detail_1_1PolymorphicVirtualCaster_html_ad16c1ab78ccdcf8826ce707adc3fa969"><div class="ttname"><a href="structcereal_1_1detail_1_1PolymorphicVirtualCaster.html#ad16c1ab78ccdcf8826ce707adc3fa969">cereal::detail::PolymorphicVirtualCaster::upcast</a></div><div class="ttdeci">void * upcast(void *const ptr) const override</div><div class="ttdoc">Performs the proper upcast with the templated types.</div><div class="ttdef"><b>Definition:</b> polymorphic_impl.hpp:418</div></div>
<div class="ttc" id="astructcereal_1_1detail_1_1bind__to__archives_html_a691a82f3c9926493923725dd468779c1"><div class="ttname"><a href="structcereal_1_1detail_1_1bind__to__archives.html#a691a82f3c9926493923725dd468779c1">cereal::detail::bind_to_archives::bind</a></div><div class="ttdeci">void bind(std::false_type) const</div><div class="ttdoc">Binding for non abstract types.</div><div class="ttdef"><b>Definition:</b> polymorphic_impl.hpp:783</div></div>
<div class="ttc" id="astructcereal_1_1detail_1_1PolymorphicVirtualCaster_html_a77434b14bd95cf53dc4218140682e399"><div class="ttname"><a href="structcereal_1_1detail_1_1PolymorphicVirtualCaster.html#a77434b14bd95cf53dc4218140682e399">cereal::detail::PolymorphicVirtualCaster::downcast</a></div><div class="ttdeci">const void * downcast(void const *const ptr) const override</div><div class="ttdoc">Performs the proper downcast with the templated types.</div><div class="ttdef"><b>Definition:</b> polymorphic_impl.hpp:412</div></div>
<div class="ttc" id="astructcereal_1_1traits_1_1is__input__serializable_html"><div class="ttname"><a href="structcereal_1_1traits_1_1is__input__serializable.html">cereal::traits::is_input_serializable</a></div><div class="ttdef"><b>Definition:</b> traits.hpp:1138</div></div>
<div class="ttc" id="astructcereal_1_1detail_1_1bind__to__archives_html"><div class="ttname"><a href="structcereal_1_1detail_1_1bind__to__archives.html">cereal::detail::bind_to_archives</a></div><div class="ttdoc">Begins the binding process of a type to all registered archives.</div><div class="ttdef"><b>Definition:</b> polymorphic_impl.hpp:780</div></div>
<div class="ttc" id="astructcereal_1_1detail_1_1PolymorphicVirtualCaster_html_a8bef2d14f5bb2d295263d41659c4f1f0"><div class="ttname"><a href="structcereal_1_1detail_1_1PolymorphicVirtualCaster.html#a8bef2d14f5bb2d295263d41659c4f1f0">cereal::detail::PolymorphicVirtualCaster::PolymorphicVirtualCaster</a></div><div class="ttdeci">PolymorphicVirtualCaster()</div><div class="ttdoc">Inserts an entry in the polymorphic casting map for this pairing.</div><div class="ttdef"><b>Definition:</b> polymorphic_impl.hpp:259</div></div>
<div class="ttc" id="astructcereal_1_1detail_1_1InputBindingMap_html_a429d50a04386c8de48e99723564bfbeb"><div class="ttname"><a href="structcereal_1_1detail_1_1InputBindingMap.html#a429d50a04386c8de48e99723564bfbeb">cereal::detail::InputBindingMap::UniqueSerializer</a></div><div class="ttdeci">std::function&lt; void(void *, std::unique_ptr&lt; void, EmptyDeleter&lt; void &gt;&gt; &amp;, std::type_info const &amp;)&gt; UniqueSerializer</div><div class="ttdoc">Unique ptr serializer function.</div><div class="ttdef"><b>Definition:</b> polymorphic_impl.hpp:508</div></div>
<div class="ttc" id="astructcereal_1_1detail_1_1OutputBindingMap_html_a8494ac316e305ffcaae1636b092cb916"><div class="ttname"><a href="structcereal_1_1detail_1_1OutputBindingMap.html#a8494ac316e305ffcaae1636b092cb916">cereal::detail::OutputBindingMap::Serializer</a></div><div class="ttdeci">std::function&lt; void(void *, void const *, std::type_info const &amp;)&gt; Serializer</div><div class="ttdoc">A serializer function.</div><div class="ttdef"><b>Definition:</b> polymorphic_impl.hpp:476</div></div>
<!-- HTML footer for doxygen 1.8.3.1-->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated on Sun Feb 27 2022 19:46:46 for cereal by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.17
</small></address>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-42360142-1', 'uscilab.github.io');
ga('send', 'pageview');
</script>
</body>
</html>