Welcome to mirror list, hosted at ThFree Co, Russian Federation.

schema_8h_source.html « zh-cn - github.com/miloyip/rapidjson.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 03f8151b83b7e86cd98e961cca1c055cccd99b98 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
<!-- HTML header for doxygen 1.8.7-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://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.13"/>
<title>RapidJSON: include/rapidjson/schema.h 源文件</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="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript">
  $(document).ready(initResizable);
</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>
<script type="text/javascript">
  $(document).ready(function() { init_search(); });
</script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="doxygenextra.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="topbanner"><a href="https://github.com/Tencent/rapidjson" title="RapidJSON GitHub"><i class="githublogo"></i></a></div>
        <div id="MSearchBox" class="MSearchBoxInactive">
        <span class="left">
          <img id="MSearchSelect" src="search/mag_sel.png"
               onmouseover="return searchBox.OnSearchSelectShow()"
               onmouseout="return searchBox.OnSearchSelectHide()"
               alt=""/>
          <input type="text" id="MSearchField" value="搜索" accesskey="S"
               onfocus="searchBox.OnSearchFieldFocus(true)" 
               onblur="searchBox.OnSearchFieldFocus(false)" 
               onkeyup="searchBox.OnSearchFieldChange(event)"/>
          </span><span class="right">
            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
          </span>
        </div>
<!-- end header part -->
<!-- 制作者 Doxygen 1.8.13 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'搜索');
</script>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
  <div id="nav-tree">
    <div id="nav-tree-contents">
      <div id="nav-sync" class="sync"></div>
    </div>
  </div>
  <div id="splitbar" style="-moz-user-select:none;" 
       class="ui-resizable-handle">
  </div>
</div>
<script type="text/javascript">
$(document).ready(function(){initNavTree('schema_8h_source.html','');});
</script>
<div id="doc-content">
<!-- 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 class="header">
  <div class="headertitle">
<div class="title">schema.h</div>  </div>
</div><!--header-->
<div class="contents">
<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno">    1</span>&#160;<span class="comment">// Tencent is pleased to support the open source community by making RapidJSON available-&gt;</span></div><div class="line"><a name="l00002"></a><span class="lineno">    2</span>&#160;<span class="comment">// </span></div><div class="line"><a name="l00003"></a><span class="lineno">    3</span>&#160;<span class="comment">// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip-&gt; All rights reserved-&gt;</span></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">// Licensed under the MIT License (the &quot;License&quot;); you may not use this file except</span></div><div class="line"><a name="l00006"></a><span class="lineno">    6</span>&#160;<span class="comment">// in compliance with the License-&gt; You may obtain a copy of the License at</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">// http://opensource-&gt;org/licenses/MIT</span></div><div class="line"><a name="l00009"></a><span class="lineno">    9</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00010"></a><span class="lineno">   10</span>&#160;<span class="comment">// Unless required by applicable law or agreed to in writing, software distributed </span></div><div class="line"><a name="l00011"></a><span class="lineno">   11</span>&#160;<span class="comment">// under the License is distributed on an &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR </span></div><div class="line"><a name="l00012"></a><span class="lineno">   12</span>&#160;<span class="comment">// CONDITIONS OF ANY KIND, either express or implied-&gt; See the License for the </span></div><div class="line"><a name="l00013"></a><span class="lineno">   13</span>&#160;<span class="comment">// specific language governing permissions and limitations under the License-&gt;</span></div><div class="line"><a name="l00014"></a><span class="lineno">   14</span>&#160;</div><div class="line"><a name="l00015"></a><span class="lineno">   15</span>&#160;<span class="preprocessor">#ifndef RAPIDJSON_SCHEMA_H_</span></div><div class="line"><a name="l00016"></a><span class="lineno">   16</span>&#160;<span class="preprocessor">#define RAPIDJSON_SCHEMA_H_</span></div><div class="line"><a name="l00017"></a><span class="lineno">   17</span>&#160;</div><div class="line"><a name="l00018"></a><span class="lineno">   18</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="document_8h.html">document.h</a>&quot;</span></div><div class="line"><a name="l00019"></a><span class="lineno">   19</span>&#160;<span class="preprocessor">#include &quot;pointer.h&quot;</span></div><div class="line"><a name="l00020"></a><span class="lineno">   20</span>&#160;<span class="preprocessor">#include &quot;stringbuffer.h&quot;</span></div><div class="line"><a name="l00021"></a><span class="lineno">   21</span>&#160;<span class="preprocessor">#include &lt;cmath&gt;</span> <span class="comment">// abs, floor</span></div><div class="line"><a name="l00022"></a><span class="lineno">   22</span>&#160;</div><div class="line"><a name="l00023"></a><span class="lineno">   23</span>&#160;<span class="preprocessor">#if !defined(RAPIDJSON_SCHEMA_USE_INTERNALREGEX)</span></div><div class="line"><a name="l00024"></a><span class="lineno">   24</span>&#160;<span class="preprocessor">#define RAPIDJSON_SCHEMA_USE_INTERNALREGEX 1</span></div><div class="line"><a name="l00025"></a><span class="lineno">   25</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l00026"></a><span class="lineno">   26</span>&#160;<span class="preprocessor">#define RAPIDJSON_SCHEMA_USE_INTERNALREGEX 0</span></div><div class="line"><a name="l00027"></a><span class="lineno">   27</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00028"></a><span class="lineno">   28</span>&#160;</div><div class="line"><a name="l00029"></a><span class="lineno">   29</span>&#160;<span class="preprocessor">#if !RAPIDJSON_SCHEMA_USE_INTERNALREGEX &amp;&amp; defined(RAPIDJSON_SCHEMA_USE_STDREGEX) &amp;&amp; (__cplusplus &gt;=201103L || (defined(_MSC_VER) &amp;&amp; _MSC_VER &gt;= 1800))</span></div><div class="line"><a name="l00030"></a><span class="lineno">   30</span>&#160;<span class="preprocessor">#define RAPIDJSON_SCHEMA_USE_STDREGEX 1</span></div><div class="line"><a name="l00031"></a><span class="lineno">   31</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l00032"></a><span class="lineno">   32</span>&#160;<span class="preprocessor">#define RAPIDJSON_SCHEMA_USE_STDREGEX 0</span></div><div class="line"><a name="l00033"></a><span class="lineno">   33</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00034"></a><span class="lineno">   34</span>&#160;</div><div class="line"><a name="l00035"></a><span class="lineno">   35</span>&#160;<span class="preprocessor">#if RAPIDJSON_SCHEMA_USE_INTERNALREGEX</span></div><div class="line"><a name="l00036"></a><span class="lineno">   36</span>&#160;<span class="preprocessor">#include &quot;internal/regex.h&quot;</span></div><div class="line"><a name="l00037"></a><span class="lineno">   37</span>&#160;<span class="preprocessor">#elif RAPIDJSON_SCHEMA_USE_STDREGEX</span></div><div class="line"><a name="l00038"></a><span class="lineno">   38</span>&#160;<span class="preprocessor">#include &lt;regex&gt;</span></div><div class="line"><a name="l00039"></a><span class="lineno">   39</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00040"></a><span class="lineno">   40</span>&#160;</div><div class="line"><a name="l00041"></a><span class="lineno">   41</span>&#160;<span class="preprocessor">#if RAPIDJSON_SCHEMA_USE_INTERNALREGEX || RAPIDJSON_SCHEMA_USE_STDREGEX</span></div><div class="line"><a name="l00042"></a><span class="lineno">   42</span>&#160;<span class="preprocessor">#define RAPIDJSON_SCHEMA_HAS_REGEX 1</span></div><div class="line"><a name="l00043"></a><span class="lineno">   43</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l00044"></a><span class="lineno">   44</span>&#160;<span class="preprocessor">#define RAPIDJSON_SCHEMA_HAS_REGEX 0</span></div><div class="line"><a name="l00045"></a><span class="lineno">   45</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00046"></a><span class="lineno">   46</span>&#160;</div><div class="line"><a name="l00047"></a><span class="lineno">   47</span>&#160;<span class="preprocessor">#ifndef RAPIDJSON_SCHEMA_VERBOSE</span></div><div class="line"><a name="l00048"></a><span class="lineno">   48</span>&#160;<span class="preprocessor">#define RAPIDJSON_SCHEMA_VERBOSE 0</span></div><div class="line"><a name="l00049"></a><span class="lineno">   49</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00050"></a><span class="lineno">   50</span>&#160;</div><div class="line"><a name="l00051"></a><span class="lineno">   51</span>&#160;<span class="preprocessor">#if RAPIDJSON_SCHEMA_VERBOSE</span></div><div class="line"><a name="l00052"></a><span class="lineno">   52</span>&#160;<span class="preprocessor">#include &quot;stringbuffer.h&quot;</span></div><div class="line"><a name="l00053"></a><span class="lineno">   53</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00054"></a><span class="lineno">   54</span>&#160;</div><div class="line"><a name="l00055"></a><span class="lineno">   55</span>&#160;RAPIDJSON_DIAG_PUSH</div><div class="line"><a name="l00056"></a><span class="lineno">   56</span>&#160;</div><div class="line"><a name="l00057"></a><span class="lineno">   57</span>&#160;<span class="preprocessor">#if defined(__GNUC__)</span></div><div class="line"><a name="l00058"></a><span class="lineno">   58</span>&#160;RAPIDJSON_DIAG_OFF(effc++)</div><div class="line"><a name="l00059"></a><span class="lineno">   59</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00060"></a><span class="lineno">   60</span>&#160;</div><div class="line"><a name="l00061"></a><span class="lineno">   61</span>&#160;<span class="preprocessor">#ifdef __clang__</span></div><div class="line"><a name="l00062"></a><span class="lineno">   62</span>&#160;RAPIDJSON_DIAG_OFF(weak-vtables)</div><div class="line"><a name="l00063"></a><span class="lineno">   63</span>&#160;RAPIDJSON_DIAG_OFF(exit-time-destructors)</div><div class="line"><a name="l00064"></a><span class="lineno">   64</span>&#160;RAPIDJSON_DIAG_OFF(c++98-compat-pedantic)</div><div class="line"><a name="l00065"></a><span class="lineno">   65</span>&#160;RAPIDJSON_DIAG_OFF(variadic-macros)</div><div class="line"><a name="l00066"></a><span class="lineno">   66</span>&#160;<span class="preprocessor">#elif defined(_MSC_VER)</span></div><div class="line"><a name="l00067"></a><span class="lineno">   67</span>&#160;RAPIDJSON_DIAG_OFF(4512) <span class="comment">// assignment operator could not be generated</span></div><div class="line"><a name="l00068"></a><span class="lineno">   68</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00069"></a><span class="lineno">   69</span>&#160;</div><div class="line"><a name="l00070"></a><span class="lineno">   70</span>&#160;RAPIDJSON_NAMESPACE_BEGIN</div><div class="line"><a name="l00071"></a><span class="lineno">   71</span>&#160;<span class="comment"></span></div><div class="line"><a name="l00072"></a><span class="lineno">   72</span>&#160;<span class="comment">///////////////////////////////////////////////////////////////////////////////</span></div><div class="line"><a name="l00073"></a><span class="lineno">   73</span>&#160;<span class="comment"></span><span class="comment">// Verbose Utilities</span></div><div class="line"><a name="l00074"></a><span class="lineno">   74</span>&#160;</div><div class="line"><a name="l00075"></a><span class="lineno">   75</span>&#160;<span class="preprocessor">#if RAPIDJSON_SCHEMA_VERBOSE</span></div><div class="line"><a name="l00076"></a><span class="lineno">   76</span>&#160;</div><div class="line"><a name="l00077"></a><span class="lineno">   77</span>&#160;<span class="keyword">namespace </span>internal {</div><div class="line"><a name="l00078"></a><span class="lineno">   78</span>&#160;</div><div class="line"><a name="l00079"></a><span class="lineno">   79</span>&#160;<span class="keyword">inline</span> <span class="keywordtype">void</span> PrintInvalidKeyword(<span class="keyword">const</span> <span class="keywordtype">char</span>* keyword) {</div><div class="line"><a name="l00080"></a><span class="lineno">   80</span>&#160;    printf(<span class="stringliteral">&quot;Fail keyword: %s\n&quot;</span>, keyword);</div><div class="line"><a name="l00081"></a><span class="lineno">   81</span>&#160;}</div><div class="line"><a name="l00082"></a><span class="lineno">   82</span>&#160;</div><div class="line"><a name="l00083"></a><span class="lineno">   83</span>&#160;<span class="keyword">inline</span> <span class="keywordtype">void</span> PrintInvalidKeyword(<span class="keyword">const</span> <span class="keywordtype">wchar_t</span>* keyword) {</div><div class="line"><a name="l00084"></a><span class="lineno">   84</span>&#160;    wprintf(L<span class="stringliteral">&quot;Fail keyword: %ls\n&quot;</span>, keyword);</div><div class="line"><a name="l00085"></a><span class="lineno">   85</span>&#160;}</div><div class="line"><a name="l00086"></a><span class="lineno">   86</span>&#160;</div><div class="line"><a name="l00087"></a><span class="lineno">   87</span>&#160;<span class="keyword">inline</span> <span class="keywordtype">void</span> PrintInvalidDocument(<span class="keyword">const</span> <span class="keywordtype">char</span>* document) {</div><div class="line"><a name="l00088"></a><span class="lineno">   88</span>&#160;    printf(<span class="stringliteral">&quot;Fail document: %s\n\n&quot;</span>, document);</div><div class="line"><a name="l00089"></a><span class="lineno">   89</span>&#160;}</div><div class="line"><a name="l00090"></a><span class="lineno">   90</span>&#160;</div><div class="line"><a name="l00091"></a><span class="lineno">   91</span>&#160;<span class="keyword">inline</span> <span class="keywordtype">void</span> PrintInvalidDocument(<span class="keyword">const</span> <span class="keywordtype">wchar_t</span>* document) {</div><div class="line"><a name="l00092"></a><span class="lineno">   92</span>&#160;    wprintf(L<span class="stringliteral">&quot;Fail document: %ls\n\n&quot;</span>, document);</div><div class="line"><a name="l00093"></a><span class="lineno">   93</span>&#160;}</div><div class="line"><a name="l00094"></a><span class="lineno">   94</span>&#160;</div><div class="line"><a name="l00095"></a><span class="lineno">   95</span>&#160;<span class="keyword">inline</span> <span class="keywordtype">void</span> PrintValidatorPointers(<span class="keywordtype">unsigned</span> depth, <span class="keyword">const</span> <span class="keywordtype">char</span>* s, <span class="keyword">const</span> <span class="keywordtype">char</span>* d) {</div><div class="line"><a name="l00096"></a><span class="lineno">   96</span>&#160;    printf(<span class="stringliteral">&quot;S: %*s%s\nD: %*s%s\n\n&quot;</span>, depth * 4, <span class="stringliteral">&quot; &quot;</span>, s, depth * 4, <span class="stringliteral">&quot; &quot;</span>, d);</div><div class="line"><a name="l00097"></a><span class="lineno">   97</span>&#160;}</div><div class="line"><a name="l00098"></a><span class="lineno">   98</span>&#160;</div><div class="line"><a name="l00099"></a><span class="lineno">   99</span>&#160;<span class="keyword">inline</span> <span class="keywordtype">void</span> PrintValidatorPointers(<span class="keywordtype">unsigned</span> depth, <span class="keyword">const</span> <span class="keywordtype">wchar_t</span>* s, <span class="keyword">const</span> <span class="keywordtype">wchar_t</span>* d) {</div><div class="line"><a name="l00100"></a><span class="lineno">  100</span>&#160;    wprintf(L<span class="stringliteral">&quot;S: %*ls%ls\nD: %*ls%ls\n\n&quot;</span>, depth * 4, L<span class="stringliteral">&quot; &quot;</span>, s, depth * 4, L<span class="stringliteral">&quot; &quot;</span>, d);</div><div class="line"><a name="l00101"></a><span class="lineno">  101</span>&#160;}</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">// namespace internal</span></div><div class="line"><a name="l00104"></a><span class="lineno">  104</span>&#160;</div><div class="line"><a name="l00105"></a><span class="lineno">  105</span>&#160;<span class="preprocessor">#endif // RAPIDJSON_SCHEMA_VERBOSE</span></div><div class="line"><a name="l00106"></a><span class="lineno">  106</span>&#160;<span class="comment"></span></div><div class="line"><a name="l00107"></a><span class="lineno">  107</span>&#160;<span class="comment">///////////////////////////////////////////////////////////////////////////////</span></div><div class="line"><a name="l00108"></a><span class="lineno">  108</span>&#160;<span class="comment"></span><span class="comment">// RAPIDJSON_INVALID_KEYWORD_RETURN</span></div><div class="line"><a name="l00109"></a><span class="lineno">  109</span>&#160;</div><div class="line"><a name="l00110"></a><span class="lineno">  110</span>&#160;<span class="preprocessor">#if RAPIDJSON_SCHEMA_VERBOSE</span></div><div class="line"><a name="l00111"></a><span class="lineno">  111</span>&#160;<span class="preprocessor">#define RAPIDJSON_INVALID_KEYWORD_VERBOSE(keyword) internal::PrintInvalidKeyword(keyword)</span></div><div class="line"><a name="l00112"></a><span class="lineno">  112</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l00113"></a><span class="lineno">  113</span>&#160;<span class="preprocessor">#define RAPIDJSON_INVALID_KEYWORD_VERBOSE(keyword)</span></div><div class="line"><a name="l00114"></a><span class="lineno">  114</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00115"></a><span class="lineno">  115</span>&#160;</div><div class="line"><a name="l00116"></a><span class="lineno">  116</span>&#160;<span class="preprocessor">#define RAPIDJSON_INVALID_KEYWORD_RETURN(keyword)\</span></div><div class="line"><a name="l00117"></a><span class="lineno">  117</span>&#160;<span class="preprocessor">RAPIDJSON_MULTILINEMACRO_BEGIN\</span></div><div class="line"><a name="l00118"></a><span class="lineno">  118</span>&#160;<span class="preprocessor">    context.invalidKeyword = keyword.GetString();\</span></div><div class="line"><a name="l00119"></a><span class="lineno">  119</span>&#160;<span class="preprocessor">    RAPIDJSON_INVALID_KEYWORD_VERBOSE(keyword.GetString());\</span></div><div class="line"><a name="l00120"></a><span class="lineno">  120</span>&#160;<span class="preprocessor">    return false;\</span></div><div class="line"><a name="l00121"></a><span class="lineno">  121</span>&#160;<span class="preprocessor">RAPIDJSON_MULTILINEMACRO_END</span></div><div class="line"><a name="l00122"></a><span class="lineno">  122</span>&#160;<span class="comment"></span></div><div class="line"><a name="l00123"></a><span class="lineno">  123</span>&#160;<span class="comment">///////////////////////////////////////////////////////////////////////////////</span></div><div class="line"><a name="l00124"></a><span class="lineno">  124</span>&#160;<span class="comment"></span><span class="comment">// Forward declarations</span></div><div class="line"><a name="l00125"></a><span class="lineno">  125</span>&#160;</div><div class="line"><a name="l00126"></a><span class="lineno">  126</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> ValueType, <span class="keyword">typename</span> Allocator&gt;</div><div class="line"><a name="l00127"></a><span class="lineno">  127</span>&#160;<span class="keyword">class </span>GenericSchemaDocument;</div><div class="line"><a name="l00128"></a><span class="lineno">  128</span>&#160;</div><div class="line"><a name="l00129"></a><span class="lineno">  129</span>&#160;<span class="keyword">namespace </span>internal {</div><div class="line"><a name="l00130"></a><span class="lineno">  130</span>&#160;</div><div class="line"><a name="l00131"></a><span class="lineno">  131</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> SchemaDocumentType&gt;</div><div class="line"><a name="l00132"></a><span class="lineno">  132</span>&#160;<span class="keyword">class </span>Schema;</div><div class="line"><a name="l00133"></a><span class="lineno">  133</span>&#160;<span class="comment"></span></div><div class="line"><a name="l00134"></a><span class="lineno">  134</span>&#160;<span class="comment">///////////////////////////////////////////////////////////////////////////////</span></div><div class="line"><a name="l00135"></a><span class="lineno">  135</span>&#160;<span class="comment"></span><span class="comment">// ISchemaValidator</span></div><div class="line"><a name="l00136"></a><span class="lineno">  136</span>&#160;</div><div class="line"><a name="l00137"></a><span class="lineno">  137</span>&#160;<span class="keyword">class </span>ISchemaValidator {</div><div class="line"><a name="l00138"></a><span class="lineno">  138</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l00139"></a><span class="lineno">  139</span>&#160;    <span class="keyword">virtual</span> ~ISchemaValidator() {}</div><div class="line"><a name="l00140"></a><span class="lineno">  140</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> IsValid() <span class="keyword">const</span> = 0;</div><div class="line"><a name="l00141"></a><span class="lineno">  141</span>&#160;};</div><div class="line"><a name="l00142"></a><span class="lineno">  142</span>&#160;<span class="comment"></span></div><div class="line"><a name="l00143"></a><span class="lineno">  143</span>&#160;<span class="comment">///////////////////////////////////////////////////////////////////////////////</span></div><div class="line"><a name="l00144"></a><span class="lineno">  144</span>&#160;<span class="comment"></span><span class="comment">// ISchemaStateFactory</span></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;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> SchemaType&gt;</div><div class="line"><a name="l00147"></a><span class="lineno">  147</span>&#160;<span class="keyword">class </span>ISchemaStateFactory {</div><div class="line"><a name="l00148"></a><span class="lineno">  148</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l00149"></a><span class="lineno">  149</span>&#160;    <span class="keyword">virtual</span> ~ISchemaStateFactory() {}</div><div class="line"><a name="l00150"></a><span class="lineno">  150</span>&#160;    <span class="keyword">virtual</span> ISchemaValidator* CreateSchemaValidator(<span class="keyword">const</span> SchemaType&amp;) = 0;</div><div class="line"><a name="l00151"></a><span class="lineno">  151</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> DestroySchemaValidator(ISchemaValidator* validator) = 0;</div><div class="line"><a name="l00152"></a><span class="lineno">  152</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span>* CreateHasher() = 0;</div><div class="line"><a name="l00153"></a><span class="lineno">  153</span>&#160;    <span class="keyword">virtual</span> uint64_t GetHashCode(<span class="keywordtype">void</span>* hasher) = 0;</div><div class="line"><a name="l00154"></a><span class="lineno">  154</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> DestroryHasher(<span class="keywordtype">void</span>* hasher) = 0;</div><div class="line"><a name="l00155"></a><span class="lineno">  155</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span>* MallocState(<span class="keywordtype">size_t</span> size) = 0;</div><div class="line"><a name="l00156"></a><span class="lineno">  156</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> FreeState(<span class="keywordtype">void</span>* p) = 0;</div><div class="line"><a name="l00157"></a><span class="lineno">  157</span>&#160;};</div><div class="line"><a name="l00158"></a><span class="lineno">  158</span>&#160;<span class="comment"></span></div><div class="line"><a name="l00159"></a><span class="lineno">  159</span>&#160;<span class="comment">///////////////////////////////////////////////////////////////////////////////</span></div><div class="line"><a name="l00160"></a><span class="lineno">  160</span>&#160;<span class="comment"></span><span class="comment">// IValidationErrorHandler</span></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="keyword">template</span> &lt;<span class="keyword">typename</span> SchemaType&gt;</div><div class="line"><a name="l00163"></a><span class="lineno">  163</span>&#160;<span class="keyword">class </span>IValidationErrorHandler {</div><div class="line"><a name="l00164"></a><span class="lineno">  164</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l00165"></a><span class="lineno">  165</span>&#160;    <span class="keyword">typedef</span> <span class="keyword">typename</span> SchemaType::Ch Ch;</div><div class="line"><a name="l00166"></a><span class="lineno">  166</span>&#160;    <span class="keyword">typedef</span> <span class="keyword">typename</span> SchemaType::SValue SValue;</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="keyword">virtual</span> ~IValidationErrorHandler() {}</div><div class="line"><a name="l00169"></a><span class="lineno">  169</span>&#160;</div><div class="line"><a name="l00170"></a><span class="lineno">  170</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> NotMultipleOf(int64_t actual, <span class="keyword">const</span> SValue&amp; expected) = 0;</div><div class="line"><a name="l00171"></a><span class="lineno">  171</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> NotMultipleOf(uint64_t actual, <span class="keyword">const</span> SValue&amp; expected) = 0;</div><div class="line"><a name="l00172"></a><span class="lineno">  172</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> NotMultipleOf(<span class="keywordtype">double</span> actual, <span class="keyword">const</span> SValue&amp; expected) = 0;</div><div class="line"><a name="l00173"></a><span class="lineno">  173</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> AboveMaximum(int64_t actual, <span class="keyword">const</span> SValue&amp; expected, <span class="keywordtype">bool</span> exclusive) = 0;</div><div class="line"><a name="l00174"></a><span class="lineno">  174</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> AboveMaximum(uint64_t actual, <span class="keyword">const</span> SValue&amp; expected, <span class="keywordtype">bool</span> exclusive) = 0;</div><div class="line"><a name="l00175"></a><span class="lineno">  175</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> AboveMaximum(<span class="keywordtype">double</span> actual, <span class="keyword">const</span> SValue&amp; expected, <span class="keywordtype">bool</span> exclusive) = 0;</div><div class="line"><a name="l00176"></a><span class="lineno">  176</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> BelowMinimum(int64_t actual, <span class="keyword">const</span> SValue&amp; expected, <span class="keywordtype">bool</span> exclusive) = 0;</div><div class="line"><a name="l00177"></a><span class="lineno">  177</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> BelowMinimum(uint64_t actual, <span class="keyword">const</span> SValue&amp; expected, <span class="keywordtype">bool</span> exclusive) = 0;</div><div class="line"><a name="l00178"></a><span class="lineno">  178</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> BelowMinimum(<span class="keywordtype">double</span> actual, <span class="keyword">const</span> SValue&amp; expected, <span class="keywordtype">bool</span> exclusive) = 0;</div><div class="line"><a name="l00179"></a><span class="lineno">  179</span>&#160;</div><div class="line"><a name="l00180"></a><span class="lineno">  180</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> TooLong(<span class="keyword">const</span> Ch* str, <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> length, <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> expected) = 0;</div><div class="line"><a name="l00181"></a><span class="lineno">  181</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> TooShort(<span class="keyword">const</span> Ch* str, <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> length, <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> expected) = 0;</div><div class="line"><a name="l00182"></a><span class="lineno">  182</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> DoesNotMatch(<span class="keyword">const</span> Ch* str, <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> length) = 0;</div><div class="line"><a name="l00183"></a><span class="lineno">  183</span>&#160;</div><div class="line"><a name="l00184"></a><span class="lineno">  184</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> DisallowedItem(<a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> index) = 0;</div><div class="line"><a name="l00185"></a><span class="lineno">  185</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> TooFewItems(<a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> actualCount, <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> expectedCount) = 0;</div><div class="line"><a name="l00186"></a><span class="lineno">  186</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> TooManyItems(<a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> actualCount, <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> expectedCount) = 0;</div><div class="line"><a name="l00187"></a><span class="lineno">  187</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> DuplicateItems(<a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> index1, <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> index2) = 0;</div><div class="line"><a name="l00188"></a><span class="lineno">  188</span>&#160;</div><div class="line"><a name="l00189"></a><span class="lineno">  189</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> TooManyProperties(<a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> actualCount, <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> expectedCount) = 0;</div><div class="line"><a name="l00190"></a><span class="lineno">  190</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> TooFewProperties(<a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> actualCount, <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> expectedCount) = 0;</div><div class="line"><a name="l00191"></a><span class="lineno">  191</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> StartMissingProperties() = 0;</div><div class="line"><a name="l00192"></a><span class="lineno">  192</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> AddMissingProperty(<span class="keyword">const</span> SValue&amp; name) = 0;</div><div class="line"><a name="l00193"></a><span class="lineno">  193</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> EndMissingProperties() = 0;</div><div class="line"><a name="l00194"></a><span class="lineno">  194</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> PropertyViolations(ISchemaValidator** subvalidators, <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> count) = 0;</div><div class="line"><a name="l00195"></a><span class="lineno">  195</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> DisallowedProperty(<span class="keyword">const</span> Ch* name, <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> length) = 0;</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="keyword">virtual</span> <span class="keywordtype">void</span> StartDependencyErrors() = 0;</div><div class="line"><a name="l00198"></a><span class="lineno">  198</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> StartMissingDependentProperties() = 0;</div><div class="line"><a name="l00199"></a><span class="lineno">  199</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> AddMissingDependentProperty(<span class="keyword">const</span> SValue&amp; targetName) = 0;</div><div class="line"><a name="l00200"></a><span class="lineno">  200</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> EndMissingDependentProperties(<span class="keyword">const</span> SValue&amp; sourceName) = 0;</div><div class="line"><a name="l00201"></a><span class="lineno">  201</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> AddDependencySchemaError(<span class="keyword">const</span> SValue&amp; souceName, ISchemaValidator* subvalidator) = 0;</div><div class="line"><a name="l00202"></a><span class="lineno">  202</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> EndDependencyErrors() = 0;</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">virtual</span> <span class="keywordtype">void</span> DisallowedValue() = 0;</div><div class="line"><a name="l00205"></a><span class="lineno">  205</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> StartDisallowedType() = 0;</div><div class="line"><a name="l00206"></a><span class="lineno">  206</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> AddExpectedType(<span class="keyword">const</span> <span class="keyword">typename</span> SchemaType::ValueType&amp; expectedType) = 0;</div><div class="line"><a name="l00207"></a><span class="lineno">  207</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> EndDisallowedType(<span class="keyword">const</span> <span class="keyword">typename</span> SchemaType::ValueType&amp; actualType) = 0;</div><div class="line"><a name="l00208"></a><span class="lineno">  208</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> NotAllOf(ISchemaValidator** subvalidators, <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> count) = 0;</div><div class="line"><a name="l00209"></a><span class="lineno">  209</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> NoneOf(ISchemaValidator** subvalidators, <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> count) = 0;</div><div class="line"><a name="l00210"></a><span class="lineno">  210</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> NotOneOf(ISchemaValidator** subvalidators, <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> count) = 0;</div><div class="line"><a name="l00211"></a><span class="lineno">  211</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> Disallowed() = 0;</div><div class="line"><a name="l00212"></a><span class="lineno">  212</span>&#160;};</div><div class="line"><a name="l00213"></a><span class="lineno">  213</span>&#160;</div><div class="line"><a name="l00214"></a><span class="lineno">  214</span>&#160;<span class="comment"></span></div><div class="line"><a name="l00215"></a><span class="lineno">  215</span>&#160;<span class="comment">///////////////////////////////////////////////////////////////////////////////</span></div><div class="line"><a name="l00216"></a><span class="lineno">  216</span>&#160;<span class="comment"></span><span class="comment">// Hasher</span></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="comment">// For comparison of compound value</span></div><div class="line"><a name="l00219"></a><span class="lineno">  219</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> Encoding, <span class="keyword">typename</span> Allocator&gt;</div><div class="line"><a name="l00220"></a><span class="lineno">  220</span>&#160;<span class="keyword">class </span>Hasher {</div><div class="line"><a name="l00221"></a><span class="lineno">  221</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l00222"></a><span class="lineno">  222</span>&#160;    <span class="keyword">typedef</span> <span class="keyword">typename</span> Encoding::Ch Ch;</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;    Hasher(Allocator* allocator = 0, <span class="keywordtype">size_t</span> stackCapacity = kDefaultSize) : stack_(allocator, stackCapacity) {}</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;    <span class="keywordtype">bool</span> Null() { <span class="keywordflow">return</span> WriteType(<a class="code" href="namespacerapidjson.html#ae79a4751c1c460ff0de5ecc07874f3e4a952871e4326b527154fc8aac1ac1f6ff">kNullType</a>); }</div><div class="line"><a name="l00227"></a><span class="lineno">  227</span>&#160;    <span class="keywordtype">bool</span> Bool(<span class="keywordtype">bool</span> b) { <span class="keywordflow">return</span> WriteType(b ? <a class="code" href="namespacerapidjson.html#ae79a4751c1c460ff0de5ecc07874f3e4a80d9f25b083abce45edbfdd3ba006c8e">kTrueType</a> : <a class="code" href="namespacerapidjson.html#ae79a4751c1c460ff0de5ecc07874f3e4a9f2e7047832dce1029551b5de0f05607">kFalseType</a>); }</div><div class="line"><a name="l00228"></a><span class="lineno">  228</span>&#160;    <span class="keywordtype">bool</span> Int(<span class="keywordtype">int</span> i) { Number n; n.u.i = i; n.d = <span class="keyword">static_cast&lt;</span><span class="keywordtype">double</span><span class="keyword">&gt;</span>(i); <span class="keywordflow">return</span> WriteNumber(n); }</div><div class="line"><a name="l00229"></a><span class="lineno">  229</span>&#160;    <span class="keywordtype">bool</span> Uint(<span class="keywordtype">unsigned</span> u) { Number n; n.u.u = u; n.d = <span class="keyword">static_cast&lt;</span><span class="keywordtype">double</span><span class="keyword">&gt;</span>(u); <span class="keywordflow">return</span> WriteNumber(n); }</div><div class="line"><a name="l00230"></a><span class="lineno">  230</span>&#160;    <span class="keywordtype">bool</span> Int64(int64_t i) { Number n; n.u.i = i; n.d = <span class="keyword">static_cast&lt;</span><span class="keywordtype">double</span><span class="keyword">&gt;</span>(i); <span class="keywordflow">return</span> WriteNumber(n); }</div><div class="line"><a name="l00231"></a><span class="lineno">  231</span>&#160;    <span class="keywordtype">bool</span> Uint64(uint64_t u) { Number n; n.u.u = u; n.d = <span class="keyword">static_cast&lt;</span><span class="keywordtype">double</span><span class="keyword">&gt;</span>(u); <span class="keywordflow">return</span> WriteNumber(n); }</div><div class="line"><a name="l00232"></a><span class="lineno">  232</span>&#160;    <span class="keywordtype">bool</span> Double(<span class="keywordtype">double</span> d) { </div><div class="line"><a name="l00233"></a><span class="lineno">  233</span>&#160;        Number n; </div><div class="line"><a name="l00234"></a><span class="lineno">  234</span>&#160;        <span class="keywordflow">if</span> (d &lt; 0) n.u.i = <span class="keyword">static_cast&lt;</span>int64_t<span class="keyword">&gt;</span>(d);</div><div class="line"><a name="l00235"></a><span class="lineno">  235</span>&#160;        <span class="keywordflow">else</span>       n.u.u = <span class="keyword">static_cast&lt;</span>uint64_t<span class="keyword">&gt;</span>(d); </div><div class="line"><a name="l00236"></a><span class="lineno">  236</span>&#160;        n.d = d;</div><div class="line"><a name="l00237"></a><span class="lineno">  237</span>&#160;        <span class="keywordflow">return</span> WriteNumber(n);</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="keywordtype">bool</span> RawNumber(<span class="keyword">const</span> Ch* str, <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> len, <span class="keywordtype">bool</span>) {</div><div class="line"><a name="l00241"></a><span class="lineno">  241</span>&#160;        WriteBuffer(<a class="code" href="namespacerapidjson.html#ae79a4751c1c460ff0de5ecc07874f3e4abe572cb44ce198e467ccf9d63d50d82a">kNumberType</a>, str, len * <span class="keyword">sizeof</span>(Ch));</div><div class="line"><a name="l00242"></a><span class="lineno">  242</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00243"></a><span class="lineno">  243</span>&#160;    }</div><div class="line"><a name="l00244"></a><span class="lineno">  244</span>&#160;</div><div class="line"><a name="l00245"></a><span class="lineno">  245</span>&#160;    <span class="keywordtype">bool</span> String(<span class="keyword">const</span> Ch* str, <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> len, <span class="keywordtype">bool</span>) {</div><div class="line"><a name="l00246"></a><span class="lineno">  246</span>&#160;        WriteBuffer(<a class="code" href="namespacerapidjson.html#ae79a4751c1c460ff0de5ecc07874f3e4ad6379da3dc04b83a591992bfb9fabba7">kStringType</a>, str, len * <span class="keyword">sizeof</span>(Ch));</div><div class="line"><a name="l00247"></a><span class="lineno">  247</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00248"></a><span class="lineno">  248</span>&#160;    }</div><div class="line"><a name="l00249"></a><span class="lineno">  249</span>&#160;</div><div class="line"><a name="l00250"></a><span class="lineno">  250</span>&#160;    <span class="keywordtype">bool</span> StartObject() { <span class="keywordflow">return</span> <span class="keyword">true</span>; }</div><div class="line"><a name="l00251"></a><span class="lineno">  251</span>&#160;    <span class="keywordtype">bool</span> Key(<span class="keyword">const</span> Ch* str, <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> len, <span class="keywordtype">bool</span> copy) { <span class="keywordflow">return</span> String(str, len, copy); }</div><div class="line"><a name="l00252"></a><span class="lineno">  252</span>&#160;    <span class="keywordtype">bool</span> EndObject(<a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> memberCount) { </div><div class="line"><a name="l00253"></a><span class="lineno">  253</span>&#160;        uint64_t h = Hash(0, <a class="code" href="namespacerapidjson.html#ae79a4751c1c460ff0de5ecc07874f3e4acf030b422a32c3647c7c5973bd4dd0a9">kObjectType</a>);</div><div class="line"><a name="l00254"></a><span class="lineno">  254</span>&#160;        uint64_t* kv = stack_.template Pop&lt;uint64_t&gt;(memberCount * 2);</div><div class="line"><a name="l00255"></a><span class="lineno">  255</span>&#160;        <span class="keywordflow">for</span> (<a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> i = 0; i &lt; memberCount; i++)</div><div class="line"><a name="l00256"></a><span class="lineno">  256</span>&#160;            h ^= Hash(kv[i * 2], kv[i * 2 + 1]);  <span class="comment">// Use xor to achieve member order insensitive</span></div><div class="line"><a name="l00257"></a><span class="lineno">  257</span>&#160;        *stack_.template Push&lt;uint64_t&gt;() = h;</div><div class="line"><a name="l00258"></a><span class="lineno">  258</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00259"></a><span class="lineno">  259</span>&#160;    }</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="keywordtype">bool</span> StartArray() { <span class="keywordflow">return</span> <span class="keyword">true</span>; }</div><div class="line"><a name="l00262"></a><span class="lineno">  262</span>&#160;    <span class="keywordtype">bool</span> EndArray(<a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> elementCount) { </div><div class="line"><a name="l00263"></a><span class="lineno">  263</span>&#160;        uint64_t h = Hash(0, <a class="code" href="namespacerapidjson.html#ae79a4751c1c460ff0de5ecc07874f3e4a058c622e1e7d59419ae58b895cbce468">kArrayType</a>);</div><div class="line"><a name="l00264"></a><span class="lineno">  264</span>&#160;        uint64_t* e = stack_.template Pop&lt;uint64_t&gt;(elementCount);</div><div class="line"><a name="l00265"></a><span class="lineno">  265</span>&#160;        <span class="keywordflow">for</span> (<a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> i = 0; i &lt; elementCount; i++)</div><div class="line"><a name="l00266"></a><span class="lineno">  266</span>&#160;            h = Hash(h, e[i]); <span class="comment">// Use hash to achieve element order sensitive</span></div><div class="line"><a name="l00267"></a><span class="lineno">  267</span>&#160;        *stack_.template Push&lt;uint64_t&gt;() = h;</div><div class="line"><a name="l00268"></a><span class="lineno">  268</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00269"></a><span class="lineno">  269</span>&#160;    }</div><div class="line"><a name="l00270"></a><span class="lineno">  270</span>&#160;</div><div class="line"><a name="l00271"></a><span class="lineno">  271</span>&#160;    <span class="keywordtype">bool</span> IsValid()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> stack_.GetSize() == <span class="keyword">sizeof</span>(uint64_t); }</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;    uint64_t GetHashCode()<span class="keyword"> const </span>{</div><div class="line"><a name="l00274"></a><span class="lineno">  274</span>&#160;        <a class="code" href="group___r_a_p_i_d_j_s_o_n___c_o_n_f_i_g.html#gabeba18d612187bad2ac62aed9276d47c">RAPIDJSON_ASSERT</a>(IsValid());</div><div class="line"><a name="l00275"></a><span class="lineno">  275</span>&#160;        <span class="keywordflow">return</span> *stack_.template Top&lt;uint64_t&gt;();</div><div class="line"><a name="l00276"></a><span class="lineno">  276</span>&#160;    }</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="keyword">private</span>:</div><div class="line"><a name="l00279"></a><span class="lineno">  279</span>&#160;    <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">size_t</span> kDefaultSize = 256;</div><div class="line"><a name="l00280"></a><span class="lineno">  280</span>&#160;    <span class="keyword">struct </span>Number {</div><div class="line"><a name="l00281"></a><span class="lineno">  281</span>&#160;        <span class="keyword">union </span>U {</div><div class="line"><a name="l00282"></a><span class="lineno">  282</span>&#160;            uint64_t u;</div><div class="line"><a name="l00283"></a><span class="lineno">  283</span>&#160;            int64_t i;</div><div class="line"><a name="l00284"></a><span class="lineno">  284</span>&#160;        }u;</div><div class="line"><a name="l00285"></a><span class="lineno">  285</span>&#160;        <span class="keywordtype">double</span> d;</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;</div><div class="line"><a name="l00288"></a><span class="lineno">  288</span>&#160;    <span class="keywordtype">bool</span> WriteType(<a class="code" href="namespacerapidjson.html#ae79a4751c1c460ff0de5ecc07874f3e4">Type</a> type) { <span class="keywordflow">return</span> WriteBuffer(type, 0, 0); }</div><div class="line"><a name="l00289"></a><span class="lineno">  289</span>&#160;    </div><div class="line"><a name="l00290"></a><span class="lineno">  290</span>&#160;    <span class="keywordtype">bool</span> WriteNumber(<span class="keyword">const</span> Number&amp; n) { <span class="keywordflow">return</span> WriteBuffer(<a class="code" href="namespacerapidjson.html#ae79a4751c1c460ff0de5ecc07874f3e4abe572cb44ce198e467ccf9d63d50d82a">kNumberType</a>, &amp;n, <span class="keyword">sizeof</span>(n)); }</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="keywordtype">bool</span> WriteBuffer(<a class="code" href="namespacerapidjson.html#ae79a4751c1c460ff0de5ecc07874f3e4">Type</a> type, <span class="keyword">const</span> <span class="keywordtype">void</span>* data, <span class="keywordtype">size_t</span> len) {</div><div class="line"><a name="l00293"></a><span class="lineno">  293</span>&#160;        <span class="comment">// FNV-1a from http://isthe.com/chongo/tech/comp/fnv/</span></div><div class="line"><a name="l00294"></a><span class="lineno">  294</span>&#160;        uint64_t h = Hash(<a class="code" href="rapidjson_8h.html#aaee1245f375a71be1ac9b8a07ba5fb8f">RAPIDJSON_UINT64_C2</a>(0x84222325, 0xcbf29ce4), type);</div><div class="line"><a name="l00295"></a><span class="lineno">  295</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>* d = <span class="keyword">static_cast&lt;</span><span class="keyword">const </span><span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>*<span class="keyword">&gt;</span>(data);</div><div class="line"><a name="l00296"></a><span class="lineno">  296</span>&#160;        <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i &lt; len; i++)</div><div class="line"><a name="l00297"></a><span class="lineno">  297</span>&#160;            h = Hash(h, d[i]);</div><div class="line"><a name="l00298"></a><span class="lineno">  298</span>&#160;        *stack_.template Push&lt;uint64_t&gt;() = h;</div><div class="line"><a name="l00299"></a><span class="lineno">  299</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</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;    <span class="keyword">static</span> uint64_t Hash(uint64_t h, uint64_t d) {</div><div class="line"><a name="l00303"></a><span class="lineno">  303</span>&#160;        <span class="keyword">static</span> <span class="keyword">const</span> uint64_t kPrime = <a class="code" href="rapidjson_8h.html#aaee1245f375a71be1ac9b8a07ba5fb8f">RAPIDJSON_UINT64_C2</a>(0x00000100, 0x000001b3);</div><div class="line"><a name="l00304"></a><span class="lineno">  304</span>&#160;        h ^= d;</div><div class="line"><a name="l00305"></a><span class="lineno">  305</span>&#160;        h *= kPrime;</div><div class="line"><a name="l00306"></a><span class="lineno">  306</span>&#160;        <span class="keywordflow">return</span> h;</div><div class="line"><a name="l00307"></a><span class="lineno">  307</span>&#160;    }</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;    Stack&lt;Allocator&gt; stack_;</div><div class="line"><a name="l00310"></a><span class="lineno">  310</span>&#160;};</div><div class="line"><a name="l00311"></a><span class="lineno">  311</span>&#160;<span class="comment"></span></div><div class="line"><a name="l00312"></a><span class="lineno">  312</span>&#160;<span class="comment">///////////////////////////////////////////////////////////////////////////////</span></div><div class="line"><a name="l00313"></a><span class="lineno">  313</span>&#160;<span class="comment"></span><span class="comment">// SchemaValidationContext</span></div><div class="line"><a name="l00314"></a><span class="lineno">  314</span>&#160;</div><div class="line"><a name="l00315"></a><span class="lineno">  315</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> SchemaDocumentType&gt;</div><div class="line"><a name="l00316"></a><span class="lineno">  316</span>&#160;<span class="keyword">struct </span>SchemaValidationContext {</div><div class="line"><a name="l00317"></a><span class="lineno">  317</span>&#160;    <span class="keyword">typedef</span> Schema&lt;SchemaDocumentType&gt; SchemaType;</div><div class="line"><a name="l00318"></a><span class="lineno">  318</span>&#160;    <span class="keyword">typedef</span> ISchemaStateFactory&lt;SchemaType&gt; SchemaValidatorFactoryType;</div><div class="line"><a name="l00319"></a><span class="lineno">  319</span>&#160;    <span class="keyword">typedef</span> IValidationErrorHandler&lt;SchemaType&gt; ErrorHandlerType;</div><div class="line"><a name="l00320"></a><span class="lineno">  320</span>&#160;    <span class="keyword">typedef</span> <span class="keyword">typename</span> SchemaType::ValueType ValueType;</div><div class="line"><a name="l00321"></a><span class="lineno">  321</span>&#160;    <span class="keyword">typedef</span> <span class="keyword">typename</span> ValueType::Ch Ch;</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">enum</span> PatternValidatorType {</div><div class="line"><a name="l00324"></a><span class="lineno">  324</span>&#160;        kPatternValidatorOnly,</div><div class="line"><a name="l00325"></a><span class="lineno">  325</span>&#160;        kPatternValidatorWithProperty,</div><div class="line"><a name="l00326"></a><span class="lineno">  326</span>&#160;        kPatternValidatorWithAdditionalProperty</div><div class="line"><a name="l00327"></a><span class="lineno">  327</span>&#160;    };</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;    SchemaValidationContext(SchemaValidatorFactoryType&amp; f, ErrorHandlerType&amp; eh, <span class="keyword">const</span> SchemaType* s) :</div><div class="line"><a name="l00330"></a><span class="lineno">  330</span>&#160;        factory(f),</div><div class="line"><a name="l00331"></a><span class="lineno">  331</span>&#160;        error_handler(eh),</div><div class="line"><a name="l00332"></a><span class="lineno">  332</span>&#160;        schema(s),</div><div class="line"><a name="l00333"></a><span class="lineno">  333</span>&#160;        valueSchema(),</div><div class="line"><a name="l00334"></a><span class="lineno">  334</span>&#160;        invalidKeyword(),</div><div class="line"><a name="l00335"></a><span class="lineno">  335</span>&#160;        hasher(),</div><div class="line"><a name="l00336"></a><span class="lineno">  336</span>&#160;        arrayElementHashCodes(),</div><div class="line"><a name="l00337"></a><span class="lineno">  337</span>&#160;        validators(),</div><div class="line"><a name="l00338"></a><span class="lineno">  338</span>&#160;        validatorCount(),</div><div class="line"><a name="l00339"></a><span class="lineno">  339</span>&#160;        patternPropertiesValidators(),</div><div class="line"><a name="l00340"></a><span class="lineno">  340</span>&#160;        patternPropertiesValidatorCount(),</div><div class="line"><a name="l00341"></a><span class="lineno">  341</span>&#160;        patternPropertiesSchemas(),</div><div class="line"><a name="l00342"></a><span class="lineno">  342</span>&#160;        patternPropertiesSchemaCount(),</div><div class="line"><a name="l00343"></a><span class="lineno">  343</span>&#160;        valuePatternValidatorType(kPatternValidatorOnly),</div><div class="line"><a name="l00344"></a><span class="lineno">  344</span>&#160;        propertyExist(),</div><div class="line"><a name="l00345"></a><span class="lineno">  345</span>&#160;        inArray(false),</div><div class="line"><a name="l00346"></a><span class="lineno">  346</span>&#160;        valueUniqueness(false),</div><div class="line"><a name="l00347"></a><span class="lineno">  347</span>&#160;        arrayUniqueness(false)</div><div class="line"><a name="l00348"></a><span class="lineno">  348</span>&#160;    {</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;</div><div class="line"><a name="l00351"></a><span class="lineno">  351</span>&#160;    ~SchemaValidationContext() {</div><div class="line"><a name="l00352"></a><span class="lineno">  352</span>&#160;        <span class="keywordflow">if</span> (hasher)</div><div class="line"><a name="l00353"></a><span class="lineno">  353</span>&#160;            factory.DestroryHasher(hasher);</div><div class="line"><a name="l00354"></a><span class="lineno">  354</span>&#160;        <span class="keywordflow">if</span> (validators) {</div><div class="line"><a name="l00355"></a><span class="lineno">  355</span>&#160;            <span class="keywordflow">for</span> (<a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> i = 0; i &lt; validatorCount; i++)</div><div class="line"><a name="l00356"></a><span class="lineno">  356</span>&#160;                factory.DestroySchemaValidator(validators[i]);</div><div class="line"><a name="l00357"></a><span class="lineno">  357</span>&#160;            factory.FreeState(validators);</div><div class="line"><a name="l00358"></a><span class="lineno">  358</span>&#160;        }</div><div class="line"><a name="l00359"></a><span class="lineno">  359</span>&#160;        <span class="keywordflow">if</span> (patternPropertiesValidators) {</div><div class="line"><a name="l00360"></a><span class="lineno">  360</span>&#160;            <span class="keywordflow">for</span> (<a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> i = 0; i &lt; patternPropertiesValidatorCount; i++)</div><div class="line"><a name="l00361"></a><span class="lineno">  361</span>&#160;                factory.DestroySchemaValidator(patternPropertiesValidators[i]);</div><div class="line"><a name="l00362"></a><span class="lineno">  362</span>&#160;            factory.FreeState(patternPropertiesValidators);</div><div class="line"><a name="l00363"></a><span class="lineno">  363</span>&#160;        }</div><div class="line"><a name="l00364"></a><span class="lineno">  364</span>&#160;        <span class="keywordflow">if</span> (patternPropertiesSchemas)</div><div class="line"><a name="l00365"></a><span class="lineno">  365</span>&#160;            factory.FreeState(patternPropertiesSchemas);</div><div class="line"><a name="l00366"></a><span class="lineno">  366</span>&#160;        <span class="keywordflow">if</span> (propertyExist)</div><div class="line"><a name="l00367"></a><span class="lineno">  367</span>&#160;            factory.FreeState(propertyExist);</div><div class="line"><a name="l00368"></a><span class="lineno">  368</span>&#160;    }</div><div class="line"><a name="l00369"></a><span class="lineno">  369</span>&#160;</div><div class="line"><a name="l00370"></a><span class="lineno">  370</span>&#160;    SchemaValidatorFactoryType&amp; factory;</div><div class="line"><a name="l00371"></a><span class="lineno">  371</span>&#160;    ErrorHandlerType&amp; error_handler;</div><div class="line"><a name="l00372"></a><span class="lineno">  372</span>&#160;    <span class="keyword">const</span> SchemaType* schema;</div><div class="line"><a name="l00373"></a><span class="lineno">  373</span>&#160;    <span class="keyword">const</span> SchemaType* valueSchema;</div><div class="line"><a name="l00374"></a><span class="lineno">  374</span>&#160;    <span class="keyword">const</span> Ch* invalidKeyword;</div><div class="line"><a name="l00375"></a><span class="lineno">  375</span>&#160;    <span class="keywordtype">void</span>* hasher; <span class="comment">// Only validator access</span></div><div class="line"><a name="l00376"></a><span class="lineno">  376</span>&#160;    <span class="keywordtype">void</span>* arrayElementHashCodes; <span class="comment">// Only validator access this</span></div><div class="line"><a name="l00377"></a><span class="lineno">  377</span>&#160;    ISchemaValidator** validators;</div><div class="line"><a name="l00378"></a><span class="lineno">  378</span>&#160;    <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> validatorCount;</div><div class="line"><a name="l00379"></a><span class="lineno">  379</span>&#160;    ISchemaValidator** patternPropertiesValidators;</div><div class="line"><a name="l00380"></a><span class="lineno">  380</span>&#160;    <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> patternPropertiesValidatorCount;</div><div class="line"><a name="l00381"></a><span class="lineno">  381</span>&#160;    <span class="keyword">const</span> SchemaType** patternPropertiesSchemas;</div><div class="line"><a name="l00382"></a><span class="lineno">  382</span>&#160;    <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> patternPropertiesSchemaCount;</div><div class="line"><a name="l00383"></a><span class="lineno">  383</span>&#160;    PatternValidatorType valuePatternValidatorType;</div><div class="line"><a name="l00384"></a><span class="lineno">  384</span>&#160;    PatternValidatorType objectPatternValidatorType;</div><div class="line"><a name="l00385"></a><span class="lineno">  385</span>&#160;    <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> arrayElementIndex;</div><div class="line"><a name="l00386"></a><span class="lineno">  386</span>&#160;    <span class="keywordtype">bool</span>* propertyExist;</div><div class="line"><a name="l00387"></a><span class="lineno">  387</span>&#160;    <span class="keywordtype">bool</span> inArray;</div><div class="line"><a name="l00388"></a><span class="lineno">  388</span>&#160;    <span class="keywordtype">bool</span> valueUniqueness;</div><div class="line"><a name="l00389"></a><span class="lineno">  389</span>&#160;    <span class="keywordtype">bool</span> arrayUniqueness;</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"></span></div><div class="line"><a name="l00392"></a><span class="lineno">  392</span>&#160;<span class="comment">///////////////////////////////////////////////////////////////////////////////</span></div><div class="line"><a name="l00393"></a><span class="lineno">  393</span>&#160;<span class="comment"></span><span class="comment">// Schema</span></div><div class="line"><a name="l00394"></a><span class="lineno">  394</span>&#160;</div><div class="line"><a name="l00395"></a><span class="lineno">  395</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> SchemaDocumentType&gt;</div><div class="line"><a name="l00396"></a><span class="lineno">  396</span>&#160;<span class="keyword">class </span>Schema {</div><div class="line"><a name="l00397"></a><span class="lineno">  397</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l00398"></a><span class="lineno">  398</span>&#160;    <span class="keyword">typedef</span> <span class="keyword">typename</span> SchemaDocumentType::ValueType ValueType;</div><div class="line"><a name="l00399"></a><span class="lineno">  399</span>&#160;    <span class="keyword">typedef</span> <span class="keyword">typename</span> SchemaDocumentType::AllocatorType AllocatorType;</div><div class="line"><a name="l00400"></a><span class="lineno">  400</span>&#160;    <span class="keyword">typedef</span> <span class="keyword">typename</span> SchemaDocumentType::PointerType PointerType;</div><div class="line"><a name="l00401"></a><span class="lineno">  401</span>&#160;    <span class="keyword">typedef</span> <span class="keyword">typename</span> ValueType::EncodingType EncodingType;</div><div class="line"><a name="l00402"></a><span class="lineno">  402</span>&#160;    <span class="keyword">typedef</span> <span class="keyword">typename</span> EncodingType::Ch Ch;</div><div class="line"><a name="l00403"></a><span class="lineno">  403</span>&#160;    <span class="keyword">typedef</span> SchemaValidationContext&lt;SchemaDocumentType&gt; Context;</div><div class="line"><a name="l00404"></a><span class="lineno">  404</span>&#160;    <span class="keyword">typedef</span> Schema&lt;SchemaDocumentType&gt; SchemaType;</div><div class="line"><a name="l00405"></a><span class="lineno">  405</span>&#160;    <span class="keyword">typedef</span> GenericValue&lt;EncodingType, AllocatorType&gt; SValue;</div><div class="line"><a name="l00406"></a><span class="lineno">  406</span>&#160;    <span class="keyword">typedef</span> IValidationErrorHandler&lt;Schema&gt; ErrorHandler;</div><div class="line"><a name="l00407"></a><span class="lineno">  407</span>&#160;    <span class="keyword">friend</span> <span class="keyword">class </span>GenericSchemaDocument&lt;ValueType, AllocatorType&gt;;</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;    Schema(SchemaDocumentType* schemaDocument, <span class="keyword">const</span> PointerType&amp; p, <span class="keyword">const</span> ValueType&amp; value, <span class="keyword">const</span> ValueType&amp; document, AllocatorType* allocator) :</div><div class="line"><a name="l00410"></a><span class="lineno">  410</span>&#160;        allocator_(allocator),</div><div class="line"><a name="l00411"></a><span class="lineno">  411</span>&#160;        uri_(schemaDocument-&gt;GetURI(), *allocator),</div><div class="line"><a name="l00412"></a><span class="lineno">  412</span>&#160;        pointer_(p),</div><div class="line"><a name="l00413"></a><span class="lineno">  413</span>&#160;        typeless_(schemaDocument-&gt;GetTypeless()),</div><div class="line"><a name="l00414"></a><span class="lineno">  414</span>&#160;        enum_(),</div><div class="line"><a name="l00415"></a><span class="lineno">  415</span>&#160;        enumCount_(),</div><div class="line"><a name="l00416"></a><span class="lineno">  416</span>&#160;        not_(),</div><div class="line"><a name="l00417"></a><span class="lineno">  417</span>&#160;        type_((1 &lt;&lt; kTotalSchemaType) - 1), <span class="comment">// typeless</span></div><div class="line"><a name="l00418"></a><span class="lineno">  418</span>&#160;        validatorCount_(),</div><div class="line"><a name="l00419"></a><span class="lineno">  419</span>&#160;        notValidatorIndex_(),</div><div class="line"><a name="l00420"></a><span class="lineno">  420</span>&#160;        properties_(),</div><div class="line"><a name="l00421"></a><span class="lineno">  421</span>&#160;        additionalPropertiesSchema_(),</div><div class="line"><a name="l00422"></a><span class="lineno">  422</span>&#160;        patternProperties_(),</div><div class="line"><a name="l00423"></a><span class="lineno">  423</span>&#160;        patternPropertyCount_(),</div><div class="line"><a name="l00424"></a><span class="lineno">  424</span>&#160;        propertyCount_(),</div><div class="line"><a name="l00425"></a><span class="lineno">  425</span>&#160;        minProperties_(),</div><div class="line"><a name="l00426"></a><span class="lineno">  426</span>&#160;        maxProperties_(<a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a>(~0)),</div><div class="line"><a name="l00427"></a><span class="lineno">  427</span>&#160;        additionalProperties_(true),</div><div class="line"><a name="l00428"></a><span class="lineno">  428</span>&#160;        hasDependencies_(),</div><div class="line"><a name="l00429"></a><span class="lineno">  429</span>&#160;        hasRequired_(),</div><div class="line"><a name="l00430"></a><span class="lineno">  430</span>&#160;        hasSchemaDependencies_(),</div><div class="line"><a name="l00431"></a><span class="lineno">  431</span>&#160;        additionalItemsSchema_(),</div><div class="line"><a name="l00432"></a><span class="lineno">  432</span>&#160;        itemsList_(),</div><div class="line"><a name="l00433"></a><span class="lineno">  433</span>&#160;        itemsTuple_(),</div><div class="line"><a name="l00434"></a><span class="lineno">  434</span>&#160;        itemsTupleCount_(),</div><div class="line"><a name="l00435"></a><span class="lineno">  435</span>&#160;        minItems_(),</div><div class="line"><a name="l00436"></a><span class="lineno">  436</span>&#160;        maxItems_(<a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a>(~0)),</div><div class="line"><a name="l00437"></a><span class="lineno">  437</span>&#160;        additionalItems_(true),</div><div class="line"><a name="l00438"></a><span class="lineno">  438</span>&#160;        uniqueItems_(false),</div><div class="line"><a name="l00439"></a><span class="lineno">  439</span>&#160;        pattern_(),</div><div class="line"><a name="l00440"></a><span class="lineno">  440</span>&#160;        minLength_(0),</div><div class="line"><a name="l00441"></a><span class="lineno">  441</span>&#160;        maxLength_(~<a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a>(0)),</div><div class="line"><a name="l00442"></a><span class="lineno">  442</span>&#160;        exclusiveMinimum_(false),</div><div class="line"><a name="l00443"></a><span class="lineno">  443</span>&#160;        exclusiveMaximum_(false),</div><div class="line"><a name="l00444"></a><span class="lineno">  444</span>&#160;        defaultValueLength_(0)</div><div class="line"><a name="l00445"></a><span class="lineno">  445</span>&#160;    {</div><div class="line"><a name="l00446"></a><span class="lineno">  446</span>&#160;        <span class="keyword">typedef</span> <span class="keyword">typename</span> SchemaDocumentType::ValueType ValueType;</div><div class="line"><a name="l00447"></a><span class="lineno">  447</span>&#160;        <span class="keyword">typedef</span> <span class="keyword">typename</span> ValueType::ConstValueIterator ConstValueIterator;</div><div class="line"><a name="l00448"></a><span class="lineno">  448</span>&#160;        <span class="keyword">typedef</span> <span class="keyword">typename</span> ValueType::ConstMemberIterator ConstMemberIterator;</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">  450</span>&#160;        <span class="keywordflow">if</span> (!value.IsObject())</div><div class="line"><a name="l00451"></a><span class="lineno">  451</span>&#160;            <span class="keywordflow">return</span>;</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;        <span class="keywordflow">if</span> (<span class="keyword">const</span> ValueType* v = GetMember(value, GetTypeString())) {</div><div class="line"><a name="l00454"></a><span class="lineno">  454</span>&#160;            type_ = 0;</div><div class="line"><a name="l00455"></a><span class="lineno">  455</span>&#160;            <span class="keywordflow">if</span> (v-&gt;IsString())</div><div class="line"><a name="l00456"></a><span class="lineno">  456</span>&#160;                AddType(*v);</div><div class="line"><a name="l00457"></a><span class="lineno">  457</span>&#160;            <span class="keywordflow">else</span> <span class="keywordflow">if</span> (v-&gt;IsArray())</div><div class="line"><a name="l00458"></a><span class="lineno">  458</span>&#160;                <span class="keywordflow">for</span> (ConstValueIterator itr = v-&gt;Begin(); itr != v-&gt;End(); ++itr)</div><div class="line"><a name="l00459"></a><span class="lineno">  459</span>&#160;                    AddType(*itr);</div><div class="line"><a name="l00460"></a><span class="lineno">  460</span>&#160;        }</div><div class="line"><a name="l00461"></a><span class="lineno">  461</span>&#160;</div><div class="line"><a name="l00462"></a><span class="lineno">  462</span>&#160;        <span class="keywordflow">if</span> (<span class="keyword">const</span> ValueType* v = GetMember(value, GetEnumString()))</div><div class="line"><a name="l00463"></a><span class="lineno">  463</span>&#160;            <span class="keywordflow">if</span> (v-&gt;IsArray() &amp;&amp; v-&gt;Size() &gt; 0) {</div><div class="line"><a name="l00464"></a><span class="lineno">  464</span>&#160;                enum_ = <span class="keyword">static_cast&lt;</span>uint64_t*<span class="keyword">&gt;</span>(allocator_-&gt;Malloc(<span class="keyword">sizeof</span>(uint64_t) * v-&gt;Size()));</div><div class="line"><a name="l00465"></a><span class="lineno">  465</span>&#160;                <span class="keywordflow">for</span> (ConstValueIterator itr = v-&gt;Begin(); itr != v-&gt;End(); ++itr) {</div><div class="line"><a name="l00466"></a><span class="lineno">  466</span>&#160;                    <span class="keyword">typedef</span> Hasher&lt;EncodingType, MemoryPoolAllocator&lt;&gt; &gt; EnumHasherType;</div><div class="line"><a name="l00467"></a><span class="lineno">  467</span>&#160;                    <span class="keywordtype">char</span> buffer[256u + 24];</div><div class="line"><a name="l00468"></a><span class="lineno">  468</span>&#160;                    MemoryPoolAllocator&lt;&gt; hasherAllocator(buffer, <span class="keyword">sizeof</span>(buffer));</div><div class="line"><a name="l00469"></a><span class="lineno">  469</span>&#160;                    EnumHasherType h(&amp;hasherAllocator, 256);</div><div class="line"><a name="l00470"></a><span class="lineno">  470</span>&#160;                    itr-&gt;Accept(h);</div><div class="line"><a name="l00471"></a><span class="lineno">  471</span>&#160;                    enum_[enumCount_++] = h.GetHashCode();</div><div class="line"><a name="l00472"></a><span class="lineno">  472</span>&#160;                }</div><div class="line"><a name="l00473"></a><span class="lineno">  473</span>&#160;            }</div><div class="line"><a name="l00474"></a><span class="lineno">  474</span>&#160;</div><div class="line"><a name="l00475"></a><span class="lineno">  475</span>&#160;        <span class="keywordflow">if</span> (schemaDocument) {</div><div class="line"><a name="l00476"></a><span class="lineno">  476</span>&#160;            AssignIfExist(allOf_, *schemaDocument, p, value, GetAllOfString(), document);</div><div class="line"><a name="l00477"></a><span class="lineno">  477</span>&#160;            AssignIfExist(anyOf_, *schemaDocument, p, value, GetAnyOfString(), document);</div><div class="line"><a name="l00478"></a><span class="lineno">  478</span>&#160;            AssignIfExist(oneOf_, *schemaDocument, p, value, GetOneOfString(), document);</div><div class="line"><a name="l00479"></a><span class="lineno">  479</span>&#160;        }</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">  481</span>&#160;        <span class="keywordflow">if</span> (<span class="keyword">const</span> ValueType* v = GetMember(value, GetNotString())) {</div><div class="line"><a name="l00482"></a><span class="lineno">  482</span>&#160;            schemaDocument-&gt;CreateSchema(&amp;not_, p.Append(GetNotString(), allocator_), *v, document);</div><div class="line"><a name="l00483"></a><span class="lineno">  483</span>&#160;            notValidatorIndex_ = validatorCount_;</div><div class="line"><a name="l00484"></a><span class="lineno">  484</span>&#160;            validatorCount_++;</div><div class="line"><a name="l00485"></a><span class="lineno">  485</span>&#160;        }</div><div class="line"><a name="l00486"></a><span class="lineno">  486</span>&#160;</div><div class="line"><a name="l00487"></a><span class="lineno">  487</span>&#160;        <span class="comment">// Object</span></div><div class="line"><a name="l00488"></a><span class="lineno">  488</span>&#160;</div><div class="line"><a name="l00489"></a><span class="lineno">  489</span>&#160;        <span class="keyword">const</span> ValueType* properties = GetMember(value, GetPropertiesString());</div><div class="line"><a name="l00490"></a><span class="lineno">  490</span>&#160;        <span class="keyword">const</span> ValueType* required = GetMember(value, GetRequiredString());</div><div class="line"><a name="l00491"></a><span class="lineno">  491</span>&#160;        <span class="keyword">const</span> ValueType* dependencies = GetMember(value, GetDependenciesString());</div><div class="line"><a name="l00492"></a><span class="lineno">  492</span>&#160;        {</div><div class="line"><a name="l00493"></a><span class="lineno">  493</span>&#160;            <span class="comment">// Gather properties from properties/required/dependencies</span></div><div class="line"><a name="l00494"></a><span class="lineno">  494</span>&#160;            SValue allProperties(<a class="code" href="namespacerapidjson.html#ae79a4751c1c460ff0de5ecc07874f3e4a058c622e1e7d59419ae58b895cbce468">kArrayType</a>);</div><div class="line"><a name="l00495"></a><span class="lineno">  495</span>&#160;</div><div class="line"><a name="l00496"></a><span class="lineno">  496</span>&#160;            <span class="keywordflow">if</span> (properties &amp;&amp; properties-&gt;IsObject())</div><div class="line"><a name="l00497"></a><span class="lineno">  497</span>&#160;                <span class="keywordflow">for</span> (ConstMemberIterator itr = properties-&gt;MemberBegin(); itr != properties-&gt;MemberEnd(); ++itr)</div><div class="line"><a name="l00498"></a><span class="lineno">  498</span>&#160;                    AddUniqueElement(allProperties, itr-&gt;name);</div><div class="line"><a name="l00499"></a><span class="lineno">  499</span>&#160;            </div><div class="line"><a name="l00500"></a><span class="lineno">  500</span>&#160;            <span class="keywordflow">if</span> (required &amp;&amp; required-&gt;IsArray())</div><div class="line"><a name="l00501"></a><span class="lineno">  501</span>&#160;                <span class="keywordflow">for</span> (ConstValueIterator itr = required-&gt;Begin(); itr != required-&gt;End(); ++itr)</div><div class="line"><a name="l00502"></a><span class="lineno">  502</span>&#160;                    <span class="keywordflow">if</span> (itr-&gt;IsString())</div><div class="line"><a name="l00503"></a><span class="lineno">  503</span>&#160;                        AddUniqueElement(allProperties, *itr);</div><div class="line"><a name="l00504"></a><span class="lineno">  504</span>&#160;</div><div class="line"><a name="l00505"></a><span class="lineno">  505</span>&#160;            <span class="keywordflow">if</span> (dependencies &amp;&amp; dependencies-&gt;IsObject())</div><div class="line"><a name="l00506"></a><span class="lineno">  506</span>&#160;                <span class="keywordflow">for</span> (ConstMemberIterator itr = dependencies-&gt;MemberBegin(); itr != dependencies-&gt;MemberEnd(); ++itr) {</div><div class="line"><a name="l00507"></a><span class="lineno">  507</span>&#160;                    AddUniqueElement(allProperties, itr-&gt;name);</div><div class="line"><a name="l00508"></a><span class="lineno">  508</span>&#160;                    <span class="keywordflow">if</span> (itr-&gt;value.IsArray())</div><div class="line"><a name="l00509"></a><span class="lineno">  509</span>&#160;                        <span class="keywordflow">for</span> (ConstValueIterator i = itr-&gt;value.Begin(); i != itr-&gt;value.End(); ++i)</div><div class="line"><a name="l00510"></a><span class="lineno">  510</span>&#160;                            <span class="keywordflow">if</span> (i-&gt;IsString())</div><div class="line"><a name="l00511"></a><span class="lineno">  511</span>&#160;                                AddUniqueElement(allProperties, *i);</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">  513</span>&#160;</div><div class="line"><a name="l00514"></a><span class="lineno">  514</span>&#160;            <span class="keywordflow">if</span> (allProperties.Size() &gt; 0) {</div><div class="line"><a name="l00515"></a><span class="lineno">  515</span>&#160;                propertyCount_ = allProperties.Size();</div><div class="line"><a name="l00516"></a><span class="lineno">  516</span>&#160;                properties_ = <span class="keyword">static_cast&lt;</span>Property*<span class="keyword">&gt;</span>(allocator_-&gt;Malloc(<span class="keyword">sizeof</span>(Property) * propertyCount_));</div><div class="line"><a name="l00517"></a><span class="lineno">  517</span>&#160;                <span class="keywordflow">for</span> (<a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> i = 0; i &lt; propertyCount_; i++) {</div><div class="line"><a name="l00518"></a><span class="lineno">  518</span>&#160;                    <span class="keyword">new</span> (&amp;properties_[i]) Property();</div><div class="line"><a name="l00519"></a><span class="lineno">  519</span>&#160;                    properties_[i].name = allProperties[i];</div><div class="line"><a name="l00520"></a><span class="lineno">  520</span>&#160;                    properties_[i].schema = typeless_;</div><div class="line"><a name="l00521"></a><span class="lineno">  521</span>&#160;                }</div><div class="line"><a name="l00522"></a><span class="lineno">  522</span>&#160;            }</div><div class="line"><a name="l00523"></a><span class="lineno">  523</span>&#160;        }</div><div class="line"><a name="l00524"></a><span class="lineno">  524</span>&#160;</div><div class="line"><a name="l00525"></a><span class="lineno">  525</span>&#160;        <span class="keywordflow">if</span> (properties &amp;&amp; properties-&gt;IsObject()) {</div><div class="line"><a name="l00526"></a><span class="lineno">  526</span>&#160;            PointerType q = p.Append(GetPropertiesString(), allocator_);</div><div class="line"><a name="l00527"></a><span class="lineno">  527</span>&#160;            <span class="keywordflow">for</span> (ConstMemberIterator itr = properties-&gt;MemberBegin(); itr != properties-&gt;MemberEnd(); ++itr) {</div><div class="line"><a name="l00528"></a><span class="lineno">  528</span>&#160;                <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> index;</div><div class="line"><a name="l00529"></a><span class="lineno">  529</span>&#160;                <span class="keywordflow">if</span> (FindPropertyIndex(itr-&gt;name, &amp;index))</div><div class="line"><a name="l00530"></a><span class="lineno">  530</span>&#160;                    schemaDocument-&gt;CreateSchema(&amp;properties_[index].schema, q.Append(itr-&gt;name, allocator_), itr-&gt;value, document);</div><div class="line"><a name="l00531"></a><span class="lineno">  531</span>&#160;            }</div><div class="line"><a name="l00532"></a><span class="lineno">  532</span>&#160;        }</div><div class="line"><a name="l00533"></a><span class="lineno">  533</span>&#160;</div><div class="line"><a name="l00534"></a><span class="lineno">  534</span>&#160;        <span class="keywordflow">if</span> (<span class="keyword">const</span> ValueType* v = GetMember(value, GetPatternPropertiesString())) {</div><div class="line"><a name="l00535"></a><span class="lineno">  535</span>&#160;            PointerType q = p.Append(GetPatternPropertiesString(), allocator_);</div><div class="line"><a name="l00536"></a><span class="lineno">  536</span>&#160;            patternProperties_ = <span class="keyword">static_cast&lt;</span>PatternProperty*<span class="keyword">&gt;</span>(allocator_-&gt;Malloc(<span class="keyword">sizeof</span>(PatternProperty) * v-&gt;MemberCount()));</div><div class="line"><a name="l00537"></a><span class="lineno">  537</span>&#160;            patternPropertyCount_ = 0;</div><div class="line"><a name="l00538"></a><span class="lineno">  538</span>&#160;</div><div class="line"><a name="l00539"></a><span class="lineno">  539</span>&#160;            <span class="keywordflow">for</span> (ConstMemberIterator itr = v-&gt;MemberBegin(); itr != v-&gt;MemberEnd(); ++itr) {</div><div class="line"><a name="l00540"></a><span class="lineno">  540</span>&#160;                <span class="keyword">new</span> (&amp;patternProperties_[patternPropertyCount_]) PatternProperty();</div><div class="line"><a name="l00541"></a><span class="lineno">  541</span>&#160;                patternProperties_[patternPropertyCount_].pattern = CreatePattern(itr-&gt;name);</div><div class="line"><a name="l00542"></a><span class="lineno">  542</span>&#160;                schemaDocument-&gt;CreateSchema(&amp;patternProperties_[patternPropertyCount_].schema, q.Append(itr-&gt;name, allocator_), itr-&gt;value, document);</div><div class="line"><a name="l00543"></a><span class="lineno">  543</span>&#160;                patternPropertyCount_++;</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;        }</div><div class="line"><a name="l00546"></a><span class="lineno">  546</span>&#160;</div><div class="line"><a name="l00547"></a><span class="lineno">  547</span>&#160;        <span class="keywordflow">if</span> (required &amp;&amp; required-&gt;IsArray())</div><div class="line"><a name="l00548"></a><span class="lineno">  548</span>&#160;            <span class="keywordflow">for</span> (ConstValueIterator itr = required-&gt;Begin(); itr != required-&gt;End(); ++itr)</div><div class="line"><a name="l00549"></a><span class="lineno">  549</span>&#160;                <span class="keywordflow">if</span> (itr-&gt;IsString()) {</div><div class="line"><a name="l00550"></a><span class="lineno">  550</span>&#160;                    <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> index;</div><div class="line"><a name="l00551"></a><span class="lineno">  551</span>&#160;                    <span class="keywordflow">if</span> (FindPropertyIndex(*itr, &amp;index)) {</div><div class="line"><a name="l00552"></a><span class="lineno">  552</span>&#160;                        properties_[index].required = <span class="keyword">true</span>;</div><div class="line"><a name="l00553"></a><span class="lineno">  553</span>&#160;                        hasRequired_ = <span class="keyword">true</span>;</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;</div><div class="line"><a name="l00557"></a><span class="lineno">  557</span>&#160;        <span class="keywordflow">if</span> (dependencies &amp;&amp; dependencies-&gt;IsObject()) {</div><div class="line"><a name="l00558"></a><span class="lineno">  558</span>&#160;            PointerType q = p.Append(GetDependenciesString(), allocator_);</div><div class="line"><a name="l00559"></a><span class="lineno">  559</span>&#160;            hasDependencies_ = <span class="keyword">true</span>;</div><div class="line"><a name="l00560"></a><span class="lineno">  560</span>&#160;            <span class="keywordflow">for</span> (ConstMemberIterator itr = dependencies-&gt;MemberBegin(); itr != dependencies-&gt;MemberEnd(); ++itr) {</div><div class="line"><a name="l00561"></a><span class="lineno">  561</span>&#160;                <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> sourceIndex;</div><div class="line"><a name="l00562"></a><span class="lineno">  562</span>&#160;                <span class="keywordflow">if</span> (FindPropertyIndex(itr-&gt;name, &amp;sourceIndex)) {</div><div class="line"><a name="l00563"></a><span class="lineno">  563</span>&#160;                    <span class="keywordflow">if</span> (itr-&gt;value.IsArray()) {</div><div class="line"><a name="l00564"></a><span class="lineno">  564</span>&#160;                        properties_[sourceIndex].dependencies = <span class="keyword">static_cast&lt;</span><span class="keywordtype">bool</span>*<span class="keyword">&gt;</span>(allocator_-&gt;Malloc(<span class="keyword">sizeof</span>(<span class="keywordtype">bool</span>) * propertyCount_));</div><div class="line"><a name="l00565"></a><span class="lineno">  565</span>&#160;                        std::memset(properties_[sourceIndex].dependencies, 0, <span class="keyword">sizeof</span>(<span class="keywordtype">bool</span>)* propertyCount_);</div><div class="line"><a name="l00566"></a><span class="lineno">  566</span>&#160;                        <span class="keywordflow">for</span> (ConstValueIterator targetItr = itr-&gt;value.Begin(); targetItr != itr-&gt;value.End(); ++targetItr) {</div><div class="line"><a name="l00567"></a><span class="lineno">  567</span>&#160;                            <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> targetIndex;</div><div class="line"><a name="l00568"></a><span class="lineno">  568</span>&#160;                            <span class="keywordflow">if</span> (FindPropertyIndex(*targetItr, &amp;targetIndex))</div><div class="line"><a name="l00569"></a><span class="lineno">  569</span>&#160;                                properties_[sourceIndex].dependencies[targetIndex] = <span class="keyword">true</span>;</div><div class="line"><a name="l00570"></a><span class="lineno">  570</span>&#160;                        }</div><div class="line"><a name="l00571"></a><span class="lineno">  571</span>&#160;                    }</div><div class="line"><a name="l00572"></a><span class="lineno">  572</span>&#160;                    <span class="keywordflow">else</span> <span class="keywordflow">if</span> (itr-&gt;value.IsObject()) {</div><div class="line"><a name="l00573"></a><span class="lineno">  573</span>&#160;                        hasSchemaDependencies_ = <span class="keyword">true</span>;</div><div class="line"><a name="l00574"></a><span class="lineno">  574</span>&#160;                        schemaDocument-&gt;CreateSchema(&amp;properties_[sourceIndex].dependenciesSchema, q.Append(itr-&gt;name, allocator_), itr-&gt;value, document);</div><div class="line"><a name="l00575"></a><span class="lineno">  575</span>&#160;                        properties_[sourceIndex].dependenciesValidatorIndex = validatorCount_;</div><div class="line"><a name="l00576"></a><span class="lineno">  576</span>&#160;                        validatorCount_++;</div><div class="line"><a name="l00577"></a><span class="lineno">  577</span>&#160;                    }</div><div class="line"><a name="l00578"></a><span class="lineno">  578</span>&#160;                }</div><div class="line"><a name="l00579"></a><span class="lineno">  579</span>&#160;            }</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;</div><div class="line"><a name="l00582"></a><span class="lineno">  582</span>&#160;        <span class="keywordflow">if</span> (<span class="keyword">const</span> ValueType* v = GetMember(value, GetAdditionalPropertiesString())) {</div><div class="line"><a name="l00583"></a><span class="lineno">  583</span>&#160;            <span class="keywordflow">if</span> (v-&gt;IsBool())</div><div class="line"><a name="l00584"></a><span class="lineno">  584</span>&#160;                additionalProperties_ = v-&gt;GetBool();</div><div class="line"><a name="l00585"></a><span class="lineno">  585</span>&#160;            <span class="keywordflow">else</span> <span class="keywordflow">if</span> (v-&gt;IsObject())</div><div class="line"><a name="l00586"></a><span class="lineno">  586</span>&#160;                schemaDocument-&gt;CreateSchema(&amp;additionalPropertiesSchema_, p.Append(GetAdditionalPropertiesString(), allocator_), *v, document);</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;</div><div class="line"><a name="l00589"></a><span class="lineno">  589</span>&#160;        AssignIfExist(minProperties_, value, GetMinPropertiesString());</div><div class="line"><a name="l00590"></a><span class="lineno">  590</span>&#160;        AssignIfExist(maxProperties_, value, GetMaxPropertiesString());</div><div class="line"><a name="l00591"></a><span class="lineno">  591</span>&#160;</div><div class="line"><a name="l00592"></a><span class="lineno">  592</span>&#160;        <span class="comment">// Array</span></div><div class="line"><a name="l00593"></a><span class="lineno">  593</span>&#160;        <span class="keywordflow">if</span> (<span class="keyword">const</span> ValueType* v = GetMember(value, GetItemsString())) {</div><div class="line"><a name="l00594"></a><span class="lineno">  594</span>&#160;            PointerType q = p.Append(GetItemsString(), allocator_);</div><div class="line"><a name="l00595"></a><span class="lineno">  595</span>&#160;            <span class="keywordflow">if</span> (v-&gt;IsObject()) <span class="comment">// List validation</span></div><div class="line"><a name="l00596"></a><span class="lineno">  596</span>&#160;                schemaDocument-&gt;CreateSchema(&amp;itemsList_, q, *v, document);</div><div class="line"><a name="l00597"></a><span class="lineno">  597</span>&#160;            <span class="keywordflow">else</span> <span class="keywordflow">if</span> (v-&gt;IsArray()) { <span class="comment">// Tuple validation</span></div><div class="line"><a name="l00598"></a><span class="lineno">  598</span>&#160;                itemsTuple_ = <span class="keyword">static_cast&lt;</span><span class="keyword">const </span>Schema**<span class="keyword">&gt;</span>(allocator_-&gt;Malloc(<span class="keyword">sizeof</span>(<span class="keyword">const</span> Schema*) * v-&gt;Size()));</div><div class="line"><a name="l00599"></a><span class="lineno">  599</span>&#160;                <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> index = 0;</div><div class="line"><a name="l00600"></a><span class="lineno">  600</span>&#160;                <span class="keywordflow">for</span> (ConstValueIterator itr = v-&gt;Begin(); itr != v-&gt;End(); ++itr, index++)</div><div class="line"><a name="l00601"></a><span class="lineno">  601</span>&#160;                    schemaDocument-&gt;CreateSchema(&amp;itemsTuple_[itemsTupleCount_++], q.Append(index, allocator_), *itr, document);</div><div class="line"><a name="l00602"></a><span class="lineno">  602</span>&#160;            }</div><div class="line"><a name="l00603"></a><span class="lineno">  603</span>&#160;        }</div><div class="line"><a name="l00604"></a><span class="lineno">  604</span>&#160;</div><div class="line"><a name="l00605"></a><span class="lineno">  605</span>&#160;        AssignIfExist(minItems_, value, GetMinItemsString());</div><div class="line"><a name="l00606"></a><span class="lineno">  606</span>&#160;        AssignIfExist(maxItems_, value, GetMaxItemsString());</div><div class="line"><a name="l00607"></a><span class="lineno">  607</span>&#160;</div><div class="line"><a name="l00608"></a><span class="lineno">  608</span>&#160;        <span class="keywordflow">if</span> (<span class="keyword">const</span> ValueType* v = GetMember(value, GetAdditionalItemsString())) {</div><div class="line"><a name="l00609"></a><span class="lineno">  609</span>&#160;            <span class="keywordflow">if</span> (v-&gt;IsBool())</div><div class="line"><a name="l00610"></a><span class="lineno">  610</span>&#160;                additionalItems_ = v-&gt;GetBool();</div><div class="line"><a name="l00611"></a><span class="lineno">  611</span>&#160;            <span class="keywordflow">else</span> <span class="keywordflow">if</span> (v-&gt;IsObject())</div><div class="line"><a name="l00612"></a><span class="lineno">  612</span>&#160;                schemaDocument-&gt;CreateSchema(&amp;additionalItemsSchema_, p.Append(GetAdditionalItemsString(), allocator_), *v, document);</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="l00615"></a><span class="lineno">  615</span>&#160;        AssignIfExist(uniqueItems_, value, GetUniqueItemsString());</div><div class="line"><a name="l00616"></a><span class="lineno">  616</span>&#160;</div><div class="line"><a name="l00617"></a><span class="lineno">  617</span>&#160;        <span class="comment">// String</span></div><div class="line"><a name="l00618"></a><span class="lineno">  618</span>&#160;        AssignIfExist(minLength_, value, GetMinLengthString());</div><div class="line"><a name="l00619"></a><span class="lineno">  619</span>&#160;        AssignIfExist(maxLength_, value, GetMaxLengthString());</div><div class="line"><a name="l00620"></a><span class="lineno">  620</span>&#160;</div><div class="line"><a name="l00621"></a><span class="lineno">  621</span>&#160;        <span class="keywordflow">if</span> (<span class="keyword">const</span> ValueType* v = GetMember(value, GetPatternString()))</div><div class="line"><a name="l00622"></a><span class="lineno">  622</span>&#160;            pattern_ = CreatePattern(*v);</div><div class="line"><a name="l00623"></a><span class="lineno">  623</span>&#160;</div><div class="line"><a name="l00624"></a><span class="lineno">  624</span>&#160;        <span class="comment">// Number</span></div><div class="line"><a name="l00625"></a><span class="lineno">  625</span>&#160;        <span class="keywordflow">if</span> (<span class="keyword">const</span> ValueType* v = GetMember(value, GetMinimumString()))</div><div class="line"><a name="l00626"></a><span class="lineno">  626</span>&#160;            <span class="keywordflow">if</span> (v-&gt;IsNumber())</div><div class="line"><a name="l00627"></a><span class="lineno">  627</span>&#160;                minimum_.CopyFrom(*v, *allocator_);</div><div class="line"><a name="l00628"></a><span class="lineno">  628</span>&#160;</div><div class="line"><a name="l00629"></a><span class="lineno">  629</span>&#160;        <span class="keywordflow">if</span> (<span class="keyword">const</span> ValueType* v = GetMember(value, GetMaximumString()))</div><div class="line"><a name="l00630"></a><span class="lineno">  630</span>&#160;            <span class="keywordflow">if</span> (v-&gt;IsNumber())</div><div class="line"><a name="l00631"></a><span class="lineno">  631</span>&#160;                maximum_.CopyFrom(*v, *allocator_);</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;        AssignIfExist(exclusiveMinimum_, value, GetExclusiveMinimumString());</div><div class="line"><a name="l00634"></a><span class="lineno">  634</span>&#160;        AssignIfExist(exclusiveMaximum_, value, GetExclusiveMaximumString());</div><div class="line"><a name="l00635"></a><span class="lineno">  635</span>&#160;</div><div class="line"><a name="l00636"></a><span class="lineno">  636</span>&#160;        <span class="keywordflow">if</span> (<span class="keyword">const</span> ValueType* v = GetMember(value, GetMultipleOfString()))</div><div class="line"><a name="l00637"></a><span class="lineno">  637</span>&#160;            <span class="keywordflow">if</span> (v-&gt;IsNumber() &amp;&amp; v-&gt;GetDouble() &gt; 0.0)</div><div class="line"><a name="l00638"></a><span class="lineno">  638</span>&#160;                multipleOf_.CopyFrom(*v, *allocator_);</div><div class="line"><a name="l00639"></a><span class="lineno">  639</span>&#160;</div><div class="line"><a name="l00640"></a><span class="lineno">  640</span>&#160;        <span class="comment">// Default</span></div><div class="line"><a name="l00641"></a><span class="lineno">  641</span>&#160;        <span class="keywordflow">if</span> (<span class="keyword">const</span> ValueType* v = GetMember(value, GetDefaultValueString()))</div><div class="line"><a name="l00642"></a><span class="lineno">  642</span>&#160;            <span class="keywordflow">if</span> (v-&gt;IsString())</div><div class="line"><a name="l00643"></a><span class="lineno">  643</span>&#160;                defaultValueLength_ = v-&gt;GetStringLength();</div><div class="line"><a name="l00644"></a><span class="lineno">  644</span>&#160;</div><div class="line"><a name="l00645"></a><span class="lineno">  645</span>&#160;    }</div><div class="line"><a name="l00646"></a><span class="lineno">  646</span>&#160;</div><div class="line"><a name="l00647"></a><span class="lineno">  647</span>&#160;    ~Schema() {</div><div class="line"><a name="l00648"></a><span class="lineno">  648</span>&#160;        AllocatorType::Free(enum_);</div><div class="line"><a name="l00649"></a><span class="lineno">  649</span>&#160;        <span class="keywordflow">if</span> (properties_) {</div><div class="line"><a name="l00650"></a><span class="lineno">  650</span>&#160;            <span class="keywordflow">for</span> (<a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> i = 0; i &lt; propertyCount_; i++)</div><div class="line"><a name="l00651"></a><span class="lineno">  651</span>&#160;                properties_[i].~Property();</div><div class="line"><a name="l00652"></a><span class="lineno">  652</span>&#160;            AllocatorType::Free(properties_);</div><div class="line"><a name="l00653"></a><span class="lineno">  653</span>&#160;        }</div><div class="line"><a name="l00654"></a><span class="lineno">  654</span>&#160;        <span class="keywordflow">if</span> (patternProperties_) {</div><div class="line"><a name="l00655"></a><span class="lineno">  655</span>&#160;            <span class="keywordflow">for</span> (<a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> i = 0; i &lt; patternPropertyCount_; i++)</div><div class="line"><a name="l00656"></a><span class="lineno">  656</span>&#160;                patternProperties_[i].~PatternProperty();</div><div class="line"><a name="l00657"></a><span class="lineno">  657</span>&#160;            AllocatorType::Free(patternProperties_);</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;        AllocatorType::Free(itemsTuple_);</div><div class="line"><a name="l00660"></a><span class="lineno">  660</span>&#160;<span class="preprocessor">#if RAPIDJSON_SCHEMA_HAS_REGEX</span></div><div class="line"><a name="l00661"></a><span class="lineno">  661</span>&#160;        <span class="keywordflow">if</span> (pattern_) {</div><div class="line"><a name="l00662"></a><span class="lineno">  662</span>&#160;            pattern_-&gt;~RegexType();</div><div class="line"><a name="l00663"></a><span class="lineno">  663</span>&#160;            AllocatorType::Free(pattern_);</div><div class="line"><a name="l00664"></a><span class="lineno">  664</span>&#160;        }</div><div class="line"><a name="l00665"></a><span class="lineno">  665</span>&#160;<span class="preprocessor">#endif</span></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;</div><div class="line"><a name="l00668"></a><span class="lineno">  668</span>&#160;    <span class="keyword">const</span> SValue&amp; GetURI()<span class="keyword"> const </span>{</div><div class="line"><a name="l00669"></a><span class="lineno">  669</span>&#160;        <span class="keywordflow">return</span> uri_;</div><div class="line"><a name="l00670"></a><span class="lineno">  670</span>&#160;    }</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="keyword">const</span> PointerType&amp; GetPointer()<span class="keyword"> const </span>{</div><div class="line"><a name="l00673"></a><span class="lineno">  673</span>&#160;        <span class="keywordflow">return</span> pointer_;</div><div class="line"><a name="l00674"></a><span class="lineno">  674</span>&#160;    }</div><div class="line"><a name="l00675"></a><span class="lineno">  675</span>&#160;</div><div class="line"><a name="l00676"></a><span class="lineno">  676</span>&#160;    <span class="keywordtype">bool</span> BeginValue(Context&amp; context)<span class="keyword"> const </span>{</div><div class="line"><a name="l00677"></a><span class="lineno">  677</span>&#160;        <span class="keywordflow">if</span> (context.inArray) {</div><div class="line"><a name="l00678"></a><span class="lineno">  678</span>&#160;            <span class="keywordflow">if</span> (uniqueItems_)</div><div class="line"><a name="l00679"></a><span class="lineno">  679</span>&#160;                context.valueUniqueness = <span class="keyword">true</span>;</div><div class="line"><a name="l00680"></a><span class="lineno">  680</span>&#160;</div><div class="line"><a name="l00681"></a><span class="lineno">  681</span>&#160;            <span class="keywordflow">if</span> (itemsList_)</div><div class="line"><a name="l00682"></a><span class="lineno">  682</span>&#160;                context.valueSchema = itemsList_;</div><div class="line"><a name="l00683"></a><span class="lineno">  683</span>&#160;            <span class="keywordflow">else</span> <span class="keywordflow">if</span> (itemsTuple_) {</div><div class="line"><a name="l00684"></a><span class="lineno">  684</span>&#160;                <span class="keywordflow">if</span> (context.arrayElementIndex &lt; itemsTupleCount_)</div><div class="line"><a name="l00685"></a><span class="lineno">  685</span>&#160;                    context.valueSchema = itemsTuple_[context.arrayElementIndex];</div><div class="line"><a name="l00686"></a><span class="lineno">  686</span>&#160;                <span class="keywordflow">else</span> <span class="keywordflow">if</span> (additionalItemsSchema_)</div><div class="line"><a name="l00687"></a><span class="lineno">  687</span>&#160;                    context.valueSchema = additionalItemsSchema_;</div><div class="line"><a name="l00688"></a><span class="lineno">  688</span>&#160;                <span class="keywordflow">else</span> <span class="keywordflow">if</span> (additionalItems_)</div><div class="line"><a name="l00689"></a><span class="lineno">  689</span>&#160;                    context.valueSchema = typeless_;</div><div class="line"><a name="l00690"></a><span class="lineno">  690</span>&#160;                <span class="keywordflow">else</span> {</div><div class="line"><a name="l00691"></a><span class="lineno">  691</span>&#160;                    context.error_handler.DisallowedItem(context.arrayElementIndex);</div><div class="line"><a name="l00692"></a><span class="lineno">  692</span>&#160;                    RAPIDJSON_INVALID_KEYWORD_RETURN(GetItemsString());</div><div class="line"><a name="l00693"></a><span class="lineno">  693</span>&#160;                }</div><div class="line"><a name="l00694"></a><span class="lineno">  694</span>&#160;            }</div><div class="line"><a name="l00695"></a><span class="lineno">  695</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l00696"></a><span class="lineno">  696</span>&#160;                context.valueSchema = typeless_;</div><div class="line"><a name="l00697"></a><span class="lineno">  697</span>&#160;</div><div class="line"><a name="l00698"></a><span class="lineno">  698</span>&#160;            context.arrayElementIndex++;</div><div class="line"><a name="l00699"></a><span class="lineno">  699</span>&#160;        }</div><div class="line"><a name="l00700"></a><span class="lineno">  700</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00701"></a><span class="lineno">  701</span>&#160;    }</div><div class="line"><a name="l00702"></a><span class="lineno">  702</span>&#160;</div><div class="line"><a name="l00703"></a><span class="lineno">  703</span>&#160;    RAPIDJSON_FORCEINLINE <span class="keywordtype">bool</span> EndValue(Context&amp; context)<span class="keyword"> const </span>{</div><div class="line"><a name="l00704"></a><span class="lineno">  704</span>&#160;        <span class="keywordflow">if</span> (context.patternPropertiesValidatorCount &gt; 0) {</div><div class="line"><a name="l00705"></a><span class="lineno">  705</span>&#160;            <span class="keywordtype">bool</span> otherValid = <span class="keyword">false</span>;</div><div class="line"><a name="l00706"></a><span class="lineno">  706</span>&#160;            <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> count = context.patternPropertiesValidatorCount;</div><div class="line"><a name="l00707"></a><span class="lineno">  707</span>&#160;            <span class="keywordflow">if</span> (context.objectPatternValidatorType != Context::kPatternValidatorOnly)</div><div class="line"><a name="l00708"></a><span class="lineno">  708</span>&#160;                otherValid = context.patternPropertiesValidators[--count]-&gt;IsValid();</div><div class="line"><a name="l00709"></a><span class="lineno">  709</span>&#160;</div><div class="line"><a name="l00710"></a><span class="lineno">  710</span>&#160;            <span class="keywordtype">bool</span> patternValid = <span class="keyword">true</span>;</div><div class="line"><a name="l00711"></a><span class="lineno">  711</span>&#160;            <span class="keywordflow">for</span> (<a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> i = 0; i &lt; count; i++)</div><div class="line"><a name="l00712"></a><span class="lineno">  712</span>&#160;                <span class="keywordflow">if</span> (!context.patternPropertiesValidators[i]-&gt;IsValid()) {</div><div class="line"><a name="l00713"></a><span class="lineno">  713</span>&#160;                    patternValid = <span class="keyword">false</span>;</div><div class="line"><a name="l00714"></a><span class="lineno">  714</span>&#160;                    <span class="keywordflow">break</span>;</div><div class="line"><a name="l00715"></a><span class="lineno">  715</span>&#160;                }</div><div class="line"><a name="l00716"></a><span class="lineno">  716</span>&#160;</div><div class="line"><a name="l00717"></a><span class="lineno">  717</span>&#160;            <span class="keywordflow">if</span> (context.objectPatternValidatorType == Context::kPatternValidatorOnly) {</div><div class="line"><a name="l00718"></a><span class="lineno">  718</span>&#160;                <span class="keywordflow">if</span> (!patternValid) {</div><div class="line"><a name="l00719"></a><span class="lineno">  719</span>&#160;                    context.error_handler.PropertyViolations(context.patternPropertiesValidators, count);</div><div class="line"><a name="l00720"></a><span class="lineno">  720</span>&#160;                    RAPIDJSON_INVALID_KEYWORD_RETURN(GetPatternPropertiesString());</div><div class="line"><a name="l00721"></a><span class="lineno">  721</span>&#160;                }</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">else</span> <span class="keywordflow">if</span> (context.objectPatternValidatorType == Context::kPatternValidatorWithProperty) {</div><div class="line"><a name="l00724"></a><span class="lineno">  724</span>&#160;                <span class="keywordflow">if</span> (!patternValid || !otherValid) {</div><div class="line"><a name="l00725"></a><span class="lineno">  725</span>&#160;                    context.error_handler.PropertyViolations(context.patternPropertiesValidators, count + 1);</div><div class="line"><a name="l00726"></a><span class="lineno">  726</span>&#160;                    RAPIDJSON_INVALID_KEYWORD_RETURN(GetPatternPropertiesString());</div><div class="line"><a name="l00727"></a><span class="lineno">  727</span>&#160;                }</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">else</span> <span class="keywordflow">if</span> (!patternValid &amp;&amp; !otherValid) { <span class="comment">// kPatternValidatorWithAdditionalProperty)</span></div><div class="line"><a name="l00730"></a><span class="lineno">  730</span>&#160;                context.error_handler.PropertyViolations(context.patternPropertiesValidators, count + 1);</div><div class="line"><a name="l00731"></a><span class="lineno">  731</span>&#160;                RAPIDJSON_INVALID_KEYWORD_RETURN(GetPatternPropertiesString());</div><div class="line"><a name="l00732"></a><span class="lineno">  732</span>&#160;            }</div><div class="line"><a name="l00733"></a><span class="lineno">  733</span>&#160;        }</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;        <span class="keywordflow">if</span> (enum_) {</div><div class="line"><a name="l00736"></a><span class="lineno">  736</span>&#160;            <span class="keyword">const</span> uint64_t h = context.factory.GetHashCode(context.hasher);</div><div class="line"><a name="l00737"></a><span class="lineno">  737</span>&#160;            <span class="keywordflow">for</span> (<a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> i = 0; i &lt; enumCount_; i++)</div><div class="line"><a name="l00738"></a><span class="lineno">  738</span>&#160;                <span class="keywordflow">if</span> (enum_[i] == h)</div><div class="line"><a name="l00739"></a><span class="lineno">  739</span>&#160;                    <span class="keywordflow">goto</span> foundEnum;</div><div class="line"><a name="l00740"></a><span class="lineno">  740</span>&#160;            context.error_handler.DisallowedValue();</div><div class="line"><a name="l00741"></a><span class="lineno">  741</span>&#160;            RAPIDJSON_INVALID_KEYWORD_RETURN(GetEnumString());</div><div class="line"><a name="l00742"></a><span class="lineno">  742</span>&#160;            foundEnum:;</div><div class="line"><a name="l00743"></a><span class="lineno">  743</span>&#160;        }</div><div class="line"><a name="l00744"></a><span class="lineno">  744</span>&#160;</div><div class="line"><a name="l00745"></a><span class="lineno">  745</span>&#160;        <span class="keywordflow">if</span> (allOf_.schemas)</div><div class="line"><a name="l00746"></a><span class="lineno">  746</span>&#160;            <span class="keywordflow">for</span> (<a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> i = allOf_.begin; i &lt; allOf_.begin + allOf_.count; i++)</div><div class="line"><a name="l00747"></a><span class="lineno">  747</span>&#160;                <span class="keywordflow">if</span> (!context.validators[i]-&gt;IsValid()) {</div><div class="line"><a name="l00748"></a><span class="lineno">  748</span>&#160;                    context.error_handler.NotAllOf(&amp;context.validators[allOf_.begin], allOf_.count);</div><div class="line"><a name="l00749"></a><span class="lineno">  749</span>&#160;                    RAPIDJSON_INVALID_KEYWORD_RETURN(GetAllOfString());</div><div class="line"><a name="l00750"></a><span class="lineno">  750</span>&#160;                }</div><div class="line"><a name="l00751"></a><span class="lineno">  751</span>&#160;        </div><div class="line"><a name="l00752"></a><span class="lineno">  752</span>&#160;        <span class="keywordflow">if</span> (anyOf_.schemas) {</div><div class="line"><a name="l00753"></a><span class="lineno">  753</span>&#160;            <span class="keywordflow">for</span> (<a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> i = anyOf_.begin; i &lt; anyOf_.begin + anyOf_.count; i++)</div><div class="line"><a name="l00754"></a><span class="lineno">  754</span>&#160;                <span class="keywordflow">if</span> (context.validators[i]-&gt;IsValid())</div><div class="line"><a name="l00755"></a><span class="lineno">  755</span>&#160;                    <span class="keywordflow">goto</span> foundAny;</div><div class="line"><a name="l00756"></a><span class="lineno">  756</span>&#160;            context.error_handler.NoneOf(&amp;context.validators[anyOf_.begin], anyOf_.count);</div><div class="line"><a name="l00757"></a><span class="lineno">  757</span>&#160;            RAPIDJSON_INVALID_KEYWORD_RETURN(GetAnyOfString());</div><div class="line"><a name="l00758"></a><span class="lineno">  758</span>&#160;            foundAny:;</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="keywordflow">if</span> (oneOf_.schemas) {</div><div class="line"><a name="l00762"></a><span class="lineno">  762</span>&#160;            <span class="keywordtype">bool</span> oneValid = <span class="keyword">false</span>;</div><div class="line"><a name="l00763"></a><span class="lineno">  763</span>&#160;            <span class="keywordflow">for</span> (<a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> i = oneOf_.begin; i &lt; oneOf_.begin + oneOf_.count; i++)</div><div class="line"><a name="l00764"></a><span class="lineno">  764</span>&#160;                <span class="keywordflow">if</span> (context.validators[i]-&gt;IsValid()) {</div><div class="line"><a name="l00765"></a><span class="lineno">  765</span>&#160;                    <span class="keywordflow">if</span> (oneValid) {</div><div class="line"><a name="l00766"></a><span class="lineno">  766</span>&#160;                        context.error_handler.NotOneOf(&amp;context.validators[oneOf_.begin], oneOf_.count);</div><div class="line"><a name="l00767"></a><span class="lineno">  767</span>&#160;                        RAPIDJSON_INVALID_KEYWORD_RETURN(GetOneOfString());</div><div class="line"><a name="l00768"></a><span class="lineno">  768</span>&#160;                    } <span class="keywordflow">else</span></div><div class="line"><a name="l00769"></a><span class="lineno">  769</span>&#160;                        oneValid = <span class="keyword">true</span>;</div><div class="line"><a name="l00770"></a><span class="lineno">  770</span>&#160;                }</div><div class="line"><a name="l00771"></a><span class="lineno">  771</span>&#160;            <span class="keywordflow">if</span> (!oneValid) {</div><div class="line"><a name="l00772"></a><span class="lineno">  772</span>&#160;                context.error_handler.NotOneOf(&amp;context.validators[oneOf_.begin], oneOf_.count);</div><div class="line"><a name="l00773"></a><span class="lineno">  773</span>&#160;                RAPIDJSON_INVALID_KEYWORD_RETURN(GetOneOfString());</div><div class="line"><a name="l00774"></a><span class="lineno">  774</span>&#160;            }</div><div class="line"><a name="l00775"></a><span class="lineno">  775</span>&#160;        }</div><div class="line"><a name="l00776"></a><span class="lineno">  776</span>&#160;</div><div class="line"><a name="l00777"></a><span class="lineno">  777</span>&#160;        <span class="keywordflow">if</span> (not_ &amp;&amp; context.validators[notValidatorIndex_]-&gt;IsValid()) {</div><div class="line"><a name="l00778"></a><span class="lineno">  778</span>&#160;            context.error_handler.Disallowed();</div><div class="line"><a name="l00779"></a><span class="lineno">  779</span>&#160;            RAPIDJSON_INVALID_KEYWORD_RETURN(GetNotString());</div><div class="line"><a name="l00780"></a><span class="lineno">  780</span>&#160;        }</div><div class="line"><a name="l00781"></a><span class="lineno">  781</span>&#160;</div><div class="line"><a name="l00782"></a><span class="lineno">  782</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00783"></a><span class="lineno">  783</span>&#160;    }</div><div class="line"><a name="l00784"></a><span class="lineno">  784</span>&#160;</div><div class="line"><a name="l00785"></a><span class="lineno">  785</span>&#160;    <span class="keywordtype">bool</span> Null(Context&amp; context)<span class="keyword"> const </span>{</div><div class="line"><a name="l00786"></a><span class="lineno">  786</span>&#160;        <span class="keywordflow">if</span> (!(type_ &amp; (1 &lt;&lt; kNullSchemaType))) {</div><div class="line"><a name="l00787"></a><span class="lineno">  787</span>&#160;            DisallowedType(context, GetNullString());</div><div class="line"><a name="l00788"></a><span class="lineno">  788</span>&#160;            RAPIDJSON_INVALID_KEYWORD_RETURN(GetTypeString());</div><div class="line"><a name="l00789"></a><span class="lineno">  789</span>&#160;        }</div><div class="line"><a name="l00790"></a><span class="lineno">  790</span>&#160;        <span class="keywordflow">return</span> CreateParallelValidator(context);</div><div class="line"><a name="l00791"></a><span class="lineno">  791</span>&#160;    }</div><div class="line"><a name="l00792"></a><span class="lineno">  792</span>&#160;    </div><div class="line"><a name="l00793"></a><span class="lineno">  793</span>&#160;    <span class="keywordtype">bool</span> Bool(Context&amp; context, <span class="keywordtype">bool</span>)<span class="keyword"> const </span>{</div><div class="line"><a name="l00794"></a><span class="lineno">  794</span>&#160;        <span class="keywordflow">if</span> (!(type_ &amp; (1 &lt;&lt; kBooleanSchemaType))) {</div><div class="line"><a name="l00795"></a><span class="lineno">  795</span>&#160;            DisallowedType(context, GetBooleanString());</div><div class="line"><a name="l00796"></a><span class="lineno">  796</span>&#160;            RAPIDJSON_INVALID_KEYWORD_RETURN(GetTypeString());</div><div class="line"><a name="l00797"></a><span class="lineno">  797</span>&#160;        }</div><div class="line"><a name="l00798"></a><span class="lineno">  798</span>&#160;        <span class="keywordflow">return</span> CreateParallelValidator(context);</div><div class="line"><a name="l00799"></a><span class="lineno">  799</span>&#160;    }</div><div class="line"><a name="l00800"></a><span class="lineno">  800</span>&#160;</div><div class="line"><a name="l00801"></a><span class="lineno">  801</span>&#160;    <span class="keywordtype">bool</span> Int(Context&amp; context, <span class="keywordtype">int</span> i)<span class="keyword"> const </span>{</div><div class="line"><a name="l00802"></a><span class="lineno">  802</span>&#160;        <span class="keywordflow">if</span> (!CheckInt(context, i))</div><div class="line"><a name="l00803"></a><span class="lineno">  803</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00804"></a><span class="lineno">  804</span>&#160;        <span class="keywordflow">return</span> CreateParallelValidator(context);</div><div class="line"><a name="l00805"></a><span class="lineno">  805</span>&#160;    }</div><div class="line"><a name="l00806"></a><span class="lineno">  806</span>&#160;</div><div class="line"><a name="l00807"></a><span class="lineno">  807</span>&#160;    <span class="keywordtype">bool</span> Uint(Context&amp; context, <span class="keywordtype">unsigned</span> u)<span class="keyword"> const </span>{</div><div class="line"><a name="l00808"></a><span class="lineno">  808</span>&#160;        <span class="keywordflow">if</span> (!CheckUint(context, u))</div><div class="line"><a name="l00809"></a><span class="lineno">  809</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00810"></a><span class="lineno">  810</span>&#160;        <span class="keywordflow">return</span> CreateParallelValidator(context);</div><div class="line"><a name="l00811"></a><span class="lineno">  811</span>&#160;    }</div><div class="line"><a name="l00812"></a><span class="lineno">  812</span>&#160;</div><div class="line"><a name="l00813"></a><span class="lineno">  813</span>&#160;    <span class="keywordtype">bool</span> Int64(Context&amp; context, int64_t i)<span class="keyword"> const </span>{</div><div class="line"><a name="l00814"></a><span class="lineno">  814</span>&#160;        <span class="keywordflow">if</span> (!CheckInt(context, i))</div><div class="line"><a name="l00815"></a><span class="lineno">  815</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00816"></a><span class="lineno">  816</span>&#160;        <span class="keywordflow">return</span> CreateParallelValidator(context);</div><div class="line"><a name="l00817"></a><span class="lineno">  817</span>&#160;    }</div><div class="line"><a name="l00818"></a><span class="lineno">  818</span>&#160;</div><div class="line"><a name="l00819"></a><span class="lineno">  819</span>&#160;    <span class="keywordtype">bool</span> Uint64(Context&amp; context, uint64_t u)<span class="keyword"> const </span>{</div><div class="line"><a name="l00820"></a><span class="lineno">  820</span>&#160;        <span class="keywordflow">if</span> (!CheckUint(context, u))</div><div class="line"><a name="l00821"></a><span class="lineno">  821</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00822"></a><span class="lineno">  822</span>&#160;        <span class="keywordflow">return</span> CreateParallelValidator(context);</div><div class="line"><a name="l00823"></a><span class="lineno">  823</span>&#160;    }</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="keywordtype">bool</span> Double(Context&amp; context, <span class="keywordtype">double</span> d)<span class="keyword"> const </span>{</div><div class="line"><a name="l00826"></a><span class="lineno">  826</span>&#160;        <span class="keywordflow">if</span> (!(type_ &amp; (1 &lt;&lt; kNumberSchemaType))) {</div><div class="line"><a name="l00827"></a><span class="lineno">  827</span>&#160;            DisallowedType(context, GetNumberString());</div><div class="line"><a name="l00828"></a><span class="lineno">  828</span>&#160;            RAPIDJSON_INVALID_KEYWORD_RETURN(GetTypeString());</div><div class="line"><a name="l00829"></a><span class="lineno">  829</span>&#160;        }</div><div class="line"><a name="l00830"></a><span class="lineno">  830</span>&#160;</div><div class="line"><a name="l00831"></a><span class="lineno">  831</span>&#160;        <span class="keywordflow">if</span> (!minimum_.IsNull() &amp;&amp; !CheckDoubleMinimum(context, d))</div><div class="line"><a name="l00832"></a><span class="lineno">  832</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00833"></a><span class="lineno">  833</span>&#160;</div><div class="line"><a name="l00834"></a><span class="lineno">  834</span>&#160;        <span class="keywordflow">if</span> (!maximum_.IsNull() &amp;&amp; !CheckDoubleMaximum(context, d))</div><div class="line"><a name="l00835"></a><span class="lineno">  835</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00836"></a><span class="lineno">  836</span>&#160;        </div><div class="line"><a name="l00837"></a><span class="lineno">  837</span>&#160;        <span class="keywordflow">if</span> (!multipleOf_.IsNull() &amp;&amp; !CheckDoubleMultipleOf(context, d))</div><div class="line"><a name="l00838"></a><span class="lineno">  838</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00839"></a><span class="lineno">  839</span>&#160;        </div><div class="line"><a name="l00840"></a><span class="lineno">  840</span>&#160;        <span class="keywordflow">return</span> CreateParallelValidator(context);</div><div class="line"><a name="l00841"></a><span class="lineno">  841</span>&#160;    }</div><div class="line"><a name="l00842"></a><span class="lineno">  842</span>&#160;    </div><div class="line"><a name="l00843"></a><span class="lineno">  843</span>&#160;    <span class="keywordtype">bool</span> String(Context&amp; context, <span class="keyword">const</span> Ch* str, <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> length, <span class="keywordtype">bool</span>)<span class="keyword"> const </span>{</div><div class="line"><a name="l00844"></a><span class="lineno">  844</span>&#160;        <span class="keywordflow">if</span> (!(type_ &amp; (1 &lt;&lt; kStringSchemaType))) {</div><div class="line"><a name="l00845"></a><span class="lineno">  845</span>&#160;            DisallowedType(context, GetStringString());</div><div class="line"><a name="l00846"></a><span class="lineno">  846</span>&#160;            RAPIDJSON_INVALID_KEYWORD_RETURN(GetTypeString());</div><div class="line"><a name="l00847"></a><span class="lineno">  847</span>&#160;        }</div><div class="line"><a name="l00848"></a><span class="lineno">  848</span>&#160;</div><div class="line"><a name="l00849"></a><span class="lineno">  849</span>&#160;        <span class="keywordflow">if</span> (minLength_ != 0 || maxLength_ != <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a>(~0)) {</div><div class="line"><a name="l00850"></a><span class="lineno">  850</span>&#160;            <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> count;</div><div class="line"><a name="l00851"></a><span class="lineno">  851</span>&#160;            <span class="keywordflow">if</span> (internal::CountStringCodePoint&lt;EncodingType&gt;(str, length, &amp;count)) {</div><div class="line"><a name="l00852"></a><span class="lineno">  852</span>&#160;                <span class="keywordflow">if</span> (count &lt; minLength_) {</div><div class="line"><a name="l00853"></a><span class="lineno">  853</span>&#160;                    context.error_handler.TooShort(str, length, minLength_);</div><div class="line"><a name="l00854"></a><span class="lineno">  854</span>&#160;                    RAPIDJSON_INVALID_KEYWORD_RETURN(GetMinLengthString());</div><div class="line"><a name="l00855"></a><span class="lineno">  855</span>&#160;                }</div><div class="line"><a name="l00856"></a><span class="lineno">  856</span>&#160;                <span class="keywordflow">if</span> (count &gt; maxLength_) {</div><div class="line"><a name="l00857"></a><span class="lineno">  857</span>&#160;                    context.error_handler.TooLong(str, length, maxLength_);</div><div class="line"><a name="l00858"></a><span class="lineno">  858</span>&#160;                    RAPIDJSON_INVALID_KEYWORD_RETURN(GetMaxLengthString());</div><div class="line"><a name="l00859"></a><span class="lineno">  859</span>&#160;                }</div><div class="line"><a name="l00860"></a><span class="lineno">  860</span>&#160;            }</div><div class="line"><a name="l00861"></a><span class="lineno">  861</span>&#160;        }</div><div class="line"><a name="l00862"></a><span class="lineno">  862</span>&#160;</div><div class="line"><a name="l00863"></a><span class="lineno">  863</span>&#160;        <span class="keywordflow">if</span> (pattern_ &amp;&amp; !IsPatternMatch(pattern_, str, length)) {</div><div class="line"><a name="l00864"></a><span class="lineno">  864</span>&#160;            context.error_handler.DoesNotMatch(str, length);</div><div class="line"><a name="l00865"></a><span class="lineno">  865</span>&#160;            RAPIDJSON_INVALID_KEYWORD_RETURN(GetPatternString());</div><div class="line"><a name="l00866"></a><span class="lineno">  866</span>&#160;        }</div><div class="line"><a name="l00867"></a><span class="lineno">  867</span>&#160;</div><div class="line"><a name="l00868"></a><span class="lineno">  868</span>&#160;        <span class="keywordflow">return</span> CreateParallelValidator(context);</div><div class="line"><a name="l00869"></a><span class="lineno">  869</span>&#160;    }</div><div class="line"><a name="l00870"></a><span class="lineno">  870</span>&#160;</div><div class="line"><a name="l00871"></a><span class="lineno">  871</span>&#160;    <span class="keywordtype">bool</span> StartObject(Context&amp; context)<span class="keyword"> const </span>{</div><div class="line"><a name="l00872"></a><span class="lineno">  872</span>&#160;        <span class="keywordflow">if</span> (!(type_ &amp; (1 &lt;&lt; kObjectSchemaType))) {</div><div class="line"><a name="l00873"></a><span class="lineno">  873</span>&#160;            DisallowedType(context, GetObjectString());</div><div class="line"><a name="l00874"></a><span class="lineno">  874</span>&#160;            RAPIDJSON_INVALID_KEYWORD_RETURN(GetTypeString());</div><div class="line"><a name="l00875"></a><span class="lineno">  875</span>&#160;        }</div><div class="line"><a name="l00876"></a><span class="lineno">  876</span>&#160;</div><div class="line"><a name="l00877"></a><span class="lineno">  877</span>&#160;        <span class="keywordflow">if</span> (hasDependencies_ || hasRequired_) {</div><div class="line"><a name="l00878"></a><span class="lineno">  878</span>&#160;            context.propertyExist = <span class="keyword">static_cast&lt;</span><span class="keywordtype">bool</span>*<span class="keyword">&gt;</span>(context.factory.MallocState(<span class="keyword">sizeof</span>(<span class="keywordtype">bool</span>) * propertyCount_));</div><div class="line"><a name="l00879"></a><span class="lineno">  879</span>&#160;            std::memset(context.propertyExist, 0, <span class="keyword">sizeof</span>(<span class="keywordtype">bool</span>) * propertyCount_);</div><div class="line"><a name="l00880"></a><span class="lineno">  880</span>&#160;        }</div><div class="line"><a name="l00881"></a><span class="lineno">  881</span>&#160;</div><div class="line"><a name="l00882"></a><span class="lineno">  882</span>&#160;        <span class="keywordflow">if</span> (patternProperties_) { <span class="comment">// pre-allocate schema array</span></div><div class="line"><a name="l00883"></a><span class="lineno">  883</span>&#160;            <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> count = patternPropertyCount_ + 1; <span class="comment">// extra for valuePatternValidatorType</span></div><div class="line"><a name="l00884"></a><span class="lineno">  884</span>&#160;            context.patternPropertiesSchemas = <span class="keyword">static_cast&lt;</span><span class="keyword">const </span>SchemaType**<span class="keyword">&gt;</span>(context.factory.MallocState(<span class="keyword">sizeof</span>(<span class="keyword">const</span> SchemaType*) * count));</div><div class="line"><a name="l00885"></a><span class="lineno">  885</span>&#160;            context.patternPropertiesSchemaCount = 0;</div><div class="line"><a name="l00886"></a><span class="lineno">  886</span>&#160;            std::memset(context.patternPropertiesSchemas, 0, <span class="keyword">sizeof</span>(SchemaType*) * count);</div><div class="line"><a name="l00887"></a><span class="lineno">  887</span>&#160;        }</div><div class="line"><a name="l00888"></a><span class="lineno">  888</span>&#160;</div><div class="line"><a name="l00889"></a><span class="lineno">  889</span>&#160;        <span class="keywordflow">return</span> CreateParallelValidator(context);</div><div class="line"><a name="l00890"></a><span class="lineno">  890</span>&#160;    }</div><div class="line"><a name="l00891"></a><span class="lineno">  891</span>&#160;    </div><div class="line"><a name="l00892"></a><span class="lineno">  892</span>&#160;    <span class="keywordtype">bool</span> Key(Context&amp; context, <span class="keyword">const</span> Ch* str, <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> len, <span class="keywordtype">bool</span>)<span class="keyword"> const </span>{</div><div class="line"><a name="l00893"></a><span class="lineno">  893</span>&#160;        <span class="keywordflow">if</span> (patternProperties_) {</div><div class="line"><a name="l00894"></a><span class="lineno">  894</span>&#160;            context.patternPropertiesSchemaCount = 0;</div><div class="line"><a name="l00895"></a><span class="lineno">  895</span>&#160;            <span class="keywordflow">for</span> (<a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> i = 0; i &lt; patternPropertyCount_; i++)</div><div class="line"><a name="l00896"></a><span class="lineno">  896</span>&#160;                <span class="keywordflow">if</span> (patternProperties_[i].pattern &amp;&amp; IsPatternMatch(patternProperties_[i].pattern, str, len)) {</div><div class="line"><a name="l00897"></a><span class="lineno">  897</span>&#160;                    context.patternPropertiesSchemas[context.patternPropertiesSchemaCount++] = patternProperties_[i].schema;</div><div class="line"><a name="l00898"></a><span class="lineno">  898</span>&#160;                    context.valueSchema = typeless_;</div><div class="line"><a name="l00899"></a><span class="lineno">  899</span>&#160;                }</div><div class="line"><a name="l00900"></a><span class="lineno">  900</span>&#160;        }</div><div class="line"><a name="l00901"></a><span class="lineno">  901</span>&#160;</div><div class="line"><a name="l00902"></a><span class="lineno">  902</span>&#160;        <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> index;</div><div class="line"><a name="l00903"></a><span class="lineno">  903</span>&#160;        <span class="keywordflow">if</span> (FindPropertyIndex(ValueType(str, len).Move(), &amp;index)) {</div><div class="line"><a name="l00904"></a><span class="lineno">  904</span>&#160;            <span class="keywordflow">if</span> (context.patternPropertiesSchemaCount &gt; 0) {</div><div class="line"><a name="l00905"></a><span class="lineno">  905</span>&#160;                context.patternPropertiesSchemas[context.patternPropertiesSchemaCount++] = properties_[index].schema;</div><div class="line"><a name="l00906"></a><span class="lineno">  906</span>&#160;                context.valueSchema = typeless_;</div><div class="line"><a name="l00907"></a><span class="lineno">  907</span>&#160;                context.valuePatternValidatorType = Context::kPatternValidatorWithProperty;</div><div class="line"><a name="l00908"></a><span class="lineno">  908</span>&#160;            }</div><div class="line"><a name="l00909"></a><span class="lineno">  909</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l00910"></a><span class="lineno">  910</span>&#160;                context.valueSchema = properties_[index].schema;</div><div class="line"><a name="l00911"></a><span class="lineno">  911</span>&#160;</div><div class="line"><a name="l00912"></a><span class="lineno">  912</span>&#160;            <span class="keywordflow">if</span> (context.propertyExist)</div><div class="line"><a name="l00913"></a><span class="lineno">  913</span>&#160;                context.propertyExist[index] = <span class="keyword">true</span>;</div><div class="line"><a name="l00914"></a><span class="lineno">  914</span>&#160;</div><div class="line"><a name="l00915"></a><span class="lineno">  915</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00916"></a><span class="lineno">  916</span>&#160;        }</div><div class="line"><a name="l00917"></a><span class="lineno">  917</span>&#160;</div><div class="line"><a name="l00918"></a><span class="lineno">  918</span>&#160;        <span class="keywordflow">if</span> (additionalPropertiesSchema_) {</div><div class="line"><a name="l00919"></a><span class="lineno">  919</span>&#160;            <span class="keywordflow">if</span> (additionalPropertiesSchema_ &amp;&amp; context.patternPropertiesSchemaCount &gt; 0) {</div><div class="line"><a name="l00920"></a><span class="lineno">  920</span>&#160;                context.patternPropertiesSchemas[context.patternPropertiesSchemaCount++] = additionalPropertiesSchema_;</div><div class="line"><a name="l00921"></a><span class="lineno">  921</span>&#160;                context.valueSchema = typeless_;</div><div class="line"><a name="l00922"></a><span class="lineno">  922</span>&#160;                context.valuePatternValidatorType = Context::kPatternValidatorWithAdditionalProperty;</div><div class="line"><a name="l00923"></a><span class="lineno">  923</span>&#160;            }</div><div class="line"><a name="l00924"></a><span class="lineno">  924</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l00925"></a><span class="lineno">  925</span>&#160;                context.valueSchema = additionalPropertiesSchema_;</div><div class="line"><a name="l00926"></a><span class="lineno">  926</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00927"></a><span class="lineno">  927</span>&#160;        }</div><div class="line"><a name="l00928"></a><span class="lineno">  928</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span> (additionalProperties_) {</div><div class="line"><a name="l00929"></a><span class="lineno">  929</span>&#160;            context.valueSchema = typeless_;</div><div class="line"><a name="l00930"></a><span class="lineno">  930</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00931"></a><span class="lineno">  931</span>&#160;        }</div><div class="line"><a name="l00932"></a><span class="lineno">  932</span>&#160;</div><div class="line"><a name="l00933"></a><span class="lineno">  933</span>&#160;        <span class="keywordflow">if</span> (context.patternPropertiesSchemaCount == 0) { <span class="comment">// patternProperties are not additional properties</span></div><div class="line"><a name="l00934"></a><span class="lineno">  934</span>&#160;            context.error_handler.DisallowedProperty(str, len);</div><div class="line"><a name="l00935"></a><span class="lineno">  935</span>&#160;            RAPIDJSON_INVALID_KEYWORD_RETURN(GetAdditionalPropertiesString());</div><div class="line"><a name="l00936"></a><span class="lineno">  936</span>&#160;        }</div><div class="line"><a name="l00937"></a><span class="lineno">  937</span>&#160;</div><div class="line"><a name="l00938"></a><span class="lineno">  938</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00939"></a><span class="lineno">  939</span>&#160;    }</div><div class="line"><a name="l00940"></a><span class="lineno">  940</span>&#160;</div><div class="line"><a name="l00941"></a><span class="lineno">  941</span>&#160;    <span class="keywordtype">bool</span> EndObject(Context&amp; context, <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> memberCount)<span class="keyword"> const </span>{</div><div class="line"><a name="l00942"></a><span class="lineno">  942</span>&#160;        <span class="keywordflow">if</span> (hasRequired_) {</div><div class="line"><a name="l00943"></a><span class="lineno">  943</span>&#160;            context.error_handler.StartMissingProperties();</div><div class="line"><a name="l00944"></a><span class="lineno">  944</span>&#160;            <span class="keywordflow">for</span> (<a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> index = 0; index &lt; propertyCount_; index++)</div><div class="line"><a name="l00945"></a><span class="lineno">  945</span>&#160;                <span class="keywordflow">if</span> (properties_[index].required &amp;&amp; !context.propertyExist[index])</div><div class="line"><a name="l00946"></a><span class="lineno">  946</span>&#160;                    <span class="keywordflow">if</span> (properties_[index].schema-&gt;defaultValueLength_ == 0 )</div><div class="line"><a name="l00947"></a><span class="lineno">  947</span>&#160;                        context.error_handler.AddMissingProperty(properties_[index].name);</div><div class="line"><a name="l00948"></a><span class="lineno">  948</span>&#160;            <span class="keywordflow">if</span> (context.error_handler.EndMissingProperties())</div><div class="line"><a name="l00949"></a><span class="lineno">  949</span>&#160;                RAPIDJSON_INVALID_KEYWORD_RETURN(GetRequiredString());</div><div class="line"><a name="l00950"></a><span class="lineno">  950</span>&#160;        }</div><div class="line"><a name="l00951"></a><span class="lineno">  951</span>&#160;</div><div class="line"><a name="l00952"></a><span class="lineno">  952</span>&#160;        <span class="keywordflow">if</span> (memberCount &lt; minProperties_) {</div><div class="line"><a name="l00953"></a><span class="lineno">  953</span>&#160;            context.error_handler.TooFewProperties(memberCount, minProperties_);</div><div class="line"><a name="l00954"></a><span class="lineno">  954</span>&#160;            RAPIDJSON_INVALID_KEYWORD_RETURN(GetMinPropertiesString());</div><div class="line"><a name="l00955"></a><span class="lineno">  955</span>&#160;        }</div><div class="line"><a name="l00956"></a><span class="lineno">  956</span>&#160;</div><div class="line"><a name="l00957"></a><span class="lineno">  957</span>&#160;        <span class="keywordflow">if</span> (memberCount &gt; maxProperties_) {</div><div class="line"><a name="l00958"></a><span class="lineno">  958</span>&#160;            context.error_handler.TooManyProperties(memberCount, maxProperties_);</div><div class="line"><a name="l00959"></a><span class="lineno">  959</span>&#160;            RAPIDJSON_INVALID_KEYWORD_RETURN(GetMaxPropertiesString());</div><div class="line"><a name="l00960"></a><span class="lineno">  960</span>&#160;        }</div><div class="line"><a name="l00961"></a><span class="lineno">  961</span>&#160;</div><div class="line"><a name="l00962"></a><span class="lineno">  962</span>&#160;        <span class="keywordflow">if</span> (hasDependencies_) {</div><div class="line"><a name="l00963"></a><span class="lineno">  963</span>&#160;            context.error_handler.StartDependencyErrors();</div><div class="line"><a name="l00964"></a><span class="lineno">  964</span>&#160;            <span class="keywordflow">for</span> (<a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> sourceIndex = 0; sourceIndex &lt; propertyCount_; sourceIndex++) {</div><div class="line"><a name="l00965"></a><span class="lineno">  965</span>&#160;                <span class="keyword">const</span> Property&amp; source = properties_[sourceIndex];</div><div class="line"><a name="l00966"></a><span class="lineno">  966</span>&#160;                <span class="keywordflow">if</span> (context.propertyExist[sourceIndex]) {</div><div class="line"><a name="l00967"></a><span class="lineno">  967</span>&#160;                    <span class="keywordflow">if</span> (source.dependencies) {</div><div class="line"><a name="l00968"></a><span class="lineno">  968</span>&#160;                        context.error_handler.StartMissingDependentProperties();</div><div class="line"><a name="l00969"></a><span class="lineno">  969</span>&#160;                        <span class="keywordflow">for</span> (<a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> targetIndex = 0; targetIndex &lt; propertyCount_; targetIndex++)</div><div class="line"><a name="l00970"></a><span class="lineno">  970</span>&#160;                            <span class="keywordflow">if</span> (source.dependencies[targetIndex] &amp;&amp; !context.propertyExist[targetIndex])</div><div class="line"><a name="l00971"></a><span class="lineno">  971</span>&#160;                                context.error_handler.AddMissingDependentProperty(properties_[targetIndex].name);</div><div class="line"><a name="l00972"></a><span class="lineno">  972</span>&#160;                        context.error_handler.EndMissingDependentProperties(source.name);</div><div class="line"><a name="l00973"></a><span class="lineno">  973</span>&#160;                    }</div><div class="line"><a name="l00974"></a><span class="lineno">  974</span>&#160;                    <span class="keywordflow">else</span> <span class="keywordflow">if</span> (source.dependenciesSchema) {</div><div class="line"><a name="l00975"></a><span class="lineno">  975</span>&#160;                        ISchemaValidator* dependenciesValidator = context.validators[source.dependenciesValidatorIndex];</div><div class="line"><a name="l00976"></a><span class="lineno">  976</span>&#160;                        <span class="keywordflow">if</span> (!dependenciesValidator-&gt;IsValid())</div><div class="line"><a name="l00977"></a><span class="lineno">  977</span>&#160;                            context.error_handler.AddDependencySchemaError(source.name, dependenciesValidator);</div><div class="line"><a name="l00978"></a><span class="lineno">  978</span>&#160;                    }</div><div class="line"><a name="l00979"></a><span class="lineno">  979</span>&#160;                }</div><div class="line"><a name="l00980"></a><span class="lineno">  980</span>&#160;            }</div><div class="line"><a name="l00981"></a><span class="lineno">  981</span>&#160;            <span class="keywordflow">if</span> (context.error_handler.EndDependencyErrors())</div><div class="line"><a name="l00982"></a><span class="lineno">  982</span>&#160;                RAPIDJSON_INVALID_KEYWORD_RETURN(GetDependenciesString());</div><div class="line"><a name="l00983"></a><span class="lineno">  983</span>&#160;        }</div><div class="line"><a name="l00984"></a><span class="lineno">  984</span>&#160;</div><div class="line"><a name="l00985"></a><span class="lineno">  985</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00986"></a><span class="lineno">  986</span>&#160;    }</div><div class="line"><a name="l00987"></a><span class="lineno">  987</span>&#160;</div><div class="line"><a name="l00988"></a><span class="lineno">  988</span>&#160;    <span class="keywordtype">bool</span> StartArray(Context&amp; context)<span class="keyword"> const </span>{</div><div class="line"><a name="l00989"></a><span class="lineno">  989</span>&#160;        <span class="keywordflow">if</span> (!(type_ &amp; (1 &lt;&lt; kArraySchemaType))) {</div><div class="line"><a name="l00990"></a><span class="lineno">  990</span>&#160;            DisallowedType(context, GetArrayString());</div><div class="line"><a name="l00991"></a><span class="lineno">  991</span>&#160;            RAPIDJSON_INVALID_KEYWORD_RETURN(GetTypeString());</div><div class="line"><a name="l00992"></a><span class="lineno">  992</span>&#160;        }</div><div class="line"><a name="l00993"></a><span class="lineno">  993</span>&#160;</div><div class="line"><a name="l00994"></a><span class="lineno">  994</span>&#160;        context.arrayElementIndex = 0;</div><div class="line"><a name="l00995"></a><span class="lineno">  995</span>&#160;        context.inArray = <span class="keyword">true</span>;</div><div class="line"><a name="l00996"></a><span class="lineno">  996</span>&#160;</div><div class="line"><a name="l00997"></a><span class="lineno">  997</span>&#160;        <span class="keywordflow">return</span> CreateParallelValidator(context);</div><div class="line"><a name="l00998"></a><span class="lineno">  998</span>&#160;    }</div><div class="line"><a name="l00999"></a><span class="lineno">  999</span>&#160;</div><div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>&#160;    <span class="keywordtype">bool</span> EndArray(Context&amp; context, <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> elementCount)<span class="keyword"> const </span>{</div><div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>&#160;        context.inArray = <span class="keyword">false</span>;</div><div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>&#160;        </div><div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>&#160;        <span class="keywordflow">if</span> (elementCount &lt; minItems_) {</div><div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>&#160;            context.error_handler.TooFewItems(elementCount, minItems_);</div><div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>&#160;            RAPIDJSON_INVALID_KEYWORD_RETURN(GetMinItemsString());</div><div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>&#160;        }</div><div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>&#160;        </div><div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>&#160;        <span class="keywordflow">if</span> (elementCount &gt; maxItems_) {</div><div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>&#160;            context.error_handler.TooManyItems(elementCount, maxItems_);</div><div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>&#160;            RAPIDJSON_INVALID_KEYWORD_RETURN(GetMaxItemsString());</div><div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>&#160;        }</div><div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>&#160;</div><div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>&#160;    }</div><div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>&#160;</div><div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>&#160;    <span class="comment">// Generate functions for string literal according to Ch</span></div><div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>&#160;<span class="preprocessor">#define RAPIDJSON_STRING_(name, ...) \</span></div><div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>&#160;<span class="preprocessor">    static const ValueType&amp; Get##name##String() {\</span></div><div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>&#160;<span class="preprocessor">        static const Ch s[] = { __VA_ARGS__, &#39;\0&#39; };\</span></div><div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>&#160;<span class="preprocessor">        static const ValueType v(s, static_cast&lt;SizeType&gt;(sizeof(s) / sizeof(Ch) - 1));\</span></div><div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>&#160;<span class="preprocessor">        return v;\</span></div><div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>&#160;<span class="preprocessor">    }</span></div><div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>&#160;</div><div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>&#160;    RAPIDJSON_STRING_(Null, <span class="charliteral">&#39;n&#39;</span>, <span class="charliteral">&#39;u&#39;</span>, <span class="charliteral">&#39;l&#39;</span>, <span class="charliteral">&#39;l&#39;</span>)</div><div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>&#160;    RAPIDJSON_STRING_(Boolean, &#39;b&#39;, &#39;o&#39;, &#39;o&#39;, &#39;l&#39;, &#39;e&#39;, &#39;a&#39;, &#39;n&#39;)</div><div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>&#160;    RAPIDJSON_STRING_(Object, &#39;o&#39;, &#39;b&#39;, &#39;j&#39;, &#39;e&#39;, &#39;c&#39;, &#39;t&#39;)</div><div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>&#160;    RAPIDJSON_STRING_(Array, &#39;a&#39;, &#39;r&#39;, &#39;r&#39;, &#39;a&#39;, &#39;y&#39;)</div><div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>&#160;    RAPIDJSON_STRING_(String, &#39;s&#39;, &#39;t&#39;, &#39;r&#39;, &#39;i&#39;, &#39;n&#39;, &#39;g&#39;)</div><div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>&#160;    RAPIDJSON_STRING_(Number, &#39;n&#39;, &#39;u&#39;, &#39;m&#39;, &#39;b&#39;, &#39;e&#39;, &#39;r&#39;)</div><div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>&#160;    RAPIDJSON_STRING_(Integer, &#39;i&#39;, &#39;n&#39;, &#39;t&#39;, &#39;e&#39;, &#39;g&#39;, &#39;e&#39;, &#39;r&#39;)</div><div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>&#160;    RAPIDJSON_STRING_(<a class="code" href="namespacerapidjson.html#ae79a4751c1c460ff0de5ecc07874f3e4">Type</a>, &#39;t&#39;, &#39;y&#39;, &#39;p&#39;, &#39;e&#39;)</div><div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>&#160;    RAPIDJSON_STRING_(Enum, &#39;e&#39;, &#39;n&#39;, &#39;u&#39;, &#39;m&#39;)</div><div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>&#160;    RAPIDJSON_STRING_(AllOf, &#39;a&#39;, &#39;l&#39;, &#39;l&#39;, &#39;O&#39;, &#39;f&#39;)</div><div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>&#160;    RAPIDJSON_STRING_(AnyOf, &#39;a&#39;, &#39;n&#39;, &#39;y&#39;, &#39;O&#39;, &#39;f&#39;)</div><div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>&#160;    RAPIDJSON_STRING_(OneOf, &#39;o&#39;, &#39;n&#39;, &#39;e&#39;, &#39;O&#39;, &#39;f&#39;)</div><div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>&#160;    RAPIDJSON_STRING_(Not, &#39;n&#39;, &#39;o&#39;, &#39;t&#39;)</div><div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>&#160;    RAPIDJSON_STRING_(Properties, &#39;p&#39;, &#39;r&#39;, &#39;o&#39;, &#39;p&#39;, &#39;e&#39;, &#39;r&#39;, &#39;t&#39;, &#39;i&#39;, &#39;e&#39;, &#39;s&#39;)</div><div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>&#160;    RAPIDJSON_STRING_(Required, &#39;r&#39;, &#39;e&#39;, &#39;q&#39;, &#39;u&#39;, &#39;i&#39;, &#39;r&#39;, &#39;e&#39;, &#39;d&#39;)</div><div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>&#160;    RAPIDJSON_STRING_(Dependencies, &#39;d&#39;, &#39;e&#39;, &#39;p&#39;, &#39;e&#39;, &#39;n&#39;, &#39;d&#39;, &#39;e&#39;, &#39;n&#39;, &#39;c&#39;, &#39;i&#39;, &#39;e&#39;, &#39;s&#39;)</div><div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>&#160;    RAPIDJSON_STRING_(PatternProperties, &#39;p&#39;, &#39;a&#39;, &#39;t&#39;, &#39;t&#39;, &#39;e&#39;, &#39;r&#39;, &#39;n&#39;, &#39;P&#39;, &#39;r&#39;, &#39;o&#39;, &#39;p&#39;, &#39;e&#39;, &#39;r&#39;, &#39;t&#39;, &#39;i&#39;, &#39;e&#39;, &#39;s&#39;)</div><div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>&#160;    RAPIDJSON_STRING_(AdditionalProperties, &#39;a&#39;, &#39;d&#39;, &#39;d&#39;, &#39;i&#39;, &#39;t&#39;, &#39;i&#39;, &#39;o&#39;, &#39;n&#39;, &#39;a&#39;, &#39;l&#39;, &#39;P&#39;, &#39;r&#39;, &#39;o&#39;, &#39;p&#39;, &#39;e&#39;, &#39;r&#39;, &#39;t&#39;, &#39;i&#39;, &#39;e&#39;, &#39;s&#39;)</div><div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>&#160;    RAPIDJSON_STRING_(MinProperties, &#39;m&#39;, &#39;i&#39;, &#39;n&#39;, &#39;P&#39;, &#39;r&#39;, &#39;o&#39;, &#39;p&#39;, &#39;e&#39;, &#39;r&#39;, &#39;t&#39;, &#39;i&#39;, &#39;e&#39;, &#39;s&#39;)</div><div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>&#160;    RAPIDJSON_STRING_(MaxProperties, &#39;m&#39;, &#39;a&#39;, &#39;x&#39;, &#39;P&#39;, &#39;r&#39;, &#39;o&#39;, &#39;p&#39;, &#39;e&#39;, &#39;r&#39;, &#39;t&#39;, &#39;i&#39;, &#39;e&#39;, &#39;s&#39;)</div><div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>&#160;    RAPIDJSON_STRING_(Items, &#39;i&#39;, &#39;t&#39;, &#39;e&#39;, &#39;m&#39;, &#39;s&#39;)</div><div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>&#160;    RAPIDJSON_STRING_(MinItems, &#39;m&#39;, &#39;i&#39;, &#39;n&#39;, &#39;I&#39;, &#39;t&#39;, &#39;e&#39;, &#39;m&#39;, &#39;s&#39;)</div><div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>&#160;    RAPIDJSON_STRING_(MaxItems, &#39;m&#39;, &#39;a&#39;, &#39;x&#39;, &#39;I&#39;, &#39;t&#39;, &#39;e&#39;, &#39;m&#39;, &#39;s&#39;)</div><div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>&#160;    RAPIDJSON_STRING_(AdditionalItems, &#39;a&#39;, &#39;d&#39;, &#39;d&#39;, &#39;i&#39;, &#39;t&#39;, &#39;i&#39;, &#39;o&#39;, &#39;n&#39;, &#39;a&#39;, &#39;l&#39;, &#39;I&#39;, &#39;t&#39;, &#39;e&#39;, &#39;m&#39;, &#39;s&#39;)</div><div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>&#160;    RAPIDJSON_STRING_(UniqueItems, &#39;u&#39;, &#39;n&#39;, &#39;i&#39;, &#39;q&#39;, &#39;u&#39;, &#39;e&#39;, &#39;I&#39;, &#39;t&#39;, &#39;e&#39;, &#39;m&#39;, &#39;s&#39;)</div><div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>&#160;    RAPIDJSON_STRING_(MinLength, &#39;m&#39;, &#39;i&#39;, &#39;n&#39;, &#39;L&#39;, &#39;e&#39;, &#39;n&#39;, &#39;g&#39;, &#39;t&#39;, &#39;h&#39;)</div><div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>&#160;    RAPIDJSON_STRING_(MaxLength, &#39;m&#39;, &#39;a&#39;, &#39;x&#39;, &#39;L&#39;, &#39;e&#39;, &#39;n&#39;, &#39;g&#39;, &#39;t&#39;, &#39;h&#39;)</div><div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>&#160;    RAPIDJSON_STRING_(Pattern, &#39;p&#39;, &#39;a&#39;, &#39;t&#39;, &#39;t&#39;, &#39;e&#39;, &#39;r&#39;, &#39;n&#39;)</div><div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>&#160;    RAPIDJSON_STRING_(Minimum, &#39;m&#39;, &#39;i&#39;, &#39;n&#39;, &#39;i&#39;, &#39;m&#39;, &#39;u&#39;, &#39;m&#39;)</div><div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>&#160;    RAPIDJSON_STRING_(Maximum, &#39;m&#39;, &#39;a&#39;, &#39;x&#39;, &#39;i&#39;, &#39;m&#39;, &#39;u&#39;, &#39;m&#39;)</div><div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>&#160;    RAPIDJSON_STRING_(ExclusiveMinimum, &#39;e&#39;, &#39;x&#39;, &#39;c&#39;, &#39;l&#39;, &#39;u&#39;, &#39;s&#39;, &#39;i&#39;, &#39;v&#39;, &#39;e&#39;, &#39;M&#39;, &#39;i&#39;, &#39;n&#39;, &#39;i&#39;, &#39;m&#39;, &#39;u&#39;, &#39;m&#39;)</div><div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>&#160;    RAPIDJSON_STRING_(ExclusiveMaximum, &#39;e&#39;, &#39;x&#39;, &#39;c&#39;, &#39;l&#39;, &#39;u&#39;, &#39;s&#39;, &#39;i&#39;, &#39;v&#39;, &#39;e&#39;, &#39;M&#39;, &#39;a&#39;, &#39;x&#39;, &#39;i&#39;, &#39;m&#39;, &#39;u&#39;, &#39;m&#39;)</div><div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>&#160;    RAPIDJSON_STRING_(MultipleOf, &#39;m&#39;, &#39;u&#39;, &#39;l&#39;, &#39;t&#39;, &#39;i&#39;, &#39;p&#39;, &#39;l&#39;, &#39;e&#39;, &#39;O&#39;, &#39;f&#39;)</div><div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>&#160;    RAPIDJSON_STRING_(DefaultValue, &#39;d&#39;, &#39;e&#39;, &#39;f&#39;, &#39;a&#39;, &#39;u&#39;, &#39;l&#39;, &#39;t&#39;)</div><div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>&#160;</div><div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>&#160;<span class="preprocessor">#undef RAPIDJSON_STRING_</span></div><div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>&#160;</div><div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>&#160;    <span class="keyword">enum</span> SchemaValueType {</div><div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>&#160;        kNullSchemaType,</div><div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>&#160;        kBooleanSchemaType,</div><div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>&#160;        kObjectSchemaType,</div><div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>&#160;        kArraySchemaType,</div><div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>&#160;        kStringSchemaType,</div><div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>&#160;        kNumberSchemaType,</div><div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>&#160;        kIntegerSchemaType,</div><div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>&#160;        kTotalSchemaType</div><div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>&#160;    };</div><div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>&#160;</div><div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>&#160;<span class="preprocessor">#if RAPIDJSON_SCHEMA_USE_INTERNALREGEX</span></div><div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>&#160;        <span class="keyword">typedef</span> internal::GenericRegex&lt;EncodingType, AllocatorType&gt; RegexType;</div><div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>&#160;<span class="preprocessor">#elif RAPIDJSON_SCHEMA_USE_STDREGEX</span></div><div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>&#160;        <span class="keyword">typedef</span> std::basic_regex&lt;Ch&gt; RegexType;</div><div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>&#160;        <span class="keyword">typedef</span> <span class="keywordtype">char</span> RegexType;</div><div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>&#160;</div><div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>&#160;    <span class="keyword">struct </span>SchemaArray {</div><div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>&#160;        SchemaArray() : schemas(), count() {}</div><div class="line"><a name="l01083"></a><span class="lineno"> 1083</span>&#160;        ~SchemaArray() { AllocatorType::Free(schemas); }</div><div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>&#160;        <span class="keyword">const</span> SchemaType** schemas;</div><div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>&#160;        <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> begin; <span class="comment">// begin index of context.validators</span></div><div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>&#160;        <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> count;</div><div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>&#160;    };</div><div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>&#160;</div><div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>&#160;    <span class="keyword">template</span> &lt;<span class="keyword">typename</span> V1, <span class="keyword">typename</span> V2&gt;</div><div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>&#160;    <span class="keywordtype">void</span> AddUniqueElement(V1&amp; a, <span class="keyword">const</span> V2&amp; v) {</div><div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>&#160;        <span class="keywordflow">for</span> (<span class="keyword">typename</span> V1::ConstValueIterator itr = a.Begin(); itr != a.End(); ++itr)</div><div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>&#160;            <span class="keywordflow">if</span> (*itr == v)</div><div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>&#160;                <span class="keywordflow">return</span>;</div><div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>&#160;        V1 c(v, *allocator_);</div><div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>&#160;        a.PushBack(c, *allocator_);</div><div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>&#160;    }</div><div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>&#160;</div><div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>&#160;    <span class="keyword">static</span> <span class="keyword">const</span> ValueType* GetMember(<span class="keyword">const</span> ValueType&amp; value, <span class="keyword">const</span> ValueType&amp; name) {</div><div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>&#160;        <span class="keyword">typename</span> ValueType::ConstMemberIterator itr = value.FindMember(name);</div><div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>&#160;        <span class="keywordflow">return</span> itr != value.MemberEnd() ? &amp;(itr-&gt;value) : 0;</div><div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>&#160;    }</div><div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>&#160;</div><div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>&#160;    <span class="keyword">static</span> <span class="keywordtype">void</span> AssignIfExist(<span class="keywordtype">bool</span>&amp; out, <span class="keyword">const</span> ValueType&amp; value, <span class="keyword">const</span> ValueType&amp; name) {</div><div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>&#160;        <span class="keywordflow">if</span> (<span class="keyword">const</span> ValueType* v = GetMember(value, name))</div><div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>&#160;            <span class="keywordflow">if</span> (v-&gt;IsBool())</div><div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>&#160;                out = v-&gt;GetBool();</div><div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>&#160;    }</div><div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>&#160;</div><div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>&#160;    <span class="keyword">static</span> <span class="keywordtype">void</span> AssignIfExist(<a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a>&amp; out, <span class="keyword">const</span> ValueType&amp; value, <span class="keyword">const</span> ValueType&amp; name) {</div><div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>&#160;        <span class="keywordflow">if</span> (<span class="keyword">const</span> ValueType* v = GetMember(value, name))</div><div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>&#160;            <span class="keywordflow">if</span> (v-&gt;IsUint64() &amp;&amp; v-&gt;GetUint64() &lt;= <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a>(~0))</div><div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>&#160;                out = static_cast&lt;SizeType&gt;(v-&gt;GetUint64());</div><div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>&#160;    }</div><div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>&#160;</div><div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>&#160;    <span class="keywordtype">void</span> AssignIfExist(SchemaArray&amp; out, SchemaDocumentType&amp; schemaDocument, <span class="keyword">const</span> PointerType&amp; p, <span class="keyword">const</span> ValueType&amp; value, <span class="keyword">const</span> ValueType&amp; name, <span class="keyword">const</span> ValueType&amp; document) {</div><div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>&#160;        <span class="keywordflow">if</span> (<span class="keyword">const</span> ValueType* v = GetMember(value, name)) {</div><div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>&#160;            <span class="keywordflow">if</span> (v-&gt;IsArray() &amp;&amp; v-&gt;Size() &gt; 0) {</div><div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>&#160;                PointerType q = p.Append(name, allocator_);</div><div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>&#160;                out.count = v-&gt;Size();</div><div class="line"><a name="l01120"></a><span class="lineno"> 1120</span>&#160;                out.schemas = <span class="keyword">static_cast&lt;</span><span class="keyword">const </span>Schema**<span class="keyword">&gt;</span>(allocator_-&gt;Malloc(out.count * <span class="keyword">sizeof</span>(<span class="keyword">const</span> Schema*)));</div><div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>&#160;                memset(out.schemas, 0, <span class="keyword">sizeof</span>(Schema*)* out.count);</div><div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>&#160;                <span class="keywordflow">for</span> (<a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> i = 0; i &lt; out.count; i++)</div><div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>&#160;                    schemaDocument.CreateSchema(&amp;out.schemas[i], q.Append(i, allocator_), (*v)[i], document);</div><div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>&#160;                out.begin = validatorCount_;</div><div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>&#160;                validatorCount_ += out.count;</div><div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>&#160;            }</div><div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>&#160;        }</div><div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>&#160;    }</div><div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>&#160;</div><div class="line"><a name="l01130"></a><span class="lineno"> 1130</span>&#160;<span class="preprocessor">#if RAPIDJSON_SCHEMA_USE_INTERNALREGEX</span></div><div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>&#160;    <span class="keyword">template</span> &lt;<span class="keyword">typename</span> ValueType&gt;</div><div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>&#160;    RegexType* CreatePattern(<span class="keyword">const</span> ValueType&amp; value) {</div><div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>&#160;        <span class="keywordflow">if</span> (value.IsString()) {</div><div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>&#160;            RegexType* r = <span class="keyword">new</span> (allocator_-&gt;Malloc(<span class="keyword">sizeof</span>(RegexType))) RegexType(value.GetString(), allocator_);</div><div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>&#160;            <span class="keywordflow">if</span> (!r-&gt;IsValid()) {</div><div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>&#160;                r-&gt;~RegexType();</div><div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>&#160;                AllocatorType::Free(r);</div><div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>&#160;                r = 0;</div><div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>&#160;            }</div><div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>&#160;            <span class="keywordflow">return</span> r;</div><div class="line"><a name="l01141"></a><span class="lineno"> 1141</span>&#160;        }</div><div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>&#160;        <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>&#160;    }</div><div class="line"><a name="l01144"></a><span class="lineno"> 1144</span>&#160;</div><div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>&#160;    <span class="keyword">static</span> <span class="keywordtype">bool</span> IsPatternMatch(<span class="keyword">const</span> RegexType* pattern, <span class="keyword">const</span> Ch *str, <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a>) {</div><div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>&#160;        GenericRegexSearch&lt;RegexType&gt; rs(*pattern);</div><div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>&#160;        <span class="keywordflow">return</span> rs.Search(str);</div><div class="line"><a name="l01148"></a><span class="lineno"> 1148</span>&#160;    }</div><div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>&#160;<span class="preprocessor">#elif RAPIDJSON_SCHEMA_USE_STDREGEX</span></div><div class="line"><a name="l01150"></a><span class="lineno"> 1150</span>&#160;    <span class="keyword">template</span> &lt;<span class="keyword">typename</span> ValueType&gt;</div><div class="line"><a name="l01151"></a><span class="lineno"> 1151</span>&#160;    RegexType* CreatePattern(<span class="keyword">const</span> ValueType&amp; value) {</div><div class="line"><a name="l01152"></a><span class="lineno"> 1152</span>&#160;        <span class="keywordflow">if</span> (value.IsString())</div><div class="line"><a name="l01153"></a><span class="lineno"> 1153</span>&#160;            <span class="keywordflow">try</span> {</div><div class="line"><a name="l01154"></a><span class="lineno"> 1154</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">new</span> (allocator_-&gt;Malloc(<span class="keyword">sizeof</span>(RegexType))) RegexType(value.GetString(), std::size_t(value.GetStringLength()), std::regex_constants::ECMAScript);</div><div class="line"><a name="l01155"></a><span class="lineno"> 1155</span>&#160;            }</div><div class="line"><a name="l01156"></a><span class="lineno"> 1156</span>&#160;            <span class="keywordflow">catch</span> (<span class="keyword">const</span> std::regex_error&amp;) {</div><div class="line"><a name="l01157"></a><span class="lineno"> 1157</span>&#160;            }</div><div class="line"><a name="l01158"></a><span class="lineno"> 1158</span>&#160;        <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>&#160;    }</div><div class="line"><a name="l01160"></a><span class="lineno"> 1160</span>&#160;</div><div class="line"><a name="l01161"></a><span class="lineno"> 1161</span>&#160;    <span class="keyword">static</span> <span class="keywordtype">bool</span> IsPatternMatch(<span class="keyword">const</span> RegexType* pattern, <span class="keyword">const</span> Ch *str, <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> length) {</div><div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>&#160;        std::match_results&lt;const Ch*&gt; r;</div><div class="line"><a name="l01163"></a><span class="lineno"> 1163</span>&#160;        <span class="keywordflow">return</span> std::regex_search(str, str + length, r, *pattern);</div><div class="line"><a name="l01164"></a><span class="lineno"> 1164</span>&#160;    }</div><div class="line"><a name="l01165"></a><span class="lineno"> 1165</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l01166"></a><span class="lineno"> 1166</span>&#160;    <span class="keyword">template</span> &lt;<span class="keyword">typename</span> ValueType&gt;</div><div class="line"><a name="l01167"></a><span class="lineno"> 1167</span>&#160;    RegexType* CreatePattern(<span class="keyword">const</span> ValueType&amp;) { <span class="keywordflow">return</span> 0; }</div><div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>&#160;</div><div class="line"><a name="l01169"></a><span class="lineno"> 1169</span>&#160;    <span class="keyword">static</span> <span class="keywordtype">bool</span> IsPatternMatch(<span class="keyword">const</span> RegexType*, <span class="keyword">const</span> Ch *, <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a>) { <span class="keywordflow">return</span> <span class="keyword">true</span>; }</div><div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>&#160;<span class="preprocessor">#endif // RAPIDJSON_SCHEMA_USE_STDREGEX</span></div><div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>&#160;</div><div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>&#160;    <span class="keywordtype">void</span> AddType(<span class="keyword">const</span> ValueType&amp; type) {</div><div class="line"><a name="l01173"></a><span class="lineno"> 1173</span>&#160;        <span class="keywordflow">if</span>      (type == GetNullString()   ) type_ |= 1 &lt;&lt; kNullSchemaType;</div><div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span> (type == GetBooleanString()) type_ |= 1 &lt;&lt; kBooleanSchemaType;</div><div class="line"><a name="l01175"></a><span class="lineno"> 1175</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span> (type == GetObjectString() ) type_ |= 1 &lt;&lt; kObjectSchemaType;</div><div class="line"><a name="l01176"></a><span class="lineno"> 1176</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span> (type == GetArrayString()  ) type_ |= 1 &lt;&lt; kArraySchemaType;</div><div class="line"><a name="l01177"></a><span class="lineno"> 1177</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span> (type == GetStringString() ) type_ |= 1 &lt;&lt; kStringSchemaType;</div><div class="line"><a name="l01178"></a><span class="lineno"> 1178</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span> (type == GetIntegerString()) type_ |= 1 &lt;&lt; kIntegerSchemaType;</div><div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span> (type == GetNumberString() ) type_ |= (1 &lt;&lt; kNumberSchemaType) | (1 &lt;&lt; kIntegerSchemaType);</div><div class="line"><a name="l01180"></a><span class="lineno"> 1180</span>&#160;    }</div><div class="line"><a name="l01181"></a><span class="lineno"> 1181</span>&#160;</div><div class="line"><a name="l01182"></a><span class="lineno"> 1182</span>&#160;    <span class="keywordtype">bool</span> CreateParallelValidator(Context&amp; context)<span class="keyword"> const </span>{</div><div class="line"><a name="l01183"></a><span class="lineno"> 1183</span>&#160;        <span class="keywordflow">if</span> (enum_ || context.arrayUniqueness)</div><div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>&#160;            context.hasher = context.factory.CreateHasher();</div><div class="line"><a name="l01185"></a><span class="lineno"> 1185</span>&#160;</div><div class="line"><a name="l01186"></a><span class="lineno"> 1186</span>&#160;        <span class="keywordflow">if</span> (validatorCount_) {</div><div class="line"><a name="l01187"></a><span class="lineno"> 1187</span>&#160;            <a class="code" href="group___r_a_p_i_d_j_s_o_n___c_o_n_f_i_g.html#gabeba18d612187bad2ac62aed9276d47c">RAPIDJSON_ASSERT</a>(context.validators == 0);</div><div class="line"><a name="l01188"></a><span class="lineno"> 1188</span>&#160;            context.validators = <span class="keyword">static_cast&lt;</span>ISchemaValidator**<span class="keyword">&gt;</span>(context.factory.MallocState(<span class="keyword">sizeof</span>(ISchemaValidator*) * validatorCount_));</div><div class="line"><a name="l01189"></a><span class="lineno"> 1189</span>&#160;            context.validatorCount = validatorCount_;</div><div class="line"><a name="l01190"></a><span class="lineno"> 1190</span>&#160;</div><div class="line"><a name="l01191"></a><span class="lineno"> 1191</span>&#160;            <span class="keywordflow">if</span> (allOf_.schemas)</div><div class="line"><a name="l01192"></a><span class="lineno"> 1192</span>&#160;                CreateSchemaValidators(context, allOf_);</div><div class="line"><a name="l01193"></a><span class="lineno"> 1193</span>&#160;</div><div class="line"><a name="l01194"></a><span class="lineno"> 1194</span>&#160;            <span class="keywordflow">if</span> (anyOf_.schemas)</div><div class="line"><a name="l01195"></a><span class="lineno"> 1195</span>&#160;                CreateSchemaValidators(context, anyOf_);</div><div class="line"><a name="l01196"></a><span class="lineno"> 1196</span>&#160;            </div><div class="line"><a name="l01197"></a><span class="lineno"> 1197</span>&#160;            <span class="keywordflow">if</span> (oneOf_.schemas)</div><div class="line"><a name="l01198"></a><span class="lineno"> 1198</span>&#160;                CreateSchemaValidators(context, oneOf_);</div><div class="line"><a name="l01199"></a><span class="lineno"> 1199</span>&#160;            </div><div class="line"><a name="l01200"></a><span class="lineno"> 1200</span>&#160;            <span class="keywordflow">if</span> (not_)</div><div class="line"><a name="l01201"></a><span class="lineno"> 1201</span>&#160;                context.validators[notValidatorIndex_] = context.factory.CreateSchemaValidator(*not_);</div><div class="line"><a name="l01202"></a><span class="lineno"> 1202</span>&#160;            </div><div class="line"><a name="l01203"></a><span class="lineno"> 1203</span>&#160;            <span class="keywordflow">if</span> (hasSchemaDependencies_) {</div><div class="line"><a name="l01204"></a><span class="lineno"> 1204</span>&#160;                <span class="keywordflow">for</span> (<a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> i = 0; i &lt; propertyCount_; i++)</div><div class="line"><a name="l01205"></a><span class="lineno"> 1205</span>&#160;                    <span class="keywordflow">if</span> (properties_[i].dependenciesSchema)</div><div class="line"><a name="l01206"></a><span class="lineno"> 1206</span>&#160;                        context.validators[properties_[i].dependenciesValidatorIndex] = context.factory.CreateSchemaValidator(*properties_[i].dependenciesSchema);</div><div class="line"><a name="l01207"></a><span class="lineno"> 1207</span>&#160;            }</div><div class="line"><a name="l01208"></a><span class="lineno"> 1208</span>&#160;        }</div><div class="line"><a name="l01209"></a><span class="lineno"> 1209</span>&#160;</div><div class="line"><a name="l01210"></a><span class="lineno"> 1210</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l01211"></a><span class="lineno"> 1211</span>&#160;    }</div><div class="line"><a name="l01212"></a><span class="lineno"> 1212</span>&#160;</div><div class="line"><a name="l01213"></a><span class="lineno"> 1213</span>&#160;    <span class="keywordtype">void</span> CreateSchemaValidators(Context&amp; context, <span class="keyword">const</span> SchemaArray&amp; schemas)<span class="keyword"> const </span>{</div><div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>&#160;        <span class="keywordflow">for</span> (<a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> i = 0; i &lt; schemas.count; i++)</div><div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>&#160;            context.validators[schemas.begin + i] = context.factory.CreateSchemaValidator(*schemas.schemas[i]);</div><div class="line"><a name="l01216"></a><span class="lineno"> 1216</span>&#160;    }</div><div class="line"><a name="l01217"></a><span class="lineno"> 1217</span>&#160;</div><div class="line"><a name="l01218"></a><span class="lineno"> 1218</span>&#160;    <span class="comment">// O(n)</span></div><div class="line"><a name="l01219"></a><span class="lineno"> 1219</span>&#160;    <span class="keywordtype">bool</span> FindPropertyIndex(<span class="keyword">const</span> ValueType&amp; name, <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a>* outIndex)<span class="keyword"> const </span>{</div><div class="line"><a name="l01220"></a><span class="lineno"> 1220</span>&#160;        <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> len = name.GetStringLength();</div><div class="line"><a name="l01221"></a><span class="lineno"> 1221</span>&#160;        <span class="keyword">const</span> Ch* str = name.GetString();</div><div class="line"><a name="l01222"></a><span class="lineno"> 1222</span>&#160;        <span class="keywordflow">for</span> (<a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> index = 0; index &lt; propertyCount_; index++)</div><div class="line"><a name="l01223"></a><span class="lineno"> 1223</span>&#160;            <span class="keywordflow">if</span> (properties_[index].name.GetStringLength() == len &amp;&amp; </div><div class="line"><a name="l01224"></a><span class="lineno"> 1224</span>&#160;                (std::memcmp(properties_[index].name.GetString(), str, <span class="keyword">sizeof</span>(Ch) * len) == 0))</div><div class="line"><a name="l01225"></a><span class="lineno"> 1225</span>&#160;            {</div><div class="line"><a name="l01226"></a><span class="lineno"> 1226</span>&#160;                *outIndex = index;</div><div class="line"><a name="l01227"></a><span class="lineno"> 1227</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l01228"></a><span class="lineno"> 1228</span>&#160;            }</div><div class="line"><a name="l01229"></a><span class="lineno"> 1229</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l01230"></a><span class="lineno"> 1230</span>&#160;    }</div><div class="line"><a name="l01231"></a><span class="lineno"> 1231</span>&#160;</div><div class="line"><a name="l01232"></a><span class="lineno"> 1232</span>&#160;    <span class="keywordtype">bool</span> CheckInt(Context&amp; context, int64_t i)<span class="keyword"> const </span>{</div><div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>&#160;        <span class="keywordflow">if</span> (!(type_ &amp; ((1 &lt;&lt; kIntegerSchemaType) | (1 &lt;&lt; kNumberSchemaType)))) {</div><div class="line"><a name="l01234"></a><span class="lineno"> 1234</span>&#160;            DisallowedType(context, GetIntegerString());</div><div class="line"><a name="l01235"></a><span class="lineno"> 1235</span>&#160;            RAPIDJSON_INVALID_KEYWORD_RETURN(GetTypeString());</div><div class="line"><a name="l01236"></a><span class="lineno"> 1236</span>&#160;        }</div><div class="line"><a name="l01237"></a><span class="lineno"> 1237</span>&#160;</div><div class="line"><a name="l01238"></a><span class="lineno"> 1238</span>&#160;        <span class="keywordflow">if</span> (!minimum_.IsNull()) {</div><div class="line"><a name="l01239"></a><span class="lineno"> 1239</span>&#160;            <span class="keywordflow">if</span> (minimum_.IsInt64()) {</div><div class="line"><a name="l01240"></a><span class="lineno"> 1240</span>&#160;                <span class="keywordflow">if</span> (exclusiveMinimum_ ? i &lt;= minimum_.GetInt64() : i &lt; minimum_.GetInt64()) {</div><div class="line"><a name="l01241"></a><span class="lineno"> 1241</span>&#160;                    context.error_handler.BelowMinimum(i, minimum_, exclusiveMinimum_);</div><div class="line"><a name="l01242"></a><span class="lineno"> 1242</span>&#160;                    RAPIDJSON_INVALID_KEYWORD_RETURN(GetMinimumString());</div><div class="line"><a name="l01243"></a><span class="lineno"> 1243</span>&#160;                }</div><div class="line"><a name="l01244"></a><span class="lineno"> 1244</span>&#160;            }</div><div class="line"><a name="l01245"></a><span class="lineno"> 1245</span>&#160;            <span class="keywordflow">else</span> <span class="keywordflow">if</span> (minimum_.IsUint64()) {</div><div class="line"><a name="l01246"></a><span class="lineno"> 1246</span>&#160;                context.error_handler.BelowMinimum(i, minimum_, exclusiveMinimum_);</div><div class="line"><a name="l01247"></a><span class="lineno"> 1247</span>&#160;                RAPIDJSON_INVALID_KEYWORD_RETURN(GetMinimumString()); <span class="comment">// i &lt;= max(int64_t) &lt; minimum.GetUint64()</span></div><div class="line"><a name="l01248"></a><span class="lineno"> 1248</span>&#160;            }</div><div class="line"><a name="l01249"></a><span class="lineno"> 1249</span>&#160;            <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!CheckDoubleMinimum(context, static_cast&lt;double&gt;(i)))</div><div class="line"><a name="l01250"></a><span class="lineno"> 1250</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l01251"></a><span class="lineno"> 1251</span>&#160;        }</div><div class="line"><a name="l01252"></a><span class="lineno"> 1252</span>&#160;</div><div class="line"><a name="l01253"></a><span class="lineno"> 1253</span>&#160;        <span class="keywordflow">if</span> (!maximum_.IsNull()) {</div><div class="line"><a name="l01254"></a><span class="lineno"> 1254</span>&#160;            <span class="keywordflow">if</span> (maximum_.IsInt64()) {</div><div class="line"><a name="l01255"></a><span class="lineno"> 1255</span>&#160;                <span class="keywordflow">if</span> (exclusiveMaximum_ ? i &gt;= maximum_.GetInt64() : i &gt; maximum_.GetInt64()) {</div><div class="line"><a name="l01256"></a><span class="lineno"> 1256</span>&#160;                    context.error_handler.AboveMaximum(i, maximum_, exclusiveMaximum_);</div><div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>&#160;                    RAPIDJSON_INVALID_KEYWORD_RETURN(GetMaximumString());</div><div class="line"><a name="l01258"></a><span class="lineno"> 1258</span>&#160;                }</div><div class="line"><a name="l01259"></a><span class="lineno"> 1259</span>&#160;            }</div><div class="line"><a name="l01260"></a><span class="lineno"> 1260</span>&#160;            <span class="keywordflow">else</span> <span class="keywordflow">if</span> (maximum_.IsUint64()) { }</div><div class="line"><a name="l01261"></a><span class="lineno"> 1261</span>&#160;                <span class="comment">/* do nothing */</span> <span class="comment">// i &lt;= max(int64_t) &lt; maximum_.GetUint64()</span></div><div class="line"><a name="l01262"></a><span class="lineno"> 1262</span>&#160;            <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!CheckDoubleMaximum(context, static_cast&lt;double&gt;(i)))</div><div class="line"><a name="l01263"></a><span class="lineno"> 1263</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l01264"></a><span class="lineno"> 1264</span>&#160;        }</div><div class="line"><a name="l01265"></a><span class="lineno"> 1265</span>&#160;</div><div class="line"><a name="l01266"></a><span class="lineno"> 1266</span>&#160;        <span class="keywordflow">if</span> (!multipleOf_.IsNull()) {</div><div class="line"><a name="l01267"></a><span class="lineno"> 1267</span>&#160;            <span class="keywordflow">if</span> (multipleOf_.IsUint64()) {</div><div class="line"><a name="l01268"></a><span class="lineno"> 1268</span>&#160;                <span class="keywordflow">if</span> (static_cast&lt;uint64_t&gt;(i &gt;= 0 ? i : -i) % multipleOf_.GetUint64() != 0) {</div><div class="line"><a name="l01269"></a><span class="lineno"> 1269</span>&#160;                    context.error_handler.NotMultipleOf(i, multipleOf_);</div><div class="line"><a name="l01270"></a><span class="lineno"> 1270</span>&#160;                    RAPIDJSON_INVALID_KEYWORD_RETURN(GetMultipleOfString());</div><div class="line"><a name="l01271"></a><span class="lineno"> 1271</span>&#160;                }</div><div class="line"><a name="l01272"></a><span class="lineno"> 1272</span>&#160;            }</div><div class="line"><a name="l01273"></a><span class="lineno"> 1273</span>&#160;            <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!CheckDoubleMultipleOf(context, static_cast&lt;double&gt;(i)))</div><div class="line"><a name="l01274"></a><span class="lineno"> 1274</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l01275"></a><span class="lineno"> 1275</span>&#160;        }</div><div class="line"><a name="l01276"></a><span class="lineno"> 1276</span>&#160;</div><div class="line"><a name="l01277"></a><span class="lineno"> 1277</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l01278"></a><span class="lineno"> 1278</span>&#160;    }</div><div class="line"><a name="l01279"></a><span class="lineno"> 1279</span>&#160;</div><div class="line"><a name="l01280"></a><span class="lineno"> 1280</span>&#160;    <span class="keywordtype">bool</span> CheckUint(Context&amp; context, uint64_t i)<span class="keyword"> const </span>{</div><div class="line"><a name="l01281"></a><span class="lineno"> 1281</span>&#160;        <span class="keywordflow">if</span> (!(type_ &amp; ((1 &lt;&lt; kIntegerSchemaType) | (1 &lt;&lt; kNumberSchemaType)))) {</div><div class="line"><a name="l01282"></a><span class="lineno"> 1282</span>&#160;            DisallowedType(context, GetIntegerString());</div><div class="line"><a name="l01283"></a><span class="lineno"> 1283</span>&#160;            RAPIDJSON_INVALID_KEYWORD_RETURN(GetTypeString());</div><div class="line"><a name="l01284"></a><span class="lineno"> 1284</span>&#160;        }</div><div class="line"><a name="l01285"></a><span class="lineno"> 1285</span>&#160;</div><div class="line"><a name="l01286"></a><span class="lineno"> 1286</span>&#160;        <span class="keywordflow">if</span> (!minimum_.IsNull()) {</div><div class="line"><a name="l01287"></a><span class="lineno"> 1287</span>&#160;            <span class="keywordflow">if</span> (minimum_.IsUint64()) {</div><div class="line"><a name="l01288"></a><span class="lineno"> 1288</span>&#160;                <span class="keywordflow">if</span> (exclusiveMinimum_ ? i &lt;= minimum_.GetUint64() : i &lt; minimum_.GetUint64()) {</div><div class="line"><a name="l01289"></a><span class="lineno"> 1289</span>&#160;                    context.error_handler.BelowMinimum(i, minimum_, exclusiveMinimum_);</div><div class="line"><a name="l01290"></a><span class="lineno"> 1290</span>&#160;                    RAPIDJSON_INVALID_KEYWORD_RETURN(GetMinimumString());</div><div class="line"><a name="l01291"></a><span class="lineno"> 1291</span>&#160;                }</div><div class="line"><a name="l01292"></a><span class="lineno"> 1292</span>&#160;            }</div><div class="line"><a name="l01293"></a><span class="lineno"> 1293</span>&#160;            <span class="keywordflow">else</span> <span class="keywordflow">if</span> (minimum_.IsInt64())</div><div class="line"><a name="l01294"></a><span class="lineno"> 1294</span>&#160;                <span class="comment">/* do nothing */</span>; <span class="comment">// i &gt;= 0 &gt; minimum.Getint64()</span></div><div class="line"><a name="l01295"></a><span class="lineno"> 1295</span>&#160;            <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!CheckDoubleMinimum(context, static_cast&lt;double&gt;(i)))</div><div class="line"><a name="l01296"></a><span class="lineno"> 1296</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l01297"></a><span class="lineno"> 1297</span>&#160;        }</div><div class="line"><a name="l01298"></a><span class="lineno"> 1298</span>&#160;</div><div class="line"><a name="l01299"></a><span class="lineno"> 1299</span>&#160;        <span class="keywordflow">if</span> (!maximum_.IsNull()) {</div><div class="line"><a name="l01300"></a><span class="lineno"> 1300</span>&#160;            <span class="keywordflow">if</span> (maximum_.IsUint64()) {</div><div class="line"><a name="l01301"></a><span class="lineno"> 1301</span>&#160;                <span class="keywordflow">if</span> (exclusiveMaximum_ ? i &gt;= maximum_.GetUint64() : i &gt; maximum_.GetUint64()) {</div><div class="line"><a name="l01302"></a><span class="lineno"> 1302</span>&#160;                    context.error_handler.AboveMaximum(i, maximum_, exclusiveMaximum_);</div><div class="line"><a name="l01303"></a><span class="lineno"> 1303</span>&#160;                    RAPIDJSON_INVALID_KEYWORD_RETURN(GetMaximumString());</div><div class="line"><a name="l01304"></a><span class="lineno"> 1304</span>&#160;                }</div><div class="line"><a name="l01305"></a><span class="lineno"> 1305</span>&#160;            }</div><div class="line"><a name="l01306"></a><span class="lineno"> 1306</span>&#160;            <span class="keywordflow">else</span> <span class="keywordflow">if</span> (maximum_.IsInt64()) {</div><div class="line"><a name="l01307"></a><span class="lineno"> 1307</span>&#160;                context.error_handler.AboveMaximum(i, maximum_, exclusiveMaximum_);</div><div class="line"><a name="l01308"></a><span class="lineno"> 1308</span>&#160;                RAPIDJSON_INVALID_KEYWORD_RETURN(GetMaximumString()); <span class="comment">// i &gt;= 0 &gt; maximum_</span></div><div class="line"><a name="l01309"></a><span class="lineno"> 1309</span>&#160;            }</div><div class="line"><a name="l01310"></a><span class="lineno"> 1310</span>&#160;            <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!CheckDoubleMaximum(context, static_cast&lt;double&gt;(i)))</div><div class="line"><a name="l01311"></a><span class="lineno"> 1311</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l01312"></a><span class="lineno"> 1312</span>&#160;        }</div><div class="line"><a name="l01313"></a><span class="lineno"> 1313</span>&#160;</div><div class="line"><a name="l01314"></a><span class="lineno"> 1314</span>&#160;        <span class="keywordflow">if</span> (!multipleOf_.IsNull()) {</div><div class="line"><a name="l01315"></a><span class="lineno"> 1315</span>&#160;            <span class="keywordflow">if</span> (multipleOf_.IsUint64()) {</div><div class="line"><a name="l01316"></a><span class="lineno"> 1316</span>&#160;                <span class="keywordflow">if</span> (i % multipleOf_.GetUint64() != 0) {</div><div class="line"><a name="l01317"></a><span class="lineno"> 1317</span>&#160;                    context.error_handler.NotMultipleOf(i, multipleOf_);</div><div class="line"><a name="l01318"></a><span class="lineno"> 1318</span>&#160;                    RAPIDJSON_INVALID_KEYWORD_RETURN(GetMultipleOfString());</div><div class="line"><a name="l01319"></a><span class="lineno"> 1319</span>&#160;                }</div><div class="line"><a name="l01320"></a><span class="lineno"> 1320</span>&#160;            }</div><div class="line"><a name="l01321"></a><span class="lineno"> 1321</span>&#160;            <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!CheckDoubleMultipleOf(context, static_cast&lt;double&gt;(i)))</div><div class="line"><a name="l01322"></a><span class="lineno"> 1322</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l01323"></a><span class="lineno"> 1323</span>&#160;        }</div><div class="line"><a name="l01324"></a><span class="lineno"> 1324</span>&#160;</div><div class="line"><a name="l01325"></a><span class="lineno"> 1325</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l01326"></a><span class="lineno"> 1326</span>&#160;    }</div><div class="line"><a name="l01327"></a><span class="lineno"> 1327</span>&#160;</div><div class="line"><a name="l01328"></a><span class="lineno"> 1328</span>&#160;    <span class="keywordtype">bool</span> CheckDoubleMinimum(Context&amp; context, <span class="keywordtype">double</span> d)<span class="keyword"> const </span>{</div><div class="line"><a name="l01329"></a><span class="lineno"> 1329</span>&#160;        <span class="keywordflow">if</span> (exclusiveMinimum_ ? d &lt;= minimum_.GetDouble() : d &lt; minimum_.GetDouble()) {</div><div class="line"><a name="l01330"></a><span class="lineno"> 1330</span>&#160;            context.error_handler.BelowMinimum(d, minimum_, exclusiveMinimum_);</div><div class="line"><a name="l01331"></a><span class="lineno"> 1331</span>&#160;            RAPIDJSON_INVALID_KEYWORD_RETURN(GetMinimumString());</div><div class="line"><a name="l01332"></a><span class="lineno"> 1332</span>&#160;        }</div><div class="line"><a name="l01333"></a><span class="lineno"> 1333</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l01334"></a><span class="lineno"> 1334</span>&#160;    }</div><div class="line"><a name="l01335"></a><span class="lineno"> 1335</span>&#160;</div><div class="line"><a name="l01336"></a><span class="lineno"> 1336</span>&#160;    <span class="keywordtype">bool</span> CheckDoubleMaximum(Context&amp; context, <span class="keywordtype">double</span> d)<span class="keyword"> const </span>{</div><div class="line"><a name="l01337"></a><span class="lineno"> 1337</span>&#160;        <span class="keywordflow">if</span> (exclusiveMaximum_ ? d &gt;= maximum_.GetDouble() : d &gt; maximum_.GetDouble()) {</div><div class="line"><a name="l01338"></a><span class="lineno"> 1338</span>&#160;            context.error_handler.AboveMaximum(d, maximum_, exclusiveMaximum_);</div><div class="line"><a name="l01339"></a><span class="lineno"> 1339</span>&#160;            RAPIDJSON_INVALID_KEYWORD_RETURN(GetMaximumString());</div><div class="line"><a name="l01340"></a><span class="lineno"> 1340</span>&#160;        }</div><div class="line"><a name="l01341"></a><span class="lineno"> 1341</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l01342"></a><span class="lineno"> 1342</span>&#160;    }</div><div class="line"><a name="l01343"></a><span class="lineno"> 1343</span>&#160;</div><div class="line"><a name="l01344"></a><span class="lineno"> 1344</span>&#160;    <span class="keywordtype">bool</span> CheckDoubleMultipleOf(Context&amp; context, <span class="keywordtype">double</span> d)<span class="keyword"> const </span>{</div><div class="line"><a name="l01345"></a><span class="lineno"> 1345</span>&#160;        <span class="keywordtype">double</span> a = std::abs(d), b = std::abs(multipleOf_.GetDouble());</div><div class="line"><a name="l01346"></a><span class="lineno"> 1346</span>&#160;        <span class="keywordtype">double</span> q = std::floor(a / b);</div><div class="line"><a name="l01347"></a><span class="lineno"> 1347</span>&#160;        <span class="keywordtype">double</span> r = a - q * b;</div><div class="line"><a name="l01348"></a><span class="lineno"> 1348</span>&#160;        <span class="keywordflow">if</span> (r &gt; 0.0) {</div><div class="line"><a name="l01349"></a><span class="lineno"> 1349</span>&#160;            context.error_handler.NotMultipleOf(d, multipleOf_);</div><div class="line"><a name="l01350"></a><span class="lineno"> 1350</span>&#160;            RAPIDJSON_INVALID_KEYWORD_RETURN(GetMultipleOfString());</div><div class="line"><a name="l01351"></a><span class="lineno"> 1351</span>&#160;        }</div><div class="line"><a name="l01352"></a><span class="lineno"> 1352</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l01353"></a><span class="lineno"> 1353</span>&#160;    }</div><div class="line"><a name="l01354"></a><span class="lineno"> 1354</span>&#160;</div><div class="line"><a name="l01355"></a><span class="lineno"> 1355</span>&#160;    <span class="keywordtype">void</span> DisallowedType(Context&amp; context, <span class="keyword">const</span> ValueType&amp; actualType)<span class="keyword"> const </span>{</div><div class="line"><a name="l01356"></a><span class="lineno"> 1356</span>&#160;        ErrorHandler&amp; eh = context.error_handler;</div><div class="line"><a name="l01357"></a><span class="lineno"> 1357</span>&#160;        eh.StartDisallowedType();</div><div class="line"><a name="l01358"></a><span class="lineno"> 1358</span>&#160;</div><div class="line"><a name="l01359"></a><span class="lineno"> 1359</span>&#160;        <span class="keywordflow">if</span> (type_ &amp; (1 &lt;&lt; kNullSchemaType)) eh.AddExpectedType(GetNullString());</div><div class="line"><a name="l01360"></a><span class="lineno"> 1360</span>&#160;        <span class="keywordflow">if</span> (type_ &amp; (1 &lt;&lt; kBooleanSchemaType)) eh.AddExpectedType(GetBooleanString());</div><div class="line"><a name="l01361"></a><span class="lineno"> 1361</span>&#160;        <span class="keywordflow">if</span> (type_ &amp; (1 &lt;&lt; kObjectSchemaType)) eh.AddExpectedType(GetObjectString());</div><div class="line"><a name="l01362"></a><span class="lineno"> 1362</span>&#160;        <span class="keywordflow">if</span> (type_ &amp; (1 &lt;&lt; kArraySchemaType)) eh.AddExpectedType(GetArrayString());</div><div class="line"><a name="l01363"></a><span class="lineno"> 1363</span>&#160;        <span class="keywordflow">if</span> (type_ &amp; (1 &lt;&lt; kStringSchemaType)) eh.AddExpectedType(GetStringString());</div><div class="line"><a name="l01364"></a><span class="lineno"> 1364</span>&#160;</div><div class="line"><a name="l01365"></a><span class="lineno"> 1365</span>&#160;        <span class="keywordflow">if</span> (type_ &amp; (1 &lt;&lt; kNumberSchemaType)) eh.AddExpectedType(GetNumberString());</div><div class="line"><a name="l01366"></a><span class="lineno"> 1366</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span> (type_ &amp; (1 &lt;&lt; kIntegerSchemaType)) eh.AddExpectedType(GetIntegerString());</div><div class="line"><a name="l01367"></a><span class="lineno"> 1367</span>&#160;</div><div class="line"><a name="l01368"></a><span class="lineno"> 1368</span>&#160;        eh.EndDisallowedType(actualType);</div><div class="line"><a name="l01369"></a><span class="lineno"> 1369</span>&#160;    }</div><div class="line"><a name="l01370"></a><span class="lineno"> 1370</span>&#160;</div><div class="line"><a name="l01371"></a><span class="lineno"> 1371</span>&#160;    <span class="keyword">struct </span>Property {</div><div class="line"><a name="l01372"></a><span class="lineno"> 1372</span>&#160;        Property() : schema(), dependenciesSchema(), dependenciesValidatorIndex(), dependencies(), required(false) {}</div><div class="line"><a name="l01373"></a><span class="lineno"> 1373</span>&#160;        ~Property() { AllocatorType::Free(dependencies); }</div><div class="line"><a name="l01374"></a><span class="lineno"> 1374</span>&#160;        SValue name;</div><div class="line"><a name="l01375"></a><span class="lineno"> 1375</span>&#160;        <span class="keyword">const</span> SchemaType* schema;</div><div class="line"><a name="l01376"></a><span class="lineno"> 1376</span>&#160;        <span class="keyword">const</span> SchemaType* dependenciesSchema;</div><div class="line"><a name="l01377"></a><span class="lineno"> 1377</span>&#160;        <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> dependenciesValidatorIndex;</div><div class="line"><a name="l01378"></a><span class="lineno"> 1378</span>&#160;        <span class="keywordtype">bool</span>* dependencies;</div><div class="line"><a name="l01379"></a><span class="lineno"> 1379</span>&#160;        <span class="keywordtype">bool</span> required;</div><div class="line"><a name="l01380"></a><span class="lineno"> 1380</span>&#160;    };</div><div class="line"><a name="l01381"></a><span class="lineno"> 1381</span>&#160;</div><div class="line"><a name="l01382"></a><span class="lineno"> 1382</span>&#160;    <span class="keyword">struct </span>PatternProperty {</div><div class="line"><a name="l01383"></a><span class="lineno"> 1383</span>&#160;        PatternProperty() : schema(), pattern() {}</div><div class="line"><a name="l01384"></a><span class="lineno"> 1384</span>&#160;        ~PatternProperty() { </div><div class="line"><a name="l01385"></a><span class="lineno"> 1385</span>&#160;            <span class="keywordflow">if</span> (pattern) {</div><div class="line"><a name="l01386"></a><span class="lineno"> 1386</span>&#160;                pattern-&gt;~RegexType();</div><div class="line"><a name="l01387"></a><span class="lineno"> 1387</span>&#160;                AllocatorType::Free(pattern);</div><div class="line"><a name="l01388"></a><span class="lineno"> 1388</span>&#160;            }</div><div class="line"><a name="l01389"></a><span class="lineno"> 1389</span>&#160;        }</div><div class="line"><a name="l01390"></a><span class="lineno"> 1390</span>&#160;        <span class="keyword">const</span> SchemaType* schema;</div><div class="line"><a name="l01391"></a><span class="lineno"> 1391</span>&#160;        RegexType* pattern;</div><div class="line"><a name="l01392"></a><span class="lineno"> 1392</span>&#160;    };</div><div class="line"><a name="l01393"></a><span class="lineno"> 1393</span>&#160;</div><div class="line"><a name="l01394"></a><span class="lineno"> 1394</span>&#160;    AllocatorType* allocator_;</div><div class="line"><a name="l01395"></a><span class="lineno"> 1395</span>&#160;    SValue uri_;</div><div class="line"><a name="l01396"></a><span class="lineno"> 1396</span>&#160;    PointerType pointer_;</div><div class="line"><a name="l01397"></a><span class="lineno"> 1397</span>&#160;    <span class="keyword">const</span> SchemaType* typeless_;</div><div class="line"><a name="l01398"></a><span class="lineno"> 1398</span>&#160;    uint64_t* enum_;</div><div class="line"><a name="l01399"></a><span class="lineno"> 1399</span>&#160;    <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> enumCount_;</div><div class="line"><a name="l01400"></a><span class="lineno"> 1400</span>&#160;    SchemaArray allOf_;</div><div class="line"><a name="l01401"></a><span class="lineno"> 1401</span>&#160;    SchemaArray anyOf_;</div><div class="line"><a name="l01402"></a><span class="lineno"> 1402</span>&#160;    SchemaArray oneOf_;</div><div class="line"><a name="l01403"></a><span class="lineno"> 1403</span>&#160;    <span class="keyword">const</span> SchemaType* not_;</div><div class="line"><a name="l01404"></a><span class="lineno"> 1404</span>&#160;    <span class="keywordtype">unsigned</span> type_; <span class="comment">// bitmask of kSchemaType</span></div><div class="line"><a name="l01405"></a><span class="lineno"> 1405</span>&#160;    <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> validatorCount_;</div><div class="line"><a name="l01406"></a><span class="lineno"> 1406</span>&#160;    <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> notValidatorIndex_;</div><div class="line"><a name="l01407"></a><span class="lineno"> 1407</span>&#160;</div><div class="line"><a name="l01408"></a><span class="lineno"> 1408</span>&#160;    Property* properties_;</div><div class="line"><a name="l01409"></a><span class="lineno"> 1409</span>&#160;    <span class="keyword">const</span> SchemaType* additionalPropertiesSchema_;</div><div class="line"><a name="l01410"></a><span class="lineno"> 1410</span>&#160;    PatternProperty* patternProperties_;</div><div class="line"><a name="l01411"></a><span class="lineno"> 1411</span>&#160;    <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> patternPropertyCount_;</div><div class="line"><a name="l01412"></a><span class="lineno"> 1412</span>&#160;    <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> propertyCount_;</div><div class="line"><a name="l01413"></a><span class="lineno"> 1413</span>&#160;    <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> minProperties_;</div><div class="line"><a name="l01414"></a><span class="lineno"> 1414</span>&#160;    <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> maxProperties_;</div><div class="line"><a name="l01415"></a><span class="lineno"> 1415</span>&#160;    <span class="keywordtype">bool</span> additionalProperties_;</div><div class="line"><a name="l01416"></a><span class="lineno"> 1416</span>&#160;    <span class="keywordtype">bool</span> hasDependencies_;</div><div class="line"><a name="l01417"></a><span class="lineno"> 1417</span>&#160;    <span class="keywordtype">bool</span> hasRequired_;</div><div class="line"><a name="l01418"></a><span class="lineno"> 1418</span>&#160;    <span class="keywordtype">bool</span> hasSchemaDependencies_;</div><div class="line"><a name="l01419"></a><span class="lineno"> 1419</span>&#160;</div><div class="line"><a name="l01420"></a><span class="lineno"> 1420</span>&#160;    <span class="keyword">const</span> SchemaType* additionalItemsSchema_;</div><div class="line"><a name="l01421"></a><span class="lineno"> 1421</span>&#160;    <span class="keyword">const</span> SchemaType* itemsList_;</div><div class="line"><a name="l01422"></a><span class="lineno"> 1422</span>&#160;    <span class="keyword">const</span> SchemaType** itemsTuple_;</div><div class="line"><a name="l01423"></a><span class="lineno"> 1423</span>&#160;    <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> itemsTupleCount_;</div><div class="line"><a name="l01424"></a><span class="lineno"> 1424</span>&#160;    <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> minItems_;</div><div class="line"><a name="l01425"></a><span class="lineno"> 1425</span>&#160;    <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> maxItems_;</div><div class="line"><a name="l01426"></a><span class="lineno"> 1426</span>&#160;    <span class="keywordtype">bool</span> additionalItems_;</div><div class="line"><a name="l01427"></a><span class="lineno"> 1427</span>&#160;    <span class="keywordtype">bool</span> uniqueItems_;</div><div class="line"><a name="l01428"></a><span class="lineno"> 1428</span>&#160;</div><div class="line"><a name="l01429"></a><span class="lineno"> 1429</span>&#160;    RegexType* pattern_;</div><div class="line"><a name="l01430"></a><span class="lineno"> 1430</span>&#160;    <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> minLength_;</div><div class="line"><a name="l01431"></a><span class="lineno"> 1431</span>&#160;    <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> maxLength_;</div><div class="line"><a name="l01432"></a><span class="lineno"> 1432</span>&#160;</div><div class="line"><a name="l01433"></a><span class="lineno"> 1433</span>&#160;    SValue minimum_;</div><div class="line"><a name="l01434"></a><span class="lineno"> 1434</span>&#160;    SValue maximum_;</div><div class="line"><a name="l01435"></a><span class="lineno"> 1435</span>&#160;    SValue multipleOf_;</div><div class="line"><a name="l01436"></a><span class="lineno"> 1436</span>&#160;    <span class="keywordtype">bool</span> exclusiveMinimum_;</div><div class="line"><a name="l01437"></a><span class="lineno"> 1437</span>&#160;    <span class="keywordtype">bool</span> exclusiveMaximum_;</div><div class="line"><a name="l01438"></a><span class="lineno"> 1438</span>&#160;    </div><div class="line"><a name="l01439"></a><span class="lineno"> 1439</span>&#160;    <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> defaultValueLength_;</div><div class="line"><a name="l01440"></a><span class="lineno"> 1440</span>&#160;};</div><div class="line"><a name="l01441"></a><span class="lineno"> 1441</span>&#160;</div><div class="line"><a name="l01442"></a><span class="lineno"> 1442</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> Stack, <span class="keyword">typename</span> Ch&gt;</div><div class="line"><a name="l01443"></a><span class="lineno"> 1443</span>&#160;<span class="keyword">struct </span>TokenHelper {</div><div class="line"><a name="l01444"></a><span class="lineno"> 1444</span>&#160;    RAPIDJSON_FORCEINLINE <span class="keyword">static</span> <span class="keywordtype">void</span> AppendIndexToken(Stack&amp; documentStack, <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> index) {</div><div class="line"><a name="l01445"></a><span class="lineno"> 1445</span>&#160;        *documentStack.template Push&lt;Ch&gt;() = <span class="charliteral">&#39;/&#39;</span>;</div><div class="line"><a name="l01446"></a><span class="lineno"> 1446</span>&#160;        <span class="keywordtype">char</span> buffer[21];</div><div class="line"><a name="l01447"></a><span class="lineno"> 1447</span>&#160;        <span class="keywordtype">size_t</span> length = <span class="keyword">static_cast&lt;</span><span class="keywordtype">size_t</span><span class="keyword">&gt;</span>((<span class="keyword">sizeof</span>(<a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a>) == 4 ? u32toa(index, buffer) : u64toa(index, buffer)) - buffer);</div><div class="line"><a name="l01448"></a><span class="lineno"> 1448</span>&#160;        <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i &lt; length; i++)</div><div class="line"><a name="l01449"></a><span class="lineno"> 1449</span>&#160;            *documentStack.template Push&lt;Ch&gt;() = <span class="keyword">static_cast&lt;</span>Ch<span class="keyword">&gt;</span>(buffer[i]);</div><div class="line"><a name="l01450"></a><span class="lineno"> 1450</span>&#160;    }</div><div class="line"><a name="l01451"></a><span class="lineno"> 1451</span>&#160;};</div><div class="line"><a name="l01452"></a><span class="lineno"> 1452</span>&#160;</div><div class="line"><a name="l01453"></a><span class="lineno"> 1453</span>&#160;<span class="comment">// Partial specialized version for char to prevent buffer copying.</span></div><div class="line"><a name="l01454"></a><span class="lineno"> 1454</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> Stack&gt;</div><div class="line"><a name="l01455"></a><span class="lineno"> 1455</span>&#160;<span class="keyword">struct </span>TokenHelper&lt;Stack, char&gt; {</div><div class="line"><a name="l01456"></a><span class="lineno"> 1456</span>&#160;    RAPIDJSON_FORCEINLINE <span class="keyword">static</span> <span class="keywordtype">void</span> AppendIndexToken(Stack&amp; documentStack, <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> index) {</div><div class="line"><a name="l01457"></a><span class="lineno"> 1457</span>&#160;        <span class="keywordflow">if</span> (<span class="keyword">sizeof</span>(<a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a>) == 4) {</div><div class="line"><a name="l01458"></a><span class="lineno"> 1458</span>&#160;            <span class="keywordtype">char</span> *buffer = documentStack.template Push&lt;char&gt;(1 + 10); <span class="comment">// &#39;/&#39; + uint</span></div><div class="line"><a name="l01459"></a><span class="lineno"> 1459</span>&#160;            *buffer++ = <span class="charliteral">&#39;/&#39;</span>;</div><div class="line"><a name="l01460"></a><span class="lineno"> 1460</span>&#160;            <span class="keyword">const</span> <span class="keywordtype">char</span>* end = internal::u32toa(index, buffer);</div><div class="line"><a name="l01461"></a><span class="lineno"> 1461</span>&#160;             documentStack.template Pop&lt;char&gt;(<span class="keyword">static_cast&lt;</span><span class="keywordtype">size_t</span><span class="keyword">&gt;</span>(10 - (end - buffer)));</div><div class="line"><a name="l01462"></a><span class="lineno"> 1462</span>&#160;        }</div><div class="line"><a name="l01463"></a><span class="lineno"> 1463</span>&#160;        <span class="keywordflow">else</span> {</div><div class="line"><a name="l01464"></a><span class="lineno"> 1464</span>&#160;            <span class="keywordtype">char</span> *buffer = documentStack.template Push&lt;char&gt;(1 + 20); <span class="comment">// &#39;/&#39; + uint64</span></div><div class="line"><a name="l01465"></a><span class="lineno"> 1465</span>&#160;            *buffer++ = <span class="charliteral">&#39;/&#39;</span>;</div><div class="line"><a name="l01466"></a><span class="lineno"> 1466</span>&#160;            <span class="keyword">const</span> <span class="keywordtype">char</span>* end = internal::u64toa(index, buffer);</div><div class="line"><a name="l01467"></a><span class="lineno"> 1467</span>&#160;            documentStack.template Pop&lt;char&gt;(<span class="keyword">static_cast&lt;</span><span class="keywordtype">size_t</span><span class="keyword">&gt;</span>(20 - (end - buffer)));</div><div class="line"><a name="l01468"></a><span class="lineno"> 1468</span>&#160;        }</div><div class="line"><a name="l01469"></a><span class="lineno"> 1469</span>&#160;    }</div><div class="line"><a name="l01470"></a><span class="lineno"> 1470</span>&#160;};</div><div class="line"><a name="l01471"></a><span class="lineno"> 1471</span>&#160;</div><div class="line"><a name="l01472"></a><span class="lineno"> 1472</span>&#160;} <span class="comment">// namespace internal</span></div><div class="line"><a name="l01473"></a><span class="lineno"> 1473</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01474"></a><span class="lineno"> 1474</span>&#160;<span class="comment">///////////////////////////////////////////////////////////////////////////////</span></div><div class="line"><a name="l01475"></a><span class="lineno"> 1475</span>&#160;<span class="comment"></span><span class="comment">// IGenericRemoteSchemaDocumentProvider</span></div><div class="line"><a name="l01476"></a><span class="lineno"> 1476</span>&#160;</div><div class="line"><a name="l01477"></a><span class="lineno"> 1477</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> SchemaDocumentType&gt;</div><div class="line"><a name="l01478"></a><span class="lineno"> 1478</span>&#160;<span class="keyword">class </span>IGenericRemoteSchemaDocumentProvider {</div><div class="line"><a name="l01479"></a><span class="lineno"> 1479</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l01480"></a><span class="lineno"> 1480</span>&#160;    <span class="keyword">typedef</span> <span class="keyword">typename</span> SchemaDocumentType::Ch Ch;</div><div class="line"><a name="l01481"></a><span class="lineno"> 1481</span>&#160;</div><div class="line"><a name="l01482"></a><span class="lineno"> 1482</span>&#160;    <span class="keyword">virtual</span> ~IGenericRemoteSchemaDocumentProvider() {}</div><div class="line"><a name="l01483"></a><span class="lineno"> 1483</span>&#160;    <span class="keyword">virtual</span> <span class="keyword">const</span> SchemaDocumentType* GetRemoteDocument(<span class="keyword">const</span> Ch* uri, <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> length) = 0;</div><div class="line"><a name="l01484"></a><span class="lineno"> 1484</span>&#160;};</div><div class="line"><a name="l01485"></a><span class="lineno"> 1485</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01486"></a><span class="lineno"> 1486</span>&#160;<span class="comment">///////////////////////////////////////////////////////////////////////////////</span></div><div class="line"><a name="l01487"></a><span class="lineno"> 1487</span>&#160;<span class="comment"></span><span class="comment">// GenericSchemaDocument</span></div><div class="line"><a name="l01488"></a><span class="lineno"> 1488</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01489"></a><span class="lineno"> 1489</span>&#160;<span class="comment">//! JSON schema document.</span></div><div class="line"><a name="l01490"></a><span class="lineno"> 1490</span>&#160;<span class="comment"></span><span class="comment">/*!</span></div><div class="line"><a name="l01491"></a><span class="lineno"> 1491</span>&#160;<span class="comment">    A JSON schema document is a compiled version of a JSON schema.</span></div><div class="line"><a name="l01492"></a><span class="lineno"> 1492</span>&#160;<span class="comment">    It is basically a tree of internal::Schema.</span></div><div class="line"><a name="l01493"></a><span class="lineno"> 1493</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01494"></a><span class="lineno"> 1494</span>&#160;<span class="comment">    \note This is an immutable class (i.e. its instance cannot be modified after construction).</span></div><div class="line"><a name="l01495"></a><span class="lineno"> 1495</span>&#160;<span class="comment">    \tparam ValueT Type of JSON value (e.g. \c Value ), which also determine the encoding.</span></div><div class="line"><a name="l01496"></a><span class="lineno"> 1496</span>&#160;<span class="comment">    \tparam Allocator Allocator type for allocating memory of this document.</span></div><div class="line"><a name="l01497"></a><span class="lineno"> 1497</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l01498"></a><span class="lineno"> 1498</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> ValueT, <span class="keyword">typename</span> Allocator = CrtAllocator&gt;</div><div class="line"><a name="l01499"></a><span class="lineno"> 1499</span>&#160;<span class="keyword">class </span>GenericSchemaDocument {</div><div class="line"><a name="l01500"></a><span class="lineno"> 1500</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l01501"></a><span class="lineno"> 1501</span>&#160;    <span class="keyword">typedef</span> ValueT ValueType;</div><div class="line"><a name="l01502"></a><span class="lineno"> 1502</span>&#160;    <span class="keyword">typedef</span> IGenericRemoteSchemaDocumentProvider&lt;GenericSchemaDocument&gt; IRemoteSchemaDocumentProviderType;</div><div class="line"><a name="l01503"></a><span class="lineno"> 1503</span>&#160;    <span class="keyword">typedef</span> Allocator AllocatorType;</div><div class="line"><a name="l01504"></a><span class="lineno"> 1504</span>&#160;    <span class="keyword">typedef</span> <span class="keyword">typename</span> ValueType::EncodingType EncodingType;</div><div class="line"><a name="l01505"></a><span class="lineno"> 1505</span>&#160;    <span class="keyword">typedef</span> <span class="keyword">typename</span> EncodingType::Ch Ch;</div><div class="line"><a name="l01506"></a><span class="lineno"> 1506</span>&#160;    <span class="keyword">typedef</span> internal::Schema&lt;GenericSchemaDocument&gt; SchemaType;</div><div class="line"><a name="l01507"></a><span class="lineno"> 1507</span>&#160;    <span class="keyword">typedef</span> GenericPointer&lt;ValueType, Allocator&gt; PointerType;</div><div class="line"><a name="l01508"></a><span class="lineno"> 1508</span>&#160;    <span class="keyword">typedef</span> GenericValue&lt;EncodingType, Allocator&gt; URIType;</div><div class="line"><a name="l01509"></a><span class="lineno"> 1509</span>&#160;    <span class="keyword">friend</span> <span class="keyword">class </span>internal::Schema&lt;GenericSchemaDocument&gt;;</div><div class="line"><a name="l01510"></a><span class="lineno"> 1510</span>&#160;    <span class="keyword">template</span> &lt;<span class="keyword">typename</span>, <span class="keyword">typename</span>, <span class="keyword">typename</span>&gt;</div><div class="line"><a name="l01511"></a><span class="lineno"> 1511</span>&#160;    <span class="keyword">friend</span> <span class="keyword">class </span>GenericSchemaValidator;</div><div class="line"><a name="l01512"></a><span class="lineno"> 1512</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01513"></a><span class="lineno"> 1513</span>&#160;<span class="comment">    //! Constructor.</span></div><div class="line"><a name="l01514"></a><span class="lineno"> 1514</span>&#160;<span class="comment"></span><span class="comment">    /*!</span></div><div class="line"><a name="l01515"></a><span class="lineno"> 1515</span>&#160;<span class="comment">        Compile a JSON document into schema document.</span></div><div class="line"><a name="l01516"></a><span class="lineno"> 1516</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01517"></a><span class="lineno"> 1517</span>&#160;<span class="comment">        \param document A JSON document as source.</span></div><div class="line"><a name="l01518"></a><span class="lineno"> 1518</span>&#160;<span class="comment">        \param uri The base URI of this schema document for purposes of violation reporting.</span></div><div class="line"><a name="l01519"></a><span class="lineno"> 1519</span>&#160;<span class="comment">        \param uriLength Length of \c name, in code points.</span></div><div class="line"><a name="l01520"></a><span class="lineno"> 1520</span>&#160;<span class="comment">        \param remoteProvider An optional remote schema document provider for resolving remote reference. Can be null.</span></div><div class="line"><a name="l01521"></a><span class="lineno"> 1521</span>&#160;<span class="comment">        \param allocator An optional allocator instance for allocating memory. Can be null.</span></div><div class="line"><a name="l01522"></a><span class="lineno"> 1522</span>&#160;<span class="comment">    */</span></div><div class="line"><a name="l01523"></a><span class="lineno"><a class="line" href="classrapidjson_1_1_generic_schema_document.html#aeebf51ef6353f6a01d6f6618da6d0865"> 1523</a></span>&#160;    <span class="keyword">explicit</span> <a class="code" href="classrapidjson_1_1_generic_schema_document.html#aeebf51ef6353f6a01d6f6618da6d0865">GenericSchemaDocument</a>(<span class="keyword">const</span> ValueType&amp; document, <span class="keyword">const</span> Ch* uri = 0, <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> uriLength = 0,</div><div class="line"><a name="l01524"></a><span class="lineno"> 1524</span>&#160;        IRemoteSchemaDocumentProviderType* remoteProvider = 0, <a class="code" href="classrapidjson_1_1_allocator.html">Allocator</a>* allocator = 0) :</div><div class="line"><a name="l01525"></a><span class="lineno"> 1525</span>&#160;        remoteProvider_(remoteProvider),</div><div class="line"><a name="l01526"></a><span class="lineno"> 1526</span>&#160;        allocator_(allocator),</div><div class="line"><a name="l01527"></a><span class="lineno"> 1527</span>&#160;        ownAllocator_(),</div><div class="line"><a name="l01528"></a><span class="lineno"> 1528</span>&#160;        root_(),</div><div class="line"><a name="l01529"></a><span class="lineno"> 1529</span>&#160;        typeless_(),</div><div class="line"><a name="l01530"></a><span class="lineno"> 1530</span>&#160;        schemaMap_(allocator, kInitialSchemaMapSize),</div><div class="line"><a name="l01531"></a><span class="lineno"> 1531</span>&#160;        schemaRef_(allocator, kInitialSchemaRefSize)</div><div class="line"><a name="l01532"></a><span class="lineno"> 1532</span>&#160;    {</div><div class="line"><a name="l01533"></a><span class="lineno"> 1533</span>&#160;        <span class="keywordflow">if</span> (!allocator_)</div><div class="line"><a name="l01534"></a><span class="lineno"> 1534</span>&#160;            ownAllocator_ = allocator_ = <a class="code" href="rapidjson_8h.html#abdc7cd7902748ffe6626d71c59a73c3b">RAPIDJSON_NEW</a>(<a class="code" href="classrapidjson_1_1_allocator.html">Allocator</a>)();</div><div class="line"><a name="l01535"></a><span class="lineno"> 1535</span>&#160;</div><div class="line"><a name="l01536"></a><span class="lineno"> 1536</span>&#160;        Ch noUri[1] = {0};</div><div class="line"><a name="l01537"></a><span class="lineno"> 1537</span>&#160;        uri_.SetString(uri ? uri : noUri, uriLength, *allocator_);</div><div class="line"><a name="l01538"></a><span class="lineno"> 1538</span>&#160;</div><div class="line"><a name="l01539"></a><span class="lineno"> 1539</span>&#160;        typeless_ = <span class="keyword">static_cast&lt;</span>SchemaType*<span class="keyword">&gt;</span>(allocator_-&gt;Malloc(<span class="keyword">sizeof</span>(SchemaType)));</div><div class="line"><a name="l01540"></a><span class="lineno"> 1540</span>&#160;        <span class="keyword">new</span> (typeless_) SchemaType(<span class="keyword">this</span>, PointerType(), ValueType(<a class="code" href="namespacerapidjson.html#ae79a4751c1c460ff0de5ecc07874f3e4acf030b422a32c3647c7c5973bd4dd0a9">kObjectType</a>).Move(), ValueType(<a class="code" href="namespacerapidjson.html#ae79a4751c1c460ff0de5ecc07874f3e4acf030b422a32c3647c7c5973bd4dd0a9">kObjectType</a>).Move(), allocator_);</div><div class="line"><a name="l01541"></a><span class="lineno"> 1541</span>&#160;</div><div class="line"><a name="l01542"></a><span class="lineno"> 1542</span>&#160;        <span class="comment">// Generate root schema, it will call CreateSchema() to create sub-schemas,</span></div><div class="line"><a name="l01543"></a><span class="lineno"> 1543</span>&#160;        <span class="comment">// And call AddRefSchema() if there are $ref.</span></div><div class="line"><a name="l01544"></a><span class="lineno"> 1544</span>&#160;        CreateSchemaRecursive(&amp;root_, PointerType(), document, document);</div><div class="line"><a name="l01545"></a><span class="lineno"> 1545</span>&#160;</div><div class="line"><a name="l01546"></a><span class="lineno"> 1546</span>&#160;        <span class="comment">// Resolve $ref</span></div><div class="line"><a name="l01547"></a><span class="lineno"> 1547</span>&#160;        <span class="keywordflow">while</span> (!schemaRef_.Empty()) {</div><div class="line"><a name="l01548"></a><span class="lineno"> 1548</span>&#160;            SchemaRefEntry* refEntry = schemaRef_.template Pop&lt;SchemaRefEntry&gt;(1);</div><div class="line"><a name="l01549"></a><span class="lineno"> 1549</span>&#160;            <span class="keywordflow">if</span> (<span class="keyword">const</span> SchemaType* s = GetSchema(refEntry-&gt;target)) {</div><div class="line"><a name="l01550"></a><span class="lineno"> 1550</span>&#160;                <span class="keywordflow">if</span> (refEntry-&gt;schema)</div><div class="line"><a name="l01551"></a><span class="lineno"> 1551</span>&#160;                    *refEntry-&gt;schema = s;</div><div class="line"><a name="l01552"></a><span class="lineno"> 1552</span>&#160;</div><div class="line"><a name="l01553"></a><span class="lineno"> 1553</span>&#160;                <span class="comment">// Create entry in map if not exist</span></div><div class="line"><a name="l01554"></a><span class="lineno"> 1554</span>&#160;                <span class="keywordflow">if</span> (!GetSchema(refEntry-&gt;source)) {</div><div class="line"><a name="l01555"></a><span class="lineno"> 1555</span>&#160;                    <span class="keyword">new</span> (schemaMap_.template Push&lt;SchemaEntry&gt;()) SchemaEntry(refEntry-&gt;source, const_cast&lt;SchemaType*&gt;(s), <span class="keyword">false</span>, allocator_);</div><div class="line"><a name="l01556"></a><span class="lineno"> 1556</span>&#160;                }</div><div class="line"><a name="l01557"></a><span class="lineno"> 1557</span>&#160;            }</div><div class="line"><a name="l01558"></a><span class="lineno"> 1558</span>&#160;            <span class="keywordflow">else</span> <span class="keywordflow">if</span> (refEntry-&gt;schema)</div><div class="line"><a name="l01559"></a><span class="lineno"> 1559</span>&#160;                *refEntry-&gt;schema = typeless_;</div><div class="line"><a name="l01560"></a><span class="lineno"> 1560</span>&#160;</div><div class="line"><a name="l01561"></a><span class="lineno"> 1561</span>&#160;            refEntry-&gt;~SchemaRefEntry();</div><div class="line"><a name="l01562"></a><span class="lineno"> 1562</span>&#160;        }</div><div class="line"><a name="l01563"></a><span class="lineno"> 1563</span>&#160;</div><div class="line"><a name="l01564"></a><span class="lineno"> 1564</span>&#160;        <a class="code" href="group___r_a_p_i_d_j_s_o_n___c_o_n_f_i_g.html#gabeba18d612187bad2ac62aed9276d47c">RAPIDJSON_ASSERT</a>(root_ != 0);</div><div class="line"><a name="l01565"></a><span class="lineno"> 1565</span>&#160;</div><div class="line"><a name="l01566"></a><span class="lineno"> 1566</span>&#160;        schemaRef_.ShrinkToFit(); <span class="comment">// Deallocate all memory for ref</span></div><div class="line"><a name="l01567"></a><span class="lineno"> 1567</span>&#160;    }</div><div class="line"><a name="l01568"></a><span class="lineno"> 1568</span>&#160;</div><div class="line"><a name="l01569"></a><span class="lineno"> 1569</span>&#160;<span class="preprocessor">#if RAPIDJSON_HAS_CXX11_RVALUE_REFS</span></div><div class="line"><a name="l01570"></a><span class="lineno"> 1570</span>&#160;<span class="comment">    //! Move constructor in C++11</span></div><div class="line"><a name="l01571"></a><span class="lineno"> 1571</span>&#160;<span class="comment"></span>    <a class="code" href="classrapidjson_1_1_generic_schema_document.html">GenericSchemaDocument</a>(<a class="code" href="classrapidjson_1_1_generic_schema_document.html">GenericSchemaDocument</a>&amp;&amp; rhs) RAPIDJSON_NOEXCEPT :</div><div class="line"><a name="l01572"></a><span class="lineno"> 1572</span>&#160;        remoteProvider_(rhs.remoteProvider_),</div><div class="line"><a name="l01573"></a><span class="lineno"> 1573</span>&#160;        allocator_(rhs.allocator_),</div><div class="line"><a name="l01574"></a><span class="lineno"> 1574</span>&#160;        ownAllocator_(rhs.ownAllocator_),</div><div class="line"><a name="l01575"></a><span class="lineno"> 1575</span>&#160;        root_(rhs.root_),</div><div class="line"><a name="l01576"></a><span class="lineno"> 1576</span>&#160;        typeless_(rhs.typeless_),</div><div class="line"><a name="l01577"></a><span class="lineno"> 1577</span>&#160;        schemaMap_(std::move(rhs.schemaMap_)),</div><div class="line"><a name="l01578"></a><span class="lineno"> 1578</span>&#160;        schemaRef_(std::move(rhs.schemaRef_)),</div><div class="line"><a name="l01579"></a><span class="lineno"> 1579</span>&#160;        uri_(std::move(rhs.uri_))</div><div class="line"><a name="l01580"></a><span class="lineno"> 1580</span>&#160;    {</div><div class="line"><a name="l01581"></a><span class="lineno"> 1581</span>&#160;        rhs.remoteProvider_ = 0;</div><div class="line"><a name="l01582"></a><span class="lineno"> 1582</span>&#160;        rhs.allocator_ = 0;</div><div class="line"><a name="l01583"></a><span class="lineno"> 1583</span>&#160;        rhs.ownAllocator_ = 0;</div><div class="line"><a name="l01584"></a><span class="lineno"> 1584</span>&#160;        rhs.typeless_ = 0;</div><div class="line"><a name="l01585"></a><span class="lineno"> 1585</span>&#160;    }</div><div class="line"><a name="l01586"></a><span class="lineno"> 1586</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l01587"></a><span class="lineno"> 1587</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01588"></a><span class="lineno"> 1588</span>&#160;<span class="comment">    //! Destructor</span></div><div class="line"><a name="l01589"></a><span class="lineno"><a class="line" href="classrapidjson_1_1_generic_schema_document.html#adf6f3372013227873ed392dee1e752bf"> 1589</a></span>&#160;<span class="comment"></span>    <a class="code" href="classrapidjson_1_1_generic_schema_document.html#adf6f3372013227873ed392dee1e752bf">~GenericSchemaDocument</a>() {</div><div class="line"><a name="l01590"></a><span class="lineno"> 1590</span>&#160;        <span class="keywordflow">while</span> (!schemaMap_.Empty())</div><div class="line"><a name="l01591"></a><span class="lineno"> 1591</span>&#160;            schemaMap_.template Pop&lt;SchemaEntry&gt;(1)-&gt;~SchemaEntry();</div><div class="line"><a name="l01592"></a><span class="lineno"> 1592</span>&#160;</div><div class="line"><a name="l01593"></a><span class="lineno"> 1593</span>&#160;        <span class="keywordflow">if</span> (typeless_) {</div><div class="line"><a name="l01594"></a><span class="lineno"> 1594</span>&#160;            typeless_-&gt;~SchemaType();</div><div class="line"><a name="l01595"></a><span class="lineno"> 1595</span>&#160;            Allocator::Free(typeless_);</div><div class="line"><a name="l01596"></a><span class="lineno"> 1596</span>&#160;        }</div><div class="line"><a name="l01597"></a><span class="lineno"> 1597</span>&#160;</div><div class="line"><a name="l01598"></a><span class="lineno"> 1598</span>&#160;        <a class="code" href="rapidjson_8h.html#a52c941c3fdd646527cdcd42aa846a28a">RAPIDJSON_DELETE</a>(ownAllocator_);</div><div class="line"><a name="l01599"></a><span class="lineno"> 1599</span>&#160;    }</div><div class="line"><a name="l01600"></a><span class="lineno"> 1600</span>&#160;</div><div class="line"><a name="l01601"></a><span class="lineno"> 1601</span>&#160;    <span class="keyword">const</span> URIType&amp; GetURI()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> uri_; }</div><div class="line"><a name="l01602"></a><span class="lineno"> 1602</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01603"></a><span class="lineno"> 1603</span>&#160;<span class="comment">    //! Get the root schema.</span></div><div class="line"><a name="l01604"></a><span class="lineno"><a class="line" href="classrapidjson_1_1_generic_schema_document.html#a8b2ac6de85dc9c1fb4f4d0be4aeb2d6a"> 1604</a></span>&#160;<span class="comment"></span>    <span class="keyword">const</span> SchemaType&amp; <a class="code" href="classrapidjson_1_1_generic_schema_document.html#a8b2ac6de85dc9c1fb4f4d0be4aeb2d6a">GetRoot</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> *root_; }</div><div class="line"><a name="l01605"></a><span class="lineno"> 1605</span>&#160;</div><div class="line"><a name="l01606"></a><span class="lineno"> 1606</span>&#160;<span class="keyword">private</span>:<span class="comment"></span></div><div class="line"><a name="l01607"></a><span class="lineno"> 1607</span>&#160;<span class="comment">    //! Prohibit copying</span></div><div class="line"><a name="l01608"></a><span class="lineno"> 1608</span>&#160;<span class="comment"></span>    <a class="code" href="classrapidjson_1_1_generic_schema_document.html">GenericSchemaDocument</a>(<span class="keyword">const</span> <a class="code" href="classrapidjson_1_1_generic_schema_document.html">GenericSchemaDocument</a>&amp;);<span class="comment"></span></div><div class="line"><a name="l01609"></a><span class="lineno"> 1609</span>&#160;<span class="comment">    //! Prohibit assignment</span></div><div class="line"><a name="l01610"></a><span class="lineno"> 1610</span>&#160;<span class="comment"></span>    <a class="code" href="classrapidjson_1_1_generic_schema_document.html">GenericSchemaDocument</a>&amp; operator=(<span class="keyword">const</span> <a class="code" href="classrapidjson_1_1_generic_schema_document.html">GenericSchemaDocument</a>&amp;);</div><div class="line"><a name="l01611"></a><span class="lineno"> 1611</span>&#160;</div><div class="line"><a name="l01612"></a><span class="lineno"> 1612</span>&#160;    <span class="keyword">struct </span>SchemaRefEntry {</div><div class="line"><a name="l01613"></a><span class="lineno"> 1613</span>&#160;        SchemaRefEntry(<span class="keyword">const</span> PointerType&amp; s, <span class="keyword">const</span> PointerType&amp; t, <span class="keyword">const</span> SchemaType** outSchema, <a class="code" href="classrapidjson_1_1_allocator.html">Allocator</a> *allocator) : source(s, allocator), target(t, allocator), schema(outSchema) {}</div><div class="line"><a name="l01614"></a><span class="lineno"> 1614</span>&#160;        PointerType source;</div><div class="line"><a name="l01615"></a><span class="lineno"> 1615</span>&#160;        PointerType target;</div><div class="line"><a name="l01616"></a><span class="lineno"> 1616</span>&#160;        <span class="keyword">const</span> SchemaType** schema;</div><div class="line"><a name="l01617"></a><span class="lineno"> 1617</span>&#160;    };</div><div class="line"><a name="l01618"></a><span class="lineno"> 1618</span>&#160;</div><div class="line"><a name="l01619"></a><span class="lineno"> 1619</span>&#160;    <span class="keyword">struct </span>SchemaEntry {</div><div class="line"><a name="l01620"></a><span class="lineno"> 1620</span>&#160;        SchemaEntry(<span class="keyword">const</span> PointerType&amp; p, SchemaType* s, <span class="keywordtype">bool</span> o, <a class="code" href="classrapidjson_1_1_allocator.html">Allocator</a>* allocator) : pointer(p, allocator), schema(s), owned(o) {}</div><div class="line"><a name="l01621"></a><span class="lineno"> 1621</span>&#160;        ~SchemaEntry() {</div><div class="line"><a name="l01622"></a><span class="lineno"> 1622</span>&#160;            <span class="keywordflow">if</span> (owned) {</div><div class="line"><a name="l01623"></a><span class="lineno"> 1623</span>&#160;                schema-&gt;~SchemaType();</div><div class="line"><a name="l01624"></a><span class="lineno"> 1624</span>&#160;                Allocator::Free(schema);</div><div class="line"><a name="l01625"></a><span class="lineno"> 1625</span>&#160;            }</div><div class="line"><a name="l01626"></a><span class="lineno"> 1626</span>&#160;        }</div><div class="line"><a name="l01627"></a><span class="lineno"> 1627</span>&#160;        PointerType pointer;</div><div class="line"><a name="l01628"></a><span class="lineno"> 1628</span>&#160;        SchemaType* schema;</div><div class="line"><a name="l01629"></a><span class="lineno"> 1629</span>&#160;        <span class="keywordtype">bool</span> owned;</div><div class="line"><a name="l01630"></a><span class="lineno"> 1630</span>&#160;    };</div><div class="line"><a name="l01631"></a><span class="lineno"> 1631</span>&#160;</div><div class="line"><a name="l01632"></a><span class="lineno"> 1632</span>&#160;    <span class="keywordtype">void</span> CreateSchemaRecursive(<span class="keyword">const</span> SchemaType** schema, <span class="keyword">const</span> PointerType&amp; pointer, <span class="keyword">const</span> ValueType&amp; v, <span class="keyword">const</span> ValueType&amp; document) {</div><div class="line"><a name="l01633"></a><span class="lineno"> 1633</span>&#160;        <span class="keywordflow">if</span> (schema)</div><div class="line"><a name="l01634"></a><span class="lineno"> 1634</span>&#160;            *schema = typeless_;</div><div class="line"><a name="l01635"></a><span class="lineno"> 1635</span>&#160;</div><div class="line"><a name="l01636"></a><span class="lineno"> 1636</span>&#160;        <span class="keywordflow">if</span> (v.GetType() == <a class="code" href="namespacerapidjson.html#ae79a4751c1c460ff0de5ecc07874f3e4acf030b422a32c3647c7c5973bd4dd0a9">kObjectType</a>) {</div><div class="line"><a name="l01637"></a><span class="lineno"> 1637</span>&#160;            <span class="keyword">const</span> SchemaType* s = GetSchema(pointer);</div><div class="line"><a name="l01638"></a><span class="lineno"> 1638</span>&#160;            <span class="keywordflow">if</span> (!s)</div><div class="line"><a name="l01639"></a><span class="lineno"> 1639</span>&#160;                CreateSchema(schema, pointer, v, document);</div><div class="line"><a name="l01640"></a><span class="lineno"> 1640</span>&#160;</div><div class="line"><a name="l01641"></a><span class="lineno"> 1641</span>&#160;            <span class="keywordflow">for</span> (<span class="keyword">typename</span> ValueType::ConstMemberIterator itr = v.MemberBegin(); itr != v.MemberEnd(); ++itr)</div><div class="line"><a name="l01642"></a><span class="lineno"> 1642</span>&#160;                CreateSchemaRecursive(0, pointer.<a class="code" href="classrapidjson_1_1_generic_pointer.html#a7cb5eda2af1722e52efa591c4103ebec">Append</a>(itr-&gt;name, allocator_), itr-&gt;value, document);</div><div class="line"><a name="l01643"></a><span class="lineno"> 1643</span>&#160;        }</div><div class="line"><a name="l01644"></a><span class="lineno"> 1644</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span> (v.GetType() == <a class="code" href="namespacerapidjson.html#ae79a4751c1c460ff0de5ecc07874f3e4a058c622e1e7d59419ae58b895cbce468">kArrayType</a>)</div><div class="line"><a name="l01645"></a><span class="lineno"> 1645</span>&#160;            <span class="keywordflow">for</span> (<a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> i = 0; i &lt; v.Size(); i++)</div><div class="line"><a name="l01646"></a><span class="lineno"> 1646</span>&#160;                CreateSchemaRecursive(0, pointer.<a class="code" href="classrapidjson_1_1_generic_pointer.html#a7cb5eda2af1722e52efa591c4103ebec">Append</a>(i, allocator_), v[i], document);</div><div class="line"><a name="l01647"></a><span class="lineno"> 1647</span>&#160;    }</div><div class="line"><a name="l01648"></a><span class="lineno"> 1648</span>&#160;</div><div class="line"><a name="l01649"></a><span class="lineno"> 1649</span>&#160;    <span class="keywordtype">void</span> CreateSchema(<span class="keyword">const</span> SchemaType** schema, <span class="keyword">const</span> PointerType&amp; pointer, <span class="keyword">const</span> ValueType&amp; v, <span class="keyword">const</span> ValueType&amp; document) {</div><div class="line"><a name="l01650"></a><span class="lineno"> 1650</span>&#160;        <a class="code" href="group___r_a_p_i_d_j_s_o_n___c_o_n_f_i_g.html#gabeba18d612187bad2ac62aed9276d47c">RAPIDJSON_ASSERT</a>(pointer.<a class="code" href="classrapidjson_1_1_generic_pointer.html#a98b96d54c2c3378f1892ffffc501069c">IsValid</a>());</div><div class="line"><a name="l01651"></a><span class="lineno"> 1651</span>&#160;        <span class="keywordflow">if</span> (v.IsObject()) {</div><div class="line"><a name="l01652"></a><span class="lineno"> 1652</span>&#160;            <span class="keywordflow">if</span> (!HandleRefSchema(pointer, schema, v, document)) {</div><div class="line"><a name="l01653"></a><span class="lineno"> 1653</span>&#160;                SchemaType* s = <span class="keyword">new</span> (allocator_-&gt;Malloc(<span class="keyword">sizeof</span>(SchemaType))) SchemaType(<span class="keyword">this</span>, pointer, v, document, allocator_);</div><div class="line"><a name="l01654"></a><span class="lineno"> 1654</span>&#160;                <span class="keyword">new</span> (schemaMap_.template Push&lt;SchemaEntry&gt;()) SchemaEntry(pointer, s, <span class="keyword">true</span>, allocator_);</div><div class="line"><a name="l01655"></a><span class="lineno"> 1655</span>&#160;                <span class="keywordflow">if</span> (schema)</div><div class="line"><a name="l01656"></a><span class="lineno"> 1656</span>&#160;                    *schema = s;</div><div class="line"><a name="l01657"></a><span class="lineno"> 1657</span>&#160;            }</div><div class="line"><a name="l01658"></a><span class="lineno"> 1658</span>&#160;        }</div><div class="line"><a name="l01659"></a><span class="lineno"> 1659</span>&#160;    }</div><div class="line"><a name="l01660"></a><span class="lineno"> 1660</span>&#160;</div><div class="line"><a name="l01661"></a><span class="lineno"> 1661</span>&#160;    <span class="keywordtype">bool</span> HandleRefSchema(<span class="keyword">const</span> PointerType&amp; source, <span class="keyword">const</span> SchemaType** schema, <span class="keyword">const</span> ValueType&amp; v, <span class="keyword">const</span> ValueType&amp; document) {</div><div class="line"><a name="l01662"></a><span class="lineno"> 1662</span>&#160;        <span class="keyword">static</span> <span class="keyword">const</span> Ch kRefString[] = { <span class="charliteral">&#39;$&#39;</span>, <span class="charliteral">&#39;r&#39;</span>, <span class="charliteral">&#39;e&#39;</span>, <span class="charliteral">&#39;f&#39;</span>, <span class="charliteral">&#39;\0&#39;</span> };</div><div class="line"><a name="l01663"></a><span class="lineno"> 1663</span>&#160;        <span class="keyword">static</span> <span class="keyword">const</span> ValueType kRefValue(kRefString, 4);</div><div class="line"><a name="l01664"></a><span class="lineno"> 1664</span>&#160;</div><div class="line"><a name="l01665"></a><span class="lineno"> 1665</span>&#160;        <span class="keyword">typename</span> ValueType::ConstMemberIterator itr = v.FindMember(kRefValue);</div><div class="line"><a name="l01666"></a><span class="lineno"> 1666</span>&#160;        <span class="keywordflow">if</span> (itr == v.MemberEnd())</div><div class="line"><a name="l01667"></a><span class="lineno"> 1667</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l01668"></a><span class="lineno"> 1668</span>&#160;</div><div class="line"><a name="l01669"></a><span class="lineno"> 1669</span>&#160;        <span class="keywordflow">if</span> (itr-&gt;value.IsString()) {</div><div class="line"><a name="l01670"></a><span class="lineno"> 1670</span>&#160;            <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> len = itr-&gt;value.GetStringLength();</div><div class="line"><a name="l01671"></a><span class="lineno"> 1671</span>&#160;            <span class="keywordflow">if</span> (len &gt; 0) {</div><div class="line"><a name="l01672"></a><span class="lineno"> 1672</span>&#160;                <span class="keyword">const</span> Ch* s = itr-&gt;value.GetString();</div><div class="line"><a name="l01673"></a><span class="lineno"> 1673</span>&#160;                <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> i = 0;</div><div class="line"><a name="l01674"></a><span class="lineno"> 1674</span>&#160;                <span class="keywordflow">while</span> (i &lt; len &amp;&amp; s[i] != <span class="charliteral">&#39;#&#39;</span>) <span class="comment">// Find the first #</span></div><div class="line"><a name="l01675"></a><span class="lineno"> 1675</span>&#160;                    i++;</div><div class="line"><a name="l01676"></a><span class="lineno"> 1676</span>&#160;</div><div class="line"><a name="l01677"></a><span class="lineno"> 1677</span>&#160;                <span class="keywordflow">if</span> (i &gt; 0) { <span class="comment">// Remote reference, resolve immediately</span></div><div class="line"><a name="l01678"></a><span class="lineno"> 1678</span>&#160;                    <span class="keywordflow">if</span> (remoteProvider_) {</div><div class="line"><a name="l01679"></a><span class="lineno"> 1679</span>&#160;                        <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classrapidjson_1_1_generic_schema_document.html">GenericSchemaDocument</a>* remoteDocument = remoteProvider_-&gt;GetRemoteDocument(s, i)) {</div><div class="line"><a name="l01680"></a><span class="lineno"> 1680</span>&#160;                            PointerType pointer(&amp;s[i], len - i, allocator_);</div><div class="line"><a name="l01681"></a><span class="lineno"> 1681</span>&#160;                            <span class="keywordflow">if</span> (pointer.<a class="code" href="classrapidjson_1_1_generic_pointer.html#a98b96d54c2c3378f1892ffffc501069c">IsValid</a>()) {</div><div class="line"><a name="l01682"></a><span class="lineno"> 1682</span>&#160;                                <span class="keywordflow">if</span> (<span class="keyword">const</span> SchemaType* sc = remoteDocument-&gt;GetSchema(pointer)) {</div><div class="line"><a name="l01683"></a><span class="lineno"> 1683</span>&#160;                                    <span class="keywordflow">if</span> (schema)</div><div class="line"><a name="l01684"></a><span class="lineno"> 1684</span>&#160;                                        *schema = sc;</div><div class="line"><a name="l01685"></a><span class="lineno"> 1685</span>&#160;                                    <span class="keyword">new</span> (schemaMap_.template Push&lt;SchemaEntry&gt;()) SchemaEntry(source, const_cast&lt;SchemaType*&gt;(sc), <span class="keyword">false</span>, allocator_);</div><div class="line"><a name="l01686"></a><span class="lineno"> 1686</span>&#160;                                    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l01687"></a><span class="lineno"> 1687</span>&#160;                                }</div><div class="line"><a name="l01688"></a><span class="lineno"> 1688</span>&#160;                            }</div><div class="line"><a name="l01689"></a><span class="lineno"> 1689</span>&#160;                        }</div><div class="line"><a name="l01690"></a><span class="lineno"> 1690</span>&#160;                    }</div><div class="line"><a name="l01691"></a><span class="lineno"> 1691</span>&#160;                }</div><div class="line"><a name="l01692"></a><span class="lineno"> 1692</span>&#160;                <span class="keywordflow">else</span> <span class="keywordflow">if</span> (s[i] == <span class="charliteral">&#39;#&#39;</span>) { <span class="comment">// Local reference, defer resolution</span></div><div class="line"><a name="l01693"></a><span class="lineno"> 1693</span>&#160;                    PointerType pointer(&amp;s[i], len - i, allocator_);</div><div class="line"><a name="l01694"></a><span class="lineno"> 1694</span>&#160;                    <span class="keywordflow">if</span> (pointer.<a class="code" href="classrapidjson_1_1_generic_pointer.html#a98b96d54c2c3378f1892ffffc501069c">IsValid</a>()) {</div><div class="line"><a name="l01695"></a><span class="lineno"> 1695</span>&#160;                        <span class="keywordflow">if</span> (<span class="keyword">const</span> ValueType* nv = pointer.<a class="code" href="classrapidjson_1_1_generic_pointer.html#af09e26073a7263fc9e8f0c14160f45bd">Get</a>(document))</div><div class="line"><a name="l01696"></a><span class="lineno"> 1696</span>&#160;                            <span class="keywordflow">if</span> (HandleRefSchema(source, schema, *nv, document))</div><div class="line"><a name="l01697"></a><span class="lineno"> 1697</span>&#160;                                <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l01698"></a><span class="lineno"> 1698</span>&#160;</div><div class="line"><a name="l01699"></a><span class="lineno"> 1699</span>&#160;                        <span class="keyword">new</span> (schemaRef_.template Push&lt;SchemaRefEntry&gt;()) SchemaRefEntry(source, pointer, schema, allocator_);</div><div class="line"><a name="l01700"></a><span class="lineno"> 1700</span>&#160;                        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l01701"></a><span class="lineno"> 1701</span>&#160;                    }</div><div class="line"><a name="l01702"></a><span class="lineno"> 1702</span>&#160;                }</div><div class="line"><a name="l01703"></a><span class="lineno"> 1703</span>&#160;            }</div><div class="line"><a name="l01704"></a><span class="lineno"> 1704</span>&#160;        }</div><div class="line"><a name="l01705"></a><span class="lineno"> 1705</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l01706"></a><span class="lineno"> 1706</span>&#160;    }</div><div class="line"><a name="l01707"></a><span class="lineno"> 1707</span>&#160;</div><div class="line"><a name="l01708"></a><span class="lineno"> 1708</span>&#160;    <span class="keyword">const</span> SchemaType* GetSchema(<span class="keyword">const</span> PointerType&amp; pointer)<span class="keyword"> const </span>{</div><div class="line"><a name="l01709"></a><span class="lineno"> 1709</span>&#160;        <span class="keywordflow">for</span> (<span class="keyword">const</span> SchemaEntry* target = schemaMap_.template Bottom&lt;SchemaEntry&gt;(); target != schemaMap_.template End&lt;SchemaEntry&gt;(); ++target)</div><div class="line"><a name="l01710"></a><span class="lineno"> 1710</span>&#160;            <span class="keywordflow">if</span> (pointer == target-&gt;pointer)</div><div class="line"><a name="l01711"></a><span class="lineno"> 1711</span>&#160;                <span class="keywordflow">return</span> target-&gt;schema;</div><div class="line"><a name="l01712"></a><span class="lineno"> 1712</span>&#160;        <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l01713"></a><span class="lineno"> 1713</span>&#160;    }</div><div class="line"><a name="l01714"></a><span class="lineno"> 1714</span>&#160;</div><div class="line"><a name="l01715"></a><span class="lineno"> 1715</span>&#160;    PointerType GetPointer(<span class="keyword">const</span> SchemaType* schema)<span class="keyword"> const </span>{</div><div class="line"><a name="l01716"></a><span class="lineno"> 1716</span>&#160;        <span class="keywordflow">for</span> (<span class="keyword">const</span> SchemaEntry* target = schemaMap_.template Bottom&lt;SchemaEntry&gt;(); target != schemaMap_.template End&lt;SchemaEntry&gt;(); ++target)</div><div class="line"><a name="l01717"></a><span class="lineno"> 1717</span>&#160;            <span class="keywordflow">if</span> (schema == target-&gt;schema)</div><div class="line"><a name="l01718"></a><span class="lineno"> 1718</span>&#160;                <span class="keywordflow">return</span> target-&gt;pointer;</div><div class="line"><a name="l01719"></a><span class="lineno"> 1719</span>&#160;        <span class="keywordflow">return</span> PointerType();</div><div class="line"><a name="l01720"></a><span class="lineno"> 1720</span>&#160;    }</div><div class="line"><a name="l01721"></a><span class="lineno"> 1721</span>&#160;</div><div class="line"><a name="l01722"></a><span class="lineno"> 1722</span>&#160;    <span class="keyword">const</span> SchemaType* GetTypeless()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> typeless_; }</div><div class="line"><a name="l01723"></a><span class="lineno"> 1723</span>&#160;</div><div class="line"><a name="l01724"></a><span class="lineno"> 1724</span>&#160;    <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">size_t</span> kInitialSchemaMapSize = 64;</div><div class="line"><a name="l01725"></a><span class="lineno"> 1725</span>&#160;    <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">size_t</span> kInitialSchemaRefSize = 64;</div><div class="line"><a name="l01726"></a><span class="lineno"> 1726</span>&#160;</div><div class="line"><a name="l01727"></a><span class="lineno"> 1727</span>&#160;    IRemoteSchemaDocumentProviderType* remoteProvider_;</div><div class="line"><a name="l01728"></a><span class="lineno"> 1728</span>&#160;    <a class="code" href="classrapidjson_1_1_allocator.html">Allocator</a> *allocator_;</div><div class="line"><a name="l01729"></a><span class="lineno"> 1729</span>&#160;    <a class="code" href="classrapidjson_1_1_allocator.html">Allocator</a> *ownAllocator_;</div><div class="line"><a name="l01730"></a><span class="lineno"> 1730</span>&#160;    <span class="keyword">const</span> SchemaType* root_;                <span class="comment">//!&lt; Root schema.</span></div><div class="line"><a name="l01731"></a><span class="lineno"> 1731</span>&#160;<span class="comment"></span>    SchemaType* typeless_;</div><div class="line"><a name="l01732"></a><span class="lineno"> 1732</span>&#160;    internal::Stack&lt;Allocator&gt; schemaMap_;  <span class="comment">// Stores created Pointer -&gt; Schemas</span></div><div class="line"><a name="l01733"></a><span class="lineno"> 1733</span>&#160;    internal::Stack&lt;Allocator&gt; schemaRef_;  <span class="comment">// Stores Pointer from $ref and schema which holds the $ref</span></div><div class="line"><a name="l01734"></a><span class="lineno"> 1734</span>&#160;    URIType uri_;</div><div class="line"><a name="l01735"></a><span class="lineno"> 1735</span>&#160;};</div><div class="line"><a name="l01736"></a><span class="lineno"> 1736</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01737"></a><span class="lineno"> 1737</span>&#160;<span class="comment">//! GenericSchemaDocument using Value type.</span></div><div class="line"><a name="l01738"></a><span class="lineno"> 1738</span>&#160;<span class="comment"></span><span class="keyword">typedef</span> <a class="code" href="classrapidjson_1_1_generic_schema_document.html">GenericSchemaDocument&lt;Value&gt;</a> <a class="code" href="classrapidjson_1_1_generic_schema_document.html">SchemaDocument</a>;<span class="comment"></span></div><div class="line"><a name="l01739"></a><span class="lineno"> 1739</span>&#160;<span class="comment">//! IGenericRemoteSchemaDocumentProvider using SchemaDocument.</span></div><div class="line"><a name="l01740"></a><span class="lineno"> 1740</span>&#160;<span class="comment"></span><span class="keyword">typedef</span> <a class="code" href="classrapidjson_1_1_i_generic_remote_schema_document_provider.html">IGenericRemoteSchemaDocumentProvider&lt;SchemaDocument&gt;</a> <a class="code" href="classrapidjson_1_1_i_generic_remote_schema_document_provider.html">IRemoteSchemaDocumentProvider</a>;</div><div class="line"><a name="l01741"></a><span class="lineno"> 1741</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01742"></a><span class="lineno"> 1742</span>&#160;<span class="comment">///////////////////////////////////////////////////////////////////////////////</span></div><div class="line"><a name="l01743"></a><span class="lineno"> 1743</span>&#160;<span class="comment"></span><span class="comment">// GenericSchemaValidator</span></div><div class="line"><a name="l01744"></a><span class="lineno"> 1744</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01745"></a><span class="lineno"> 1745</span>&#160;<span class="comment">//! JSON Schema Validator.</span></div><div class="line"><a name="l01746"></a><span class="lineno"> 1746</span>&#160;<span class="comment"></span><span class="comment">/*!</span></div><div class="line"><a name="l01747"></a><span class="lineno"> 1747</span>&#160;<span class="comment">    A SAX style JSON schema validator.</span></div><div class="line"><a name="l01748"></a><span class="lineno"> 1748</span>&#160;<span class="comment">    It uses a \c GenericSchemaDocument to validate SAX events.</span></div><div class="line"><a name="l01749"></a><span class="lineno"> 1749</span>&#160;<span class="comment">    It delegates the incoming SAX events to an output handler.</span></div><div class="line"><a name="l01750"></a><span class="lineno"> 1750</span>&#160;<span class="comment">    The default output handler does nothing.</span></div><div class="line"><a name="l01751"></a><span class="lineno"> 1751</span>&#160;<span class="comment">    It can be reused multiple times by calling \c Reset().</span></div><div class="line"><a name="l01752"></a><span class="lineno"> 1752</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01753"></a><span class="lineno"> 1753</span>&#160;<span class="comment">    \tparam SchemaDocumentType Type of schema document.</span></div><div class="line"><a name="l01754"></a><span class="lineno"> 1754</span>&#160;<span class="comment">    \tparam OutputHandler Type of output handler. Default handler does nothing.</span></div><div class="line"><a name="l01755"></a><span class="lineno"> 1755</span>&#160;<span class="comment">    \tparam StateAllocator Allocator for storing the internal validation states.</span></div><div class="line"><a name="l01756"></a><span class="lineno"> 1756</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l01757"></a><span class="lineno"> 1757</span>&#160;<span class="keyword">template</span> &lt;</div><div class="line"><a name="l01758"></a><span class="lineno"> 1758</span>&#160;    <span class="keyword">typename</span> SchemaDocumentType,</div><div class="line"><a name="l01759"></a><span class="lineno"> 1759</span>&#160;    <span class="keyword">typename</span> OutputHandler = <a class="code" href="structrapidjson_1_1_base_reader_handler.html">BaseReaderHandler&lt;typename SchemaDocumentType::SchemaType::EncodingType&gt;</a>,</div><div class="line"><a name="l01760"></a><span class="lineno"> 1760</span>&#160;    <span class="keyword">typename</span> StateAllocator = <a class="code" href="classrapidjson_1_1_crt_allocator.html">CrtAllocator</a>&gt;</div><div class="line"><a name="l01761"></a><span class="lineno"> 1761</span>&#160;<span class="keyword">class </span><a class="code" href="classrapidjson_1_1_generic_schema_validator.html">GenericSchemaValidator</a> :</div><div class="line"><a name="l01762"></a><span class="lineno"> 1762</span>&#160;    <span class="keyword">public</span> internal::ISchemaStateFactory&lt;typename SchemaDocumentType::SchemaType&gt;, </div><div class="line"><a name="l01763"></a><span class="lineno"> 1763</span>&#160;    <span class="keyword">public</span> internal::ISchemaValidator,</div><div class="line"><a name="l01764"></a><span class="lineno"> 1764</span>&#160;    <span class="keyword">public</span> internal::IValidationErrorHandler&lt;typename SchemaDocumentType::SchemaType&gt;</div><div class="line"><a name="l01765"></a><span class="lineno"> 1765</span>&#160;{</div><div class="line"><a name="l01766"></a><span class="lineno"> 1766</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l01767"></a><span class="lineno"> 1767</span>&#160;    <span class="keyword">typedef</span> <span class="keyword">typename</span> SchemaDocumentType::SchemaType SchemaType;</div><div class="line"><a name="l01768"></a><span class="lineno"> 1768</span>&#160;    <span class="keyword">typedef</span> <span class="keyword">typename</span> SchemaDocumentType::PointerType PointerType;</div><div class="line"><a name="l01769"></a><span class="lineno"> 1769</span>&#160;    <span class="keyword">typedef</span> <span class="keyword">typename</span> SchemaType::EncodingType EncodingType;</div><div class="line"><a name="l01770"></a><span class="lineno"> 1770</span>&#160;    <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="classrapidjson_1_1_generic_value.html">SchemaType::SValue</a> SValue;</div><div class="line"><a name="l01771"></a><span class="lineno"> 1771</span>&#160;    <span class="keyword">typedef</span> <span class="keyword">typename</span> EncodingType::Ch Ch;</div><div class="line"><a name="l01772"></a><span class="lineno"> 1772</span>&#160;    <span class="keyword">typedef</span> <a class="code" href="structrapidjson_1_1_generic_string_ref.html">GenericStringRef&lt;Ch&gt;</a> StringRefType;</div><div class="line"><a name="l01773"></a><span class="lineno"> 1773</span>&#160;    <span class="keyword">typedef</span> <a class="code" href="classrapidjson_1_1_generic_value.html">GenericValue&lt;EncodingType, StateAllocator&gt;</a> ValueType;</div><div class="line"><a name="l01774"></a><span class="lineno"> 1774</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01775"></a><span class="lineno"> 1775</span>&#160;<span class="comment">    //! Constructor without output handler.</span></div><div class="line"><a name="l01776"></a><span class="lineno"> 1776</span>&#160;<span class="comment"></span><span class="comment">    /*!</span></div><div class="line"><a name="l01777"></a><span class="lineno"> 1777</span>&#160;<span class="comment">        \param schemaDocument The schema document to conform to.</span></div><div class="line"><a name="l01778"></a><span class="lineno"> 1778</span>&#160;<span class="comment">        \param allocator Optional allocator for storing internal validation states.</span></div><div class="line"><a name="l01779"></a><span class="lineno"> 1779</span>&#160;<span class="comment">        \param schemaStackCapacity Optional initial capacity of schema path stack.</span></div><div class="line"><a name="l01780"></a><span class="lineno"> 1780</span>&#160;<span class="comment">        \param documentStackCapacity Optional initial capacity of document path stack.</span></div><div class="line"><a name="l01781"></a><span class="lineno"> 1781</span>&#160;<span class="comment">    */</span></div><div class="line"><a name="l01782"></a><span class="lineno"><a class="line" href="classrapidjson_1_1_generic_schema_validator.html#acc07bd08b00195d84bb5b83f59c593d3"> 1782</a></span>&#160;    <a class="code" href="classrapidjson_1_1_generic_schema_validator.html#acc07bd08b00195d84bb5b83f59c593d3">GenericSchemaValidator</a>(</div><div class="line"><a name="l01783"></a><span class="lineno"> 1783</span>&#160;        <span class="keyword">const</span> SchemaDocumentType&amp; schemaDocument,</div><div class="line"><a name="l01784"></a><span class="lineno"> 1784</span>&#160;        StateAllocator* allocator = 0, </div><div class="line"><a name="l01785"></a><span class="lineno"> 1785</span>&#160;        <span class="keywordtype">size_t</span> schemaStackCapacity = kDefaultSchemaStackCapacity,</div><div class="line"><a name="l01786"></a><span class="lineno"> 1786</span>&#160;        <span class="keywordtype">size_t</span> documentStackCapacity = kDefaultDocumentStackCapacity)</div><div class="line"><a name="l01787"></a><span class="lineno"> 1787</span>&#160;        :</div><div class="line"><a name="l01788"></a><span class="lineno"> 1788</span>&#160;        schemaDocument_(&amp;schemaDocument),</div><div class="line"><a name="l01789"></a><span class="lineno"> 1789</span>&#160;        root_(schemaDocument.GetRoot()),</div><div class="line"><a name="l01790"></a><span class="lineno"> 1790</span>&#160;        stateAllocator_(allocator),</div><div class="line"><a name="l01791"></a><span class="lineno"> 1791</span>&#160;        ownStateAllocator_(0),</div><div class="line"><a name="l01792"></a><span class="lineno"> 1792</span>&#160;        schemaStack_(allocator, schemaStackCapacity),</div><div class="line"><a name="l01793"></a><span class="lineno"> 1793</span>&#160;        documentStack_(allocator, documentStackCapacity),</div><div class="line"><a name="l01794"></a><span class="lineno"> 1794</span>&#160;        outputHandler_(0),</div><div class="line"><a name="l01795"></a><span class="lineno"> 1795</span>&#160;        error_(<a class="code" href="namespacerapidjson.html#ae79a4751c1c460ff0de5ecc07874f3e4acf030b422a32c3647c7c5973bd4dd0a9">kObjectType</a>),</div><div class="line"><a name="l01796"></a><span class="lineno"> 1796</span>&#160;        currentError_(),</div><div class="line"><a name="l01797"></a><span class="lineno"> 1797</span>&#160;        missingDependents_(),</div><div class="line"><a name="l01798"></a><span class="lineno"> 1798</span>&#160;        valid_(true)</div><div class="line"><a name="l01799"></a><span class="lineno"> 1799</span>&#160;#if RAPIDJSON_SCHEMA_VERBOSE</div><div class="line"><a name="l01800"></a><span class="lineno"> 1800</span>&#160;        , depth_(0)</div><div class="line"><a name="l01801"></a><span class="lineno"> 1801</span>&#160;#endif</div><div class="line"><a name="l01802"></a><span class="lineno"> 1802</span>&#160;    {</div><div class="line"><a name="l01803"></a><span class="lineno"> 1803</span>&#160;    }</div><div class="line"><a name="l01804"></a><span class="lineno"> 1804</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01805"></a><span class="lineno"> 1805</span>&#160;<span class="comment">    //! Constructor with output handler.</span></div><div class="line"><a name="l01806"></a><span class="lineno"> 1806</span>&#160;<span class="comment"></span><span class="comment">    /*!</span></div><div class="line"><a name="l01807"></a><span class="lineno"> 1807</span>&#160;<span class="comment">        \param schemaDocument The schema document to conform to.</span></div><div class="line"><a name="l01808"></a><span class="lineno"> 1808</span>&#160;<span class="comment">        \param allocator Optional allocator for storing internal validation states.</span></div><div class="line"><a name="l01809"></a><span class="lineno"> 1809</span>&#160;<span class="comment">        \param schemaStackCapacity Optional initial capacity of schema path stack.</span></div><div class="line"><a name="l01810"></a><span class="lineno"> 1810</span>&#160;<span class="comment">        \param documentStackCapacity Optional initial capacity of document path stack.</span></div><div class="line"><a name="l01811"></a><span class="lineno"> 1811</span>&#160;<span class="comment">    */</span></div><div class="line"><a name="l01812"></a><span class="lineno"><a class="line" href="classrapidjson_1_1_generic_schema_validator.html#a0e1d8f19381bd53d77cc00a9a6dcd067"> 1812</a></span>&#160;    <a class="code" href="classrapidjson_1_1_generic_schema_validator.html#a0e1d8f19381bd53d77cc00a9a6dcd067">GenericSchemaValidator</a>(</div><div class="line"><a name="l01813"></a><span class="lineno"> 1813</span>&#160;        <span class="keyword">const</span> SchemaDocumentType&amp; schemaDocument,</div><div class="line"><a name="l01814"></a><span class="lineno"> 1814</span>&#160;        OutputHandler&amp; outputHandler,</div><div class="line"><a name="l01815"></a><span class="lineno"> 1815</span>&#160;        StateAllocator* allocator = 0, </div><div class="line"><a name="l01816"></a><span class="lineno"> 1816</span>&#160;        <span class="keywordtype">size_t</span> schemaStackCapacity = kDefaultSchemaStackCapacity,</div><div class="line"><a name="l01817"></a><span class="lineno"> 1817</span>&#160;        <span class="keywordtype">size_t</span> documentStackCapacity = kDefaultDocumentStackCapacity)</div><div class="line"><a name="l01818"></a><span class="lineno"> 1818</span>&#160;        :</div><div class="line"><a name="l01819"></a><span class="lineno"> 1819</span>&#160;        schemaDocument_(&amp;schemaDocument),</div><div class="line"><a name="l01820"></a><span class="lineno"> 1820</span>&#160;        root_(schemaDocument.GetRoot()),</div><div class="line"><a name="l01821"></a><span class="lineno"> 1821</span>&#160;        stateAllocator_(allocator),</div><div class="line"><a name="l01822"></a><span class="lineno"> 1822</span>&#160;        ownStateAllocator_(0),</div><div class="line"><a name="l01823"></a><span class="lineno"> 1823</span>&#160;        schemaStack_(allocator, schemaStackCapacity),</div><div class="line"><a name="l01824"></a><span class="lineno"> 1824</span>&#160;        documentStack_(allocator, documentStackCapacity),</div><div class="line"><a name="l01825"></a><span class="lineno"> 1825</span>&#160;        outputHandler_(&amp;outputHandler),</div><div class="line"><a name="l01826"></a><span class="lineno"> 1826</span>&#160;        error_(<a class="code" href="namespacerapidjson.html#ae79a4751c1c460ff0de5ecc07874f3e4acf030b422a32c3647c7c5973bd4dd0a9">kObjectType</a>),</div><div class="line"><a name="l01827"></a><span class="lineno"> 1827</span>&#160;        currentError_(),</div><div class="line"><a name="l01828"></a><span class="lineno"> 1828</span>&#160;        missingDependents_(),</div><div class="line"><a name="l01829"></a><span class="lineno"> 1829</span>&#160;        valid_(true)</div><div class="line"><a name="l01830"></a><span class="lineno"> 1830</span>&#160;#if RAPIDJSON_SCHEMA_VERBOSE</div><div class="line"><a name="l01831"></a><span class="lineno"> 1831</span>&#160;        , depth_(0)</div><div class="line"><a name="l01832"></a><span class="lineno"> 1832</span>&#160;#endif</div><div class="line"><a name="l01833"></a><span class="lineno"> 1833</span>&#160;    {</div><div class="line"><a name="l01834"></a><span class="lineno"> 1834</span>&#160;    }</div><div class="line"><a name="l01835"></a><span class="lineno"> 1835</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01836"></a><span class="lineno"> 1836</span>&#160;<span class="comment">    //! Destructor.</span></div><div class="line"><a name="l01837"></a><span class="lineno"><a class="line" href="classrapidjson_1_1_generic_schema_validator.html#ad9f00d71bf62b8983cf2514c43fb1572"> 1837</a></span>&#160;<span class="comment"></span>    <a class="code" href="classrapidjson_1_1_generic_schema_validator.html#ad9f00d71bf62b8983cf2514c43fb1572">~GenericSchemaValidator</a>() {</div><div class="line"><a name="l01838"></a><span class="lineno"> 1838</span>&#160;        Reset();</div><div class="line"><a name="l01839"></a><span class="lineno"> 1839</span>&#160;        <a class="code" href="rapidjson_8h.html#a52c941c3fdd646527cdcd42aa846a28a">RAPIDJSON_DELETE</a>(ownStateAllocator_);</div><div class="line"><a name="l01840"></a><span class="lineno"> 1840</span>&#160;    }</div><div class="line"><a name="l01841"></a><span class="lineno"> 1841</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01842"></a><span class="lineno"> 1842</span>&#160;<span class="comment">    //! Reset the internal states.</span></div><div class="line"><a name="l01843"></a><span class="lineno"><a class="line" href="classrapidjson_1_1_generic_schema_validator.html#afe6cd0d9088a1d4cf8100c0efc9f76fc"> 1843</a></span>&#160;<span class="comment"></span>    <span class="keywordtype">void</span> <a class="code" href="classrapidjson_1_1_generic_schema_validator.html#afe6cd0d9088a1d4cf8100c0efc9f76fc">Reset</a>() {</div><div class="line"><a name="l01844"></a><span class="lineno"> 1844</span>&#160;        <span class="keywordflow">while</span> (!schemaStack_.Empty())</div><div class="line"><a name="l01845"></a><span class="lineno"> 1845</span>&#160;            PopSchema();</div><div class="line"><a name="l01846"></a><span class="lineno"> 1846</span>&#160;        documentStack_.Clear();</div><div class="line"><a name="l01847"></a><span class="lineno"> 1847</span>&#160;        error_.SetObject();</div><div class="line"><a name="l01848"></a><span class="lineno"> 1848</span>&#160;        currentError_.SetNull();</div><div class="line"><a name="l01849"></a><span class="lineno"> 1849</span>&#160;        missingDependents_.SetNull();</div><div class="line"><a name="l01850"></a><span class="lineno"> 1850</span>&#160;        valid_ = <span class="keyword">true</span>;</div><div class="line"><a name="l01851"></a><span class="lineno"> 1851</span>&#160;    }</div><div class="line"><a name="l01852"></a><span class="lineno"> 1852</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01853"></a><span class="lineno"> 1853</span>&#160;<span class="comment">    //! Checks whether the current state is valid.</span></div><div class="line"><a name="l01854"></a><span class="lineno"> 1854</span>&#160;<span class="comment"></span>    <span class="comment">// Implementation of ISchemaValidator</span></div><div class="line"><a name="l01855"></a><span class="lineno"><a class="line" href="classrapidjson_1_1_generic_schema_validator.html#ad32a9ad31dbb588edaaf038ab053275b"> 1855</a></span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classrapidjson_1_1_generic_schema_validator.html#ad32a9ad31dbb588edaaf038ab053275b">IsValid</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> valid_; }</div><div class="line"><a name="l01856"></a><span class="lineno"> 1856</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01857"></a><span class="lineno"> 1857</span>&#160;<span class="comment">    //! Gets the error object.</span></div><div class="line"><a name="l01858"></a><span class="lineno"><a class="line" href="classrapidjson_1_1_generic_schema_validator.html#a422c16457e512835b0d0f64ec1c81ba2"> 1858</a></span>&#160;<span class="comment"></span>    ValueType&amp; <a class="code" href="classrapidjson_1_1_generic_schema_validator.html#a422c16457e512835b0d0f64ec1c81ba2">GetError</a>() { <span class="keywordflow">return</span> error_; }</div><div class="line"><a name="l01859"></a><span class="lineno"> 1859</span>&#160;    <span class="keyword">const</span> ValueType&amp; GetError()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> error_; }</div><div class="line"><a name="l01860"></a><span class="lineno"> 1860</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01861"></a><span class="lineno"> 1861</span>&#160;<span class="comment">    //! Gets the JSON pointer pointed to the invalid schema.</span></div><div class="line"><a name="l01862"></a><span class="lineno"><a class="line" href="classrapidjson_1_1_generic_schema_validator.html#a3238efb9d9144c2d6577362d8dc5f61b"> 1862</a></span>&#160;<span class="comment"></span>    PointerType <a class="code" href="classrapidjson_1_1_generic_schema_validator.html#a3238efb9d9144c2d6577362d8dc5f61b">GetInvalidSchemaPointer</a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l01863"></a><span class="lineno"> 1863</span>&#160;        <span class="keywordflow">return</span> schemaStack_.Empty() ? PointerType() : CurrentSchema().GetPointer();</div><div class="line"><a name="l01864"></a><span class="lineno"> 1864</span>&#160;    }</div><div class="line"><a name="l01865"></a><span class="lineno"> 1865</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01866"></a><span class="lineno"> 1866</span>&#160;<span class="comment">    //! Gets the keyword of invalid schema.</span></div><div class="line"><a name="l01867"></a><span class="lineno"><a class="line" href="classrapidjson_1_1_generic_schema_validator.html#a03bcd5497a574cffbd066d0aec2b5585"> 1867</a></span>&#160;<span class="comment"></span>    <span class="keyword">const</span> Ch* <a class="code" href="classrapidjson_1_1_generic_schema_validator.html#a03bcd5497a574cffbd066d0aec2b5585">GetInvalidSchemaKeyword</a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l01868"></a><span class="lineno"> 1868</span>&#160;        <span class="keywordflow">return</span> schemaStack_.Empty() ? 0 : CurrentContext().invalidKeyword;</div><div class="line"><a name="l01869"></a><span class="lineno"> 1869</span>&#160;    }</div><div class="line"><a name="l01870"></a><span class="lineno"> 1870</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01871"></a><span class="lineno"> 1871</span>&#160;<span class="comment">    //! Gets the JSON pointer pointed to the invalid value.</span></div><div class="line"><a name="l01872"></a><span class="lineno"><a class="line" href="classrapidjson_1_1_generic_schema_validator.html#a60dfb4a89593c8d3ca4c89a6202feb52"> 1872</a></span>&#160;<span class="comment"></span>    PointerType <a class="code" href="classrapidjson_1_1_generic_schema_validator.html#a60dfb4a89593c8d3ca4c89a6202feb52">GetInvalidDocumentPointer</a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l01873"></a><span class="lineno"> 1873</span>&#160;        <span class="keywordflow">if</span> (documentStack_.Empty()) {</div><div class="line"><a name="l01874"></a><span class="lineno"> 1874</span>&#160;            <span class="keywordflow">return</span> PointerType();</div><div class="line"><a name="l01875"></a><span class="lineno"> 1875</span>&#160;        }</div><div class="line"><a name="l01876"></a><span class="lineno"> 1876</span>&#160;        <span class="keywordflow">else</span> {</div><div class="line"><a name="l01877"></a><span class="lineno"> 1877</span>&#160;            <span class="keywordflow">return</span> PointerType(documentStack_.template Bottom&lt;Ch&gt;(), documentStack_.GetSize() / <span class="keyword">sizeof</span>(Ch));</div><div class="line"><a name="l01878"></a><span class="lineno"> 1878</span>&#160;        }</div><div class="line"><a name="l01879"></a><span class="lineno"> 1879</span>&#160;    }</div><div class="line"><a name="l01880"></a><span class="lineno"> 1880</span>&#160;</div><div class="line"><a name="l01881"></a><span class="lineno"> 1881</span>&#160;    <span class="keywordtype">void</span> NotMultipleOf(int64_t actual, <span class="keyword">const</span> SValue&amp; expected) {</div><div class="line"><a name="l01882"></a><span class="lineno"> 1882</span>&#160;        AddNumberError(SchemaType::GetMultipleOfString(), ValueType(actual).Move(), expected);</div><div class="line"><a name="l01883"></a><span class="lineno"> 1883</span>&#160;    }</div><div class="line"><a name="l01884"></a><span class="lineno"> 1884</span>&#160;    <span class="keywordtype">void</span> NotMultipleOf(uint64_t actual, <span class="keyword">const</span> SValue&amp; expected) {</div><div class="line"><a name="l01885"></a><span class="lineno"> 1885</span>&#160;        AddNumberError(SchemaType::GetMultipleOfString(), ValueType(actual).Move(), expected);</div><div class="line"><a name="l01886"></a><span class="lineno"> 1886</span>&#160;    }</div><div class="line"><a name="l01887"></a><span class="lineno"> 1887</span>&#160;    <span class="keywordtype">void</span> NotMultipleOf(<span class="keywordtype">double</span> actual, <span class="keyword">const</span> SValue&amp; expected) {</div><div class="line"><a name="l01888"></a><span class="lineno"> 1888</span>&#160;        AddNumberError(SchemaType::GetMultipleOfString(), ValueType(actual).Move(), expected);</div><div class="line"><a name="l01889"></a><span class="lineno"> 1889</span>&#160;    }</div><div class="line"><a name="l01890"></a><span class="lineno"> 1890</span>&#160;    <span class="keywordtype">void</span> AboveMaximum(int64_t actual, <span class="keyword">const</span> SValue&amp; expected, <span class="keywordtype">bool</span> exclusive) {</div><div class="line"><a name="l01891"></a><span class="lineno"> 1891</span>&#160;        AddNumberError(SchemaType::GetMaximumString(), ValueType(actual).Move(), expected,</div><div class="line"><a name="l01892"></a><span class="lineno"> 1892</span>&#160;            exclusive ? &amp;SchemaType::GetExclusiveMaximumString : 0);</div><div class="line"><a name="l01893"></a><span class="lineno"> 1893</span>&#160;    }</div><div class="line"><a name="l01894"></a><span class="lineno"> 1894</span>&#160;    <span class="keywordtype">void</span> AboveMaximum(uint64_t actual, <span class="keyword">const</span> SValue&amp; expected, <span class="keywordtype">bool</span> exclusive) {</div><div class="line"><a name="l01895"></a><span class="lineno"> 1895</span>&#160;        AddNumberError(SchemaType::GetMaximumString(), ValueType(actual).Move(), expected,</div><div class="line"><a name="l01896"></a><span class="lineno"> 1896</span>&#160;            exclusive ? &amp;SchemaType::GetExclusiveMaximumString : 0);</div><div class="line"><a name="l01897"></a><span class="lineno"> 1897</span>&#160;    }</div><div class="line"><a name="l01898"></a><span class="lineno"> 1898</span>&#160;    <span class="keywordtype">void</span> AboveMaximum(<span class="keywordtype">double</span> actual, <span class="keyword">const</span> SValue&amp; expected, <span class="keywordtype">bool</span> exclusive) {</div><div class="line"><a name="l01899"></a><span class="lineno"> 1899</span>&#160;        AddNumberError(SchemaType::GetMaximumString(), ValueType(actual).Move(), expected,</div><div class="line"><a name="l01900"></a><span class="lineno"> 1900</span>&#160;            exclusive ? &amp;SchemaType::GetExclusiveMaximumString : 0);</div><div class="line"><a name="l01901"></a><span class="lineno"> 1901</span>&#160;    }</div><div class="line"><a name="l01902"></a><span class="lineno"> 1902</span>&#160;    <span class="keywordtype">void</span> BelowMinimum(int64_t actual, <span class="keyword">const</span> SValue&amp; expected, <span class="keywordtype">bool</span> exclusive) {</div><div class="line"><a name="l01903"></a><span class="lineno"> 1903</span>&#160;        AddNumberError(SchemaType::GetMinimumString(), ValueType(actual).Move(), expected,</div><div class="line"><a name="l01904"></a><span class="lineno"> 1904</span>&#160;            exclusive ? &amp;SchemaType::GetExclusiveMinimumString : 0);</div><div class="line"><a name="l01905"></a><span class="lineno"> 1905</span>&#160;    }</div><div class="line"><a name="l01906"></a><span class="lineno"> 1906</span>&#160;    <span class="keywordtype">void</span> BelowMinimum(uint64_t actual, <span class="keyword">const</span> SValue&amp; expected, <span class="keywordtype">bool</span> exclusive) {</div><div class="line"><a name="l01907"></a><span class="lineno"> 1907</span>&#160;        AddNumberError(SchemaType::GetMinimumString(), ValueType(actual).Move(), expected,</div><div class="line"><a name="l01908"></a><span class="lineno"> 1908</span>&#160;            exclusive ? &amp;SchemaType::GetExclusiveMinimumString : 0);</div><div class="line"><a name="l01909"></a><span class="lineno"> 1909</span>&#160;    }</div><div class="line"><a name="l01910"></a><span class="lineno"> 1910</span>&#160;    <span class="keywordtype">void</span> BelowMinimum(<span class="keywordtype">double</span> actual, <span class="keyword">const</span> SValue&amp; expected, <span class="keywordtype">bool</span> exclusive) {</div><div class="line"><a name="l01911"></a><span class="lineno"> 1911</span>&#160;        AddNumberError(SchemaType::GetMinimumString(), ValueType(actual).Move(), expected,</div><div class="line"><a name="l01912"></a><span class="lineno"> 1912</span>&#160;            exclusive ? &amp;SchemaType::GetExclusiveMinimumString : 0);</div><div class="line"><a name="l01913"></a><span class="lineno"> 1913</span>&#160;    }</div><div class="line"><a name="l01914"></a><span class="lineno"> 1914</span>&#160;</div><div class="line"><a name="l01915"></a><span class="lineno"> 1915</span>&#160;    <span class="keywordtype">void</span> TooLong(<span class="keyword">const</span> Ch* str, <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> length, <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> expected) {</div><div class="line"><a name="l01916"></a><span class="lineno"> 1916</span>&#160;        AddNumberError(SchemaType::GetMaxLengthString(),</div><div class="line"><a name="l01917"></a><span class="lineno"> 1917</span>&#160;            ValueType(str, length, GetStateAllocator()).Move(), SValue(expected).Move());</div><div class="line"><a name="l01918"></a><span class="lineno"> 1918</span>&#160;    }</div><div class="line"><a name="l01919"></a><span class="lineno"> 1919</span>&#160;    <span class="keywordtype">void</span> TooShort(<span class="keyword">const</span> Ch* str, <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> length, <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> expected) {</div><div class="line"><a name="l01920"></a><span class="lineno"> 1920</span>&#160;        AddNumberError(SchemaType::GetMinLengthString(),</div><div class="line"><a name="l01921"></a><span class="lineno"> 1921</span>&#160;            ValueType(str, length, GetStateAllocator()).Move(), SValue(expected).Move());</div><div class="line"><a name="l01922"></a><span class="lineno"> 1922</span>&#160;    }</div><div class="line"><a name="l01923"></a><span class="lineno"> 1923</span>&#160;    <span class="keywordtype">void</span> DoesNotMatch(<span class="keyword">const</span> Ch* str, <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> length) {</div><div class="line"><a name="l01924"></a><span class="lineno"> 1924</span>&#160;        currentError_.SetObject();</div><div class="line"><a name="l01925"></a><span class="lineno"> 1925</span>&#160;        currentError_.AddMember(GetActualString(), ValueType(str, length, GetStateAllocator()).Move(), GetStateAllocator());</div><div class="line"><a name="l01926"></a><span class="lineno"> 1926</span>&#160;        AddCurrentError(SchemaType::GetPatternString());</div><div class="line"><a name="l01927"></a><span class="lineno"> 1927</span>&#160;    }</div><div class="line"><a name="l01928"></a><span class="lineno"> 1928</span>&#160;</div><div class="line"><a name="l01929"></a><span class="lineno"> 1929</span>&#160;    <span class="keywordtype">void</span> DisallowedItem(<a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> index) {</div><div class="line"><a name="l01930"></a><span class="lineno"> 1930</span>&#160;        currentError_.SetObject();</div><div class="line"><a name="l01931"></a><span class="lineno"> 1931</span>&#160;        currentError_.AddMember(GetDisallowedString(), ValueType(index).Move(), GetStateAllocator());</div><div class="line"><a name="l01932"></a><span class="lineno"> 1932</span>&#160;        AddCurrentError(SchemaType::GetAdditionalItemsString(), <span class="keyword">true</span>);</div><div class="line"><a name="l01933"></a><span class="lineno"> 1933</span>&#160;    }</div><div class="line"><a name="l01934"></a><span class="lineno"> 1934</span>&#160;    <span class="keywordtype">void</span> TooFewItems(<a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> actualCount, <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> expectedCount) {</div><div class="line"><a name="l01935"></a><span class="lineno"> 1935</span>&#160;        AddNumberError(SchemaType::GetMinItemsString(),</div><div class="line"><a name="l01936"></a><span class="lineno"> 1936</span>&#160;            ValueType(actualCount).Move(), SValue(expectedCount).Move());</div><div class="line"><a name="l01937"></a><span class="lineno"> 1937</span>&#160;    }</div><div class="line"><a name="l01938"></a><span class="lineno"> 1938</span>&#160;    <span class="keywordtype">void</span> TooManyItems(<a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> actualCount, <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> expectedCount) {</div><div class="line"><a name="l01939"></a><span class="lineno"> 1939</span>&#160;        AddNumberError(SchemaType::GetMaxItemsString(),</div><div class="line"><a name="l01940"></a><span class="lineno"> 1940</span>&#160;            ValueType(actualCount).Move(), SValue(expectedCount).Move());</div><div class="line"><a name="l01941"></a><span class="lineno"> 1941</span>&#160;    }</div><div class="line"><a name="l01942"></a><span class="lineno"> 1942</span>&#160;    <span class="keywordtype">void</span> DuplicateItems(<a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> index1, <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> index2) {</div><div class="line"><a name="l01943"></a><span class="lineno"> 1943</span>&#160;        ValueType duplicates(<a class="code" href="namespacerapidjson.html#ae79a4751c1c460ff0de5ecc07874f3e4a058c622e1e7d59419ae58b895cbce468">kArrayType</a>);</div><div class="line"><a name="l01944"></a><span class="lineno"> 1944</span>&#160;        duplicates.<a class="code" href="classrapidjson_1_1_generic_value.html#a0ec9f34bef5890241d4bc882b73b1db4">PushBack</a>(index1, GetStateAllocator());</div><div class="line"><a name="l01945"></a><span class="lineno"> 1945</span>&#160;        duplicates.<a class="code" href="classrapidjson_1_1_generic_value.html#a0ec9f34bef5890241d4bc882b73b1db4">PushBack</a>(index2, GetStateAllocator());</div><div class="line"><a name="l01946"></a><span class="lineno"> 1946</span>&#160;        currentError_.<a class="code" href="classrapidjson_1_1_generic_value.html#a7cb3cbaefe4fb99aaf9f155fb4ee039b">SetObject</a>();</div><div class="line"><a name="l01947"></a><span class="lineno"> 1947</span>&#160;        currentError_.<a class="code" href="classrapidjson_1_1_generic_value.html#ab018d734d189532b27943bc45776ba68">AddMember</a>(GetDuplicatesString(), duplicates, GetStateAllocator());</div><div class="line"><a name="l01948"></a><span class="lineno"> 1948</span>&#160;        AddCurrentError(SchemaType::GetUniqueItemsString(), <span class="keyword">true</span>);</div><div class="line"><a name="l01949"></a><span class="lineno"> 1949</span>&#160;    }</div><div class="line"><a name="l01950"></a><span class="lineno"> 1950</span>&#160;</div><div class="line"><a name="l01951"></a><span class="lineno"> 1951</span>&#160;    <span class="keywordtype">void</span> TooManyProperties(<a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> actualCount, <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> expectedCount) {</div><div class="line"><a name="l01952"></a><span class="lineno"> 1952</span>&#160;        AddNumberError(SchemaType::GetMaxPropertiesString(),</div><div class="line"><a name="l01953"></a><span class="lineno"> 1953</span>&#160;            ValueType(actualCount).Move(), SValue(expectedCount).Move());</div><div class="line"><a name="l01954"></a><span class="lineno"> 1954</span>&#160;    }</div><div class="line"><a name="l01955"></a><span class="lineno"> 1955</span>&#160;    <span class="keywordtype">void</span> TooFewProperties(<a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> actualCount, <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> expectedCount) {</div><div class="line"><a name="l01956"></a><span class="lineno"> 1956</span>&#160;        AddNumberError(SchemaType::GetMinPropertiesString(),</div><div class="line"><a name="l01957"></a><span class="lineno"> 1957</span>&#160;            ValueType(actualCount).Move(), SValue(expectedCount).Move());</div><div class="line"><a name="l01958"></a><span class="lineno"> 1958</span>&#160;    }</div><div class="line"><a name="l01959"></a><span class="lineno"> 1959</span>&#160;    <span class="keywordtype">void</span> StartMissingProperties() {</div><div class="line"><a name="l01960"></a><span class="lineno"> 1960</span>&#160;        currentError_.SetArray();</div><div class="line"><a name="l01961"></a><span class="lineno"> 1961</span>&#160;    }</div><div class="line"><a name="l01962"></a><span class="lineno"> 1962</span>&#160;    <span class="keywordtype">void</span> AddMissingProperty(<span class="keyword">const</span> SValue&amp; name) {</div><div class="line"><a name="l01963"></a><span class="lineno"> 1963</span>&#160;        currentError_.PushBack(ValueType(name, GetStateAllocator()).Move(), GetStateAllocator());</div><div class="line"><a name="l01964"></a><span class="lineno"> 1964</span>&#160;    }</div><div class="line"><a name="l01965"></a><span class="lineno"> 1965</span>&#160;    <span class="keywordtype">bool</span> EndMissingProperties() {</div><div class="line"><a name="l01966"></a><span class="lineno"> 1966</span>&#160;        <span class="keywordflow">if</span> (currentError_.Empty())</div><div class="line"><a name="l01967"></a><span class="lineno"> 1967</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l01968"></a><span class="lineno"> 1968</span>&#160;        ValueType error(<a class="code" href="namespacerapidjson.html#ae79a4751c1c460ff0de5ecc07874f3e4acf030b422a32c3647c7c5973bd4dd0a9">kObjectType</a>);</div><div class="line"><a name="l01969"></a><span class="lineno"> 1969</span>&#160;        error.<a class="code" href="classrapidjson_1_1_generic_value.html#ab018d734d189532b27943bc45776ba68">AddMember</a>(GetMissingString(), currentError_, GetStateAllocator());</div><div class="line"><a name="l01970"></a><span class="lineno"> 1970</span>&#160;        currentError_ = error;</div><div class="line"><a name="l01971"></a><span class="lineno"> 1971</span>&#160;        AddCurrentError(SchemaType::GetRequiredString());</div><div class="line"><a name="l01972"></a><span class="lineno"> 1972</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l01973"></a><span class="lineno"> 1973</span>&#160;    }</div><div class="line"><a name="l01974"></a><span class="lineno"> 1974</span>&#160;    <span class="keywordtype">void</span> PropertyViolations(ISchemaValidator** subvalidators, <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> count) {</div><div class="line"><a name="l01975"></a><span class="lineno"> 1975</span>&#160;        <span class="keywordflow">for</span> (<a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> i = 0; i &lt; count; ++i)</div><div class="line"><a name="l01976"></a><span class="lineno"> 1976</span>&#160;            MergeError(static_cast&lt;GenericSchemaValidator*&gt;(subvalidators[i])-&gt;GetError());</div><div class="line"><a name="l01977"></a><span class="lineno"> 1977</span>&#160;    }</div><div class="line"><a name="l01978"></a><span class="lineno"> 1978</span>&#160;    <span class="keywordtype">void</span> DisallowedProperty(<span class="keyword">const</span> Ch* name, <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> length) {</div><div class="line"><a name="l01979"></a><span class="lineno"> 1979</span>&#160;        currentError_.SetObject();</div><div class="line"><a name="l01980"></a><span class="lineno"> 1980</span>&#160;        currentError_.AddMember(GetDisallowedString(), ValueType(name, length, GetStateAllocator()).Move(), GetStateAllocator());</div><div class="line"><a name="l01981"></a><span class="lineno"> 1981</span>&#160;        AddCurrentError(SchemaType::GetAdditionalPropertiesString(), <span class="keyword">true</span>);</div><div class="line"><a name="l01982"></a><span class="lineno"> 1982</span>&#160;    }</div><div class="line"><a name="l01983"></a><span class="lineno"> 1983</span>&#160;</div><div class="line"><a name="l01984"></a><span class="lineno"> 1984</span>&#160;    <span class="keywordtype">void</span> StartDependencyErrors() {</div><div class="line"><a name="l01985"></a><span class="lineno"> 1985</span>&#160;        currentError_.SetObject();</div><div class="line"><a name="l01986"></a><span class="lineno"> 1986</span>&#160;    }</div><div class="line"><a name="l01987"></a><span class="lineno"> 1987</span>&#160;    <span class="keywordtype">void</span> StartMissingDependentProperties() {</div><div class="line"><a name="l01988"></a><span class="lineno"> 1988</span>&#160;        missingDependents_.SetArray();</div><div class="line"><a name="l01989"></a><span class="lineno"> 1989</span>&#160;    }</div><div class="line"><a name="l01990"></a><span class="lineno"> 1990</span>&#160;    <span class="keywordtype">void</span> AddMissingDependentProperty(<span class="keyword">const</span> SValue&amp; targetName) {</div><div class="line"><a name="l01991"></a><span class="lineno"> 1991</span>&#160;        missingDependents_.PushBack(ValueType(targetName, GetStateAllocator()).Move(), GetStateAllocator());</div><div class="line"><a name="l01992"></a><span class="lineno"> 1992</span>&#160;    }</div><div class="line"><a name="l01993"></a><span class="lineno"> 1993</span>&#160;    <span class="keywordtype">void</span> EndMissingDependentProperties(<span class="keyword">const</span> SValue&amp; sourceName) {</div><div class="line"><a name="l01994"></a><span class="lineno"> 1994</span>&#160;        <span class="keywordflow">if</span> (!missingDependents_.Empty())</div><div class="line"><a name="l01995"></a><span class="lineno"> 1995</span>&#160;            currentError_.AddMember(ValueType(sourceName, GetStateAllocator()).Move(),</div><div class="line"><a name="l01996"></a><span class="lineno"> 1996</span>&#160;                missingDependents_, GetStateAllocator());</div><div class="line"><a name="l01997"></a><span class="lineno"> 1997</span>&#160;    }</div><div class="line"><a name="l01998"></a><span class="lineno"> 1998</span>&#160;    <span class="keywordtype">void</span> AddDependencySchemaError(<span class="keyword">const</span> SValue&amp; sourceName, ISchemaValidator* subvalidator) {</div><div class="line"><a name="l01999"></a><span class="lineno"> 1999</span>&#160;        currentError_.AddMember(ValueType(sourceName, GetStateAllocator()).Move(),</div><div class="line"><a name="l02000"></a><span class="lineno"> 2000</span>&#160;            static_cast&lt;GenericSchemaValidator*&gt;(subvalidator)-&gt;GetError(), GetStateAllocator());</div><div class="line"><a name="l02001"></a><span class="lineno"> 2001</span>&#160;    }</div><div class="line"><a name="l02002"></a><span class="lineno"> 2002</span>&#160;    <span class="keywordtype">bool</span> EndDependencyErrors() {</div><div class="line"><a name="l02003"></a><span class="lineno"> 2003</span>&#160;        <span class="keywordflow">if</span> (currentError_.ObjectEmpty())</div><div class="line"><a name="l02004"></a><span class="lineno"> 2004</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l02005"></a><span class="lineno"> 2005</span>&#160;        ValueType error(<a class="code" href="namespacerapidjson.html#ae79a4751c1c460ff0de5ecc07874f3e4acf030b422a32c3647c7c5973bd4dd0a9">kObjectType</a>);</div><div class="line"><a name="l02006"></a><span class="lineno"> 2006</span>&#160;        error.<a class="code" href="classrapidjson_1_1_generic_value.html#ab018d734d189532b27943bc45776ba68">AddMember</a>(GetErrorsString(), currentError_, GetStateAllocator());</div><div class="line"><a name="l02007"></a><span class="lineno"> 2007</span>&#160;        currentError_ = error;</div><div class="line"><a name="l02008"></a><span class="lineno"> 2008</span>&#160;        AddCurrentError(SchemaType::GetDependenciesString());</div><div class="line"><a name="l02009"></a><span class="lineno"> 2009</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l02010"></a><span class="lineno"> 2010</span>&#160;    }</div><div class="line"><a name="l02011"></a><span class="lineno"> 2011</span>&#160;</div><div class="line"><a name="l02012"></a><span class="lineno"> 2012</span>&#160;    <span class="keywordtype">void</span> DisallowedValue() {</div><div class="line"><a name="l02013"></a><span class="lineno"> 2013</span>&#160;        currentError_.SetObject();</div><div class="line"><a name="l02014"></a><span class="lineno"> 2014</span>&#160;        AddCurrentError(SchemaType::GetEnumString());</div><div class="line"><a name="l02015"></a><span class="lineno"> 2015</span>&#160;    }</div><div class="line"><a name="l02016"></a><span class="lineno"> 2016</span>&#160;    <span class="keywordtype">void</span> StartDisallowedType() {</div><div class="line"><a name="l02017"></a><span class="lineno"> 2017</span>&#160;        currentError_.SetArray();</div><div class="line"><a name="l02018"></a><span class="lineno"> 2018</span>&#160;    }</div><div class="line"><a name="l02019"></a><span class="lineno"> 2019</span>&#160;    <span class="keywordtype">void</span> AddExpectedType(<span class="keyword">const</span> <span class="keyword">typename</span> SchemaType::ValueType&amp; expectedType) {</div><div class="line"><a name="l02020"></a><span class="lineno"> 2020</span>&#160;        currentError_.PushBack(ValueType(expectedType, GetStateAllocator()).Move(), GetStateAllocator());</div><div class="line"><a name="l02021"></a><span class="lineno"> 2021</span>&#160;    }</div><div class="line"><a name="l02022"></a><span class="lineno"> 2022</span>&#160;    <span class="keywordtype">void</span> EndDisallowedType(<span class="keyword">const</span> <span class="keyword">typename</span> SchemaType::ValueType&amp; actualType) {</div><div class="line"><a name="l02023"></a><span class="lineno"> 2023</span>&#160;        ValueType error(<a class="code" href="namespacerapidjson.html#ae79a4751c1c460ff0de5ecc07874f3e4acf030b422a32c3647c7c5973bd4dd0a9">kObjectType</a>);</div><div class="line"><a name="l02024"></a><span class="lineno"> 2024</span>&#160;        error.<a class="code" href="classrapidjson_1_1_generic_value.html#ab018d734d189532b27943bc45776ba68">AddMember</a>(GetExpectedString(), currentError_, GetStateAllocator());</div><div class="line"><a name="l02025"></a><span class="lineno"> 2025</span>&#160;        error.<a class="code" href="classrapidjson_1_1_generic_value.html#ab018d734d189532b27943bc45776ba68">AddMember</a>(GetActualString(), ValueType(actualType, GetStateAllocator()).Move(), GetStateAllocator());</div><div class="line"><a name="l02026"></a><span class="lineno"> 2026</span>&#160;        currentError_ = error;</div><div class="line"><a name="l02027"></a><span class="lineno"> 2027</span>&#160;        AddCurrentError(SchemaType::GetTypeString());</div><div class="line"><a name="l02028"></a><span class="lineno"> 2028</span>&#160;    }</div><div class="line"><a name="l02029"></a><span class="lineno"> 2029</span>&#160;    <span class="keywordtype">void</span> NotAllOf(ISchemaValidator** subvalidators, <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> count) {</div><div class="line"><a name="l02030"></a><span class="lineno"> 2030</span>&#160;        <span class="keywordflow">for</span> (<a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> i = 0; i &lt; count; ++i) {</div><div class="line"><a name="l02031"></a><span class="lineno"> 2031</span>&#160;            MergeError(static_cast&lt;GenericSchemaValidator*&gt;(subvalidators[i])-&gt;GetError());</div><div class="line"><a name="l02032"></a><span class="lineno"> 2032</span>&#160;        }</div><div class="line"><a name="l02033"></a><span class="lineno"> 2033</span>&#160;    }</div><div class="line"><a name="l02034"></a><span class="lineno"> 2034</span>&#160;    <span class="keywordtype">void</span> NoneOf(ISchemaValidator** subvalidators, <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> count) {</div><div class="line"><a name="l02035"></a><span class="lineno"> 2035</span>&#160;        AddErrorArray(SchemaType::GetAnyOfString(), subvalidators, count);</div><div class="line"><a name="l02036"></a><span class="lineno"> 2036</span>&#160;    }</div><div class="line"><a name="l02037"></a><span class="lineno"> 2037</span>&#160;    <span class="keywordtype">void</span> NotOneOf(ISchemaValidator** subvalidators, <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> count) {</div><div class="line"><a name="l02038"></a><span class="lineno"> 2038</span>&#160;        AddErrorArray(SchemaType::GetOneOfString(), subvalidators, count);</div><div class="line"><a name="l02039"></a><span class="lineno"> 2039</span>&#160;    }</div><div class="line"><a name="l02040"></a><span class="lineno"> 2040</span>&#160;    <span class="keywordtype">void</span> Disallowed() {</div><div class="line"><a name="l02041"></a><span class="lineno"> 2041</span>&#160;        currentError_.SetObject();</div><div class="line"><a name="l02042"></a><span class="lineno"> 2042</span>&#160;        AddCurrentError(SchemaType::GetNotString());</div><div class="line"><a name="l02043"></a><span class="lineno"> 2043</span>&#160;    }</div><div class="line"><a name="l02044"></a><span class="lineno"> 2044</span>&#160;</div><div class="line"><a name="l02045"></a><span class="lineno"> 2045</span>&#160;<span class="preprocessor">#define RAPIDJSON_STRING_(name, ...) \</span></div><div class="line"><a name="l02046"></a><span class="lineno"> 2046</span>&#160;<span class="preprocessor">    static const StringRefType&amp; Get##name##String() {\</span></div><div class="line"><a name="l02047"></a><span class="lineno"> 2047</span>&#160;<span class="preprocessor">        static const Ch s[] = { __VA_ARGS__, &#39;\0&#39; };\</span></div><div class="line"><a name="l02048"></a><span class="lineno"> 2048</span>&#160;<span class="preprocessor">        static const StringRefType v(s, static_cast&lt;SizeType&gt;(sizeof(s) / sizeof(Ch) - 1)); \</span></div><div class="line"><a name="l02049"></a><span class="lineno"> 2049</span>&#160;<span class="preprocessor">        return v;\</span></div><div class="line"><a name="l02050"></a><span class="lineno"> 2050</span>&#160;<span class="preprocessor">    }</span></div><div class="line"><a name="l02051"></a><span class="lineno"> 2051</span>&#160;</div><div class="line"><a name="l02052"></a><span class="lineno"> 2052</span>&#160;    RAPIDJSON_STRING_(InstanceRef, <span class="charliteral">&#39;i&#39;</span>, <span class="charliteral">&#39;n&#39;</span>, <span class="charliteral">&#39;s&#39;</span>, <span class="charliteral">&#39;t&#39;</span>, <span class="charliteral">&#39;a&#39;</span>, <span class="charliteral">&#39;n&#39;</span>, <span class="charliteral">&#39;c&#39;</span>, <span class="charliteral">&#39;e&#39;</span>, <span class="charliteral">&#39;R&#39;</span>, <span class="charliteral">&#39;e&#39;</span>, <span class="charliteral">&#39;f&#39;</span>)</div><div class="line"><a name="l02053"></a><span class="lineno"> 2053</span>&#160;    RAPIDJSON_STRING_(SchemaRef, <span class="charliteral">&#39;s&#39;</span>, <span class="charliteral">&#39;c&#39;</span>, <span class="charliteral">&#39;h&#39;</span>, <span class="charliteral">&#39;e&#39;</span>, <span class="charliteral">&#39;m&#39;</span>, <span class="charliteral">&#39;a&#39;</span>, <span class="charliteral">&#39;R&#39;</span>, <span class="charliteral">&#39;e&#39;</span>, <span class="charliteral">&#39;f&#39;</span>)</div><div class="line"><a name="l02054"></a><span class="lineno"> 2054</span>&#160;    RAPIDJSON_STRING_(Expected, <span class="charliteral">&#39;e&#39;</span>, <span class="charliteral">&#39;x&#39;</span>, <span class="charliteral">&#39;p&#39;</span>, <span class="charliteral">&#39;e&#39;</span>, <span class="charliteral">&#39;c&#39;</span>, <span class="charliteral">&#39;t&#39;</span>, <span class="charliteral">&#39;e&#39;</span>, <span class="charliteral">&#39;d&#39;</span>)</div><div class="line"><a name="l02055"></a><span class="lineno"> 2055</span>&#160;    RAPIDJSON_STRING_(Actual, <span class="charliteral">&#39;a&#39;</span>, <span class="charliteral">&#39;c&#39;</span>, <span class="charliteral">&#39;t&#39;</span>, <span class="charliteral">&#39;u&#39;</span>, <span class="charliteral">&#39;a&#39;</span>, <span class="charliteral">&#39;l&#39;</span>)</div><div class="line"><a name="l02056"></a><span class="lineno"> 2056</span>&#160;    RAPIDJSON_STRING_(Disallowed, <span class="charliteral">&#39;d&#39;</span>, <span class="charliteral">&#39;i&#39;</span>, <span class="charliteral">&#39;s&#39;</span>, <span class="charliteral">&#39;a&#39;</span>, <span class="charliteral">&#39;l&#39;</span>, <span class="charliteral">&#39;l&#39;</span>, <span class="charliteral">&#39;o&#39;</span>, <span class="charliteral">&#39;w&#39;</span>, <span class="charliteral">&#39;e&#39;</span>, <span class="charliteral">&#39;d&#39;</span>)</div><div class="line"><a name="l02057"></a><span class="lineno"> 2057</span>&#160;    RAPIDJSON_STRING_(Missing, <span class="charliteral">&#39;m&#39;</span>, <span class="charliteral">&#39;i&#39;</span>, <span class="charliteral">&#39;s&#39;</span>, <span class="charliteral">&#39;s&#39;</span>, <span class="charliteral">&#39;i&#39;</span>, <span class="charliteral">&#39;n&#39;</span>, <span class="charliteral">&#39;g&#39;</span>)</div><div class="line"><a name="l02058"></a><span class="lineno"> 2058</span>&#160;    RAPIDJSON_STRING_(Errors, <span class="charliteral">&#39;e&#39;</span>, <span class="charliteral">&#39;r&#39;</span>, <span class="charliteral">&#39;r&#39;</span>, <span class="charliteral">&#39;o&#39;</span>, <span class="charliteral">&#39;r&#39;</span>, <span class="charliteral">&#39;s&#39;</span>)</div><div class="line"><a name="l02059"></a><span class="lineno"> 2059</span>&#160;    RAPIDJSON_STRING_(Duplicates, <span class="charliteral">&#39;d&#39;</span>, <span class="charliteral">&#39;u&#39;</span>, <span class="charliteral">&#39;p&#39;</span>, <span class="charliteral">&#39;l&#39;</span>, <span class="charliteral">&#39;i&#39;</span>, <span class="charliteral">&#39;c&#39;</span>, <span class="charliteral">&#39;a&#39;</span>, <span class="charliteral">&#39;t&#39;</span>, <span class="charliteral">&#39;e&#39;</span>, <span class="charliteral">&#39;s&#39;</span>)</div><div class="line"><a name="l02060"></a><span class="lineno"> 2060</span>&#160;</div><div class="line"><a name="l02061"></a><span class="lineno"> 2061</span>&#160;<span class="preprocessor">#undef RAPIDJSON_STRING_</span></div><div class="line"><a name="l02062"></a><span class="lineno"> 2062</span>&#160;</div><div class="line"><a name="l02063"></a><span class="lineno"> 2063</span>&#160;<span class="preprocessor">#if RAPIDJSON_SCHEMA_VERBOSE</span></div><div class="line"><a name="l02064"></a><span class="lineno"> 2064</span>&#160;<span class="preprocessor">#define RAPIDJSON_SCHEMA_HANDLE_BEGIN_VERBOSE_() \</span></div><div class="line"><a name="l02065"></a><span class="lineno"> 2065</span>&#160;<span class="preprocessor">RAPIDJSON_MULTILINEMACRO_BEGIN\</span></div><div class="line"><a name="l02066"></a><span class="lineno"> 2066</span>&#160;<span class="preprocessor">    *documentStack_.template Push&lt;Ch&gt;() = &#39;\0&#39;;\</span></div><div class="line"><a name="l02067"></a><span class="lineno"> 2067</span>&#160;<span class="preprocessor">    documentStack_.template Pop&lt;Ch&gt;(1);\</span></div><div class="line"><a name="l02068"></a><span class="lineno"> 2068</span>&#160;<span class="preprocessor">    internal::PrintInvalidDocument(documentStack_.template Bottom&lt;Ch&gt;());\</span></div><div class="line"><a name="l02069"></a><span class="lineno"> 2069</span>&#160;<span class="preprocessor">RAPIDJSON_MULTILINEMACRO_END</span></div><div class="line"><a name="l02070"></a><span class="lineno"> 2070</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l02071"></a><span class="lineno"> 2071</span>&#160;<span class="preprocessor">#define RAPIDJSON_SCHEMA_HANDLE_BEGIN_VERBOSE_()</span></div><div class="line"><a name="l02072"></a><span class="lineno"> 2072</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02073"></a><span class="lineno"> 2073</span>&#160;</div><div class="line"><a name="l02074"></a><span class="lineno"> 2074</span>&#160;<span class="preprocessor">#define RAPIDJSON_SCHEMA_HANDLE_BEGIN_(method, arg1)\</span></div><div class="line"><a name="l02075"></a><span class="lineno"> 2075</span>&#160;<span class="preprocessor">    if (!valid_) return false; \</span></div><div class="line"><a name="l02076"></a><span class="lineno"> 2076</span>&#160;<span class="preprocessor">    if (!BeginValue() || !CurrentSchema().method arg1) {\</span></div><div class="line"><a name="l02077"></a><span class="lineno"> 2077</span>&#160;<span class="preprocessor">        RAPIDJSON_SCHEMA_HANDLE_BEGIN_VERBOSE_();\</span></div><div class="line"><a name="l02078"></a><span class="lineno"> 2078</span>&#160;<span class="preprocessor">        return valid_ = false;\</span></div><div class="line"><a name="l02079"></a><span class="lineno"> 2079</span>&#160;<span class="preprocessor">    }</span></div><div class="line"><a name="l02080"></a><span class="lineno"> 2080</span>&#160;</div><div class="line"><a name="l02081"></a><span class="lineno"> 2081</span>&#160;<span class="preprocessor">#define RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(method, arg2)\</span></div><div class="line"><a name="l02082"></a><span class="lineno"> 2082</span>&#160;<span class="preprocessor">    for (Context* context = schemaStack_.template Bottom&lt;Context&gt;(); context != schemaStack_.template End&lt;Context&gt;(); context++) {\</span></div><div class="line"><a name="l02083"></a><span class="lineno"> 2083</span>&#160;<span class="preprocessor">        if (context-&gt;hasher)\</span></div><div class="line"><a name="l02084"></a><span class="lineno"> 2084</span>&#160;<span class="preprocessor">            static_cast&lt;HasherType*&gt;(context-&gt;hasher)-&gt;method arg2;\</span></div><div class="line"><a name="l02085"></a><span class="lineno"> 2085</span>&#160;<span class="preprocessor">        if (context-&gt;validators)\</span></div><div class="line"><a name="l02086"></a><span class="lineno"> 2086</span>&#160;<span class="preprocessor">            for (SizeType i_ = 0; i_ &lt; context-&gt;validatorCount; i_++)\</span></div><div class="line"><a name="l02087"></a><span class="lineno"> 2087</span>&#160;<span class="preprocessor">                static_cast&lt;GenericSchemaValidator*&gt;(context-&gt;validators[i_])-&gt;method arg2;\</span></div><div class="line"><a name="l02088"></a><span class="lineno"> 2088</span>&#160;<span class="preprocessor">        if (context-&gt;patternPropertiesValidators)\</span></div><div class="line"><a name="l02089"></a><span class="lineno"> 2089</span>&#160;<span class="preprocessor">            for (SizeType i_ = 0; i_ &lt; context-&gt;patternPropertiesValidatorCount; i_++)\</span></div><div class="line"><a name="l02090"></a><span class="lineno"> 2090</span>&#160;<span class="preprocessor">                static_cast&lt;GenericSchemaValidator*&gt;(context-&gt;patternPropertiesValidators[i_])-&gt;method arg2;\</span></div><div class="line"><a name="l02091"></a><span class="lineno"> 2091</span>&#160;<span class="preprocessor">    }</span></div><div class="line"><a name="l02092"></a><span class="lineno"> 2092</span>&#160;</div><div class="line"><a name="l02093"></a><span class="lineno"> 2093</span>&#160;<span class="preprocessor">#define RAPIDJSON_SCHEMA_HANDLE_END_(method, arg2)\</span></div><div class="line"><a name="l02094"></a><span class="lineno"> 2094</span>&#160;<span class="preprocessor">    return valid_ = EndValue() &amp;&amp; (!outputHandler_ || outputHandler_-&gt;method arg2)</span></div><div class="line"><a name="l02095"></a><span class="lineno"> 2095</span>&#160;</div><div class="line"><a name="l02096"></a><span class="lineno"> 2096</span>&#160;<span class="preprocessor">#define RAPIDJSON_SCHEMA_HANDLE_VALUE_(method, arg1, arg2) \</span></div><div class="line"><a name="l02097"></a><span class="lineno"> 2097</span>&#160;<span class="preprocessor">    RAPIDJSON_SCHEMA_HANDLE_BEGIN_   (method, arg1);\</span></div><div class="line"><a name="l02098"></a><span class="lineno"> 2098</span>&#160;<span class="preprocessor">    RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(method, arg2);\</span></div><div class="line"><a name="l02099"></a><span class="lineno"> 2099</span>&#160;<span class="preprocessor">    RAPIDJSON_SCHEMA_HANDLE_END_     (method, arg2)</span></div><div class="line"><a name="l02100"></a><span class="lineno"> 2100</span>&#160;</div><div class="line"><a name="l02101"></a><span class="lineno"> 2101</span>&#160;    <span class="keywordtype">bool</span> Null()             { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Null,   (CurrentContext()), ( )); }</div><div class="line"><a name="l02102"></a><span class="lineno"> 2102</span>&#160;    <span class="keywordtype">bool</span> Bool(<span class="keywordtype">bool</span> b)       { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Bool,   (CurrentContext(), b), (b)); }</div><div class="line"><a name="l02103"></a><span class="lineno"> 2103</span>&#160;    <span class="keywordtype">bool</span> Int(<span class="keywordtype">int</span> i)         { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Int,    (CurrentContext(), i), (i)); }</div><div class="line"><a name="l02104"></a><span class="lineno"> 2104</span>&#160;    <span class="keywordtype">bool</span> Uint(<span class="keywordtype">unsigned</span> u)   { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Uint,   (CurrentContext(), u), (u)); }</div><div class="line"><a name="l02105"></a><span class="lineno"> 2105</span>&#160;    <span class="keywordtype">bool</span> Int64(int64_t i)   { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Int64,  (CurrentContext(), i), (i)); }</div><div class="line"><a name="l02106"></a><span class="lineno"> 2106</span>&#160;    <span class="keywordtype">bool</span> Uint64(uint64_t u) { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Uint64, (CurrentContext(), u), (u)); }</div><div class="line"><a name="l02107"></a><span class="lineno"> 2107</span>&#160;    <span class="keywordtype">bool</span> Double(<span class="keywordtype">double</span> d)   { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Double, (CurrentContext(), d), (d)); }</div><div class="line"><a name="l02108"></a><span class="lineno"> 2108</span>&#160;    <span class="keywordtype">bool</span> RawNumber(<span class="keyword">const</span> Ch* str, <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> length, <span class="keywordtype">bool</span> copy)</div><div class="line"><a name="l02109"></a><span class="lineno"> 2109</span>&#160;                                    { RAPIDJSON_SCHEMA_HANDLE_VALUE_(String, (CurrentContext(), str, length, copy), (str, length, copy)); }</div><div class="line"><a name="l02110"></a><span class="lineno"> 2110</span>&#160;    <span class="keywordtype">bool</span> String(<span class="keyword">const</span> Ch* str, <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> length, <span class="keywordtype">bool</span> copy)</div><div class="line"><a name="l02111"></a><span class="lineno"> 2111</span>&#160;                                    { RAPIDJSON_SCHEMA_HANDLE_VALUE_(String, (CurrentContext(), str, length, copy), (str, length, copy)); }</div><div class="line"><a name="l02112"></a><span class="lineno"> 2112</span>&#160;</div><div class="line"><a name="l02113"></a><span class="lineno"> 2113</span>&#160;    <span class="keywordtype">bool</span> StartObject() {</div><div class="line"><a name="l02114"></a><span class="lineno"> 2114</span>&#160;        RAPIDJSON_SCHEMA_HANDLE_BEGIN_(StartObject, (CurrentContext()));</div><div class="line"><a name="l02115"></a><span class="lineno"> 2115</span>&#160;        RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(StartObject, ());</div><div class="line"><a name="l02116"></a><span class="lineno"> 2116</span>&#160;        <span class="keywordflow">return</span> valid_ = !outputHandler_ || outputHandler_-&gt;StartObject();</div><div class="line"><a name="l02117"></a><span class="lineno"> 2117</span>&#160;    }</div><div class="line"><a name="l02118"></a><span class="lineno"> 2118</span>&#160;    </div><div class="line"><a name="l02119"></a><span class="lineno"> 2119</span>&#160;    <span class="keywordtype">bool</span> Key(<span class="keyword">const</span> Ch* str, <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> len, <span class="keywordtype">bool</span> copy) {</div><div class="line"><a name="l02120"></a><span class="lineno"> 2120</span>&#160;        <span class="keywordflow">if</span> (!valid_) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l02121"></a><span class="lineno"> 2121</span>&#160;        AppendToken(str, len);</div><div class="line"><a name="l02122"></a><span class="lineno"> 2122</span>&#160;        <span class="keywordflow">if</span> (!CurrentSchema().Key(CurrentContext(), str, len, copy)) <span class="keywordflow">return</span> valid_ = <span class="keyword">false</span>;</div><div class="line"><a name="l02123"></a><span class="lineno"> 2123</span>&#160;        RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(Key, (str, len, copy));</div><div class="line"><a name="l02124"></a><span class="lineno"> 2124</span>&#160;        <span class="keywordflow">return</span> valid_ = !outputHandler_ || outputHandler_-&gt;Key(str, len, copy);</div><div class="line"><a name="l02125"></a><span class="lineno"> 2125</span>&#160;    }</div><div class="line"><a name="l02126"></a><span class="lineno"> 2126</span>&#160;    </div><div class="line"><a name="l02127"></a><span class="lineno"> 2127</span>&#160;    <span class="keywordtype">bool</span> EndObject(<a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> memberCount) { </div><div class="line"><a name="l02128"></a><span class="lineno"> 2128</span>&#160;        <span class="keywordflow">if</span> (!valid_) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l02129"></a><span class="lineno"> 2129</span>&#160;        RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(EndObject, (memberCount));</div><div class="line"><a name="l02130"></a><span class="lineno"> 2130</span>&#160;        <span class="keywordflow">if</span> (!CurrentSchema().EndObject(CurrentContext(), memberCount)) <span class="keywordflow">return</span> valid_ = <span class="keyword">false</span>;</div><div class="line"><a name="l02131"></a><span class="lineno"> 2131</span>&#160;        RAPIDJSON_SCHEMA_HANDLE_END_(EndObject, (memberCount));</div><div class="line"><a name="l02132"></a><span class="lineno"> 2132</span>&#160;    }</div><div class="line"><a name="l02133"></a><span class="lineno"> 2133</span>&#160;</div><div class="line"><a name="l02134"></a><span class="lineno"> 2134</span>&#160;    <span class="keywordtype">bool</span> StartArray() {</div><div class="line"><a name="l02135"></a><span class="lineno"> 2135</span>&#160;        RAPIDJSON_SCHEMA_HANDLE_BEGIN_(StartArray, (CurrentContext()));</div><div class="line"><a name="l02136"></a><span class="lineno"> 2136</span>&#160;        RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(StartArray, ());</div><div class="line"><a name="l02137"></a><span class="lineno"> 2137</span>&#160;        <span class="keywordflow">return</span> valid_ = !outputHandler_ || outputHandler_-&gt;StartArray();</div><div class="line"><a name="l02138"></a><span class="lineno"> 2138</span>&#160;    }</div><div class="line"><a name="l02139"></a><span class="lineno"> 2139</span>&#160;    </div><div class="line"><a name="l02140"></a><span class="lineno"> 2140</span>&#160;    <span class="keywordtype">bool</span> EndArray(<a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> elementCount) {</div><div class="line"><a name="l02141"></a><span class="lineno"> 2141</span>&#160;        <span class="keywordflow">if</span> (!valid_) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l02142"></a><span class="lineno"> 2142</span>&#160;        RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(EndArray, (elementCount));</div><div class="line"><a name="l02143"></a><span class="lineno"> 2143</span>&#160;        <span class="keywordflow">if</span> (!CurrentSchema().EndArray(CurrentContext(), elementCount)) <span class="keywordflow">return</span> valid_ = <span class="keyword">false</span>;</div><div class="line"><a name="l02144"></a><span class="lineno"> 2144</span>&#160;        RAPIDJSON_SCHEMA_HANDLE_END_(EndArray, (elementCount));</div><div class="line"><a name="l02145"></a><span class="lineno"> 2145</span>&#160;    }</div><div class="line"><a name="l02146"></a><span class="lineno"> 2146</span>&#160;</div><div class="line"><a name="l02147"></a><span class="lineno"> 2147</span>&#160;<span class="preprocessor">#undef RAPIDJSON_SCHEMA_HANDLE_BEGIN_VERBOSE_</span></div><div class="line"><a name="l02148"></a><span class="lineno"> 2148</span>&#160;<span class="preprocessor">#undef RAPIDJSON_SCHEMA_HANDLE_BEGIN_</span></div><div class="line"><a name="l02149"></a><span class="lineno"> 2149</span>&#160;<span class="preprocessor">#undef RAPIDJSON_SCHEMA_HANDLE_PARALLEL_</span></div><div class="line"><a name="l02150"></a><span class="lineno"> 2150</span>&#160;<span class="preprocessor">#undef RAPIDJSON_SCHEMA_HANDLE_VALUE_</span></div><div class="line"><a name="l02151"></a><span class="lineno"> 2151</span>&#160;</div><div class="line"><a name="l02152"></a><span class="lineno"> 2152</span>&#160;    <span class="comment">// Implementation of ISchemaStateFactory&lt;SchemaType&gt;</span></div><div class="line"><a name="l02153"></a><span class="lineno"> 2153</span>&#160;    <span class="keyword">virtual</span> ISchemaValidator* CreateSchemaValidator(<span class="keyword">const</span> SchemaType&amp; root) {</div><div class="line"><a name="l02154"></a><span class="lineno"> 2154</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">new</span> (GetStateAllocator().Malloc(<span class="keyword">sizeof</span>(<a class="code" href="classrapidjson_1_1_generic_schema_validator.html">GenericSchemaValidator</a>))) <a class="code" href="classrapidjson_1_1_generic_schema_validator.html">GenericSchemaValidator</a>(*schemaDocument_, root, documentStack_.template Bottom&lt;char&gt;(), documentStack_.GetSize(),</div><div class="line"><a name="l02155"></a><span class="lineno"> 2155</span>&#160;<span class="preprocessor">#if RAPIDJSON_SCHEMA_VERBOSE</span></div><div class="line"><a name="l02156"></a><span class="lineno"> 2156</span>&#160;        depth_ + 1,</div><div class="line"><a name="l02157"></a><span class="lineno"> 2157</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02158"></a><span class="lineno"> 2158</span>&#160;        &amp;GetStateAllocator());</div><div class="line"><a name="l02159"></a><span class="lineno"> 2159</span>&#160;    }</div><div class="line"><a name="l02160"></a><span class="lineno"> 2160</span>&#160;</div><div class="line"><a name="l02161"></a><span class="lineno"> 2161</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> DestroySchemaValidator(ISchemaValidator* validator) {</div><div class="line"><a name="l02162"></a><span class="lineno"> 2162</span>&#160;        <a class="code" href="classrapidjson_1_1_generic_schema_validator.html">GenericSchemaValidator</a>* v = <span class="keyword">static_cast&lt;</span><a class="code" href="classrapidjson_1_1_generic_schema_validator.html">GenericSchemaValidator</a>*<span class="keyword">&gt;</span>(validator);</div><div class="line"><a name="l02163"></a><span class="lineno"> 2163</span>&#160;        v-&gt;<a class="code" href="classrapidjson_1_1_generic_schema_validator.html#ad9f00d71bf62b8983cf2514c43fb1572">~GenericSchemaValidator</a>();</div><div class="line"><a name="l02164"></a><span class="lineno"> 2164</span>&#160;        StateAllocator::Free(v);</div><div class="line"><a name="l02165"></a><span class="lineno"> 2165</span>&#160;    }</div><div class="line"><a name="l02166"></a><span class="lineno"> 2166</span>&#160;</div><div class="line"><a name="l02167"></a><span class="lineno"> 2167</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span>* CreateHasher() {</div><div class="line"><a name="l02168"></a><span class="lineno"> 2168</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">new</span> (GetStateAllocator().Malloc(<span class="keyword">sizeof</span>(HasherType))) HasherType(&amp;GetStateAllocator());</div><div class="line"><a name="l02169"></a><span class="lineno"> 2169</span>&#160;    }</div><div class="line"><a name="l02170"></a><span class="lineno"> 2170</span>&#160;</div><div class="line"><a name="l02171"></a><span class="lineno"> 2171</span>&#160;    <span class="keyword">virtual</span> uint64_t GetHashCode(<span class="keywordtype">void</span>* hasher) {</div><div class="line"><a name="l02172"></a><span class="lineno"> 2172</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">static_cast&lt;</span>HasherType*<span class="keyword">&gt;</span>(hasher)-&gt;GetHashCode();</div><div class="line"><a name="l02173"></a><span class="lineno"> 2173</span>&#160;    }</div><div class="line"><a name="l02174"></a><span class="lineno"> 2174</span>&#160;</div><div class="line"><a name="l02175"></a><span class="lineno"> 2175</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> DestroryHasher(<span class="keywordtype">void</span>* hasher) {</div><div class="line"><a name="l02176"></a><span class="lineno"> 2176</span>&#160;        HasherType* h = <span class="keyword">static_cast&lt;</span>HasherType*<span class="keyword">&gt;</span>(hasher);</div><div class="line"><a name="l02177"></a><span class="lineno"> 2177</span>&#160;        h-&gt;~HasherType();</div><div class="line"><a name="l02178"></a><span class="lineno"> 2178</span>&#160;        StateAllocator::Free(h);</div><div class="line"><a name="l02179"></a><span class="lineno"> 2179</span>&#160;    }</div><div class="line"><a name="l02180"></a><span class="lineno"> 2180</span>&#160;</div><div class="line"><a name="l02181"></a><span class="lineno"> 2181</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span>* MallocState(<span class="keywordtype">size_t</span> size) {</div><div class="line"><a name="l02182"></a><span class="lineno"> 2182</span>&#160;        <span class="keywordflow">return</span> GetStateAllocator().Malloc(size);</div><div class="line"><a name="l02183"></a><span class="lineno"> 2183</span>&#160;    }</div><div class="line"><a name="l02184"></a><span class="lineno"> 2184</span>&#160;</div><div class="line"><a name="l02185"></a><span class="lineno"> 2185</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> FreeState(<span class="keywordtype">void</span>* p) {</div><div class="line"><a name="l02186"></a><span class="lineno"> 2186</span>&#160;        StateAllocator::Free(p);</div><div class="line"><a name="l02187"></a><span class="lineno"> 2187</span>&#160;    }</div><div class="line"><a name="l02188"></a><span class="lineno"> 2188</span>&#160;</div><div class="line"><a name="l02189"></a><span class="lineno"> 2189</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l02190"></a><span class="lineno"> 2190</span>&#160;    <span class="keyword">typedef</span> <span class="keyword">typename</span> SchemaType::Context Context;</div><div class="line"><a name="l02191"></a><span class="lineno"> 2191</span>&#160;    <span class="keyword">typedef</span> <a class="code" href="classrapidjson_1_1_generic_value.html">GenericValue&lt;UTF8&lt;&gt;</a>, StateAllocator&gt; <a class="code" href="classrapidjson_1_1_generic_value.html">HashCodeArray</a>;</div><div class="line"><a name="l02192"></a><span class="lineno"> 2192</span>&#160;    <span class="keyword">typedef</span> internal::Hasher&lt;EncodingType, StateAllocator&gt; HasherType;</div><div class="line"><a name="l02193"></a><span class="lineno"> 2193</span>&#160;</div><div class="line"><a name="l02194"></a><span class="lineno"> 2194</span>&#160;    <a class="code" href="classrapidjson_1_1_generic_schema_validator.html">GenericSchemaValidator</a>( </div><div class="line"><a name="l02195"></a><span class="lineno"> 2195</span>&#160;        <span class="keyword">const</span> SchemaDocumentType&amp; schemaDocument,</div><div class="line"><a name="l02196"></a><span class="lineno"> 2196</span>&#160;        <span class="keyword">const</span> SchemaType&amp; root,</div><div class="line"><a name="l02197"></a><span class="lineno"> 2197</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">char</span>* basePath, <span class="keywordtype">size_t</span> basePathSize,</div><div class="line"><a name="l02198"></a><span class="lineno"> 2198</span>&#160;#<span class="keywordflow">if</span> RAPIDJSON_SCHEMA_VERBOSE</div><div class="line"><a name="l02199"></a><span class="lineno"> 2199</span>&#160;        <span class="keywordtype">unsigned</span> depth,</div><div class="line"><a name="l02200"></a><span class="lineno"> 2200</span>&#160;#endif</div><div class="line"><a name="l02201"></a><span class="lineno"> 2201</span>&#160;        StateAllocator* allocator = 0,</div><div class="line"><a name="l02202"></a><span class="lineno"> 2202</span>&#160;        <span class="keywordtype">size_t</span> schemaStackCapacity = kDefaultSchemaStackCapacity,</div><div class="line"><a name="l02203"></a><span class="lineno"> 2203</span>&#160;        <span class="keywordtype">size_t</span> documentStackCapacity = kDefaultDocumentStackCapacity)</div><div class="line"><a name="l02204"></a><span class="lineno"> 2204</span>&#160;        :</div><div class="line"><a name="l02205"></a><span class="lineno"> 2205</span>&#160;        schemaDocument_(&amp;schemaDocument),</div><div class="line"><a name="l02206"></a><span class="lineno"> 2206</span>&#160;        root_(root),</div><div class="line"><a name="l02207"></a><span class="lineno"> 2207</span>&#160;        stateAllocator_(allocator),</div><div class="line"><a name="l02208"></a><span class="lineno"> 2208</span>&#160;        ownStateAllocator_(0),</div><div class="line"><a name="l02209"></a><span class="lineno"> 2209</span>&#160;        schemaStack_(allocator, schemaStackCapacity),</div><div class="line"><a name="l02210"></a><span class="lineno"> 2210</span>&#160;        documentStack_(allocator, documentStackCapacity),</div><div class="line"><a name="l02211"></a><span class="lineno"> 2211</span>&#160;        outputHandler_(0),</div><div class="line"><a name="l02212"></a><span class="lineno"> 2212</span>&#160;        error_(<a class="code" href="namespacerapidjson.html#ae79a4751c1c460ff0de5ecc07874f3e4acf030b422a32c3647c7c5973bd4dd0a9">kObjectType</a>),</div><div class="line"><a name="l02213"></a><span class="lineno"> 2213</span>&#160;        currentError_(),</div><div class="line"><a name="l02214"></a><span class="lineno"> 2214</span>&#160;        missingDependents_(),</div><div class="line"><a name="l02215"></a><span class="lineno"> 2215</span>&#160;        valid_(<span class="keyword">true</span>)</div><div class="line"><a name="l02216"></a><span class="lineno"> 2216</span>&#160;<span class="preprocessor">#if RAPIDJSON_SCHEMA_VERBOSE</span></div><div class="line"><a name="l02217"></a><span class="lineno"> 2217</span>&#160;        , depth_(depth)</div><div class="line"><a name="l02218"></a><span class="lineno"> 2218</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02219"></a><span class="lineno"> 2219</span>&#160;    {</div><div class="line"><a name="l02220"></a><span class="lineno"> 2220</span>&#160;        <span class="keywordflow">if</span> (basePath &amp;&amp; basePathSize)</div><div class="line"><a name="l02221"></a><span class="lineno"> 2221</span>&#160;            memcpy(documentStack_.template Push&lt;char&gt;(basePathSize), basePath, basePathSize);</div><div class="line"><a name="l02222"></a><span class="lineno"> 2222</span>&#160;    }</div><div class="line"><a name="l02223"></a><span class="lineno"> 2223</span>&#160;</div><div class="line"><a name="l02224"></a><span class="lineno"> 2224</span>&#160;    StateAllocator&amp; GetStateAllocator() {</div><div class="line"><a name="l02225"></a><span class="lineno"> 2225</span>&#160;        <span class="keywordflow">if</span> (!stateAllocator_)</div><div class="line"><a name="l02226"></a><span class="lineno"> 2226</span>&#160;            stateAllocator_ = ownStateAllocator_ = <a class="code" href="rapidjson_8h.html#abdc7cd7902748ffe6626d71c59a73c3b">RAPIDJSON_NEW</a>(StateAllocator)();</div><div class="line"><a name="l02227"></a><span class="lineno"> 2227</span>&#160;        <span class="keywordflow">return</span> *stateAllocator_;</div><div class="line"><a name="l02228"></a><span class="lineno"> 2228</span>&#160;    }</div><div class="line"><a name="l02229"></a><span class="lineno"> 2229</span>&#160;</div><div class="line"><a name="l02230"></a><span class="lineno"> 2230</span>&#160;    <span class="keywordtype">bool</span> BeginValue() {</div><div class="line"><a name="l02231"></a><span class="lineno"> 2231</span>&#160;        <span class="keywordflow">if</span> (schemaStack_.Empty())</div><div class="line"><a name="l02232"></a><span class="lineno"> 2232</span>&#160;            PushSchema(root_);</div><div class="line"><a name="l02233"></a><span class="lineno"> 2233</span>&#160;        <span class="keywordflow">else</span> {</div><div class="line"><a name="l02234"></a><span class="lineno"> 2234</span>&#160;            <span class="keywordflow">if</span> (CurrentContext().inArray)</div><div class="line"><a name="l02235"></a><span class="lineno"> 2235</span>&#160;                internal::TokenHelper&lt;internal::Stack&lt;StateAllocator&gt;, Ch&gt;::AppendIndexToken(documentStack_, CurrentContext().arrayElementIndex);</div><div class="line"><a name="l02236"></a><span class="lineno"> 2236</span>&#160;</div><div class="line"><a name="l02237"></a><span class="lineno"> 2237</span>&#160;            <span class="keywordflow">if</span> (!CurrentSchema().BeginValue(CurrentContext()))</div><div class="line"><a name="l02238"></a><span class="lineno"> 2238</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l02239"></a><span class="lineno"> 2239</span>&#160;</div><div class="line"><a name="l02240"></a><span class="lineno"> 2240</span>&#160;            <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> count = CurrentContext().patternPropertiesSchemaCount;</div><div class="line"><a name="l02241"></a><span class="lineno"> 2241</span>&#160;            <span class="keyword">const</span> SchemaType** sa = CurrentContext().patternPropertiesSchemas;</div><div class="line"><a name="l02242"></a><span class="lineno"> 2242</span>&#160;            <span class="keyword">typename</span> Context::PatternValidatorType patternValidatorType = CurrentContext().valuePatternValidatorType;</div><div class="line"><a name="l02243"></a><span class="lineno"> 2243</span>&#160;            <span class="keywordtype">bool</span> valueUniqueness = CurrentContext().valueUniqueness;</div><div class="line"><a name="l02244"></a><span class="lineno"> 2244</span>&#160;            <a class="code" href="group___r_a_p_i_d_j_s_o_n___c_o_n_f_i_g.html#gabeba18d612187bad2ac62aed9276d47c">RAPIDJSON_ASSERT</a>(CurrentContext().valueSchema);</div><div class="line"><a name="l02245"></a><span class="lineno"> 2245</span>&#160;            PushSchema(*CurrentContext().valueSchema);</div><div class="line"><a name="l02246"></a><span class="lineno"> 2246</span>&#160;</div><div class="line"><a name="l02247"></a><span class="lineno"> 2247</span>&#160;            <span class="keywordflow">if</span> (count &gt; 0) {</div><div class="line"><a name="l02248"></a><span class="lineno"> 2248</span>&#160;                CurrentContext().objectPatternValidatorType = patternValidatorType;</div><div class="line"><a name="l02249"></a><span class="lineno"> 2249</span>&#160;                ISchemaValidator**&amp; va = CurrentContext().patternPropertiesValidators;</div><div class="line"><a name="l02250"></a><span class="lineno"> 2250</span>&#160;                <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a>&amp; validatorCount = CurrentContext().patternPropertiesValidatorCount;</div><div class="line"><a name="l02251"></a><span class="lineno"> 2251</span>&#160;                va = <span class="keyword">static_cast&lt;</span>ISchemaValidator**<span class="keyword">&gt;</span>(MallocState(<span class="keyword">sizeof</span>(ISchemaValidator*) * count));</div><div class="line"><a name="l02252"></a><span class="lineno"> 2252</span>&#160;                <span class="keywordflow">for</span> (<a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> i = 0; i &lt; count; i++)</div><div class="line"><a name="l02253"></a><span class="lineno"> 2253</span>&#160;                    va[validatorCount++] = CreateSchemaValidator(*sa[i]);</div><div class="line"><a name="l02254"></a><span class="lineno"> 2254</span>&#160;            }</div><div class="line"><a name="l02255"></a><span class="lineno"> 2255</span>&#160;</div><div class="line"><a name="l02256"></a><span class="lineno"> 2256</span>&#160;            CurrentContext().arrayUniqueness = valueUniqueness;</div><div class="line"><a name="l02257"></a><span class="lineno"> 2257</span>&#160;        }</div><div class="line"><a name="l02258"></a><span class="lineno"> 2258</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l02259"></a><span class="lineno"> 2259</span>&#160;    }</div><div class="line"><a name="l02260"></a><span class="lineno"> 2260</span>&#160;</div><div class="line"><a name="l02261"></a><span class="lineno"> 2261</span>&#160;    <span class="keywordtype">bool</span> EndValue() {</div><div class="line"><a name="l02262"></a><span class="lineno"> 2262</span>&#160;        <span class="keywordflow">if</span> (!CurrentSchema().EndValue(CurrentContext()))</div><div class="line"><a name="l02263"></a><span class="lineno"> 2263</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l02264"></a><span class="lineno"> 2264</span>&#160;</div><div class="line"><a name="l02265"></a><span class="lineno"> 2265</span>&#160;<span class="preprocessor">#if RAPIDJSON_SCHEMA_VERBOSE</span></div><div class="line"><a name="l02266"></a><span class="lineno"> 2266</span>&#160;        <a class="code" href="classrapidjson_1_1_generic_string_buffer.html">GenericStringBuffer&lt;EncodingType&gt;</a> sb;</div><div class="line"><a name="l02267"></a><span class="lineno"> 2267</span>&#160;        schemaDocument_-&gt;GetPointer(&amp;CurrentSchema()).Stringify(sb);</div><div class="line"><a name="l02268"></a><span class="lineno"> 2268</span>&#160;</div><div class="line"><a name="l02269"></a><span class="lineno"> 2269</span>&#160;        *documentStack_.template Push&lt;Ch&gt;() = <span class="charliteral">&#39;\0&#39;</span>;</div><div class="line"><a name="l02270"></a><span class="lineno"> 2270</span>&#160;        documentStack_.template Pop&lt;Ch&gt;(1);</div><div class="line"><a name="l02271"></a><span class="lineno"> 2271</span>&#160;        internal::PrintValidatorPointers(depth_, sb.GetString(), documentStack_.template Bottom&lt;Ch&gt;());</div><div class="line"><a name="l02272"></a><span class="lineno"> 2272</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02273"></a><span class="lineno"> 2273</span>&#160;</div><div class="line"><a name="l02274"></a><span class="lineno"> 2274</span>&#160;        uint64_t h = CurrentContext().arrayUniqueness ? <span class="keyword">static_cast&lt;</span>HasherType*<span class="keyword">&gt;</span>(CurrentContext().hasher)-&gt;GetHashCode() : 0;</div><div class="line"><a name="l02275"></a><span class="lineno"> 2275</span>&#160;        </div><div class="line"><a name="l02276"></a><span class="lineno"> 2276</span>&#160;        PopSchema();</div><div class="line"><a name="l02277"></a><span class="lineno"> 2277</span>&#160;</div><div class="line"><a name="l02278"></a><span class="lineno"> 2278</span>&#160;        <span class="keywordflow">if</span> (!schemaStack_.Empty()) {</div><div class="line"><a name="l02279"></a><span class="lineno"> 2279</span>&#160;            Context&amp; context = CurrentContext();</div><div class="line"><a name="l02280"></a><span class="lineno"> 2280</span>&#160;            <span class="keywordflow">if</span> (context.valueUniqueness) {</div><div class="line"><a name="l02281"></a><span class="lineno"> 2281</span>&#160;                HashCodeArray* a = <span class="keyword">static_cast&lt;</span>HashCodeArray*<span class="keyword">&gt;</span>(context.arrayElementHashCodes);</div><div class="line"><a name="l02282"></a><span class="lineno"> 2282</span>&#160;                <span class="keywordflow">if</span> (!a)</div><div class="line"><a name="l02283"></a><span class="lineno"> 2283</span>&#160;                    CurrentContext().arrayElementHashCodes = a = <span class="keyword">new</span> (GetStateAllocator().Malloc(<span class="keyword">sizeof</span>(HashCodeArray))) HashCodeArray(<a class="code" href="namespacerapidjson.html#ae79a4751c1c460ff0de5ecc07874f3e4a058c622e1e7d59419ae58b895cbce468">kArrayType</a>);</div><div class="line"><a name="l02284"></a><span class="lineno"> 2284</span>&#160;                <span class="keywordflow">for</span> (<span class="keyword">typename</span> <a class="code" href="classrapidjson_1_1_generic_value.html">HashCodeArray::ConstValueIterator</a> itr = a-&gt;<a class="code" href="classrapidjson_1_1_generic_value.html#a8d1040c479d89edb261db86400ebe603">Begin</a>(); itr != a-&gt;<a class="code" href="classrapidjson_1_1_generic_value.html#aaf58b9337ccc0cdf16aa9634c4645109">End</a>(); ++itr)</div><div class="line"><a name="l02285"></a><span class="lineno"> 2285</span>&#160;                    <span class="keywordflow">if</span> (itr-&gt;GetUint64() == h) {</div><div class="line"><a name="l02286"></a><span class="lineno"> 2286</span>&#160;                        DuplicateItems(static_cast&lt;SizeType&gt;(itr - a-&gt;<a class="code" href="classrapidjson_1_1_generic_value.html#a8d1040c479d89edb261db86400ebe603">Begin</a>()), a-&gt;<a class="code" href="classrapidjson_1_1_generic_value.html#a799a8a2503989f486f3fc7a660266555">Size</a>());</div><div class="line"><a name="l02287"></a><span class="lineno"> 2287</span>&#160;                        RAPIDJSON_INVALID_KEYWORD_RETURN(SchemaType::GetUniqueItemsString());</div><div class="line"><a name="l02288"></a><span class="lineno"> 2288</span>&#160;                    }</div><div class="line"><a name="l02289"></a><span class="lineno"> 2289</span>&#160;                a-&gt;<a class="code" href="classrapidjson_1_1_generic_value.html#a0ec9f34bef5890241d4bc882b73b1db4">PushBack</a>(h, GetStateAllocator());</div><div class="line"><a name="l02290"></a><span class="lineno"> 2290</span>&#160;            }</div><div class="line"><a name="l02291"></a><span class="lineno"> 2291</span>&#160;        }</div><div class="line"><a name="l02292"></a><span class="lineno"> 2292</span>&#160;</div><div class="line"><a name="l02293"></a><span class="lineno"> 2293</span>&#160;        <span class="comment">// Remove the last token of document pointer</span></div><div class="line"><a name="l02294"></a><span class="lineno"> 2294</span>&#160;        <span class="keywordflow">while</span> (!documentStack_.Empty() &amp;&amp; *documentStack_.template Pop&lt;Ch&gt;(1) != <span class="charliteral">&#39;/&#39;</span>)</div><div class="line"><a name="l02295"></a><span class="lineno"> 2295</span>&#160;            ;</div><div class="line"><a name="l02296"></a><span class="lineno"> 2296</span>&#160;</div><div class="line"><a name="l02297"></a><span class="lineno"> 2297</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l02298"></a><span class="lineno"> 2298</span>&#160;    }</div><div class="line"><a name="l02299"></a><span class="lineno"> 2299</span>&#160;</div><div class="line"><a name="l02300"></a><span class="lineno"> 2300</span>&#160;    <span class="keywordtype">void</span> AppendToken(<span class="keyword">const</span> Ch* str, <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> len) {</div><div class="line"><a name="l02301"></a><span class="lineno"> 2301</span>&#160;        documentStack_.template Reserve&lt;Ch&gt;(1 + len * 2); <span class="comment">// worst case all characters are escaped as two characters</span></div><div class="line"><a name="l02302"></a><span class="lineno"> 2302</span>&#160;        *documentStack_.template PushUnsafe&lt;Ch&gt;() = <span class="charliteral">&#39;/&#39;</span>;</div><div class="line"><a name="l02303"></a><span class="lineno"> 2303</span>&#160;        <span class="keywordflow">for</span> (<a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> i = 0; i &lt; len; i++) {</div><div class="line"><a name="l02304"></a><span class="lineno"> 2304</span>&#160;            <span class="keywordflow">if</span> (str[i] == <span class="charliteral">&#39;~&#39;</span>) {</div><div class="line"><a name="l02305"></a><span class="lineno"> 2305</span>&#160;                *documentStack_.template PushUnsafe&lt;Ch&gt;() = <span class="charliteral">&#39;~&#39;</span>;</div><div class="line"><a name="l02306"></a><span class="lineno"> 2306</span>&#160;                *documentStack_.template PushUnsafe&lt;Ch&gt;() = <span class="charliteral">&#39;0&#39;</span>;</div><div class="line"><a name="l02307"></a><span class="lineno"> 2307</span>&#160;            }</div><div class="line"><a name="l02308"></a><span class="lineno"> 2308</span>&#160;            <span class="keywordflow">else</span> <span class="keywordflow">if</span> (str[i] == <span class="charliteral">&#39;/&#39;</span>) {</div><div class="line"><a name="l02309"></a><span class="lineno"> 2309</span>&#160;                *documentStack_.template PushUnsafe&lt;Ch&gt;() = <span class="charliteral">&#39;~&#39;</span>;</div><div class="line"><a name="l02310"></a><span class="lineno"> 2310</span>&#160;                *documentStack_.template PushUnsafe&lt;Ch&gt;() = <span class="charliteral">&#39;1&#39;</span>;</div><div class="line"><a name="l02311"></a><span class="lineno"> 2311</span>&#160;            }</div><div class="line"><a name="l02312"></a><span class="lineno"> 2312</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l02313"></a><span class="lineno"> 2313</span>&#160;                *documentStack_.template PushUnsafe&lt;Ch&gt;() = str[i];</div><div class="line"><a name="l02314"></a><span class="lineno"> 2314</span>&#160;        }</div><div class="line"><a name="l02315"></a><span class="lineno"> 2315</span>&#160;    }</div><div class="line"><a name="l02316"></a><span class="lineno"> 2316</span>&#160;</div><div class="line"><a name="l02317"></a><span class="lineno"> 2317</span>&#160;    RAPIDJSON_FORCEINLINE <span class="keywordtype">void</span> PushSchema(<span class="keyword">const</span> SchemaType&amp; schema) { <span class="keyword">new</span> (schemaStack_.template Push&lt;Context&gt;()) Context(*<span class="keyword">this</span>, *<span class="keyword">this</span>, &amp;schema); }</div><div class="line"><a name="l02318"></a><span class="lineno"> 2318</span>&#160;    </div><div class="line"><a name="l02319"></a><span class="lineno"> 2319</span>&#160;    RAPIDJSON_FORCEINLINE <span class="keywordtype">void</span> PopSchema() {</div><div class="line"><a name="l02320"></a><span class="lineno"> 2320</span>&#160;        Context* c = schemaStack_.template Pop&lt;Context&gt;(1);</div><div class="line"><a name="l02321"></a><span class="lineno"> 2321</span>&#160;        <span class="keywordflow">if</span> (HashCodeArray* a = static_cast&lt;HashCodeArray*&gt;(c-&gt;arrayElementHashCodes)) {</div><div class="line"><a name="l02322"></a><span class="lineno"> 2322</span>&#160;            a-&gt;~HashCodeArray();</div><div class="line"><a name="l02323"></a><span class="lineno"> 2323</span>&#160;            StateAllocator::Free(a);</div><div class="line"><a name="l02324"></a><span class="lineno"> 2324</span>&#160;        }</div><div class="line"><a name="l02325"></a><span class="lineno"> 2325</span>&#160;        c-&gt;~Context();</div><div class="line"><a name="l02326"></a><span class="lineno"> 2326</span>&#160;    }</div><div class="line"><a name="l02327"></a><span class="lineno"> 2327</span>&#160;</div><div class="line"><a name="l02328"></a><span class="lineno"> 2328</span>&#160;    <span class="keywordtype">void</span> AddErrorLocation(ValueType&amp; result, <span class="keywordtype">bool</span> parent) {</div><div class="line"><a name="l02329"></a><span class="lineno"> 2329</span>&#160;        <a class="code" href="classrapidjson_1_1_generic_string_buffer.html">GenericStringBuffer&lt;EncodingType&gt;</a> sb;</div><div class="line"><a name="l02330"></a><span class="lineno"> 2330</span>&#160;        PointerType instancePointer = GetInvalidDocumentPointer();</div><div class="line"><a name="l02331"></a><span class="lineno"> 2331</span>&#160;        ((parent &amp;&amp; instancePointer.GetTokenCount() &gt; 0)</div><div class="line"><a name="l02332"></a><span class="lineno"> 2332</span>&#160;            ? PointerType(instancePointer.GetTokens(), instancePointer.GetTokenCount() - 1)</div><div class="line"><a name="l02333"></a><span class="lineno"> 2333</span>&#160;            : instancePointer).StringifyUriFragment(sb);</div><div class="line"><a name="l02334"></a><span class="lineno"> 2334</span>&#160;        ValueType instanceRef(sb.GetString(), <span class="keyword">static_cast&lt;</span><a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a><span class="keyword">&gt;</span>(sb.<a class="code" href="classrapidjson_1_1_generic_string_buffer.html#a9d830ec37a4ba0fba3b523c90aaf8b42">GetSize</a>() / <span class="keyword">sizeof</span>(Ch)),</div><div class="line"><a name="l02335"></a><span class="lineno"> 2335</span>&#160;            GetStateAllocator());</div><div class="line"><a name="l02336"></a><span class="lineno"> 2336</span>&#160;        result.<a class="code" href="classrapidjson_1_1_generic_value.html#ab018d734d189532b27943bc45776ba68">AddMember</a>(GetInstanceRefString(), instanceRef, GetStateAllocator());</div><div class="line"><a name="l02337"></a><span class="lineno"> 2337</span>&#160;        sb.Clear();</div><div class="line"><a name="l02338"></a><span class="lineno"> 2338</span>&#160;        memcpy(sb.Push(CurrentSchema().GetURI().GetStringLength()),</div><div class="line"><a name="l02339"></a><span class="lineno"> 2339</span>&#160;            CurrentSchema().GetURI().GetString(),</div><div class="line"><a name="l02340"></a><span class="lineno"> 2340</span>&#160;            CurrentSchema().GetURI().GetStringLength() * <span class="keyword">sizeof</span>(Ch));</div><div class="line"><a name="l02341"></a><span class="lineno"> 2341</span>&#160;        GetInvalidSchemaPointer().StringifyUriFragment(sb);</div><div class="line"><a name="l02342"></a><span class="lineno"> 2342</span>&#160;        ValueType schemaRef(sb.GetString(), <span class="keyword">static_cast&lt;</span><a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a><span class="keyword">&gt;</span>(sb.<a class="code" href="classrapidjson_1_1_generic_string_buffer.html#a9d830ec37a4ba0fba3b523c90aaf8b42">GetSize</a>() / <span class="keyword">sizeof</span>(Ch)),</div><div class="line"><a name="l02343"></a><span class="lineno"> 2343</span>&#160;            GetStateAllocator());</div><div class="line"><a name="l02344"></a><span class="lineno"> 2344</span>&#160;        result.<a class="code" href="classrapidjson_1_1_generic_value.html#ab018d734d189532b27943bc45776ba68">AddMember</a>(GetSchemaRefString(), schemaRef, GetStateAllocator());</div><div class="line"><a name="l02345"></a><span class="lineno"> 2345</span>&#160;    }</div><div class="line"><a name="l02346"></a><span class="lineno"> 2346</span>&#160;</div><div class="line"><a name="l02347"></a><span class="lineno"> 2347</span>&#160;    <span class="keywordtype">void</span> AddError(ValueType&amp; keyword, ValueType&amp; error) {</div><div class="line"><a name="l02348"></a><span class="lineno"> 2348</span>&#160;        <span class="keyword">typename</span> <a class="code" href="classrapidjson_1_1_generic_member_iterator.html">ValueType::MemberIterator</a> member = error_.FindMember(keyword);</div><div class="line"><a name="l02349"></a><span class="lineno"> 2349</span>&#160;        <span class="keywordflow">if</span> (member == error_.MemberEnd())</div><div class="line"><a name="l02350"></a><span class="lineno"> 2350</span>&#160;            error_.AddMember(keyword, error, GetStateAllocator());</div><div class="line"><a name="l02351"></a><span class="lineno"> 2351</span>&#160;        <span class="keywordflow">else</span> {</div><div class="line"><a name="l02352"></a><span class="lineno"> 2352</span>&#160;            <span class="keywordflow">if</span> (member-&gt;value.IsObject()) {</div><div class="line"><a name="l02353"></a><span class="lineno"> 2353</span>&#160;                ValueType errors(<a class="code" href="namespacerapidjson.html#ae79a4751c1c460ff0de5ecc07874f3e4a058c622e1e7d59419ae58b895cbce468">kArrayType</a>);</div><div class="line"><a name="l02354"></a><span class="lineno"> 2354</span>&#160;                errors.<a class="code" href="classrapidjson_1_1_generic_value.html#a0ec9f34bef5890241d4bc882b73b1db4">PushBack</a>(member-&gt;value, GetStateAllocator());</div><div class="line"><a name="l02355"></a><span class="lineno"> 2355</span>&#160;                member-&gt;value = errors;</div><div class="line"><a name="l02356"></a><span class="lineno"> 2356</span>&#160;            }</div><div class="line"><a name="l02357"></a><span class="lineno"> 2357</span>&#160;            member-&gt;value.PushBack(error, GetStateAllocator());</div><div class="line"><a name="l02358"></a><span class="lineno"> 2358</span>&#160;        }</div><div class="line"><a name="l02359"></a><span class="lineno"> 2359</span>&#160;    }</div><div class="line"><a name="l02360"></a><span class="lineno"> 2360</span>&#160;</div><div class="line"><a name="l02361"></a><span class="lineno"> 2361</span>&#160;    <span class="keywordtype">void</span> AddCurrentError(<span class="keyword">const</span> <span class="keyword">typename</span> SchemaType::ValueType&amp; keyword, <span class="keywordtype">bool</span> parent = <span class="keyword">false</span>) {</div><div class="line"><a name="l02362"></a><span class="lineno"> 2362</span>&#160;        AddErrorLocation(currentError_, parent);</div><div class="line"><a name="l02363"></a><span class="lineno"> 2363</span>&#160;        AddError(ValueType(keyword, GetStateAllocator(), <span class="keyword">false</span>).Move(), currentError_);</div><div class="line"><a name="l02364"></a><span class="lineno"> 2364</span>&#160;    }</div><div class="line"><a name="l02365"></a><span class="lineno"> 2365</span>&#160;</div><div class="line"><a name="l02366"></a><span class="lineno"> 2366</span>&#160;    <span class="keywordtype">void</span> MergeError(ValueType&amp; other) {</div><div class="line"><a name="l02367"></a><span class="lineno"> 2367</span>&#160;        <span class="keywordflow">for</span> (<span class="keyword">typename</span> <a class="code" href="classrapidjson_1_1_generic_member_iterator.html">ValueType::MemberIterator</a> it = other.<a class="code" href="classrapidjson_1_1_generic_value.html#ae89a77887aa3eb1f1f913727cbff6786">MemberBegin</a>(), end = other.<a class="code" href="classrapidjson_1_1_generic_value.html#a34ee3d75a7aa308043fb34b0743bfe7c">MemberEnd</a>(); it != end; ++it) {</div><div class="line"><a name="l02368"></a><span class="lineno"> 2368</span>&#160;            AddError(it-&gt;name, it-&gt;value);</div><div class="line"><a name="l02369"></a><span class="lineno"> 2369</span>&#160;        }</div><div class="line"><a name="l02370"></a><span class="lineno"> 2370</span>&#160;    }</div><div class="line"><a name="l02371"></a><span class="lineno"> 2371</span>&#160;</div><div class="line"><a name="l02372"></a><span class="lineno"> 2372</span>&#160;    <span class="keywordtype">void</span> AddNumberError(<span class="keyword">const</span> <span class="keyword">typename</span> SchemaType::ValueType&amp; keyword, ValueType&amp; actual, <span class="keyword">const</span> SValue&amp; expected,</div><div class="line"><a name="l02373"></a><span class="lineno"> 2373</span>&#160;        <span class="keyword">const</span> <span class="keyword">typename</span> SchemaType::ValueType&amp; (*exclusive)() = 0) {</div><div class="line"><a name="l02374"></a><span class="lineno"> 2374</span>&#160;        currentError_.SetObject();</div><div class="line"><a name="l02375"></a><span class="lineno"> 2375</span>&#160;        currentError_.AddMember(GetActualString(), actual, GetStateAllocator());</div><div class="line"><a name="l02376"></a><span class="lineno"> 2376</span>&#160;        currentError_.AddMember(GetExpectedString(), ValueType(expected, GetStateAllocator()).Move(), GetStateAllocator());</div><div class="line"><a name="l02377"></a><span class="lineno"> 2377</span>&#160;        <span class="keywordflow">if</span> (exclusive)</div><div class="line"><a name="l02378"></a><span class="lineno"> 2378</span>&#160;            currentError_.AddMember(ValueType(exclusive(), GetStateAllocator()).Move(), <span class="keyword">true</span>, GetStateAllocator());</div><div class="line"><a name="l02379"></a><span class="lineno"> 2379</span>&#160;        AddCurrentError(keyword);</div><div class="line"><a name="l02380"></a><span class="lineno"> 2380</span>&#160;    }</div><div class="line"><a name="l02381"></a><span class="lineno"> 2381</span>&#160;</div><div class="line"><a name="l02382"></a><span class="lineno"> 2382</span>&#160;    <span class="keywordtype">void</span> AddErrorArray(<span class="keyword">const</span> <span class="keyword">typename</span> SchemaType::ValueType&amp; keyword,</div><div class="line"><a name="l02383"></a><span class="lineno"> 2383</span>&#160;        ISchemaValidator** subvalidators, <a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> count) {</div><div class="line"><a name="l02384"></a><span class="lineno"> 2384</span>&#160;        ValueType errors(<a class="code" href="namespacerapidjson.html#ae79a4751c1c460ff0de5ecc07874f3e4a058c622e1e7d59419ae58b895cbce468">kArrayType</a>);</div><div class="line"><a name="l02385"></a><span class="lineno"> 2385</span>&#160;        <span class="keywordflow">for</span> (<a class="code" href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">SizeType</a> i = 0; i &lt; count; ++i)</div><div class="line"><a name="l02386"></a><span class="lineno"> 2386</span>&#160;            errors.<a class="code" href="classrapidjson_1_1_generic_value.html#a0ec9f34bef5890241d4bc882b73b1db4">PushBack</a>(static_cast&lt;GenericSchemaValidator*&gt;(subvalidators[i])-&gt;GetError(), GetStateAllocator());</div><div class="line"><a name="l02387"></a><span class="lineno"> 2387</span>&#160;        currentError_.<a class="code" href="classrapidjson_1_1_generic_value.html#a7cb3cbaefe4fb99aaf9f155fb4ee039b">SetObject</a>();</div><div class="line"><a name="l02388"></a><span class="lineno"> 2388</span>&#160;        currentError_.<a class="code" href="classrapidjson_1_1_generic_value.html#ab018d734d189532b27943bc45776ba68">AddMember</a>(GetErrorsString(), errors, GetStateAllocator());</div><div class="line"><a name="l02389"></a><span class="lineno"> 2389</span>&#160;        AddCurrentError(keyword);</div><div class="line"><a name="l02390"></a><span class="lineno"> 2390</span>&#160;    }</div><div class="line"><a name="l02391"></a><span class="lineno"> 2391</span>&#160;</div><div class="line"><a name="l02392"></a><span class="lineno"> 2392</span>&#160;    <span class="keyword">const</span> SchemaType&amp; CurrentSchema()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> *schemaStack_.template Top&lt;Context&gt;()-&gt;schema; }</div><div class="line"><a name="l02393"></a><span class="lineno"> 2393</span>&#160;    Context&amp; CurrentContext() { <span class="keywordflow">return</span> *schemaStack_.template Top&lt;Context&gt;(); }</div><div class="line"><a name="l02394"></a><span class="lineno"> 2394</span>&#160;    <span class="keyword">const</span> Context&amp; CurrentContext()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> *schemaStack_.template Top&lt;Context&gt;(); }</div><div class="line"><a name="l02395"></a><span class="lineno"> 2395</span>&#160;</div><div class="line"><a name="l02396"></a><span class="lineno"> 2396</span>&#160;    <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">size_t</span> kDefaultSchemaStackCapacity = 1024;</div><div class="line"><a name="l02397"></a><span class="lineno"> 2397</span>&#160;    <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">size_t</span> kDefaultDocumentStackCapacity = 256;</div><div class="line"><a name="l02398"></a><span class="lineno"> 2398</span>&#160;    <span class="keyword">const</span> SchemaDocumentType* schemaDocument_;</div><div class="line"><a name="l02399"></a><span class="lineno"> 2399</span>&#160;    <span class="keyword">const</span> SchemaType&amp; root_;</div><div class="line"><a name="l02400"></a><span class="lineno"> 2400</span>&#160;    StateAllocator* stateAllocator_;</div><div class="line"><a name="l02401"></a><span class="lineno"> 2401</span>&#160;    StateAllocator* ownStateAllocator_;</div><div class="line"><a name="l02402"></a><span class="lineno"> 2402</span>&#160;    internal::Stack&lt;StateAllocator&gt; schemaStack_;    <span class="comment">//!&lt; stack to store the current path of schema (BaseSchemaType *)</span></div><div class="line"><a name="l02403"></a><span class="lineno"> 2403</span>&#160;<span class="comment"></span>    internal::Stack&lt;StateAllocator&gt; documentStack_;  <span class="comment">//!&lt; stack to store the current path of validating document (Ch)</span></div><div class="line"><a name="l02404"></a><span class="lineno"> 2404</span>&#160;<span class="comment"></span>    OutputHandler* outputHandler_;</div><div class="line"><a name="l02405"></a><span class="lineno"> 2405</span>&#160;    ValueType error_;</div><div class="line"><a name="l02406"></a><span class="lineno"> 2406</span>&#160;    ValueType currentError_;</div><div class="line"><a name="l02407"></a><span class="lineno"> 2407</span>&#160;    ValueType missingDependents_;</div><div class="line"><a name="l02408"></a><span class="lineno"> 2408</span>&#160;    <span class="keywordtype">bool</span> valid_;</div><div class="line"><a name="l02409"></a><span class="lineno"> 2409</span>&#160;<span class="preprocessor">#if RAPIDJSON_SCHEMA_VERBOSE</span></div><div class="line"><a name="l02410"></a><span class="lineno"> 2410</span>&#160;    <span class="keywordtype">unsigned</span> depth_;</div><div class="line"><a name="l02411"></a><span class="lineno"> 2411</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02412"></a><span class="lineno"> 2412</span>&#160;};</div><div class="line"><a name="l02413"></a><span class="lineno"> 2413</span>&#160;</div><div class="line"><a name="l02414"></a><span class="lineno"> 2414</span>&#160;<span class="keyword">typedef</span> <a class="code" href="classrapidjson_1_1_generic_schema_validator.html">GenericSchemaValidator&lt;SchemaDocument&gt;</a> <a class="code" href="classrapidjson_1_1_generic_schema_validator.html">SchemaValidator</a>;</div><div class="line"><a name="l02415"></a><span class="lineno"> 2415</span>&#160;<span class="comment"></span></div><div class="line"><a name="l02416"></a><span class="lineno"> 2416</span>&#160;<span class="comment">///////////////////////////////////////////////////////////////////////////////</span></div><div class="line"><a name="l02417"></a><span class="lineno"> 2417</span>&#160;<span class="comment"></span><span class="comment">// SchemaValidatingReader</span></div><div class="line"><a name="l02418"></a><span class="lineno"> 2418</span>&#160;<span class="comment"></span></div><div class="line"><a name="l02419"></a><span class="lineno"> 2419</span>&#160;<span class="comment">//! A helper class for parsing with validation.</span></div><div class="line"><a name="l02420"></a><span class="lineno"> 2420</span>&#160;<span class="comment"></span><span class="comment">/*!</span></div><div class="line"><a name="l02421"></a><span class="lineno"> 2421</span>&#160;<span class="comment">    This helper class is a functor, designed as a parameter of \ref GenericDocument::Populate().</span></div><div class="line"><a name="l02422"></a><span class="lineno"> 2422</span>&#160;<span class="comment"></span></div><div class="line"><a name="l02423"></a><span class="lineno"> 2423</span>&#160;<span class="comment">    \tparam parseFlags Combination of \ref ParseFlag.</span></div><div class="line"><a name="l02424"></a><span class="lineno"> 2424</span>&#160;<span class="comment">    \tparam InputStream Type of input stream, implementing Stream concept.</span></div><div class="line"><a name="l02425"></a><span class="lineno"> 2425</span>&#160;<span class="comment">    \tparam SourceEncoding Encoding of the input stream.</span></div><div class="line"><a name="l02426"></a><span class="lineno"> 2426</span>&#160;<span class="comment">    \tparam SchemaDocumentType Type of schema document.</span></div><div class="line"><a name="l02427"></a><span class="lineno"> 2427</span>&#160;<span class="comment">    \tparam StackAllocator Allocator type for stack.</span></div><div class="line"><a name="l02428"></a><span class="lineno"> 2428</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l02429"></a><span class="lineno"> 2429</span>&#160;<span class="keyword">template</span> &lt;</div><div class="line"><a name="l02430"></a><span class="lineno"> 2430</span>&#160;    <span class="keywordtype">unsigned</span> parseFlags,</div><div class="line"><a name="l02431"></a><span class="lineno"> 2431</span>&#160;    <span class="keyword">typename</span> InputStream,</div><div class="line"><a name="l02432"></a><span class="lineno"> 2432</span>&#160;    <span class="keyword">typename</span> SourceEncoding,</div><div class="line"><a name="l02433"></a><span class="lineno"> 2433</span>&#160;    <span class="keyword">typename</span> SchemaDocumentType = SchemaDocument,</div><div class="line"><a name="l02434"></a><span class="lineno"> 2434</span>&#160;    <span class="keyword">typename</span> StackAllocator = <a class="code" href="classrapidjson_1_1_crt_allocator.html">CrtAllocator</a>&gt;</div><div class="line"><a name="l02435"></a><span class="lineno"><a class="line" href="classrapidjson_1_1_schema_validating_reader.html"> 2435</a></span>&#160;<span class="keyword">class </span><a class="code" href="classrapidjson_1_1_schema_validating_reader.html">SchemaValidatingReader</a> {</div><div class="line"><a name="l02436"></a><span class="lineno"> 2436</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l02437"></a><span class="lineno"> 2437</span>&#160;    <span class="keyword">typedef</span> <span class="keyword">typename</span> SchemaDocumentType::PointerType PointerType;</div><div class="line"><a name="l02438"></a><span class="lineno"> 2438</span>&#160;    <span class="keyword">typedef</span> <span class="keyword">typename</span> InputStream::Ch Ch;</div><div class="line"><a name="l02439"></a><span class="lineno"> 2439</span>&#160;    <span class="keyword">typedef</span> <a class="code" href="classrapidjson_1_1_generic_value.html">GenericValue&lt;SourceEncoding, StackAllocator&gt;</a> ValueType;</div><div class="line"><a name="l02440"></a><span class="lineno"> 2440</span>&#160;<span class="comment"></span></div><div class="line"><a name="l02441"></a><span class="lineno"> 2441</span>&#160;<span class="comment">    //! Constructor</span></div><div class="line"><a name="l02442"></a><span class="lineno"> 2442</span>&#160;<span class="comment"></span><span class="comment">    /*!</span></div><div class="line"><a name="l02443"></a><span class="lineno"> 2443</span>&#160;<span class="comment">        \param is Input stream.</span></div><div class="line"><a name="l02444"></a><span class="lineno"> 2444</span>&#160;<span class="comment">        \param sd Schema document.</span></div><div class="line"><a name="l02445"></a><span class="lineno"> 2445</span>&#160;<span class="comment">    */</span></div><div class="line"><a name="l02446"></a><span class="lineno"><a class="line" href="classrapidjson_1_1_schema_validating_reader.html#a1e2bcc66cad23376241cd91e8bf8c706"> 2446</a></span>&#160;    <a class="code" href="classrapidjson_1_1_schema_validating_reader.html#a1e2bcc66cad23376241cd91e8bf8c706">SchemaValidatingReader</a>(InputStream&amp; is, <span class="keyword">const</span> SchemaDocumentType&amp; sd) : is_(is), sd_(sd), invalidSchemaKeyword_(), error_(<a class="code" href="namespacerapidjson.html#ae79a4751c1c460ff0de5ecc07874f3e4acf030b422a32c3647c7c5973bd4dd0a9">kObjectType</a>), isValid_(true) {}</div><div class="line"><a name="l02447"></a><span class="lineno"> 2447</span>&#160;</div><div class="line"><a name="l02448"></a><span class="lineno"> 2448</span>&#160;    <span class="keyword">template</span> &lt;<span class="keyword">typename</span> Handler&gt;</div><div class="line"><a name="l02449"></a><span class="lineno"> 2449</span>&#160;    <span class="keywordtype">bool</span> operator()(<a class="code" href="classrapidjson_1_1_handler.html">Handler</a>&amp; handler) {</div><div class="line"><a name="l02450"></a><span class="lineno"> 2450</span>&#160;        <a class="code" href="classrapidjson_1_1_generic_reader.html">GenericReader&lt;SourceEncoding, typename SchemaDocumentType::EncodingType, StackAllocator&gt;</a> reader;</div><div class="line"><a name="l02451"></a><span class="lineno"> 2451</span>&#160;        <a class="code" href="classrapidjson_1_1_generic_schema_validator.html">GenericSchemaValidator&lt;SchemaDocumentType, Handler&gt;</a> validator(sd_, handler);</div><div class="line"><a name="l02452"></a><span class="lineno"> 2452</span>&#160;        parseResult_ = reader.template Parse&lt;parseFlags&gt;(is_, validator);</div><div class="line"><a name="l02453"></a><span class="lineno"> 2453</span>&#160;</div><div class="line"><a name="l02454"></a><span class="lineno"> 2454</span>&#160;        isValid_ = validator.<a class="code" href="classrapidjson_1_1_generic_schema_validator.html#ad32a9ad31dbb588edaaf038ab053275b">IsValid</a>();</div><div class="line"><a name="l02455"></a><span class="lineno"> 2455</span>&#160;        <span class="keywordflow">if</span> (isValid_) {</div><div class="line"><a name="l02456"></a><span class="lineno"> 2456</span>&#160;            invalidSchemaPointer_ = PointerType();</div><div class="line"><a name="l02457"></a><span class="lineno"> 2457</span>&#160;            invalidSchemaKeyword_ = 0;</div><div class="line"><a name="l02458"></a><span class="lineno"> 2458</span>&#160;            invalidDocumentPointer_ = PointerType();</div><div class="line"><a name="l02459"></a><span class="lineno"> 2459</span>&#160;            error_.SetObject();</div><div class="line"><a name="l02460"></a><span class="lineno"> 2460</span>&#160;        }</div><div class="line"><a name="l02461"></a><span class="lineno"> 2461</span>&#160;        <span class="keywordflow">else</span> {</div><div class="line"><a name="l02462"></a><span class="lineno"> 2462</span>&#160;            invalidSchemaPointer_ = validator.<a class="code" href="classrapidjson_1_1_generic_schema_validator.html#a3238efb9d9144c2d6577362d8dc5f61b">GetInvalidSchemaPointer</a>();</div><div class="line"><a name="l02463"></a><span class="lineno"> 2463</span>&#160;            invalidSchemaKeyword_ = validator.<a class="code" href="classrapidjson_1_1_generic_schema_validator.html#a03bcd5497a574cffbd066d0aec2b5585">GetInvalidSchemaKeyword</a>();</div><div class="line"><a name="l02464"></a><span class="lineno"> 2464</span>&#160;            invalidDocumentPointer_ = validator.<a class="code" href="classrapidjson_1_1_generic_schema_validator.html#a60dfb4a89593c8d3ca4c89a6202feb52">GetInvalidDocumentPointer</a>();</div><div class="line"><a name="l02465"></a><span class="lineno"> 2465</span>&#160;            error_.CopyFrom(validator.<a class="code" href="classrapidjson_1_1_generic_schema_validator.html#a422c16457e512835b0d0f64ec1c81ba2">GetError</a>(), allocator_);</div><div class="line"><a name="l02466"></a><span class="lineno"> 2466</span>&#160;        }</div><div class="line"><a name="l02467"></a><span class="lineno"> 2467</span>&#160;</div><div class="line"><a name="l02468"></a><span class="lineno"> 2468</span>&#160;        <span class="keywordflow">return</span> parseResult_;</div><div class="line"><a name="l02469"></a><span class="lineno"> 2469</span>&#160;    }</div><div class="line"><a name="l02470"></a><span class="lineno"> 2470</span>&#160;</div><div class="line"><a name="l02471"></a><span class="lineno"> 2471</span>&#160;    <span class="keyword">const</span> <a class="code" href="group___r_a_p_i_d_j_s_o_n___e_r_r_o_r_s.html#structrapidjson_1_1_parse_result">ParseResult</a>&amp; GetParseResult()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> parseResult_; }</div><div class="line"><a name="l02472"></a><span class="lineno"> 2472</span>&#160;    <span class="keywordtype">bool</span> IsValid()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> isValid_; }</div><div class="line"><a name="l02473"></a><span class="lineno"> 2473</span>&#160;    <span class="keyword">const</span> PointerType&amp; GetInvalidSchemaPointer()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> invalidSchemaPointer_; }</div><div class="line"><a name="l02474"></a><span class="lineno"> 2474</span>&#160;    <span class="keyword">const</span> Ch* GetInvalidSchemaKeyword()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> invalidSchemaKeyword_; }</div><div class="line"><a name="l02475"></a><span class="lineno"> 2475</span>&#160;    <span class="keyword">const</span> PointerType&amp; GetInvalidDocumentPointer()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> invalidDocumentPointer_; }</div><div class="line"><a name="l02476"></a><span class="lineno"> 2476</span>&#160;    <span class="keyword">const</span> ValueType&amp; GetError()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> error_; }</div><div class="line"><a name="l02477"></a><span class="lineno"> 2477</span>&#160;</div><div class="line"><a name="l02478"></a><span class="lineno"> 2478</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l02479"></a><span class="lineno"> 2479</span>&#160;    InputStream&amp; is_;</div><div class="line"><a name="l02480"></a><span class="lineno"> 2480</span>&#160;    <span class="keyword">const</span> SchemaDocumentType&amp; sd_;</div><div class="line"><a name="l02481"></a><span class="lineno"> 2481</span>&#160;</div><div class="line"><a name="l02482"></a><span class="lineno"> 2482</span>&#160;    <a class="code" href="group___r_a_p_i_d_j_s_o_n___e_r_r_o_r_s.html#structrapidjson_1_1_parse_result">ParseResult</a> parseResult_;</div><div class="line"><a name="l02483"></a><span class="lineno"> 2483</span>&#160;    PointerType invalidSchemaPointer_;</div><div class="line"><a name="l02484"></a><span class="lineno"> 2484</span>&#160;    <span class="keyword">const</span> Ch* invalidSchemaKeyword_;</div><div class="line"><a name="l02485"></a><span class="lineno"> 2485</span>&#160;    PointerType invalidDocumentPointer_;</div><div class="line"><a name="l02486"></a><span class="lineno"> 2486</span>&#160;    StackAllocator allocator_;</div><div class="line"><a name="l02487"></a><span class="lineno"> 2487</span>&#160;    ValueType error_;</div><div class="line"><a name="l02488"></a><span class="lineno"> 2488</span>&#160;    <span class="keywordtype">bool</span> isValid_;</div><div class="line"><a name="l02489"></a><span class="lineno"> 2489</span>&#160;};</div><div class="line"><a name="l02490"></a><span class="lineno"> 2490</span>&#160;</div><div class="line"><a name="l02491"></a><span class="lineno"> 2491</span>&#160;RAPIDJSON_NAMESPACE_END</div><div class="line"><a name="l02492"></a><span class="lineno"> 2492</span>&#160;RAPIDJSON_DIAG_POP</div><div class="line"><a name="l02493"></a><span class="lineno"> 2493</span>&#160;</div><div class="line"><a name="l02494"></a><span class="lineno"> 2494</span>&#160;<span class="preprocessor">#endif // RAPIDJSON_SCHEMA_H_</span></div><div class="ttc" id="classrapidjson_1_1_generic_pointer_html_af09e26073a7263fc9e8f0c14160f45bd"><div class="ttname"><a href="classrapidjson_1_1_generic_pointer.html#af09e26073a7263fc9e8f0c14160f45bd">rapidjson::GenericPointer::Get</a></div><div class="ttdeci">ValueType * Get(ValueType &amp;root, size_t *unresolvedTokenIndex=0) const</div><div class="ttdoc">Query a value in a subtree. </div><div class="ttdef"><b>Definition:</b> pointer.h:482</div></div>
<div class="ttc" id="namespacerapidjson_html_ae79a4751c1c460ff0de5ecc07874f3e4a80d9f25b083abce45edbfdd3ba006c8e"><div class="ttname"><a href="namespacerapidjson.html#ae79a4751c1c460ff0de5ecc07874f3e4a80d9f25b083abce45edbfdd3ba006c8e">rapidjson::kTrueType</a></div><div class="ttdoc">true </div><div class="ttdef"><b>Definition:</b> rapidjson.h:634</div></div>
<div class="ttc" id="classrapidjson_1_1_handler_html"><div class="ttname"><a href="classrapidjson_1_1_handler.html">rapidjson::Handler</a></div><div class="ttdoc">Concept for receiving events from GenericReader upon parsing. The functions return true if no error o...</div></div>
<div class="ttc" id="classrapidjson_1_1_generic_value_html_a8d1040c479d89edb261db86400ebe603"><div class="ttname"><a href="classrapidjson_1_1_generic_value.html#a8d1040c479d89edb261db86400ebe603">rapidjson::GenericValue::Begin</a></div><div class="ttdeci">ValueIterator Begin()</div><div class="ttdoc">Element iterator </div><div class="ttdef"><b>Definition:</b> document.h:1594</div></div>
<div class="ttc" id="classrapidjson_1_1_generic_schema_validator_html_a03bcd5497a574cffbd066d0aec2b5585"><div class="ttname"><a href="classrapidjson_1_1_generic_schema_validator.html#a03bcd5497a574cffbd066d0aec2b5585">rapidjson::GenericSchemaValidator::GetInvalidSchemaKeyword</a></div><div class="ttdeci">const Ch * GetInvalidSchemaKeyword() const</div><div class="ttdoc">Gets the keyword of invalid schema. </div><div class="ttdef"><b>Definition:</b> schema.h:1867</div></div>
<div class="ttc" id="rapidjson_8h_html_aaee1245f375a71be1ac9b8a07ba5fb8f"><div class="ttname"><a href="rapidjson_8h.html#aaee1245f375a71be1ac9b8a07ba5fb8f">RAPIDJSON_UINT64_C2</a></div><div class="ttdeci">#define RAPIDJSON_UINT64_C2(high32, low32)</div><div class="ttdoc">Construct a 64-bit literal by a pair of 32-bit integer. </div><div class="ttdef"><b>Definition:</b> rapidjson.h:289</div></div>
<div class="ttc" id="classrapidjson_1_1_generic_reader_html"><div class="ttname"><a href="classrapidjson_1_1_generic_reader.html">rapidjson::GenericReader</a></div><div class="ttdoc">SAX-style JSON parser. Use Reader for UTF8 encoding and default allocator. </div><div class="ttdef"><b>Definition:</b> fwd.h:88</div></div>
<div class="ttc" id="classrapidjson_1_1_generic_value_html_a7cb3cbaefe4fb99aaf9f155fb4ee039b"><div class="ttname"><a href="classrapidjson_1_1_generic_value.html#a7cb3cbaefe4fb99aaf9f155fb4ee039b">rapidjson::GenericValue::SetObject</a></div><div class="ttdeci">GenericValue &amp; SetObject()</div><div class="ttdoc">Set this value as an empty object. </div><div class="ttdef"><b>Definition:</b> document.h:1093</div></div>
<div class="ttc" id="namespacerapidjson_html_a44eb33eaa523e36d466b1ced64b85c84"><div class="ttname"><a href="namespacerapidjson.html#a44eb33eaa523e36d466b1ced64b85c84">rapidjson::SizeType</a></div><div class="ttdeci">unsigned SizeType</div><div class="ttdoc">Size type (for string lengths, array sizes, etc.) </div><div class="ttdef"><b>Definition:</b> rapidjson.h:384</div></div>
<div class="ttc" id="classrapidjson_1_1_generic_value_html_a799a8a2503989f486f3fc7a660266555"><div class="ttname"><a href="classrapidjson_1_1_generic_value.html#a799a8a2503989f486f3fc7a660266555">rapidjson::GenericValue::Size</a></div><div class="ttdeci">SizeType Size() const</div><div class="ttdoc">Get the number of elements in array. </div><div class="ttdef"><b>Definition:</b> document.h:1560</div></div>
<div class="ttc" id="namespacerapidjson_html_ae79a4751c1c460ff0de5ecc07874f3e4a9f2e7047832dce1029551b5de0f05607"><div class="ttname"><a href="namespacerapidjson.html#ae79a4751c1c460ff0de5ecc07874f3e4a9f2e7047832dce1029551b5de0f05607">rapidjson::kFalseType</a></div><div class="ttdoc">false </div><div class="ttdef"><b>Definition:</b> rapidjson.h:633</div></div>
<div class="ttc" id="classrapidjson_1_1_generic_value_html_a34ee3d75a7aa308043fb34b0743bfe7c"><div class="ttname"><a href="classrapidjson_1_1_generic_value.html#a34ee3d75a7aa308043fb34b0743bfe7c">rapidjson::GenericValue::MemberEnd</a></div><div class="ttdeci">ConstMemberIterator MemberEnd() const</div><div class="ttdoc">Const past-the-end member iterator </div><div class="ttdef"><b>Definition:</b> document.h:1161</div></div>
<div class="ttc" id="classrapidjson_1_1_generic_string_buffer_html"><div class="ttname"><a href="classrapidjson_1_1_generic_string_buffer.html">rapidjson::GenericStringBuffer</a></div><div class="ttdoc">Represents an in-memory output stream. </div><div class="ttdef"><b>Definition:</b> fwd.h:59</div></div>
<div class="ttc" id="classrapidjson_1_1_generic_value_html_aaf58b9337ccc0cdf16aa9634c4645109"><div class="ttname"><a href="classrapidjson_1_1_generic_value.html#aaf58b9337ccc0cdf16aa9634c4645109">rapidjson::GenericValue::End</a></div><div class="ttdeci">ValueIterator End()</div><div class="ttdoc">Past-the-end element iterator </div><div class="ttdef"><b>Definition:</b> document.h:1597</div></div>
<div class="ttc" id="classrapidjson_1_1_generic_schema_document_html_aeebf51ef6353f6a01d6f6618da6d0865"><div class="ttname"><a href="classrapidjson_1_1_generic_schema_document.html#aeebf51ef6353f6a01d6f6618da6d0865">rapidjson::GenericSchemaDocument::GenericSchemaDocument</a></div><div class="ttdeci">GenericSchemaDocument(const ValueType &amp;document, const Ch *uri=0, SizeType uriLength=0, IRemoteSchemaDocumentProviderType *remoteProvider=0, Allocator *allocator=0)</div><div class="ttdoc">Constructor. </div><div class="ttdef"><b>Definition:</b> schema.h:1523</div></div>
<div class="ttc" id="classrapidjson_1_1_generic_schema_validator_html_a60dfb4a89593c8d3ca4c89a6202feb52"><div class="ttname"><a href="classrapidjson_1_1_generic_schema_validator.html#a60dfb4a89593c8d3ca4c89a6202feb52">rapidjson::GenericSchemaValidator::GetInvalidDocumentPointer</a></div><div class="ttdeci">PointerType GetInvalidDocumentPointer() const</div><div class="ttdoc">Gets the JSON pointer pointed to the invalid value. </div><div class="ttdef"><b>Definition:</b> schema.h:1872</div></div>
<div class="ttc" id="classrapidjson_1_1_generic_schema_validator_html_a422c16457e512835b0d0f64ec1c81ba2"><div class="ttname"><a href="classrapidjson_1_1_generic_schema_validator.html#a422c16457e512835b0d0f64ec1c81ba2">rapidjson::GenericSchemaValidator::GetError</a></div><div class="ttdeci">ValueType &amp; GetError()</div><div class="ttdoc">Gets the error object. </div><div class="ttdef"><b>Definition:</b> schema.h:1858</div></div>
<div class="ttc" id="classrapidjson_1_1_generic_schema_validator_html_ad9f00d71bf62b8983cf2514c43fb1572"><div class="ttname"><a href="classrapidjson_1_1_generic_schema_validator.html#ad9f00d71bf62b8983cf2514c43fb1572">rapidjson::GenericSchemaValidator::~GenericSchemaValidator</a></div><div class="ttdeci">~GenericSchemaValidator()</div><div class="ttdoc">Destructor. </div><div class="ttdef"><b>Definition:</b> schema.h:1837</div></div>
<div class="ttc" id="classrapidjson_1_1_generic_value_html_ae89a77887aa3eb1f1f913727cbff6786"><div class="ttname"><a href="classrapidjson_1_1_generic_value.html#ae89a77887aa3eb1f1f913727cbff6786">rapidjson::GenericValue::MemberBegin</a></div><div class="ttdeci">ConstMemberIterator MemberBegin() const</div><div class="ttdoc">Const member iterator </div><div class="ttdef"><b>Definition:</b> document.h:1158</div></div>
<div class="ttc" id="classrapidjson_1_1_crt_allocator_html"><div class="ttname"><a href="classrapidjson_1_1_crt_allocator.html">rapidjson::CrtAllocator</a></div><div class="ttdoc">C-runtime library allocator. </div><div class="ttdef"><b>Definition:</b> allocators.h:75</div></div>
<div class="ttc" id="rapidjson_8h_html_abdc7cd7902748ffe6626d71c59a73c3b"><div class="ttname"><a href="rapidjson_8h.html#abdc7cd7902748ffe6626d71c59a73c3b">RAPIDJSON_NEW</a></div><div class="ttdeci">#define RAPIDJSON_NEW(TypeName)</div><div class="ttdoc">! customization point for global new </div><div class="ttdef"><b>Definition:</b> rapidjson.h:614</div></div>
<div class="ttc" id="classrapidjson_1_1_generic_schema_validator_html_ad32a9ad31dbb588edaaf038ab053275b"><div class="ttname"><a href="classrapidjson_1_1_generic_schema_validator.html#ad32a9ad31dbb588edaaf038ab053275b">rapidjson::GenericSchemaValidator::IsValid</a></div><div class="ttdeci">virtual bool IsValid() const</div><div class="ttdoc">Checks whether the current state is valid. </div><div class="ttdef"><b>Definition:</b> schema.h:1855</div></div>
<div class="ttc" id="classrapidjson_1_1_generic_value_html_ab018d734d189532b27943bc45776ba68"><div class="ttname"><a href="classrapidjson_1_1_generic_value.html#ab018d734d189532b27943bc45776ba68">rapidjson::GenericValue::AddMember</a></div><div class="ttdeci">GenericValue &amp; AddMember(GenericValue &amp;name, GenericValue &amp;value, Allocator &amp;allocator)</div><div class="ttdoc">Add a member (name-value pair) to the object. </div><div class="ttdef"><b>Definition:</b> document.h:1284</div></div>
<div class="ttc" id="group___r_a_p_i_d_j_s_o_n___e_r_r_o_r_s_html_structrapidjson_1_1_parse_result"><div class="ttname"><a href="group___r_a_p_i_d_j_s_o_n___e_r_r_o_r_s.html#structrapidjson_1_1_parse_result">rapidjson::ParseResult</a></div><div class="ttdoc">Result of parsing (wraps ParseErrorCode) </div><div class="ttdef"><b>Definition:</b> error.h:106</div></div>
<div class="ttc" id="classrapidjson_1_1_generic_schema_validator_html_acc07bd08b00195d84bb5b83f59c593d3"><div class="ttname"><a href="classrapidjson_1_1_generic_schema_validator.html#acc07bd08b00195d84bb5b83f59c593d3">rapidjson::GenericSchemaValidator::GenericSchemaValidator</a></div><div class="ttdeci">GenericSchemaValidator(const SchemaDocumentType &amp;schemaDocument, StateAllocator *allocator=0, size_t schemaStackCapacity=kDefaultSchemaStackCapacity, size_t documentStackCapacity=kDefaultDocumentStackCapacity)</div><div class="ttdoc">Constructor without output handler. </div><div class="ttdef"><b>Definition:</b> schema.h:1782</div></div>
<div class="ttc" id="classrapidjson_1_1_generic_schema_document_html"><div class="ttname"><a href="classrapidjson_1_1_generic_schema_document.html">rapidjson::GenericSchemaDocument</a></div><div class="ttdoc">JSON schema document. </div><div class="ttdef"><b>Definition:</b> fwd.h:136</div></div>
<div class="ttc" id="namespacerapidjson_html_ae79a4751c1c460ff0de5ecc07874f3e4"><div class="ttname"><a href="namespacerapidjson.html#ae79a4751c1c460ff0de5ecc07874f3e4">rapidjson::Type</a></div><div class="ttdeci">Type</div><div class="ttdoc">Type of JSON value </div><div class="ttdef"><b>Definition:</b> rapidjson.h:631</div></div>
<div class="ttc" id="namespacerapidjson_html_ae79a4751c1c460ff0de5ecc07874f3e4acf030b422a32c3647c7c5973bd4dd0a9"><div class="ttname"><a href="namespacerapidjson.html#ae79a4751c1c460ff0de5ecc07874f3e4acf030b422a32c3647c7c5973bd4dd0a9">rapidjson::kObjectType</a></div><div class="ttdoc">object </div><div class="ttdef"><b>Definition:</b> rapidjson.h:635</div></div>
<div class="ttc" id="document_8h_html"><div class="ttname"><a href="document_8h.html">document.h</a></div></div>
<div class="ttc" id="classrapidjson_1_1_generic_schema_validator_html_afe6cd0d9088a1d4cf8100c0efc9f76fc"><div class="ttname"><a href="classrapidjson_1_1_generic_schema_validator.html#afe6cd0d9088a1d4cf8100c0efc9f76fc">rapidjson::GenericSchemaValidator::Reset</a></div><div class="ttdeci">void Reset()</div><div class="ttdoc">Reset the internal states. </div><div class="ttdef"><b>Definition:</b> schema.h:1843</div></div>
<div class="ttc" id="classrapidjson_1_1_generic_value_html_a0ec9f34bef5890241d4bc882b73b1db4"><div class="ttname"><a href="classrapidjson_1_1_generic_value.html#a0ec9f34bef5890241d4bc882b73b1db4">rapidjson::GenericValue::PushBack</a></div><div class="ttdeci">GenericValue &amp; PushBack(GenericValue &amp;value, Allocator &amp;allocator)</div><div class="ttdoc">Append a GenericValue at the end of the array. </div><div class="ttdef"><b>Definition:</b> document.h:1630</div></div>
<div class="ttc" id="classrapidjson_1_1_i_generic_remote_schema_document_provider_html"><div class="ttname"><a href="classrapidjson_1_1_i_generic_remote_schema_document_provider.html">rapidjson::IGenericRemoteSchemaDocumentProvider</a></div><div class="ttdef"><b>Definition:</b> fwd.h:133</div></div>
<div class="ttc" id="namespacerapidjson_html_ae79a4751c1c460ff0de5ecc07874f3e4a058c622e1e7d59419ae58b895cbce468"><div class="ttname"><a href="namespacerapidjson.html#ae79a4751c1c460ff0de5ecc07874f3e4a058c622e1e7d59419ae58b895cbce468">rapidjson::kArrayType</a></div><div class="ttdoc">array </div><div class="ttdef"><b>Definition:</b> rapidjson.h:636</div></div>
<div class="ttc" id="rapidjson_8h_html_a52c941c3fdd646527cdcd42aa846a28a"><div class="ttname"><a href="rapidjson_8h.html#a52c941c3fdd646527cdcd42aa846a28a">RAPIDJSON_DELETE</a></div><div class="ttdeci">#define RAPIDJSON_DELETE(x)</div><div class="ttdoc">! customization point for global delete </div><div class="ttdef"><b>Definition:</b> rapidjson.h:618</div></div>
<div class="ttc" id="classrapidjson_1_1_schema_validating_reader_html_a1e2bcc66cad23376241cd91e8bf8c706"><div class="ttname"><a href="classrapidjson_1_1_schema_validating_reader.html#a1e2bcc66cad23376241cd91e8bf8c706">rapidjson::SchemaValidatingReader::SchemaValidatingReader</a></div><div class="ttdeci">SchemaValidatingReader(InputStream &amp;is, const SchemaDocumentType &amp;sd)</div><div class="ttdoc">Constructor </div><div class="ttdef"><b>Definition:</b> schema.h:2446</div></div>
<div class="ttc" id="classrapidjson_1_1_generic_schema_document_html_adf6f3372013227873ed392dee1e752bf"><div class="ttname"><a href="classrapidjson_1_1_generic_schema_document.html#adf6f3372013227873ed392dee1e752bf">rapidjson::GenericSchemaDocument::~GenericSchemaDocument</a></div><div class="ttdeci">~GenericSchemaDocument()</div><div class="ttdoc">Destructor </div><div class="ttdef"><b>Definition:</b> schema.h:1589</div></div>
<div class="ttc" id="namespacerapidjson_html_ae79a4751c1c460ff0de5ecc07874f3e4a952871e4326b527154fc8aac1ac1f6ff"><div class="ttname"><a href="namespacerapidjson.html#ae79a4751c1c460ff0de5ecc07874f3e4a952871e4326b527154fc8aac1ac1f6ff">rapidjson::kNullType</a></div><div class="ttdoc">null </div><div class="ttdef"><b>Definition:</b> rapidjson.h:632</div></div>
<div class="ttc" id="namespacerapidjson_html_ae79a4751c1c460ff0de5ecc07874f3e4ad6379da3dc04b83a591992bfb9fabba7"><div class="ttname"><a href="namespacerapidjson.html#ae79a4751c1c460ff0de5ecc07874f3e4ad6379da3dc04b83a591992bfb9fabba7">rapidjson::kStringType</a></div><div class="ttdoc">string </div><div class="ttdef"><b>Definition:</b> rapidjson.h:637</div></div>
<div class="ttc" id="classrapidjson_1_1_generic_schema_document_html_a8b2ac6de85dc9c1fb4f4d0be4aeb2d6a"><div class="ttname"><a href="classrapidjson_1_1_generic_schema_document.html#a8b2ac6de85dc9c1fb4f4d0be4aeb2d6a">rapidjson::GenericSchemaDocument::GetRoot</a></div><div class="ttdeci">const SchemaType &amp; GetRoot() const</div><div class="ttdoc">Get the root schema. </div><div class="ttdef"><b>Definition:</b> schema.h:1604</div></div>
<div class="ttc" id="classrapidjson_1_1_generic_pointer_html_a7cb5eda2af1722e52efa591c4103ebec"><div class="ttname"><a href="classrapidjson_1_1_generic_pointer.html#a7cb5eda2af1722e52efa591c4103ebec">rapidjson::GenericPointer::Append</a></div><div class="ttdeci">GenericPointer Append(const Token &amp;token, Allocator *allocator=0) const</div><div class="ttdoc">Append a token and return a new Pointer </div><div class="ttdef"><b>Definition:</b> pointer.h:214</div></div>
<div class="ttc" id="structrapidjson_1_1_base_reader_handler_html"><div class="ttname"><a href="structrapidjson_1_1_base_reader_handler.html">rapidjson::BaseReaderHandler</a></div><div class="ttdoc">Default implementation of Handler. </div><div class="ttdef"><b>Definition:</b> fwd.h:85</div></div>
<div class="ttc" id="classrapidjson_1_1_generic_schema_validator_html"><div class="ttname"><a href="classrapidjson_1_1_generic_schema_validator.html">rapidjson::GenericSchemaValidator</a></div><div class="ttdoc">JSON Schema Validator. </div><div class="ttdef"><b>Definition:</b> fwd.h:145</div></div>
<div class="ttc" id="structrapidjson_1_1_generic_string_ref_html"><div class="ttname"><a href="structrapidjson_1_1_generic_string_ref.html">rapidjson::GenericStringRef</a></div><div class="ttdoc">Reference to a constant string (not taking a copy) </div><div class="ttdef"><b>Definition:</b> document.h:253</div></div>
<div class="ttc" id="classrapidjson_1_1_allocator_html"><div class="ttname"><a href="classrapidjson_1_1_allocator.html">rapidjson::Allocator</a></div><div class="ttdoc">Concept for allocating, resizing and freeing memory block. </div></div>
<div class="ttc" id="classrapidjson_1_1_generic_value_html"><div class="ttname"><a href="classrapidjson_1_1_generic_value.html">rapidjson::GenericValue</a></div><div class="ttdoc">Represents a JSON value. Use Value for UTF8 encoding and default allocator. </div><div class="ttdef"><b>Definition:</b> document.h:57</div></div>
<div class="ttc" id="classrapidjson_1_1_generic_member_iterator_html"><div class="ttname"><a href="classrapidjson_1_1_generic_member_iterator.html">rapidjson::GenericMemberIterator</a></div><div class="ttdoc">(Constant) member iterator for a JSON object value </div><div class="ttdef"><b>Definition:</b> document.h:99</div></div>
<div class="ttc" id="classrapidjson_1_1_schema_validating_reader_html"><div class="ttname"><a href="classrapidjson_1_1_schema_validating_reader.html">rapidjson::SchemaValidatingReader</a></div><div class="ttdoc">A helper class for parsing with validation. </div><div class="ttdef"><b>Definition:</b> schema.h:2435</div></div>
<div class="ttc" id="classrapidjson_1_1_generic_pointer_html_a98b96d54c2c3378f1892ffffc501069c"><div class="ttname"><a href="classrapidjson_1_1_generic_pointer.html#a98b96d54c2c3378f1892ffffc501069c">rapidjson::GenericPointer::IsValid</a></div><div class="ttdeci">bool IsValid() const</div><div class="ttdoc">Check whether this is a valid pointer. </div><div class="ttdef"><b>Definition:</b> pointer.h:306</div></div>
<div class="ttc" id="classrapidjson_1_1_generic_schema_validator_html_a3238efb9d9144c2d6577362d8dc5f61b"><div class="ttname"><a href="classrapidjson_1_1_generic_schema_validator.html#a3238efb9d9144c2d6577362d8dc5f61b">rapidjson::GenericSchemaValidator::GetInvalidSchemaPointer</a></div><div class="ttdeci">PointerType GetInvalidSchemaPointer() const</div><div class="ttdoc">Gets the JSON pointer pointed to the invalid schema. </div><div class="ttdef"><b>Definition:</b> schema.h:1862</div></div>
<div class="ttc" id="classrapidjson_1_1_generic_schema_validator_html_a0e1d8f19381bd53d77cc00a9a6dcd067"><div class="ttname"><a href="classrapidjson_1_1_generic_schema_validator.html#a0e1d8f19381bd53d77cc00a9a6dcd067">rapidjson::GenericSchemaValidator::GenericSchemaValidator</a></div><div class="ttdeci">GenericSchemaValidator(const SchemaDocumentType &amp;schemaDocument, OutputHandler &amp;outputHandler, StateAllocator *allocator=0, size_t schemaStackCapacity=kDefaultSchemaStackCapacity, size_t documentStackCapacity=kDefaultDocumentStackCapacity)</div><div class="ttdoc">Constructor with output handler. </div><div class="ttdef"><b>Definition:</b> schema.h:1812</div></div>
<div class="ttc" id="group___r_a_p_i_d_j_s_o_n___c_o_n_f_i_g_html_gabeba18d612187bad2ac62aed9276d47c"><div class="ttname"><a href="group___r_a_p_i_d_j_s_o_n___c_o_n_f_i_g.html#gabeba18d612187bad2ac62aed9276d47c">RAPIDJSON_ASSERT</a></div><div class="ttdeci">#define RAPIDJSON_ASSERT(x)</div><div class="ttdoc">Assertion. </div><div class="ttdef"><b>Definition:</b> rapidjson.h:406</div></div>
<div class="ttc" id="classrapidjson_1_1_generic_string_buffer_html_a9d830ec37a4ba0fba3b523c90aaf8b42"><div class="ttname"><a href="classrapidjson_1_1_generic_string_buffer.html#a9d830ec37a4ba0fba3b523c90aaf8b42">rapidjson::GenericStringBuffer::GetSize</a></div><div class="ttdeci">size_t GetSize() const</div><div class="ttdoc">Get the size of string in bytes in the string buffer. </div><div class="ttdef"><b>Definition:</b> stringbuffer.h:82</div></div>
<div class="ttc" id="namespacerapidjson_html_ae79a4751c1c460ff0de5ecc07874f3e4abe572cb44ce198e467ccf9d63d50d82a"><div class="ttname"><a href="namespacerapidjson.html#ae79a4751c1c460ff0de5ecc07874f3e4abe572cb44ce198e467ccf9d63d50d82a">rapidjson::kNumberType</a></div><div class="ttdoc">number </div><div class="ttdef"><b>Definition:</b> rapidjson.h:638</div></div>
</div><!-- fragment --></div><!-- contents -->
</div><!-- doc-content -->
<!-- HTML footer for doxygen 1.8.7-->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
  <ul>
    <li class="navelem"><a class="el" href="dir_d44c64559bbebec7f509842c48db8b23.html">include</a></li><li class="navelem"><a class="el" href="dir_32fb88e4d38e67d524aa70efbc36f66b.html">rapidjson</a></li><li class="navelem"><b>schema.h</b></li>
  </ul>
</div>
</body>
</html>