|
- <!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.14"/>
- <meta name="viewport" content="width=device-width, initial-scale=1"/>
- <title>uTL: test/eclipse-cygwin/lib/gtest/gtest.h Source File</title>
- <link href="tabs.css" rel="stylesheet" type="text/css"/>
- <script type="text/javascript" src="jquery.js"></script>
- <script type="text/javascript" src="dynsections.js"></script>
- <link href="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">
- /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
- $(document).ready(initResizable);
- /* @license-end */</script>
- <link href="search/search.css" rel="stylesheet" type="text/css"/>
- <script type="text/javascript" src="search/searchdata.js"></script>
- <script type="text/javascript" src="search/search.js"></script>
- <link href="doxygen.css" rel="stylesheet" type="text/css" />
- </head>
- <body>
- <div id="top"><!-- do not remove this div, it is closed by doxygen! -->
- <div id="titlearea">
- <table cellspacing="0" cellpadding="0">
- <tbody>
- <tr style="height: 56px;">
- <td id="projectalign" style="padding-left: 0.5em;">
- <div id="projectname">uTL
- </div>
- <div id="projectbrief">micro Template library</div>
- </td>
- </tr>
- </tbody>
- </table>
- </div>
- <!-- end header part -->
- <!-- Generated by Doxygen 1.8.14 -->
- <script type="text/javascript">
- /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
- var searchBox = new SearchBox("searchBox", "search",false,'Search');
- /* @license-end */
- </script>
- <script type="text/javascript" src="menudata.js"></script>
- <script type="text/javascript" src="menu.js"></script>
- <script type="text/javascript">
- /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
- $(function() {
- initMenu('',true,false,'search.php','Search');
- $(document).ready(function() { init_search(); });
- });
- /* @license-end */</script>
- <div id="main-nav"></div>
- </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">
- /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
- $(document).ready(function(){initNavTree('gtest_8h_source.html','');});
- /* @license-end */
- </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">gtest.h</div> </div>
- </div><!--header-->
- <div class="contents">
- <a href="gtest_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> <span class="comment">// Copyright 2005, Google Inc.</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> <span class="comment">// All rights reserved.</span></div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="comment">//</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span> <span class="comment">// Redistribution and use in source and binary forms, with or without</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span> <span class="comment">// modification, are permitted provided that the following conditions are</span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span> <span class="comment">// met:</span></div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span> <span class="comment">//</span></div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span> <span class="comment">// * Redistributions of source code must retain the above copyright</span></div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span> <span class="comment">// notice, this list of conditions and the following disclaimer.</span></div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span> <span class="comment">// * Redistributions in binary form must reproduce the above</span></div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span> <span class="comment">// copyright notice, this list of conditions and the following disclaimer</span></div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span> <span class="comment">// in the documentation and/or other materials provided with the</span></div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span> <span class="comment">// distribution.</span></div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span> <span class="comment">// * Neither the name of Google Inc. nor the names of its</span></div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span> <span class="comment">// contributors may be used to endorse or promote products derived from</span></div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span> <span class="comment">// this software without specific prior written permission.</span></div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span> <span class="comment">//</span></div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span> <span class="comment">// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS</span></div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span> <span class="comment">// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT</span></div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span> <span class="comment">// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR</span></div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span> <span class="comment">// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT</span></div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span> <span class="comment">// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,</span></div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span> <span class="comment">// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT</span></div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span> <span class="comment">// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,</span></div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span> <span class="comment">// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY</span></div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span> <span class="comment">// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</span></div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span> <span class="comment">// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE</span></div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span> <span class="comment">// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span></div><div class="line"><a name="l00029"></a><span class="lineno"> 29</span> </div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span> <span class="comment">//</span></div><div class="line"><a name="l00031"></a><span class="lineno"> 31</span> <span class="comment">// The Google C++ Testing and Mocking Framework (Google Test)</span></div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span> <span class="comment">//</span></div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span> <span class="comment">// This header file defines the public API for Google Test. It should be</span></div><div class="line"><a name="l00034"></a><span class="lineno"> 34</span> <span class="comment">// included by any test program that uses Google Test.</span></div><div class="line"><a name="l00035"></a><span class="lineno"> 35</span> <span class="comment">//</span></div><div class="line"><a name="l00036"></a><span class="lineno"> 36</span> <span class="comment">// IMPORTANT NOTE: Due to limitation of the C++ language, we have to</span></div><div class="line"><a name="l00037"></a><span class="lineno"> 37</span> <span class="comment">// leave some internal implementation details in this header file.</span></div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span> <span class="comment">// They are clearly marked by comments like this:</span></div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span> <span class="comment">//</span></div><div class="line"><a name="l00040"></a><span class="lineno"> 40</span> <span class="comment">// // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.</span></div><div class="line"><a name="l00041"></a><span class="lineno"> 41</span> <span class="comment">//</span></div><div class="line"><a name="l00042"></a><span class="lineno"> 42</span> <span class="comment">// Such code is NOT meant to be used by a user directly, and is subject</span></div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span> <span class="comment">// to CHANGE WITHOUT NOTICE. Therefore DO NOT DEPEND ON IT in a user</span></div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span> <span class="comment">// program!</span></div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span> <span class="comment">//</span></div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span> <span class="comment">// Acknowledgment: Google Test borrowed the idea of automatic test</span></div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span> <span class="comment">// registration from Barthelemy Dagenais' (barthelemy@prologique.com)</span></div><div class="line"><a name="l00048"></a><span class="lineno"> 48</span> <span class="comment">// easyUnit framework.</span></div><div class="line"><a name="l00049"></a><span class="lineno"> 49</span> </div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span> <span class="comment">// GOOGLETEST_CM0001 DO NOT DELETE</span></div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span> </div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span> <span class="preprocessor">#ifndef GTEST_INCLUDE_GTEST_GTEST_H_</span></div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span> <span class="preprocessor">#define GTEST_INCLUDE_GTEST_GTEST_H_</span></div><div class="line"><a name="l00054"></a><span class="lineno"> 54</span> </div><div class="line"><a name="l00055"></a><span class="lineno"> 55</span> <span class="preprocessor">#include <limits></span></div><div class="line"><a name="l00056"></a><span class="lineno"> 56</span> <span class="preprocessor">#include <memory></span></div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span> <span class="preprocessor">#include <ostream></span></div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span> <span class="preprocessor">#include <vector></span></div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span> </div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span> <span class="comment">// Copyright 2005, Google Inc.</span></div><div class="line"><a name="l00061"></a><span class="lineno"> 61</span> <span class="comment">// All rights reserved.</span></div><div class="line"><a name="l00062"></a><span class="lineno"> 62</span> <span class="comment">//</span></div><div class="line"><a name="l00063"></a><span class="lineno"> 63</span> <span class="comment">// Redistribution and use in source and binary forms, with or without</span></div><div class="line"><a name="l00064"></a><span class="lineno"> 64</span> <span class="comment">// modification, are permitted provided that the following conditions are</span></div><div class="line"><a name="l00065"></a><span class="lineno"> 65</span> <span class="comment">// met:</span></div><div class="line"><a name="l00066"></a><span class="lineno"> 66</span> <span class="comment">//</span></div><div class="line"><a name="l00067"></a><span class="lineno"> 67</span> <span class="comment">// * Redistributions of source code must retain the above copyright</span></div><div class="line"><a name="l00068"></a><span class="lineno"> 68</span> <span class="comment">// notice, this list of conditions and the following disclaimer.</span></div><div class="line"><a name="l00069"></a><span class="lineno"> 69</span> <span class="comment">// * Redistributions in binary form must reproduce the above</span></div><div class="line"><a name="l00070"></a><span class="lineno"> 70</span> <span class="comment">// copyright notice, this list of conditions and the following disclaimer</span></div><div class="line"><a name="l00071"></a><span class="lineno"> 71</span> <span class="comment">// in the documentation and/or other materials provided with the</span></div><div class="line"><a name="l00072"></a><span class="lineno"> 72</span> <span class="comment">// distribution.</span></div><div class="line"><a name="l00073"></a><span class="lineno"> 73</span> <span class="comment">// * Neither the name of Google Inc. nor the names of its</span></div><div class="line"><a name="l00074"></a><span class="lineno"> 74</span> <span class="comment">// contributors may be used to endorse or promote products derived from</span></div><div class="line"><a name="l00075"></a><span class="lineno"> 75</span> <span class="comment">// this software without specific prior written permission.</span></div><div class="line"><a name="l00076"></a><span class="lineno"> 76</span> <span class="comment">//</span></div><div class="line"><a name="l00077"></a><span class="lineno"> 77</span> <span class="comment">// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS</span></div><div class="line"><a name="l00078"></a><span class="lineno"> 78</span> <span class="comment">// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT</span></div><div class="line"><a name="l00079"></a><span class="lineno"> 79</span> <span class="comment">// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR</span></div><div class="line"><a name="l00080"></a><span class="lineno"> 80</span> <span class="comment">// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT</span></div><div class="line"><a name="l00081"></a><span class="lineno"> 81</span> <span class="comment">// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,</span></div><div class="line"><a name="l00082"></a><span class="lineno"> 82</span> <span class="comment">// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT</span></div><div class="line"><a name="l00083"></a><span class="lineno"> 83</span> <span class="comment">// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,</span></div><div class="line"><a name="l00084"></a><span class="lineno"> 84</span> <span class="comment">// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY</span></div><div class="line"><a name="l00085"></a><span class="lineno"> 85</span> <span class="comment">// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</span></div><div class="line"><a name="l00086"></a><span class="lineno"> 86</span> <span class="comment">// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE</span></div><div class="line"><a name="l00087"></a><span class="lineno"> 87</span> <span class="comment">// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span></div><div class="line"><a name="l00088"></a><span class="lineno"> 88</span> <span class="comment">//</span></div><div class="line"><a name="l00089"></a><span class="lineno"> 89</span> <span class="comment">// The Google C++ Testing and Mocking Framework (Google Test)</span></div><div class="line"><a name="l00090"></a><span class="lineno"> 90</span> <span class="comment">//</span></div><div class="line"><a name="l00091"></a><span class="lineno"> 91</span> <span class="comment">// This header file declares functions and macros used internally by</span></div><div class="line"><a name="l00092"></a><span class="lineno"> 92</span> <span class="comment">// Google Test. They are subject to change without notice.</span></div><div class="line"><a name="l00093"></a><span class="lineno"> 93</span> </div><div class="line"><a name="l00094"></a><span class="lineno"> 94</span> <span class="comment">// GOOGLETEST_CM0001 DO NOT DELETE</span></div><div class="line"><a name="l00095"></a><span class="lineno"> 95</span> </div><div class="line"><a name="l00096"></a><span class="lineno"> 96</span> <span class="preprocessor">#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_</span></div><div class="line"><a name="l00097"></a><span class="lineno"><a class="line" href="gtest_8h.html#a508d33581439542ea940eacbf306ad2a"> 97</a></span> <span class="preprocessor">#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_</span></div><div class="line"><a name="l00098"></a><span class="lineno"> 98</span> </div><div class="line"><a name="l00099"></a><span class="lineno"> 99</span> <span class="comment">// Copyright 2005, Google Inc.</span></div><div class="line"><a name="l00100"></a><span class="lineno"> 100</span> <span class="comment">// All rights reserved.</span></div><div class="line"><a name="l00101"></a><span class="lineno"> 101</span> <span class="comment">//</span></div><div class="line"><a name="l00102"></a><span class="lineno"> 102</span> <span class="comment">// Redistribution and use in source and binary forms, with or without</span></div><div class="line"><a name="l00103"></a><span class="lineno"> 103</span> <span class="comment">// modification, are permitted provided that the following conditions are</span></div><div class="line"><a name="l00104"></a><span class="lineno"> 104</span> <span class="comment">// met:</span></div><div class="line"><a name="l00105"></a><span class="lineno"> 105</span> <span class="comment">//</span></div><div class="line"><a name="l00106"></a><span class="lineno"> 106</span> <span class="comment">// * Redistributions of source code must retain the above copyright</span></div><div class="line"><a name="l00107"></a><span class="lineno"> 107</span> <span class="comment">// notice, this list of conditions and the following disclaimer.</span></div><div class="line"><a name="l00108"></a><span class="lineno"> 108</span> <span class="comment">// * Redistributions in binary form must reproduce the above</span></div><div class="line"><a name="l00109"></a><span class="lineno"> 109</span> <span class="comment">// copyright notice, this list of conditions and the following disclaimer</span></div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span> <span class="comment">// in the documentation and/or other materials provided with the</span></div><div class="line"><a name="l00111"></a><span class="lineno"> 111</span> <span class="comment">// distribution.</span></div><div class="line"><a name="l00112"></a><span class="lineno"> 112</span> <span class="comment">// * Neither the name of Google Inc. nor the names of its</span></div><div class="line"><a name="l00113"></a><span class="lineno"> 113</span> <span class="comment">// contributors may be used to endorse or promote products derived from</span></div><div class="line"><a name="l00114"></a><span class="lineno"> 114</span> <span class="comment">// this software without specific prior written permission.</span></div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span> <span class="comment">//</span></div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span> <span class="comment">// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS</span></div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span> <span class="comment">// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT</span></div><div class="line"><a name="l00118"></a><span class="lineno"> 118</span> <span class="comment">// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR</span></div><div class="line"><a name="l00119"></a><span class="lineno"> 119</span> <span class="comment">// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT</span></div><div class="line"><a name="l00120"></a><span class="lineno"> 120</span> <span class="comment">// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,</span></div><div class="line"><a name="l00121"></a><span class="lineno"> 121</span> <span class="comment">// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT</span></div><div class="line"><a name="l00122"></a><span class="lineno"> 122</span> <span class="comment">// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,</span></div><div class="line"><a name="l00123"></a><span class="lineno"> 123</span> <span class="comment">// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY</span></div><div class="line"><a name="l00124"></a><span class="lineno"> 124</span> <span class="comment">// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</span></div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span> <span class="comment">// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE</span></div><div class="line"><a name="l00126"></a><span class="lineno"> 126</span> <span class="comment">// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span></div><div class="line"><a name="l00127"></a><span class="lineno"> 127</span> <span class="comment">//</span></div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span> <span class="comment">// Low-level types and utilities for porting Google Test to various</span></div><div class="line"><a name="l00129"></a><span class="lineno"> 129</span> <span class="comment">// platforms. All macros ending with _ and symbols defined in an</span></div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span> <span class="comment">// internal namespace are subject to change without notice. Code</span></div><div class="line"><a name="l00131"></a><span class="lineno"> 131</span> <span class="comment">// outside Google Test MUST NOT USE THEM DIRECTLY. Macros that don't</span></div><div class="line"><a name="l00132"></a><span class="lineno"> 132</span> <span class="comment">// end with _ are part of Google Test's public API and can be used by</span></div><div class="line"><a name="l00133"></a><span class="lineno"> 133</span> <span class="comment">// code outside Google Test.</span></div><div class="line"><a name="l00134"></a><span class="lineno"> 134</span> <span class="comment">//</span></div><div class="line"><a name="l00135"></a><span class="lineno"> 135</span> <span class="comment">// This file is fundamental to Google Test. All other Google Test source</span></div><div class="line"><a name="l00136"></a><span class="lineno"> 136</span> <span class="comment">// files are expected to #include this. Therefore, it cannot #include</span></div><div class="line"><a name="l00137"></a><span class="lineno"> 137</span> <span class="comment">// any other Google Test header.</span></div><div class="line"><a name="l00138"></a><span class="lineno"> 138</span> </div><div class="line"><a name="l00139"></a><span class="lineno"> 139</span> <span class="comment">// GOOGLETEST_CM0001 DO NOT DELETE</span></div><div class="line"><a name="l00140"></a><span class="lineno"> 140</span> </div><div class="line"><a name="l00141"></a><span class="lineno"> 141</span> <span class="preprocessor">#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_</span></div><div class="line"><a name="l00142"></a><span class="lineno"><a class="line" href="gtest_8h.html#a6d13def13619ff1647c90e3354a65732"> 142</a></span> <span class="preprocessor">#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_</span></div><div class="line"><a name="l00143"></a><span class="lineno"> 143</span> </div><div class="line"><a name="l00144"></a><span class="lineno"> 144</span> <span class="comment">// Environment-describing macros</span></div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span> <span class="comment">// -----------------------------</span></div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span> <span class="comment">//</span></div><div class="line"><a name="l00147"></a><span class="lineno"> 147</span> <span class="comment">// Google Test can be used in many different environments. Macros in</span></div><div class="line"><a name="l00148"></a><span class="lineno"> 148</span> <span class="comment">// this section tell Google Test what kind of environment it is being</span></div><div class="line"><a name="l00149"></a><span class="lineno"> 149</span> <span class="comment">// used in, such that Google Test can provide environment-specific</span></div><div class="line"><a name="l00150"></a><span class="lineno"> 150</span> <span class="comment">// features and implementations.</span></div><div class="line"><a name="l00151"></a><span class="lineno"> 151</span> <span class="comment">//</span></div><div class="line"><a name="l00152"></a><span class="lineno"> 152</span> <span class="comment">// Google Test tries to automatically detect the properties of its</span></div><div class="line"><a name="l00153"></a><span class="lineno"> 153</span> <span class="comment">// environment, so users usually don't need to worry about these</span></div><div class="line"><a name="l00154"></a><span class="lineno"> 154</span> <span class="comment">// macros. However, the automatic detection is not perfect.</span></div><div class="line"><a name="l00155"></a><span class="lineno"> 155</span> <span class="comment">// Sometimes it's necessary for a user to define some of the following</span></div><div class="line"><a name="l00156"></a><span class="lineno"> 156</span> <span class="comment">// macros in the build script to override Google Test's decisions.</span></div><div class="line"><a name="l00157"></a><span class="lineno"> 157</span> <span class="comment">//</span></div><div class="line"><a name="l00158"></a><span class="lineno"> 158</span> <span class="comment">// If the user doesn't define a macro in the list, Google Test will</span></div><div class="line"><a name="l00159"></a><span class="lineno"> 159</span> <span class="comment">// provide a default definition. After this header is #included, all</span></div><div class="line"><a name="l00160"></a><span class="lineno"> 160</span> <span class="comment">// macros in this list will be defined to either 1 or 0.</span></div><div class="line"><a name="l00161"></a><span class="lineno"> 161</span> <span class="comment">//</span></div><div class="line"><a name="l00162"></a><span class="lineno"> 162</span> <span class="comment">// Notes to maintainers:</span></div><div class="line"><a name="l00163"></a><span class="lineno"> 163</span> <span class="comment">// - Each macro here is a user-tweakable knob; do not grow the list</span></div><div class="line"><a name="l00164"></a><span class="lineno"> 164</span> <span class="comment">// lightly.</span></div><div class="line"><a name="l00165"></a><span class="lineno"> 165</span> <span class="comment">// - Use #if to key off these macros. Don't use #ifdef or "#if</span></div><div class="line"><a name="l00166"></a><span class="lineno"> 166</span> <span class="comment">// defined(...)", which will not work as these macros are ALWAYS</span></div><div class="line"><a name="l00167"></a><span class="lineno"> 167</span> <span class="comment">// defined.</span></div><div class="line"><a name="l00168"></a><span class="lineno"> 168</span> <span class="comment">//</span></div><div class="line"><a name="l00169"></a><span class="lineno"> 169</span> <span class="comment">// GTEST_HAS_CLONE - Define it to 1/0 to indicate that clone(2)</span></div><div class="line"><a name="l00170"></a><span class="lineno"> 170</span> <span class="comment">// is/isn't available.</span></div><div class="line"><a name="l00171"></a><span class="lineno"> 171</span> <span class="comment">// GTEST_HAS_EXCEPTIONS - Define it to 1/0 to indicate that exceptions</span></div><div class="line"><a name="l00172"></a><span class="lineno"> 172</span> <span class="comment">// are enabled.</span></div><div class="line"><a name="l00173"></a><span class="lineno"> 173</span> <span class="comment">// GTEST_HAS_GLOBAL_STRING - Define it to 1/0 to indicate that ::string</span></div><div class="line"><a name="l00174"></a><span class="lineno"> 174</span> <span class="comment">// is/isn't available</span></div><div class="line"><a name="l00175"></a><span class="lineno"> 175</span> <span class="comment">// GTEST_HAS_GLOBAL_WSTRING - Define it to 1/0 to indicate that ::wstring</span></div><div class="line"><a name="l00176"></a><span class="lineno"> 176</span> <span class="comment">// is/isn't available</span></div><div class="line"><a name="l00177"></a><span class="lineno"> 177</span> <span class="comment">// GTEST_HAS_POSIX_RE - Define it to 1/0 to indicate that POSIX regular</span></div><div class="line"><a name="l00178"></a><span class="lineno"> 178</span> <span class="comment">// expressions are/aren't available.</span></div><div class="line"><a name="l00179"></a><span class="lineno"> 179</span> <span class="comment">// GTEST_HAS_PTHREAD - Define it to 1/0 to indicate that <pthread.h></span></div><div class="line"><a name="l00180"></a><span class="lineno"> 180</span> <span class="comment">// is/isn't available.</span></div><div class="line"><a name="l00181"></a><span class="lineno"> 181</span> <span class="comment">// GTEST_HAS_RTTI - Define it to 1/0 to indicate that RTTI is/isn't</span></div><div class="line"><a name="l00182"></a><span class="lineno"> 182</span> <span class="comment">// enabled.</span></div><div class="line"><a name="l00183"></a><span class="lineno"> 183</span> <span class="comment">// GTEST_HAS_STD_WSTRING - Define it to 1/0 to indicate that</span></div><div class="line"><a name="l00184"></a><span class="lineno"> 184</span> <span class="comment">// std::wstring does/doesn't work (Google Test can</span></div><div class="line"><a name="l00185"></a><span class="lineno"> 185</span> <span class="comment">// be used where std::wstring is unavailable).</span></div><div class="line"><a name="l00186"></a><span class="lineno"> 186</span> <span class="comment">// GTEST_HAS_SEH - Define it to 1/0 to indicate whether the</span></div><div class="line"><a name="l00187"></a><span class="lineno"> 187</span> <span class="comment">// compiler supports Microsoft's "Structured</span></div><div class="line"><a name="l00188"></a><span class="lineno"> 188</span> <span class="comment">// Exception Handling".</span></div><div class="line"><a name="l00189"></a><span class="lineno"> 189</span> <span class="comment">// GTEST_HAS_STREAM_REDIRECTION</span></div><div class="line"><a name="l00190"></a><span class="lineno"> 190</span> <span class="comment">// - Define it to 1/0 to indicate whether the</span></div><div class="line"><a name="l00191"></a><span class="lineno"> 191</span> <span class="comment">// platform supports I/O stream redirection using</span></div><div class="line"><a name="l00192"></a><span class="lineno"> 192</span> <span class="comment">// dup() and dup2().</span></div><div class="line"><a name="l00193"></a><span class="lineno"> 193</span> <span class="comment">// GTEST_LINKED_AS_SHARED_LIBRARY</span></div><div class="line"><a name="l00194"></a><span class="lineno"> 194</span> <span class="comment">// - Define to 1 when compiling tests that use</span></div><div class="line"><a name="l00195"></a><span class="lineno"> 195</span> <span class="comment">// Google Test as a shared library (known as</span></div><div class="line"><a name="l00196"></a><span class="lineno"> 196</span> <span class="comment">// DLL on Windows).</span></div><div class="line"><a name="l00197"></a><span class="lineno"> 197</span> <span class="comment">// GTEST_CREATE_SHARED_LIBRARY</span></div><div class="line"><a name="l00198"></a><span class="lineno"> 198</span> <span class="comment">// - Define to 1 when compiling Google Test itself</span></div><div class="line"><a name="l00199"></a><span class="lineno"> 199</span> <span class="comment">// as a shared library.</span></div><div class="line"><a name="l00200"></a><span class="lineno"> 200</span> <span class="comment">// GTEST_DEFAULT_DEATH_TEST_STYLE</span></div><div class="line"><a name="l00201"></a><span class="lineno"> 201</span> <span class="comment">// - The default value of --gtest_death_test_style.</span></div><div class="line"><a name="l00202"></a><span class="lineno"> 202</span> <span class="comment">// The legacy default has been "fast" in the open</span></div><div class="line"><a name="l00203"></a><span class="lineno"> 203</span> <span class="comment">// source version since 2008. The recommended value</span></div><div class="line"><a name="l00204"></a><span class="lineno"> 204</span> <span class="comment">// is "threadsafe", and can be set in</span></div><div class="line"><a name="l00205"></a><span class="lineno"> 205</span> <span class="comment">// custom/gtest-port.h.</span></div><div class="line"><a name="l00206"></a><span class="lineno"> 206</span> </div><div class="line"><a name="l00207"></a><span class="lineno"> 207</span> <span class="comment">// Platform-indicating macros</span></div><div class="line"><a name="l00208"></a><span class="lineno"> 208</span> <span class="comment">// --------------------------</span></div><div class="line"><a name="l00209"></a><span class="lineno"> 209</span> <span class="comment">//</span></div><div class="line"><a name="l00210"></a><span class="lineno"> 210</span> <span class="comment">// Macros indicating the platform on which Google Test is being used</span></div><div class="line"><a name="l00211"></a><span class="lineno"> 211</span> <span class="comment">// (a macro is defined to 1 if compiled on the given platform;</span></div><div class="line"><a name="l00212"></a><span class="lineno"> 212</span> <span class="comment">// otherwise UNDEFINED -- it's never defined to 0.). Google Test</span></div><div class="line"><a name="l00213"></a><span class="lineno"> 213</span> <span class="comment">// defines these macros automatically. Code outside Google Test MUST</span></div><div class="line"><a name="l00214"></a><span class="lineno"> 214</span> <span class="comment">// NOT define them.</span></div><div class="line"><a name="l00215"></a><span class="lineno"> 215</span> <span class="comment">//</span></div><div class="line"><a name="l00216"></a><span class="lineno"> 216</span> <span class="comment">// GTEST_OS_AIX - IBM AIX</span></div><div class="line"><a name="l00217"></a><span class="lineno"> 217</span> <span class="comment">// GTEST_OS_CYGWIN - Cygwin</span></div><div class="line"><a name="l00218"></a><span class="lineno"> 218</span> <span class="comment">// GTEST_OS_FREEBSD - FreeBSD</span></div><div class="line"><a name="l00219"></a><span class="lineno"> 219</span> <span class="comment">// GTEST_OS_FUCHSIA - Fuchsia</span></div><div class="line"><a name="l00220"></a><span class="lineno"> 220</span> <span class="comment">// GTEST_OS_HPUX - HP-UX</span></div><div class="line"><a name="l00221"></a><span class="lineno"> 221</span> <span class="comment">// GTEST_OS_LINUX - Linux</span></div><div class="line"><a name="l00222"></a><span class="lineno"> 222</span> <span class="comment">// GTEST_OS_LINUX_ANDROID - Google Android</span></div><div class="line"><a name="l00223"></a><span class="lineno"> 223</span> <span class="comment">// GTEST_OS_MAC - Mac OS X</span></div><div class="line"><a name="l00224"></a><span class="lineno"> 224</span> <span class="comment">// GTEST_OS_IOS - iOS</span></div><div class="line"><a name="l00225"></a><span class="lineno"> 225</span> <span class="comment">// GTEST_OS_NACL - Google Native Client (NaCl)</span></div><div class="line"><a name="l00226"></a><span class="lineno"> 226</span> <span class="comment">// GTEST_OS_NETBSD - NetBSD</span></div><div class="line"><a name="l00227"></a><span class="lineno"> 227</span> <span class="comment">// GTEST_OS_OPENBSD - OpenBSD</span></div><div class="line"><a name="l00228"></a><span class="lineno"> 228</span> <span class="comment">// GTEST_OS_OS2 - OS/2</span></div><div class="line"><a name="l00229"></a><span class="lineno"> 229</span> <span class="comment">// GTEST_OS_QNX - QNX</span></div><div class="line"><a name="l00230"></a><span class="lineno"> 230</span> <span class="comment">// GTEST_OS_SOLARIS - Sun Solaris</span></div><div class="line"><a name="l00231"></a><span class="lineno"> 231</span> <span class="comment">// GTEST_OS_WINDOWS - Windows (Desktop, MinGW, or Mobile)</span></div><div class="line"><a name="l00232"></a><span class="lineno"> 232</span> <span class="comment">// GTEST_OS_WINDOWS_DESKTOP - Windows Desktop</span></div><div class="line"><a name="l00233"></a><span class="lineno"> 233</span> <span class="comment">// GTEST_OS_WINDOWS_MINGW - MinGW</span></div><div class="line"><a name="l00234"></a><span class="lineno"> 234</span> <span class="comment">// GTEST_OS_WINDOWS_MOBILE - Windows Mobile</span></div><div class="line"><a name="l00235"></a><span class="lineno"> 235</span> <span class="comment">// GTEST_OS_WINDOWS_PHONE - Windows Phone</span></div><div class="line"><a name="l00236"></a><span class="lineno"> 236</span> <span class="comment">// GTEST_OS_WINDOWS_RT - Windows Store App/WinRT</span></div><div class="line"><a name="l00237"></a><span class="lineno"> 237</span> <span class="comment">// GTEST_OS_ZOS - z/OS</span></div><div class="line"><a name="l00238"></a><span class="lineno"> 238</span> <span class="comment">//</span></div><div class="line"><a name="l00239"></a><span class="lineno"> 239</span> <span class="comment">// Among the platforms, Cygwin, Linux, Max OS X, and Windows have the</span></div><div class="line"><a name="l00240"></a><span class="lineno"> 240</span> <span class="comment">// most stable support. Since core members of the Google Test project</span></div><div class="line"><a name="l00241"></a><span class="lineno"> 241</span> <span class="comment">// don't have access to other platforms, support for them may be less</span></div><div class="line"><a name="l00242"></a><span class="lineno"> 242</span> <span class="comment">// stable. If you notice any problems on your platform, please notify</span></div><div class="line"><a name="l00243"></a><span class="lineno"> 243</span> <span class="comment">// googletestframework@googlegroups.com (patches for fixing them are</span></div><div class="line"><a name="l00244"></a><span class="lineno"> 244</span> <span class="comment">// even more welcome!).</span></div><div class="line"><a name="l00245"></a><span class="lineno"> 245</span> <span class="comment">//</span></div><div class="line"><a name="l00246"></a><span class="lineno"> 246</span> <span class="comment">// It is possible that none of the GTEST_OS_* macros are defined.</span></div><div class="line"><a name="l00247"></a><span class="lineno"> 247</span> </div><div class="line"><a name="l00248"></a><span class="lineno"> 248</span> <span class="comment">// Feature-indicating macros</span></div><div class="line"><a name="l00249"></a><span class="lineno"> 249</span> <span class="comment">// -------------------------</span></div><div class="line"><a name="l00250"></a><span class="lineno"> 250</span> <span class="comment">//</span></div><div class="line"><a name="l00251"></a><span class="lineno"> 251</span> <span class="comment">// Macros indicating which Google Test features are available (a macro</span></div><div class="line"><a name="l00252"></a><span class="lineno"> 252</span> <span class="comment">// is defined to 1 if the corresponding feature is supported;</span></div><div class="line"><a name="l00253"></a><span class="lineno"> 253</span> <span class="comment">// otherwise UNDEFINED -- it's never defined to 0.). Google Test</span></div><div class="line"><a name="l00254"></a><span class="lineno"> 254</span> <span class="comment">// defines these macros automatically. Code outside Google Test MUST</span></div><div class="line"><a name="l00255"></a><span class="lineno"> 255</span> <span class="comment">// NOT define them.</span></div><div class="line"><a name="l00256"></a><span class="lineno"> 256</span> <span class="comment">//</span></div><div class="line"><a name="l00257"></a><span class="lineno"> 257</span> <span class="comment">// These macros are public so that portable tests can be written.</span></div><div class="line"><a name="l00258"></a><span class="lineno"> 258</span> <span class="comment">// Such tests typically surround code using a feature with an #if</span></div><div class="line"><a name="l00259"></a><span class="lineno"> 259</span> <span class="comment">// which controls that code. For example:</span></div><div class="line"><a name="l00260"></a><span class="lineno"> 260</span> <span class="comment">//</span></div><div class="line"><a name="l00261"></a><span class="lineno"> 261</span> <span class="comment">// #if GTEST_HAS_DEATH_TEST</span></div><div class="line"><a name="l00262"></a><span class="lineno"> 262</span> <span class="comment">// EXPECT_DEATH(DoSomethingDeadly());</span></div><div class="line"><a name="l00263"></a><span class="lineno"> 263</span> <span class="comment">// #endif</span></div><div class="line"><a name="l00264"></a><span class="lineno"> 264</span> <span class="comment">//</span></div><div class="line"><a name="l00265"></a><span class="lineno"> 265</span> <span class="comment">// GTEST_HAS_DEATH_TEST - death tests</span></div><div class="line"><a name="l00266"></a><span class="lineno"> 266</span> <span class="comment">// GTEST_HAS_TYPED_TEST - typed tests</span></div><div class="line"><a name="l00267"></a><span class="lineno"> 267</span> <span class="comment">// GTEST_HAS_TYPED_TEST_P - type-parameterized tests</span></div><div class="line"><a name="l00268"></a><span class="lineno"> 268</span> <span class="comment">// GTEST_IS_THREADSAFE - Google Test is thread-safe.</span></div><div class="line"><a name="l00269"></a><span class="lineno"> 269</span> <span class="comment">// GOOGLETEST_CM0007 DO NOT DELETE</span></div><div class="line"><a name="l00270"></a><span class="lineno"> 270</span> <span class="comment">// GTEST_USES_POSIX_RE - enhanced POSIX regex is used. Do not confuse with</span></div><div class="line"><a name="l00271"></a><span class="lineno"> 271</span> <span class="comment">// GTEST_HAS_POSIX_RE (see above) which users can</span></div><div class="line"><a name="l00272"></a><span class="lineno"> 272</span> <span class="comment">// define themselves.</span></div><div class="line"><a name="l00273"></a><span class="lineno"> 273</span> <span class="comment">// GTEST_USES_SIMPLE_RE - our own simple regex is used;</span></div><div class="line"><a name="l00274"></a><span class="lineno"> 274</span> <span class="comment">// the above RE\b(s) are mutually exclusive.</span></div><div class="line"><a name="l00275"></a><span class="lineno"> 275</span> </div><div class="line"><a name="l00276"></a><span class="lineno"> 276</span> <span class="comment">// Misc public macros</span></div><div class="line"><a name="l00277"></a><span class="lineno"> 277</span> <span class="comment">// ------------------</span></div><div class="line"><a name="l00278"></a><span class="lineno"> 278</span> <span class="comment">//</span></div><div class="line"><a name="l00279"></a><span class="lineno"> 279</span> <span class="comment">// GTEST_FLAG(flag_name) - references the variable corresponding to</span></div><div class="line"><a name="l00280"></a><span class="lineno"> 280</span> <span class="comment">// the given Google Test flag.</span></div><div class="line"><a name="l00281"></a><span class="lineno"> 281</span> </div><div class="line"><a name="l00282"></a><span class="lineno"> 282</span> <span class="comment">// Internal utilities</span></div><div class="line"><a name="l00283"></a><span class="lineno"> 283</span> <span class="comment">// ------------------</span></div><div class="line"><a name="l00284"></a><span class="lineno"> 284</span> <span class="comment">//</span></div><div class="line"><a name="l00285"></a><span class="lineno"> 285</span> <span class="comment">// The following macros and utilities are for Google Test's INTERNAL</span></div><div class="line"><a name="l00286"></a><span class="lineno"> 286</span> <span class="comment">// use only. Code outside Google Test MUST NOT USE THEM DIRECTLY.</span></div><div class="line"><a name="l00287"></a><span class="lineno"> 287</span> <span class="comment">//</span></div><div class="line"><a name="l00288"></a><span class="lineno"> 288</span> <span class="comment">// Macros for basic C++ coding:</span></div><div class="line"><a name="l00289"></a><span class="lineno"> 289</span> <span class="comment">// GTEST_AMBIGUOUS_ELSE_BLOCKER_ - for disabling a gcc warning.</span></div><div class="line"><a name="l00290"></a><span class="lineno"> 290</span> <span class="comment">// GTEST_ATTRIBUTE_UNUSED_ - declares that a class' instances or a</span></div><div class="line"><a name="l00291"></a><span class="lineno"> 291</span> <span class="comment">// variable don't have to be used.</span></div><div class="line"><a name="l00292"></a><span class="lineno"> 292</span> <span class="comment">// GTEST_DISALLOW_ASSIGN_ - disables operator=.</span></div><div class="line"><a name="l00293"></a><span class="lineno"> 293</span> <span class="comment">// GTEST_DISALLOW_COPY_AND_ASSIGN_ - disables copy ctor and operator=.</span></div><div class="line"><a name="l00294"></a><span class="lineno"> 294</span> <span class="comment">// GTEST_MUST_USE_RESULT_ - declares that a function's result must be used.</span></div><div class="line"><a name="l00295"></a><span class="lineno"> 295</span> <span class="comment">// GTEST_INTENTIONAL_CONST_COND_PUSH_ - start code section where MSVC C4127 is</span></div><div class="line"><a name="l00296"></a><span class="lineno"> 296</span> <span class="comment">// suppressed (constant conditional).</span></div><div class="line"><a name="l00297"></a><span class="lineno"> 297</span> <span class="comment">// GTEST_INTENTIONAL_CONST_COND_POP_ - finish code section where MSVC C4127</span></div><div class="line"><a name="l00298"></a><span class="lineno"> 298</span> <span class="comment">// is suppressed.</span></div><div class="line"><a name="l00299"></a><span class="lineno"> 299</span> <span class="comment">//</span></div><div class="line"><a name="l00300"></a><span class="lineno"> 300</span> <span class="comment">// Synchronization:</span></div><div class="line"><a name="l00301"></a><span class="lineno"> 301</span> <span class="comment">// Mutex, MutexLock, ThreadLocal, GetThreadCount()</span></div><div class="line"><a name="l00302"></a><span class="lineno"> 302</span> <span class="comment">// - synchronization primitives.</span></div><div class="line"><a name="l00303"></a><span class="lineno"> 303</span> <span class="comment">//</span></div><div class="line"><a name="l00304"></a><span class="lineno"> 304</span> <span class="comment">// Template meta programming:</span></div><div class="line"><a name="l00305"></a><span class="lineno"> 305</span> <span class="comment">// IteratorTraits - partial implementation of std::iterator_traits, which</span></div><div class="line"><a name="l00306"></a><span class="lineno"> 306</span> <span class="comment">// is not available in libCstd when compiled with Sun C++.</span></div><div class="line"><a name="l00307"></a><span class="lineno"> 307</span> <span class="comment">//</span></div><div class="line"><a name="l00308"></a><span class="lineno"> 308</span> <span class="comment">//</span></div><div class="line"><a name="l00309"></a><span class="lineno"> 309</span> <span class="comment">// Regular expressions:</span></div><div class="line"><a name="l00310"></a><span class="lineno"> 310</span> <span class="comment">// RE - a simple regular expression class using the POSIX</span></div><div class="line"><a name="l00311"></a><span class="lineno"> 311</span> <span class="comment">// Extended Regular Expression syntax on UNIX-like platforms</span></div><div class="line"><a name="l00312"></a><span class="lineno"> 312</span> <span class="comment">// GOOGLETEST_CM0008 DO NOT DELETE</span></div><div class="line"><a name="l00313"></a><span class="lineno"> 313</span> <span class="comment">// or a reduced regular exception syntax on other</span></div><div class="line"><a name="l00314"></a><span class="lineno"> 314</span> <span class="comment">// platforms, including Windows.</span></div><div class="line"><a name="l00315"></a><span class="lineno"> 315</span> <span class="comment">// Logging:</span></div><div class="line"><a name="l00316"></a><span class="lineno"> 316</span> <span class="comment">// GTEST_LOG_() - logs messages at the specified severity level.</span></div><div class="line"><a name="l00317"></a><span class="lineno"> 317</span> <span class="comment">// LogToStderr() - directs all log messages to stderr.</span></div><div class="line"><a name="l00318"></a><span class="lineno"> 318</span> <span class="comment">// FlushInfoLog() - flushes informational log messages.</span></div><div class="line"><a name="l00319"></a><span class="lineno"> 319</span> <span class="comment">//</span></div><div class="line"><a name="l00320"></a><span class="lineno"> 320</span> <span class="comment">// Stdout and stderr capturing:</span></div><div class="line"><a name="l00321"></a><span class="lineno"> 321</span> <span class="comment">// CaptureStdout() - starts capturing stdout.</span></div><div class="line"><a name="l00322"></a><span class="lineno"> 322</span> <span class="comment">// GetCapturedStdout() - stops capturing stdout and returns the captured</span></div><div class="line"><a name="l00323"></a><span class="lineno"> 323</span> <span class="comment">// string.</span></div><div class="line"><a name="l00324"></a><span class="lineno"> 324</span> <span class="comment">// CaptureStderr() - starts capturing stderr.</span></div><div class="line"><a name="l00325"></a><span class="lineno"> 325</span> <span class="comment">// GetCapturedStderr() - stops capturing stderr and returns the captured</span></div><div class="line"><a name="l00326"></a><span class="lineno"> 326</span> <span class="comment">// string.</span></div><div class="line"><a name="l00327"></a><span class="lineno"> 327</span> <span class="comment">//</span></div><div class="line"><a name="l00328"></a><span class="lineno"> 328</span> <span class="comment">// Integer types:</span></div><div class="line"><a name="l00329"></a><span class="lineno"> 329</span> <span class="comment">// TypeWithSize - maps an integer to a int type.</span></div><div class="line"><a name="l00330"></a><span class="lineno"> 330</span> <span class="comment">// Int32, UInt32, Int64, UInt64, TimeInMillis</span></div><div class="line"><a name="l00331"></a><span class="lineno"> 331</span> <span class="comment">// - integers of known sizes.</span></div><div class="line"><a name="l00332"></a><span class="lineno"> 332</span> <span class="comment">// BiggestInt - the biggest signed integer type.</span></div><div class="line"><a name="l00333"></a><span class="lineno"> 333</span> <span class="comment">//</span></div><div class="line"><a name="l00334"></a><span class="lineno"> 334</span> <span class="comment">// Command-line utilities:</span></div><div class="line"><a name="l00335"></a><span class="lineno"> 335</span> <span class="comment">// GTEST_DECLARE_*() - declares a flag.</span></div><div class="line"><a name="l00336"></a><span class="lineno"> 336</span> <span class="comment">// GTEST_DEFINE_*() - defines a flag.</span></div><div class="line"><a name="l00337"></a><span class="lineno"> 337</span> <span class="comment">// GetInjectableArgvs() - returns the command line as a vector of strings.</span></div><div class="line"><a name="l00338"></a><span class="lineno"> 338</span> <span class="comment">//</span></div><div class="line"><a name="l00339"></a><span class="lineno"> 339</span> <span class="comment">// Environment variable utilities:</span></div><div class="line"><a name="l00340"></a><span class="lineno"> 340</span> <span class="comment">// GetEnv() - gets the value of an environment variable.</span></div><div class="line"><a name="l00341"></a><span class="lineno"> 341</span> <span class="comment">// BoolFromGTestEnv() - parses a bool environment variable.</span></div><div class="line"><a name="l00342"></a><span class="lineno"> 342</span> <span class="comment">// Int32FromGTestEnv() - parses an Int32 environment variable.</span></div><div class="line"><a name="l00343"></a><span class="lineno"> 343</span> <span class="comment">// StringFromGTestEnv() - parses a string environment variable.</span></div><div class="line"><a name="l00344"></a><span class="lineno"> 344</span> </div><div class="line"><a name="l00345"></a><span class="lineno"> 345</span> <span class="preprocessor">#include <ctype.h></span> <span class="comment">// for isspace, etc</span></div><div class="line"><a name="l00346"></a><span class="lineno"> 346</span> <span class="preprocessor">#include <stddef.h></span> <span class="comment">// for ptrdiff_t</span></div><div class="line"><a name="l00347"></a><span class="lineno"> 347</span> <span class="preprocessor">#include <stdio.h></span></div><div class="line"><a name="l00348"></a><span class="lineno"> 348</span> <span class="preprocessor">#include <stdlib.h></span></div><div class="line"><a name="l00349"></a><span class="lineno"> 349</span> <span class="preprocessor">#include <string.h></span></div><div class="line"><a name="l00350"></a><span class="lineno"> 350</span> <span class="preprocessor">#include <memory></span></div><div class="line"><a name="l00351"></a><span class="lineno"> 351</span> <span class="preprocessor">#include <type_traits></span></div><div class="line"><a name="l00352"></a><span class="lineno"> 352</span> </div><div class="line"><a name="l00353"></a><span class="lineno"> 353</span> <span class="preprocessor">#ifndef _WIN32_WCE</span></div><div class="line"><a name="l00354"></a><span class="lineno"> 354</span> <span class="preprocessor"># include <sys/types.h></span></div><div class="line"><a name="l00355"></a><span class="lineno"> 355</span> <span class="preprocessor"># include <sys/stat.h></span></div><div class="line"><a name="l00356"></a><span class="lineno"> 356</span> <span class="preprocessor">#endif // !_WIN32_WCE</span></div><div class="line"><a name="l00357"></a><span class="lineno"> 357</span> </div><div class="line"><a name="l00358"></a><span class="lineno"> 358</span> <span class="preprocessor">#if defined __APPLE__</span></div><div class="line"><a name="l00359"></a><span class="lineno"> 359</span> <span class="preprocessor"># include <AvailabilityMacros.h></span></div><div class="line"><a name="l00360"></a><span class="lineno"> 360</span> <span class="preprocessor"># include <TargetConditionals.h></span></div><div class="line"><a name="l00361"></a><span class="lineno"> 361</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00362"></a><span class="lineno"> 362</span> </div><div class="line"><a name="l00363"></a><span class="lineno"> 363</span> <span class="comment">// Brings in the definition of HAS_GLOBAL_STRING. This must be done</span></div><div class="line"><a name="l00364"></a><span class="lineno"> 364</span> <span class="comment">// BEFORE we test HAS_GLOBAL_STRING.</span></div><div class="line"><a name="l00365"></a><span class="lineno"> 365</span> <span class="preprocessor">#include <string></span> <span class="comment">// NOLINT</span></div><div class="line"><a name="l00366"></a><span class="lineno"> 366</span> <span class="preprocessor">#include <algorithm></span> <span class="comment">// NOLINT</span></div><div class="line"><a name="l00367"></a><span class="lineno"> 367</span> <span class="preprocessor">#include <iostream></span> <span class="comment">// NOLINT</span></div><div class="line"><a name="l00368"></a><span class="lineno"> 368</span> <span class="preprocessor">#include <sstream></span> <span class="comment">// NOLINT</span></div><div class="line"><a name="l00369"></a><span class="lineno"> 369</span> <span class="preprocessor">#include <tuple></span></div><div class="line"><a name="l00370"></a><span class="lineno"> 370</span> <span class="preprocessor">#include <utility></span></div><div class="line"><a name="l00371"></a><span class="lineno"> 371</span> <span class="preprocessor">#include <vector></span> <span class="comment">// NOLINT</span></div><div class="line"><a name="l00372"></a><span class="lineno"> 372</span> </div><div class="line"><a name="l00373"></a><span class="lineno"> 373</span> <span class="comment">// Copyright 2015, Google Inc.</span></div><div class="line"><a name="l00374"></a><span class="lineno"> 374</span> <span class="comment">// All rights reserved.</span></div><div class="line"><a name="l00375"></a><span class="lineno"> 375</span> <span class="comment">//</span></div><div class="line"><a name="l00376"></a><span class="lineno"> 376</span> <span class="comment">// Redistribution and use in source and binary forms, with or without</span></div><div class="line"><a name="l00377"></a><span class="lineno"> 377</span> <span class="comment">// modification, are permitted provided that the following conditions are</span></div><div class="line"><a name="l00378"></a><span class="lineno"> 378</span> <span class="comment">// met:</span></div><div class="line"><a name="l00379"></a><span class="lineno"> 379</span> <span class="comment">//</span></div><div class="line"><a name="l00380"></a><span class="lineno"> 380</span> <span class="comment">// * Redistributions of source code must retain the above copyright</span></div><div class="line"><a name="l00381"></a><span class="lineno"> 381</span> <span class="comment">// notice, this list of conditions and the following disclaimer.</span></div><div class="line"><a name="l00382"></a><span class="lineno"> 382</span> <span class="comment">// * Redistributions in binary form must reproduce the above</span></div><div class="line"><a name="l00383"></a><span class="lineno"> 383</span> <span class="comment">// copyright notice, this list of conditions and the following disclaimer</span></div><div class="line"><a name="l00384"></a><span class="lineno"> 384</span> <span class="comment">// in the documentation and/or other materials provided with the</span></div><div class="line"><a name="l00385"></a><span class="lineno"> 385</span> <span class="comment">// distribution.</span></div><div class="line"><a name="l00386"></a><span class="lineno"> 386</span> <span class="comment">// * Neither the name of Google Inc. nor the names of its</span></div><div class="line"><a name="l00387"></a><span class="lineno"> 387</span> <span class="comment">// contributors may be used to endorse or promote products derived from</span></div><div class="line"><a name="l00388"></a><span class="lineno"> 388</span> <span class="comment">// this software without specific prior written permission.</span></div><div class="line"><a name="l00389"></a><span class="lineno"> 389</span> <span class="comment">//</span></div><div class="line"><a name="l00390"></a><span class="lineno"> 390</span> <span class="comment">// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS</span></div><div class="line"><a name="l00391"></a><span class="lineno"> 391</span> <span class="comment">// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT</span></div><div class="line"><a name="l00392"></a><span class="lineno"> 392</span> <span class="comment">// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR</span></div><div class="line"><a name="l00393"></a><span class="lineno"> 393</span> <span class="comment">// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT</span></div><div class="line"><a name="l00394"></a><span class="lineno"> 394</span> <span class="comment">// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,</span></div><div class="line"><a name="l00395"></a><span class="lineno"> 395</span> <span class="comment">// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT</span></div><div class="line"><a name="l00396"></a><span class="lineno"> 396</span> <span class="comment">// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,</span></div><div class="line"><a name="l00397"></a><span class="lineno"> 397</span> <span class="comment">// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY</span></div><div class="line"><a name="l00398"></a><span class="lineno"> 398</span> <span class="comment">// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</span></div><div class="line"><a name="l00399"></a><span class="lineno"> 399</span> <span class="comment">// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE</span></div><div class="line"><a name="l00400"></a><span class="lineno"> 400</span> <span class="comment">// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span></div><div class="line"><a name="l00401"></a><span class="lineno"> 401</span> <span class="comment">//</span></div><div class="line"><a name="l00402"></a><span class="lineno"> 402</span> <span class="comment">// The Google C++ Testing and Mocking Framework (Google Test)</span></div><div class="line"><a name="l00403"></a><span class="lineno"> 403</span> <span class="comment">//</span></div><div class="line"><a name="l00404"></a><span class="lineno"> 404</span> <span class="comment">// This header file defines the GTEST_OS_* macro.</span></div><div class="line"><a name="l00405"></a><span class="lineno"> 405</span> <span class="comment">// It is separate from gtest-port.h so that custom/gtest-port.h can include it.</span></div><div class="line"><a name="l00406"></a><span class="lineno"> 406</span> </div><div class="line"><a name="l00407"></a><span class="lineno"> 407</span> <span class="preprocessor">#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_ARCH_H_</span></div><div class="line"><a name="l00408"></a><span class="lineno"><a class="line" href="gtest_8h.html#a0392ac662f9547fb26a0d23c26d09fa6"> 408</a></span> <span class="preprocessor">#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_ARCH_H_</span></div><div class="line"><a name="l00409"></a><span class="lineno"> 409</span> </div><div class="line"><a name="l00410"></a><span class="lineno"> 410</span> <span class="comment">// Determines the platform on which Google Test is compiled.</span></div><div class="line"><a name="l00411"></a><span class="lineno"> 411</span> <span class="preprocessor">#ifdef __CYGWIN__</span></div><div class="line"><a name="l00412"></a><span class="lineno"> 412</span> <span class="preprocessor"># define GTEST_OS_CYGWIN 1</span></div><div class="line"><a name="l00413"></a><span class="lineno"> 413</span> <span class="preprocessor"># elif defined(__MINGW__) || defined(__MINGW32__) || defined(__MINGW64__)</span></div><div class="line"><a name="l00414"></a><span class="lineno"> 414</span> <span class="preprocessor"># define GTEST_OS_WINDOWS_MINGW 1</span></div><div class="line"><a name="l00415"></a><span class="lineno"> 415</span> <span class="preprocessor"># define GTEST_OS_WINDOWS 1</span></div><div class="line"><a name="l00416"></a><span class="lineno"> 416</span> <span class="preprocessor">#elif defined _WIN32</span></div><div class="line"><a name="l00417"></a><span class="lineno"> 417</span> <span class="preprocessor"># define GTEST_OS_WINDOWS 1</span></div><div class="line"><a name="l00418"></a><span class="lineno"> 418</span> <span class="preprocessor"># ifdef _WIN32_WCE</span></div><div class="line"><a name="l00419"></a><span class="lineno"> 419</span> <span class="preprocessor"># define GTEST_OS_WINDOWS_MOBILE 1</span></div><div class="line"><a name="l00420"></a><span class="lineno"> 420</span> <span class="preprocessor"># elif defined(WINAPI_FAMILY)</span></div><div class="line"><a name="l00421"></a><span class="lineno"> 421</span> <span class="preprocessor"># include <winapifamily.h></span></div><div class="line"><a name="l00422"></a><span class="lineno"> 422</span> <span class="preprocessor"># if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)</span></div><div class="line"><a name="l00423"></a><span class="lineno"> 423</span> <span class="preprocessor"># define GTEST_OS_WINDOWS_DESKTOP 1</span></div><div class="line"><a name="l00424"></a><span class="lineno"> 424</span> <span class="preprocessor"># elif WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_PHONE_APP)</span></div><div class="line"><a name="l00425"></a><span class="lineno"> 425</span> <span class="preprocessor"># define GTEST_OS_WINDOWS_PHONE 1</span></div><div class="line"><a name="l00426"></a><span class="lineno"> 426</span> <span class="preprocessor"># elif WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)</span></div><div class="line"><a name="l00427"></a><span class="lineno"> 427</span> <span class="preprocessor"># define GTEST_OS_WINDOWS_RT 1</span></div><div class="line"><a name="l00428"></a><span class="lineno"> 428</span> <span class="preprocessor"># elif WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_TV_TITLE)</span></div><div class="line"><a name="l00429"></a><span class="lineno"> 429</span> <span class="preprocessor"># define GTEST_OS_WINDOWS_PHONE 1</span></div><div class="line"><a name="l00430"></a><span class="lineno"> 430</span> <span class="preprocessor"># define GTEST_OS_WINDOWS_TV_TITLE 1</span></div><div class="line"><a name="l00431"></a><span class="lineno"> 431</span> <span class="preprocessor"># else</span></div><div class="line"><a name="l00432"></a><span class="lineno"> 432</span>  <span class="comment">// WINAPI_FAMILY defined but no known partition matched.</span></div><div class="line"><a name="l00433"></a><span class="lineno"> 433</span>  <span class="comment">// Default to desktop.</span></div><div class="line"><a name="l00434"></a><span class="lineno"> 434</span> <span class="preprocessor"># define GTEST_OS_WINDOWS_DESKTOP 1</span></div><div class="line"><a name="l00435"></a><span class="lineno"> 435</span> <span class="preprocessor"># endif</span></div><div class="line"><a name="l00436"></a><span class="lineno"> 436</span> <span class="preprocessor"># else</span></div><div class="line"><a name="l00437"></a><span class="lineno"> 437</span> <span class="preprocessor"># define GTEST_OS_WINDOWS_DESKTOP 1</span></div><div class="line"><a name="l00438"></a><span class="lineno"> 438</span> <span class="preprocessor"># endif // _WIN32_WCE</span></div><div class="line"><a name="l00439"></a><span class="lineno"> 439</span> <span class="preprocessor">#elif defined __OS2__</span></div><div class="line"><a name="l00440"></a><span class="lineno"> 440</span> <span class="preprocessor"># define GTEST_OS_OS2 1</span></div><div class="line"><a name="l00441"></a><span class="lineno"> 441</span> <span class="preprocessor">#elif defined __APPLE__</span></div><div class="line"><a name="l00442"></a><span class="lineno"> 442</span> <span class="preprocessor"># define GTEST_OS_MAC 1</span></div><div class="line"><a name="l00443"></a><span class="lineno"> 443</span> <span class="preprocessor"># if TARGET_OS_IPHONE</span></div><div class="line"><a name="l00444"></a><span class="lineno"> 444</span> <span class="preprocessor"># define GTEST_OS_IOS 1</span></div><div class="line"><a name="l00445"></a><span class="lineno"> 445</span> <span class="preprocessor"># endif</span></div><div class="line"><a name="l00446"></a><span class="lineno"> 446</span> <span class="preprocessor">#elif defined __FreeBSD__</span></div><div class="line"><a name="l00447"></a><span class="lineno"> 447</span> <span class="preprocessor"># define GTEST_OS_FREEBSD 1</span></div><div class="line"><a name="l00448"></a><span class="lineno"> 448</span> <span class="preprocessor">#elif defined __Fuchsia__</span></div><div class="line"><a name="l00449"></a><span class="lineno"> 449</span> <span class="preprocessor"># define GTEST_OS_FUCHSIA 1</span></div><div class="line"><a name="l00450"></a><span class="lineno"> 450</span> <span class="preprocessor">#elif defined __linux__</span></div><div class="line"><a name="l00451"></a><span class="lineno"> 451</span> <span class="preprocessor"># define GTEST_OS_LINUX 1</span></div><div class="line"><a name="l00452"></a><span class="lineno"> 452</span> <span class="preprocessor"># if defined __ANDROID__</span></div><div class="line"><a name="l00453"></a><span class="lineno"> 453</span> <span class="preprocessor"># define GTEST_OS_LINUX_ANDROID 1</span></div><div class="line"><a name="l00454"></a><span class="lineno"> 454</span> <span class="preprocessor"># endif</span></div><div class="line"><a name="l00455"></a><span class="lineno"> 455</span> <span class="preprocessor">#elif defined __MVS__</span></div><div class="line"><a name="l00456"></a><span class="lineno"> 456</span> <span class="preprocessor"># define GTEST_OS_ZOS 1</span></div><div class="line"><a name="l00457"></a><span class="lineno"> 457</span> <span class="preprocessor">#elif defined(__sun) && defined(__SVR4)</span></div><div class="line"><a name="l00458"></a><span class="lineno"> 458</span> <span class="preprocessor"># define GTEST_OS_SOLARIS 1</span></div><div class="line"><a name="l00459"></a><span class="lineno"> 459</span> <span class="preprocessor">#elif defined(_AIX)</span></div><div class="line"><a name="l00460"></a><span class="lineno"> 460</span> <span class="preprocessor"># define GTEST_OS_AIX 1</span></div><div class="line"><a name="l00461"></a><span class="lineno"> 461</span> <span class="preprocessor">#elif defined(__hpux)</span></div><div class="line"><a name="l00462"></a><span class="lineno"> 462</span> <span class="preprocessor"># define GTEST_OS_HPUX 1</span></div><div class="line"><a name="l00463"></a><span class="lineno"> 463</span> <span class="preprocessor">#elif defined __native_client__</span></div><div class="line"><a name="l00464"></a><span class="lineno"> 464</span> <span class="preprocessor"># define GTEST_OS_NACL 1</span></div><div class="line"><a name="l00465"></a><span class="lineno"> 465</span> <span class="preprocessor">#elif defined __NetBSD__</span></div><div class="line"><a name="l00466"></a><span class="lineno"> 466</span> <span class="preprocessor"># define GTEST_OS_NETBSD 1</span></div><div class="line"><a name="l00467"></a><span class="lineno"> 467</span> <span class="preprocessor">#elif defined __OpenBSD__</span></div><div class="line"><a name="l00468"></a><span class="lineno"> 468</span> <span class="preprocessor"># define GTEST_OS_OPENBSD 1</span></div><div class="line"><a name="l00469"></a><span class="lineno"> 469</span> <span class="preprocessor">#elif defined __QNX__</span></div><div class="line"><a name="l00470"></a><span class="lineno"> 470</span> <span class="preprocessor"># define GTEST_OS_QNX 1</span></div><div class="line"><a name="l00471"></a><span class="lineno"> 471</span> <span class="preprocessor">#endif // __CYGWIN__</span></div><div class="line"><a name="l00472"></a><span class="lineno"> 472</span> </div><div class="line"><a name="l00473"></a><span class="lineno"> 473</span> <span class="preprocessor">#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_ARCH_H_</span></div><div class="line"><a name="l00474"></a><span class="lineno"> 474</span> <span class="comment">// Copyright 2015, Google Inc.</span></div><div class="line"><a name="l00475"></a><span class="lineno"> 475</span> <span class="comment">// All rights reserved.</span></div><div class="line"><a name="l00476"></a><span class="lineno"> 476</span> <span class="comment">//</span></div><div class="line"><a name="l00477"></a><span class="lineno"> 477</span> <span class="comment">// Redistribution and use in source and binary forms, with or without</span></div><div class="line"><a name="l00478"></a><span class="lineno"> 478</span> <span class="comment">// modification, are permitted provided that the following conditions are</span></div><div class="line"><a name="l00479"></a><span class="lineno"> 479</span> <span class="comment">// met:</span></div><div class="line"><a name="l00480"></a><span class="lineno"> 480</span> <span class="comment">//</span></div><div class="line"><a name="l00481"></a><span class="lineno"> 481</span> <span class="comment">// * Redistributions of source code must retain the above copyright</span></div><div class="line"><a name="l00482"></a><span class="lineno"> 482</span> <span class="comment">// notice, this list of conditions and the following disclaimer.</span></div><div class="line"><a name="l00483"></a><span class="lineno"> 483</span> <span class="comment">// * Redistributions in binary form must reproduce the above</span></div><div class="line"><a name="l00484"></a><span class="lineno"> 484</span> <span class="comment">// copyright notice, this list of conditions and the following disclaimer</span></div><div class="line"><a name="l00485"></a><span class="lineno"> 485</span> <span class="comment">// in the documentation and/or other materials provided with the</span></div><div class="line"><a name="l00486"></a><span class="lineno"> 486</span> <span class="comment">// distribution.</span></div><div class="line"><a name="l00487"></a><span class="lineno"> 487</span> <span class="comment">// * Neither the name of Google Inc. nor the names of its</span></div><div class="line"><a name="l00488"></a><span class="lineno"> 488</span> <span class="comment">// contributors may be used to endorse or promote products derived from</span></div><div class="line"><a name="l00489"></a><span class="lineno"> 489</span> <span class="comment">// this software without specific prior written permission.</span></div><div class="line"><a name="l00490"></a><span class="lineno"> 490</span> <span class="comment">//</span></div><div class="line"><a name="l00491"></a><span class="lineno"> 491</span> <span class="comment">// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS</span></div><div class="line"><a name="l00492"></a><span class="lineno"> 492</span> <span class="comment">// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT</span></div><div class="line"><a name="l00493"></a><span class="lineno"> 493</span> <span class="comment">// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR</span></div><div class="line"><a name="l00494"></a><span class="lineno"> 494</span> <span class="comment">// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT</span></div><div class="line"><a name="l00495"></a><span class="lineno"> 495</span> <span class="comment">// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,</span></div><div class="line"><a name="l00496"></a><span class="lineno"> 496</span> <span class="comment">// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT</span></div><div class="line"><a name="l00497"></a><span class="lineno"> 497</span> <span class="comment">// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,</span></div><div class="line"><a name="l00498"></a><span class="lineno"> 498</span> <span class="comment">// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY</span></div><div class="line"><a name="l00499"></a><span class="lineno"> 499</span> <span class="comment">// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</span></div><div class="line"><a name="l00500"></a><span class="lineno"> 500</span> <span class="comment">// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE</span></div><div class="line"><a name="l00501"></a><span class="lineno"> 501</span> <span class="comment">// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span></div><div class="line"><a name="l00502"></a><span class="lineno"> 502</span> <span class="comment">//</span></div><div class="line"><a name="l00503"></a><span class="lineno"> 503</span> <span class="comment">// Injection point for custom user configurations. See README for details</span></div><div class="line"><a name="l00504"></a><span class="lineno"> 504</span> <span class="comment">//</span></div><div class="line"><a name="l00505"></a><span class="lineno"> 505</span> <span class="comment">// ** Custom implementation starts here **</span></div><div class="line"><a name="l00506"></a><span class="lineno"> 506</span> </div><div class="line"><a name="l00507"></a><span class="lineno"> 507</span> <span class="preprocessor">#ifndef GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PORT_H_</span></div><div class="line"><a name="l00508"></a><span class="lineno"><a class="line" href="gtest_8h.html#aae632b050088c635963f553c4a5157b0"> 508</a></span> <span class="preprocessor">#define GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PORT_H_</span></div><div class="line"><a name="l00509"></a><span class="lineno"> 509</span> </div><div class="line"><a name="l00510"></a><span class="lineno"> 510</span> <span class="preprocessor">#endif // GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PORT_H_</span></div><div class="line"><a name="l00511"></a><span class="lineno"> 511</span> </div><div class="line"><a name="l00512"></a><span class="lineno"> 512</span> <span class="preprocessor">#if !defined(GTEST_DEV_EMAIL_)</span></div><div class="line"><a name="l00513"></a><span class="lineno"><a class="line" href="gtest_8h.html#a21086d276b1a64d6763ee8a94b12c1b8"> 513</a></span> <span class="preprocessor"># define GTEST_DEV_EMAIL_ "googletestframework@@googlegroups.com"</span></div><div class="line"><a name="l00514"></a><span class="lineno"><a class="line" href="gtest_8h.html#a088e84784c589ba9b1fc48602ad8eabf"> 514</a></span> <span class="preprocessor"># define GTEST_FLAG_PREFIX_ "gtest_"</span></div><div class="line"><a name="l00515"></a><span class="lineno"><a class="line" href="gtest_8h.html#a4251ff898f9f94ec6b8b9402c3436759"> 515</a></span> <span class="preprocessor"># define GTEST_FLAG_PREFIX_DASH_ "gtest-"</span></div><div class="line"><a name="l00516"></a><span class="lineno"><a class="line" href="gtest_8h.html#a4018b7f288f974d022df397e2730633a"> 516</a></span> <span class="preprocessor"># define GTEST_FLAG_PREFIX_UPPER_ "GTEST_"</span></div><div class="line"><a name="l00517"></a><span class="lineno"><a class="line" href="gtest_8h.html#a13d98c217176bd8722c395b9225fc19d"> 517</a></span> <span class="preprocessor"># define GTEST_NAME_ "Google Test"</span></div><div class="line"><a name="l00518"></a><span class="lineno"><a class="line" href="gtest_8h.html#a5aa3c938fc1d049f1d9c5332f6a0b1d4"> 518</a></span> <span class="preprocessor"># define GTEST_PROJECT_URL_ "https://github.com/google/googletest/"</span></div><div class="line"><a name="l00519"></a><span class="lineno"> 519</span> <span class="preprocessor">#endif // !defined(GTEST_DEV_EMAIL_)</span></div><div class="line"><a name="l00520"></a><span class="lineno"> 520</span> </div><div class="line"><a name="l00521"></a><span class="lineno"> 521</span> <span class="preprocessor">#if !defined(GTEST_INIT_GOOGLE_TEST_NAME_)</span></div><div class="line"><a name="l00522"></a><span class="lineno"><a class="line" href="gtest_8h.html#aa5e27ad4f88278501ef71bd9ddbb44c6"> 522</a></span> <span class="preprocessor"># define GTEST_INIT_GOOGLE_TEST_NAME_ "testing::InitGoogleTest"</span></div><div class="line"><a name="l00523"></a><span class="lineno"> 523</span> <span class="preprocessor">#endif // !defined(GTEST_INIT_GOOGLE_TEST_NAME_)</span></div><div class="line"><a name="l00524"></a><span class="lineno"> 524</span> </div><div class="line"><a name="l00525"></a><span class="lineno"> 525</span> <span class="comment">// Determines the version of gcc that is used to compile this.</span></div><div class="line"><a name="l00526"></a><span class="lineno"> 526</span> <span class="preprocessor">#ifdef __GNUC__</span></div><div class="line"><a name="l00527"></a><span class="lineno"> 527</span> <span class="comment">// 40302 means version 4.3.2.</span></div><div class="line"><a name="l00528"></a><span class="lineno"> 528</span> <span class="preprocessor"># define GTEST_GCC_VER_ \</span></div><div class="line"><a name="l00529"></a><span class="lineno"> 529</span> <span class="preprocessor"> (__GNUC__*10000 + __GNUC_MINOR__*100 + __GNUC_PATCHLEVEL__)</span></div><div class="line"><a name="l00530"></a><span class="lineno"> 530</span> <span class="preprocessor">#endif // __GNUC__</span></div><div class="line"><a name="l00531"></a><span class="lineno"> 531</span> </div><div class="line"><a name="l00532"></a><span class="lineno"> 532</span> <span class="comment">// Macros for disabling Microsoft Visual C++ warnings.</span></div><div class="line"><a name="l00533"></a><span class="lineno"> 533</span> <span class="comment">//</span></div><div class="line"><a name="l00534"></a><span class="lineno"> 534</span> <span class="comment">// GTEST_DISABLE_MSC_WARNINGS_PUSH_(4800 4385)</span></div><div class="line"><a name="l00535"></a><span class="lineno"> 535</span> <span class="comment">// /* code that triggers warnings C4800 and C4385 */</span></div><div class="line"><a name="l00536"></a><span class="lineno"> 536</span> <span class="comment">// GTEST_DISABLE_MSC_WARNINGS_POP_()</span></div><div class="line"><a name="l00537"></a><span class="lineno"> 537</span> <span class="preprocessor">#if defined(_MSC_VER)</span></div><div class="line"><a name="l00538"></a><span class="lineno"> 538</span> <span class="preprocessor"># define GTEST_DISABLE_MSC_WARNINGS_PUSH_(warnings) \</span></div><div class="line"><a name="l00539"></a><span class="lineno"> 539</span> <span class="preprocessor"> __pragma(warning(push)) \</span></div><div class="line"><a name="l00540"></a><span class="lineno"> 540</span> <span class="preprocessor"> __pragma(warning(disable: warnings))</span></div><div class="line"><a name="l00541"></a><span class="lineno"> 541</span> <span class="preprocessor"># define GTEST_DISABLE_MSC_WARNINGS_POP_() \</span></div><div class="line"><a name="l00542"></a><span class="lineno"> 542</span> <span class="preprocessor"> __pragma(warning(pop))</span></div><div class="line"><a name="l00543"></a><span class="lineno"> 543</span> <span class="preprocessor">#else</span></div><div class="line"><a name="l00544"></a><span class="lineno"> 544</span> <span class="comment">// Not all compilers are MSVC</span></div><div class="line"><a name="l00545"></a><span class="lineno"><a class="line" href="gtest_8h.html#a86994cc68e844d8b82089c70408dfc61"> 545</a></span> <span class="preprocessor"># define GTEST_DISABLE_MSC_WARNINGS_PUSH_(warnings)</span></div><div class="line"><a name="l00546"></a><span class="lineno"><a class="line" href="gtest_8h.html#aebf8277c9069c1e124f9a5bbe2948061"> 546</a></span> <span class="preprocessor"># define GTEST_DISABLE_MSC_WARNINGS_POP_()</span></div><div class="line"><a name="l00547"></a><span class="lineno"> 547</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00548"></a><span class="lineno"> 548</span> </div><div class="line"><a name="l00549"></a><span class="lineno"> 549</span> <span class="comment">// Clang on Windows does not understand MSVC's pragma warning.</span></div><div class="line"><a name="l00550"></a><span class="lineno"> 550</span> <span class="comment">// We need clang-specific way to disable function deprecation warning.</span></div><div class="line"><a name="l00551"></a><span class="lineno"> 551</span> <span class="preprocessor">#ifdef __clang__</span></div><div class="line"><a name="l00552"></a><span class="lineno"> 552</span> <span class="preprocessor"># define GTEST_DISABLE_MSC_DEPRECATED_PUSH_() \</span></div><div class="line"><a name="l00553"></a><span class="lineno"> 553</span> <span class="preprocessor"> _Pragma("clang diagnostic push") \</span></div><div class="line"><a name="l00554"></a><span class="lineno"> 554</span> <span class="preprocessor"> _Pragma("clang diagnostic ignored \"-Wdeprecated-declarations\"") \</span></div><div class="line"><a name="l00555"></a><span class="lineno"> 555</span> <span class="preprocessor"> _Pragma("clang diagnostic ignored \"-Wdeprecated-implementations\"")</span></div><div class="line"><a name="l00556"></a><span class="lineno"> 556</span> <span class="preprocessor">#define GTEST_DISABLE_MSC_DEPRECATED_POP_() \</span></div><div class="line"><a name="l00557"></a><span class="lineno"> 557</span> <span class="preprocessor"> _Pragma("clang diagnostic pop")</span></div><div class="line"><a name="l00558"></a><span class="lineno"> 558</span> <span class="preprocessor">#else</span></div><div class="line"><a name="l00559"></a><span class="lineno"><a class="line" href="gtest_8h.html#a5b130138db254deaf29dbe3dffa1a2a8"> 559</a></span> <span class="preprocessor"># define GTEST_DISABLE_MSC_DEPRECATED_PUSH_() \</span></div><div class="line"><a name="l00560"></a><span class="lineno"> 560</span> <span class="preprocessor"> GTEST_DISABLE_MSC_WARNINGS_PUSH_(4996)</span></div><div class="line"><a name="l00561"></a><span class="lineno"><a class="line" href="gtest_8h.html#aa0dc86dc9837f1610e91da65458f53b3"> 561</a></span> <span class="preprocessor"># define GTEST_DISABLE_MSC_DEPRECATED_POP_() \</span></div><div class="line"><a name="l00562"></a><span class="lineno"> 562</span> <span class="preprocessor"> GTEST_DISABLE_MSC_WARNINGS_POP_()</span></div><div class="line"><a name="l00563"></a><span class="lineno"> 563</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00564"></a><span class="lineno"> 564</span> </div><div class="line"><a name="l00565"></a><span class="lineno"> 565</span> <span class="comment">// Brings in definitions for functions used in the testing::internal::posix</span></div><div class="line"><a name="l00566"></a><span class="lineno"> 566</span> <span class="comment">// namespace (read, write, close, chdir, isatty, stat). We do not currently</span></div><div class="line"><a name="l00567"></a><span class="lineno"> 567</span> <span class="comment">// use them on Windows Mobile.</span></div><div class="line"><a name="l00568"></a><span class="lineno"> 568</span> <span class="preprocessor">#if GTEST_OS_WINDOWS</span></div><div class="line"><a name="l00569"></a><span class="lineno"> 569</span> <span class="preprocessor"># if !GTEST_OS_WINDOWS_MOBILE</span></div><div class="line"><a name="l00570"></a><span class="lineno"> 570</span> <span class="preprocessor"># include <direct.h></span></div><div class="line"><a name="l00571"></a><span class="lineno"> 571</span> <span class="preprocessor"># include <io.h></span></div><div class="line"><a name="l00572"></a><span class="lineno"> 572</span> <span class="preprocessor"># endif</span></div><div class="line"><a name="l00573"></a><span class="lineno"> 573</span> <span class="comment">// In order to avoid having to include <windows.h>, use forward declaration</span></div><div class="line"><a name="l00574"></a><span class="lineno"> 574</span> <span class="preprocessor">#if GTEST_OS_WINDOWS_MINGW && !defined(__MINGW64_VERSION_MAJOR)</span></div><div class="line"><a name="l00575"></a><span class="lineno"> 575</span> <span class="comment">// MinGW defined _CRITICAL_SECTION and _RTL_CRITICAL_SECTION as two</span></div><div class="line"><a name="l00576"></a><span class="lineno"> 576</span> <span class="comment">// separate (equivalent) structs, instead of using typedef</span></div><div class="line"><a name="l00577"></a><span class="lineno"> 577</span> <span class="keyword">typedef</span> <span class="keyword">struct </span>_CRITICAL_SECTION GTEST_CRITICAL_SECTION;</div><div class="line"><a name="l00578"></a><span class="lineno"> 578</span> <span class="preprocessor">#else</span></div><div class="line"><a name="l00579"></a><span class="lineno"> 579</span> <span class="comment">// Assume CRITICAL_SECTION is a typedef of _RTL_CRITICAL_SECTION.</span></div><div class="line"><a name="l00580"></a><span class="lineno"> 580</span> <span class="comment">// This assumption is verified by</span></div><div class="line"><a name="l00581"></a><span class="lineno"> 581</span> <span class="comment">// WindowsTypesTest.CRITICAL_SECTIONIs_RTL_CRITICAL_SECTION.</span></div><div class="line"><a name="l00582"></a><span class="lineno"> 582</span> <span class="keyword">typedef</span> <span class="keyword">struct </span>_RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;</div><div class="line"><a name="l00583"></a><span class="lineno"> 583</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00584"></a><span class="lineno"> 584</span> <span class="preprocessor">#else</span></div><div class="line"><a name="l00585"></a><span class="lineno"> 585</span> <span class="comment">// This assumes that non-Windows OSes provide unistd.h. For OSes where this</span></div><div class="line"><a name="l00586"></a><span class="lineno"> 586</span> <span class="comment">// is not the case, we need to include headers that provide the functions</span></div><div class="line"><a name="l00587"></a><span class="lineno"> 587</span> <span class="comment">// mentioned above.</span></div><div class="line"><a name="l00588"></a><span class="lineno"> 588</span> <span class="preprocessor"># include <unistd.h></span></div><div class="line"><a name="l00589"></a><span class="lineno"> 589</span> <span class="preprocessor"># include <strings.h></span></div><div class="line"><a name="l00590"></a><span class="lineno"> 590</span> <span class="preprocessor">#endif // GTEST_OS_WINDOWS</span></div><div class="line"><a name="l00591"></a><span class="lineno"> 591</span> </div><div class="line"><a name="l00592"></a><span class="lineno"> 592</span> <span class="preprocessor">#if GTEST_OS_LINUX_ANDROID</span></div><div class="line"><a name="l00593"></a><span class="lineno"> 593</span> <span class="comment">// Used to define __ANDROID_API__ matching the target NDK API level.</span></div><div class="line"><a name="l00594"></a><span class="lineno"> 594</span> <span class="preprocessor"># include <android/api-level.h></span> <span class="comment">// NOLINT</span></div><div class="line"><a name="l00595"></a><span class="lineno"> 595</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00596"></a><span class="lineno"> 596</span> </div><div class="line"><a name="l00597"></a><span class="lineno"> 597</span> <span class="comment">// Defines this to true iff Google Test can use POSIX regular expressions.</span></div><div class="line"><a name="l00598"></a><span class="lineno"> 598</span> <span class="preprocessor">#ifndef GTEST_HAS_POSIX_RE</span></div><div class="line"><a name="l00599"></a><span class="lineno"> 599</span> <span class="preprocessor"># if GTEST_OS_LINUX_ANDROID</span></div><div class="line"><a name="l00600"></a><span class="lineno"> 600</span> <span class="comment">// On Android, <regex.h> is only available starting with Gingerbread.</span></div><div class="line"><a name="l00601"></a><span class="lineno"> 601</span> <span class="preprocessor"># define GTEST_HAS_POSIX_RE (__ANDROID_API__ >= 9)</span></div><div class="line"><a name="l00602"></a><span class="lineno"> 602</span> <span class="preprocessor"># else</span></div><div class="line"><a name="l00603"></a><span class="lineno"><a class="line" href="gtest_8h.html#af5c4295ea1d76f07f65934f659792431"> 603</a></span> <span class="preprocessor"># define GTEST_HAS_POSIX_RE (!GTEST_OS_WINDOWS)</span></div><div class="line"><a name="l00604"></a><span class="lineno"> 604</span> <span class="preprocessor"># endif</span></div><div class="line"><a name="l00605"></a><span class="lineno"> 605</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00606"></a><span class="lineno"> 606</span> </div><div class="line"><a name="l00607"></a><span class="lineno"> 607</span> <span class="preprocessor">#if GTEST_USES_PCRE</span></div><div class="line"><a name="l00608"></a><span class="lineno"> 608</span> <span class="comment">// The appropriate headers have already been included.</span></div><div class="line"><a name="l00609"></a><span class="lineno"> 609</span> </div><div class="line"><a name="l00610"></a><span class="lineno"> 610</span> <span class="preprocessor">#elif GTEST_HAS_POSIX_RE</span></div><div class="line"><a name="l00611"></a><span class="lineno"> 611</span> </div><div class="line"><a name="l00612"></a><span class="lineno"> 612</span> <span class="comment">// On some platforms, <regex.h> needs someone to define size_t, and</span></div><div class="line"><a name="l00613"></a><span class="lineno"> 613</span> <span class="comment">// won't compile otherwise. We can #include it here as we already</span></div><div class="line"><a name="l00614"></a><span class="lineno"> 614</span> <span class="comment">// included <stdlib.h>, which is guaranteed to define size_t through</span></div><div class="line"><a name="l00615"></a><span class="lineno"> 615</span> <span class="comment">// <stddef.h>.</span></div><div class="line"><a name="l00616"></a><span class="lineno"> 616</span> <span class="preprocessor"># include <regex.h></span> <span class="comment">// NOLINT</span></div><div class="line"><a name="l00617"></a><span class="lineno"> 617</span> </div><div class="line"><a name="l00618"></a><span class="lineno"><a class="line" href="gtest_8h.html#acecef794eeb09598cd47da764271cb18"> 618</a></span> <span class="preprocessor"># define GTEST_USES_POSIX_RE 1</span></div><div class="line"><a name="l00619"></a><span class="lineno"> 619</span> </div><div class="line"><a name="l00620"></a><span class="lineno"> 620</span> <span class="preprocessor">#elif GTEST_OS_WINDOWS</span></div><div class="line"><a name="l00621"></a><span class="lineno"> 621</span> </div><div class="line"><a name="l00622"></a><span class="lineno"> 622</span> <span class="comment">// <regex.h> is not available on Windows. Use our own simple regex</span></div><div class="line"><a name="l00623"></a><span class="lineno"> 623</span> <span class="comment">// implementation instead.</span></div><div class="line"><a name="l00624"></a><span class="lineno"> 624</span> <span class="preprocessor"># define GTEST_USES_SIMPLE_RE 1</span></div><div class="line"><a name="l00625"></a><span class="lineno"> 625</span> </div><div class="line"><a name="l00626"></a><span class="lineno"> 626</span> <span class="preprocessor">#else</span></div><div class="line"><a name="l00627"></a><span class="lineno"> 627</span> </div><div class="line"><a name="l00628"></a><span class="lineno"> 628</span> <span class="comment">// <regex.h> may not be available on this platform. Use our own</span></div><div class="line"><a name="l00629"></a><span class="lineno"> 629</span> <span class="comment">// simple regex implementation instead.</span></div><div class="line"><a name="l00630"></a><span class="lineno"> 630</span> <span class="preprocessor"># define GTEST_USES_SIMPLE_RE 1</span></div><div class="line"><a name="l00631"></a><span class="lineno"> 631</span> </div><div class="line"><a name="l00632"></a><span class="lineno"> 632</span> <span class="preprocessor">#endif // GTEST_USES_PCRE</span></div><div class="line"><a name="l00633"></a><span class="lineno"> 633</span> </div><div class="line"><a name="l00634"></a><span class="lineno"> 634</span> <span class="preprocessor">#ifndef GTEST_HAS_EXCEPTIONS</span></div><div class="line"><a name="l00635"></a><span class="lineno"> 635</span> <span class="comment">// The user didn't tell us whether exceptions are enabled, so we need</span></div><div class="line"><a name="l00636"></a><span class="lineno"> 636</span> <span class="comment">// to figure it out.</span></div><div class="line"><a name="l00637"></a><span class="lineno"> 637</span> <span class="preprocessor"># if defined(_MSC_VER) && defined(_CPPUNWIND)</span></div><div class="line"><a name="l00638"></a><span class="lineno"> 638</span> <span class="comment">// MSVC defines _CPPUNWIND to 1 iff exceptions are enabled.</span></div><div class="line"><a name="l00639"></a><span class="lineno"> 639</span> <span class="preprocessor"># define GTEST_HAS_EXCEPTIONS 1</span></div><div class="line"><a name="l00640"></a><span class="lineno"> 640</span> <span class="preprocessor"># elif defined(__BORLANDC__)</span></div><div class="line"><a name="l00641"></a><span class="lineno"> 641</span> <span class="comment">// C++Builder's implementation of the STL uses the _HAS_EXCEPTIONS</span></div><div class="line"><a name="l00642"></a><span class="lineno"> 642</span> <span class="comment">// macro to enable exceptions, so we'll do the same.</span></div><div class="line"><a name="l00643"></a><span class="lineno"> 643</span> <span class="comment">// Assumes that exceptions are enabled by default.</span></div><div class="line"><a name="l00644"></a><span class="lineno"> 644</span> <span class="preprocessor"># ifndef _HAS_EXCEPTIONS</span></div><div class="line"><a name="l00645"></a><span class="lineno"> 645</span> <span class="preprocessor"># define _HAS_EXCEPTIONS 1</span></div><div class="line"><a name="l00646"></a><span class="lineno"> 646</span> <span class="preprocessor"># endif // _HAS_EXCEPTIONS</span></div><div class="line"><a name="l00647"></a><span class="lineno"> 647</span> <span class="preprocessor"># define GTEST_HAS_EXCEPTIONS _HAS_EXCEPTIONS</span></div><div class="line"><a name="l00648"></a><span class="lineno"> 648</span> <span class="preprocessor"># elif defined(__clang__)</span></div><div class="line"><a name="l00649"></a><span class="lineno"> 649</span> <span class="comment">// clang defines __EXCEPTIONS iff exceptions are enabled before clang 220714,</span></div><div class="line"><a name="l00650"></a><span class="lineno"> 650</span> <span class="comment">// but iff cleanups are enabled after that. In Obj-C++ files, there can be</span></div><div class="line"><a name="l00651"></a><span class="lineno"> 651</span> <span class="comment">// cleanups for ObjC exceptions which also need cleanups, even if C++ exceptions</span></div><div class="line"><a name="l00652"></a><span class="lineno"> 652</span> <span class="comment">// are disabled. clang has __has_feature(cxx_exceptions) which checks for C++</span></div><div class="line"><a name="l00653"></a><span class="lineno"> 653</span> <span class="comment">// exceptions starting at clang r206352, but which checked for cleanups prior to</span></div><div class="line"><a name="l00654"></a><span class="lineno"> 654</span> <span class="comment">// that. To reliably check for C++ exception availability with clang, check for</span></div><div class="line"><a name="l00655"></a><span class="lineno"> 655</span> <span class="comment">// __EXCEPTIONS && __has_feature(cxx_exceptions).</span></div><div class="line"><a name="l00656"></a><span class="lineno"> 656</span> <span class="preprocessor"># define GTEST_HAS_EXCEPTIONS (__EXCEPTIONS && __has_feature(cxx_exceptions))</span></div><div class="line"><a name="l00657"></a><span class="lineno"> 657</span> <span class="preprocessor"># elif defined(__GNUC__) && __EXCEPTIONS</span></div><div class="line"><a name="l00658"></a><span class="lineno"> 658</span> <span class="comment">// gcc defines __EXCEPTIONS to 1 iff exceptions are enabled.</span></div><div class="line"><a name="l00659"></a><span class="lineno"> 659</span> <span class="preprocessor"># define GTEST_HAS_EXCEPTIONS 1</span></div><div class="line"><a name="l00660"></a><span class="lineno"> 660</span> <span class="preprocessor"># elif defined(__SUNPRO_CC)</span></div><div class="line"><a name="l00661"></a><span class="lineno"> 661</span> <span class="comment">// Sun Pro CC supports exceptions. However, there is no compile-time way of</span></div><div class="line"><a name="l00662"></a><span class="lineno"> 662</span> <span class="comment">// detecting whether they are enabled or not. Therefore, we assume that</span></div><div class="line"><a name="l00663"></a><span class="lineno"> 663</span> <span class="comment">// they are enabled unless the user tells us otherwise.</span></div><div class="line"><a name="l00664"></a><span class="lineno"> 664</span> <span class="preprocessor"># define GTEST_HAS_EXCEPTIONS 1</span></div><div class="line"><a name="l00665"></a><span class="lineno"> 665</span> <span class="preprocessor"># elif defined(__IBMCPP__) && __EXCEPTIONS</span></div><div class="line"><a name="l00666"></a><span class="lineno"> 666</span> <span class="comment">// xlC defines __EXCEPTIONS to 1 iff exceptions are enabled.</span></div><div class="line"><a name="l00667"></a><span class="lineno"> 667</span> <span class="preprocessor"># define GTEST_HAS_EXCEPTIONS 1</span></div><div class="line"><a name="l00668"></a><span class="lineno"> 668</span> <span class="preprocessor"># elif defined(__HP_aCC)</span></div><div class="line"><a name="l00669"></a><span class="lineno"> 669</span> <span class="comment">// Exception handling is in effect by default in HP aCC compiler. It has to</span></div><div class="line"><a name="l00670"></a><span class="lineno"> 670</span> <span class="comment">// be turned of by +noeh compiler option if desired.</span></div><div class="line"><a name="l00671"></a><span class="lineno"> 671</span> <span class="preprocessor"># define GTEST_HAS_EXCEPTIONS 1</span></div><div class="line"><a name="l00672"></a><span class="lineno"> 672</span> <span class="preprocessor"># else</span></div><div class="line"><a name="l00673"></a><span class="lineno"> 673</span> <span class="comment">// For other compilers, we assume exceptions are disabled to be</span></div><div class="line"><a name="l00674"></a><span class="lineno"> 674</span> <span class="comment">// conservative.</span></div><div class="line"><a name="l00675"></a><span class="lineno"><a class="line" href="gtest_8h.html#aedcf220690e6589d0fc2bd3db768ea66"> 675</a></span> <span class="preprocessor"># define GTEST_HAS_EXCEPTIONS 0</span></div><div class="line"><a name="l00676"></a><span class="lineno"> 676</span> <span class="preprocessor"># endif // defined(_MSC_VER) || defined(__BORLANDC__)</span></div><div class="line"><a name="l00677"></a><span class="lineno"> 677</span> <span class="preprocessor">#endif // GTEST_HAS_EXCEPTIONS</span></div><div class="line"><a name="l00678"></a><span class="lineno"> 678</span> </div><div class="line"><a name="l00679"></a><span class="lineno"> 679</span> <span class="preprocessor">#if !defined(GTEST_HAS_STD_STRING)</span></div><div class="line"><a name="l00680"></a><span class="lineno"> 680</span> <span class="comment">// Even though we don't use this macro any longer, we keep it in case</span></div><div class="line"><a name="l00681"></a><span class="lineno"> 681</span> <span class="comment">// some clients still depend on it.</span></div><div class="line"><a name="l00682"></a><span class="lineno"><a class="line" href="gtest_8h.html#adba1121430c11cee8ba0c74e8cf6aa40"> 682</a></span> <span class="preprocessor"># define GTEST_HAS_STD_STRING 1</span></div><div class="line"><a name="l00683"></a><span class="lineno"> 683</span> <span class="preprocessor">#elif !GTEST_HAS_STD_STRING</span></div><div class="line"><a name="l00684"></a><span class="lineno"> 684</span> <span class="comment">// The user told us that ::std::string isn't available.</span></div><div class="line"><a name="l00685"></a><span class="lineno"> 685</span> <span class="preprocessor"># error "::std::string isn't available."</span></div><div class="line"><a name="l00686"></a><span class="lineno"> 686</span> <span class="preprocessor">#endif // !defined(GTEST_HAS_STD_STRING)</span></div><div class="line"><a name="l00687"></a><span class="lineno"> 687</span> </div><div class="line"><a name="l00688"></a><span class="lineno"> 688</span> <span class="preprocessor">#ifndef GTEST_HAS_GLOBAL_STRING</span></div><div class="line"><a name="l00689"></a><span class="lineno"><a class="line" href="gtest_8h.html#a6ab57c4a17233dd4ed30c2926bb99cc5"> 689</a></span> <span class="preprocessor"># define GTEST_HAS_GLOBAL_STRING 0</span></div><div class="line"><a name="l00690"></a><span class="lineno"> 690</span> <span class="preprocessor">#endif // GTEST_HAS_GLOBAL_STRING</span></div><div class="line"><a name="l00691"></a><span class="lineno"> 691</span> </div><div class="line"><a name="l00692"></a><span class="lineno"> 692</span> <span class="preprocessor">#ifndef GTEST_HAS_STD_WSTRING</span></div><div class="line"><a name="l00693"></a><span class="lineno"> 693</span> <span class="comment">// The user didn't tell us whether ::std::wstring is available, so we need</span></div><div class="line"><a name="l00694"></a><span class="lineno"> 694</span> <span class="comment">// to figure it out.</span></div><div class="line"><a name="l00695"></a><span class="lineno"> 695</span> <span class="comment">// Cygwin 1.7 and below doesn't support ::std::wstring.</span></div><div class="line"><a name="l00696"></a><span class="lineno"> 696</span> <span class="comment">// Solaris' libc++ doesn't support it either. Android has</span></div><div class="line"><a name="l00697"></a><span class="lineno"> 697</span> <span class="comment">// no support for it at least as recent as Froyo (2.2).</span></div><div class="line"><a name="l00698"></a><span class="lineno"><a class="line" href="gtest_8h.html#a6e087748d8bbd2ca57c487b6ad268670"> 698</a></span> <span class="preprocessor"># define GTEST_HAS_STD_WSTRING \</span></div><div class="line"><a name="l00699"></a><span class="lineno"> 699</span> <span class="preprocessor"> (!(GTEST_OS_LINUX_ANDROID || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS))</span></div><div class="line"><a name="l00700"></a><span class="lineno"> 700</span> </div><div class="line"><a name="l00701"></a><span class="lineno"> 701</span> <span class="preprocessor">#endif // GTEST_HAS_STD_WSTRING</span></div><div class="line"><a name="l00702"></a><span class="lineno"> 702</span> </div><div class="line"><a name="l00703"></a><span class="lineno"> 703</span> <span class="preprocessor">#ifndef GTEST_HAS_GLOBAL_WSTRING</span></div><div class="line"><a name="l00704"></a><span class="lineno"> 704</span> <span class="comment">// The user didn't tell us whether ::wstring is available, so we need</span></div><div class="line"><a name="l00705"></a><span class="lineno"> 705</span> <span class="comment">// to figure it out.</span></div><div class="line"><a name="l00706"></a><span class="lineno"><a class="line" href="gtest_8h.html#afca9ecaf5846561187a15b75013aa85b"> 706</a></span> <span class="preprocessor"># define GTEST_HAS_GLOBAL_WSTRING \</span></div><div class="line"><a name="l00707"></a><span class="lineno"> 707</span> <span class="preprocessor"> (GTEST_HAS_STD_WSTRING && GTEST_HAS_GLOBAL_STRING)</span></div><div class="line"><a name="l00708"></a><span class="lineno"> 708</span> <span class="preprocessor">#endif // GTEST_HAS_GLOBAL_WSTRING</span></div><div class="line"><a name="l00709"></a><span class="lineno"> 709</span> </div><div class="line"><a name="l00710"></a><span class="lineno"> 710</span> <span class="comment">// Determines whether RTTI is available.</span></div><div class="line"><a name="l00711"></a><span class="lineno"> 711</span> <span class="preprocessor">#ifndef GTEST_HAS_RTTI</span></div><div class="line"><a name="l00712"></a><span class="lineno"> 712</span> <span class="comment">// The user didn't tell us whether RTTI is enabled, so we need to</span></div><div class="line"><a name="l00713"></a><span class="lineno"> 713</span> <span class="comment">// figure it out.</span></div><div class="line"><a name="l00714"></a><span class="lineno"> 714</span> </div><div class="line"><a name="l00715"></a><span class="lineno"> 715</span> <span class="preprocessor"># ifdef _MSC_VER</span></div><div class="line"><a name="l00716"></a><span class="lineno"> 716</span> </div><div class="line"><a name="l00717"></a><span class="lineno"> 717</span> <span class="preprocessor"># ifdef _CPPRTTI // MSVC defines this macro iff RTTI is enabled.</span></div><div class="line"><a name="l00718"></a><span class="lineno"> 718</span> <span class="preprocessor"># define GTEST_HAS_RTTI 1</span></div><div class="line"><a name="l00719"></a><span class="lineno"> 719</span> <span class="preprocessor"># else</span></div><div class="line"><a name="l00720"></a><span class="lineno"> 720</span> <span class="preprocessor"># define GTEST_HAS_RTTI 0</span></div><div class="line"><a name="l00721"></a><span class="lineno"> 721</span> <span class="preprocessor"># endif</span></div><div class="line"><a name="l00722"></a><span class="lineno"> 722</span> </div><div class="line"><a name="l00723"></a><span class="lineno"> 723</span> <span class="comment">// Starting with version 4.3.2, gcc defines __GXX_RTTI iff RTTI is enabled.</span></div><div class="line"><a name="l00724"></a><span class="lineno"> 724</span> <span class="preprocessor"># elif defined(__GNUC__)</span></div><div class="line"><a name="l00725"></a><span class="lineno"> 725</span> </div><div class="line"><a name="l00726"></a><span class="lineno"> 726</span> <span class="preprocessor"># ifdef __GXX_RTTI</span></div><div class="line"><a name="l00727"></a><span class="lineno"> 727</span> <span class="comment">// When building against STLport with the Android NDK and with</span></div><div class="line"><a name="l00728"></a><span class="lineno"> 728</span> <span class="comment">// -frtti -fno-exceptions, the build fails at link time with undefined</span></div><div class="line"><a name="l00729"></a><span class="lineno"> 729</span> <span class="comment">// references to __cxa_bad_typeid. Note sure if STL or toolchain bug,</span></div><div class="line"><a name="l00730"></a><span class="lineno"> 730</span> <span class="comment">// so disable RTTI when detected.</span></div><div class="line"><a name="l00731"></a><span class="lineno"> 731</span> <span class="preprocessor"># if GTEST_OS_LINUX_ANDROID && defined(_STLPORT_MAJOR) && \</span></div><div class="line"><a name="l00732"></a><span class="lineno"> 732</span> <span class="preprocessor"> !defined(__EXCEPTIONS)</span></div><div class="line"><a name="l00733"></a><span class="lineno"> 733</span> <span class="preprocessor"># define GTEST_HAS_RTTI 0</span></div><div class="line"><a name="l00734"></a><span class="lineno"> 734</span> <span class="preprocessor"># else</span></div><div class="line"><a name="l00735"></a><span class="lineno"> 735</span> <span class="preprocessor"># define GTEST_HAS_RTTI 1</span></div><div class="line"><a name="l00736"></a><span class="lineno"> 736</span> <span class="preprocessor"># endif // GTEST_OS_LINUX_ANDROID && __STLPORT_MAJOR && !__EXCEPTIONS</span></div><div class="line"><a name="l00737"></a><span class="lineno"> 737</span> <span class="preprocessor"># else</span></div><div class="line"><a name="l00738"></a><span class="lineno"> 738</span> <span class="preprocessor"># define GTEST_HAS_RTTI 0</span></div><div class="line"><a name="l00739"></a><span class="lineno"> 739</span> <span class="preprocessor"># endif // __GXX_RTTI</span></div><div class="line"><a name="l00740"></a><span class="lineno"> 740</span> </div><div class="line"><a name="l00741"></a><span class="lineno"> 741</span> <span class="comment">// Clang defines __GXX_RTTI starting with version 3.0, but its manual recommends</span></div><div class="line"><a name="l00742"></a><span class="lineno"> 742</span> <span class="comment">// using has_feature instead. has_feature(cxx_rtti) is supported since 2.7, the</span></div><div class="line"><a name="l00743"></a><span class="lineno"> 743</span> <span class="comment">// first version with C++ support.</span></div><div class="line"><a name="l00744"></a><span class="lineno"> 744</span> <span class="preprocessor"># elif defined(__clang__)</span></div><div class="line"><a name="l00745"></a><span class="lineno"> 745</span> </div><div class="line"><a name="l00746"></a><span class="lineno"> 746</span> <span class="preprocessor"># define GTEST_HAS_RTTI __has_feature(cxx_rtti)</span></div><div class="line"><a name="l00747"></a><span class="lineno"> 747</span> </div><div class="line"><a name="l00748"></a><span class="lineno"> 748</span> <span class="comment">// Starting with version 9.0 IBM Visual Age defines __RTTI_ALL__ to 1 if</span></div><div class="line"><a name="l00749"></a><span class="lineno"> 749</span> <span class="comment">// both the typeid and dynamic_cast features are present.</span></div><div class="line"><a name="l00750"></a><span class="lineno"> 750</span> <span class="preprocessor"># elif defined(__IBMCPP__) && (__IBMCPP__ >= 900)</span></div><div class="line"><a name="l00751"></a><span class="lineno"> 751</span> </div><div class="line"><a name="l00752"></a><span class="lineno"> 752</span> <span class="preprocessor"># ifdef __RTTI_ALL__</span></div><div class="line"><a name="l00753"></a><span class="lineno"> 753</span> <span class="preprocessor"># define GTEST_HAS_RTTI 1</span></div><div class="line"><a name="l00754"></a><span class="lineno"> 754</span> <span class="preprocessor"># else</span></div><div class="line"><a name="l00755"></a><span class="lineno"> 755</span> <span class="preprocessor"># define GTEST_HAS_RTTI 0</span></div><div class="line"><a name="l00756"></a><span class="lineno"> 756</span> <span class="preprocessor"># endif</span></div><div class="line"><a name="l00757"></a><span class="lineno"> 757</span> </div><div class="line"><a name="l00758"></a><span class="lineno"> 758</span> <span class="preprocessor"># else</span></div><div class="line"><a name="l00759"></a><span class="lineno"> 759</span> </div><div class="line"><a name="l00760"></a><span class="lineno"> 760</span> <span class="comment">// For all other compilers, we assume RTTI is enabled.</span></div><div class="line"><a name="l00761"></a><span class="lineno"><a class="line" href="gtest_8h.html#a9ba781217167f905bff2f1c410a97930"> 761</a></span> <span class="preprocessor"># define GTEST_HAS_RTTI 1</span></div><div class="line"><a name="l00762"></a><span class="lineno"> 762</span> </div><div class="line"><a name="l00763"></a><span class="lineno"> 763</span> <span class="preprocessor"># endif // _MSC_VER</span></div><div class="line"><a name="l00764"></a><span class="lineno"> 764</span> </div><div class="line"><a name="l00765"></a><span class="lineno"> 765</span> <span class="preprocessor">#endif // GTEST_HAS_RTTI</span></div><div class="line"><a name="l00766"></a><span class="lineno"> 766</span> </div><div class="line"><a name="l00767"></a><span class="lineno"> 767</span> <span class="comment">// It's this header's responsibility to #include <typeinfo> when RTTI</span></div><div class="line"><a name="l00768"></a><span class="lineno"> 768</span> <span class="comment">// is enabled.</span></div><div class="line"><a name="l00769"></a><span class="lineno"> 769</span> <span class="preprocessor">#if GTEST_HAS_RTTI</span></div><div class="line"><a name="l00770"></a><span class="lineno"> 770</span> <span class="preprocessor"># include <typeinfo></span></div><div class="line"><a name="l00771"></a><span class="lineno"> 771</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00772"></a><span class="lineno"> 772</span> </div><div class="line"><a name="l00773"></a><span class="lineno"> 773</span> <span class="comment">// Determines whether Google Test can use the pthreads library.</span></div><div class="line"><a name="l00774"></a><span class="lineno"> 774</span> <span class="preprocessor">#ifndef GTEST_HAS_PTHREAD</span></div><div class="line"><a name="l00775"></a><span class="lineno"> 775</span> <span class="comment">// The user didn't tell us explicitly, so we make reasonable assumptions about</span></div><div class="line"><a name="l00776"></a><span class="lineno"> 776</span> <span class="comment">// which platforms have pthreads support.</span></div><div class="line"><a name="l00777"></a><span class="lineno"> 777</span> <span class="comment">//</span></div><div class="line"><a name="l00778"></a><span class="lineno"> 778</span> <span class="comment">// To disable threading support in Google Test, add -DGTEST_HAS_PTHREAD=0</span></div><div class="line"><a name="l00779"></a><span class="lineno"> 779</span> <span class="comment">// to your compiler flags.</span></div><div class="line"><a name="l00780"></a><span class="lineno"><a class="line" href="gtest_8h.html#a3341397e1952de0b9cd88762d4d3ae4b"> 780</a></span> <span class="preprocessor">#define GTEST_HAS_PTHREAD \</span></div><div class="line"><a name="l00781"></a><span class="lineno"> 781</span> <span class="preprocessor"> (GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_HPUX || GTEST_OS_QNX || \</span></div><div class="line"><a name="l00782"></a><span class="lineno"> 782</span> <span class="preprocessor"> GTEST_OS_FREEBSD || GTEST_OS_NACL || GTEST_OS_NETBSD || GTEST_OS_FUCHSIA)</span></div><div class="line"><a name="l00783"></a><span class="lineno"> 783</span> <span class="preprocessor">#endif // GTEST_HAS_PTHREAD</span></div><div class="line"><a name="l00784"></a><span class="lineno"> 784</span> </div><div class="line"><a name="l00785"></a><span class="lineno"> 785</span> <span class="preprocessor">#if GTEST_HAS_PTHREAD</span></div><div class="line"><a name="l00786"></a><span class="lineno"> 786</span> <span class="comment">// gtest-port.h guarantees to #include <pthread.h> when GTEST_HAS_PTHREAD is</span></div><div class="line"><a name="l00787"></a><span class="lineno"> 787</span> <span class="comment">// true.</span></div><div class="line"><a name="l00788"></a><span class="lineno"> 788</span> <span class="preprocessor"># include <pthread.h></span> <span class="comment">// NOLINT</span></div><div class="line"><a name="l00789"></a><span class="lineno"> 789</span> </div><div class="line"><a name="l00790"></a><span class="lineno"> 790</span> <span class="comment">// For timespec and nanosleep, used below.</span></div><div class="line"><a name="l00791"></a><span class="lineno"> 791</span> <span class="preprocessor"># include <time.h></span> <span class="comment">// NOLINT</span></div><div class="line"><a name="l00792"></a><span class="lineno"> 792</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00793"></a><span class="lineno"> 793</span> </div><div class="line"><a name="l00794"></a><span class="lineno"> 794</span> <span class="comment">// Determines whether clone(2) is supported.</span></div><div class="line"><a name="l00795"></a><span class="lineno"> 795</span> <span class="comment">// Usually it will only be available on Linux, excluding</span></div><div class="line"><a name="l00796"></a><span class="lineno"> 796</span> <span class="comment">// Linux on the Itanium architecture.</span></div><div class="line"><a name="l00797"></a><span class="lineno"> 797</span> <span class="comment">// Also see http://linux.die.net/man/2/clone.</span></div><div class="line"><a name="l00798"></a><span class="lineno"> 798</span> <span class="preprocessor">#ifndef GTEST_HAS_CLONE</span></div><div class="line"><a name="l00799"></a><span class="lineno"> 799</span> <span class="comment">// The user didn't tell us, so we need to figure it out.</span></div><div class="line"><a name="l00800"></a><span class="lineno"> 800</span> </div><div class="line"><a name="l00801"></a><span class="lineno"> 801</span> <span class="preprocessor"># if GTEST_OS_LINUX && !defined(__ia64__)</span></div><div class="line"><a name="l00802"></a><span class="lineno"> 802</span> <span class="preprocessor"># if GTEST_OS_LINUX_ANDROID</span></div><div class="line"><a name="l00803"></a><span class="lineno"> 803</span> <span class="comment">// On Android, clone() became available at different API levels for each 32-bit</span></div><div class="line"><a name="l00804"></a><span class="lineno"> 804</span> <span class="comment">// architecture.</span></div><div class="line"><a name="l00805"></a><span class="lineno"> 805</span> <span class="preprocessor"># if defined(__LP64__) || \</span></div><div class="line"><a name="l00806"></a><span class="lineno"> 806</span> <span class="preprocessor"> (defined(__arm__) && __ANDROID_API__ >= 9) || \</span></div><div class="line"><a name="l00807"></a><span class="lineno"> 807</span> <span class="preprocessor"> (defined(__mips__) && __ANDROID_API__ >= 12) || \</span></div><div class="line"><a name="l00808"></a><span class="lineno"> 808</span> <span class="preprocessor"> (defined(__i386__) && __ANDROID_API__ >= 17)</span></div><div class="line"><a name="l00809"></a><span class="lineno"> 809</span> <span class="preprocessor"># define GTEST_HAS_CLONE 1</span></div><div class="line"><a name="l00810"></a><span class="lineno"> 810</span> <span class="preprocessor"># else</span></div><div class="line"><a name="l00811"></a><span class="lineno"> 811</span> <span class="preprocessor"># define GTEST_HAS_CLONE 0</span></div><div class="line"><a name="l00812"></a><span class="lineno"> 812</span> <span class="preprocessor"># endif</span></div><div class="line"><a name="l00813"></a><span class="lineno"> 813</span> <span class="preprocessor"># else</span></div><div class="line"><a name="l00814"></a><span class="lineno"> 814</span> <span class="preprocessor"># define GTEST_HAS_CLONE 1</span></div><div class="line"><a name="l00815"></a><span class="lineno"> 815</span> <span class="preprocessor"># endif</span></div><div class="line"><a name="l00816"></a><span class="lineno"> 816</span> <span class="preprocessor"># else</span></div><div class="line"><a name="l00817"></a><span class="lineno"><a class="line" href="gtest_8h.html#a40c075a7f969a694e59532356be59fd5"> 817</a></span> <span class="preprocessor"># define GTEST_HAS_CLONE 0</span></div><div class="line"><a name="l00818"></a><span class="lineno"> 818</span> <span class="preprocessor"># endif // GTEST_OS_LINUX && !defined(__ia64__)</span></div><div class="line"><a name="l00819"></a><span class="lineno"> 819</span> </div><div class="line"><a name="l00820"></a><span class="lineno"> 820</span> <span class="preprocessor">#endif // GTEST_HAS_CLONE</span></div><div class="line"><a name="l00821"></a><span class="lineno"> 821</span> </div><div class="line"><a name="l00822"></a><span class="lineno"> 822</span> <span class="comment">// Determines whether to support stream redirection. This is used to test</span></div><div class="line"><a name="l00823"></a><span class="lineno"> 823</span> <span class="comment">// output correctness and to implement death tests.</span></div><div class="line"><a name="l00824"></a><span class="lineno"> 824</span> <span class="preprocessor">#ifndef GTEST_HAS_STREAM_REDIRECTION</span></div><div class="line"><a name="l00825"></a><span class="lineno"> 825</span> <span class="comment">// By default, we assume that stream redirection is supported on all</span></div><div class="line"><a name="l00826"></a><span class="lineno"> 826</span> <span class="comment">// platforms except known mobile ones.</span></div><div class="line"><a name="l00827"></a><span class="lineno"> 827</span> <span class="preprocessor"># if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_WINDOWS_PHONE || GTEST_OS_WINDOWS_RT</span></div><div class="line"><a name="l00828"></a><span class="lineno"> 828</span> <span class="preprocessor"># define GTEST_HAS_STREAM_REDIRECTION 0</span></div><div class="line"><a name="l00829"></a><span class="lineno"> 829</span> <span class="preprocessor"># else</span></div><div class="line"><a name="l00830"></a><span class="lineno"><a class="line" href="gtest_8h.html#add695166eb7b691f93777525d5881062"> 830</a></span> <span class="preprocessor"># define GTEST_HAS_STREAM_REDIRECTION 1</span></div><div class="line"><a name="l00831"></a><span class="lineno"> 831</span> <span class="preprocessor"># endif // !GTEST_OS_WINDOWS_MOBILE</span></div><div class="line"><a name="l00832"></a><span class="lineno"> 832</span> <span class="preprocessor">#endif // GTEST_HAS_STREAM_REDIRECTION</span></div><div class="line"><a name="l00833"></a><span class="lineno"> 833</span> </div><div class="line"><a name="l00834"></a><span class="lineno"> 834</span> <span class="comment">// Determines whether to support death tests.</span></div><div class="line"><a name="l00835"></a><span class="lineno"> 835</span> <span class="comment">// pops up a dialog window that cannot be suppressed programmatically.</span></div><div class="line"><a name="l00836"></a><span class="lineno"> 836</span> <span class="preprocessor">#if (GTEST_OS_LINUX || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS || \</span></div><div class="line"><a name="l00837"></a><span class="lineno"> 837</span> <span class="preprocessor"> (GTEST_OS_MAC && !GTEST_OS_IOS) || \</span></div><div class="line"><a name="l00838"></a><span class="lineno"> 838</span> <span class="preprocessor"> (GTEST_OS_WINDOWS_DESKTOP && _MSC_VER) || \</span></div><div class="line"><a name="l00839"></a><span class="lineno"> 839</span> <span class="preprocessor"> GTEST_OS_WINDOWS_MINGW || GTEST_OS_AIX || GTEST_OS_HPUX || \</span></div><div class="line"><a name="l00840"></a><span class="lineno"> 840</span> <span class="preprocessor"> GTEST_OS_OPENBSD || GTEST_OS_QNX || GTEST_OS_FREEBSD || \</span></div><div class="line"><a name="l00841"></a><span class="lineno"> 841</span> <span class="preprocessor"> GTEST_OS_NETBSD || GTEST_OS_FUCHSIA)</span></div><div class="line"><a name="l00842"></a><span class="lineno"> 842</span> <span class="preprocessor"># define GTEST_HAS_DEATH_TEST 1</span></div><div class="line"><a name="l00843"></a><span class="lineno"> 843</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00844"></a><span class="lineno"> 844</span> </div><div class="line"><a name="l00845"></a><span class="lineno"> 845</span> <span class="comment">// Determines whether to support type-driven tests.</span></div><div class="line"><a name="l00846"></a><span class="lineno"> 846</span> </div><div class="line"><a name="l00847"></a><span class="lineno"> 847</span> <span class="comment">// Typed tests need <typeinfo> and variadic macros, which GCC, VC++ 8.0,</span></div><div class="line"><a name="l00848"></a><span class="lineno"> 848</span> <span class="comment">// Sun Pro CC, IBM Visual Age, and HP aCC support.</span></div><div class="line"><a name="l00849"></a><span class="lineno"> 849</span> <span class="preprocessor">#if defined(__GNUC__) || defined(_MSC_VER) || defined(__SUNPRO_CC) || \</span></div><div class="line"><a name="l00850"></a><span class="lineno"> 850</span> <span class="preprocessor"> defined(__IBMCPP__) || defined(__HP_aCC)</span></div><div class="line"><a name="l00851"></a><span class="lineno"> 851</span> <span class="preprocessor"># define GTEST_HAS_TYPED_TEST 1</span></div><div class="line"><a name="l00852"></a><span class="lineno"> 852</span> <span class="preprocessor"># define GTEST_HAS_TYPED_TEST_P 1</span></div><div class="line"><a name="l00853"></a><span class="lineno"> 853</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00854"></a><span class="lineno"> 854</span> </div><div class="line"><a name="l00855"></a><span class="lineno"> 855</span> <span class="comment">// Determines whether the system compiler uses UTF-16 for encoding wide strings.</span></div><div class="line"><a name="l00856"></a><span class="lineno"><a class="line" href="gtest_8h.html#a0e3904ca8d62334ab5f29c057dceb6a1"> 856</a></span> <span class="preprocessor">#define GTEST_WIDE_STRING_USES_UTF16_ \</span></div><div class="line"><a name="l00857"></a><span class="lineno"> 857</span> <span class="preprocessor"> (GTEST_OS_WINDOWS || GTEST_OS_CYGWIN || GTEST_OS_AIX || GTEST_OS_OS2)</span></div><div class="line"><a name="l00858"></a><span class="lineno"> 858</span> </div><div class="line"><a name="l00859"></a><span class="lineno"> 859</span> <span class="comment">// Determines whether test results can be streamed to a socket.</span></div><div class="line"><a name="l00860"></a><span class="lineno"> 860</span> <span class="preprocessor">#if GTEST_OS_LINUX</span></div><div class="line"><a name="l00861"></a><span class="lineno"> 861</span> <span class="preprocessor"># define GTEST_CAN_STREAM_RESULTS_ 1</span></div><div class="line"><a name="l00862"></a><span class="lineno"> 862</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00863"></a><span class="lineno"> 863</span> </div><div class="line"><a name="l00864"></a><span class="lineno"> 864</span> <span class="comment">// Defines some utility macros.</span></div><div class="line"><a name="l00865"></a><span class="lineno"> 865</span> </div><div class="line"><a name="l00866"></a><span class="lineno"> 866</span> <span class="comment">// The GNU compiler emits a warning if nested "if" statements are followed by</span></div><div class="line"><a name="l00867"></a><span class="lineno"> 867</span> <span class="comment">// an "else" statement and braces are not used to explicitly disambiguate the</span></div><div class="line"><a name="l00868"></a><span class="lineno"> 868</span> <span class="comment">// "else" binding. This leads to problems with code like:</span></div><div class="line"><a name="l00869"></a><span class="lineno"> 869</span> <span class="comment">//</span></div><div class="line"><a name="l00870"></a><span class="lineno"> 870</span> <span class="comment">// if (gate)</span></div><div class="line"><a name="l00871"></a><span class="lineno"> 871</span> <span class="comment">// ASSERT_*(condition) << "Some message";</span></div><div class="line"><a name="l00872"></a><span class="lineno"> 872</span> <span class="comment">//</span></div><div class="line"><a name="l00873"></a><span class="lineno"> 873</span> <span class="comment">// The "switch (0) case 0:" idiom is used to suppress this.</span></div><div class="line"><a name="l00874"></a><span class="lineno"> 874</span> <span class="preprocessor">#ifdef __INTEL_COMPILER</span></div><div class="line"><a name="l00875"></a><span class="lineno"> 875</span> <span class="preprocessor"># define GTEST_AMBIGUOUS_ELSE_BLOCKER_</span></div><div class="line"><a name="l00876"></a><span class="lineno"> 876</span> <span class="preprocessor">#else</span></div><div class="line"><a name="l00877"></a><span class="lineno"><a class="line" href="gtest_8h.html#a00b3684a621ce1422b55a0e7e8a6aecb"> 877</a></span> <span class="preprocessor"># define GTEST_AMBIGUOUS_ELSE_BLOCKER_ switch (0) case 0: default: // NOLINT</span></div><div class="line"><a name="l00878"></a><span class="lineno"> 878</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00879"></a><span class="lineno"> 879</span> </div><div class="line"><a name="l00880"></a><span class="lineno"> 880</span> <span class="comment">// Use this annotation at the end of a struct/class definition to</span></div><div class="line"><a name="l00881"></a><span class="lineno"> 881</span> <span class="comment">// prevent the compiler from optimizing away instances that are never</span></div><div class="line"><a name="l00882"></a><span class="lineno"> 882</span> <span class="comment">// used. This is useful when all interesting logic happens inside the</span></div><div class="line"><a name="l00883"></a><span class="lineno"> 883</span> <span class="comment">// c'tor and / or d'tor. Example:</span></div><div class="line"><a name="l00884"></a><span class="lineno"> 884</span> <span class="comment">//</span></div><div class="line"><a name="l00885"></a><span class="lineno"> 885</span> <span class="comment">// struct Foo {</span></div><div class="line"><a name="l00886"></a><span class="lineno"> 886</span> <span class="comment">// Foo() { ... }</span></div><div class="line"><a name="l00887"></a><span class="lineno"> 887</span> <span class="comment">// } GTEST_ATTRIBUTE_UNUSED_;</span></div><div class="line"><a name="l00888"></a><span class="lineno"> 888</span> <span class="comment">//</span></div><div class="line"><a name="l00889"></a><span class="lineno"> 889</span> <span class="comment">// Also use it after a variable or parameter declaration to tell the</span></div><div class="line"><a name="l00890"></a><span class="lineno"> 890</span> <span class="comment">// compiler the variable/parameter does not have to be used.</span></div><div class="line"><a name="l00891"></a><span class="lineno"> 891</span> <span class="preprocessor">#if defined(__GNUC__) && !defined(COMPILER_ICC)</span></div><div class="line"><a name="l00892"></a><span class="lineno"> 892</span> <span class="preprocessor"># define GTEST_ATTRIBUTE_UNUSED_ __attribute__ ((unused))</span></div><div class="line"><a name="l00893"></a><span class="lineno"> 893</span> <span class="preprocessor">#elif defined(__clang__)</span></div><div class="line"><a name="l00894"></a><span class="lineno"> 894</span> <span class="preprocessor"># if __has_attribute(unused)</span></div><div class="line"><a name="l00895"></a><span class="lineno"> 895</span> <span class="preprocessor"># define GTEST_ATTRIBUTE_UNUSED_ __attribute__ ((unused))</span></div><div class="line"><a name="l00896"></a><span class="lineno"> 896</span> <span class="preprocessor"># endif</span></div><div class="line"><a name="l00897"></a><span class="lineno"> 897</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00898"></a><span class="lineno"> 898</span> <span class="preprocessor">#ifndef GTEST_ATTRIBUTE_UNUSED_</span></div><div class="line"><a name="l00899"></a><span class="lineno"><a class="line" href="gtest_8h.html#acdd47601a9376161c349a5881ccc6918"> 899</a></span> <span class="preprocessor"># define GTEST_ATTRIBUTE_UNUSED_</span></div><div class="line"><a name="l00900"></a><span class="lineno"> 900</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00901"></a><span class="lineno"> 901</span> </div><div class="line"><a name="l00902"></a><span class="lineno"> 902</span> <span class="comment">// Use this annotation before a function that takes a printf format string.</span></div><div class="line"><a name="l00903"></a><span class="lineno"> 903</span> <span class="preprocessor">#if (defined(__GNUC__) || defined(__clang__)) && !defined(COMPILER_ICC)</span></div><div class="line"><a name="l00904"></a><span class="lineno"> 904</span> <span class="preprocessor"># if defined(__MINGW_PRINTF_FORMAT)</span></div><div class="line"><a name="l00905"></a><span class="lineno"> 905</span> <span class="comment">// MinGW has two different printf implementations. Ensure the format macro</span></div><div class="line"><a name="l00906"></a><span class="lineno"> 906</span> <span class="comment">// matches the selected implementation. See</span></div><div class="line"><a name="l00907"></a><span class="lineno"> 907</span> <span class="comment">// https://sourceforge.net/p/mingw-w64/wiki2/gnu%20printf/.</span></div><div class="line"><a name="l00908"></a><span class="lineno"> 908</span> <span class="preprocessor"># define GTEST_ATTRIBUTE_PRINTF_(string_index, first_to_check) \</span></div><div class="line"><a name="l00909"></a><span class="lineno"> 909</span> <span class="preprocessor"> __attribute__((__format__(__MINGW_PRINTF_FORMAT, string_index, \</span></div><div class="line"><a name="l00910"></a><span class="lineno"> 910</span> <span class="preprocessor"> first_to_check)))</span></div><div class="line"><a name="l00911"></a><span class="lineno"> 911</span> <span class="preprocessor"># else</span></div><div class="line"><a name="l00912"></a><span class="lineno"> 912</span> <span class="preprocessor"># define GTEST_ATTRIBUTE_PRINTF_(string_index, first_to_check) \</span></div><div class="line"><a name="l00913"></a><span class="lineno"> 913</span> <span class="preprocessor"> __attribute__((__format__(__printf__, string_index, first_to_check)))</span></div><div class="line"><a name="l00914"></a><span class="lineno"> 914</span> <span class="preprocessor"># endif</span></div><div class="line"><a name="l00915"></a><span class="lineno"> 915</span> <span class="preprocessor">#else</span></div><div class="line"><a name="l00916"></a><span class="lineno"><a class="line" href="gtest_8h.html#ae29b00ca46783509cc900cd03d61ef37"> 916</a></span> <span class="preprocessor"># define GTEST_ATTRIBUTE_PRINTF_(string_index, first_to_check)</span></div><div class="line"><a name="l00917"></a><span class="lineno"> 917</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00918"></a><span class="lineno"> 918</span> </div><div class="line"><a name="l00919"></a><span class="lineno"> 919</span> </div><div class="line"><a name="l00920"></a><span class="lineno"> 920</span> <span class="comment">// A macro to disallow operator=</span></div><div class="line"><a name="l00921"></a><span class="lineno"> 921</span> <span class="comment">// This should be used in the private: declarations for a class.</span></div><div class="line"><a name="l00922"></a><span class="lineno"><a class="line" href="gtest_8h.html#ac593b50ce24257d5b6aa84845c344c9e"> 922</a></span> <span class="preprocessor">#define GTEST_DISALLOW_ASSIGN_(type) \</span></div><div class="line"><a name="l00923"></a><span class="lineno"> 923</span> <span class="preprocessor"> void operator=(type const &) = delete</span></div><div class="line"><a name="l00924"></a><span class="lineno"> 924</span> </div><div class="line"><a name="l00925"></a><span class="lineno"> 925</span> <span class="comment">// A macro to disallow copy constructor and operator=</span></div><div class="line"><a name="l00926"></a><span class="lineno"> 926</span> <span class="comment">// This should be used in the private: declarations for a class.</span></div><div class="line"><a name="l00927"></a><span class="lineno"><a class="line" href="gtest_8h.html#aed8c1888c32b588b0681e88b95031e29"> 927</a></span> <span class="preprocessor">#define GTEST_DISALLOW_COPY_AND_ASSIGN_(type) \</span></div><div class="line"><a name="l00928"></a><span class="lineno"> 928</span> <span class="preprocessor"> type(type const &) = delete; \</span></div><div class="line"><a name="l00929"></a><span class="lineno"> 929</span> <span class="preprocessor"> GTEST_DISALLOW_ASSIGN_(type)</span></div><div class="line"><a name="l00930"></a><span class="lineno"> 930</span> </div><div class="line"><a name="l00931"></a><span class="lineno"> 931</span> <span class="comment">// Tell the compiler to warn about unused return values for functions declared</span></div><div class="line"><a name="l00932"></a><span class="lineno"> 932</span> <span class="comment">// with this macro. The macro should be used on function declarations</span></div><div class="line"><a name="l00933"></a><span class="lineno"> 933</span> <span class="comment">// following the argument list:</span></div><div class="line"><a name="l00934"></a><span class="lineno"> 934</span> <span class="comment">//</span></div><div class="line"><a name="l00935"></a><span class="lineno"> 935</span> <span class="comment">// Sprocket* AllocateSprocket() GTEST_MUST_USE_RESULT_;</span></div><div class="line"><a name="l00936"></a><span class="lineno"> 936</span> <span class="preprocessor">#if defined(__GNUC__) && !defined(COMPILER_ICC)</span></div><div class="line"><a name="l00937"></a><span class="lineno"> 937</span> <span class="preprocessor"># define GTEST_MUST_USE_RESULT_ __attribute__ ((warn_unused_result))</span></div><div class="line"><a name="l00938"></a><span class="lineno"> 938</span> <span class="preprocessor">#else</span></div><div class="line"><a name="l00939"></a><span class="lineno"><a class="line" href="gtest_8h.html#a8e5aab8276b2645f64f41c9e3021b935"> 939</a></span> <span class="preprocessor"># define GTEST_MUST_USE_RESULT_</span></div><div class="line"><a name="l00940"></a><span class="lineno"> 940</span> <span class="preprocessor">#endif // __GNUC__ && !COMPILER_ICC</span></div><div class="line"><a name="l00941"></a><span class="lineno"> 941</span> </div><div class="line"><a name="l00942"></a><span class="lineno"> 942</span> <span class="comment">// MS C++ compiler emits warning when a conditional expression is compile time</span></div><div class="line"><a name="l00943"></a><span class="lineno"> 943</span> <span class="comment">// constant. In some contexts this warning is false positive and needs to be</span></div><div class="line"><a name="l00944"></a><span class="lineno"> 944</span> <span class="comment">// suppressed. Use the following two macros in such cases:</span></div><div class="line"><a name="l00945"></a><span class="lineno"> 945</span> <span class="comment">//</span></div><div class="line"><a name="l00946"></a><span class="lineno"> 946</span> <span class="comment">// GTEST_INTENTIONAL_CONST_COND_PUSH_()</span></div><div class="line"><a name="l00947"></a><span class="lineno"> 947</span> <span class="comment">// while (true) {</span></div><div class="line"><a name="l00948"></a><span class="lineno"> 948</span> <span class="comment">// GTEST_INTENTIONAL_CONST_COND_POP_()</span></div><div class="line"><a name="l00949"></a><span class="lineno"> 949</span> <span class="comment">// }</span></div><div class="line"><a name="l00950"></a><span class="lineno"><a class="line" href="gtest_8h.html#a69b0cadb05bf2a1ef96151243c6b6241"> 950</a></span> <span class="preprocessor"># define GTEST_INTENTIONAL_CONST_COND_PUSH_() \</span></div><div class="line"><a name="l00951"></a><span class="lineno"> 951</span> <span class="preprocessor"> GTEST_DISABLE_MSC_WARNINGS_PUSH_(4127)</span></div><div class="line"><a name="l00952"></a><span class="lineno"><a class="line" href="gtest_8h.html#ad115e2c466f7e8a32f1cf23ef2e5f220"> 952</a></span> <span class="preprocessor"># define GTEST_INTENTIONAL_CONST_COND_POP_() \</span></div><div class="line"><a name="l00953"></a><span class="lineno"> 953</span> <span class="preprocessor"> GTEST_DISABLE_MSC_WARNINGS_POP_()</span></div><div class="line"><a name="l00954"></a><span class="lineno"> 954</span> </div><div class="line"><a name="l00955"></a><span class="lineno"> 955</span> <span class="comment">// Determine whether the compiler supports Microsoft's Structured Exception</span></div><div class="line"><a name="l00956"></a><span class="lineno"> 956</span> <span class="comment">// Handling. This is supported by several Windows compilers but generally</span></div><div class="line"><a name="l00957"></a><span class="lineno"> 957</span> <span class="comment">// does not exist on any other system.</span></div><div class="line"><a name="l00958"></a><span class="lineno"> 958</span> <span class="preprocessor">#ifndef GTEST_HAS_SEH</span></div><div class="line"><a name="l00959"></a><span class="lineno"> 959</span> <span class="comment">// The user didn't tell us, so we need to figure it out.</span></div><div class="line"><a name="l00960"></a><span class="lineno"> 960</span> </div><div class="line"><a name="l00961"></a><span class="lineno"> 961</span> <span class="preprocessor"># if defined(_MSC_VER) || defined(__BORLANDC__)</span></div><div class="line"><a name="l00962"></a><span class="lineno"> 962</span> <span class="comment">// These two compilers are known to support SEH.</span></div><div class="line"><a name="l00963"></a><span class="lineno"> 963</span> <span class="preprocessor"># define GTEST_HAS_SEH 1</span></div><div class="line"><a name="l00964"></a><span class="lineno"> 964</span> <span class="preprocessor"># else</span></div><div class="line"><a name="l00965"></a><span class="lineno"> 965</span> <span class="comment">// Assume no SEH.</span></div><div class="line"><a name="l00966"></a><span class="lineno"><a class="line" href="gtest_8h.html#a8f6a84e8be3c94cd1f6f46a136df2c62"> 966</a></span> <span class="preprocessor"># define GTEST_HAS_SEH 0</span></div><div class="line"><a name="l00967"></a><span class="lineno"> 967</span> <span class="preprocessor"># endif</span></div><div class="line"><a name="l00968"></a><span class="lineno"> 968</span> </div><div class="line"><a name="l00969"></a><span class="lineno"> 969</span> <span class="preprocessor">#endif // GTEST_HAS_SEH</span></div><div class="line"><a name="l00970"></a><span class="lineno"> 970</span> </div><div class="line"><a name="l00971"></a><span class="lineno"> 971</span> <span class="preprocessor">#ifndef GTEST_IS_THREADSAFE</span></div><div class="line"><a name="l00972"></a><span class="lineno"> 972</span> </div><div class="line"><a name="l00973"></a><span class="lineno"><a class="line" href="gtest_8h.html#a727149862f53b2fb21f6d33cd9323886"> 973</a></span> <span class="preprocessor">#define GTEST_IS_THREADSAFE \</span></div><div class="line"><a name="l00974"></a><span class="lineno"> 974</span> <span class="preprocessor"> (GTEST_HAS_MUTEX_AND_THREAD_LOCAL_ || \</span></div><div class="line"><a name="l00975"></a><span class="lineno"> 975</span> <span class="preprocessor"> (GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT) || \</span></div><div class="line"><a name="l00976"></a><span class="lineno"> 976</span> <span class="preprocessor"> GTEST_HAS_PTHREAD)</span></div><div class="line"><a name="l00977"></a><span class="lineno"> 977</span> </div><div class="line"><a name="l00978"></a><span class="lineno"> 978</span> <span class="preprocessor">#endif // GTEST_IS_THREADSAFE</span></div><div class="line"><a name="l00979"></a><span class="lineno"> 979</span> </div><div class="line"><a name="l00980"></a><span class="lineno"> 980</span> <span class="comment">// GTEST_API_ qualifies all symbols that must be exported. The definitions below</span></div><div class="line"><a name="l00981"></a><span class="lineno"> 981</span> <span class="comment">// are guarded by #ifndef to give embedders a chance to define GTEST_API_ in</span></div><div class="line"><a name="l00982"></a><span class="lineno"> 982</span> <span class="comment">// gtest/internal/custom/gtest-port.h</span></div><div class="line"><a name="l00983"></a><span class="lineno"> 983</span> <span class="preprocessor">#ifndef GTEST_API_</span></div><div class="line"><a name="l00984"></a><span class="lineno"> 984</span> </div><div class="line"><a name="l00985"></a><span class="lineno"> 985</span> <span class="preprocessor">#ifdef _MSC_VER</span></div><div class="line"><a name="l00986"></a><span class="lineno"> 986</span> <span class="preprocessor"># if GTEST_LINKED_AS_SHARED_LIBRARY</span></div><div class="line"><a name="l00987"></a><span class="lineno"> 987</span> <span class="preprocessor"># define GTEST_API_ __declspec(dllimport)</span></div><div class="line"><a name="l00988"></a><span class="lineno"> 988</span> <span class="preprocessor"># elif GTEST_CREATE_SHARED_LIBRARY</span></div><div class="line"><a name="l00989"></a><span class="lineno"> 989</span> <span class="preprocessor"># define GTEST_API_ __declspec(dllexport)</span></div><div class="line"><a name="l00990"></a><span class="lineno"> 990</span> <span class="preprocessor"># endif</span></div><div class="line"><a name="l00991"></a><span class="lineno"> 991</span> <span class="preprocessor">#elif __GNUC__ >= 4 || defined(__clang__)</span></div><div class="line"><a name="l00992"></a><span class="lineno"> 992</span> <span class="preprocessor"># define GTEST_API_ __attribute__((visibility ("default")))</span></div><div class="line"><a name="l00993"></a><span class="lineno"> 993</span> <span class="preprocessor">#endif // _MSC_VER</span></div><div class="line"><a name="l00994"></a><span class="lineno"> 994</span> </div><div class="line"><a name="l00995"></a><span class="lineno"> 995</span> <span class="preprocessor">#endif // GTEST_API_</span></div><div class="line"><a name="l00996"></a><span class="lineno"> 996</span> </div><div class="line"><a name="l00997"></a><span class="lineno"> 997</span> <span class="preprocessor">#ifndef GTEST_API_</span></div><div class="line"><a name="l00998"></a><span class="lineno"><a class="line" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790"> 998</a></span> <span class="preprocessor"># define GTEST_API_</span></div><div class="line"><a name="l00999"></a><span class="lineno"> 999</span> <span class="preprocessor">#endif // GTEST_API_</span></div><div class="line"><a name="l01000"></a><span class="lineno"> 1000</span> </div><div class="line"><a name="l01001"></a><span class="lineno"> 1001</span> <span class="preprocessor">#ifndef GTEST_DEFAULT_DEATH_TEST_STYLE</span></div><div class="line"><a name="l01002"></a><span class="lineno"><a class="line" href="gtest_8h.html#a491d09ee62f1c9cfeafa3dbf75aaa9e2"> 1002</a></span> <span class="preprocessor"># define GTEST_DEFAULT_DEATH_TEST_STYLE "fast"</span></div><div class="line"><a name="l01003"></a><span class="lineno"> 1003</span> <span class="preprocessor">#endif // GTEST_DEFAULT_DEATH_TEST_STYLE</span></div><div class="line"><a name="l01004"></a><span class="lineno"> 1004</span> </div><div class="line"><a name="l01005"></a><span class="lineno"> 1005</span> <span class="preprocessor">#ifdef __GNUC__</span></div><div class="line"><a name="l01006"></a><span class="lineno"> 1006</span> <span class="comment">// Ask the compiler to never inline a given function.</span></div><div class="line"><a name="l01007"></a><span class="lineno"> 1007</span> <span class="preprocessor"># define GTEST_NO_INLINE_ __attribute__((noinline))</span></div><div class="line"><a name="l01008"></a><span class="lineno"> 1008</span> <span class="preprocessor">#else</span></div><div class="line"><a name="l01009"></a><span class="lineno"><a class="line" href="gtest_8h.html#a9945cbd967fbccb15f8de711f58955c7"> 1009</a></span> <span class="preprocessor"># define GTEST_NO_INLINE_</span></div><div class="line"><a name="l01010"></a><span class="lineno"> 1010</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l01011"></a><span class="lineno"> 1011</span> </div><div class="line"><a name="l01012"></a><span class="lineno"> 1012</span> <span class="comment">// _LIBCPP_VERSION is defined by the libc++ library from the LLVM project.</span></div><div class="line"><a name="l01013"></a><span class="lineno"> 1013</span> <span class="preprocessor">#if !defined(GTEST_HAS_CXXABI_H_)</span></div><div class="line"><a name="l01014"></a><span class="lineno"> 1014</span> <span class="preprocessor"># if defined(__GLIBCXX__) || (defined(_LIBCPP_VERSION) && !defined(_MSC_VER))</span></div><div class="line"><a name="l01015"></a><span class="lineno"> 1015</span> <span class="preprocessor"># define GTEST_HAS_CXXABI_H_ 1</span></div><div class="line"><a name="l01016"></a><span class="lineno"> 1016</span> <span class="preprocessor"># else</span></div><div class="line"><a name="l01017"></a><span class="lineno"><a class="line" href="gtest_8h.html#ae6239a8ccf4c230008d1db1ea8bd738e"> 1017</a></span> <span class="preprocessor"># define GTEST_HAS_CXXABI_H_ 0</span></div><div class="line"><a name="l01018"></a><span class="lineno"> 1018</span> <span class="preprocessor"># endif</span></div><div class="line"><a name="l01019"></a><span class="lineno"> 1019</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l01020"></a><span class="lineno"> 1020</span> </div><div class="line"><a name="l01021"></a><span class="lineno"> 1021</span> <span class="comment">// A function level attribute to disable checking for use of uninitialized</span></div><div class="line"><a name="l01022"></a><span class="lineno"> 1022</span> <span class="comment">// memory when built with MemorySanitizer.</span></div><div class="line"><a name="l01023"></a><span class="lineno"> 1023</span> <span class="preprocessor">#if defined(__clang__)</span></div><div class="line"><a name="l01024"></a><span class="lineno"> 1024</span> <span class="preprocessor"># if __has_feature(memory_sanitizer)</span></div><div class="line"><a name="l01025"></a><span class="lineno"> 1025</span> <span class="preprocessor"># define GTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_ \</span></div><div class="line"><a name="l01026"></a><span class="lineno"> 1026</span> <span class="preprocessor"> __attribute__((no_sanitize_memory))</span></div><div class="line"><a name="l01027"></a><span class="lineno"> 1027</span> <span class="preprocessor"># else</span></div><div class="line"><a name="l01028"></a><span class="lineno"> 1028</span> <span class="preprocessor"># define GTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_</span></div><div class="line"><a name="l01029"></a><span class="lineno"> 1029</span> <span class="preprocessor"># endif // __has_feature(memory_sanitizer)</span></div><div class="line"><a name="l01030"></a><span class="lineno"> 1030</span> <span class="preprocessor">#else</span></div><div class="line"><a name="l01031"></a><span class="lineno"><a class="line" href="gtest_8h.html#a2a83dd79037e53814a509cc3f5702650"> 1031</a></span> <span class="preprocessor"># define GTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_</span></div><div class="line"><a name="l01032"></a><span class="lineno"> 1032</span> <span class="preprocessor">#endif // __clang__</span></div><div class="line"><a name="l01033"></a><span class="lineno"> 1033</span> </div><div class="line"><a name="l01034"></a><span class="lineno"> 1034</span> <span class="comment">// A function level attribute to disable AddressSanitizer instrumentation.</span></div><div class="line"><a name="l01035"></a><span class="lineno"> 1035</span> <span class="preprocessor">#if defined(__clang__)</span></div><div class="line"><a name="l01036"></a><span class="lineno"> 1036</span> <span class="preprocessor"># if __has_feature(address_sanitizer)</span></div><div class="line"><a name="l01037"></a><span class="lineno"> 1037</span> <span class="preprocessor"># define GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_ \</span></div><div class="line"><a name="l01038"></a><span class="lineno"> 1038</span> <span class="preprocessor"> __attribute__((no_sanitize_address))</span></div><div class="line"><a name="l01039"></a><span class="lineno"> 1039</span> <span class="preprocessor"># else</span></div><div class="line"><a name="l01040"></a><span class="lineno"> 1040</span> <span class="preprocessor"># define GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_</span></div><div class="line"><a name="l01041"></a><span class="lineno"> 1041</span> <span class="preprocessor"># endif // __has_feature(address_sanitizer)</span></div><div class="line"><a name="l01042"></a><span class="lineno"> 1042</span> <span class="preprocessor">#else</span></div><div class="line"><a name="l01043"></a><span class="lineno"><a class="line" href="gtest_8h.html#af18b465f4ba6e36eea7a8d2d79521873"> 1043</a></span> <span class="preprocessor"># define GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_</span></div><div class="line"><a name="l01044"></a><span class="lineno"> 1044</span> <span class="preprocessor">#endif // __clang__</span></div><div class="line"><a name="l01045"></a><span class="lineno"> 1045</span> </div><div class="line"><a name="l01046"></a><span class="lineno"> 1046</span> <span class="comment">// A function level attribute to disable ThreadSanitizer instrumentation.</span></div><div class="line"><a name="l01047"></a><span class="lineno"> 1047</span> <span class="preprocessor">#if defined(__clang__)</span></div><div class="line"><a name="l01048"></a><span class="lineno"> 1048</span> <span class="preprocessor"># if __has_feature(thread_sanitizer)</span></div><div class="line"><a name="l01049"></a><span class="lineno"> 1049</span> <span class="preprocessor"># define GTEST_ATTRIBUTE_NO_SANITIZE_THREAD_ \</span></div><div class="line"><a name="l01050"></a><span class="lineno"> 1050</span> <span class="preprocessor"> __attribute__((no_sanitize_thread))</span></div><div class="line"><a name="l01051"></a><span class="lineno"> 1051</span> <span class="preprocessor"># else</span></div><div class="line"><a name="l01052"></a><span class="lineno"> 1052</span> <span class="preprocessor"># define GTEST_ATTRIBUTE_NO_SANITIZE_THREAD_</span></div><div class="line"><a name="l01053"></a><span class="lineno"> 1053</span> <span class="preprocessor"># endif // __has_feature(thread_sanitizer)</span></div><div class="line"><a name="l01054"></a><span class="lineno"> 1054</span> <span class="preprocessor">#else</span></div><div class="line"><a name="l01055"></a><span class="lineno"><a class="line" href="gtest_8h.html#abf30a6b1b3a12ecb2cc1bc1a6f5f9646"> 1055</a></span> <span class="preprocessor"># define GTEST_ATTRIBUTE_NO_SANITIZE_THREAD_</span></div><div class="line"><a name="l01056"></a><span class="lineno"> 1056</span> <span class="preprocessor">#endif // __clang__</span></div><div class="line"><a name="l01057"></a><span class="lineno"> 1057</span> </div><div class="line"><a name="l01058"></a><span class="lineno"> 1058</span> <span class="keyword">namespace </span><a class="code" href="namespacetesting.html">testing</a> {</div><div class="line"><a name="l01059"></a><span class="lineno"> 1059</span> </div><div class="line"><a name="l01060"></a><span class="lineno"> 1060</span> <span class="keyword">class </span>Message;</div><div class="line"><a name="l01061"></a><span class="lineno"> 1061</span> </div><div class="line"><a name="l01062"></a><span class="lineno"> 1062</span> <span class="comment">// Legacy imports for backwards compatibility.</span></div><div class="line"><a name="l01063"></a><span class="lineno"> 1063</span> <span class="comment">// New code should use std:: names directly.</span></div><div class="line"><a name="l01064"></a><span class="lineno"> 1064</span> <span class="keyword">using</span> <a class="code" href="namespaceutl.html#a29057d2e164fe6dd3f3095f0d69c6546">std::get</a>;</div><div class="line"><a name="l01065"></a><span class="lineno"> 1065</span> <span class="keyword">using</span> std::make_tuple;</div><div class="line"><a name="l01066"></a><span class="lineno"> 1066</span> <span class="keyword">using</span> std::tuple;</div><div class="line"><a name="l01067"></a><span class="lineno"> 1067</span> <span class="keyword">using</span> std::tuple_element;</div><div class="line"><a name="l01068"></a><span class="lineno"> 1068</span> <span class="keyword">using</span> std::tuple_size;</div><div class="line"><a name="l01069"></a><span class="lineno"> 1069</span> </div><div class="line"><a name="l01070"></a><span class="lineno"> 1070</span> <span class="keyword">namespace </span>internal {</div><div class="line"><a name="l01071"></a><span class="lineno"> 1071</span> </div><div class="line"><a name="l01072"></a><span class="lineno"> 1072</span> <span class="comment">// A secret type that Google Test users don't know about. It has no</span></div><div class="line"><a name="l01073"></a><span class="lineno"> 1073</span> <span class="comment">// definition on purpose. Therefore it's impossible to create a</span></div><div class="line"><a name="l01074"></a><span class="lineno"> 1074</span> <span class="comment">// Secret object, which is what we want.</span></div><div class="line"><a name="l01075"></a><span class="lineno"> 1075</span> <span class="keyword">class </span>Secret;</div><div class="line"><a name="l01076"></a><span class="lineno"> 1076</span> </div><div class="line"><a name="l01077"></a><span class="lineno"> 1077</span> <span class="comment">// The GTEST_COMPILE_ASSERT_ is a legacy macro used to verify that a compile</span></div><div class="line"><a name="l01078"></a><span class="lineno"> 1078</span> <span class="comment">// time expression is true (in new code, use static_assert instead). For</span></div><div class="line"><a name="l01079"></a><span class="lineno"> 1079</span> <span class="comment">// example, you could use it to verify the size of a static array:</span></div><div class="line"><a name="l01080"></a><span class="lineno"> 1080</span> <span class="comment">//</span></div><div class="line"><a name="l01081"></a><span class="lineno"> 1081</span> <span class="comment">// GTEST_COMPILE_ASSERT_(GTEST_ARRAY_SIZE_(names) == NUM_NAMES,</span></div><div class="line"><a name="l01082"></a><span class="lineno"> 1082</span> <span class="comment">// names_incorrect_size);</span></div><div class="line"><a name="l01083"></a><span class="lineno"> 1083</span> <span class="comment">//</span></div><div class="line"><a name="l01084"></a><span class="lineno"> 1084</span> <span class="comment">// The second argument to the macro must be a valid C++ identifier. If the</span></div><div class="line"><a name="l01085"></a><span class="lineno"> 1085</span> <span class="comment">// expression is false, compiler will issue an error containing this identifier.</span></div><div class="line"><a name="l01086"></a><span class="lineno"><a class="line" href="gtest_8h.html#ae1f37dc71d5daa6fb49ca1b6047d4a8c"> 1086</a></span> <span class="preprocessor">#define GTEST_COMPILE_ASSERT_(expr, msg) static_assert(expr, #msg)</span></div><div class="line"><a name="l01087"></a><span class="lineno"> 1087</span> </div><div class="line"><a name="l01088"></a><span class="lineno"> 1088</span> <span class="comment">// StaticAssertTypeEqHelper is used by StaticAssertTypeEq defined in gtest.h.</span></div><div class="line"><a name="l01089"></a><span class="lineno"> 1089</span> <span class="comment">//</span></div><div class="line"><a name="l01090"></a><span class="lineno"> 1090</span> <span class="comment">// This template is declared, but intentionally undefined.</span></div><div class="line"><a name="l01091"></a><span class="lineno"> 1091</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2></div><div class="line"><a name="l01092"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_static_assert_type_eq_helper.html"> 1092</a></span> <span class="keyword">struct </span><a class="code" href="structtesting_1_1internal_1_1_static_assert_type_eq_helper.html">StaticAssertTypeEqHelper</a>;</div><div class="line"><a name="l01093"></a><span class="lineno"> 1093</span> </div><div class="line"><a name="l01094"></a><span class="lineno"> 1094</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l01095"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_static_assert_type_eq_helper_3_01_t_00_01_t_01_4.html"> 1095</a></span> <span class="keyword">struct </span><a class="code" href="structtesting_1_1internal_1_1_static_assert_type_eq_helper.html">StaticAssertTypeEqHelper</a><T, T> {</div><div class="line"><a name="l01096"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_static_assert_type_eq_helper_3_01_t_00_01_t_01_4.html#a70d7e229f58313a1086e819dd09b652da63c475f543e4e977d43c5093dd2b7f3f"> 1096</a></span>  <span class="keyword">enum</span> { value = <span class="keyword">true</span> };</div><div class="line"><a name="l01097"></a><span class="lineno"> 1097</span> };</div><div class="line"><a name="l01098"></a><span class="lineno"> 1098</span> </div><div class="line"><a name="l01099"></a><span class="lineno"> 1099</span> <span class="comment">// Same as std::is_same<>.</span></div><div class="line"><a name="l01100"></a><span class="lineno"> 1100</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T, <span class="keyword">typename</span> U></div><div class="line"><a name="l01101"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_is_same.html"> 1101</a></span> <span class="keyword">struct </span><a class="code" href="structtesting_1_1internal_1_1_is_same.html">IsSame</a> {</div><div class="line"><a name="l01102"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_is_same.html#a4dfd313ccff08905c7c36f990ab52e1ca58968a8c680eff4326a25fab55aa0a5e"> 1102</a></span>  <span class="keyword">enum</span> { <a class="code" href="structtesting_1_1internal_1_1_is_same.html#a4dfd313ccff08905c7c36f990ab52e1ca58968a8c680eff4326a25fab55aa0a5e">value</a> = <span class="keyword">false</span> };</div><div class="line"><a name="l01103"></a><span class="lineno"> 1103</span> };</div><div class="line"><a name="l01104"></a><span class="lineno"> 1104</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l01105"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_is_same_3_01_t_00_01_t_01_4.html"> 1105</a></span> <span class="keyword">struct </span><a class="code" href="structtesting_1_1internal_1_1_is_same.html">IsSame</a><T, T> {</div><div class="line"><a name="l01106"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_is_same_3_01_t_00_01_t_01_4.html#a87b00ed787e27293dafab4afac29184ba0bb1c61b491e4e13216a3f9e9cd24c69"> 1106</a></span>  <span class="keyword">enum</span> { <a class="code" href="structtesting_1_1internal_1_1_is_same.html#a4dfd313ccff08905c7c36f990ab52e1ca58968a8c680eff4326a25fab55aa0a5e">value</a> = <span class="keyword">true</span> };</div><div class="line"><a name="l01107"></a><span class="lineno"> 1107</span> };</div><div class="line"><a name="l01108"></a><span class="lineno"> 1108</span> </div><div class="line"><a name="l01109"></a><span class="lineno"> 1109</span> <span class="comment">// Evaluates to the number of elements in 'array'.</span></div><div class="line"><a name="l01110"></a><span class="lineno"><a class="line" href="gtest_8h.html#ab71a3e9a908b7b6acc0e8bddc0ecb3fe"> 1110</a></span> <span class="preprocessor">#define GTEST_ARRAY_SIZE_(array) (sizeof(array) / sizeof(array[0]))</span></div><div class="line"><a name="l01111"></a><span class="lineno"> 1111</span> </div><div class="line"><a name="l01112"></a><span class="lineno"> 1112</span> <span class="preprocessor">#if GTEST_HAS_GLOBAL_STRING</span></div><div class="line"><a name="l01113"></a><span class="lineno"> 1113</span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">typedef ::string</a> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">string</a>;</div><div class="line"><a name="l01114"></a><span class="lineno"> 1114</span> <span class="preprocessor">#else</span></div><div class="line"><a name="l01115"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111"> 1115</a></span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">typedef ::std::string</a> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">string</a>;</div><div class="line"><a name="l01116"></a><span class="lineno"> 1116</span> <span class="preprocessor">#endif // GTEST_HAS_GLOBAL_STRING</span></div><div class="line"><a name="l01117"></a><span class="lineno"> 1117</span> </div><div class="line"><a name="l01118"></a><span class="lineno"> 1118</span> <span class="preprocessor">#if GTEST_HAS_GLOBAL_WSTRING</span></div><div class="line"><a name="l01119"></a><span class="lineno"> 1119</span> <a class="code" href="namespacetesting_1_1internal.html#a3f543179329c353aee1d7b54a9a8e335">typedef ::wstring</a> <a class="code" href="namespacetesting_1_1internal.html#a3f543179329c353aee1d7b54a9a8e335">wstring</a>;</div><div class="line"><a name="l01120"></a><span class="lineno"> 1120</span> <span class="preprocessor">#elif GTEST_HAS_STD_WSTRING</span></div><div class="line"><a name="l01121"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#a3f543179329c353aee1d7b54a9a8e335"> 1121</a></span> <a class="code" href="namespacetesting_1_1internal.html#a3f543179329c353aee1d7b54a9a8e335">typedef ::std::wstring</a> <a class="code" href="namespacetesting_1_1internal.html#a3f543179329c353aee1d7b54a9a8e335">wstring</a>;</div><div class="line"><a name="l01122"></a><span class="lineno"> 1122</span> <span class="preprocessor">#endif // GTEST_HAS_GLOBAL_WSTRING</span></div><div class="line"><a name="l01123"></a><span class="lineno"> 1123</span> </div><div class="line"><a name="l01124"></a><span class="lineno"> 1124</span> <span class="comment">// A helper for suppressing warnings on constant condition. It just</span></div><div class="line"><a name="l01125"></a><span class="lineno"> 1125</span> <span class="comment">// returns 'condition'.</span></div><div class="line"><a name="l01126"></a><span class="lineno"> 1126</span> <a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> <span class="keywordtype">bool</span> <a class="code" href="namespacetesting_1_1internal.html#ab2709373c78eb8b1c22a6ba30cceba52">IsTrue</a>(<span class="keywordtype">bool</span> condition);</div><div class="line"><a name="l01127"></a><span class="lineno"> 1127</span> </div><div class="line"><a name="l01128"></a><span class="lineno"> 1128</span> <span class="comment">// Defines RE.</span></div><div class="line"><a name="l01129"></a><span class="lineno"> 1129</span> </div><div class="line"><a name="l01130"></a><span class="lineno"> 1130</span> <span class="preprocessor">#if GTEST_USES_PCRE</span></div><div class="line"><a name="l01131"></a><span class="lineno"> 1131</span> <span class="comment">// if used, PCRE is injected by custom/gtest-port.h</span></div><div class="line"><a name="l01132"></a><span class="lineno"> 1132</span> <span class="preprocessor">#elif GTEST_USES_POSIX_RE || GTEST_USES_SIMPLE_RE</span></div><div class="line"><a name="l01133"></a><span class="lineno"> 1133</span> </div><div class="line"><a name="l01134"></a><span class="lineno"> 1134</span> <span class="comment">// A simple C++ wrapper for <regex.h>. It uses the POSIX Extended</span></div><div class="line"><a name="l01135"></a><span class="lineno"> 1135</span> <span class="comment">// Regular Expression syntax.</span></div><div class="line"><a name="l01136"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_r_e.html"> 1136</a></span> <span class="keyword">class </span><a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> <a class="code" href="classtesting_1_1internal_1_1_r_e.html">RE</a> {</div><div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>  <span class="comment">// A copy constructor is required by the Standard to initialize object</span></div><div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>  <span class="comment">// references from r-values.</span></div><div class="line"><a name="l01140"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_r_e.html#ab215dbc2565fce641e1746ca43e9d68a"> 1140</a></span>  <a class="code" href="classtesting_1_1internal_1_1_r_e.html#ab215dbc2565fce641e1746ca43e9d68a">RE</a>(<span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_r_e.html">RE</a>& other) { Init(other.<a class="code" href="classtesting_1_1internal_1_1_r_e.html#a24236aab3a6b0183a145a6f4c0bb9848">pattern</a>()); }</div><div class="line"><a name="l01141"></a><span class="lineno"> 1141</span> </div><div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>  <span class="comment">// Constructs an RE from a string.</span></div><div class="line"><a name="l01143"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_r_e.html#a8840bd639642f3d4769a94a68ce463c2"> 1143</a></span>  <a class="code" href="classtesting_1_1internal_1_1_r_e.html#a8840bd639642f3d4769a94a68ce463c2">RE</a>(<a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">const ::std::string</a>& regex) { Init(regex.c_str()); } <span class="comment">// NOLINT</span></div><div class="line"><a name="l01144"></a><span class="lineno"> 1144</span> </div><div class="line"><a name="l01145"></a><span class="lineno"> 1145</span> <span class="preprocessor"># if GTEST_HAS_GLOBAL_STRING</span></div><div class="line"><a name="l01146"></a><span class="lineno"> 1146</span> </div><div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>  <a class="code" href="classtesting_1_1internal_1_1_r_e.html">RE</a>(<a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">const ::string</a>& regex) { Init(regex.c_str()); } <span class="comment">// NOLINT</span></div><div class="line"><a name="l01148"></a><span class="lineno"> 1148</span> </div><div class="line"><a name="l01149"></a><span class="lineno"> 1149</span> <span class="preprocessor"># endif // GTEST_HAS_GLOBAL_STRING</span></div><div class="line"><a name="l01150"></a><span class="lineno"> 1150</span> </div><div class="line"><a name="l01151"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_r_e.html#a908ea936a5b7a14479a1b292a7189ca6"> 1151</a></span>  <a class="code" href="classtesting_1_1internal_1_1_r_e.html#a908ea936a5b7a14479a1b292a7189ca6">RE</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* regex) { Init(regex); } <span class="comment">// NOLINT</span></div><div class="line"><a name="l01152"></a><span class="lineno"> 1152</span>  ~<a class="code" href="classtesting_1_1internal_1_1_r_e.html">RE</a>();</div><div class="line"><a name="l01153"></a><span class="lineno"> 1153</span> </div><div class="line"><a name="l01154"></a><span class="lineno"> 1154</span>  <span class="comment">// Returns the string representation of the regex.</span></div><div class="line"><a name="l01155"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_r_e.html#a24236aab3a6b0183a145a6f4c0bb9848"> 1155</a></span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="classtesting_1_1internal_1_1_r_e.html#a24236aab3a6b0183a145a6f4c0bb9848">pattern</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> pattern_; }</div><div class="line"><a name="l01156"></a><span class="lineno"> 1156</span> </div><div class="line"><a name="l01157"></a><span class="lineno"> 1157</span>  <span class="comment">// FullMatch(str, re) returns true iff regular expression re matches</span></div><div class="line"><a name="l01158"></a><span class="lineno"> 1158</span>  <span class="comment">// the entire str.</span></div><div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>  <span class="comment">// PartialMatch(str, re) returns true iff regular expression re</span></div><div class="line"><a name="l01160"></a><span class="lineno"> 1160</span>  <span class="comment">// matches a substring of str (including str itself).</span></div><div class="line"><a name="l01161"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_r_e.html#aa79a950758d0f1d62f7762d1e9cefe86"> 1161</a></span>  <span class="keyword">static</span> <span class="keywordtype">bool</span> <a class="code" href="classtesting_1_1internal_1_1_r_e.html#aa79a950758d0f1d62f7762d1e9cefe86">FullMatch</a>(<a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">const ::std::string</a>& str, <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_r_e.html">RE</a>& re) {</div><div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>  <span class="keywordflow">return</span> FullMatch(str.c_str(), re);</div><div class="line"><a name="l01163"></a><span class="lineno"> 1163</span>  }</div><div class="line"><a name="l01164"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_r_e.html#a1e81f9a87211bdca645e025f8f0236c8"> 1164</a></span>  <span class="keyword">static</span> <span class="keywordtype">bool</span> <a class="code" href="classtesting_1_1internal_1_1_r_e.html#a1e81f9a87211bdca645e025f8f0236c8">PartialMatch</a>(<a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">const ::std::string</a>& str, <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_r_e.html">RE</a>& re) {</div><div class="line"><a name="l01165"></a><span class="lineno"> 1165</span>  <span class="keywordflow">return</span> PartialMatch(str.c_str(), re);</div><div class="line"><a name="l01166"></a><span class="lineno"> 1166</span>  }</div><div class="line"><a name="l01167"></a><span class="lineno"> 1167</span> </div><div class="line"><a name="l01168"></a><span class="lineno"> 1168</span> <span class="preprocessor"># if GTEST_HAS_GLOBAL_STRING</span></div><div class="line"><a name="l01169"></a><span class="lineno"> 1169</span> </div><div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>  <span class="keyword">static</span> <span class="keywordtype">bool</span> FullMatch(<a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">const ::string</a>& str, <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_r_e.html">RE</a>& re) {</div><div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>  <span class="keywordflow">return</span> FullMatch(str.c_str(), re);</div><div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>  }</div><div class="line"><a name="l01173"></a><span class="lineno"> 1173</span>  <span class="keyword">static</span> <span class="keywordtype">bool</span> PartialMatch(<a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">const ::string</a>& str, <span class="keyword">const</span> RE& re) {</div><div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>  <span class="keywordflow">return</span> PartialMatch(str.c_str(), re);</div><div class="line"><a name="l01175"></a><span class="lineno"> 1175</span>  }</div><div class="line"><a name="l01176"></a><span class="lineno"> 1176</span> </div><div class="line"><a name="l01177"></a><span class="lineno"> 1177</span> <span class="preprocessor"># endif // GTEST_HAS_GLOBAL_STRING</span></div><div class="line"><a name="l01178"></a><span class="lineno"> 1178</span> </div><div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>  <span class="keyword">static</span> <span class="keywordtype">bool</span> FullMatch(<span class="keyword">const</span> <span class="keywordtype">char</span>* str, <span class="keyword">const</span> RE& re);</div><div class="line"><a name="l01180"></a><span class="lineno"> 1180</span>  <span class="keyword">static</span> <span class="keywordtype">bool</span> PartialMatch(<span class="keyword">const</span> <span class="keywordtype">char</span>* str, <span class="keyword">const</span> RE& re);</div><div class="line"><a name="l01181"></a><span class="lineno"> 1181</span> </div><div class="line"><a name="l01182"></a><span class="lineno"> 1182</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l01183"></a><span class="lineno"> 1183</span>  <span class="keywordtype">void</span> Init(<span class="keyword">const</span> <span class="keywordtype">char</span>* regex);</div><div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* pattern_;</div><div class="line"><a name="l01185"></a><span class="lineno"> 1185</span>  <span class="keywordtype">bool</span> is_valid_;</div><div class="line"><a name="l01186"></a><span class="lineno"> 1186</span> </div><div class="line"><a name="l01187"></a><span class="lineno"> 1187</span> <span class="preprocessor"># if GTEST_USES_POSIX_RE</span></div><div class="line"><a name="l01188"></a><span class="lineno"> 1188</span> </div><div class="line"><a name="l01189"></a><span class="lineno"> 1189</span>  regex_t full_regex_; <span class="comment">// For FullMatch().</span></div><div class="line"><a name="l01190"></a><span class="lineno"> 1190</span>  regex_t partial_regex_; <span class="comment">// For PartialMatch().</span></div><div class="line"><a name="l01191"></a><span class="lineno"> 1191</span> </div><div class="line"><a name="l01192"></a><span class="lineno"> 1192</span> <span class="preprocessor"># else // GTEST_USES_SIMPLE_RE</span></div><div class="line"><a name="l01193"></a><span class="lineno"> 1193</span> </div><div class="line"><a name="l01194"></a><span class="lineno"> 1194</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* full_pattern_; <span class="comment">// For FullMatch();</span></div><div class="line"><a name="l01195"></a><span class="lineno"> 1195</span> </div><div class="line"><a name="l01196"></a><span class="lineno"> 1196</span> <span class="preprocessor"># endif</span></div><div class="line"><a name="l01197"></a><span class="lineno"> 1197</span> </div><div class="line"><a name="l01198"></a><span class="lineno"> 1198</span>  <a class="code" href="gtest_8h.html#ac593b50ce24257d5b6aa84845c344c9e">GTEST_DISALLOW_ASSIGN_</a>(RE);</div><div class="line"><a name="l01199"></a><span class="lineno"> 1199</span> };</div><div class="line"><a name="l01200"></a><span class="lineno"> 1200</span> </div><div class="line"><a name="l01201"></a><span class="lineno"> 1201</span> <span class="preprocessor">#endif // GTEST_USES_PCRE</span></div><div class="line"><a name="l01202"></a><span class="lineno"> 1202</span> </div><div class="line"><a name="l01203"></a><span class="lineno"> 1203</span> <span class="comment">// Formats a source file path and a line number as they would appear</span></div><div class="line"><a name="l01204"></a><span class="lineno"> 1204</span> <span class="comment">// in an error message from the compiler used to compile this code.</span></div><div class="line"><a name="l01205"></a><span class="lineno"> 1205</span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">GTEST_API_ ::std::string</a> <a class="code" href="namespacetesting_1_1internal.html#a31b7c3abed4a7c395f42c61e993989f4">FormatFileLocation</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* file, <span class="keywordtype">int</span> line);</div><div class="line"><a name="l01206"></a><span class="lineno"> 1206</span> </div><div class="line"><a name="l01207"></a><span class="lineno"> 1207</span> <span class="comment">// Formats a file location for compiler-independent XML output.</span></div><div class="line"><a name="l01208"></a><span class="lineno"> 1208</span> <span class="comment">// Although this function is not platform dependent, we put it next to</span></div><div class="line"><a name="l01209"></a><span class="lineno"> 1209</span> <span class="comment">// FormatFileLocation in order to contrast the two functions.</span></div><div class="line"><a name="l01210"></a><span class="lineno"> 1210</span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">GTEST_API_ ::std::string</a> <a class="code" href="namespacetesting_1_1internal.html#a1ee4cde97868c53e442d3182496a9f3c">FormatCompilerIndependentFileLocation</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* file,</div><div class="line"><a name="l01211"></a><span class="lineno"> 1211</span>  <span class="keywordtype">int</span> line);</div><div class="line"><a name="l01212"></a><span class="lineno"> 1212</span> </div><div class="line"><a name="l01213"></a><span class="lineno"> 1213</span> <span class="comment">// Defines logging utilities:</span></div><div class="line"><a name="l01214"></a><span class="lineno"> 1214</span> <span class="comment">// GTEST_LOG_(severity) - logs messages at the specified severity level. The</span></div><div class="line"><a name="l01215"></a><span class="lineno"> 1215</span> <span class="comment">// message itself is streamed into the macro.</span></div><div class="line"><a name="l01216"></a><span class="lineno"> 1216</span> <span class="comment">// LogToStderr() - directs all log messages to stderr.</span></div><div class="line"><a name="l01217"></a><span class="lineno"> 1217</span> <span class="comment">// FlushInfoLog() - flushes informational log messages.</span></div><div class="line"><a name="l01218"></a><span class="lineno"> 1218</span> </div><div class="line"><a name="l01219"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#aa6255ef3b023c5b4e1a2198d887fb977"> 1219</a></span> <span class="keyword">enum</span> <a class="code" href="namespacetesting_1_1internal.html#aa6255ef3b023c5b4e1a2198d887fb977">GTestLogSeverity</a> {</div><div class="line"><a name="l01220"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#aa6255ef3b023c5b4e1a2198d887fb977aff315e0913fcda86fe4de882bf5e33e9"> 1220</a></span>  <a class="code" href="namespacetesting_1_1internal.html#aa6255ef3b023c5b4e1a2198d887fb977aff315e0913fcda86fe4de882bf5e33e9">GTEST_INFO</a>,</div><div class="line"><a name="l01221"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#aa6255ef3b023c5b4e1a2198d887fb977a7a051bc2794f15a4bf0eab40562a304c"> 1221</a></span>  <a class="code" href="namespacetesting_1_1internal.html#aa6255ef3b023c5b4e1a2198d887fb977a7a051bc2794f15a4bf0eab40562a304c">GTEST_WARNING</a>,</div><div class="line"><a name="l01222"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#aa6255ef3b023c5b4e1a2198d887fb977a651e9cd2a904e0c8210536271b875f75"> 1222</a></span>  <a class="code" href="namespacetesting_1_1internal.html#aa6255ef3b023c5b4e1a2198d887fb977a651e9cd2a904e0c8210536271b875f75">GTEST_ERROR</a>,</div><div class="line"><a name="l01223"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#aa6255ef3b023c5b4e1a2198d887fb977a75063567740f6bf7da419b1b9197b12e"> 1223</a></span>  <a class="code" href="namespacetesting_1_1internal.html#aa6255ef3b023c5b4e1a2198d887fb977a75063567740f6bf7da419b1b9197b12e">GTEST_FATAL</a></div><div class="line"><a name="l01224"></a><span class="lineno"> 1224</span> };</div><div class="line"><a name="l01225"></a><span class="lineno"> 1225</span> </div><div class="line"><a name="l01226"></a><span class="lineno"> 1226</span> <span class="comment">// Formats log entry severity, provides a stream object for streaming the</span></div><div class="line"><a name="l01227"></a><span class="lineno"> 1227</span> <span class="comment">// log message, and terminates the message with a newline when going out of</span></div><div class="line"><a name="l01228"></a><span class="lineno"> 1228</span> <span class="comment">// scope.</span></div><div class="line"><a name="l01229"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_g_test_log.html"> 1229</a></span> <span class="keyword">class </span><a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> <a class="code" href="classtesting_1_1internal_1_1_g_test_log.html">GTestLog</a> {</div><div class="line"><a name="l01230"></a><span class="lineno"> 1230</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l01231"></a><span class="lineno"> 1231</span>  <a class="code" href="classtesting_1_1internal_1_1_g_test_log.html">GTestLog</a>(<a class="code" href="namespacetesting_1_1internal.html#aa6255ef3b023c5b4e1a2198d887fb977">GTestLogSeverity</a> severity, <span class="keyword">const</span> <span class="keywordtype">char</span>* file, <span class="keywordtype">int</span> line);</div><div class="line"><a name="l01232"></a><span class="lineno"> 1232</span> </div><div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>  <span class="comment">// Flushes the buffers and, if severity is GTEST_FATAL, aborts the program.</span></div><div class="line"><a name="l01234"></a><span class="lineno"> 1234</span>  ~<a class="code" href="classtesting_1_1internal_1_1_g_test_log.html">GTestLog</a>();</div><div class="line"><a name="l01235"></a><span class="lineno"> 1235</span> </div><div class="line"><a name="l01236"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_g_test_log.html#aebb92e67d98eca69f0347d5121dab27a"> 1236</a></span>  ::std::ostream& <a class="code" href="classtesting_1_1internal_1_1_g_test_log.html#aebb92e67d98eca69f0347d5121dab27a">GetStream</a>() { return ::std::cerr; }</div><div class="line"><a name="l01237"></a><span class="lineno"> 1237</span> </div><div class="line"><a name="l01238"></a><span class="lineno"> 1238</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l01239"></a><span class="lineno"> 1239</span>  <span class="keyword">const</span> <a class="code" href="namespacetesting_1_1internal.html#aa6255ef3b023c5b4e1a2198d887fb977">GTestLogSeverity</a> severity_;</div><div class="line"><a name="l01240"></a><span class="lineno"> 1240</span> </div><div class="line"><a name="l01241"></a><span class="lineno"> 1241</span>  <a class="code" href="gtest_8h.html#aed8c1888c32b588b0681e88b95031e29">GTEST_DISALLOW_COPY_AND_ASSIGN_</a>(<a class="code" href="classtesting_1_1internal_1_1_g_test_log.html">GTestLog</a>);</div><div class="line"><a name="l01242"></a><span class="lineno"> 1242</span> };</div><div class="line"><a name="l01243"></a><span class="lineno"> 1243</span> </div><div class="line"><a name="l01244"></a><span class="lineno"> 1244</span> <span class="preprocessor">#if !defined(GTEST_LOG_)</span></div><div class="line"><a name="l01245"></a><span class="lineno"> 1245</span> </div><div class="line"><a name="l01246"></a><span class="lineno"><a class="line" href="gtest_8h.html#a8ef4cb4c465db8c15464aecc6d9510ef"> 1246</a></span> <span class="preprocessor"># define GTEST_LOG_(severity) \</span></div><div class="line"><a name="l01247"></a><span class="lineno"> 1247</span> <span class="preprocessor"> ::testing::internal::GTestLog(::testing::internal::GTEST_##severity, \</span></div><div class="line"><a name="l01248"></a><span class="lineno"> 1248</span> <span class="preprocessor"> __FILE__, __LINE__).GetStream()</span></div><div class="line"><a name="l01249"></a><span class="lineno"> 1249</span> </div><div class="line"><a name="l01250"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#a06b1b20029fbd1dbeb59752f914fab84"> 1250</a></span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="namespacetesting_1_1internal.html#a06b1b20029fbd1dbeb59752f914fab84">LogToStderr</a>() {}</div><div class="line"><a name="l01251"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#a2135f223bf6b527729aeaa651115183b"> 1251</a></span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="namespacetesting_1_1internal.html#a2135f223bf6b527729aeaa651115183b">FlushInfoLog</a>() { fflush(<span class="keyword">nullptr</span>); }</div><div class="line"><a name="l01252"></a><span class="lineno"> 1252</span> </div><div class="line"><a name="l01253"></a><span class="lineno"> 1253</span> <span class="preprocessor">#endif // !defined(GTEST_LOG_)</span></div><div class="line"><a name="l01254"></a><span class="lineno"> 1254</span> </div><div class="line"><a name="l01255"></a><span class="lineno"> 1255</span> <span class="preprocessor">#if !defined(GTEST_CHECK_)</span></div><div class="line"><a name="l01256"></a><span class="lineno"> 1256</span> <span class="comment">// INTERNAL IMPLEMENTATION - DO NOT USE.</span></div><div class="line"><a name="l01257"></a><span class="lineno"> 1257</span> <span class="comment">//</span></div><div class="line"><a name="l01258"></a><span class="lineno"> 1258</span> <span class="comment">// GTEST_CHECK_ is an all-mode assert. It aborts the program if the condition</span></div><div class="line"><a name="l01259"></a><span class="lineno"> 1259</span> <span class="comment">// is not satisfied.</span></div><div class="line"><a name="l01260"></a><span class="lineno"> 1260</span> <span class="comment">// Synopsys:</span></div><div class="line"><a name="l01261"></a><span class="lineno"> 1261</span> <span class="comment">// GTEST_CHECK_(boolean_condition);</span></div><div class="line"><a name="l01262"></a><span class="lineno"> 1262</span> <span class="comment">// or</span></div><div class="line"><a name="l01263"></a><span class="lineno"> 1263</span> <span class="comment">// GTEST_CHECK_(boolean_condition) << "Additional message";</span></div><div class="line"><a name="l01264"></a><span class="lineno"> 1264</span> <span class="comment">//</span></div><div class="line"><a name="l01265"></a><span class="lineno"> 1265</span> <span class="comment">// This checks the condition and if the condition is not satisfied</span></div><div class="line"><a name="l01266"></a><span class="lineno"> 1266</span> <span class="comment">// it prints message about the condition violation, including the</span></div><div class="line"><a name="l01267"></a><span class="lineno"> 1267</span> <span class="comment">// condition itself, plus additional message streamed into it, if any,</span></div><div class="line"><a name="l01268"></a><span class="lineno"> 1268</span> <span class="comment">// and then it aborts the program. It aborts the program irrespective of</span></div><div class="line"><a name="l01269"></a><span class="lineno"> 1269</span> <span class="comment">// whether it is built in the debug mode or not.</span></div><div class="line"><a name="l01270"></a><span class="lineno"><a class="line" href="gtest_8h.html#ab54343f0a36dc4cb0ce8a478dd7847b8"> 1270</a></span> <span class="preprocessor"># define GTEST_CHECK_(condition) \</span></div><div class="line"><a name="l01271"></a><span class="lineno"> 1271</span> <span class="preprocessor"> GTEST_AMBIGUOUS_ELSE_BLOCKER_ \</span></div><div class="line"><a name="l01272"></a><span class="lineno"> 1272</span> <span class="preprocessor"> if (::testing::internal::IsTrue(condition)) \</span></div><div class="line"><a name="l01273"></a><span class="lineno"> 1273</span> <span class="preprocessor"> ; \</span></div><div class="line"><a name="l01274"></a><span class="lineno"> 1274</span> <span class="preprocessor"> else \</span></div><div class="line"><a name="l01275"></a><span class="lineno"> 1275</span> <span class="preprocessor"> GTEST_LOG_(FATAL) << "Condition " #condition " failed. "</span></div><div class="line"><a name="l01276"></a><span class="lineno"> 1276</span> <span class="preprocessor">#endif // !defined(GTEST_CHECK_)</span></div><div class="line"><a name="l01277"></a><span class="lineno"> 1277</span> </div><div class="line"><a name="l01278"></a><span class="lineno"> 1278</span> <span class="comment">// An all-mode assert to verify that the given POSIX-style function</span></div><div class="line"><a name="l01279"></a><span class="lineno"> 1279</span> <span class="comment">// call returns 0 (indicating success). Known limitation: this</span></div><div class="line"><a name="l01280"></a><span class="lineno"> 1280</span> <span class="comment">// doesn't expand to a balanced 'if' statement, so enclose the macro</span></div><div class="line"><a name="l01281"></a><span class="lineno"> 1281</span> <span class="comment">// in {} if you need to use it as the only statement in an 'if'</span></div><div class="line"><a name="l01282"></a><span class="lineno"> 1282</span> <span class="comment">// branch.</span></div><div class="line"><a name="l01283"></a><span class="lineno"><a class="line" href="gtest_8h.html#a38f6151210e363ad7c69a836b13cf0af"> 1283</a></span> <span class="preprocessor">#define GTEST_CHECK_POSIX_SUCCESS_(posix_call) \</span></div><div class="line"><a name="l01284"></a><span class="lineno"> 1284</span> <span class="preprocessor"> if (const int gtest_error = (posix_call)) \</span></div><div class="line"><a name="l01285"></a><span class="lineno"> 1285</span> <span class="preprocessor"> GTEST_LOG_(FATAL) << #posix_call << "failed with error " \</span></div><div class="line"><a name="l01286"></a><span class="lineno"> 1286</span> <span class="preprocessor"> << gtest_error</span></div><div class="line"><a name="l01287"></a><span class="lineno"> 1287</span> </div><div class="line"><a name="l01288"></a><span class="lineno"> 1288</span> <span class="comment">// Adds reference to a type if it is not a reference type,</span></div><div class="line"><a name="l01289"></a><span class="lineno"> 1289</span> <span class="comment">// otherwise leaves it unchanged. This is the same as</span></div><div class="line"><a name="l01290"></a><span class="lineno"> 1290</span> <span class="comment">// tr1::add_reference, which is not widely available yet.</span></div><div class="line"><a name="l01291"></a><span class="lineno"> 1291</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l01292"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_add_reference.html#a2df8dd7c4e41f6390e6e66b1a9a67bb4"> 1292</a></span> <span class="keyword">struct </span><a class="code" href="structtesting_1_1internal_1_1_add_reference.html">AddReference</a> { <span class="keyword">typedef</span> T& <a class="code" href="structtesting_1_1internal_1_1_add_reference.html#a2df8dd7c4e41f6390e6e66b1a9a67bb4">type</a>; }; <span class="comment">// NOLINT</span></div><div class="line"><a name="l01293"></a><span class="lineno"> 1293</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l01294"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_add_reference_3_01_t_01_6_01_4.html#a93c064cdcdaced0abd167258425e57af"> 1294</a></span> <span class="keyword">struct </span><a class="code" href="structtesting_1_1internal_1_1_add_reference.html">AddReference</a><T&> { <span class="keyword">typedef</span> T& <a class="code" href="structtesting_1_1internal_1_1_add_reference_3_01_t_01_6_01_4.html#a93c064cdcdaced0abd167258425e57af">type</a>; }; <span class="comment">// NOLINT</span></div><div class="line"><a name="l01295"></a><span class="lineno"> 1295</span> </div><div class="line"><a name="l01296"></a><span class="lineno"> 1296</span> <span class="comment">// A handy wrapper around AddReference that works when the argument T</span></div><div class="line"><a name="l01297"></a><span class="lineno"> 1297</span> <span class="comment">// depends on template parameters.</span></div><div class="line"><a name="l01298"></a><span class="lineno"><a class="line" href="gtest_8h.html#ab389953fc1f7e4efae30d182a0e0a13b"> 1298</a></span> <span class="preprocessor">#define GTEST_ADD_REFERENCE_(T) \</span></div><div class="line"><a name="l01299"></a><span class="lineno"> 1299</span> <span class="preprocessor"> typename ::testing::internal::AddReference<T>::type</span></div><div class="line"><a name="l01300"></a><span class="lineno"> 1300</span> </div><div class="line"><a name="l01301"></a><span class="lineno"> 1301</span> <span class="comment">// Transforms "T" into "const T&" according to standard reference collapsing</span></div><div class="line"><a name="l01302"></a><span class="lineno"> 1302</span> <span class="comment">// rules (this is only needed as a backport for C++98 compilers that do not</span></div><div class="line"><a name="l01303"></a><span class="lineno"> 1303</span> <span class="comment">// support reference collapsing). Specifically, it transforms:</span></div><div class="line"><a name="l01304"></a><span class="lineno"> 1304</span> <span class="comment">//</span></div><div class="line"><a name="l01305"></a><span class="lineno"> 1305</span> <span class="comment">// char ==> const char&</span></div><div class="line"><a name="l01306"></a><span class="lineno"> 1306</span> <span class="comment">// const char ==> const char&</span></div><div class="line"><a name="l01307"></a><span class="lineno"> 1307</span> <span class="comment">// char& ==> char&</span></div><div class="line"><a name="l01308"></a><span class="lineno"> 1308</span> <span class="comment">// const char& ==> const char&</span></div><div class="line"><a name="l01309"></a><span class="lineno"> 1309</span> <span class="comment">//</span></div><div class="line"><a name="l01310"></a><span class="lineno"> 1310</span> <span class="comment">// Note that the non-const reference will not have "const" added. This is</span></div><div class="line"><a name="l01311"></a><span class="lineno"> 1311</span> <span class="comment">// standard, and necessary so that "T" can always bind to "const T&".</span></div><div class="line"><a name="l01312"></a><span class="lineno"> 1312</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l01313"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_const_ref.html#a53610a4d0e72958332222b0a85f8937a"> 1313</a></span> <span class="keyword">struct </span><a class="code" href="structtesting_1_1internal_1_1_const_ref.html">ConstRef</a> { <span class="keyword">typedef</span> <span class="keyword">const</span> T& <a class="code" href="structtesting_1_1internal_1_1_const_ref.html#a53610a4d0e72958332222b0a85f8937a">type</a>; };</div><div class="line"><a name="l01314"></a><span class="lineno"> 1314</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l01315"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_const_ref_3_01_t_01_6_01_4.html#a9f664dd25649a0d260cfb1f610c7a349"> 1315</a></span> <span class="keyword">struct </span><a class="code" href="structtesting_1_1internal_1_1_const_ref.html">ConstRef</a><T&> { <span class="keyword">typedef</span> T& <a class="code" href="structtesting_1_1internal_1_1_const_ref_3_01_t_01_6_01_4.html#a9f664dd25649a0d260cfb1f610c7a349">type</a>; };</div><div class="line"><a name="l01316"></a><span class="lineno"> 1316</span> </div><div class="line"><a name="l01317"></a><span class="lineno"> 1317</span> <span class="comment">// The argument T must depend on some template parameters.</span></div><div class="line"><a name="l01318"></a><span class="lineno"><a class="line" href="gtest_8h.html#a9f91fcd24cae0b48fdaeb19102dac525"> 1318</a></span> <span class="preprocessor">#define GTEST_REFERENCE_TO_CONST_(T) \</span></div><div class="line"><a name="l01319"></a><span class="lineno"> 1319</span> <span class="preprocessor"> typename ::testing::internal::ConstRef<T>::type</span></div><div class="line"><a name="l01320"></a><span class="lineno"> 1320</span> </div><div class="line"><a name="l01321"></a><span class="lineno"> 1321</span> <span class="comment">// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.</span></div><div class="line"><a name="l01322"></a><span class="lineno"> 1322</span> <span class="comment">//</span></div><div class="line"><a name="l01323"></a><span class="lineno"> 1323</span> <span class="comment">// Use ImplicitCast_ as a safe version of static_cast for upcasting in</span></div><div class="line"><a name="l01324"></a><span class="lineno"> 1324</span> <span class="comment">// the type hierarchy (e.g. casting a Foo* to a SuperclassOfFoo* or a</span></div><div class="line"><a name="l01325"></a><span class="lineno"> 1325</span> <span class="comment">// const Foo*). When you use ImplicitCast_, the compiler checks that</span></div><div class="line"><a name="l01326"></a><span class="lineno"> 1326</span> <span class="comment">// the cast is safe. Such explicit ImplicitCast_s are necessary in</span></div><div class="line"><a name="l01327"></a><span class="lineno"> 1327</span> <span class="comment">// surprisingly many situations where C++ demands an exact type match</span></div><div class="line"><a name="l01328"></a><span class="lineno"> 1328</span> <span class="comment">// instead of an argument type convertable to a target type.</span></div><div class="line"><a name="l01329"></a><span class="lineno"> 1329</span> <span class="comment">//</span></div><div class="line"><a name="l01330"></a><span class="lineno"> 1330</span> <span class="comment">// The syntax for using ImplicitCast_ is the same as for static_cast:</span></div><div class="line"><a name="l01331"></a><span class="lineno"> 1331</span> <span class="comment">//</span></div><div class="line"><a name="l01332"></a><span class="lineno"> 1332</span> <span class="comment">// ImplicitCast_<ToType>(expr)</span></div><div class="line"><a name="l01333"></a><span class="lineno"> 1333</span> <span class="comment">//</span></div><div class="line"><a name="l01334"></a><span class="lineno"> 1334</span> <span class="comment">// ImplicitCast_ would have been part of the C++ standard library,</span></div><div class="line"><a name="l01335"></a><span class="lineno"> 1335</span> <span class="comment">// but the proposal was submitted too late. It will probably make</span></div><div class="line"><a name="l01336"></a><span class="lineno"> 1336</span> <span class="comment">// its way into the language in the future.</span></div><div class="line"><a name="l01337"></a><span class="lineno"> 1337</span> <span class="comment">//</span></div><div class="line"><a name="l01338"></a><span class="lineno"> 1338</span> <span class="comment">// This relatively ugly name is intentional. It prevents clashes with</span></div><div class="line"><a name="l01339"></a><span class="lineno"> 1339</span> <span class="comment">// similar functions users may have (e.g., implicit_cast). The internal</span></div><div class="line"><a name="l01340"></a><span class="lineno"> 1340</span> <span class="comment">// namespace alone is not enough because the function can be found by ADL.</span></div><div class="line"><a name="l01341"></a><span class="lineno"> 1341</span> <span class="keyword">template</span><<span class="keyword">typename</span> To></div><div class="line"><a name="l01342"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#a982df3f369643b175f79cda4048bc3b9"> 1342</a></span> <span class="keyword">inline</span> To <a class="code" href="namespacetesting_1_1internal.html#a982df3f369643b175f79cda4048bc3b9">ImplicitCast_</a>(To x) { <span class="keywordflow">return</span> x; }</div><div class="line"><a name="l01343"></a><span class="lineno"> 1343</span> </div><div class="line"><a name="l01344"></a><span class="lineno"> 1344</span> <span class="comment">// When you upcast (that is, cast a pointer from type Foo to type</span></div><div class="line"><a name="l01345"></a><span class="lineno"> 1345</span> <span class="comment">// SuperclassOfFoo), it's fine to use ImplicitCast_<>, since upcasts</span></div><div class="line"><a name="l01346"></a><span class="lineno"> 1346</span> <span class="comment">// always succeed. When you downcast (that is, cast a pointer from</span></div><div class="line"><a name="l01347"></a><span class="lineno"> 1347</span> <span class="comment">// type Foo to type SubclassOfFoo), static_cast<> isn't safe, because</span></div><div class="line"><a name="l01348"></a><span class="lineno"> 1348</span> <span class="comment">// how do you know the pointer is really of type SubclassOfFoo? It</span></div><div class="line"><a name="l01349"></a><span class="lineno"> 1349</span> <span class="comment">// could be a bare Foo, or of type DifferentSubclassOfFoo. Thus,</span></div><div class="line"><a name="l01350"></a><span class="lineno"> 1350</span> <span class="comment">// when you downcast, you should use this macro. In debug mode, we</span></div><div class="line"><a name="l01351"></a><span class="lineno"> 1351</span> <span class="comment">// use dynamic_cast<> to double-check the downcast is legal (we die</span></div><div class="line"><a name="l01352"></a><span class="lineno"> 1352</span> <span class="comment">// if it's not). In normal mode, we do the efficient static_cast<></span></div><div class="line"><a name="l01353"></a><span class="lineno"> 1353</span> <span class="comment">// instead. Thus, it's important to test in debug mode to make sure</span></div><div class="line"><a name="l01354"></a><span class="lineno"> 1354</span> <span class="comment">// the cast is legal!</span></div><div class="line"><a name="l01355"></a><span class="lineno"> 1355</span> <span class="comment">// This is the only place in the code we should use dynamic_cast<>.</span></div><div class="line"><a name="l01356"></a><span class="lineno"> 1356</span> <span class="comment">// In particular, you SHOULDN'T be using dynamic_cast<> in order to</span></div><div class="line"><a name="l01357"></a><span class="lineno"> 1357</span> <span class="comment">// do RTTI (eg code like this:</span></div><div class="line"><a name="l01358"></a><span class="lineno"> 1358</span> <span class="comment">// if (dynamic_cast<Subclass1>(foo)) HandleASubclass1Object(foo);</span></div><div class="line"><a name="l01359"></a><span class="lineno"> 1359</span> <span class="comment">// if (dynamic_cast<Subclass2>(foo)) HandleASubclass2Object(foo);</span></div><div class="line"><a name="l01360"></a><span class="lineno"> 1360</span> <span class="comment">// You should design the code some other way not to need this.</span></div><div class="line"><a name="l01361"></a><span class="lineno"> 1361</span> <span class="comment">//</span></div><div class="line"><a name="l01362"></a><span class="lineno"> 1362</span> <span class="comment">// This relatively ugly name is intentional. It prevents clashes with</span></div><div class="line"><a name="l01363"></a><span class="lineno"> 1363</span> <span class="comment">// similar functions users may have (e.g., down_cast). The internal</span></div><div class="line"><a name="l01364"></a><span class="lineno"> 1364</span> <span class="comment">// namespace alone is not enough because the function can be found by ADL.</span></div><div class="line"><a name="l01365"></a><span class="lineno"> 1365</span> <span class="keyword">template</span><<span class="keyword">typename</span> To, <span class="keyword">typename</span> From> <span class="comment">// use like this: DownCast_<T*>(foo);</span></div><div class="line"><a name="l01366"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#a1a1a1aed3fe00908b8a45d5ab4a33665"> 1366</a></span> <span class="keyword">inline</span> To <a class="code" href="namespacetesting_1_1internal.html#a1a1a1aed3fe00908b8a45d5ab4a33665">DownCast_</a>(From* f) { <span class="comment">// so we only accept pointers</span></div><div class="line"><a name="l01367"></a><span class="lineno"> 1367</span>  <span class="comment">// Ensures that To is a sub-type of From *. This test is here only</span></div><div class="line"><a name="l01368"></a><span class="lineno"> 1368</span>  <span class="comment">// for compile-time type checking, and has no overhead in an</span></div><div class="line"><a name="l01369"></a><span class="lineno"> 1369</span>  <span class="comment">// optimized build at run-time, as it will be optimized away</span></div><div class="line"><a name="l01370"></a><span class="lineno"> 1370</span>  <span class="comment">// completely.</span></div><div class="line"><a name="l01371"></a><span class="lineno"> 1371</span>  <a class="code" href="gtest_8h.html#a69b0cadb05bf2a1ef96151243c6b6241">GTEST_INTENTIONAL_CONST_COND_PUSH_</a>()</div><div class="line"><a name="l01372"></a><span class="lineno"> 1372</span>  <span class="keywordflow">if</span> (<span class="keyword">false</span>) {</div><div class="line"><a name="l01373"></a><span class="lineno"> 1373</span>  <a class="code" href="gtest_8h.html#ad115e2c466f7e8a32f1cf23ef2e5f220">GTEST_INTENTIONAL_CONST_COND_POP_</a>()</div><div class="line"><a name="l01374"></a><span class="lineno"> 1374</span>  <span class="keyword">const</span> To to = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l01375"></a><span class="lineno"> 1375</span>  ::testing::internal::ImplicitCast_<From*>(to);</div><div class="line"><a name="l01376"></a><span class="lineno"> 1376</span>  }</div><div class="line"><a name="l01377"></a><span class="lineno"> 1377</span> </div><div class="line"><a name="l01378"></a><span class="lineno"> 1378</span> <span class="preprocessor">#if GTEST_HAS_RTTI</span></div><div class="line"><a name="l01379"></a><span class="lineno"> 1379</span>  <span class="comment">// RTTI: debug mode only!</span></div><div class="line"><a name="l01380"></a><span class="lineno"> 1380</span>  <a class="code" href="gtest_8h.html#ab54343f0a36dc4cb0ce8a478dd7847b8">GTEST_CHECK_</a>(f == <span class="keyword">nullptr</span> || dynamic_cast<To>(f) != <span class="keyword">nullptr</span>);</div><div class="line"><a name="l01381"></a><span class="lineno"> 1381</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l01382"></a><span class="lineno"> 1382</span>  <span class="keywordflow">return</span> <span class="keyword">static_cast<</span>To<span class="keyword">></span>(f);</div><div class="line"><a name="l01383"></a><span class="lineno"> 1383</span> }</div><div class="line"><a name="l01384"></a><span class="lineno"> 1384</span> </div><div class="line"><a name="l01385"></a><span class="lineno"> 1385</span> <span class="comment">// Downcasts the pointer of type Base to Derived.</span></div><div class="line"><a name="l01386"></a><span class="lineno"> 1386</span> <span class="comment">// Derived must be a subclass of Base. The parameter MUST</span></div><div class="line"><a name="l01387"></a><span class="lineno"> 1387</span> <span class="comment">// point to a class of type Derived, not any subclass of it.</span></div><div class="line"><a name="l01388"></a><span class="lineno"> 1388</span> <span class="comment">// When RTTI is available, the function performs a runtime</span></div><div class="line"><a name="l01389"></a><span class="lineno"> 1389</span> <span class="comment">// check to enforce this.</span></div><div class="line"><a name="l01390"></a><span class="lineno"> 1390</span> <span class="keyword">template</span> <<span class="keyword">class</span> Derived, <span class="keyword">class</span> Base></div><div class="line"><a name="l01391"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#abfe9bfb020d38aa4e0e12c001911b22b"> 1391</a></span> Derived* <a class="code" href="namespacetesting_1_1internal.html#abfe9bfb020d38aa4e0e12c001911b22b">CheckedDowncastToActualType</a>(Base* base) {</div><div class="line"><a name="l01392"></a><span class="lineno"> 1392</span> <span class="preprocessor">#if GTEST_HAS_RTTI</span></div><div class="line"><a name="l01393"></a><span class="lineno"> 1393</span>  <a class="code" href="gtest_8h.html#ab54343f0a36dc4cb0ce8a478dd7847b8">GTEST_CHECK_</a>(<span class="keyword">typeid</span>(*base) == <span class="keyword">typeid</span>(Derived));</div><div class="line"><a name="l01394"></a><span class="lineno"> 1394</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l01395"></a><span class="lineno"> 1395</span> </div><div class="line"><a name="l01396"></a><span class="lineno"> 1396</span> <span class="preprocessor">#if GTEST_HAS_DOWNCAST_</span></div><div class="line"><a name="l01397"></a><span class="lineno"> 1397</span>  return ::down_cast<Derived*>(base);</div><div class="line"><a name="l01398"></a><span class="lineno"> 1398</span> <span class="preprocessor">#elif GTEST_HAS_RTTI</span></div><div class="line"><a name="l01399"></a><span class="lineno"> 1399</span>  <span class="keywordflow">return</span> <span class="keyword">dynamic_cast<</span>Derived*<span class="keyword">></span>(base); <span class="comment">// NOLINT</span></div><div class="line"><a name="l01400"></a><span class="lineno"> 1400</span> <span class="preprocessor">#else</span></div><div class="line"><a name="l01401"></a><span class="lineno"> 1401</span>  <span class="keywordflow">return</span> <span class="keyword">static_cast<</span>Derived*<span class="keyword">></span>(base); <span class="comment">// Poor man's downcast.</span></div><div class="line"><a name="l01402"></a><span class="lineno"> 1402</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l01403"></a><span class="lineno"> 1403</span> }</div><div class="line"><a name="l01404"></a><span class="lineno"> 1404</span> </div><div class="line"><a name="l01405"></a><span class="lineno"> 1405</span> <span class="preprocessor">#if GTEST_HAS_STREAM_REDIRECTION</span></div><div class="line"><a name="l01406"></a><span class="lineno"> 1406</span> </div><div class="line"><a name="l01407"></a><span class="lineno"> 1407</span> <span class="comment">// Defines the stderr capturer:</span></div><div class="line"><a name="l01408"></a><span class="lineno"> 1408</span> <span class="comment">// CaptureStdout - starts capturing stdout.</span></div><div class="line"><a name="l01409"></a><span class="lineno"> 1409</span> <span class="comment">// GetCapturedStdout - stops capturing stdout and returns the captured string.</span></div><div class="line"><a name="l01410"></a><span class="lineno"> 1410</span> <span class="comment">// CaptureStderr - starts capturing stderr.</span></div><div class="line"><a name="l01411"></a><span class="lineno"> 1411</span> <span class="comment">// GetCapturedStderr - stops capturing stderr and returns the captured string.</span></div><div class="line"><a name="l01412"></a><span class="lineno"> 1412</span> <span class="comment">//</span></div><div class="line"><a name="l01413"></a><span class="lineno"> 1413</span> <a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> <span class="keywordtype">void</span> <a class="code" href="namespacetesting_1_1internal.html#acba06d4f0343dec407738ba5544af990">CaptureStdout</a>();</div><div class="line"><a name="l01414"></a><span class="lineno"> 1414</span> <a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a> <a class="code" href="namespacetesting_1_1internal.html#aed657219a9856a8d249a3230de0c54ce">GetCapturedStdout</a>();</div><div class="line"><a name="l01415"></a><span class="lineno"> 1415</span> <a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> <span class="keywordtype">void</span> <a class="code" href="namespacetesting_1_1internal.html#a8ec00d458d0d442bd64af7b5f9c22dda">CaptureStderr</a>();</div><div class="line"><a name="l01416"></a><span class="lineno"> 1416</span> <a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a> <a class="code" href="namespacetesting_1_1internal.html#a374156401da17704099d0c33fa53adfb">GetCapturedStderr</a>();</div><div class="line"><a name="l01417"></a><span class="lineno"> 1417</span> </div><div class="line"><a name="l01418"></a><span class="lineno"> 1418</span> <span class="preprocessor">#endif // GTEST_HAS_STREAM_REDIRECTION</span></div><div class="line"><a name="l01419"></a><span class="lineno"> 1419</span> <span class="comment">// Returns the size (in bytes) of a file.</span></div><div class="line"><a name="l01420"></a><span class="lineno"> 1420</span> <a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> <span class="keywordtype">size_t</span> <a class="code" href="namespacetesting_1_1internal.html#a40bcfd87e26aae36e0cc51e5db64fd89">GetFileSize</a>(FILE* file);</div><div class="line"><a name="l01421"></a><span class="lineno"> 1421</span> </div><div class="line"><a name="l01422"></a><span class="lineno"> 1422</span> <span class="comment">// Reads the entire content of a file as a string.</span></div><div class="line"><a name="l01423"></a><span class="lineno"> 1423</span> <a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a> <a class="code" href="namespacetesting_1_1internal.html#ab81b0af2a0131ea54dc11de00d5e6e51">ReadEntireFile</a>(FILE* file);</div><div class="line"><a name="l01424"></a><span class="lineno"> 1424</span> </div><div class="line"><a name="l01425"></a><span class="lineno"> 1425</span> <span class="comment">// All command line arguments.</span></div><div class="line"><a name="l01426"></a><span class="lineno"> 1426</span> <a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> std::vector<std::string> <a class="code" href="namespacetesting_1_1internal.html#a8d8ed3acadedd9c0db28d35a188973ea">GetArgvs</a>();</div><div class="line"><a name="l01427"></a><span class="lineno"> 1427</span> </div><div class="line"><a name="l01428"></a><span class="lineno"> 1428</span> <span class="preprocessor">#if GTEST_HAS_DEATH_TEST</span></div><div class="line"><a name="l01429"></a><span class="lineno"> 1429</span> </div><div class="line"><a name="l01430"></a><span class="lineno"> 1430</span> std::vector<std::string> GetInjectableArgvs();</div><div class="line"><a name="l01431"></a><span class="lineno"> 1431</span> <span class="comment">// Deprecated: pass the args vector by value instead.</span></div><div class="line"><a name="l01432"></a><span class="lineno"> 1432</span> <span class="keywordtype">void</span> SetInjectableArgvs(<span class="keyword">const</span> std::vector<std::string>* new_argvs);</div><div class="line"><a name="l01433"></a><span class="lineno"> 1433</span> <span class="keywordtype">void</span> SetInjectableArgvs(<span class="keyword">const</span> std::vector<std::string>& new_argvs);</div><div class="line"><a name="l01434"></a><span class="lineno"> 1434</span> <span class="preprocessor">#if GTEST_HAS_GLOBAL_STRING</span></div><div class="line"><a name="l01435"></a><span class="lineno"> 1435</span> <span class="keywordtype">void</span> SetInjectableArgvs(<span class="keyword">const</span> std::vector< ::string>& new_argvs);</div><div class="line"><a name="l01436"></a><span class="lineno"> 1436</span> <span class="preprocessor">#endif // GTEST_HAS_GLOBAL_STRING</span></div><div class="line"><a name="l01437"></a><span class="lineno"> 1437</span> <span class="keywordtype">void</span> ClearInjectableArgvs();</div><div class="line"><a name="l01438"></a><span class="lineno"> 1438</span> </div><div class="line"><a name="l01439"></a><span class="lineno"> 1439</span> <span class="preprocessor">#endif // GTEST_HAS_DEATH_TEST</span></div><div class="line"><a name="l01440"></a><span class="lineno"> 1440</span> </div><div class="line"><a name="l01441"></a><span class="lineno"> 1441</span> <span class="comment">// Defines synchronization primitives.</span></div><div class="line"><a name="l01442"></a><span class="lineno"> 1442</span> <span class="preprocessor">#if GTEST_IS_THREADSAFE</span></div><div class="line"><a name="l01443"></a><span class="lineno"> 1443</span> <span class="preprocessor"># if GTEST_HAS_PTHREAD</span></div><div class="line"><a name="l01444"></a><span class="lineno"> 1444</span> <span class="comment">// Sleeps for (roughly) n milliseconds. This function is only for testing</span></div><div class="line"><a name="l01445"></a><span class="lineno"> 1445</span> <span class="comment">// Google Test's own constructs. Don't use it in user tests, either</span></div><div class="line"><a name="l01446"></a><span class="lineno"> 1446</span> <span class="comment">// directly or indirectly.</span></div><div class="line"><a name="l01447"></a><span class="lineno"> 1447</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> SleepMilliseconds(<span class="keywordtype">int</span> n) {</div><div class="line"><a name="l01448"></a><span class="lineno"> 1448</span>  <span class="keyword">const</span> timespec time = {</div><div class="line"><a name="l01449"></a><span class="lineno"> 1449</span>  0, <span class="comment">// 0 seconds.</span></div><div class="line"><a name="l01450"></a><span class="lineno"> 1450</span>  n * 1000L * 1000L, <span class="comment">// And n ms.</span></div><div class="line"><a name="l01451"></a><span class="lineno"> 1451</span>  };</div><div class="line"><a name="l01452"></a><span class="lineno"> 1452</span>  nanosleep(&time, <span class="keyword">nullptr</span>);</div><div class="line"><a name="l01453"></a><span class="lineno"> 1453</span> }</div><div class="line"><a name="l01454"></a><span class="lineno"> 1454</span> <span class="preprocessor"># endif // GTEST_HAS_PTHREAD</span></div><div class="line"><a name="l01455"></a><span class="lineno"> 1455</span> </div><div class="line"><a name="l01456"></a><span class="lineno"> 1456</span> <span class="preprocessor"># if GTEST_HAS_NOTIFICATION_</span></div><div class="line"><a name="l01457"></a><span class="lineno"> 1457</span> <span class="comment">// Notification has already been imported into the namespace.</span></div><div class="line"><a name="l01458"></a><span class="lineno"> 1458</span> <span class="comment">// Nothing to do here.</span></div><div class="line"><a name="l01459"></a><span class="lineno"> 1459</span> </div><div class="line"><a name="l01460"></a><span class="lineno"> 1460</span> <span class="preprocessor"># elif GTEST_HAS_PTHREAD</span></div><div class="line"><a name="l01461"></a><span class="lineno"> 1461</span> <span class="comment">// Allows a controller thread to pause execution of newly created</span></div><div class="line"><a name="l01462"></a><span class="lineno"> 1462</span> <span class="comment">// threads until notified. Instances of this class must be created</span></div><div class="line"><a name="l01463"></a><span class="lineno"> 1463</span> <span class="comment">// and destroyed in the controller thread.</span></div><div class="line"><a name="l01464"></a><span class="lineno"> 1464</span> <span class="comment">//</span></div><div class="line"><a name="l01465"></a><span class="lineno"> 1465</span> <span class="comment">// This class is only for testing Google Test's own constructs. Do not</span></div><div class="line"><a name="l01466"></a><span class="lineno"> 1466</span> <span class="comment">// use it in user tests, either directly or indirectly.</span></div><div class="line"><a name="l01467"></a><span class="lineno"> 1467</span> <span class="keyword">class </span>Notification {</div><div class="line"><a name="l01468"></a><span class="lineno"> 1468</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l01469"></a><span class="lineno"> 1469</span>  Notification() : notified_(false) {</div><div class="line"><a name="l01470"></a><span class="lineno"> 1470</span>  <a class="code" href="gtest_8h.html#a38f6151210e363ad7c69a836b13cf0af">GTEST_CHECK_POSIX_SUCCESS_</a>(pthread_mutex_init(&mutex_, <span class="keyword">nullptr</span>));</div><div class="line"><a name="l01471"></a><span class="lineno"> 1471</span>  }</div><div class="line"><a name="l01472"></a><span class="lineno"> 1472</span>  ~Notification() {</div><div class="line"><a name="l01473"></a><span class="lineno"> 1473</span>  pthread_mutex_destroy(&mutex_);</div><div class="line"><a name="l01474"></a><span class="lineno"> 1474</span>  }</div><div class="line"><a name="l01475"></a><span class="lineno"> 1475</span> </div><div class="line"><a name="l01476"></a><span class="lineno"> 1476</span>  <span class="comment">// Notifies all threads created with this notification to start. Must</span></div><div class="line"><a name="l01477"></a><span class="lineno"> 1477</span>  <span class="comment">// be called from the controller thread.</span></div><div class="line"><a name="l01478"></a><span class="lineno"> 1478</span>  <span class="keywordtype">void</span> Notify() {</div><div class="line"><a name="l01479"></a><span class="lineno"> 1479</span>  pthread_mutex_lock(&mutex_);</div><div class="line"><a name="l01480"></a><span class="lineno"> 1480</span>  notified_ = <span class="keyword">true</span>;</div><div class="line"><a name="l01481"></a><span class="lineno"> 1481</span>  pthread_mutex_unlock(&mutex_);</div><div class="line"><a name="l01482"></a><span class="lineno"> 1482</span>  }</div><div class="line"><a name="l01483"></a><span class="lineno"> 1483</span> </div><div class="line"><a name="l01484"></a><span class="lineno"> 1484</span>  <span class="comment">// Blocks until the controller thread notifies. Must be called from a test</span></div><div class="line"><a name="l01485"></a><span class="lineno"> 1485</span>  <span class="comment">// thread.</span></div><div class="line"><a name="l01486"></a><span class="lineno"> 1486</span>  <span class="keywordtype">void</span> WaitForNotification() {</div><div class="line"><a name="l01487"></a><span class="lineno"> 1487</span>  <span class="keywordflow">for</span> (;;) {</div><div class="line"><a name="l01488"></a><span class="lineno"> 1488</span>  pthread_mutex_lock(&mutex_);</div><div class="line"><a name="l01489"></a><span class="lineno"> 1489</span>  <span class="keyword">const</span> <span class="keywordtype">bool</span> notified = notified_;</div><div class="line"><a name="l01490"></a><span class="lineno"> 1490</span>  pthread_mutex_unlock(&mutex_);</div><div class="line"><a name="l01491"></a><span class="lineno"> 1491</span>  <span class="keywordflow">if</span> (notified)</div><div class="line"><a name="l01492"></a><span class="lineno"> 1492</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l01493"></a><span class="lineno"> 1493</span>  SleepMilliseconds(10);</div><div class="line"><a name="l01494"></a><span class="lineno"> 1494</span>  }</div><div class="line"><a name="l01495"></a><span class="lineno"> 1495</span>  }</div><div class="line"><a name="l01496"></a><span class="lineno"> 1496</span> </div><div class="line"><a name="l01497"></a><span class="lineno"> 1497</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l01498"></a><span class="lineno"> 1498</span>  pthread_mutex_t mutex_;</div><div class="line"><a name="l01499"></a><span class="lineno"> 1499</span>  <span class="keywordtype">bool</span> notified_;</div><div class="line"><a name="l01500"></a><span class="lineno"> 1500</span> </div><div class="line"><a name="l01501"></a><span class="lineno"> 1501</span>  <a class="code" href="gtest_8h.html#aed8c1888c32b588b0681e88b95031e29">GTEST_DISALLOW_COPY_AND_ASSIGN_</a>(Notification);</div><div class="line"><a name="l01502"></a><span class="lineno"> 1502</span> };</div><div class="line"><a name="l01503"></a><span class="lineno"> 1503</span> </div><div class="line"><a name="l01504"></a><span class="lineno"> 1504</span> <span class="preprocessor"># elif GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT</span></div><div class="line"><a name="l01505"></a><span class="lineno"> 1505</span> </div><div class="line"><a name="l01506"></a><span class="lineno"> 1506</span> <a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> <span class="keywordtype">void</span> SleepMilliseconds(<span class="keywordtype">int</span> n);</div><div class="line"><a name="l01507"></a><span class="lineno"> 1507</span> </div><div class="line"><a name="l01508"></a><span class="lineno"> 1508</span> <span class="comment">// Provides leak-safe Windows kernel handle ownership.</span></div><div class="line"><a name="l01509"></a><span class="lineno"> 1509</span> <span class="comment">// Used in death tests and in threading support.</span></div><div class="line"><a name="l01510"></a><span class="lineno"> 1510</span> <span class="keyword">class </span><a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> AutoHandle {</div><div class="line"><a name="l01511"></a><span class="lineno"> 1511</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l01512"></a><span class="lineno"> 1512</span>  <span class="comment">// Assume that Win32 HANDLE type is equivalent to void*. Doing so allows us to</span></div><div class="line"><a name="l01513"></a><span class="lineno"> 1513</span>  <span class="comment">// avoid including <windows.h> in this header file. Including <windows.h> is</span></div><div class="line"><a name="l01514"></a><span class="lineno"> 1514</span>  <span class="comment">// undesirable because it defines a lot of symbols and macros that tend to</span></div><div class="line"><a name="l01515"></a><span class="lineno"> 1515</span>  <span class="comment">// conflict with client code. This assumption is verified by</span></div><div class="line"><a name="l01516"></a><span class="lineno"> 1516</span>  <span class="comment">// WindowsTypesTest.HANDLEIsVoidStar.</span></div><div class="line"><a name="l01517"></a><span class="lineno"> 1517</span>  <span class="keyword">typedef</span> <span class="keywordtype">void</span>* Handle;</div><div class="line"><a name="l01518"></a><span class="lineno"> 1518</span>  AutoHandle();</div><div class="line"><a name="l01519"></a><span class="lineno"> 1519</span>  <span class="keyword">explicit</span> AutoHandle(Handle handle);</div><div class="line"><a name="l01520"></a><span class="lineno"> 1520</span> </div><div class="line"><a name="l01521"></a><span class="lineno"> 1521</span>  ~AutoHandle();</div><div class="line"><a name="l01522"></a><span class="lineno"> 1522</span> </div><div class="line"><a name="l01523"></a><span class="lineno"> 1523</span>  Handle Get() <span class="keyword">const</span>;</div><div class="line"><a name="l01524"></a><span class="lineno"> 1524</span>  <span class="keywordtype">void</span> Reset();</div><div class="line"><a name="l01525"></a><span class="lineno"> 1525</span>  <span class="keywordtype">void</span> Reset(Handle handle);</div><div class="line"><a name="l01526"></a><span class="lineno"> 1526</span> </div><div class="line"><a name="l01527"></a><span class="lineno"> 1527</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l01528"></a><span class="lineno"> 1528</span>  <span class="comment">// Returns true iff the handle is a valid handle object that can be closed.</span></div><div class="line"><a name="l01529"></a><span class="lineno"> 1529</span>  <span class="keywordtype">bool</span> IsCloseable() <span class="keyword">const</span>;</div><div class="line"><a name="l01530"></a><span class="lineno"> 1530</span> </div><div class="line"><a name="l01531"></a><span class="lineno"> 1531</span>  Handle handle_;</div><div class="line"><a name="l01532"></a><span class="lineno"> 1532</span> </div><div class="line"><a name="l01533"></a><span class="lineno"> 1533</span>  <a class="code" href="gtest_8h.html#aed8c1888c32b588b0681e88b95031e29">GTEST_DISALLOW_COPY_AND_ASSIGN_</a>(AutoHandle);</div><div class="line"><a name="l01534"></a><span class="lineno"> 1534</span> };</div><div class="line"><a name="l01535"></a><span class="lineno"> 1535</span> </div><div class="line"><a name="l01536"></a><span class="lineno"> 1536</span> <span class="comment">// Allows a controller thread to pause execution of newly created</span></div><div class="line"><a name="l01537"></a><span class="lineno"> 1537</span> <span class="comment">// threads until notified. Instances of this class must be created</span></div><div class="line"><a name="l01538"></a><span class="lineno"> 1538</span> <span class="comment">// and destroyed in the controller thread.</span></div><div class="line"><a name="l01539"></a><span class="lineno"> 1539</span> <span class="comment">//</span></div><div class="line"><a name="l01540"></a><span class="lineno"> 1540</span> <span class="comment">// This class is only for testing Google Test's own constructs. Do not</span></div><div class="line"><a name="l01541"></a><span class="lineno"> 1541</span> <span class="comment">// use it in user tests, either directly or indirectly.</span></div><div class="line"><a name="l01542"></a><span class="lineno"> 1542</span> <span class="keyword">class </span><a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> Notification {</div><div class="line"><a name="l01543"></a><span class="lineno"> 1543</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l01544"></a><span class="lineno"> 1544</span>  Notification();</div><div class="line"><a name="l01545"></a><span class="lineno"> 1545</span>  <span class="keywordtype">void</span> Notify();</div><div class="line"><a name="l01546"></a><span class="lineno"> 1546</span>  <span class="keywordtype">void</span> WaitForNotification();</div><div class="line"><a name="l01547"></a><span class="lineno"> 1547</span> </div><div class="line"><a name="l01548"></a><span class="lineno"> 1548</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l01549"></a><span class="lineno"> 1549</span>  AutoHandle event_;</div><div class="line"><a name="l01550"></a><span class="lineno"> 1550</span> </div><div class="line"><a name="l01551"></a><span class="lineno"> 1551</span>  <a class="code" href="gtest_8h.html#aed8c1888c32b588b0681e88b95031e29">GTEST_DISALLOW_COPY_AND_ASSIGN_</a>(Notification);</div><div class="line"><a name="l01552"></a><span class="lineno"> 1552</span> };</div><div class="line"><a name="l01553"></a><span class="lineno"> 1553</span> <span class="preprocessor"># endif // GTEST_HAS_NOTIFICATION_</span></div><div class="line"><a name="l01554"></a><span class="lineno"> 1554</span> </div><div class="line"><a name="l01555"></a><span class="lineno"> 1555</span> <span class="comment">// On MinGW, we can have both GTEST_OS_WINDOWS and GTEST_HAS_PTHREAD</span></div><div class="line"><a name="l01556"></a><span class="lineno"> 1556</span> <span class="comment">// defined, but we don't want to use MinGW's pthreads implementation, which</span></div><div class="line"><a name="l01557"></a><span class="lineno"> 1557</span> <span class="comment">// has conformance problems with some versions of the POSIX standard.</span></div><div class="line"><a name="l01558"></a><span class="lineno"> 1558</span> <span class="preprocessor"># if GTEST_HAS_PTHREAD && !GTEST_OS_WINDOWS_MINGW</span></div><div class="line"><a name="l01559"></a><span class="lineno"> 1559</span> </div><div class="line"><a name="l01560"></a><span class="lineno"> 1560</span> <span class="comment">// As a C-function, ThreadFuncWithCLinkage cannot be templated itself.</span></div><div class="line"><a name="l01561"></a><span class="lineno"> 1561</span> <span class="comment">// Consequently, it cannot select a correct instantiation of ThreadWithParam</span></div><div class="line"><a name="l01562"></a><span class="lineno"> 1562</span> <span class="comment">// in order to call its Run(). Introducing ThreadWithParamBase as a</span></div><div class="line"><a name="l01563"></a><span class="lineno"> 1563</span> <span class="comment">// non-templated base class for ThreadWithParam allows us to bypass this</span></div><div class="line"><a name="l01564"></a><span class="lineno"> 1564</span> <span class="comment">// problem.</span></div><div class="line"><a name="l01565"></a><span class="lineno"> 1565</span> <span class="keyword">class </span>ThreadWithParamBase {</div><div class="line"><a name="l01566"></a><span class="lineno"> 1566</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l01567"></a><span class="lineno"> 1567</span>  <span class="keyword">virtual</span> ~ThreadWithParamBase() {}</div><div class="line"><a name="l01568"></a><span class="lineno"> 1568</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> Run() = 0;</div><div class="line"><a name="l01569"></a><span class="lineno"> 1569</span> };</div><div class="line"><a name="l01570"></a><span class="lineno"> 1570</span> </div><div class="line"><a name="l01571"></a><span class="lineno"> 1571</span> <span class="comment">// pthread_create() accepts a pointer to a function type with the C linkage.</span></div><div class="line"><a name="l01572"></a><span class="lineno"> 1572</span> <span class="comment">// According to the Standard (7.5/1), function types with different linkages</span></div><div class="line"><a name="l01573"></a><span class="lineno"> 1573</span> <span class="comment">// are different even if they are otherwise identical. Some compilers (for</span></div><div class="line"><a name="l01574"></a><span class="lineno"> 1574</span> <span class="comment">// example, SunStudio) treat them as different types. Since class methods</span></div><div class="line"><a name="l01575"></a><span class="lineno"> 1575</span> <span class="comment">// cannot be defined with C-linkage we need to define a free C-function to</span></div><div class="line"><a name="l01576"></a><span class="lineno"> 1576</span> <span class="comment">// pass into pthread_create().</span></div><div class="line"><a name="l01577"></a><span class="lineno"> 1577</span> <span class="keyword">extern</span> <span class="stringliteral">"C"</span> <span class="keyword">inline</span> <span class="keywordtype">void</span>* ThreadFuncWithCLinkage(<span class="keywordtype">void</span>* thread) {</div><div class="line"><a name="l01578"></a><span class="lineno"> 1578</span>  <span class="keyword">static_cast<</span>ThreadWithParamBase*<span class="keyword">></span>(thread)->Run();</div><div class="line"><a name="l01579"></a><span class="lineno"> 1579</span>  <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div><div class="line"><a name="l01580"></a><span class="lineno"> 1580</span> }</div><div class="line"><a name="l01581"></a><span class="lineno"> 1581</span> </div><div class="line"><a name="l01582"></a><span class="lineno"> 1582</span> <span class="comment">// Helper class for testing Google Test's multi-threading constructs.</span></div><div class="line"><a name="l01583"></a><span class="lineno"> 1583</span> <span class="comment">// To use it, write:</span></div><div class="line"><a name="l01584"></a><span class="lineno"> 1584</span> <span class="comment">//</span></div><div class="line"><a name="l01585"></a><span class="lineno"> 1585</span> <span class="comment">// void ThreadFunc(int param) { /* Do things with param */ }</span></div><div class="line"><a name="l01586"></a><span class="lineno"> 1586</span> <span class="comment">// Notification thread_can_start;</span></div><div class="line"><a name="l01587"></a><span class="lineno"> 1587</span> <span class="comment">// ...</span></div><div class="line"><a name="l01588"></a><span class="lineno"> 1588</span> <span class="comment">// // The thread_can_start parameter is optional; you can supply NULL.</span></div><div class="line"><a name="l01589"></a><span class="lineno"> 1589</span> <span class="comment">// ThreadWithParam<int> thread(&ThreadFunc, 5, &thread_can_start);</span></div><div class="line"><a name="l01590"></a><span class="lineno"> 1590</span> <span class="comment">// thread_can_start.Notify();</span></div><div class="line"><a name="l01591"></a><span class="lineno"> 1591</span> <span class="comment">//</span></div><div class="line"><a name="l01592"></a><span class="lineno"> 1592</span> <span class="comment">// These classes are only for testing Google Test's own constructs. Do</span></div><div class="line"><a name="l01593"></a><span class="lineno"> 1593</span> <span class="comment">// not use them in user tests, either directly or indirectly.</span></div><div class="line"><a name="l01594"></a><span class="lineno"> 1594</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l01595"></a><span class="lineno"> 1595</span> <span class="keyword">class </span>ThreadWithParam : <span class="keyword">public</span> ThreadWithParamBase {</div><div class="line"><a name="l01596"></a><span class="lineno"> 1596</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l01597"></a><span class="lineno"> 1597</span>  <span class="keyword">typedef</span> <span class="keywordtype">void</span> UserThreadFunc(T);</div><div class="line"><a name="l01598"></a><span class="lineno"> 1598</span> </div><div class="line"><a name="l01599"></a><span class="lineno"> 1599</span>  ThreadWithParam(UserThreadFunc* func, T param, Notification* thread_can_start)</div><div class="line"><a name="l01600"></a><span class="lineno"> 1600</span>  : func_(func),</div><div class="line"><a name="l01601"></a><span class="lineno"> 1601</span>  param_(param),</div><div class="line"><a name="l01602"></a><span class="lineno"> 1602</span>  thread_can_start_(thread_can_start),</div><div class="line"><a name="l01603"></a><span class="lineno"> 1603</span>  finished_(false) {</div><div class="line"><a name="l01604"></a><span class="lineno"> 1604</span>  ThreadWithParamBase* <span class="keyword">const</span> base = <span class="keyword">this</span>;</div><div class="line"><a name="l01605"></a><span class="lineno"> 1605</span>  <span class="comment">// The thread can be created only after all fields except thread_</span></div><div class="line"><a name="l01606"></a><span class="lineno"> 1606</span>  <span class="comment">// have been initialized.</span></div><div class="line"><a name="l01607"></a><span class="lineno"> 1607</span>  <a class="code" href="gtest_8h.html#a38f6151210e363ad7c69a836b13cf0af">GTEST_CHECK_POSIX_SUCCESS_</a>(</div><div class="line"><a name="l01608"></a><span class="lineno"> 1608</span>  pthread_create(&thread_, <span class="keyword">nullptr</span>, &ThreadFuncWithCLinkage, base));</div><div class="line"><a name="l01609"></a><span class="lineno"> 1609</span>  }</div><div class="line"><a name="l01610"></a><span class="lineno"> 1610</span>  ~ThreadWithParam()<span class="keyword"> override </span>{ Join(); }</div><div class="line"><a name="l01611"></a><span class="lineno"> 1611</span> </div><div class="line"><a name="l01612"></a><span class="lineno"> 1612</span>  <span class="keywordtype">void</span> Join() {</div><div class="line"><a name="l01613"></a><span class="lineno"> 1613</span>  <span class="keywordflow">if</span> (!finished_) {</div><div class="line"><a name="l01614"></a><span class="lineno"> 1614</span>  <a class="code" href="gtest_8h.html#a38f6151210e363ad7c69a836b13cf0af">GTEST_CHECK_POSIX_SUCCESS_</a>(pthread_join(thread_, <span class="keyword">nullptr</span>));</div><div class="line"><a name="l01615"></a><span class="lineno"> 1615</span>  finished_ = <span class="keyword">true</span>;</div><div class="line"><a name="l01616"></a><span class="lineno"> 1616</span>  }</div><div class="line"><a name="l01617"></a><span class="lineno"> 1617</span>  }</div><div class="line"><a name="l01618"></a><span class="lineno"> 1618</span> </div><div class="line"><a name="l01619"></a><span class="lineno"> 1619</span>  <span class="keywordtype">void</span> Run()<span class="keyword"> override </span>{</div><div class="line"><a name="l01620"></a><span class="lineno"> 1620</span>  <span class="keywordflow">if</span> (thread_can_start_ != <span class="keyword">nullptr</span>) thread_can_start_->WaitForNotification();</div><div class="line"><a name="l01621"></a><span class="lineno"> 1621</span>  func_(param_);</div><div class="line"><a name="l01622"></a><span class="lineno"> 1622</span>  }</div><div class="line"><a name="l01623"></a><span class="lineno"> 1623</span> </div><div class="line"><a name="l01624"></a><span class="lineno"> 1624</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l01625"></a><span class="lineno"> 1625</span>  UserThreadFunc* <span class="keyword">const</span> func_; <span class="comment">// User-supplied thread function.</span></div><div class="line"><a name="l01626"></a><span class="lineno"> 1626</span>  <span class="keyword">const</span> T param_; <span class="comment">// User-supplied parameter to the thread function.</span></div><div class="line"><a name="l01627"></a><span class="lineno"> 1627</span>  <span class="comment">// When non-NULL, used to block execution until the controller thread</span></div><div class="line"><a name="l01628"></a><span class="lineno"> 1628</span>  <span class="comment">// notifies.</span></div><div class="line"><a name="l01629"></a><span class="lineno"> 1629</span>  Notification* <span class="keyword">const</span> thread_can_start_;</div><div class="line"><a name="l01630"></a><span class="lineno"> 1630</span>  <span class="keywordtype">bool</span> finished_; <span class="comment">// true iff we know that the thread function has finished.</span></div><div class="line"><a name="l01631"></a><span class="lineno"> 1631</span>  pthread_t thread_; <span class="comment">// The native thread object.</span></div><div class="line"><a name="l01632"></a><span class="lineno"> 1632</span> </div><div class="line"><a name="l01633"></a><span class="lineno"> 1633</span>  <a class="code" href="gtest_8h.html#aed8c1888c32b588b0681e88b95031e29">GTEST_DISALLOW_COPY_AND_ASSIGN_</a>(ThreadWithParam);</div><div class="line"><a name="l01634"></a><span class="lineno"> 1634</span> };</div><div class="line"><a name="l01635"></a><span class="lineno"> 1635</span> <span class="preprocessor"># endif // !GTEST_OS_WINDOWS && GTEST_HAS_PTHREAD ||</span></div><div class="line"><a name="l01636"></a><span class="lineno"> 1636</span>  <span class="comment">// GTEST_HAS_MUTEX_AND_THREAD_LOCAL_</span></div><div class="line"><a name="l01637"></a><span class="lineno"> 1637</span> </div><div class="line"><a name="l01638"></a><span class="lineno"> 1638</span> <span class="preprocessor"># if GTEST_HAS_MUTEX_AND_THREAD_LOCAL_</span></div><div class="line"><a name="l01639"></a><span class="lineno"> 1639</span> <span class="comment">// Mutex and ThreadLocal have already been imported into the namespace.</span></div><div class="line"><a name="l01640"></a><span class="lineno"> 1640</span> <span class="comment">// Nothing to do here.</span></div><div class="line"><a name="l01641"></a><span class="lineno"> 1641</span> </div><div class="line"><a name="l01642"></a><span class="lineno"> 1642</span> <span class="preprocessor"># elif GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT</span></div><div class="line"><a name="l01643"></a><span class="lineno"> 1643</span> </div><div class="line"><a name="l01644"></a><span class="lineno"> 1644</span> <span class="comment">// Mutex implements mutex on Windows platforms. It is used in conjunction</span></div><div class="line"><a name="l01645"></a><span class="lineno"> 1645</span> <span class="comment">// with class MutexLock:</span></div><div class="line"><a name="l01646"></a><span class="lineno"> 1646</span> <span class="comment">//</span></div><div class="line"><a name="l01647"></a><span class="lineno"> 1647</span> <span class="comment">// Mutex mutex;</span></div><div class="line"><a name="l01648"></a><span class="lineno"> 1648</span> <span class="comment">// ...</span></div><div class="line"><a name="l01649"></a><span class="lineno"> 1649</span> <span class="comment">// MutexLock lock(&mutex); // Acquires the mutex and releases it at the</span></div><div class="line"><a name="l01650"></a><span class="lineno"> 1650</span> <span class="comment">// // end of the current scope.</span></div><div class="line"><a name="l01651"></a><span class="lineno"> 1651</span> <span class="comment">//</span></div><div class="line"><a name="l01652"></a><span class="lineno"> 1652</span> <span class="comment">// A static Mutex *must* be defined or declared using one of the following</span></div><div class="line"><a name="l01653"></a><span class="lineno"> 1653</span> <span class="comment">// macros:</span></div><div class="line"><a name="l01654"></a><span class="lineno"> 1654</span> <span class="comment">// GTEST_DEFINE_STATIC_MUTEX_(g_some_mutex);</span></div><div class="line"><a name="l01655"></a><span class="lineno"> 1655</span> <span class="comment">// GTEST_DECLARE_STATIC_MUTEX_(g_some_mutex);</span></div><div class="line"><a name="l01656"></a><span class="lineno"> 1656</span> <span class="comment">//</span></div><div class="line"><a name="l01657"></a><span class="lineno"> 1657</span> <span class="comment">// (A non-static Mutex is defined/declared in the usual way).</span></div><div class="line"><a name="l01658"></a><span class="lineno"> 1658</span> <span class="keyword">class </span><a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> Mutex {</div><div class="line"><a name="l01659"></a><span class="lineno"> 1659</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l01660"></a><span class="lineno"> 1660</span>  <span class="keyword">enum</span> MutexType { kStatic = 0, kDynamic = 1 };</div><div class="line"><a name="l01661"></a><span class="lineno"> 1661</span>  <span class="comment">// We rely on kStaticMutex being 0 as it is to what the linker initializes</span></div><div class="line"><a name="l01662"></a><span class="lineno"> 1662</span>  <span class="comment">// type_ in static mutexes. critical_section_ will be initialized lazily</span></div><div class="line"><a name="l01663"></a><span class="lineno"> 1663</span>  <span class="comment">// in ThreadSafeLazyInit().</span></div><div class="line"><a name="l01664"></a><span class="lineno"> 1664</span>  <span class="keyword">enum</span> StaticConstructorSelector { kStaticMutex = 0 };</div><div class="line"><a name="l01665"></a><span class="lineno"> 1665</span> </div><div class="line"><a name="l01666"></a><span class="lineno"> 1666</span>  <span class="comment">// This constructor intentionally does nothing. It relies on type_ being</span></div><div class="line"><a name="l01667"></a><span class="lineno"> 1667</span>  <span class="comment">// statically initialized to 0 (effectively setting it to kStatic) and on</span></div><div class="line"><a name="l01668"></a><span class="lineno"> 1668</span>  <span class="comment">// ThreadSafeLazyInit() to lazily initialize the rest of the members.</span></div><div class="line"><a name="l01669"></a><span class="lineno"> 1669</span>  <span class="keyword">explicit</span> Mutex(StaticConstructorSelector <span class="comment">/*dummy*/</span>) {}</div><div class="line"><a name="l01670"></a><span class="lineno"> 1670</span> </div><div class="line"><a name="l01671"></a><span class="lineno"> 1671</span>  Mutex();</div><div class="line"><a name="l01672"></a><span class="lineno"> 1672</span>  ~Mutex();</div><div class="line"><a name="l01673"></a><span class="lineno"> 1673</span> </div><div class="line"><a name="l01674"></a><span class="lineno"> 1674</span>  <span class="keywordtype">void</span> Lock();</div><div class="line"><a name="l01675"></a><span class="lineno"> 1675</span> </div><div class="line"><a name="l01676"></a><span class="lineno"> 1676</span>  <span class="keywordtype">void</span> Unlock();</div><div class="line"><a name="l01677"></a><span class="lineno"> 1677</span> </div><div class="line"><a name="l01678"></a><span class="lineno"> 1678</span>  <span class="comment">// Does nothing if the current thread holds the mutex. Otherwise, crashes</span></div><div class="line"><a name="l01679"></a><span class="lineno"> 1679</span>  <span class="comment">// with high probability.</span></div><div class="line"><a name="l01680"></a><span class="lineno"> 1680</span>  <span class="keywordtype">void</span> AssertHeld();</div><div class="line"><a name="l01681"></a><span class="lineno"> 1681</span> </div><div class="line"><a name="l01682"></a><span class="lineno"> 1682</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l01683"></a><span class="lineno"> 1683</span>  <span class="comment">// Initializes owner_thread_id_ and critical_section_ in static mutexes.</span></div><div class="line"><a name="l01684"></a><span class="lineno"> 1684</span>  <span class="keywordtype">void</span> ThreadSafeLazyInit();</div><div class="line"><a name="l01685"></a><span class="lineno"> 1685</span> </div><div class="line"><a name="l01686"></a><span class="lineno"> 1686</span>  <span class="comment">// Per https://blogs.msdn.microsoft.com/oldnewthing/20040223-00/?p=40503,</span></div><div class="line"><a name="l01687"></a><span class="lineno"> 1687</span>  <span class="comment">// we assume that 0 is an invalid value for thread IDs.</span></div><div class="line"><a name="l01688"></a><span class="lineno"> 1688</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> owner_thread_id_;</div><div class="line"><a name="l01689"></a><span class="lineno"> 1689</span> </div><div class="line"><a name="l01690"></a><span class="lineno"> 1690</span>  <span class="comment">// For static mutexes, we rely on these members being initialized to zeros</span></div><div class="line"><a name="l01691"></a><span class="lineno"> 1691</span>  <span class="comment">// by the linker.</span></div><div class="line"><a name="l01692"></a><span class="lineno"> 1692</span>  MutexType type_;</div><div class="line"><a name="l01693"></a><span class="lineno"> 1693</span>  <span class="keywordtype">long</span> critical_section_init_phase_; <span class="comment">// NOLINT</span></div><div class="line"><a name="l01694"></a><span class="lineno"> 1694</span>  GTEST_CRITICAL_SECTION* critical_section_;</div><div class="line"><a name="l01695"></a><span class="lineno"> 1695</span> </div><div class="line"><a name="l01696"></a><span class="lineno"> 1696</span>  <a class="code" href="gtest_8h.html#aed8c1888c32b588b0681e88b95031e29">GTEST_DISALLOW_COPY_AND_ASSIGN_</a>(Mutex);</div><div class="line"><a name="l01697"></a><span class="lineno"> 1697</span> };</div><div class="line"><a name="l01698"></a><span class="lineno"> 1698</span> </div><div class="line"><a name="l01699"></a><span class="lineno"> 1699</span> <span class="preprocessor"># define GTEST_DECLARE_STATIC_MUTEX_(mutex) \</span></div><div class="line"><a name="l01700"></a><span class="lineno"> 1700</span> <span class="preprocessor"> extern ::testing::internal::Mutex mutex</span></div><div class="line"><a name="l01701"></a><span class="lineno"> 1701</span> </div><div class="line"><a name="l01702"></a><span class="lineno"> 1702</span> <span class="preprocessor"># define GTEST_DEFINE_STATIC_MUTEX_(mutex) \</span></div><div class="line"><a name="l01703"></a><span class="lineno"> 1703</span> <span class="preprocessor"> ::testing::internal::Mutex mutex(::testing::internal::Mutex::kStaticMutex)</span></div><div class="line"><a name="l01704"></a><span class="lineno"> 1704</span> </div><div class="line"><a name="l01705"></a><span class="lineno"> 1705</span> <span class="comment">// We cannot name this class MutexLock because the ctor declaration would</span></div><div class="line"><a name="l01706"></a><span class="lineno"> 1706</span> <span class="comment">// conflict with a macro named MutexLock, which is defined on some</span></div><div class="line"><a name="l01707"></a><span class="lineno"> 1707</span> <span class="comment">// platforms. That macro is used as a defensive measure to prevent against</span></div><div class="line"><a name="l01708"></a><span class="lineno"> 1708</span> <span class="comment">// inadvertent misuses of MutexLock like "MutexLock(&mu)" rather than</span></div><div class="line"><a name="l01709"></a><span class="lineno"> 1709</span> <span class="comment">// "MutexLock l(&mu)". Hence the typedef trick below.</span></div><div class="line"><a name="l01710"></a><span class="lineno"> 1710</span> <span class="keyword">class </span>GTestMutexLock {</div><div class="line"><a name="l01711"></a><span class="lineno"> 1711</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l01712"></a><span class="lineno"> 1712</span>  <span class="keyword">explicit</span> <a class="code" href="classtesting_1_1internal_1_1_g_test_mutex_lock.html#a77e3cba326d5356b4a1dea3790559c26">GTestMutexLock</a>(Mutex* mutex)</div><div class="line"><a name="l01713"></a><span class="lineno"> 1713</span>  : mutex_(mutex) { mutex_->Lock(); }</div><div class="line"><a name="l01714"></a><span class="lineno"> 1714</span> </div><div class="line"><a name="l01715"></a><span class="lineno"> 1715</span>  ~<a class="code" href="classtesting_1_1internal_1_1_g_test_mutex_lock.html#a77e3cba326d5356b4a1dea3790559c26">GTestMutexLock</a>() { mutex_->Unlock(); }</div><div class="line"><a name="l01716"></a><span class="lineno"> 1716</span> </div><div class="line"><a name="l01717"></a><span class="lineno"> 1717</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l01718"></a><span class="lineno"> 1718</span>  Mutex* <span class="keyword">const</span> mutex_;</div><div class="line"><a name="l01719"></a><span class="lineno"> 1719</span> </div><div class="line"><a name="l01720"></a><span class="lineno"> 1720</span>  <a class="code" href="gtest_8h.html#aed8c1888c32b588b0681e88b95031e29">GTEST_DISALLOW_COPY_AND_ASSIGN_</a>(<a class="code" href="classtesting_1_1internal_1_1_g_test_mutex_lock.html#a77e3cba326d5356b4a1dea3790559c26">GTestMutexLock</a>);</div><div class="line"><a name="l01721"></a><span class="lineno"> 1721</span> };</div><div class="line"><a name="l01722"></a><span class="lineno"> 1722</span> </div><div class="line"><a name="l01723"></a><span class="lineno"> 1723</span> <span class="keyword">typedef</span> GTestMutexLock <a class="code" href="namespacetesting_1_1internal.html#a08b187c6cc4e28400aadf9a32fccc8de">MutexLock</a>;</div><div class="line"><a name="l01724"></a><span class="lineno"> 1724</span> </div><div class="line"><a name="l01725"></a><span class="lineno"> 1725</span> <span class="comment">// Base class for ValueHolder<T>. Allows a caller to hold and delete a value</span></div><div class="line"><a name="l01726"></a><span class="lineno"> 1726</span> <span class="comment">// without knowing its type.</span></div><div class="line"><a name="l01727"></a><span class="lineno"> 1727</span> <span class="keyword">class </span>ThreadLocalValueHolderBase {</div><div class="line"><a name="l01728"></a><span class="lineno"> 1728</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l01729"></a><span class="lineno"> 1729</span>  <span class="keyword">virtual</span> ~ThreadLocalValueHolderBase() {}</div><div class="line"><a name="l01730"></a><span class="lineno"> 1730</span> };</div><div class="line"><a name="l01731"></a><span class="lineno"> 1731</span> </div><div class="line"><a name="l01732"></a><span class="lineno"> 1732</span> <span class="comment">// Provides a way for a thread to send notifications to a ThreadLocal</span></div><div class="line"><a name="l01733"></a><span class="lineno"> 1733</span> <span class="comment">// regardless of its parameter type.</span></div><div class="line"><a name="l01734"></a><span class="lineno"> 1734</span> <span class="keyword">class </span>ThreadLocalBase {</div><div class="line"><a name="l01735"></a><span class="lineno"> 1735</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l01736"></a><span class="lineno"> 1736</span>  <span class="comment">// Creates a new ValueHolder<T> object holding a default value passed to</span></div><div class="line"><a name="l01737"></a><span class="lineno"> 1737</span>  <span class="comment">// this ThreadLocal<T>'s constructor and returns it. It is the caller's</span></div><div class="line"><a name="l01738"></a><span class="lineno"> 1738</span>  <span class="comment">// responsibility not to call this when the ThreadLocal<T> instance already</span></div><div class="line"><a name="l01739"></a><span class="lineno"> 1739</span>  <span class="comment">// has a value on the current thread.</span></div><div class="line"><a name="l01740"></a><span class="lineno"> 1740</span>  <span class="keyword">virtual</span> ThreadLocalValueHolderBase* NewValueForCurrentThread() <span class="keyword">const</span> = 0;</div><div class="line"><a name="l01741"></a><span class="lineno"> 1741</span> </div><div class="line"><a name="l01742"></a><span class="lineno"> 1742</span>  <span class="keyword">protected</span>:</div><div class="line"><a name="l01743"></a><span class="lineno"> 1743</span>  ThreadLocalBase() {}</div><div class="line"><a name="l01744"></a><span class="lineno"> 1744</span>  <span class="keyword">virtual</span> ~ThreadLocalBase() {}</div><div class="line"><a name="l01745"></a><span class="lineno"> 1745</span> </div><div class="line"><a name="l01746"></a><span class="lineno"> 1746</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l01747"></a><span class="lineno"> 1747</span>  <a class="code" href="gtest_8h.html#aed8c1888c32b588b0681e88b95031e29">GTEST_DISALLOW_COPY_AND_ASSIGN_</a>(ThreadLocalBase);</div><div class="line"><a name="l01748"></a><span class="lineno"> 1748</span> };</div><div class="line"><a name="l01749"></a><span class="lineno"> 1749</span> </div><div class="line"><a name="l01750"></a><span class="lineno"> 1750</span> <span class="comment">// Maps a thread to a set of ThreadLocals that have values instantiated on that</span></div><div class="line"><a name="l01751"></a><span class="lineno"> 1751</span> <span class="comment">// thread and notifies them when the thread exits. A ThreadLocal instance is</span></div><div class="line"><a name="l01752"></a><span class="lineno"> 1752</span> <span class="comment">// expected to persist until all threads it has values on have terminated.</span></div><div class="line"><a name="l01753"></a><span class="lineno"> 1753</span> <span class="keyword">class </span><a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> ThreadLocalRegistry {</div><div class="line"><a name="l01754"></a><span class="lineno"> 1754</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l01755"></a><span class="lineno"> 1755</span>  <span class="comment">// Registers thread_local_instance as having value on the current thread.</span></div><div class="line"><a name="l01756"></a><span class="lineno"> 1756</span>  <span class="comment">// Returns a value that can be used to identify the thread from other threads.</span></div><div class="line"><a name="l01757"></a><span class="lineno"> 1757</span>  <span class="keyword">static</span> ThreadLocalValueHolderBase* GetValueOnCurrentThread(</div><div class="line"><a name="l01758"></a><span class="lineno"> 1758</span>  <span class="keyword">const</span> ThreadLocalBase* thread_local_instance);</div><div class="line"><a name="l01759"></a><span class="lineno"> 1759</span> </div><div class="line"><a name="l01760"></a><span class="lineno"> 1760</span>  <span class="comment">// Invoked when a ThreadLocal instance is destroyed.</span></div><div class="line"><a name="l01761"></a><span class="lineno"> 1761</span>  <span class="keyword">static</span> <span class="keywordtype">void</span> OnThreadLocalDestroyed(</div><div class="line"><a name="l01762"></a><span class="lineno"> 1762</span>  <span class="keyword">const</span> ThreadLocalBase* thread_local_instance);</div><div class="line"><a name="l01763"></a><span class="lineno"> 1763</span> };</div><div class="line"><a name="l01764"></a><span class="lineno"> 1764</span> </div><div class="line"><a name="l01765"></a><span class="lineno"> 1765</span> <span class="keyword">class </span><a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> ThreadWithParamBase {</div><div class="line"><a name="l01766"></a><span class="lineno"> 1766</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l01767"></a><span class="lineno"> 1767</span>  <span class="keywordtype">void</span> Join();</div><div class="line"><a name="l01768"></a><span class="lineno"> 1768</span> </div><div class="line"><a name="l01769"></a><span class="lineno"> 1769</span>  <span class="keyword">protected</span>:</div><div class="line"><a name="l01770"></a><span class="lineno"> 1770</span>  <span class="keyword">class </span>Runnable {</div><div class="line"><a name="l01771"></a><span class="lineno"> 1771</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l01772"></a><span class="lineno"> 1772</span>  <span class="keyword">virtual</span> ~Runnable() {}</div><div class="line"><a name="l01773"></a><span class="lineno"> 1773</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> Run() = 0;</div><div class="line"><a name="l01774"></a><span class="lineno"> 1774</span>  };</div><div class="line"><a name="l01775"></a><span class="lineno"> 1775</span> </div><div class="line"><a name="l01776"></a><span class="lineno"> 1776</span>  ThreadWithParamBase(Runnable *runnable, Notification* thread_can_start);</div><div class="line"><a name="l01777"></a><span class="lineno"> 1777</span>  <span class="keyword">virtual</span> ~ThreadWithParamBase();</div><div class="line"><a name="l01778"></a><span class="lineno"> 1778</span> </div><div class="line"><a name="l01779"></a><span class="lineno"> 1779</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l01780"></a><span class="lineno"> 1780</span>  AutoHandle thread_;</div><div class="line"><a name="l01781"></a><span class="lineno"> 1781</span> };</div><div class="line"><a name="l01782"></a><span class="lineno"> 1782</span> </div><div class="line"><a name="l01783"></a><span class="lineno"> 1783</span> <span class="comment">// Helper class for testing Google Test's multi-threading constructs.</span></div><div class="line"><a name="l01784"></a><span class="lineno"> 1784</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l01785"></a><span class="lineno"> 1785</span> <span class="keyword">class </span>ThreadWithParam : <span class="keyword">public</span> ThreadWithParamBase {</div><div class="line"><a name="l01786"></a><span class="lineno"> 1786</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l01787"></a><span class="lineno"> 1787</span>  <span class="keyword">typedef</span> <span class="keywordtype">void</span> UserThreadFunc(T);</div><div class="line"><a name="l01788"></a><span class="lineno"> 1788</span> </div><div class="line"><a name="l01789"></a><span class="lineno"> 1789</span>  ThreadWithParam(UserThreadFunc* func, T param, Notification* thread_can_start)</div><div class="line"><a name="l01790"></a><span class="lineno"> 1790</span>  : ThreadWithParamBase(new RunnableImpl(func, param), thread_can_start) {</div><div class="line"><a name="l01791"></a><span class="lineno"> 1791</span>  }</div><div class="line"><a name="l01792"></a><span class="lineno"> 1792</span>  <span class="keyword">virtual</span> ~ThreadWithParam() {}</div><div class="line"><a name="l01793"></a><span class="lineno"> 1793</span> </div><div class="line"><a name="l01794"></a><span class="lineno"> 1794</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l01795"></a><span class="lineno"> 1795</span>  <span class="keyword">class </span>RunnableImpl : <span class="keyword">public</span> Runnable {</div><div class="line"><a name="l01796"></a><span class="lineno"> 1796</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l01797"></a><span class="lineno"> 1797</span>  RunnableImpl(UserThreadFunc* func, T param)</div><div class="line"><a name="l01798"></a><span class="lineno"> 1798</span>  : func_(func),</div><div class="line"><a name="l01799"></a><span class="lineno"> 1799</span>  param_(param) {</div><div class="line"><a name="l01800"></a><span class="lineno"> 1800</span>  }</div><div class="line"><a name="l01801"></a><span class="lineno"> 1801</span>  <span class="keyword">virtual</span> ~RunnableImpl() {}</div><div class="line"><a name="l01802"></a><span class="lineno"> 1802</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> Run() {</div><div class="line"><a name="l01803"></a><span class="lineno"> 1803</span>  func_(param_);</div><div class="line"><a name="l01804"></a><span class="lineno"> 1804</span>  }</div><div class="line"><a name="l01805"></a><span class="lineno"> 1805</span> </div><div class="line"><a name="l01806"></a><span class="lineno"> 1806</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l01807"></a><span class="lineno"> 1807</span>  UserThreadFunc* <span class="keyword">const</span> func_;</div><div class="line"><a name="l01808"></a><span class="lineno"> 1808</span>  <span class="keyword">const</span> T param_;</div><div class="line"><a name="l01809"></a><span class="lineno"> 1809</span> </div><div class="line"><a name="l01810"></a><span class="lineno"> 1810</span>  <a class="code" href="gtest_8h.html#aed8c1888c32b588b0681e88b95031e29">GTEST_DISALLOW_COPY_AND_ASSIGN_</a>(RunnableImpl);</div><div class="line"><a name="l01811"></a><span class="lineno"> 1811</span>  };</div><div class="line"><a name="l01812"></a><span class="lineno"> 1812</span> </div><div class="line"><a name="l01813"></a><span class="lineno"> 1813</span>  <a class="code" href="gtest_8h.html#aed8c1888c32b588b0681e88b95031e29">GTEST_DISALLOW_COPY_AND_ASSIGN_</a>(ThreadWithParam);</div><div class="line"><a name="l01814"></a><span class="lineno"> 1814</span> };</div><div class="line"><a name="l01815"></a><span class="lineno"> 1815</span> </div><div class="line"><a name="l01816"></a><span class="lineno"> 1816</span> <span class="comment">// Implements thread-local storage on Windows systems.</span></div><div class="line"><a name="l01817"></a><span class="lineno"> 1817</span> <span class="comment">//</span></div><div class="line"><a name="l01818"></a><span class="lineno"> 1818</span> <span class="comment">// // Thread 1</span></div><div class="line"><a name="l01819"></a><span class="lineno"> 1819</span> <span class="comment">// ThreadLocal<int> tl(100); // 100 is the default value for each thread.</span></div><div class="line"><a name="l01820"></a><span class="lineno"> 1820</span> <span class="comment">//</span></div><div class="line"><a name="l01821"></a><span class="lineno"> 1821</span> <span class="comment">// // Thread 2</span></div><div class="line"><a name="l01822"></a><span class="lineno"> 1822</span> <span class="comment">// tl.set(150); // Changes the value for thread 2 only.</span></div><div class="line"><a name="l01823"></a><span class="lineno"> 1823</span> <span class="comment">// EXPECT_EQ(150, tl.get());</span></div><div class="line"><a name="l01824"></a><span class="lineno"> 1824</span> <span class="comment">//</span></div><div class="line"><a name="l01825"></a><span class="lineno"> 1825</span> <span class="comment">// // Thread 1</span></div><div class="line"><a name="l01826"></a><span class="lineno"> 1826</span> <span class="comment">// EXPECT_EQ(100, tl.get()); // In thread 1, tl has the original value.</span></div><div class="line"><a name="l01827"></a><span class="lineno"> 1827</span> <span class="comment">// tl.set(200);</span></div><div class="line"><a name="l01828"></a><span class="lineno"> 1828</span> <span class="comment">// EXPECT_EQ(200, tl.get());</span></div><div class="line"><a name="l01829"></a><span class="lineno"> 1829</span> <span class="comment">//</span></div><div class="line"><a name="l01830"></a><span class="lineno"> 1830</span> <span class="comment">// The template type argument T must have a public copy constructor.</span></div><div class="line"><a name="l01831"></a><span class="lineno"> 1831</span> <span class="comment">// In addition, the default ThreadLocal constructor requires T to have</span></div><div class="line"><a name="l01832"></a><span class="lineno"> 1832</span> <span class="comment">// a public default constructor.</span></div><div class="line"><a name="l01833"></a><span class="lineno"> 1833</span> <span class="comment">//</span></div><div class="line"><a name="l01834"></a><span class="lineno"> 1834</span> <span class="comment">// The users of a TheadLocal instance have to make sure that all but one</span></div><div class="line"><a name="l01835"></a><span class="lineno"> 1835</span> <span class="comment">// threads (including the main one) using that instance have exited before</span></div><div class="line"><a name="l01836"></a><span class="lineno"> 1836</span> <span class="comment">// destroying it. Otherwise, the per-thread objects managed for them by the</span></div><div class="line"><a name="l01837"></a><span class="lineno"> 1837</span> <span class="comment">// ThreadLocal instance are not guaranteed to be destroyed on all platforms.</span></div><div class="line"><a name="l01838"></a><span class="lineno"> 1838</span> <span class="comment">//</span></div><div class="line"><a name="l01839"></a><span class="lineno"> 1839</span> <span class="comment">// Google Test only uses global ThreadLocal objects. That means they</span></div><div class="line"><a name="l01840"></a><span class="lineno"> 1840</span> <span class="comment">// will die after main() has returned. Therefore, no per-thread</span></div><div class="line"><a name="l01841"></a><span class="lineno"> 1841</span> <span class="comment">// object managed by Google Test will be leaked as long as all threads</span></div><div class="line"><a name="l01842"></a><span class="lineno"> 1842</span> <span class="comment">// using Google Test have exited when main() returns.</span></div><div class="line"><a name="l01843"></a><span class="lineno"> 1843</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l01844"></a><span class="lineno"> 1844</span> <span class="keyword">class </span>ThreadLocal : <span class="keyword">public</span> ThreadLocalBase {</div><div class="line"><a name="l01845"></a><span class="lineno"> 1845</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l01846"></a><span class="lineno"> 1846</span>  <a class="code" href="classtesting_1_1internal_1_1_thread_local.html#a106f3a3ad15d08f95f9887105d2a1af5">ThreadLocal</a>() : default_factory_(new DefaultValueHolderFactory()) {}</div><div class="line"><a name="l01847"></a><span class="lineno"> 1847</span>  <span class="keyword">explicit</span> <a class="code" href="classtesting_1_1internal_1_1_thread_local.html#a106f3a3ad15d08f95f9887105d2a1af5">ThreadLocal</a>(<span class="keyword">const</span> T& value)</div><div class="line"><a name="l01848"></a><span class="lineno"> 1848</span>  : default_factory_(new InstanceValueHolderFactory(value)) {}</div><div class="line"><a name="l01849"></a><span class="lineno"> 1849</span> </div><div class="line"><a name="l01850"></a><span class="lineno"> 1850</span>  ~<a class="code" href="classtesting_1_1internal_1_1_thread_local.html#a106f3a3ad15d08f95f9887105d2a1af5">ThreadLocal</a>() { ThreadLocalRegistry::OnThreadLocalDestroyed(<span class="keyword">this</span>); }</div><div class="line"><a name="l01851"></a><span class="lineno"> 1851</span> </div><div class="line"><a name="l01852"></a><span class="lineno"> 1852</span>  T* <a class="code" href="classtesting_1_1internal_1_1_thread_local.html#a882f57fed4b074de83693c0c0fe62858">pointer</a>() { <span class="keywordflow">return</span> GetOrCreateValue(); }</div><div class="line"><a name="l01853"></a><span class="lineno"> 1853</span>  <span class="keyword">const</span> T* <a class="code" href="classtesting_1_1internal_1_1_thread_local.html#a882f57fed4b074de83693c0c0fe62858">pointer</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> GetOrCreateValue(); }</div><div class="line"><a name="l01854"></a><span class="lineno"> 1854</span>  <span class="keyword">const</span> T& <span class="keyword">get</span>() <span class="keyword">const</span> { <span class="keywordflow">return</span> *<a class="code" href="classtesting_1_1internal_1_1_thread_local.html#a882f57fed4b074de83693c0c0fe62858">pointer</a>(); }</div><div class="line"><a name="l01855"></a><span class="lineno"> 1855</span>  <span class="keywordtype">void</span> <span class="keyword">set</span>(<span class="keyword">const</span> T& value) { *<a class="code" href="classtesting_1_1internal_1_1_thread_local.html#a882f57fed4b074de83693c0c0fe62858">pointer</a>() = value; }</div><div class="line"><a name="l01856"></a><span class="lineno"> 1856</span> </div><div class="line"><a name="l01857"></a><span class="lineno"> 1857</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l01858"></a><span class="lineno"> 1858</span>  <span class="comment">// Holds a value of T. Can be deleted via its base class without the caller</span></div><div class="line"><a name="l01859"></a><span class="lineno"> 1859</span>  <span class="comment">// knowing the type of T.</span></div><div class="line"><a name="l01860"></a><span class="lineno"> 1860</span>  <span class="keyword">class </span>ValueHolder : <span class="keyword">public</span> ThreadLocalValueHolderBase {</div><div class="line"><a name="l01861"></a><span class="lineno"> 1861</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l01862"></a><span class="lineno"> 1862</span>  ValueHolder() : value_() {}</div><div class="line"><a name="l01863"></a><span class="lineno"> 1863</span>  <span class="keyword">explicit</span> ValueHolder(<span class="keyword">const</span> T& value) : value_(value) {}</div><div class="line"><a name="l01864"></a><span class="lineno"> 1864</span> </div><div class="line"><a name="l01865"></a><span class="lineno"> 1865</span>  T* <a class="code" href="classtesting_1_1internal_1_1_thread_local.html#a882f57fed4b074de83693c0c0fe62858">pointer</a>() { <span class="keywordflow">return</span> &value_; }</div><div class="line"><a name="l01866"></a><span class="lineno"> 1866</span> </div><div class="line"><a name="l01867"></a><span class="lineno"> 1867</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l01868"></a><span class="lineno"> 1868</span>  T value_;</div><div class="line"><a name="l01869"></a><span class="lineno"> 1869</span>  <a class="code" href="gtest_8h.html#aed8c1888c32b588b0681e88b95031e29">GTEST_DISALLOW_COPY_AND_ASSIGN_</a>(ValueHolder);</div><div class="line"><a name="l01870"></a><span class="lineno"> 1870</span>  };</div><div class="line"><a name="l01871"></a><span class="lineno"> 1871</span> </div><div class="line"><a name="l01872"></a><span class="lineno"> 1872</span> </div><div class="line"><a name="l01873"></a><span class="lineno"> 1873</span>  T* GetOrCreateValue()<span class="keyword"> const </span>{</div><div class="line"><a name="l01874"></a><span class="lineno"> 1874</span>  <span class="keywordflow">return</span> <span class="keyword">static_cast<</span>ValueHolder*<span class="keyword">></span>(</div><div class="line"><a name="l01875"></a><span class="lineno"> 1875</span>  ThreadLocalRegistry::GetValueOnCurrentThread(<span class="keyword">this</span>))-><a class="code" href="classtesting_1_1internal_1_1_thread_local.html#a882f57fed4b074de83693c0c0fe62858">pointer</a>();</div><div class="line"><a name="l01876"></a><span class="lineno"> 1876</span>  }</div><div class="line"><a name="l01877"></a><span class="lineno"> 1877</span> </div><div class="line"><a name="l01878"></a><span class="lineno"> 1878</span>  <span class="keyword">virtual</span> ThreadLocalValueHolderBase* NewValueForCurrentThread()<span class="keyword"> const </span>{</div><div class="line"><a name="l01879"></a><span class="lineno"> 1879</span>  <span class="keywordflow">return</span> default_factory_->MakeNewHolder();</div><div class="line"><a name="l01880"></a><span class="lineno"> 1880</span>  }</div><div class="line"><a name="l01881"></a><span class="lineno"> 1881</span> </div><div class="line"><a name="l01882"></a><span class="lineno"> 1882</span>  <span class="keyword">class </span>ValueHolderFactory {</div><div class="line"><a name="l01883"></a><span class="lineno"> 1883</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l01884"></a><span class="lineno"> 1884</span>  ValueHolderFactory() {}</div><div class="line"><a name="l01885"></a><span class="lineno"> 1885</span>  <span class="keyword">virtual</span> ~ValueHolderFactory() {}</div><div class="line"><a name="l01886"></a><span class="lineno"> 1886</span>  <span class="keyword">virtual</span> ValueHolder* MakeNewHolder() <span class="keyword">const</span> = 0;</div><div class="line"><a name="l01887"></a><span class="lineno"> 1887</span> </div><div class="line"><a name="l01888"></a><span class="lineno"> 1888</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l01889"></a><span class="lineno"> 1889</span>  <a class="code" href="gtest_8h.html#aed8c1888c32b588b0681e88b95031e29">GTEST_DISALLOW_COPY_AND_ASSIGN_</a>(ValueHolderFactory);</div><div class="line"><a name="l01890"></a><span class="lineno"> 1890</span>  };</div><div class="line"><a name="l01891"></a><span class="lineno"> 1891</span> </div><div class="line"><a name="l01892"></a><span class="lineno"> 1892</span>  <span class="keyword">class </span>DefaultValueHolderFactory : <span class="keyword">public</span> ValueHolderFactory {</div><div class="line"><a name="l01893"></a><span class="lineno"> 1893</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l01894"></a><span class="lineno"> 1894</span>  DefaultValueHolderFactory() {}</div><div class="line"><a name="l01895"></a><span class="lineno"> 1895</span>  <span class="keyword">virtual</span> ValueHolder* MakeNewHolder()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <span class="keyword">new</span> ValueHolder(); }</div><div class="line"><a name="l01896"></a><span class="lineno"> 1896</span> </div><div class="line"><a name="l01897"></a><span class="lineno"> 1897</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l01898"></a><span class="lineno"> 1898</span>  <a class="code" href="gtest_8h.html#aed8c1888c32b588b0681e88b95031e29">GTEST_DISALLOW_COPY_AND_ASSIGN_</a>(DefaultValueHolderFactory);</div><div class="line"><a name="l01899"></a><span class="lineno"> 1899</span>  };</div><div class="line"><a name="l01900"></a><span class="lineno"> 1900</span> </div><div class="line"><a name="l01901"></a><span class="lineno"> 1901</span>  <span class="keyword">class </span>InstanceValueHolderFactory : <span class="keyword">public</span> ValueHolderFactory {</div><div class="line"><a name="l01902"></a><span class="lineno"> 1902</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l01903"></a><span class="lineno"> 1903</span>  <span class="keyword">explicit</span> InstanceValueHolderFactory(<span class="keyword">const</span> T& value) : value_(value) {}</div><div class="line"><a name="l01904"></a><span class="lineno"> 1904</span>  <span class="keyword">virtual</span> ValueHolder* MakeNewHolder()<span class="keyword"> const </span>{</div><div class="line"><a name="l01905"></a><span class="lineno"> 1905</span>  <span class="keywordflow">return</span> <span class="keyword">new</span> ValueHolder(value_);</div><div class="line"><a name="l01906"></a><span class="lineno"> 1906</span>  }</div><div class="line"><a name="l01907"></a><span class="lineno"> 1907</span> </div><div class="line"><a name="l01908"></a><span class="lineno"> 1908</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l01909"></a><span class="lineno"> 1909</span>  <span class="keyword">const</span> T value_; <span class="comment">// The value for each thread.</span></div><div class="line"><a name="l01910"></a><span class="lineno"> 1910</span> </div><div class="line"><a name="l01911"></a><span class="lineno"> 1911</span>  <a class="code" href="gtest_8h.html#aed8c1888c32b588b0681e88b95031e29">GTEST_DISALLOW_COPY_AND_ASSIGN_</a>(InstanceValueHolderFactory);</div><div class="line"><a name="l01912"></a><span class="lineno"> 1912</span>  };</div><div class="line"><a name="l01913"></a><span class="lineno"> 1913</span> </div><div class="line"><a name="l01914"></a><span class="lineno"> 1914</span>  std::unique_ptr<ValueHolderFactory> default_factory_;</div><div class="line"><a name="l01915"></a><span class="lineno"> 1915</span> </div><div class="line"><a name="l01916"></a><span class="lineno"> 1916</span>  <a class="code" href="gtest_8h.html#aed8c1888c32b588b0681e88b95031e29">GTEST_DISALLOW_COPY_AND_ASSIGN_</a>(<a class="code" href="classtesting_1_1internal_1_1_thread_local.html#a106f3a3ad15d08f95f9887105d2a1af5">ThreadLocal</a>);</div><div class="line"><a name="l01917"></a><span class="lineno"> 1917</span> };</div><div class="line"><a name="l01918"></a><span class="lineno"> 1918</span> </div><div class="line"><a name="l01919"></a><span class="lineno"> 1919</span> <span class="preprocessor"># elif GTEST_HAS_PTHREAD</span></div><div class="line"><a name="l01920"></a><span class="lineno"> 1920</span> </div><div class="line"><a name="l01921"></a><span class="lineno"> 1921</span> <span class="comment">// MutexBase and Mutex implement mutex on pthreads-based platforms.</span></div><div class="line"><a name="l01922"></a><span class="lineno"> 1922</span> <span class="keyword">class </span>MutexBase {</div><div class="line"><a name="l01923"></a><span class="lineno"> 1923</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l01924"></a><span class="lineno"> 1924</span>  <span class="comment">// Acquires this mutex.</span></div><div class="line"><a name="l01925"></a><span class="lineno"> 1925</span>  <span class="keywordtype">void</span> Lock() {</div><div class="line"><a name="l01926"></a><span class="lineno"> 1926</span>  <a class="code" href="gtest_8h.html#a38f6151210e363ad7c69a836b13cf0af">GTEST_CHECK_POSIX_SUCCESS_</a>(pthread_mutex_lock(&mutex_));</div><div class="line"><a name="l01927"></a><span class="lineno"> 1927</span>  owner_ = pthread_self();</div><div class="line"><a name="l01928"></a><span class="lineno"> 1928</span>  has_owner_ = <span class="keyword">true</span>;</div><div class="line"><a name="l01929"></a><span class="lineno"> 1929</span>  }</div><div class="line"><a name="l01930"></a><span class="lineno"> 1930</span> </div><div class="line"><a name="l01931"></a><span class="lineno"> 1931</span>  <span class="comment">// Releases this mutex.</span></div><div class="line"><a name="l01932"></a><span class="lineno"> 1932</span>  <span class="keywordtype">void</span> Unlock() {</div><div class="line"><a name="l01933"></a><span class="lineno"> 1933</span>  <span class="comment">// Since the lock is being released the owner_ field should no longer be</span></div><div class="line"><a name="l01934"></a><span class="lineno"> 1934</span>  <span class="comment">// considered valid. We don't protect writing to has_owner_ here, as it's</span></div><div class="line"><a name="l01935"></a><span class="lineno"> 1935</span>  <span class="comment">// the caller's responsibility to ensure that the current thread holds the</span></div><div class="line"><a name="l01936"></a><span class="lineno"> 1936</span>  <span class="comment">// mutex when this is called.</span></div><div class="line"><a name="l01937"></a><span class="lineno"> 1937</span>  has_owner_ = <span class="keyword">false</span>;</div><div class="line"><a name="l01938"></a><span class="lineno"> 1938</span>  <a class="code" href="gtest_8h.html#a38f6151210e363ad7c69a836b13cf0af">GTEST_CHECK_POSIX_SUCCESS_</a>(pthread_mutex_unlock(&mutex_));</div><div class="line"><a name="l01939"></a><span class="lineno"> 1939</span>  }</div><div class="line"><a name="l01940"></a><span class="lineno"> 1940</span> </div><div class="line"><a name="l01941"></a><span class="lineno"> 1941</span>  <span class="comment">// Does nothing if the current thread holds the mutex. Otherwise, crashes</span></div><div class="line"><a name="l01942"></a><span class="lineno"> 1942</span>  <span class="comment">// with high probability.</span></div><div class="line"><a name="l01943"></a><span class="lineno"> 1943</span>  <span class="keywordtype">void</span> AssertHeld()<span class="keyword"> const </span>{</div><div class="line"><a name="l01944"></a><span class="lineno"> 1944</span>  <a class="code" href="gtest_8h.html#ab54343f0a36dc4cb0ce8a478dd7847b8">GTEST_CHECK_</a>(has_owner_ && pthread_equal(owner_, pthread_self()))</div><div class="line"><a name="l01945"></a><span class="lineno"> 1945</span>  << <span class="stringliteral">"The current thread is not holding the mutex @"</span> << <span class="keyword">this</span>;</div><div class="line"><a name="l01946"></a><span class="lineno"> 1946</span>  }</div><div class="line"><a name="l01947"></a><span class="lineno"> 1947</span> </div><div class="line"><a name="l01948"></a><span class="lineno"> 1948</span>  <span class="comment">// A static mutex may be used before main() is entered. It may even</span></div><div class="line"><a name="l01949"></a><span class="lineno"> 1949</span>  <span class="comment">// be used before the dynamic initialization stage. Therefore we</span></div><div class="line"><a name="l01950"></a><span class="lineno"> 1950</span>  <span class="comment">// must be able to initialize a static mutex object at link time.</span></div><div class="line"><a name="l01951"></a><span class="lineno"> 1951</span>  <span class="comment">// This means MutexBase has to be a POD and its member variables</span></div><div class="line"><a name="l01952"></a><span class="lineno"> 1952</span>  <span class="comment">// have to be public.</span></div><div class="line"><a name="l01953"></a><span class="lineno"> 1953</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l01954"></a><span class="lineno"> 1954</span>  pthread_mutex_t mutex_; <span class="comment">// The underlying pthread mutex.</span></div><div class="line"><a name="l01955"></a><span class="lineno"> 1955</span>  <span class="comment">// has_owner_ indicates whether the owner_ field below contains a valid thread</span></div><div class="line"><a name="l01956"></a><span class="lineno"> 1956</span>  <span class="comment">// ID and is therefore safe to inspect (e.g., to use in pthread_equal()). All</span></div><div class="line"><a name="l01957"></a><span class="lineno"> 1957</span>  <span class="comment">// accesses to the owner_ field should be protected by a check of this field.</span></div><div class="line"><a name="l01958"></a><span class="lineno"> 1958</span>  <span class="comment">// An alternative might be to memset() owner_ to all zeros, but there's no</span></div><div class="line"><a name="l01959"></a><span class="lineno"> 1959</span>  <span class="comment">// guarantee that a zero'd pthread_t is necessarily invalid or even different</span></div><div class="line"><a name="l01960"></a><span class="lineno"> 1960</span>  <span class="comment">// from pthread_self().</span></div><div class="line"><a name="l01961"></a><span class="lineno"> 1961</span>  <span class="keywordtype">bool</span> has_owner_;</div><div class="line"><a name="l01962"></a><span class="lineno"> 1962</span>  pthread_t owner_; <span class="comment">// The thread holding the mutex.</span></div><div class="line"><a name="l01963"></a><span class="lineno"> 1963</span> };</div><div class="line"><a name="l01964"></a><span class="lineno"> 1964</span> </div><div class="line"><a name="l01965"></a><span class="lineno"> 1965</span> <span class="comment">// Forward-declares a static mutex.</span></div><div class="line"><a name="l01966"></a><span class="lineno"> 1966</span> <span class="preprocessor"># define GTEST_DECLARE_STATIC_MUTEX_(mutex) \</span></div><div class="line"><a name="l01967"></a><span class="lineno"> 1967</span> <span class="preprocessor"> extern ::testing::internal::MutexBase mutex</span></div><div class="line"><a name="l01968"></a><span class="lineno"> 1968</span> </div><div class="line"><a name="l01969"></a><span class="lineno"> 1969</span> <span class="comment">// Defines and statically (i.e. at link time) initializes a static mutex.</span></div><div class="line"><a name="l01970"></a><span class="lineno"> 1970</span> <span class="comment">// The initialization list here does not explicitly initialize each field,</span></div><div class="line"><a name="l01971"></a><span class="lineno"> 1971</span> <span class="comment">// instead relying on default initialization for the unspecified fields. In</span></div><div class="line"><a name="l01972"></a><span class="lineno"> 1972</span> <span class="comment">// particular, the owner_ field (a pthread_t) is not explicitly initialized.</span></div><div class="line"><a name="l01973"></a><span class="lineno"> 1973</span> <span class="comment">// This allows initialization to work whether pthread_t is a scalar or struct.</span></div><div class="line"><a name="l01974"></a><span class="lineno"> 1974</span> <span class="comment">// The flag -Wmissing-field-initializers must not be specified for this to work.</span></div><div class="line"><a name="l01975"></a><span class="lineno"> 1975</span> <span class="preprocessor">#define GTEST_DEFINE_STATIC_MUTEX_(mutex) \</span></div><div class="line"><a name="l01976"></a><span class="lineno"> 1976</span> <span class="preprocessor"> ::testing::internal::MutexBase mutex = {PTHREAD_MUTEX_INITIALIZER, false, 0}</span></div><div class="line"><a name="l01977"></a><span class="lineno"> 1977</span> </div><div class="line"><a name="l01978"></a><span class="lineno"> 1978</span> <span class="comment">// The Mutex class can only be used for mutexes created at runtime. It</span></div><div class="line"><a name="l01979"></a><span class="lineno"> 1979</span> <span class="comment">// shares its API with MutexBase otherwise.</span></div><div class="line"><a name="l01980"></a><span class="lineno"> 1980</span> <span class="keyword">class </span>Mutex : <span class="keyword">public</span> MutexBase {</div><div class="line"><a name="l01981"></a><span class="lineno"> 1981</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l01982"></a><span class="lineno"> 1982</span>  <a class="code" href="classtesting_1_1internal_1_1_mutex.html#a38e1833a78e3eec81ad23ce1b056b40e">Mutex</a>() {</div><div class="line"><a name="l01983"></a><span class="lineno"> 1983</span>  <a class="code" href="gtest_8h.html#a38f6151210e363ad7c69a836b13cf0af">GTEST_CHECK_POSIX_SUCCESS_</a>(pthread_mutex_init(&mutex_, <span class="keyword">nullptr</span>));</div><div class="line"><a name="l01984"></a><span class="lineno"> 1984</span>  has_owner_ = <span class="keyword">false</span>;</div><div class="line"><a name="l01985"></a><span class="lineno"> 1985</span>  }</div><div class="line"><a name="l01986"></a><span class="lineno"> 1986</span>  ~<a class="code" href="classtesting_1_1internal_1_1_mutex.html#a38e1833a78e3eec81ad23ce1b056b40e">Mutex</a>() {</div><div class="line"><a name="l01987"></a><span class="lineno"> 1987</span>  <a class="code" href="gtest_8h.html#a38f6151210e363ad7c69a836b13cf0af">GTEST_CHECK_POSIX_SUCCESS_</a>(pthread_mutex_destroy(&mutex_));</div><div class="line"><a name="l01988"></a><span class="lineno"> 1988</span>  }</div><div class="line"><a name="l01989"></a><span class="lineno"> 1989</span> </div><div class="line"><a name="l01990"></a><span class="lineno"> 1990</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l01991"></a><span class="lineno"> 1991</span>  <a class="code" href="gtest_8h.html#aed8c1888c32b588b0681e88b95031e29">GTEST_DISALLOW_COPY_AND_ASSIGN_</a>(<a class="code" href="classtesting_1_1internal_1_1_mutex.html#a38e1833a78e3eec81ad23ce1b056b40e">Mutex</a>);</div><div class="line"><a name="l01992"></a><span class="lineno"> 1992</span> };</div><div class="line"><a name="l01993"></a><span class="lineno"> 1993</span> </div><div class="line"><a name="l01994"></a><span class="lineno"> 1994</span> <span class="comment">// We cannot name this class MutexLock because the ctor declaration would</span></div><div class="line"><a name="l01995"></a><span class="lineno"> 1995</span> <span class="comment">// conflict with a macro named MutexLock, which is defined on some</span></div><div class="line"><a name="l01996"></a><span class="lineno"> 1996</span> <span class="comment">// platforms. That macro is used as a defensive measure to prevent against</span></div><div class="line"><a name="l01997"></a><span class="lineno"> 1997</span> <span class="comment">// inadvertent misuses of MutexLock like "MutexLock(&mu)" rather than</span></div><div class="line"><a name="l01998"></a><span class="lineno"> 1998</span> <span class="comment">// "MutexLock l(&mu)". Hence the typedef trick below.</span></div><div class="line"><a name="l01999"></a><span class="lineno"> 1999</span> <span class="keyword">class </span>GTestMutexLock {</div><div class="line"><a name="l02000"></a><span class="lineno"> 2000</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l02001"></a><span class="lineno"> 2001</span>  <span class="keyword">explicit</span> <a class="code" href="classtesting_1_1internal_1_1_g_test_mutex_lock.html#a77e3cba326d5356b4a1dea3790559c26">GTestMutexLock</a>(MutexBase* mutex)</div><div class="line"><a name="l02002"></a><span class="lineno"> 2002</span>  : mutex_(mutex) { mutex_->Lock(); }</div><div class="line"><a name="l02003"></a><span class="lineno"> 2003</span> </div><div class="line"><a name="l02004"></a><span class="lineno"> 2004</span>  ~<a class="code" href="classtesting_1_1internal_1_1_g_test_mutex_lock.html#a77e3cba326d5356b4a1dea3790559c26">GTestMutexLock</a>() { mutex_->Unlock(); }</div><div class="line"><a name="l02005"></a><span class="lineno"> 2005</span> </div><div class="line"><a name="l02006"></a><span class="lineno"> 2006</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l02007"></a><span class="lineno"> 2007</span>  MutexBase* <span class="keyword">const</span> mutex_;</div><div class="line"><a name="l02008"></a><span class="lineno"> 2008</span> </div><div class="line"><a name="l02009"></a><span class="lineno"> 2009</span>  <a class="code" href="gtest_8h.html#aed8c1888c32b588b0681e88b95031e29">GTEST_DISALLOW_COPY_AND_ASSIGN_</a>(<a class="code" href="classtesting_1_1internal_1_1_g_test_mutex_lock.html#a77e3cba326d5356b4a1dea3790559c26">GTestMutexLock</a>);</div><div class="line"><a name="l02010"></a><span class="lineno"> 2010</span> };</div><div class="line"><a name="l02011"></a><span class="lineno"> 2011</span> </div><div class="line"><a name="l02012"></a><span class="lineno"> 2012</span> <span class="keyword">typedef</span> GTestMutexLock <a class="code" href="namespacetesting_1_1internal.html#a08b187c6cc4e28400aadf9a32fccc8de">MutexLock</a>;</div><div class="line"><a name="l02013"></a><span class="lineno"> 2013</span> </div><div class="line"><a name="l02014"></a><span class="lineno"> 2014</span> <span class="comment">// Helpers for ThreadLocal.</span></div><div class="line"><a name="l02015"></a><span class="lineno"> 2015</span> </div><div class="line"><a name="l02016"></a><span class="lineno"> 2016</span> <span class="comment">// pthread_key_create() requires DeleteThreadLocalValue() to have</span></div><div class="line"><a name="l02017"></a><span class="lineno"> 2017</span> <span class="comment">// C-linkage. Therefore it cannot be templatized to access</span></div><div class="line"><a name="l02018"></a><span class="lineno"> 2018</span> <span class="comment">// ThreadLocal<T>. Hence the need for class</span></div><div class="line"><a name="l02019"></a><span class="lineno"> 2019</span> <span class="comment">// ThreadLocalValueHolderBase.</span></div><div class="line"><a name="l02020"></a><span class="lineno"> 2020</span> <span class="keyword">class </span>ThreadLocalValueHolderBase {</div><div class="line"><a name="l02021"></a><span class="lineno"> 2021</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l02022"></a><span class="lineno"> 2022</span>  <span class="keyword">virtual</span> ~ThreadLocalValueHolderBase() {}</div><div class="line"><a name="l02023"></a><span class="lineno"> 2023</span> };</div><div class="line"><a name="l02024"></a><span class="lineno"> 2024</span> </div><div class="line"><a name="l02025"></a><span class="lineno"> 2025</span> <span class="comment">// Called by pthread to delete thread-local data stored by</span></div><div class="line"><a name="l02026"></a><span class="lineno"> 2026</span> <span class="comment">// pthread_setspecific().</span></div><div class="line"><a name="l02027"></a><span class="lineno"> 2027</span> <span class="keyword">extern</span> <span class="stringliteral">"C"</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> DeleteThreadLocalValue(<span class="keywordtype">void</span>* value_holder) {</div><div class="line"><a name="l02028"></a><span class="lineno"> 2028</span>  <span class="keyword">delete</span> <span class="keyword">static_cast<</span>ThreadLocalValueHolderBase*<span class="keyword">></span>(value_holder);</div><div class="line"><a name="l02029"></a><span class="lineno"> 2029</span> }</div><div class="line"><a name="l02030"></a><span class="lineno"> 2030</span> </div><div class="line"><a name="l02031"></a><span class="lineno"> 2031</span> <span class="comment">// Implements thread-local storage on pthreads-based systems.</span></div><div class="line"><a name="l02032"></a><span class="lineno"> 2032</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l02033"></a><span class="lineno"> 2033</span> <span class="keyword">class </span><a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> ThreadLocal {</div><div class="line"><a name="l02034"></a><span class="lineno"> 2034</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l02035"></a><span class="lineno"> 2035</span>  ThreadLocal()</div><div class="line"><a name="l02036"></a><span class="lineno"> 2036</span>  : key_(CreateKey()), default_factory_(new DefaultValueHolderFactory()) {}</div><div class="line"><a name="l02037"></a><span class="lineno"> 2037</span>  <span class="keyword">explicit</span> ThreadLocal(<span class="keyword">const</span> T& value)</div><div class="line"><a name="l02038"></a><span class="lineno"> 2038</span>  : key_(CreateKey()),</div><div class="line"><a name="l02039"></a><span class="lineno"> 2039</span>  default_factory_(new InstanceValueHolderFactory(value)) {}</div><div class="line"><a name="l02040"></a><span class="lineno"> 2040</span> </div><div class="line"><a name="l02041"></a><span class="lineno"> 2041</span>  ~ThreadLocal() {</div><div class="line"><a name="l02042"></a><span class="lineno"> 2042</span>  <span class="comment">// Destroys the managed object for the current thread, if any.</span></div><div class="line"><a name="l02043"></a><span class="lineno"> 2043</span>  DeleteThreadLocalValue(pthread_getspecific(key_));</div><div class="line"><a name="l02044"></a><span class="lineno"> 2044</span> </div><div class="line"><a name="l02045"></a><span class="lineno"> 2045</span>  <span class="comment">// Releases resources associated with the key. This will *not*</span></div><div class="line"><a name="l02046"></a><span class="lineno"> 2046</span>  <span class="comment">// delete managed objects for other threads.</span></div><div class="line"><a name="l02047"></a><span class="lineno"> 2047</span>  <a class="code" href="gtest_8h.html#a38f6151210e363ad7c69a836b13cf0af">GTEST_CHECK_POSIX_SUCCESS_</a>(pthread_key_delete(key_));</div><div class="line"><a name="l02048"></a><span class="lineno"> 2048</span>  }</div><div class="line"><a name="l02049"></a><span class="lineno"> 2049</span> </div><div class="line"><a name="l02050"></a><span class="lineno"> 2050</span>  T* pointer() { <span class="keywordflow">return</span> GetOrCreateValue(); }</div><div class="line"><a name="l02051"></a><span class="lineno"> 2051</span>  <span class="keyword">const</span> T* pointer()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> GetOrCreateValue(); }</div><div class="line"><a name="l02052"></a><span class="lineno"> 2052</span>  <span class="keyword">const</span> T& <span class="keyword">get</span>() <span class="keyword">const</span> { <span class="keywordflow">return</span> *pointer(); }</div><div class="line"><a name="l02053"></a><span class="lineno"> 2053</span>  <span class="keywordtype">void</span> <span class="keyword">set</span>(<span class="keyword">const</span> T& value) { *pointer() = value; }</div><div class="line"><a name="l02054"></a><span class="lineno"> 2054</span> </div><div class="line"><a name="l02055"></a><span class="lineno"> 2055</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l02056"></a><span class="lineno"> 2056</span>  <span class="comment">// Holds a value of type T.</span></div><div class="line"><a name="l02057"></a><span class="lineno"> 2057</span>  <span class="keyword">class </span>ValueHolder : <span class="keyword">public</span> ThreadLocalValueHolderBase {</div><div class="line"><a name="l02058"></a><span class="lineno"> 2058</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l02059"></a><span class="lineno"> 2059</span>  ValueHolder() : value_() {}</div><div class="line"><a name="l02060"></a><span class="lineno"> 2060</span>  <span class="keyword">explicit</span> ValueHolder(<span class="keyword">const</span> T& value) : value_(value) {}</div><div class="line"><a name="l02061"></a><span class="lineno"> 2061</span> </div><div class="line"><a name="l02062"></a><span class="lineno"> 2062</span>  T* pointer() { <span class="keywordflow">return</span> &value_; }</div><div class="line"><a name="l02063"></a><span class="lineno"> 2063</span> </div><div class="line"><a name="l02064"></a><span class="lineno"> 2064</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l02065"></a><span class="lineno"> 2065</span>  T value_;</div><div class="line"><a name="l02066"></a><span class="lineno"> 2066</span>  <a class="code" href="gtest_8h.html#aed8c1888c32b588b0681e88b95031e29">GTEST_DISALLOW_COPY_AND_ASSIGN_</a>(ValueHolder);</div><div class="line"><a name="l02067"></a><span class="lineno"> 2067</span>  };</div><div class="line"><a name="l02068"></a><span class="lineno"> 2068</span> </div><div class="line"><a name="l02069"></a><span class="lineno"> 2069</span>  <span class="keyword">static</span> pthread_key_t CreateKey() {</div><div class="line"><a name="l02070"></a><span class="lineno"> 2070</span>  pthread_key_t key;</div><div class="line"><a name="l02071"></a><span class="lineno"> 2071</span>  <span class="comment">// When a thread exits, DeleteThreadLocalValue() will be called on</span></div><div class="line"><a name="l02072"></a><span class="lineno"> 2072</span>  <span class="comment">// the object managed for that thread.</span></div><div class="line"><a name="l02073"></a><span class="lineno"> 2073</span>  <a class="code" href="gtest_8h.html#a38f6151210e363ad7c69a836b13cf0af">GTEST_CHECK_POSIX_SUCCESS_</a>(</div><div class="line"><a name="l02074"></a><span class="lineno"> 2074</span>  pthread_key_create(&key, &DeleteThreadLocalValue));</div><div class="line"><a name="l02075"></a><span class="lineno"> 2075</span>  <span class="keywordflow">return</span> key;</div><div class="line"><a name="l02076"></a><span class="lineno"> 2076</span>  }</div><div class="line"><a name="l02077"></a><span class="lineno"> 2077</span> </div><div class="line"><a name="l02078"></a><span class="lineno"> 2078</span>  T* GetOrCreateValue()<span class="keyword"> const </span>{</div><div class="line"><a name="l02079"></a><span class="lineno"> 2079</span>  ThreadLocalValueHolderBase* <span class="keyword">const</span> holder =</div><div class="line"><a name="l02080"></a><span class="lineno"> 2080</span>  <span class="keyword">static_cast<</span>ThreadLocalValueHolderBase*<span class="keyword">></span>(pthread_getspecific(key_));</div><div class="line"><a name="l02081"></a><span class="lineno"> 2081</span>  <span class="keywordflow">if</span> (holder != <span class="keyword">nullptr</span>) {</div><div class="line"><a name="l02082"></a><span class="lineno"> 2082</span>  <span class="keywordflow">return</span> CheckedDowncastToActualType<ValueHolder>(holder)->pointer();</div><div class="line"><a name="l02083"></a><span class="lineno"> 2083</span>  }</div><div class="line"><a name="l02084"></a><span class="lineno"> 2084</span> </div><div class="line"><a name="l02085"></a><span class="lineno"> 2085</span>  ValueHolder* <span class="keyword">const</span> new_holder = default_factory_->MakeNewHolder();</div><div class="line"><a name="l02086"></a><span class="lineno"> 2086</span>  ThreadLocalValueHolderBase* <span class="keyword">const</span> holder_base = new_holder;</div><div class="line"><a name="l02087"></a><span class="lineno"> 2087</span>  <a class="code" href="gtest_8h.html#a38f6151210e363ad7c69a836b13cf0af">GTEST_CHECK_POSIX_SUCCESS_</a>(pthread_setspecific(key_, holder_base));</div><div class="line"><a name="l02088"></a><span class="lineno"> 2088</span>  <span class="keywordflow">return</span> new_holder->pointer();</div><div class="line"><a name="l02089"></a><span class="lineno"> 2089</span>  }</div><div class="line"><a name="l02090"></a><span class="lineno"> 2090</span> </div><div class="line"><a name="l02091"></a><span class="lineno"> 2091</span>  <span class="keyword">class </span>ValueHolderFactory {</div><div class="line"><a name="l02092"></a><span class="lineno"> 2092</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l02093"></a><span class="lineno"> 2093</span>  ValueHolderFactory() {}</div><div class="line"><a name="l02094"></a><span class="lineno"> 2094</span>  <span class="keyword">virtual</span> ~ValueHolderFactory() {}</div><div class="line"><a name="l02095"></a><span class="lineno"> 2095</span>  <span class="keyword">virtual</span> ValueHolder* MakeNewHolder() <span class="keyword">const</span> = 0;</div><div class="line"><a name="l02096"></a><span class="lineno"> 2096</span> </div><div class="line"><a name="l02097"></a><span class="lineno"> 2097</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l02098"></a><span class="lineno"> 2098</span>  <a class="code" href="gtest_8h.html#aed8c1888c32b588b0681e88b95031e29">GTEST_DISALLOW_COPY_AND_ASSIGN_</a>(ValueHolderFactory);</div><div class="line"><a name="l02099"></a><span class="lineno"> 2099</span>  };</div><div class="line"><a name="l02100"></a><span class="lineno"> 2100</span> </div><div class="line"><a name="l02101"></a><span class="lineno"> 2101</span>  <span class="keyword">class </span>DefaultValueHolderFactory : <span class="keyword">public</span> ValueHolderFactory {</div><div class="line"><a name="l02102"></a><span class="lineno"> 2102</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l02103"></a><span class="lineno"> 2103</span>  DefaultValueHolderFactory() {}</div><div class="line"><a name="l02104"></a><span class="lineno"> 2104</span>  <span class="keyword">virtual</span> ValueHolder* MakeNewHolder()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <span class="keyword">new</span> ValueHolder(); }</div><div class="line"><a name="l02105"></a><span class="lineno"> 2105</span> </div><div class="line"><a name="l02106"></a><span class="lineno"> 2106</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l02107"></a><span class="lineno"> 2107</span>  <a class="code" href="gtest_8h.html#aed8c1888c32b588b0681e88b95031e29">GTEST_DISALLOW_COPY_AND_ASSIGN_</a>(DefaultValueHolderFactory);</div><div class="line"><a name="l02108"></a><span class="lineno"> 2108</span>  };</div><div class="line"><a name="l02109"></a><span class="lineno"> 2109</span> </div><div class="line"><a name="l02110"></a><span class="lineno"> 2110</span>  <span class="keyword">class </span>InstanceValueHolderFactory : <span class="keyword">public</span> ValueHolderFactory {</div><div class="line"><a name="l02111"></a><span class="lineno"> 2111</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l02112"></a><span class="lineno"> 2112</span>  <span class="keyword">explicit</span> InstanceValueHolderFactory(<span class="keyword">const</span> T& value) : value_(value) {}</div><div class="line"><a name="l02113"></a><span class="lineno"> 2113</span>  <span class="keyword">virtual</span> ValueHolder* MakeNewHolder()<span class="keyword"> const </span>{</div><div class="line"><a name="l02114"></a><span class="lineno"> 2114</span>  <span class="keywordflow">return</span> <span class="keyword">new</span> ValueHolder(value_);</div><div class="line"><a name="l02115"></a><span class="lineno"> 2115</span>  }</div><div class="line"><a name="l02116"></a><span class="lineno"> 2116</span> </div><div class="line"><a name="l02117"></a><span class="lineno"> 2117</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l02118"></a><span class="lineno"> 2118</span>  <span class="keyword">const</span> T value_; <span class="comment">// The value for each thread.</span></div><div class="line"><a name="l02119"></a><span class="lineno"> 2119</span> </div><div class="line"><a name="l02120"></a><span class="lineno"> 2120</span>  <a class="code" href="gtest_8h.html#aed8c1888c32b588b0681e88b95031e29">GTEST_DISALLOW_COPY_AND_ASSIGN_</a>(InstanceValueHolderFactory);</div><div class="line"><a name="l02121"></a><span class="lineno"> 2121</span>  };</div><div class="line"><a name="l02122"></a><span class="lineno"> 2122</span> </div><div class="line"><a name="l02123"></a><span class="lineno"> 2123</span>  <span class="comment">// A key pthreads uses for looking up per-thread values.</span></div><div class="line"><a name="l02124"></a><span class="lineno"> 2124</span>  <span class="keyword">const</span> pthread_key_t key_;</div><div class="line"><a name="l02125"></a><span class="lineno"> 2125</span>  std::unique_ptr<ValueHolderFactory> default_factory_;</div><div class="line"><a name="l02126"></a><span class="lineno"> 2126</span> </div><div class="line"><a name="l02127"></a><span class="lineno"> 2127</span>  <a class="code" href="gtest_8h.html#aed8c1888c32b588b0681e88b95031e29">GTEST_DISALLOW_COPY_AND_ASSIGN_</a>(ThreadLocal);</div><div class="line"><a name="l02128"></a><span class="lineno"> 2128</span> };</div><div class="line"><a name="l02129"></a><span class="lineno"> 2129</span> </div><div class="line"><a name="l02130"></a><span class="lineno"> 2130</span> <span class="preprocessor"># endif // GTEST_HAS_MUTEX_AND_THREAD_LOCAL_</span></div><div class="line"><a name="l02131"></a><span class="lineno"> 2131</span> </div><div class="line"><a name="l02132"></a><span class="lineno"> 2132</span> <span class="preprocessor">#else // GTEST_IS_THREADSAFE</span></div><div class="line"><a name="l02133"></a><span class="lineno"> 2133</span> </div><div class="line"><a name="l02134"></a><span class="lineno"> 2134</span> <span class="comment">// A dummy implementation of synchronization primitives (mutex, lock,</span></div><div class="line"><a name="l02135"></a><span class="lineno"> 2135</span> <span class="comment">// and thread-local variable). Necessary for compiling Google Test where</span></div><div class="line"><a name="l02136"></a><span class="lineno"> 2136</span> <span class="comment">// mutex is not supported - using Google Test in multiple threads is not</span></div><div class="line"><a name="l02137"></a><span class="lineno"> 2137</span> <span class="comment">// supported on such platforms.</span></div><div class="line"><a name="l02138"></a><span class="lineno"> 2138</span> </div><div class="line"><a name="l02139"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_mutex.html"> 2139</a></span> <span class="keyword">class </span><a class="code" href="classtesting_1_1internal_1_1_mutex.html">Mutex</a> {</div><div class="line"><a name="l02140"></a><span class="lineno"> 2140</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l02141"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_mutex.html#a38e1833a78e3eec81ad23ce1b056b40e"> 2141</a></span>  <a class="code" href="classtesting_1_1internal_1_1_mutex.html#a38e1833a78e3eec81ad23ce1b056b40e">Mutex</a>() {}</div><div class="line"><a name="l02142"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_mutex.html#ae7e2191886c00182176b23c4f4d049f8"> 2142</a></span>  <span class="keywordtype">void</span> <a class="code" href="classtesting_1_1internal_1_1_mutex.html#ae7e2191886c00182176b23c4f4d049f8">Lock</a>() {}</div><div class="line"><a name="l02143"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_mutex.html#a315188055de1be98884519ad84eff2e6"> 2143</a></span>  <span class="keywordtype">void</span> <a class="code" href="classtesting_1_1internal_1_1_mutex.html#a315188055de1be98884519ad84eff2e6">Unlock</a>() {}</div><div class="line"><a name="l02144"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_mutex.html#af45bf1660ac4110338a02a8680b2f486"> 2144</a></span>  <span class="keywordtype">void</span> <a class="code" href="classtesting_1_1internal_1_1_mutex.html#af45bf1660ac4110338a02a8680b2f486">AssertHeld</a>()<span class="keyword"> const </span>{}</div><div class="line"><a name="l02145"></a><span class="lineno"> 2145</span> };</div><div class="line"><a name="l02146"></a><span class="lineno"> 2146</span> </div><div class="line"><a name="l02147"></a><span class="lineno"><a class="line" href="gtest_8h.html#af0970cdea09f16dbb1dbfccdaa693eeb"> 2147</a></span> <span class="preprocessor"># define GTEST_DECLARE_STATIC_MUTEX_(mutex) \</span></div><div class="line"><a name="l02148"></a><span class="lineno"> 2148</span> <span class="preprocessor"> extern ::testing::internal::Mutex mutex</span></div><div class="line"><a name="l02149"></a><span class="lineno"> 2149</span> </div><div class="line"><a name="l02150"></a><span class="lineno"><a class="line" href="gtest_8h.html#a85d5cd679fdbe87383e7dfd1c6651eaa"> 2150</a></span> <span class="preprocessor"># define GTEST_DEFINE_STATIC_MUTEX_(mutex) ::testing::internal::Mutex mutex</span></div><div class="line"><a name="l02151"></a><span class="lineno"> 2151</span> </div><div class="line"><a name="l02152"></a><span class="lineno"> 2152</span> <span class="comment">// We cannot name this class MutexLock because the ctor declaration would</span></div><div class="line"><a name="l02153"></a><span class="lineno"> 2153</span> <span class="comment">// conflict with a macro named MutexLock, which is defined on some</span></div><div class="line"><a name="l02154"></a><span class="lineno"> 2154</span> <span class="comment">// platforms. That macro is used as a defensive measure to prevent against</span></div><div class="line"><a name="l02155"></a><span class="lineno"> 2155</span> <span class="comment">// inadvertent misuses of MutexLock like "MutexLock(&mu)" rather than</span></div><div class="line"><a name="l02156"></a><span class="lineno"> 2156</span> <span class="comment">// "MutexLock l(&mu)". Hence the typedef trick below.</span></div><div class="line"><a name="l02157"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_g_test_mutex_lock.html"> 2157</a></span> <span class="keyword">class </span><a class="code" href="classtesting_1_1internal_1_1_g_test_mutex_lock.html">GTestMutexLock</a> {</div><div class="line"><a name="l02158"></a><span class="lineno"> 2158</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l02159"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_g_test_mutex_lock.html#a77e3cba326d5356b4a1dea3790559c26"> 2159</a></span>  <span class="keyword">explicit</span> <a class="code" href="classtesting_1_1internal_1_1_g_test_mutex_lock.html#a77e3cba326d5356b4a1dea3790559c26">GTestMutexLock</a>(<a class="code" href="classtesting_1_1internal_1_1_mutex.html">Mutex</a>*) {} <span class="comment">// NOLINT</span></div><div class="line"><a name="l02160"></a><span class="lineno"> 2160</span> };</div><div class="line"><a name="l02161"></a><span class="lineno"> 2161</span> </div><div class="line"><a name="l02162"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#a08b187c6cc4e28400aadf9a32fccc8de"> 2162</a></span> <span class="keyword">typedef</span> <a class="code" href="classtesting_1_1internal_1_1_g_test_mutex_lock.html">GTestMutexLock</a> <a class="code" href="namespacetesting_1_1internal.html#a08b187c6cc4e28400aadf9a32fccc8de">MutexLock</a>;</div><div class="line"><a name="l02163"></a><span class="lineno"> 2163</span> </div><div class="line"><a name="l02164"></a><span class="lineno"> 2164</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l02165"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_thread_local.html"> 2165</a></span> <span class="keyword">class </span><a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> <a class="code" href="classtesting_1_1internal_1_1_thread_local.html">ThreadLocal</a> {</div><div class="line"><a name="l02166"></a><span class="lineno"> 2166</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l02167"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_thread_local.html#a106f3a3ad15d08f95f9887105d2a1af5"> 2167</a></span>  <a class="code" href="classtesting_1_1internal_1_1_thread_local.html#a106f3a3ad15d08f95f9887105d2a1af5">ThreadLocal</a>() : value_() {}</div><div class="line"><a name="l02168"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_thread_local.html#a85610bdfdbc93a4c56215e0aad7da870"> 2168</a></span>  <span class="keyword">explicit</span> <a class="code" href="classtesting_1_1internal_1_1_thread_local.html#a85610bdfdbc93a4c56215e0aad7da870">ThreadLocal</a>(<span class="keyword">const</span> T& value) : value_(value) {}</div><div class="line"><a name="l02169"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_thread_local.html#a882f57fed4b074de83693c0c0fe62858"> 2169</a></span>  T* <a class="code" href="classtesting_1_1internal_1_1_thread_local.html#a882f57fed4b074de83693c0c0fe62858">pointer</a>() { <span class="keywordflow">return</span> &value_; }</div><div class="line"><a name="l02170"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_thread_local.html#a57e45bb60e3cd94abb04fa449e9f0367"> 2170</a></span>  <span class="keyword">const</span> T* <a class="code" href="classtesting_1_1internal_1_1_thread_local.html#a57e45bb60e3cd94abb04fa449e9f0367">pointer</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> &value_; }</div><div class="line"><a name="l02171"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_thread_local.html#ac56aeb97991824979bf192c63d1466f8"> 2171</a></span>  <span class="keyword">const</span> T& <span class="keyword">get</span>() <span class="keyword">const</span> { <span class="keywordflow">return</span> value_; }</div><div class="line"><a name="l02172"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_thread_local.html#ab5ebc7ba07426cef7167afa2a7707eb4"> 2172</a></span>  <span class="keywordtype">void</span> <span class="keyword">set</span>(<span class="keyword">const</span> T& value) { value_ = value; }</div><div class="line"><a name="l02173"></a><span class="lineno"> 2173</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l02174"></a><span class="lineno"> 2174</span>  T value_;</div><div class="line"><a name="l02175"></a><span class="lineno"> 2175</span> };</div><div class="line"><a name="l02176"></a><span class="lineno"> 2176</span> </div><div class="line"><a name="l02177"></a><span class="lineno"> 2177</span> <span class="preprocessor">#endif // GTEST_IS_THREADSAFE</span></div><div class="line"><a name="l02178"></a><span class="lineno"> 2178</span> </div><div class="line"><a name="l02179"></a><span class="lineno"> 2179</span> <span class="comment">// Returns the number of threads running in the process, or 0 to indicate that</span></div><div class="line"><a name="l02180"></a><span class="lineno"> 2180</span> <span class="comment">// we cannot detect it.</span></div><div class="line"><a name="l02181"></a><span class="lineno"> 2181</span> <a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> <span class="keywordtype">size_t</span> <a class="code" href="namespacetesting_1_1internal.html#a8cbd8bf820517923d7f3c4477b3af5fa">GetThreadCount</a>();</div><div class="line"><a name="l02182"></a><span class="lineno"> 2182</span> </div><div class="line"><a name="l02183"></a><span class="lineno"> 2183</span> <span class="keyword">template</span> <<span class="keywordtype">bool</span> <span class="keywordtype">bool</span>_value></div><div class="line"><a name="l02184"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1bool__constant.html"> 2184</a></span> <span class="keyword">struct </span><a class="code" href="structtesting_1_1internal_1_1bool__constant.html">bool_constant</a> {</div><div class="line"><a name="l02185"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1bool__constant.html#aba6d09ecf7eecea6c93480f0d627a167"> 2185</a></span>  <span class="keyword">typedef</span> <a class="code" href="structtesting_1_1internal_1_1bool__constant.html">bool_constant<bool_value></a> <a class="code" href="structtesting_1_1internal_1_1bool__constant.html#aba6d09ecf7eecea6c93480f0d627a167">type</a>;</div><div class="line"><a name="l02186"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1bool__constant.html#a499fba6576296b04d99690a486424b32"> 2186</a></span>  <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> <a class="code" href="structtesting_1_1internal_1_1bool__constant.html#a499fba6576296b04d99690a486424b32">value</a> = bool_value;</div><div class="line"><a name="l02187"></a><span class="lineno"> 2187</span> };</div><div class="line"><a name="l02188"></a><span class="lineno"> 2188</span> <span class="keyword">template</span> <<span class="keywordtype">bool</span> <span class="keywordtype">bool</span>_value> <span class="keyword">const</span> <span class="keywordtype">bool</span> <a class="code" href="structtesting_1_1internal_1_1bool__constant.html">bool_constant<bool_value>::value</a>;</div><div class="line"><a name="l02189"></a><span class="lineno"> 2189</span> </div><div class="line"><a name="l02190"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#abb1d0789f19bdde21affccbd1078b525"> 2190</a></span> <span class="keyword">typedef</span> <a class="code" href="structtesting_1_1internal_1_1bool__constant.html">bool_constant<false></a> <a class="code" href="namespacetesting_1_1internal.html#abb1d0789f19bdde21affccbd1078b525">false_type</a>;</div><div class="line"><a name="l02191"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#a62f917c3424d8841de9b49b5ec28edb4"> 2191</a></span> <span class="keyword">typedef</span> <a class="code" href="structtesting_1_1internal_1_1bool__constant.html">bool_constant<true></a> <a class="code" href="namespacetesting_1_1internal.html#a62f917c3424d8841de9b49b5ec28edb4">true_type</a>;</div><div class="line"><a name="l02192"></a><span class="lineno"> 2192</span> </div><div class="line"><a name="l02193"></a><span class="lineno"> 2193</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T, <span class="keyword">typename</span> U></div><div class="line"><a name="l02194"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1is__same.html"> 2194</a></span> <span class="keyword">struct </span><a class="code" href="structtesting_1_1internal_1_1is__same.html">is_same</a> : <span class="keyword">public</span> <a class="code" href="structtesting_1_1internal_1_1bool__constant.html">false_type</a> {};</div><div class="line"><a name="l02195"></a><span class="lineno"> 2195</span> </div><div class="line"><a name="l02196"></a><span class="lineno"> 2196</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l02197"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1is__same_3_01_t_00_01_t_01_4.html"> 2197</a></span> <span class="keyword">struct </span><a class="code" href="structtesting_1_1internal_1_1is__same.html">is_same</a><T, T> : <span class="keyword">public</span> <a class="code" href="structtesting_1_1internal_1_1bool__constant.html">true_type</a> {};</div><div class="line"><a name="l02198"></a><span class="lineno"> 2198</span> </div><div class="line"><a name="l02199"></a><span class="lineno"> 2199</span> <span class="keyword">template</span> <<span class="keyword">typename</span> Iterator></div><div class="line"><a name="l02200"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_iterator_traits.html"> 2200</a></span> <span class="keyword">struct </span><a class="code" href="structtesting_1_1internal_1_1_iterator_traits.html">IteratorTraits</a> {</div><div class="line"><a name="l02201"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_iterator_traits.html#a29de4320a9c53ce438d3561b94e515bb"> 2201</a></span>  <span class="keyword">typedef</span> <span class="keyword">typename</span> Iterator::value_type <a class="code" href="structtesting_1_1internal_1_1_iterator_traits.html#a29de4320a9c53ce438d3561b94e515bb">value_type</a>;</div><div class="line"><a name="l02202"></a><span class="lineno"> 2202</span> };</div><div class="line"><a name="l02203"></a><span class="lineno"> 2203</span> </div><div class="line"><a name="l02204"></a><span class="lineno"> 2204</span> </div><div class="line"><a name="l02205"></a><span class="lineno"> 2205</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l02206"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_iterator_traits_3_01_t_01_5_01_4.html"> 2206</a></span> <span class="keyword">struct </span><a class="code" href="structtesting_1_1internal_1_1_iterator_traits.html">IteratorTraits</a><T*> {</div><div class="line"><a name="l02207"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_iterator_traits_3_01_t_01_5_01_4.html#a7e46869ed36cc5aea898e243d270a8be"> 2207</a></span>  <span class="keyword">typedef</span> T <a class="code" href="structtesting_1_1internal_1_1_iterator_traits_3_01_t_01_5_01_4.html#a7e46869ed36cc5aea898e243d270a8be">value_type</a>;</div><div class="line"><a name="l02208"></a><span class="lineno"> 2208</span> };</div><div class="line"><a name="l02209"></a><span class="lineno"> 2209</span> </div><div class="line"><a name="l02210"></a><span class="lineno"> 2210</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l02211"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_iterator_traits_3_01const_01_t_01_5_01_4.html"> 2211</a></span> <span class="keyword">struct </span><a class="code" href="structtesting_1_1internal_1_1_iterator_traits.html">IteratorTraits</a><const T*> {</div><div class="line"><a name="l02212"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_iterator_traits_3_01const_01_t_01_5_01_4.html#ae7c8867223e106f374b56a7dc4a85547"> 2212</a></span>  <span class="keyword">typedef</span> T <a class="code" href="structtesting_1_1internal_1_1_iterator_traits_3_01const_01_t_01_5_01_4.html#ae7c8867223e106f374b56a7dc4a85547">value_type</a>;</div><div class="line"><a name="l02213"></a><span class="lineno"> 2213</span> };</div><div class="line"><a name="l02214"></a><span class="lineno"> 2214</span> </div><div class="line"><a name="l02215"></a><span class="lineno"> 2215</span> <span class="preprocessor">#if GTEST_OS_WINDOWS</span></div><div class="line"><a name="l02216"></a><span class="lineno"> 2216</span> <span class="preprocessor"># define GTEST_PATH_SEP_ "\\"</span></div><div class="line"><a name="l02217"></a><span class="lineno"> 2217</span> <span class="preprocessor"># define GTEST_HAS_ALT_PATH_SEP_ 1</span></div><div class="line"><a name="l02218"></a><span class="lineno"> 2218</span> <span class="comment">// The biggest signed integer type the compiler supports.</span></div><div class="line"><a name="l02219"></a><span class="lineno"> 2219</span> <span class="keyword">typedef</span> __int64 <a class="code" href="namespacetesting_1_1internal.html#a05c6bd9ede5ccdf25191a590d610dcc6">BiggestInt</a>;</div><div class="line"><a name="l02220"></a><span class="lineno"> 2220</span> <span class="preprocessor">#else</span></div><div class="line"><a name="l02221"></a><span class="lineno"><a class="line" href="gtest_8h.html#afbb636e91bdd50267dbef11a50490b29"> 2221</a></span> <span class="preprocessor"># define GTEST_PATH_SEP_ "/"</span></div><div class="line"><a name="l02222"></a><span class="lineno"><a class="line" href="gtest_8h.html#acf0ee1851e6d342237bb64806ee1fd27"> 2222</a></span> <span class="preprocessor"># define GTEST_HAS_ALT_PATH_SEP_ 0</span></div><div class="line"><a name="l02223"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#a05c6bd9ede5ccdf25191a590d610dcc6"> 2223</a></span> <span class="keyword">typedef</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span> <a class="code" href="namespacetesting_1_1internal.html#a05c6bd9ede5ccdf25191a590d610dcc6">BiggestInt</a>; <span class="comment">// NOLINT</span></div><div class="line"><a name="l02224"></a><span class="lineno"> 2224</span> <span class="preprocessor">#endif // GTEST_OS_WINDOWS</span></div><div class="line"><a name="l02225"></a><span class="lineno"> 2225</span> </div><div class="line"><a name="l02226"></a><span class="lineno"> 2226</span> <span class="comment">// Utilities for char.</span></div><div class="line"><a name="l02227"></a><span class="lineno"> 2227</span> </div><div class="line"><a name="l02228"></a><span class="lineno"> 2228</span> <span class="comment">// isspace(int ch) and friends accept an unsigned char or EOF. char</span></div><div class="line"><a name="l02229"></a><span class="lineno"> 2229</span> <span class="comment">// may be signed, depending on the compiler (or compiler flags).</span></div><div class="line"><a name="l02230"></a><span class="lineno"> 2230</span> <span class="comment">// Therefore we need to cast a char to unsigned char before calling</span></div><div class="line"><a name="l02231"></a><span class="lineno"> 2231</span> <span class="comment">// isspace(), etc.</span></div><div class="line"><a name="l02232"></a><span class="lineno"> 2232</span> </div><div class="line"><a name="l02233"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#aeb957087fd6bbf9db98ab7cd41b0c129"> 2233</a></span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="namespacetesting_1_1internal.html#aeb957087fd6bbf9db98ab7cd41b0c129">IsAlpha</a>(<span class="keywordtype">char</span> ch) {</div><div class="line"><a name="l02234"></a><span class="lineno"> 2234</span>  <span class="keywordflow">return</span> isalpha(static_cast<unsigned char>(ch)) != 0;</div><div class="line"><a name="l02235"></a><span class="lineno"> 2235</span> }</div><div class="line"><a name="l02236"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#a83802e7f23324cd512232203662e1a98"> 2236</a></span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="namespacetesting_1_1internal.html#a83802e7f23324cd512232203662e1a98">IsAlNum</a>(<span class="keywordtype">char</span> ch) {</div><div class="line"><a name="l02237"></a><span class="lineno"> 2237</span>  <span class="keywordflow">return</span> isalnum(static_cast<unsigned char>(ch)) != 0;</div><div class="line"><a name="l02238"></a><span class="lineno"> 2238</span> }</div><div class="line"><a name="l02239"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#a4bd96b7fa6486802d33ddc217af55a39"> 2239</a></span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="namespacetesting_1_1internal.html#a4bd96b7fa6486802d33ddc217af55a39">IsDigit</a>(<span class="keywordtype">char</span> ch) {</div><div class="line"><a name="l02240"></a><span class="lineno"> 2240</span>  <span class="keywordflow">return</span> isdigit(static_cast<unsigned char>(ch)) != 0;</div><div class="line"><a name="l02241"></a><span class="lineno"> 2241</span> }</div><div class="line"><a name="l02242"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#ac26ce3883bc8919c27074975e958f3b7"> 2242</a></span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="namespacetesting_1_1internal.html#ac26ce3883bc8919c27074975e958f3b7">IsLower</a>(<span class="keywordtype">char</span> ch) {</div><div class="line"><a name="l02243"></a><span class="lineno"> 2243</span>  <span class="keywordflow">return</span> islower(static_cast<unsigned char>(ch)) != 0;</div><div class="line"><a name="l02244"></a><span class="lineno"> 2244</span> }</div><div class="line"><a name="l02245"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#af429e04f70f9c10f6aa76a5d1ccd389f"> 2245</a></span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="namespacetesting_1_1internal.html#af429e04f70f9c10f6aa76a5d1ccd389f">IsSpace</a>(<span class="keywordtype">char</span> ch) {</div><div class="line"><a name="l02246"></a><span class="lineno"> 2246</span>  <span class="keywordflow">return</span> isspace(static_cast<unsigned char>(ch)) != 0;</div><div class="line"><a name="l02247"></a><span class="lineno"> 2247</span> }</div><div class="line"><a name="l02248"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#a84f3baa379fec6bf5947cb5165aa8cc9"> 2248</a></span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="namespacetesting_1_1internal.html#a84f3baa379fec6bf5947cb5165aa8cc9">IsUpper</a>(<span class="keywordtype">char</span> ch) {</div><div class="line"><a name="l02249"></a><span class="lineno"> 2249</span>  <span class="keywordflow">return</span> isupper(static_cast<unsigned char>(ch)) != 0;</div><div class="line"><a name="l02250"></a><span class="lineno"> 2250</span> }</div><div class="line"><a name="l02251"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#aa234ef141278263fb143b616c74c86e7"> 2251</a></span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="namespacetesting_1_1internal.html#aa234ef141278263fb143b616c74c86e7">IsXDigit</a>(<span class="keywordtype">char</span> ch) {</div><div class="line"><a name="l02252"></a><span class="lineno"> 2252</span>  <span class="keywordflow">return</span> isxdigit(static_cast<unsigned char>(ch)) != 0;</div><div class="line"><a name="l02253"></a><span class="lineno"> 2253</span> }</div><div class="line"><a name="l02254"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#a6ab68a30f8291c09b2289c132bbe3b16"> 2254</a></span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="namespacetesting_1_1internal.html#aa234ef141278263fb143b616c74c86e7">IsXDigit</a>(<span class="keywordtype">wchar_t</span> ch) {</div><div class="line"><a name="l02255"></a><span class="lineno"> 2255</span>  <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> low_byte = <span class="keyword">static_cast<</span><span class="keywordtype">unsigned</span> <span class="keywordtype">char</span><span class="keyword">></span>(ch);</div><div class="line"><a name="l02256"></a><span class="lineno"> 2256</span>  <span class="keywordflow">return</span> ch == low_byte && isxdigit(low_byte) != 0;</div><div class="line"><a name="l02257"></a><span class="lineno"> 2257</span> }</div><div class="line"><a name="l02258"></a><span class="lineno"> 2258</span> </div><div class="line"><a name="l02259"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#ad9c627ef2a94245e3fd69e7ab3d49b42"> 2259</a></span> <span class="keyword">inline</span> <span class="keywordtype">char</span> <a class="code" href="namespacetesting_1_1internal.html#ad9c627ef2a94245e3fd69e7ab3d49b42">ToLower</a>(<span class="keywordtype">char</span> ch) {</div><div class="line"><a name="l02260"></a><span class="lineno"> 2260</span>  <span class="keywordflow">return</span> <span class="keyword">static_cast<</span><span class="keywordtype">char</span><span class="keyword">></span>(tolower(static_cast<unsigned char>(ch)));</div><div class="line"><a name="l02261"></a><span class="lineno"> 2261</span> }</div><div class="line"><a name="l02262"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#ac1b876a8133895bd553d4780ecaa1e3a"> 2262</a></span> <span class="keyword">inline</span> <span class="keywordtype">char</span> <a class="code" href="namespacetesting_1_1internal.html#ac1b876a8133895bd553d4780ecaa1e3a">ToUpper</a>(<span class="keywordtype">char</span> ch) {</div><div class="line"><a name="l02263"></a><span class="lineno"> 2263</span>  <span class="keywordflow">return</span> <span class="keyword">static_cast<</span><span class="keywordtype">char</span><span class="keyword">></span>(toupper(static_cast<unsigned char>(ch)));</div><div class="line"><a name="l02264"></a><span class="lineno"> 2264</span> }</div><div class="line"><a name="l02265"></a><span class="lineno"> 2265</span> </div><div class="line"><a name="l02266"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#aa6afda12e567c353e2e9b9c2e8cae14f"> 2266</a></span> <span class="keyword">inline</span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a> <a class="code" href="namespacetesting_1_1internal.html#aa6afda12e567c353e2e9b9c2e8cae14f">StripTrailingSpaces</a>(<a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a> str) {</div><div class="line"><a name="l02267"></a><span class="lineno"> 2267</span>  std::string::iterator it = str.end();</div><div class="line"><a name="l02268"></a><span class="lineno"> 2268</span>  <span class="keywordflow">while</span> (it != str.begin() && <a class="code" href="namespacetesting_1_1internal.html#af429e04f70f9c10f6aa76a5d1ccd389f">IsSpace</a>(*--it))</div><div class="line"><a name="l02269"></a><span class="lineno"> 2269</span>  it = str.erase(it);</div><div class="line"><a name="l02270"></a><span class="lineno"> 2270</span>  <span class="keywordflow">return</span> str;</div><div class="line"><a name="l02271"></a><span class="lineno"> 2271</span> }</div><div class="line"><a name="l02272"></a><span class="lineno"> 2272</span> </div><div class="line"><a name="l02273"></a><span class="lineno"> 2273</span> <span class="comment">// The testing::internal::posix namespace holds wrappers for common</span></div><div class="line"><a name="l02274"></a><span class="lineno"> 2274</span> <span class="comment">// POSIX functions. These wrappers hide the differences between</span></div><div class="line"><a name="l02275"></a><span class="lineno"> 2275</span> <span class="comment">// Windows/MSVC and POSIX systems. Since some compilers define these</span></div><div class="line"><a name="l02276"></a><span class="lineno"> 2276</span> <span class="comment">// standard functions as macros, the wrapper cannot have the same name</span></div><div class="line"><a name="l02277"></a><span class="lineno"> 2277</span> <span class="comment">// as the wrapped function.</span></div><div class="line"><a name="l02278"></a><span class="lineno"> 2278</span> </div><div class="line"><a name="l02279"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal_1_1posix.html"> 2279</a></span> <span class="keyword">namespace </span>posix {</div><div class="line"><a name="l02280"></a><span class="lineno"> 2280</span> </div><div class="line"><a name="l02281"></a><span class="lineno"> 2281</span> <span class="comment">// Functions with a different name on Windows.</span></div><div class="line"><a name="l02282"></a><span class="lineno"> 2282</span> </div><div class="line"><a name="l02283"></a><span class="lineno"> 2283</span> <span class="preprocessor">#if GTEST_OS_WINDOWS</span></div><div class="line"><a name="l02284"></a><span class="lineno"> 2284</span> </div><div class="line"><a name="l02285"></a><span class="lineno"> 2285</span> <span class="keyword">typedef</span> <span class="keyword">struct </span>_stat <a class="code" href="namespacetesting_1_1internal_1_1posix.html#a8eb9f08d3af29941c2d2a964cfff3ecb">StatStruct</a>;</div><div class="line"><a name="l02286"></a><span class="lineno"> 2286</span> </div><div class="line"><a name="l02287"></a><span class="lineno"> 2287</span> <span class="preprocessor"># ifdef __BORLANDC__</span></div><div class="line"><a name="l02288"></a><span class="lineno"> 2288</span> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="namespacetesting_1_1internal_1_1posix.html#a16ebe936b3a8ea462a94191635aedc27">IsATTY</a>(<span class="keywordtype">int</span> fd) { <span class="keywordflow">return</span> isatty(fd); }</div><div class="line"><a name="l02289"></a><span class="lineno"> 2289</span> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="namespacetesting_1_1internal_1_1posix.html#a1ef2385a7f8e4c706054da35967e76bd">StrCaseCmp</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* s1, <span class="keyword">const</span> <span class="keywordtype">char</span>* s2) {</div><div class="line"><a name="l02290"></a><span class="lineno"> 2290</span>  <span class="keywordflow">return</span> stricmp(s1, s2);</div><div class="line"><a name="l02291"></a><span class="lineno"> 2291</span> }</div><div class="line"><a name="l02292"></a><span class="lineno"> 2292</span> <span class="keyword">inline</span> <span class="keywordtype">char</span>* <a class="code" href="namespacetesting_1_1internal_1_1posix.html#a8e352884793a65ae8be144676f1a9136">StrDup</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* src) { <span class="keywordflow">return</span> strdup(src); }</div><div class="line"><a name="l02293"></a><span class="lineno"> 2293</span> <span class="preprocessor"># else // !__BORLANDC__</span></div><div class="line"><a name="l02294"></a><span class="lineno"> 2294</span> <span class="preprocessor"># if GTEST_OS_WINDOWS_MOBILE</span></div><div class="line"><a name="l02295"></a><span class="lineno"> 2295</span> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="namespacetesting_1_1internal_1_1posix.html#a16ebe936b3a8ea462a94191635aedc27">IsATTY</a>(<span class="keywordtype">int</span> <span class="comment">/* fd */</span>) { <span class="keywordflow">return</span> 0; }</div><div class="line"><a name="l02296"></a><span class="lineno"> 2296</span> <span class="preprocessor"># else</span></div><div class="line"><a name="l02297"></a><span class="lineno"> 2297</span> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="namespacetesting_1_1internal_1_1posix.html#a16ebe936b3a8ea462a94191635aedc27">IsATTY</a>(<span class="keywordtype">int</span> fd) { <span class="keywordflow">return</span> _isatty(fd); }</div><div class="line"><a name="l02298"></a><span class="lineno"> 2298</span> <span class="preprocessor"># endif // GTEST_OS_WINDOWS_MOBILE</span></div><div class="line"><a name="l02299"></a><span class="lineno"> 2299</span> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="namespacetesting_1_1internal_1_1posix.html#a1ef2385a7f8e4c706054da35967e76bd">StrCaseCmp</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* s1, <span class="keyword">const</span> <span class="keywordtype">char</span>* s2) {</div><div class="line"><a name="l02300"></a><span class="lineno"> 2300</span>  <span class="keywordflow">return</span> _stricmp(s1, s2);</div><div class="line"><a name="l02301"></a><span class="lineno"> 2301</span> }</div><div class="line"><a name="l02302"></a><span class="lineno"> 2302</span> <span class="keyword">inline</span> <span class="keywordtype">char</span>* <a class="code" href="namespacetesting_1_1internal_1_1posix.html#a8e352884793a65ae8be144676f1a9136">StrDup</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* src) { <span class="keywordflow">return</span> _strdup(src); }</div><div class="line"><a name="l02303"></a><span class="lineno"> 2303</span> <span class="preprocessor"># endif // __BORLANDC__</span></div><div class="line"><a name="l02304"></a><span class="lineno"> 2304</span> </div><div class="line"><a name="l02305"></a><span class="lineno"> 2305</span> <span class="preprocessor"># if GTEST_OS_WINDOWS_MOBILE</span></div><div class="line"><a name="l02306"></a><span class="lineno"> 2306</span> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="namespacetesting_1_1internal_1_1posix.html#a3117b067e1f942a2031e666953120ccc">FileNo</a>(FILE* file) { <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(_fileno(file)); }</div><div class="line"><a name="l02307"></a><span class="lineno"> 2307</span> <span class="comment">// Stat(), RmDir(), and IsDir() are not needed on Windows CE at this</span></div><div class="line"><a name="l02308"></a><span class="lineno"> 2308</span> <span class="comment">// time and thus not defined there.</span></div><div class="line"><a name="l02309"></a><span class="lineno"> 2309</span> <span class="preprocessor"># else</span></div><div class="line"><a name="l02310"></a><span class="lineno"> 2310</span> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="namespacetesting_1_1internal_1_1posix.html#a3117b067e1f942a2031e666953120ccc">FileNo</a>(FILE* file) { <span class="keywordflow">return</span> _fileno(file); }</div><div class="line"><a name="l02311"></a><span class="lineno"> 2311</span> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="namespacetesting_1_1internal_1_1posix.html#a2b87b7ff647a128614daf50667eb9304">Stat</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* path, <a class="code" href="namespacetesting_1_1internal_1_1posix.html#a8eb9f08d3af29941c2d2a964cfff3ecb">StatStruct</a>* buf) { <span class="keywordflow">return</span> _stat(path, buf); }</div><div class="line"><a name="l02312"></a><span class="lineno"> 2312</span> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="namespacetesting_1_1internal_1_1posix.html#acbad5d4ea5b73fd1765f5f760642932a">RmDir</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* dir) { <span class="keywordflow">return</span> _rmdir(dir); }</div><div class="line"><a name="l02313"></a><span class="lineno"> 2313</span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="namespacetesting_1_1internal_1_1posix.html#af0d04ed5baeed28353fa38742748a421">IsDir</a>(<span class="keyword">const</span> <a class="code" href="namespacetesting_1_1internal_1_1posix.html#a8eb9f08d3af29941c2d2a964cfff3ecb">StatStruct</a>& st) {</div><div class="line"><a name="l02314"></a><span class="lineno"> 2314</span>  <span class="keywordflow">return</span> (_S_IFDIR & st.st_mode) != 0;</div><div class="line"><a name="l02315"></a><span class="lineno"> 2315</span> }</div><div class="line"><a name="l02316"></a><span class="lineno"> 2316</span> <span class="preprocessor"># endif // GTEST_OS_WINDOWS_MOBILE</span></div><div class="line"><a name="l02317"></a><span class="lineno"> 2317</span> </div><div class="line"><a name="l02318"></a><span class="lineno"> 2318</span> <span class="preprocessor">#else</span></div><div class="line"><a name="l02319"></a><span class="lineno"> 2319</span> </div><div class="line"><a name="l02320"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal_1_1posix.html#a8eb9f08d3af29941c2d2a964cfff3ecb"> 2320</a></span> <span class="keyword">typedef</span> <span class="keyword">struct </span>stat <a class="code" href="namespacetesting_1_1internal_1_1posix.html#a8eb9f08d3af29941c2d2a964cfff3ecb">StatStruct</a>;</div><div class="line"><a name="l02321"></a><span class="lineno"> 2321</span> </div><div class="line"><a name="l02322"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal_1_1posix.html#a3117b067e1f942a2031e666953120ccc"> 2322</a></span> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="namespacetesting_1_1internal_1_1posix.html#a3117b067e1f942a2031e666953120ccc">FileNo</a>(FILE* file) { <span class="keywordflow">return</span> fileno(file); }</div><div class="line"><a name="l02323"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal_1_1posix.html#a16ebe936b3a8ea462a94191635aedc27"> 2323</a></span> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="namespacetesting_1_1internal_1_1posix.html#a16ebe936b3a8ea462a94191635aedc27">IsATTY</a>(<span class="keywordtype">int</span> fd) { <span class="keywordflow">return</span> isatty(fd); }</div><div class="line"><a name="l02324"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal_1_1posix.html#a2b87b7ff647a128614daf50667eb9304"> 2324</a></span> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="namespacetesting_1_1internal_1_1posix.html#a2b87b7ff647a128614daf50667eb9304">Stat</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* path, <a class="code" href="namespacetesting_1_1internal_1_1posix.html#a8eb9f08d3af29941c2d2a964cfff3ecb">StatStruct</a>* buf) { <span class="keywordflow">return</span> stat(path, buf); }</div><div class="line"><a name="l02325"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal_1_1posix.html#a1ef2385a7f8e4c706054da35967e76bd"> 2325</a></span> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="namespacetesting_1_1internal_1_1posix.html#a1ef2385a7f8e4c706054da35967e76bd">StrCaseCmp</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* s1, <span class="keyword">const</span> <span class="keywordtype">char</span>* s2) {</div><div class="line"><a name="l02326"></a><span class="lineno"> 2326</span>  <span class="keywordflow">return</span> strcasecmp(s1, s2);</div><div class="line"><a name="l02327"></a><span class="lineno"> 2327</span> }</div><div class="line"><a name="l02328"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal_1_1posix.html#a8e352884793a65ae8be144676f1a9136"> 2328</a></span> <span class="keyword">inline</span> <span class="keywordtype">char</span>* <a class="code" href="namespacetesting_1_1internal_1_1posix.html#a8e352884793a65ae8be144676f1a9136">StrDup</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* src) { <span class="keywordflow">return</span> strdup(src); }</div><div class="line"><a name="l02329"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal_1_1posix.html#acbad5d4ea5b73fd1765f5f760642932a"> 2329</a></span> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="namespacetesting_1_1internal_1_1posix.html#acbad5d4ea5b73fd1765f5f760642932a">RmDir</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* dir) { <span class="keywordflow">return</span> rmdir(dir); }</div><div class="line"><a name="l02330"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal_1_1posix.html#af0d04ed5baeed28353fa38742748a421"> 2330</a></span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="namespacetesting_1_1internal_1_1posix.html#af0d04ed5baeed28353fa38742748a421">IsDir</a>(<span class="keyword">const</span> <a class="code" href="namespacetesting_1_1internal_1_1posix.html#a8eb9f08d3af29941c2d2a964cfff3ecb">StatStruct</a>& st) { <span class="keywordflow">return</span> S_ISDIR(st.st_mode); }</div><div class="line"><a name="l02331"></a><span class="lineno"> 2331</span> </div><div class="line"><a name="l02332"></a><span class="lineno"> 2332</span> <span class="preprocessor">#endif // GTEST_OS_WINDOWS</span></div><div class="line"><a name="l02333"></a><span class="lineno"> 2333</span> </div><div class="line"><a name="l02334"></a><span class="lineno"> 2334</span> <span class="comment">// Functions deprecated by MSVC 8.0.</span></div><div class="line"><a name="l02335"></a><span class="lineno"> 2335</span> </div><div class="line"><a name="l02336"></a><span class="lineno"> 2336</span> <a class="code" href="gtest_8h.html#a5b130138db254deaf29dbe3dffa1a2a8">GTEST_DISABLE_MSC_DEPRECATED_PUSH_</a>()</div><div class="line"><a name="l02337"></a><span class="lineno"> 2337</span> </div><div class="line"><a name="l02338"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal_1_1posix.html#a36fca815713332e5c6dc92c98b6b2574"> 2338</a></span> inline const <span class="keywordtype">char</span>* <a class="code" href="namespacetesting_1_1internal_1_1posix.html#a36fca815713332e5c6dc92c98b6b2574">StrNCpy</a>(<span class="keywordtype">char</span>* dest, const <span class="keywordtype">char</span>* src, <span class="keywordtype">size_t</span> n) {</div><div class="line"><a name="l02339"></a><span class="lineno"> 2339</span>  <span class="keywordflow">return</span> strncpy(dest, src, n);</div><div class="line"><a name="l02340"></a><span class="lineno"> 2340</span> }</div><div class="line"><a name="l02341"></a><span class="lineno"> 2341</span> </div><div class="line"><a name="l02342"></a><span class="lineno"> 2342</span> <span class="comment">// ChDir(), FReopen(), FDOpen(), Read(), Write(), Close(), and</span></div><div class="line"><a name="l02343"></a><span class="lineno"> 2343</span> <span class="comment">// StrError() aren't needed on Windows CE at this time and thus not</span></div><div class="line"><a name="l02344"></a><span class="lineno"> 2344</span> <span class="comment">// defined there.</span></div><div class="line"><a name="l02345"></a><span class="lineno"> 2345</span> </div><div class="line"><a name="l02346"></a><span class="lineno"> 2346</span> <span class="preprocessor">#if !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT</span></div><div class="line"><a name="l02347"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal_1_1posix.html#a1ddc8a4fc6bb21da372307485591a212"> 2347</a></span> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="namespacetesting_1_1internal_1_1posix.html#a1ddc8a4fc6bb21da372307485591a212">ChDir</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* dir) { <span class="keywordflow">return</span> chdir(dir); }</div><div class="line"><a name="l02348"></a><span class="lineno"> 2348</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l02349"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal_1_1posix.html#a4042201dcc4932641d484e7ddf94de7d"> 2349</a></span> <span class="keyword">inline</span> FILE* <a class="code" href="namespacetesting_1_1internal_1_1posix.html#a4042201dcc4932641d484e7ddf94de7d">FOpen</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* path, <span class="keyword">const</span> <span class="keywordtype">char</span>* mode) {</div><div class="line"><a name="l02350"></a><span class="lineno"> 2350</span>  <span class="keywordflow">return</span> fopen(path, mode);</div><div class="line"><a name="l02351"></a><span class="lineno"> 2351</span> }</div><div class="line"><a name="l02352"></a><span class="lineno"> 2352</span> <span class="preprocessor">#if !GTEST_OS_WINDOWS_MOBILE</span></div><div class="line"><a name="l02353"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal_1_1posix.html#a9ef6d089cdae03f9d9e0e6d379c40703"> 2353</a></span> <span class="keyword">inline</span> FILE *<a class="code" href="namespacetesting_1_1internal_1_1posix.html#a9ef6d089cdae03f9d9e0e6d379c40703">FReopen</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* path, <span class="keyword">const</span> <span class="keywordtype">char</span>* mode, FILE* stream) {</div><div class="line"><a name="l02354"></a><span class="lineno"> 2354</span>  <span class="keywordflow">return</span> freopen(path, mode, stream);</div><div class="line"><a name="l02355"></a><span class="lineno"> 2355</span> }</div><div class="line"><a name="l02356"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal_1_1posix.html#af7c268eba32d5a718b36b6b3801302e0"> 2356</a></span> <span class="keyword">inline</span> FILE* <a class="code" href="namespacetesting_1_1internal_1_1posix.html#af7c268eba32d5a718b36b6b3801302e0">FDOpen</a>(<span class="keywordtype">int</span> fd, <span class="keyword">const</span> <span class="keywordtype">char</span>* mode) { <span class="keywordflow">return</span> fdopen(fd, mode); }</div><div class="line"><a name="l02357"></a><span class="lineno"> 2357</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l02358"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal_1_1posix.html#af4beeaaa8d62916d5e3b644a1ddfbd6b"> 2358</a></span> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="namespacetesting_1_1internal_1_1posix.html#af4beeaaa8d62916d5e3b644a1ddfbd6b">FClose</a>(FILE* fp) { <span class="keywordflow">return</span> fclose(fp); }</div><div class="line"><a name="l02359"></a><span class="lineno"> 2359</span> <span class="preprocessor">#if !GTEST_OS_WINDOWS_MOBILE</span></div><div class="line"><a name="l02360"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal_1_1posix.html#a3c6ab13e581a56f1b02f3eb7536c97fd"> 2360</a></span> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="namespacetesting_1_1internal_1_1posix.html#a3c6ab13e581a56f1b02f3eb7536c97fd">Read</a>(<span class="keywordtype">int</span> fd, <span class="keywordtype">void</span>* buf, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="namespaceutl_1_1meta.html#ab5508236016638fa8e6b97cd17dfc9c2">count</a>) {</div><div class="line"><a name="l02361"></a><span class="lineno"> 2361</span>  <span class="keywordflow">return</span> <span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(read(fd, buf, <a class="code" href="namespaceutl_1_1meta.html#ab5508236016638fa8e6b97cd17dfc9c2">count</a>));</div><div class="line"><a name="l02362"></a><span class="lineno"> 2362</span> }</div><div class="line"><a name="l02363"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal_1_1posix.html#af4acf9f78d55f815a18b43786511abef"> 2363</a></span> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="namespacetesting_1_1internal_1_1posix.html#af4acf9f78d55f815a18b43786511abef">Write</a>(<span class="keywordtype">int</span> fd, <span class="keyword">const</span> <span class="keywordtype">void</span>* buf, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="namespaceutl_1_1meta.html#ab5508236016638fa8e6b97cd17dfc9c2">count</a>) {</div><div class="line"><a name="l02364"></a><span class="lineno"> 2364</span>  <span class="keywordflow">return</span> <span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(write(fd, buf, <a class="code" href="namespaceutl_1_1meta.html#ab5508236016638fa8e6b97cd17dfc9c2">count</a>));</div><div class="line"><a name="l02365"></a><span class="lineno"> 2365</span> }</div><div class="line"><a name="l02366"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal_1_1posix.html#a15e5b8f2a535ef1b2529b85b861e4846"> 2366</a></span> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="namespacetesting_1_1internal_1_1posix.html#a15e5b8f2a535ef1b2529b85b861e4846">Close</a>(<span class="keywordtype">int</span> fd) { <span class="keywordflow">return</span> close(fd); }</div><div class="line"><a name="l02367"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal_1_1posix.html#a4b77b14af6f4d18f83d303b98e9349c4"> 2367</a></span> <span class="keyword">inline</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="namespacetesting_1_1internal_1_1posix.html#a4b77b14af6f4d18f83d303b98e9349c4">StrError</a>(<span class="keywordtype">int</span> errnum) { <span class="keywordflow">return</span> strerror(errnum); }</div><div class="line"><a name="l02368"></a><span class="lineno"> 2368</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l02369"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal_1_1posix.html#a1d5e3da5a27eed25986859fa83cafe95"> 2369</a></span> <span class="keyword">inline</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="namespacetesting_1_1internal_1_1posix.html#a1d5e3da5a27eed25986859fa83cafe95">GetEnv</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* name) {</div><div class="line"><a name="l02370"></a><span class="lineno"> 2370</span> <span class="preprocessor">#if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_WINDOWS_PHONE || GTEST_OS_WINDOWS_RT</span></div><div class="line"><a name="l02371"></a><span class="lineno"> 2371</span>  <span class="comment">// We are on Windows CE, which has no environment variables.</span></div><div class="line"><a name="l02372"></a><span class="lineno"> 2372</span>  <span class="keyword">static_cast<</span><span class="keywordtype">void</span><span class="keyword">></span>(name); <span class="comment">// To prevent 'unused argument' warning.</span></div><div class="line"><a name="l02373"></a><span class="lineno"> 2373</span>  <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div><div class="line"><a name="l02374"></a><span class="lineno"> 2374</span> <span class="preprocessor">#elif defined(__BORLANDC__) || defined(__SunOS_5_8) || defined(__SunOS_5_9)</span></div><div class="line"><a name="l02375"></a><span class="lineno"> 2375</span>  <span class="comment">// Environment variables which we programmatically clear will be set to the</span></div><div class="line"><a name="l02376"></a><span class="lineno"> 2376</span>  <span class="comment">// empty string rather than unset (NULL). Handle that case.</span></div><div class="line"><a name="l02377"></a><span class="lineno"> 2377</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* <span class="keyword">const</span> env = getenv(name);</div><div class="line"><a name="l02378"></a><span class="lineno"> 2378</span>  <span class="keywordflow">return</span> (env != <span class="keyword">nullptr</span> && env[0] != <span class="charliteral">'\0'</span>) ? env : <span class="keyword">nullptr</span>;</div><div class="line"><a name="l02379"></a><span class="lineno"> 2379</span> <span class="preprocessor">#else</span></div><div class="line"><a name="l02380"></a><span class="lineno"> 2380</span>  <span class="keywordflow">return</span> getenv(name);</div><div class="line"><a name="l02381"></a><span class="lineno"> 2381</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l02382"></a><span class="lineno"> 2382</span> }</div><div class="line"><a name="l02383"></a><span class="lineno"> 2383</span> </div><div class="line"><a name="l02384"></a><span class="lineno"> 2384</span> <a class="code" href="gtest_8h.html#aa0dc86dc9837f1610e91da65458f53b3">GTEST_DISABLE_MSC_DEPRECATED_POP_</a>()</div><div class="line"><a name="l02385"></a><span class="lineno"> 2385</span> </div><div class="line"><a name="l02386"></a><span class="lineno"> 2386</span> <span class="preprocessor">#if GTEST_OS_WINDOWS_MOBILE</span></div><div class="line"><a name="l02387"></a><span class="lineno"> 2387</span> <span class="comment">// Windows CE has no C library. The abort() function is used in</span></div><div class="line"><a name="l02388"></a><span class="lineno"> 2388</span> <span class="comment">// several places in Google Test. This implementation provides a reasonable</span></div><div class="line"><a name="l02389"></a><span class="lineno"> 2389</span> <span class="comment">// imitation of standard behaviour.</span></div><div class="line"><a name="l02390"></a><span class="lineno"> 2390</span> [[noreturn]] <span class="keywordtype">void</span> <a class="code" href="namespacetesting_1_1internal_1_1posix.html#a69b8278c59359dd6a6f941b4643db9fb">Abort</a>();</div><div class="line"><a name="l02391"></a><span class="lineno"> 2391</span> <span class="preprocessor">#else</span></div><div class="line"><a name="l02392"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal_1_1posix.html#a69b8278c59359dd6a6f941b4643db9fb"> 2392</a></span> [[noreturn]] <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="namespacetesting_1_1internal_1_1posix.html#a69b8278c59359dd6a6f941b4643db9fb">Abort</a>() { abort(); }</div><div class="line"><a name="l02393"></a><span class="lineno"> 2393</span> <span class="preprocessor">#endif // GTEST_OS_WINDOWS_MOBILE</span></div><div class="line"><a name="l02394"></a><span class="lineno"> 2394</span> </div><div class="line"><a name="l02395"></a><span class="lineno"> 2395</span> } <span class="comment">// namespace posix</span></div><div class="line"><a name="l02396"></a><span class="lineno"> 2396</span> </div><div class="line"><a name="l02397"></a><span class="lineno"> 2397</span> <span class="comment">// MSVC "deprecates" snprintf and issues warnings wherever it is used. In</span></div><div class="line"><a name="l02398"></a><span class="lineno"> 2398</span> <span class="comment">// order to avoid these warnings, we need to use _snprintf or _snprintf_s on</span></div><div class="line"><a name="l02399"></a><span class="lineno"> 2399</span> <span class="comment">// MSVC-based platforms. We map the GTEST_SNPRINTF_ macro to the appropriate</span></div><div class="line"><a name="l02400"></a><span class="lineno"> 2400</span> <span class="comment">// function in order to achieve that. We use macro definition here because</span></div><div class="line"><a name="l02401"></a><span class="lineno"> 2401</span> <span class="comment">// snprintf is a variadic function.</span></div><div class="line"><a name="l02402"></a><span class="lineno"> 2402</span> <span class="preprocessor">#if _MSC_VER && !GTEST_OS_WINDOWS_MOBILE</span></div><div class="line"><a name="l02403"></a><span class="lineno"> 2403</span> <span class="comment">// MSVC 2005 and above support variadic macros.</span></div><div class="line"><a name="l02404"></a><span class="lineno"> 2404</span> <span class="preprocessor"># define GTEST_SNPRINTF_(buffer, size, format, ...) \</span></div><div class="line"><a name="l02405"></a><span class="lineno"> 2405</span> <span class="preprocessor"> _snprintf_s(buffer, size, size, format, __VA_ARGS__)</span></div><div class="line"><a name="l02406"></a><span class="lineno"> 2406</span> <span class="preprocessor">#elif defined(_MSC_VER)</span></div><div class="line"><a name="l02407"></a><span class="lineno"> 2407</span> <span class="comment">// Windows CE does not define _snprintf_s</span></div><div class="line"><a name="l02408"></a><span class="lineno"> 2408</span> <span class="preprocessor"># define GTEST_SNPRINTF_ _snprintf</span></div><div class="line"><a name="l02409"></a><span class="lineno"> 2409</span> <span class="preprocessor">#else</span></div><div class="line"><a name="l02410"></a><span class="lineno"><a class="line" href="gtest_8h.html#aed1cc8143222d7a845a1269448ec203e"> 2410</a></span> <span class="preprocessor"># define GTEST_SNPRINTF_ snprintf</span></div><div class="line"><a name="l02411"></a><span class="lineno"> 2411</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l02412"></a><span class="lineno"> 2412</span> </div><div class="line"><a name="l02413"></a><span class="lineno"> 2413</span> <span class="comment">// The maximum number a BiggestInt can represent. This definition</span></div><div class="line"><a name="l02414"></a><span class="lineno"> 2414</span> <span class="comment">// works no matter BiggestInt is represented in one's complement or</span></div><div class="line"><a name="l02415"></a><span class="lineno"> 2415</span> <span class="comment">// two's complement.</span></div><div class="line"><a name="l02416"></a><span class="lineno"> 2416</span> <span class="comment">//</span></div><div class="line"><a name="l02417"></a><span class="lineno"> 2417</span> <span class="comment">// We cannot rely on numeric_limits in STL, as __int64 and long long</span></div><div class="line"><a name="l02418"></a><span class="lineno"> 2418</span> <span class="comment">// are not part of standard C++ and numeric_limits doesn't need to be</span></div><div class="line"><a name="l02419"></a><span class="lineno"> 2419</span> <span class="comment">// defined for them.</span></div><div class="line"><a name="l02420"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#ad901880198832bc166d2493096b451f7"> 2420</a></span> <span class="keyword">const</span> <a class="code" href="namespacetesting_1_1internal.html#a05c6bd9ede5ccdf25191a590d610dcc6">BiggestInt</a> <a class="code" href="namespacetesting_1_1internal.html#ad901880198832bc166d2493096b451f7">kMaxBiggestInt</a> =</div><div class="line"><a name="l02421"></a><span class="lineno"> 2421</span>  ~(<span class="keyword">static_cast<</span><a class="code" href="namespacetesting_1_1internal.html#a05c6bd9ede5ccdf25191a590d610dcc6">BiggestInt</a><span class="keyword">></span>(1) << (8*<span class="keyword">sizeof</span>(<a class="code" href="namespacetesting_1_1internal.html#a05c6bd9ede5ccdf25191a590d610dcc6">BiggestInt</a>) - 1));</div><div class="line"><a name="l02422"></a><span class="lineno"> 2422</span> </div><div class="line"><a name="l02423"></a><span class="lineno"> 2423</span> <span class="comment">// This template class serves as a compile-time function from size to</span></div><div class="line"><a name="l02424"></a><span class="lineno"> 2424</span> <span class="comment">// type. It maps a size in bytes to a primitive type with that</span></div><div class="line"><a name="l02425"></a><span class="lineno"> 2425</span> <span class="comment">// size. e.g.</span></div><div class="line"><a name="l02426"></a><span class="lineno"> 2426</span> <span class="comment">//</span></div><div class="line"><a name="l02427"></a><span class="lineno"> 2427</span> <span class="comment">// TypeWithSize<4>::UInt</span></div><div class="line"><a name="l02428"></a><span class="lineno"> 2428</span> <span class="comment">//</span></div><div class="line"><a name="l02429"></a><span class="lineno"> 2429</span> <span class="comment">// is typedef-ed to be unsigned int (unsigned integer made up of 4</span></div><div class="line"><a name="l02430"></a><span class="lineno"> 2430</span> <span class="comment">// bytes).</span></div><div class="line"><a name="l02431"></a><span class="lineno"> 2431</span> <span class="comment">//</span></div><div class="line"><a name="l02432"></a><span class="lineno"> 2432</span> <span class="comment">// Such functionality should belong to STL, but I cannot find it</span></div><div class="line"><a name="l02433"></a><span class="lineno"> 2433</span> <span class="comment">// there.</span></div><div class="line"><a name="l02434"></a><span class="lineno"> 2434</span> <span class="comment">//</span></div><div class="line"><a name="l02435"></a><span class="lineno"> 2435</span> <span class="comment">// Google Test uses this class in the implementation of floating-point</span></div><div class="line"><a name="l02436"></a><span class="lineno"> 2436</span> <span class="comment">// comparison.</span></div><div class="line"><a name="l02437"></a><span class="lineno"> 2437</span> <span class="comment">//</span></div><div class="line"><a name="l02438"></a><span class="lineno"> 2438</span> <span class="comment">// For now it only handles UInt (unsigned int) as that's all Google Test</span></div><div class="line"><a name="l02439"></a><span class="lineno"> 2439</span> <span class="comment">// needs. Other types can be easily added in the future if need</span></div><div class="line"><a name="l02440"></a><span class="lineno"> 2440</span> <span class="comment">// arises.</span></div><div class="line"><a name="l02441"></a><span class="lineno"> 2441</span> <span class="keyword">template</span> <<span class="keywordtype">size_t</span> size></div><div class="line"><a name="l02442"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_type_with_size.html"> 2442</a></span> <span class="keyword">class </span><a class="code" href="classtesting_1_1internal_1_1_type_with_size.html">TypeWithSize</a> {</div><div class="line"><a name="l02443"></a><span class="lineno"> 2443</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l02444"></a><span class="lineno"> 2444</span>  <span class="comment">// This prevents the user from using TypeWithSize<N> with incorrect</span></div><div class="line"><a name="l02445"></a><span class="lineno"> 2445</span>  <span class="comment">// values of N.</span></div><div class="line"><a name="l02446"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_type_with_size.html#a3898640d9f6c1e18110eef90f47a5d7b"> 2446</a></span>  <span class="keyword">typedef</span> <span class="keywordtype">void</span> <a class="code" href="classtesting_1_1internal_1_1_type_with_size.html#a3898640d9f6c1e18110eef90f47a5d7b">UInt</a>;</div><div class="line"><a name="l02447"></a><span class="lineno"> 2447</span> };</div><div class="line"><a name="l02448"></a><span class="lineno"> 2448</span> </div><div class="line"><a name="l02449"></a><span class="lineno"> 2449</span> <span class="comment">// The specialization for size 4.</span></div><div class="line"><a name="l02450"></a><span class="lineno"> 2450</span> <span class="keyword">template</span> <></div><div class="line"><a name="l02451"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_type_with_size_3_014_01_4.html"> 2451</a></span> <span class="keyword">class </span><a class="code" href="classtesting_1_1internal_1_1_type_with_size.html">TypeWithSize</a><4> {</div><div class="line"><a name="l02452"></a><span class="lineno"> 2452</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l02453"></a><span class="lineno"> 2453</span>  <span class="comment">// unsigned int has size 4 in both gcc and MSVC.</span></div><div class="line"><a name="l02454"></a><span class="lineno"> 2454</span>  <span class="comment">//</span></div><div class="line"><a name="l02455"></a><span class="lineno"> 2455</span>  <span class="comment">// As base/basictypes.h doesn't compile on Windows, we cannot use</span></div><div class="line"><a name="l02456"></a><span class="lineno"> 2456</span>  <span class="comment">// uint32, uint64, and etc here.</span></div><div class="line"><a name="l02457"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_type_with_size_3_014_01_4.html#a80351860c00ed665e73f952143f4484a"> 2457</a></span>  <span class="keyword">typedef</span> <span class="keywordtype">int</span> <a class="code" href="classtesting_1_1internal_1_1_type_with_size_3_014_01_4.html#a80351860c00ed665e73f952143f4484a">Int</a>;</div><div class="line"><a name="l02458"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_type_with_size_3_014_01_4.html#a7d559570f830bf35d095eeb94d98de58"> 2458</a></span>  <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="classtesting_1_1internal_1_1_type_with_size_3_014_01_4.html#a7d559570f830bf35d095eeb94d98de58">UInt</a>;</div><div class="line"><a name="l02459"></a><span class="lineno"> 2459</span> };</div><div class="line"><a name="l02460"></a><span class="lineno"> 2460</span> </div><div class="line"><a name="l02461"></a><span class="lineno"> 2461</span> <span class="comment">// The specialization for size 8.</span></div><div class="line"><a name="l02462"></a><span class="lineno"> 2462</span> <span class="keyword">template</span> <></div><div class="line"><a name="l02463"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_type_with_size_3_018_01_4.html"> 2463</a></span> <span class="keyword">class </span><a class="code" href="classtesting_1_1internal_1_1_type_with_size.html">TypeWithSize</a><8> {</div><div class="line"><a name="l02464"></a><span class="lineno"> 2464</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l02465"></a><span class="lineno"> 2465</span> <span class="preprocessor">#if GTEST_OS_WINDOWS</span></div><div class="line"><a name="l02466"></a><span class="lineno"> 2466</span>  <span class="keyword">typedef</span> __int64 <a class="code" href="classtesting_1_1internal_1_1_type_with_size_3_018_01_4.html#a36d5697e5f5254b0495f13c97d747e36">Int</a>;</div><div class="line"><a name="l02467"></a><span class="lineno"> 2467</span>  <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> __int64 <a class="code" href="classtesting_1_1internal_1_1_type_with_size.html#a3898640d9f6c1e18110eef90f47a5d7b">UInt</a>;</div><div class="line"><a name="l02468"></a><span class="lineno"> 2468</span> <span class="preprocessor">#else</span></div><div class="line"><a name="l02469"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_type_with_size_3_018_01_4.html#a36d5697e5f5254b0495f13c97d747e36"> 2469</a></span>  <span class="keyword">typedef</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span> <a class="code" href="classtesting_1_1internal_1_1_type_with_size_3_018_01_4.html#a36d5697e5f5254b0495f13c97d747e36">Int</a>; <span class="comment">// NOLINT</span></div><div class="line"><a name="l02470"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_type_with_size_3_018_01_4.html#a747e21c5aee8faf07ec65cd4c3d1ca62"> 2470</a></span>  <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span> <a class="code" href="classtesting_1_1internal_1_1_type_with_size_3_018_01_4.html#a747e21c5aee8faf07ec65cd4c3d1ca62">UInt</a>; <span class="comment">// NOLINT</span></div><div class="line"><a name="l02471"></a><span class="lineno"> 2471</span> <span class="preprocessor">#endif // GTEST_OS_WINDOWS</span></div><div class="line"><a name="l02472"></a><span class="lineno"> 2472</span> };</div><div class="line"><a name="l02473"></a><span class="lineno"> 2473</span> </div><div class="line"><a name="l02474"></a><span class="lineno"> 2474</span> <span class="comment">// Integer types of known sizes.</span></div><div class="line"><a name="l02475"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#a8ee38faaf875f133358abaf9bc056cec"> 2475</a></span> <span class="keyword">typedef</span> <a class="code" href="classtesting_1_1internal_1_1_type_with_size.html">TypeWithSize<4>::Int</a> <a class="code" href="namespacetesting_1_1internal.html#a8ee38faaf875f133358abaf9bc056cec">Int32</a>;</div><div class="line"><a name="l02476"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#a40d4fffcd2bf56f18b1c380615aa85e3"> 2476</a></span> <span class="keyword">typedef</span> <a class="code" href="classtesting_1_1internal_1_1_type_with_size.html#a3898640d9f6c1e18110eef90f47a5d7b">TypeWithSize<4>::UInt</a> <a class="code" href="namespacetesting_1_1internal.html#a40d4fffcd2bf56f18b1c380615aa85e3">UInt32</a>;</div><div class="line"><a name="l02477"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#a271c563fec38b804ddab0677f51f70a8"> 2477</a></span> <span class="keyword">typedef</span> <a class="code" href="classtesting_1_1internal_1_1_type_with_size.html">TypeWithSize<8>::Int</a> <a class="code" href="namespacetesting_1_1internal.html#a271c563fec38b804ddab0677f51f70a8">Int64</a>;</div><div class="line"><a name="l02478"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#aa6a1ac454e6d7e550fa4925c62c35caa"> 2478</a></span> <span class="keyword">typedef</span> <a class="code" href="classtesting_1_1internal_1_1_type_with_size.html#a3898640d9f6c1e18110eef90f47a5d7b">TypeWithSize<8>::UInt</a> <a class="code" href="namespacetesting_1_1internal.html#aa6a1ac454e6d7e550fa4925c62c35caa">UInt64</a>;</div><div class="line"><a name="l02479"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#a66a845df404b38fe85c5e14a069f255a"> 2479</a></span> <span class="keyword">typedef</span> <a class="code" href="classtesting_1_1internal_1_1_type_with_size.html">TypeWithSize<8>::Int</a> <a class="code" href="namespacetesting_1_1internal.html#a66a845df404b38fe85c5e14a069f255a">TimeInMillis</a>; <span class="comment">// Represents time in milliseconds.</span></div><div class="line"><a name="l02480"></a><span class="lineno"> 2480</span> </div><div class="line"><a name="l02481"></a><span class="lineno"> 2481</span> <span class="comment">// Utilities for command line flags and environment variables.</span></div><div class="line"><a name="l02482"></a><span class="lineno"> 2482</span> </div><div class="line"><a name="l02483"></a><span class="lineno"> 2483</span> <span class="comment">// Macro for referencing flags.</span></div><div class="line"><a name="l02484"></a><span class="lineno"> 2484</span> <span class="preprocessor">#if !defined(GTEST_FLAG)</span></div><div class="line"><a name="l02485"></a><span class="lineno"><a class="line" href="gtest_8h.html#a828f4e34a1c4b510da50ec1563e3562a"> 2485</a></span> <span class="preprocessor"># define GTEST_FLAG(name) FLAGS_gtest_##name</span></div><div class="line"><a name="l02486"></a><span class="lineno"> 2486</span> <span class="preprocessor">#endif // !defined(GTEST_FLAG)</span></div><div class="line"><a name="l02487"></a><span class="lineno"> 2487</span> </div><div class="line"><a name="l02488"></a><span class="lineno"> 2488</span> <span class="preprocessor">#if !defined(GTEST_USE_OWN_FLAGFILE_FLAG_)</span></div><div class="line"><a name="l02489"></a><span class="lineno"><a class="line" href="gtest_8h.html#aa2315948dda8dba4fc516575657f193c"> 2489</a></span> <span class="preprocessor"># define GTEST_USE_OWN_FLAGFILE_FLAG_ 1</span></div><div class="line"><a name="l02490"></a><span class="lineno"> 2490</span> <span class="preprocessor">#endif // !defined(GTEST_USE_OWN_FLAGFILE_FLAG_)</span></div><div class="line"><a name="l02491"></a><span class="lineno"> 2491</span> </div><div class="line"><a name="l02492"></a><span class="lineno"> 2492</span> <span class="preprocessor">#if !defined(GTEST_DECLARE_bool_)</span></div><div class="line"><a name="l02493"></a><span class="lineno"><a class="line" href="gtest_8h.html#a3749ef4fba6b3c3993609b336031644d"> 2493</a></span> <span class="preprocessor"># define GTEST_FLAG_SAVER_ ::testing::internal::GTestFlagSaver</span></div><div class="line"><a name="l02494"></a><span class="lineno"> 2494</span> </div><div class="line"><a name="l02495"></a><span class="lineno"> 2495</span> <span class="comment">// Macros for declaring flags.</span></div><div class="line"><a name="l02496"></a><span class="lineno"><a class="line" href="gtest_8h.html#a14eb0e9c6e0df765d1fbfd2db6966d14"> 2496</a></span> <span class="preprocessor"># define GTEST_DECLARE_bool_(name) GTEST_API_ extern bool GTEST_FLAG(name)</span></div><div class="line"><a name="l02497"></a><span class="lineno"><a class="line" href="gtest_8h.html#aab2ee98cb616054b1d3a7dc71efe81fc"> 2497</a></span> <span class="preprocessor"># define GTEST_DECLARE_int32_(name) \</span></div><div class="line"><a name="l02498"></a><span class="lineno"> 2498</span> <span class="preprocessor"> GTEST_API_ extern ::testing::internal::Int32 GTEST_FLAG(name)</span></div><div class="line"><a name="l02499"></a><span class="lineno"><a class="line" href="gtest_8h.html#a9f74eee05f7ee5534139a622fe7da7dd"> 2499</a></span> <span class="preprocessor"># define GTEST_DECLARE_string_(name) \</span></div><div class="line"><a name="l02500"></a><span class="lineno"> 2500</span> <span class="preprocessor"> GTEST_API_ extern ::std::string GTEST_FLAG(name)</span></div><div class="line"><a name="l02501"></a><span class="lineno"> 2501</span> </div><div class="line"><a name="l02502"></a><span class="lineno"> 2502</span> <span class="comment">// Macros for defining flags.</span></div><div class="line"><a name="l02503"></a><span class="lineno"><a class="line" href="gtest_8h.html#a48e05814779e5a2f432b06a12618a760"> 2503</a></span> <span class="preprocessor"># define GTEST_DEFINE_bool_(name, default_val, doc) \</span></div><div class="line"><a name="l02504"></a><span class="lineno"> 2504</span> <span class="preprocessor"> GTEST_API_ bool GTEST_FLAG(name) = (default_val)</span></div><div class="line"><a name="l02505"></a><span class="lineno"><a class="line" href="gtest_8h.html#a88ee2f19589ffff86ca742fd33611358"> 2505</a></span> <span class="preprocessor"># define GTEST_DEFINE_int32_(name, default_val, doc) \</span></div><div class="line"><a name="l02506"></a><span class="lineno"> 2506</span> <span class="preprocessor"> GTEST_API_ ::testing::internal::Int32 GTEST_FLAG(name) = (default_val)</span></div><div class="line"><a name="l02507"></a><span class="lineno"><a class="line" href="gtest_8h.html#a885e18fe217a6e85553d408b99252c12"> 2507</a></span> <span class="preprocessor"># define GTEST_DEFINE_string_(name, default_val, doc) \</span></div><div class="line"><a name="l02508"></a><span class="lineno"> 2508</span> <span class="preprocessor"> GTEST_API_ ::std::string GTEST_FLAG(name) = (default_val)</span></div><div class="line"><a name="l02509"></a><span class="lineno"> 2509</span> </div><div class="line"><a name="l02510"></a><span class="lineno"> 2510</span> <span class="preprocessor">#endif // !defined(GTEST_DECLARE_bool_)</span></div><div class="line"><a name="l02511"></a><span class="lineno"> 2511</span> </div><div class="line"><a name="l02512"></a><span class="lineno"> 2512</span> <span class="comment">// Thread annotations</span></div><div class="line"><a name="l02513"></a><span class="lineno"> 2513</span> <span class="preprocessor">#if !defined(GTEST_EXCLUSIVE_LOCK_REQUIRED_)</span></div><div class="line"><a name="l02514"></a><span class="lineno"><a class="line" href="gtest_8h.html#a149f693bd59fa1bc937af54c0cdcb32f"> 2514</a></span> <span class="preprocessor"># define GTEST_EXCLUSIVE_LOCK_REQUIRED_(locks)</span></div><div class="line"><a name="l02515"></a><span class="lineno"><a class="line" href="gtest_8h.html#a69abff5a4efdd07bd5faebe3dd318d06"> 2515</a></span> <span class="preprocessor"># define GTEST_LOCK_EXCLUDED_(locks)</span></div><div class="line"><a name="l02516"></a><span class="lineno"> 2516</span> <span class="preprocessor">#endif // !defined(GTEST_EXCLUSIVE_LOCK_REQUIRED_)</span></div><div class="line"><a name="l02517"></a><span class="lineno"> 2517</span> </div><div class="line"><a name="l02518"></a><span class="lineno"> 2518</span> <span class="comment">// Parses 'str' for a 32-bit signed integer. If successful, writes the result</span></div><div class="line"><a name="l02519"></a><span class="lineno"> 2519</span> <span class="comment">// to *value and returns true; otherwise leaves *value unchanged and returns</span></div><div class="line"><a name="l02520"></a><span class="lineno"> 2520</span> <span class="comment">// false.</span></div><div class="line"><a name="l02521"></a><span class="lineno"> 2521</span> <span class="keywordtype">bool</span> <a class="code" href="namespacetesting_1_1internal.html#ac06fc81336a3d80755f4020d34321766">ParseInt32</a>(<span class="keyword">const</span> Message& src_text, <span class="keyword">const</span> <span class="keywordtype">char</span>* str, <a class="code" href="namespacetesting_1_1internal.html#a8ee38faaf875f133358abaf9bc056cec">Int32</a>* value);</div><div class="line"><a name="l02522"></a><span class="lineno"> 2522</span> </div><div class="line"><a name="l02523"></a><span class="lineno"> 2523</span> <span class="comment">// Parses a bool/Int32/string from the environment variable</span></div><div class="line"><a name="l02524"></a><span class="lineno"> 2524</span> <span class="comment">// corresponding to the given Google Test flag.</span></div><div class="line"><a name="l02525"></a><span class="lineno"> 2525</span> <span class="keywordtype">bool</span> <a class="code" href="namespacetesting_1_1internal.html#a1055088bb9b867e1b7b8f096f519d7c5">BoolFromGTestEnv</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* flag, <span class="keywordtype">bool</span> default_val);</div><div class="line"><a name="l02526"></a><span class="lineno"> 2526</span> <a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> <a class="code" href="namespacetesting_1_1internal.html#a8ee38faaf875f133358abaf9bc056cec">Int32</a> <a class="code" href="namespacetesting_1_1internal.html#a2196f070b2d28bceb45c7ad3b565b9ba">Int32FromGTestEnv</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* flag, <a class="code" href="namespacetesting_1_1internal.html#a8ee38faaf875f133358abaf9bc056cec">Int32</a> default_val);</div><div class="line"><a name="l02527"></a><span class="lineno"> 2527</span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a> <a class="code" href="namespacetesting_1_1internal.html#a0c793c6d84760d900299916c077a1af4">OutputFlagAlsoCheckEnvVar</a>();</div><div class="line"><a name="l02528"></a><span class="lineno"> 2528</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="namespacetesting_1_1internal.html#a0967cbf18fb1594f82512d8d822aba21">StringFromGTestEnv</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* flag, <span class="keyword">const</span> <span class="keywordtype">char</span>* default_val);</div><div class="line"><a name="l02529"></a><span class="lineno"> 2529</span> </div><div class="line"><a name="l02530"></a><span class="lineno"> 2530</span> } <span class="comment">// namespace internal</span></div><div class="line"><a name="l02531"></a><span class="lineno"> 2531</span> } <span class="comment">// namespace testing</span></div><div class="line"><a name="l02532"></a><span class="lineno"> 2532</span> </div><div class="line"><a name="l02533"></a><span class="lineno"> 2533</span> <span class="preprocessor">#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_</span></div><div class="line"><a name="l02534"></a><span class="lineno"> 2534</span> </div><div class="line"><a name="l02535"></a><span class="lineno"> 2535</span> <span class="preprocessor">#if GTEST_OS_LINUX</span></div><div class="line"><a name="l02536"></a><span class="lineno"> 2536</span> <span class="preprocessor"># include <stdlib.h></span></div><div class="line"><a name="l02537"></a><span class="lineno"> 2537</span> <span class="preprocessor"># include <sys/types.h></span></div><div class="line"><a name="l02538"></a><span class="lineno"> 2538</span> <span class="preprocessor"># include <sys/wait.h></span></div><div class="line"><a name="l02539"></a><span class="lineno"> 2539</span> <span class="preprocessor"># include <unistd.h></span></div><div class="line"><a name="l02540"></a><span class="lineno"> 2540</span> <span class="preprocessor">#endif // GTEST_OS_LINUX</span></div><div class="line"><a name="l02541"></a><span class="lineno"> 2541</span> </div><div class="line"><a name="l02542"></a><span class="lineno"> 2542</span> <span class="preprocessor">#if GTEST_HAS_EXCEPTIONS</span></div><div class="line"><a name="l02543"></a><span class="lineno"> 2543</span> <span class="preprocessor"># include <stdexcept></span></div><div class="line"><a name="l02544"></a><span class="lineno"> 2544</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l02545"></a><span class="lineno"> 2545</span> </div><div class="line"><a name="l02546"></a><span class="lineno"> 2546</span> <span class="preprocessor">#include <ctype.h></span></div><div class="line"><a name="l02547"></a><span class="lineno"> 2547</span> <span class="preprocessor">#include <float.h></span></div><div class="line"><a name="l02548"></a><span class="lineno"> 2548</span> <span class="preprocessor">#include <string.h></span></div><div class="line"><a name="l02549"></a><span class="lineno"> 2549</span> <span class="preprocessor">#include <iomanip></span></div><div class="line"><a name="l02550"></a><span class="lineno"> 2550</span> <span class="preprocessor">#include <limits></span></div><div class="line"><a name="l02551"></a><span class="lineno"> 2551</span> <span class="preprocessor">#include <map></span></div><div class="line"><a name="l02552"></a><span class="lineno"> 2552</span> <span class="preprocessor">#include <set></span></div><div class="line"><a name="l02553"></a><span class="lineno"> 2553</span> <span class="preprocessor">#include <string></span></div><div class="line"><a name="l02554"></a><span class="lineno"> 2554</span> <span class="preprocessor">#include <vector></span></div><div class="line"><a name="l02555"></a><span class="lineno"> 2555</span> </div><div class="line"><a name="l02556"></a><span class="lineno"> 2556</span> <span class="comment">// Copyright 2005, Google Inc.</span></div><div class="line"><a name="l02557"></a><span class="lineno"> 2557</span> <span class="comment">// All rights reserved.</span></div><div class="line"><a name="l02558"></a><span class="lineno"> 2558</span> <span class="comment">//</span></div><div class="line"><a name="l02559"></a><span class="lineno"> 2559</span> <span class="comment">// Redistribution and use in source and binary forms, with or without</span></div><div class="line"><a name="l02560"></a><span class="lineno"> 2560</span> <span class="comment">// modification, are permitted provided that the following conditions are</span></div><div class="line"><a name="l02561"></a><span class="lineno"> 2561</span> <span class="comment">// met:</span></div><div class="line"><a name="l02562"></a><span class="lineno"> 2562</span> <span class="comment">//</span></div><div class="line"><a name="l02563"></a><span class="lineno"> 2563</span> <span class="comment">// * Redistributions of source code must retain the above copyright</span></div><div class="line"><a name="l02564"></a><span class="lineno"> 2564</span> <span class="comment">// notice, this list of conditions and the following disclaimer.</span></div><div class="line"><a name="l02565"></a><span class="lineno"> 2565</span> <span class="comment">// * Redistributions in binary form must reproduce the above</span></div><div class="line"><a name="l02566"></a><span class="lineno"> 2566</span> <span class="comment">// copyright notice, this list of conditions and the following disclaimer</span></div><div class="line"><a name="l02567"></a><span class="lineno"> 2567</span> <span class="comment">// in the documentation and/or other materials provided with the</span></div><div class="line"><a name="l02568"></a><span class="lineno"> 2568</span> <span class="comment">// distribution.</span></div><div class="line"><a name="l02569"></a><span class="lineno"> 2569</span> <span class="comment">// * Neither the name of Google Inc. nor the names of its</span></div><div class="line"><a name="l02570"></a><span class="lineno"> 2570</span> <span class="comment">// contributors may be used to endorse or promote products derived from</span></div><div class="line"><a name="l02571"></a><span class="lineno"> 2571</span> <span class="comment">// this software without specific prior written permission.</span></div><div class="line"><a name="l02572"></a><span class="lineno"> 2572</span> <span class="comment">//</span></div><div class="line"><a name="l02573"></a><span class="lineno"> 2573</span> <span class="comment">// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS</span></div><div class="line"><a name="l02574"></a><span class="lineno"> 2574</span> <span class="comment">// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT</span></div><div class="line"><a name="l02575"></a><span class="lineno"> 2575</span> <span class="comment">// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR</span></div><div class="line"><a name="l02576"></a><span class="lineno"> 2576</span> <span class="comment">// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT</span></div><div class="line"><a name="l02577"></a><span class="lineno"> 2577</span> <span class="comment">// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,</span></div><div class="line"><a name="l02578"></a><span class="lineno"> 2578</span> <span class="comment">// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT</span></div><div class="line"><a name="l02579"></a><span class="lineno"> 2579</span> <span class="comment">// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,</span></div><div class="line"><a name="l02580"></a><span class="lineno"> 2580</span> <span class="comment">// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY</span></div><div class="line"><a name="l02581"></a><span class="lineno"> 2581</span> <span class="comment">// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</span></div><div class="line"><a name="l02582"></a><span class="lineno"> 2582</span> <span class="comment">// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE</span></div><div class="line"><a name="l02583"></a><span class="lineno"> 2583</span> <span class="comment">// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span></div><div class="line"><a name="l02584"></a><span class="lineno"> 2584</span> </div><div class="line"><a name="l02585"></a><span class="lineno"> 2585</span> <span class="comment">//</span></div><div class="line"><a name="l02586"></a><span class="lineno"> 2586</span> <span class="comment">// The Google C++ Testing and Mocking Framework (Google Test)</span></div><div class="line"><a name="l02587"></a><span class="lineno"> 2587</span> <span class="comment">//</span></div><div class="line"><a name="l02588"></a><span class="lineno"> 2588</span> <span class="comment">// This header file defines the Message class.</span></div><div class="line"><a name="l02589"></a><span class="lineno"> 2589</span> <span class="comment">//</span></div><div class="line"><a name="l02590"></a><span class="lineno"> 2590</span> <span class="comment">// IMPORTANT NOTE: Due to limitation of the C++ language, we have to</span></div><div class="line"><a name="l02591"></a><span class="lineno"> 2591</span> <span class="comment">// leave some internal implementation details in this header file.</span></div><div class="line"><a name="l02592"></a><span class="lineno"> 2592</span> <span class="comment">// They are clearly marked by comments like this:</span></div><div class="line"><a name="l02593"></a><span class="lineno"> 2593</span> <span class="comment">//</span></div><div class="line"><a name="l02594"></a><span class="lineno"> 2594</span> <span class="comment">// // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.</span></div><div class="line"><a name="l02595"></a><span class="lineno"> 2595</span> <span class="comment">//</span></div><div class="line"><a name="l02596"></a><span class="lineno"> 2596</span> <span class="comment">// Such code is NOT meant to be used by a user directly, and is subject</span></div><div class="line"><a name="l02597"></a><span class="lineno"> 2597</span> <span class="comment">// to CHANGE WITHOUT NOTICE. Therefore DO NOT DEPEND ON IT in a user</span></div><div class="line"><a name="l02598"></a><span class="lineno"> 2598</span> <span class="comment">// program!</span></div><div class="line"><a name="l02599"></a><span class="lineno"> 2599</span> </div><div class="line"><a name="l02600"></a><span class="lineno"> 2600</span> <span class="comment">// GOOGLETEST_CM0001 DO NOT DELETE</span></div><div class="line"><a name="l02601"></a><span class="lineno"> 2601</span> </div><div class="line"><a name="l02602"></a><span class="lineno"> 2602</span> <span class="preprocessor">#ifndef GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_</span></div><div class="line"><a name="l02603"></a><span class="lineno"><a class="line" href="gtest_8h.html#a5c2d86823d7f9ffac3e3766da17091dd"> 2603</a></span> <span class="preprocessor">#define GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_</span></div><div class="line"><a name="l02604"></a><span class="lineno"> 2604</span> </div><div class="line"><a name="l02605"></a><span class="lineno"> 2605</span> <span class="preprocessor">#include <limits></span></div><div class="line"><a name="l02606"></a><span class="lineno"> 2606</span> <span class="preprocessor">#include <memory></span></div><div class="line"><a name="l02607"></a><span class="lineno"> 2607</span> </div><div class="line"><a name="l02608"></a><span class="lineno"> 2608</span> </div><div class="line"><a name="l02609"></a><span class="lineno"> 2609</span> <a class="code" href="gtest_8h.html#a86994cc68e844d8b82089c70408dfc61">GTEST_DISABLE_MSC_WARNINGS_PUSH_</a>(4251 \</div><div class="line"><a name="l02610"></a><span class="lineno"> 2610</span> <span class="comment">/* class A needs to have dll-interface to be used by clients of class B */</span>)</div><div class="line"><a name="l02611"></a><span class="lineno"> 2611</span> </div><div class="line"><a name="l02612"></a><span class="lineno"> 2612</span> <span class="comment">// Ensures that there is at least one operator<< in the global namespace.</span></div><div class="line"><a name="l02613"></a><span class="lineno"> 2613</span> <span class="comment">// See Message& operator<<(...) below for why.</span></div><div class="line"><a name="l02614"></a><span class="lineno"> 2614</span> void operator<<(const <a class="code" href="namespacetesting.html">testing</a>::internal::Secret&, <span class="keywordtype">int</span>);</div><div class="line"><a name="l02615"></a><span class="lineno"> 2615</span> </div><div class="line"><a name="l02616"></a><span class="lineno"> 2616</span> namespace <a class="code" href="namespacetesting.html">testing</a> {</div><div class="line"><a name="l02617"></a><span class="lineno"> 2617</span> </div><div class="line"><a name="l02618"></a><span class="lineno"> 2618</span> <span class="comment">// The Message class works like an ostream repeater.</span></div><div class="line"><a name="l02619"></a><span class="lineno"> 2619</span> <span class="comment">//</span></div><div class="line"><a name="l02620"></a><span class="lineno"> 2620</span> <span class="comment">// Typical usage:</span></div><div class="line"><a name="l02621"></a><span class="lineno"> 2621</span> <span class="comment">//</span></div><div class="line"><a name="l02622"></a><span class="lineno"> 2622</span> <span class="comment">// 1. You stream a bunch of values to a Message object.</span></div><div class="line"><a name="l02623"></a><span class="lineno"> 2623</span> <span class="comment">// It will remember the text in a stringstream.</span></div><div class="line"><a name="l02624"></a><span class="lineno"> 2624</span> <span class="comment">// 2. Then you stream the Message object to an ostream.</span></div><div class="line"><a name="l02625"></a><span class="lineno"> 2625</span> <span class="comment">// This causes the text in the Message to be streamed</span></div><div class="line"><a name="l02626"></a><span class="lineno"> 2626</span> <span class="comment">// to the ostream.</span></div><div class="line"><a name="l02627"></a><span class="lineno"> 2627</span> <span class="comment">//</span></div><div class="line"><a name="l02628"></a><span class="lineno"> 2628</span> <span class="comment">// For example;</span></div><div class="line"><a name="l02629"></a><span class="lineno"> 2629</span> <span class="comment">//</span></div><div class="line"><a name="l02630"></a><span class="lineno"> 2630</span> <span class="comment">// testing::Message foo;</span></div><div class="line"><a name="l02631"></a><span class="lineno"> 2631</span> <span class="comment">// foo << 1 << " != " << 2;</span></div><div class="line"><a name="l02632"></a><span class="lineno"> 2632</span> <span class="comment">// std::cout << foo;</span></div><div class="line"><a name="l02633"></a><span class="lineno"> 2633</span> <span class="comment">//</span></div><div class="line"><a name="l02634"></a><span class="lineno"> 2634</span> <span class="comment">// will print "1 != 2".</span></div><div class="line"><a name="l02635"></a><span class="lineno"> 2635</span> <span class="comment">//</span></div><div class="line"><a name="l02636"></a><span class="lineno"> 2636</span> <span class="comment">// Message is not intended to be inherited from. In particular, its</span></div><div class="line"><a name="l02637"></a><span class="lineno"> 2637</span> <span class="comment">// destructor is not virtual.</span></div><div class="line"><a name="l02638"></a><span class="lineno"> 2638</span> <span class="comment">//</span></div><div class="line"><a name="l02639"></a><span class="lineno"> 2639</span> <span class="comment">// Note that stringstream behaves differently in gcc and in MSVC. You</span></div><div class="line"><a name="l02640"></a><span class="lineno"> 2640</span> <span class="comment">// can stream a NULL char pointer to it in the former, but not in the</span></div><div class="line"><a name="l02641"></a><span class="lineno"> 2641</span> <span class="comment">// latter (it causes an access violation if you do). The Message</span></div><div class="line"><a name="l02642"></a><span class="lineno"> 2642</span> <span class="comment">// class hides this difference by treating a NULL char pointer as</span></div><div class="line"><a name="l02643"></a><span class="lineno"> 2643</span> <span class="comment">// "(null)".</span></div><div class="line"><a name="l02644"></a><span class="lineno"><a class="line" href="classtesting_1_1_message.html"> 2644</a></span> <span class="keyword">class </span><a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> <a class="code" href="classtesting_1_1_message.html">Message</a> {</div><div class="line"><a name="l02645"></a><span class="lineno"> 2645</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l02646"></a><span class="lineno"> 2646</span>  <span class="comment">// The type of basic IO manipulators (endl, ends, and flush) for</span></div><div class="line"><a name="l02647"></a><span class="lineno"> 2647</span>  <span class="comment">// narrow streams.</span></div><div class="line"><a name="l02648"></a><span class="lineno"> 2648</span>  <span class="keyword">typedef</span> std::ostream& (*BasicNarrowIoManip)(std::ostream&);</div><div class="line"><a name="l02649"></a><span class="lineno"> 2649</span> </div><div class="line"><a name="l02650"></a><span class="lineno"> 2650</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l02651"></a><span class="lineno"> 2651</span>  <span class="comment">// Constructs an empty Message.</span></div><div class="line"><a name="l02652"></a><span class="lineno"> 2652</span>  <a class="code" href="classtesting_1_1_message.html">Message</a>();</div><div class="line"><a name="l02653"></a><span class="lineno"> 2653</span> </div><div class="line"><a name="l02654"></a><span class="lineno"> 2654</span>  <span class="comment">// Copy constructor.</span></div><div class="line"><a name="l02655"></a><span class="lineno"><a class="line" href="classtesting_1_1_message.html#ac126e24804817a053bebba0920d94a11"> 2655</a></span>  <a class="code" href="classtesting_1_1_message.html#ac126e24804817a053bebba0920d94a11">Message</a>(<span class="keyword">const</span> <a class="code" href="classtesting_1_1_message.html">Message</a>& msg) : ss_(new ::std::stringstream) { <span class="comment">// NOLINT</span></div><div class="line"><a name="l02656"></a><span class="lineno"> 2656</span>  *ss_ << msg.<a class="code" href="classtesting_1_1_message.html#a2cdc4df62bdcc9df37651a1cf527704e">GetString</a>();</div><div class="line"><a name="l02657"></a><span class="lineno"> 2657</span>  }</div><div class="line"><a name="l02658"></a><span class="lineno"> 2658</span> </div><div class="line"><a name="l02659"></a><span class="lineno"> 2659</span>  <span class="comment">// Constructs a Message from a C-string.</span></div><div class="line"><a name="l02660"></a><span class="lineno"><a class="line" href="classtesting_1_1_message.html#a9de694ca239486809fc99fbbea8ac21d"> 2660</a></span>  <span class="keyword">explicit</span> <a class="code" href="classtesting_1_1_message.html#a9de694ca239486809fc99fbbea8ac21d">Message</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* str) : ss_(new ::std::stringstream) {</div><div class="line"><a name="l02661"></a><span class="lineno"> 2661</span>  *ss_ << str;</div><div class="line"><a name="l02662"></a><span class="lineno"> 2662</span>  }</div><div class="line"><a name="l02663"></a><span class="lineno"> 2663</span> </div><div class="line"><a name="l02664"></a><span class="lineno"> 2664</span>  <span class="comment">// Streams a non-pointer value to this object.</span></div><div class="line"><a name="l02665"></a><span class="lineno"> 2665</span>  <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l02666"></a><span class="lineno"><a class="line" href="classtesting_1_1_message.html#a2e0e71be52d54c20a75a55fca812721f"> 2666</a></span>  <span class="keyword">inline</span> <a class="code" href="classtesting_1_1_message.html">Message</a>& <a class="code" href="namespacetesting_1_1internal2.html#a07dbe129beb8952074f04b599dfce39b">operator <<</a>(<span class="keyword">const</span> T& val) {</div><div class="line"><a name="l02667"></a><span class="lineno"> 2667</span>  <span class="comment">// Some libraries overload << for STL containers. These</span></div><div class="line"><a name="l02668"></a><span class="lineno"> 2668</span>  <span class="comment">// overloads are defined in the global namespace instead of ::std.</span></div><div class="line"><a name="l02669"></a><span class="lineno"> 2669</span>  <span class="comment">//</span></div><div class="line"><a name="l02670"></a><span class="lineno"> 2670</span>  <span class="comment">// C++'s symbol lookup rule (i.e. Koenig lookup) says that these</span></div><div class="line"><a name="l02671"></a><span class="lineno"> 2671</span>  <span class="comment">// overloads are visible in either the std namespace or the global</span></div><div class="line"><a name="l02672"></a><span class="lineno"> 2672</span>  <span class="comment">// namespace, but not other namespaces, including the testing</span></div><div class="line"><a name="l02673"></a><span class="lineno"> 2673</span>  <span class="comment">// namespace which Google Test's Message class is in.</span></div><div class="line"><a name="l02674"></a><span class="lineno"> 2674</span>  <span class="comment">//</span></div><div class="line"><a name="l02675"></a><span class="lineno"> 2675</span>  <span class="comment">// To allow STL containers (and other types that has a << operator</span></div><div class="line"><a name="l02676"></a><span class="lineno"> 2676</span>  <span class="comment">// defined in the global namespace) to be used in Google Test</span></div><div class="line"><a name="l02677"></a><span class="lineno"> 2677</span>  <span class="comment">// assertions, testing::Message must access the custom << operator</span></div><div class="line"><a name="l02678"></a><span class="lineno"> 2678</span>  <span class="comment">// from the global namespace. With this using declaration,</span></div><div class="line"><a name="l02679"></a><span class="lineno"> 2679</span>  <span class="comment">// overloads of << defined in the global namespace and those</span></div><div class="line"><a name="l02680"></a><span class="lineno"> 2680</span>  <span class="comment">// visible via Koenig lookup are both exposed in this function.</span></div><div class="line"><a name="l02681"></a><span class="lineno"> 2681</span>  using ::operator <<;</div><div class="line"><a name="l02682"></a><span class="lineno"> 2682</span>  *ss_ << val;</div><div class="line"><a name="l02683"></a><span class="lineno"> 2683</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l02684"></a><span class="lineno"> 2684</span>  }</div><div class="line"><a name="l02685"></a><span class="lineno"> 2685</span> </div><div class="line"><a name="l02686"></a><span class="lineno"> 2686</span>  <span class="comment">// Streams a pointer value to this object.</span></div><div class="line"><a name="l02687"></a><span class="lineno"> 2687</span>  <span class="comment">//</span></div><div class="line"><a name="l02688"></a><span class="lineno"> 2688</span>  <span class="comment">// This function is an overload of the previous one. When you</span></div><div class="line"><a name="l02689"></a><span class="lineno"> 2689</span>  <span class="comment">// stream a pointer to a Message, this definition will be used as it</span></div><div class="line"><a name="l02690"></a><span class="lineno"> 2690</span>  <span class="comment">// is more specialized. (The C++ Standard, section</span></div><div class="line"><a name="l02691"></a><span class="lineno"> 2691</span>  <span class="comment">// [temp.func.order].) If you stream a non-pointer, then the</span></div><div class="line"><a name="l02692"></a><span class="lineno"> 2692</span>  <span class="comment">// previous definition will be used.</span></div><div class="line"><a name="l02693"></a><span class="lineno"> 2693</span>  <span class="comment">//</span></div><div class="line"><a name="l02694"></a><span class="lineno"> 2694</span>  <span class="comment">// The reason for this overload is that streaming a NULL pointer to</span></div><div class="line"><a name="l02695"></a><span class="lineno"> 2695</span>  <span class="comment">// ostream is undefined behavior. Depending on the compiler, you</span></div><div class="line"><a name="l02696"></a><span class="lineno"> 2696</span>  <span class="comment">// may get "0", "(nil)", "(null)", or an access violation. To</span></div><div class="line"><a name="l02697"></a><span class="lineno"> 2697</span>  <span class="comment">// ensure consistent result across compilers, we always treat NULL</span></div><div class="line"><a name="l02698"></a><span class="lineno"> 2698</span>  <span class="comment">// as "(null)".</span></div><div class="line"><a name="l02699"></a><span class="lineno"> 2699</span>  <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l02700"></a><span class="lineno"><a class="line" href="classtesting_1_1_message.html#aa3ab685879958f90d2d8cd5b68d10c34"> 2700</a></span>  <span class="keyword">inline</span> <a class="code" href="classtesting_1_1_message.html">Message</a>& <a class="code" href="namespacetesting_1_1internal2.html#a07dbe129beb8952074f04b599dfce39b">operator <<</a>(T* <span class="keyword">const</span>& pointer) { <span class="comment">// NOLINT</span></div><div class="line"><a name="l02701"></a><span class="lineno"> 2701</span>  <span class="keywordflow">if</span> (pointer == <span class="keyword">nullptr</span>) {</div><div class="line"><a name="l02702"></a><span class="lineno"> 2702</span>  *ss_ << <span class="stringliteral">"(null)"</span>;</div><div class="line"><a name="l02703"></a><span class="lineno"> 2703</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l02704"></a><span class="lineno"> 2704</span>  *ss_ << pointer;</div><div class="line"><a name="l02705"></a><span class="lineno"> 2705</span>  }</div><div class="line"><a name="l02706"></a><span class="lineno"> 2706</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l02707"></a><span class="lineno"> 2707</span>  }</div><div class="line"><a name="l02708"></a><span class="lineno"> 2708</span> </div><div class="line"><a name="l02709"></a><span class="lineno"> 2709</span>  <span class="comment">// Since the basic IO manipulators are overloaded for both narrow</span></div><div class="line"><a name="l02710"></a><span class="lineno"> 2710</span>  <span class="comment">// and wide streams, we have to provide this specialized definition</span></div><div class="line"><a name="l02711"></a><span class="lineno"> 2711</span>  <span class="comment">// of operator <<, even though its body is the same as the</span></div><div class="line"><a name="l02712"></a><span class="lineno"> 2712</span>  <span class="comment">// templatized version above. Without this definition, streaming</span></div><div class="line"><a name="l02713"></a><span class="lineno"> 2713</span>  <span class="comment">// endl or other basic IO manipulators to Message will confuse the</span></div><div class="line"><a name="l02714"></a><span class="lineno"> 2714</span>  <span class="comment">// compiler.</span></div><div class="line"><a name="l02715"></a><span class="lineno"><a class="line" href="classtesting_1_1_message.html#a3a71a1c1c8ea52de5852d75483d41453"> 2715</a></span>  <a class="code" href="classtesting_1_1_message.html">Message</a>& <a class="code" href="namespacetesting_1_1internal2.html#a07dbe129beb8952074f04b599dfce39b">operator <<</a>(BasicNarrowIoManip val) {</div><div class="line"><a name="l02716"></a><span class="lineno"> 2716</span>  *ss_ << val;</div><div class="line"><a name="l02717"></a><span class="lineno"> 2717</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l02718"></a><span class="lineno"> 2718</span>  }</div><div class="line"><a name="l02719"></a><span class="lineno"> 2719</span> </div><div class="line"><a name="l02720"></a><span class="lineno"> 2720</span>  <span class="comment">// Instead of 1/0, we want to see true/false for bool values.</span></div><div class="line"><a name="l02721"></a><span class="lineno"><a class="line" href="classtesting_1_1_message.html#a3e1e04f23b1bdfe18adfd59928296346"> 2721</a></span>  <a class="code" href="classtesting_1_1_message.html">Message</a>& <a class="code" href="namespacetesting_1_1internal2.html#a07dbe129beb8952074f04b599dfce39b">operator <<</a>(<span class="keywordtype">bool</span> b) {</div><div class="line"><a name="l02722"></a><span class="lineno"> 2722</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span> << (b ? <span class="stringliteral">"true"</span> : <span class="stringliteral">"false"</span>);</div><div class="line"><a name="l02723"></a><span class="lineno"> 2723</span>  }</div><div class="line"><a name="l02724"></a><span class="lineno"> 2724</span> </div><div class="line"><a name="l02725"></a><span class="lineno"> 2725</span>  <span class="comment">// These two overloads allow streaming a wide C string to a Message</span></div><div class="line"><a name="l02726"></a><span class="lineno"> 2726</span>  <span class="comment">// using the UTF-8 encoding.</span></div><div class="line"><a name="l02727"></a><span class="lineno"> 2727</span>  <a class="code" href="classtesting_1_1_message.html">Message</a>& <a class="code" href="namespacetesting_1_1internal2.html#a07dbe129beb8952074f04b599dfce39b">operator <<</a>(<span class="keyword">const</span> <span class="keywordtype">wchar_t</span>* wide_c_str);</div><div class="line"><a name="l02728"></a><span class="lineno"> 2728</span>  <a class="code" href="classtesting_1_1_message.html">Message</a>& <a class="code" href="namespacetesting_1_1internal2.html#a07dbe129beb8952074f04b599dfce39b">operator <<</a>(<span class="keywordtype">wchar_t</span>* wide_c_str);</div><div class="line"><a name="l02729"></a><span class="lineno"> 2729</span> </div><div class="line"><a name="l02730"></a><span class="lineno"> 2730</span> <span class="preprocessor">#if GTEST_HAS_STD_WSTRING</span></div><div class="line"><a name="l02731"></a><span class="lineno"> 2731</span>  <span class="comment">// Converts the given wide string to a narrow string using the UTF-8</span></div><div class="line"><a name="l02732"></a><span class="lineno"> 2732</span>  <span class="comment">// encoding, and streams the result to this Message object.</span></div><div class="line"><a name="l02733"></a><span class="lineno"> 2733</span>  <a class="code" href="classtesting_1_1_message.html">Message</a>& <a class="code" href="namespacetesting_1_1internal2.html#a07dbe129beb8952074f04b599dfce39b">operator <<</a>(<a class="code" href="namespacetesting_1_1internal.html#a3f543179329c353aee1d7b54a9a8e335">const ::std::wstring</a>& wstr);</div><div class="line"><a name="l02734"></a><span class="lineno"> 2734</span> <span class="preprocessor">#endif // GTEST_HAS_STD_WSTRING</span></div><div class="line"><a name="l02735"></a><span class="lineno"> 2735</span> </div><div class="line"><a name="l02736"></a><span class="lineno"> 2736</span> <span class="preprocessor">#if GTEST_HAS_GLOBAL_WSTRING</span></div><div class="line"><a name="l02737"></a><span class="lineno"> 2737</span>  <span class="comment">// Converts the given wide string to a narrow string using the UTF-8</span></div><div class="line"><a name="l02738"></a><span class="lineno"> 2738</span>  <span class="comment">// encoding, and streams the result to this Message object.</span></div><div class="line"><a name="l02739"></a><span class="lineno"> 2739</span>  <a class="code" href="classtesting_1_1_message.html">Message</a>& <a class="code" href="namespacetesting_1_1internal2.html#a07dbe129beb8952074f04b599dfce39b">operator <<</a>(<a class="code" href="namespacetesting_1_1internal.html#a3f543179329c353aee1d7b54a9a8e335">const ::wstring</a>& wstr);</div><div class="line"><a name="l02740"></a><span class="lineno"> 2740</span> <span class="preprocessor">#endif // GTEST_HAS_GLOBAL_WSTRING</span></div><div class="line"><a name="l02741"></a><span class="lineno"> 2741</span> </div><div class="line"><a name="l02742"></a><span class="lineno"> 2742</span>  <span class="comment">// Gets the text streamed to this object so far as an std::string.</span></div><div class="line"><a name="l02743"></a><span class="lineno"> 2743</span>  <span class="comment">// Each '\0' character in the buffer is replaced with "\\0".</span></div><div class="line"><a name="l02744"></a><span class="lineno"> 2744</span>  <span class="comment">//</span></div><div class="line"><a name="l02745"></a><span class="lineno"> 2745</span>  <span class="comment">// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.</span></div><div class="line"><a name="l02746"></a><span class="lineno"> 2746</span>  <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a> GetString() <span class="keyword">const</span>;</div><div class="line"><a name="l02747"></a><span class="lineno"> 2747</span> </div><div class="line"><a name="l02748"></a><span class="lineno"> 2748</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l02749"></a><span class="lineno"> 2749</span>  <span class="comment">// We'll hold the text streamed to this object here.</span></div><div class="line"><a name="l02750"></a><span class="lineno"> 2750</span>  <span class="keyword">const</span> std::unique_ptr< ::std::stringstream> ss_;</div><div class="line"><a name="l02751"></a><span class="lineno"> 2751</span> </div><div class="line"><a name="l02752"></a><span class="lineno"> 2752</span>  <span class="comment">// We declare (but don't implement) this to prevent the compiler</span></div><div class="line"><a name="l02753"></a><span class="lineno"> 2753</span>  <span class="comment">// from implementing the assignment operator.</span></div><div class="line"><a name="l02754"></a><span class="lineno"> 2754</span>  <span class="keywordtype">void</span> operator=(<span class="keyword">const</span> <a class="code" href="classtesting_1_1_message.html">Message</a>&);</div><div class="line"><a name="l02755"></a><span class="lineno"> 2755</span> };</div><div class="line"><a name="l02756"></a><span class="lineno"> 2756</span> </div><div class="line"><a name="l02757"></a><span class="lineno"> 2757</span> <span class="comment">// Streams a Message to an ostream.</span></div><div class="line"><a name="l02758"></a><span class="lineno"><a class="line" href="namespacetesting.html#a7b802e532fd68749765cb7dc156130db"> 2758</a></span> <span class="keyword">inline</span> std::ostream& <a class="code" href="namespacetesting_1_1internal2.html#a07dbe129beb8952074f04b599dfce39b">operator <<</a>(std::ostream& os, <span class="keyword">const</span> <a class="code" href="classtesting_1_1_message.html">Message</a>& sb) {</div><div class="line"><a name="l02759"></a><span class="lineno"> 2759</span>  <span class="keywordflow">return</span> os << sb.<a class="code" href="classtesting_1_1_message.html#a2cdc4df62bdcc9df37651a1cf527704e">GetString</a>();</div><div class="line"><a name="l02760"></a><span class="lineno"> 2760</span> }</div><div class="line"><a name="l02761"></a><span class="lineno"> 2761</span> </div><div class="line"><a name="l02762"></a><span class="lineno"> 2762</span> <span class="keyword">namespace </span>internal {</div><div class="line"><a name="l02763"></a><span class="lineno"> 2763</span> </div><div class="line"><a name="l02764"></a><span class="lineno"> 2764</span> <span class="comment">// Converts a streamable value to an std::string. A NULL pointer is</span></div><div class="line"><a name="l02765"></a><span class="lineno"> 2765</span> <span class="comment">// converted to "(null)". When the input value is a ::string,</span></div><div class="line"><a name="l02766"></a><span class="lineno"> 2766</span> <span class="comment">// ::std::string, ::wstring, or ::std::wstring object, each NUL</span></div><div class="line"><a name="l02767"></a><span class="lineno"> 2767</span> <span class="comment">// character in it is replaced with "\\0".</span></div><div class="line"><a name="l02768"></a><span class="lineno"> 2768</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l02769"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#aad4beed95d0846e6ffc5da0978ef3bb9"> 2769</a></span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a> <a class="code" href="namespacetesting_1_1internal.html#aad4beed95d0846e6ffc5da0978ef3bb9">StreamableToString</a>(<span class="keyword">const</span> T& streamable) {</div><div class="line"><a name="l02770"></a><span class="lineno"> 2770</span>  <span class="keywordflow">return</span> (<a class="code" href="classtesting_1_1_message.html">Message</a>() << streamable).GetString();</div><div class="line"><a name="l02771"></a><span class="lineno"> 2771</span> }</div><div class="line"><a name="l02772"></a><span class="lineno"> 2772</span> </div><div class="line"><a name="l02773"></a><span class="lineno"> 2773</span> } <span class="comment">// namespace internal</span></div><div class="line"><a name="l02774"></a><span class="lineno"> 2774</span> } <span class="comment">// namespace testing</span></div><div class="line"><a name="l02775"></a><span class="lineno"> 2775</span> </div><div class="line"><a name="l02776"></a><span class="lineno"> 2776</span> <a class="code" href="gtest_8h.html#aebf8277c9069c1e124f9a5bbe2948061">GTEST_DISABLE_MSC_WARNINGS_POP_</a>() <span class="comment">// 4251</span></div><div class="line"><a name="l02777"></a><span class="lineno"> 2777</span> </div><div class="line"><a name="l02778"></a><span class="lineno"> 2778</span> <span class="preprocessor">#endif // GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_</span></div><div class="line"><a name="l02779"></a><span class="lineno"> 2779</span> <span class="comment">// Copyright 2008, Google Inc.</span></div><div class="line"><a name="l02780"></a><span class="lineno"> 2780</span> <span class="comment">// All rights reserved.</span></div><div class="line"><a name="l02781"></a><span class="lineno"> 2781</span> <span class="comment">//</span></div><div class="line"><a name="l02782"></a><span class="lineno"> 2782</span> <span class="comment">// Redistribution and use in source and binary forms, with or without</span></div><div class="line"><a name="l02783"></a><span class="lineno"> 2783</span> <span class="comment">// modification, are permitted provided that the following conditions are</span></div><div class="line"><a name="l02784"></a><span class="lineno"> 2784</span> <span class="comment">// met:</span></div><div class="line"><a name="l02785"></a><span class="lineno"> 2785</span> <span class="comment">//</span></div><div class="line"><a name="l02786"></a><span class="lineno"> 2786</span> <span class="comment">// * Redistributions of source code must retain the above copyright</span></div><div class="line"><a name="l02787"></a><span class="lineno"> 2787</span> <span class="comment">// notice, this list of conditions and the following disclaimer.</span></div><div class="line"><a name="l02788"></a><span class="lineno"> 2788</span> <span class="comment">// * Redistributions in binary form must reproduce the above</span></div><div class="line"><a name="l02789"></a><span class="lineno"> 2789</span> <span class="comment">// copyright notice, this list of conditions and the following disclaimer</span></div><div class="line"><a name="l02790"></a><span class="lineno"> 2790</span> <span class="comment">// in the documentation and/or other materials provided with the</span></div><div class="line"><a name="l02791"></a><span class="lineno"> 2791</span> <span class="comment">// distribution.</span></div><div class="line"><a name="l02792"></a><span class="lineno"> 2792</span> <span class="comment">// * Neither the name of Google Inc. nor the names of its</span></div><div class="line"><a name="l02793"></a><span class="lineno"> 2793</span> <span class="comment">// contributors may be used to endorse or promote products derived from</span></div><div class="line"><a name="l02794"></a><span class="lineno"> 2794</span> <span class="comment">// this software without specific prior written permission.</span></div><div class="line"><a name="l02795"></a><span class="lineno"> 2795</span> <span class="comment">//</span></div><div class="line"><a name="l02796"></a><span class="lineno"> 2796</span> <span class="comment">// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS</span></div><div class="line"><a name="l02797"></a><span class="lineno"> 2797</span> <span class="comment">// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT</span></div><div class="line"><a name="l02798"></a><span class="lineno"> 2798</span> <span class="comment">// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR</span></div><div class="line"><a name="l02799"></a><span class="lineno"> 2799</span> <span class="comment">// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT</span></div><div class="line"><a name="l02800"></a><span class="lineno"> 2800</span> <span class="comment">// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,</span></div><div class="line"><a name="l02801"></a><span class="lineno"> 2801</span> <span class="comment">// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT</span></div><div class="line"><a name="l02802"></a><span class="lineno"> 2802</span> <span class="comment">// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,</span></div><div class="line"><a name="l02803"></a><span class="lineno"> 2803</span> <span class="comment">// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY</span></div><div class="line"><a name="l02804"></a><span class="lineno"> 2804</span> <span class="comment">// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</span></div><div class="line"><a name="l02805"></a><span class="lineno"> 2805</span> <span class="comment">// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE</span></div><div class="line"><a name="l02806"></a><span class="lineno"> 2806</span> <span class="comment">// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span></div><div class="line"><a name="l02807"></a><span class="lineno"> 2807</span> <span class="comment">//</span></div><div class="line"><a name="l02808"></a><span class="lineno"> 2808</span> <span class="comment">// Google Test filepath utilities</span></div><div class="line"><a name="l02809"></a><span class="lineno"> 2809</span> <span class="comment">//</span></div><div class="line"><a name="l02810"></a><span class="lineno"> 2810</span> <span class="comment">// This header file declares classes and functions used internally by</span></div><div class="line"><a name="l02811"></a><span class="lineno"> 2811</span> <span class="comment">// Google Test. They are subject to change without notice.</span></div><div class="line"><a name="l02812"></a><span class="lineno"> 2812</span> <span class="comment">//</span></div><div class="line"><a name="l02813"></a><span class="lineno"> 2813</span> <span class="comment">// This file is #included in gtest/internal/gtest-internal.h.</span></div><div class="line"><a name="l02814"></a><span class="lineno"> 2814</span> <span class="comment">// Do not include this header file separately!</span></div><div class="line"><a name="l02815"></a><span class="lineno"> 2815</span> </div><div class="line"><a name="l02816"></a><span class="lineno"> 2816</span> <span class="comment">// GOOGLETEST_CM0001 DO NOT DELETE</span></div><div class="line"><a name="l02817"></a><span class="lineno"> 2817</span> </div><div class="line"><a name="l02818"></a><span class="lineno"> 2818</span> <span class="preprocessor">#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_</span></div><div class="line"><a name="l02819"></a><span class="lineno"> 2819</span> <span class="preprocessor">#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_</span></div><div class="line"><a name="l02820"></a><span class="lineno"> 2820</span> </div><div class="line"><a name="l02821"></a><span class="lineno"> 2821</span> <span class="comment">// Copyright 2005, Google Inc.</span></div><div class="line"><a name="l02822"></a><span class="lineno"> 2822</span> <span class="comment">// All rights reserved.</span></div><div class="line"><a name="l02823"></a><span class="lineno"> 2823</span> <span class="comment">//</span></div><div class="line"><a name="l02824"></a><span class="lineno"> 2824</span> <span class="comment">// Redistribution and use in source and binary forms, with or without</span></div><div class="line"><a name="l02825"></a><span class="lineno"> 2825</span> <span class="comment">// modification, are permitted provided that the following conditions are</span></div><div class="line"><a name="l02826"></a><span class="lineno"> 2826</span> <span class="comment">// met:</span></div><div class="line"><a name="l02827"></a><span class="lineno"> 2827</span> <span class="comment">//</span></div><div class="line"><a name="l02828"></a><span class="lineno"> 2828</span> <span class="comment">// * Redistributions of source code must retain the above copyright</span></div><div class="line"><a name="l02829"></a><span class="lineno"> 2829</span> <span class="comment">// notice, this list of conditions and the following disclaimer.</span></div><div class="line"><a name="l02830"></a><span class="lineno"> 2830</span> <span class="comment">// * Redistributions in binary form must reproduce the above</span></div><div class="line"><a name="l02831"></a><span class="lineno"> 2831</span> <span class="comment">// copyright notice, this list of conditions and the following disclaimer</span></div><div class="line"><a name="l02832"></a><span class="lineno"> 2832</span> <span class="comment">// in the documentation and/or other materials provided with the</span></div><div class="line"><a name="l02833"></a><span class="lineno"> 2833</span> <span class="comment">// distribution.</span></div><div class="line"><a name="l02834"></a><span class="lineno"> 2834</span> <span class="comment">// * Neither the name of Google Inc. nor the names of its</span></div><div class="line"><a name="l02835"></a><span class="lineno"> 2835</span> <span class="comment">// contributors may be used to endorse or promote products derived from</span></div><div class="line"><a name="l02836"></a><span class="lineno"> 2836</span> <span class="comment">// this software without specific prior written permission.</span></div><div class="line"><a name="l02837"></a><span class="lineno"> 2837</span> <span class="comment">//</span></div><div class="line"><a name="l02838"></a><span class="lineno"> 2838</span> <span class="comment">// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS</span></div><div class="line"><a name="l02839"></a><span class="lineno"> 2839</span> <span class="comment">// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT</span></div><div class="line"><a name="l02840"></a><span class="lineno"> 2840</span> <span class="comment">// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR</span></div><div class="line"><a name="l02841"></a><span class="lineno"> 2841</span> <span class="comment">// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT</span></div><div class="line"><a name="l02842"></a><span class="lineno"> 2842</span> <span class="comment">// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,</span></div><div class="line"><a name="l02843"></a><span class="lineno"> 2843</span> <span class="comment">// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT</span></div><div class="line"><a name="l02844"></a><span class="lineno"> 2844</span> <span class="comment">// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,</span></div><div class="line"><a name="l02845"></a><span class="lineno"> 2845</span> <span class="comment">// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY</span></div><div class="line"><a name="l02846"></a><span class="lineno"> 2846</span> <span class="comment">// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</span></div><div class="line"><a name="l02847"></a><span class="lineno"> 2847</span> <span class="comment">// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE</span></div><div class="line"><a name="l02848"></a><span class="lineno"> 2848</span> <span class="comment">// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span></div><div class="line"><a name="l02849"></a><span class="lineno"> 2849</span> <span class="comment">//</span></div><div class="line"><a name="l02850"></a><span class="lineno"> 2850</span> <span class="comment">// The Google C++ Testing and Mocking Framework (Google Test)</span></div><div class="line"><a name="l02851"></a><span class="lineno"> 2851</span> <span class="comment">//</span></div><div class="line"><a name="l02852"></a><span class="lineno"> 2852</span> <span class="comment">// This header file declares the String class and functions used internally by</span></div><div class="line"><a name="l02853"></a><span class="lineno"> 2853</span> <span class="comment">// Google Test. They are subject to change without notice. They should not used</span></div><div class="line"><a name="l02854"></a><span class="lineno"> 2854</span> <span class="comment">// by code external to Google Test.</span></div><div class="line"><a name="l02855"></a><span class="lineno"> 2855</span> <span class="comment">//</span></div><div class="line"><a name="l02856"></a><span class="lineno"> 2856</span> <span class="comment">// This header file is #included by gtest-internal.h.</span></div><div class="line"><a name="l02857"></a><span class="lineno"> 2857</span> <span class="comment">// It should not be #included by other files.</span></div><div class="line"><a name="l02858"></a><span class="lineno"> 2858</span> </div><div class="line"><a name="l02859"></a><span class="lineno"> 2859</span> <span class="comment">// GOOGLETEST_CM0001 DO NOT DELETE</span></div><div class="line"><a name="l02860"></a><span class="lineno"> 2860</span> </div><div class="line"><a name="l02861"></a><span class="lineno"> 2861</span> <span class="preprocessor">#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_</span></div><div class="line"><a name="l02862"></a><span class="lineno"> 2862</span> <span class="preprocessor">#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_</span></div><div class="line"><a name="l02863"></a><span class="lineno"> 2863</span> </div><div class="line"><a name="l02864"></a><span class="lineno"> 2864</span> <span class="preprocessor">#ifdef __BORLANDC__</span></div><div class="line"><a name="l02865"></a><span class="lineno"> 2865</span> <span class="comment">// string.h is not guaranteed to provide strcpy on C++ Builder.</span></div><div class="line"><a name="l02866"></a><span class="lineno"> 2866</span> <span class="preprocessor"># include <mem.h></span></div><div class="line"><a name="l02867"></a><span class="lineno"> 2867</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l02868"></a><span class="lineno"> 2868</span> </div><div class="line"><a name="l02869"></a><span class="lineno"> 2869</span> <span class="preprocessor">#include <string.h></span></div><div class="line"><a name="l02870"></a><span class="lineno"> 2870</span> <span class="preprocessor">#include <string></span></div><div class="line"><a name="l02871"></a><span class="lineno"> 2871</span> </div><div class="line"><a name="l02872"></a><span class="lineno"> 2872</span> </div><div class="line"><a name="l02873"></a><span class="lineno"> 2873</span> <span class="keyword">namespace </span><a class="code" href="namespacetesting.html">testing</a> {</div><div class="line"><a name="l02874"></a><span class="lineno"> 2874</span> <span class="keyword">namespace </span>internal {</div><div class="line"><a name="l02875"></a><span class="lineno"> 2875</span> </div><div class="line"><a name="l02876"></a><span class="lineno"> 2876</span> <span class="comment">// String - an abstract class holding static string utilities.</span></div><div class="line"><a name="l02877"></a><span class="lineno"> 2877</span> <span class="keyword">class </span><a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> String {</div><div class="line"><a name="l02878"></a><span class="lineno"> 2878</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l02879"></a><span class="lineno"> 2879</span>  <span class="comment">// Static utility methods</span></div><div class="line"><a name="l02880"></a><span class="lineno"> 2880</span> </div><div class="line"><a name="l02881"></a><span class="lineno"> 2881</span>  <span class="comment">// Clones a 0-terminated C string, allocating memory using new. The</span></div><div class="line"><a name="l02882"></a><span class="lineno"> 2882</span>  <span class="comment">// caller is responsible for deleting the return value using</span></div><div class="line"><a name="l02883"></a><span class="lineno"> 2883</span>  <span class="comment">// delete[]. Returns the cloned string, or NULL if the input is</span></div><div class="line"><a name="l02884"></a><span class="lineno"> 2884</span>  <span class="comment">// NULL.</span></div><div class="line"><a name="l02885"></a><span class="lineno"> 2885</span>  <span class="comment">//</span></div><div class="line"><a name="l02886"></a><span class="lineno"> 2886</span>  <span class="comment">// This is different from strdup() in string.h, which allocates</span></div><div class="line"><a name="l02887"></a><span class="lineno"> 2887</span>  <span class="comment">// memory using malloc().</span></div><div class="line"><a name="l02888"></a><span class="lineno"> 2888</span>  <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* CloneCString(<span class="keyword">const</span> <span class="keywordtype">char</span>* c_str);</div><div class="line"><a name="l02889"></a><span class="lineno"> 2889</span> </div><div class="line"><a name="l02890"></a><span class="lineno"> 2890</span> <span class="preprocessor">#if GTEST_OS_WINDOWS_MOBILE</span></div><div class="line"><a name="l02891"></a><span class="lineno"> 2891</span>  <span class="comment">// Windows CE does not have the 'ANSI' versions of Win32 APIs. To be</span></div><div class="line"><a name="l02892"></a><span class="lineno"> 2892</span>  <span class="comment">// able to pass strings to Win32 APIs on CE we need to convert them</span></div><div class="line"><a name="l02893"></a><span class="lineno"> 2893</span>  <span class="comment">// to 'Unicode', UTF-16.</span></div><div class="line"><a name="l02894"></a><span class="lineno"> 2894</span> </div><div class="line"><a name="l02895"></a><span class="lineno"> 2895</span>  <span class="comment">// Creates a UTF-16 wide string from the given ANSI string, allocating</span></div><div class="line"><a name="l02896"></a><span class="lineno"> 2896</span>  <span class="comment">// memory using new. The caller is responsible for deleting the return</span></div><div class="line"><a name="l02897"></a><span class="lineno"> 2897</span>  <span class="comment">// value using delete[]. Returns the wide string, or NULL if the</span></div><div class="line"><a name="l02898"></a><span class="lineno"> 2898</span>  <span class="comment">// input is NULL.</span></div><div class="line"><a name="l02899"></a><span class="lineno"> 2899</span>  <span class="comment">//</span></div><div class="line"><a name="l02900"></a><span class="lineno"> 2900</span>  <span class="comment">// The wide string is created using the ANSI codepage (CP_ACP) to</span></div><div class="line"><a name="l02901"></a><span class="lineno"> 2901</span>  <span class="comment">// match the behaviour of the ANSI versions of Win32 calls and the</span></div><div class="line"><a name="l02902"></a><span class="lineno"> 2902</span>  <span class="comment">// C runtime.</span></div><div class="line"><a name="l02903"></a><span class="lineno"> 2903</span>  <span class="keyword">static</span> LPCWSTR AnsiToUtf16(<span class="keyword">const</span> <span class="keywordtype">char</span>* c_str);</div><div class="line"><a name="l02904"></a><span class="lineno"> 2904</span> </div><div class="line"><a name="l02905"></a><span class="lineno"> 2905</span>  <span class="comment">// Creates an ANSI string from the given wide string, allocating</span></div><div class="line"><a name="l02906"></a><span class="lineno"> 2906</span>  <span class="comment">// memory using new. The caller is responsible for deleting the return</span></div><div class="line"><a name="l02907"></a><span class="lineno"> 2907</span>  <span class="comment">// value using delete[]. Returns the ANSI string, or NULL if the</span></div><div class="line"><a name="l02908"></a><span class="lineno"> 2908</span>  <span class="comment">// input is NULL.</span></div><div class="line"><a name="l02909"></a><span class="lineno"> 2909</span>  <span class="comment">//</span></div><div class="line"><a name="l02910"></a><span class="lineno"> 2910</span>  <span class="comment">// The returned string is created using the ANSI codepage (CP_ACP) to</span></div><div class="line"><a name="l02911"></a><span class="lineno"> 2911</span>  <span class="comment">// match the behaviour of the ANSI versions of Win32 calls and the</span></div><div class="line"><a name="l02912"></a><span class="lineno"> 2912</span>  <span class="comment">// C runtime.</span></div><div class="line"><a name="l02913"></a><span class="lineno"> 2913</span>  <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* Utf16ToAnsi(LPCWSTR utf16_str);</div><div class="line"><a name="l02914"></a><span class="lineno"> 2914</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l02915"></a><span class="lineno"> 2915</span> </div><div class="line"><a name="l02916"></a><span class="lineno"> 2916</span>  <span class="comment">// Compares two C strings. Returns true iff they have the same content.</span></div><div class="line"><a name="l02917"></a><span class="lineno"> 2917</span>  <span class="comment">//</span></div><div class="line"><a name="l02918"></a><span class="lineno"> 2918</span>  <span class="comment">// Unlike strcmp(), this function can handle NULL argument(s). A</span></div><div class="line"><a name="l02919"></a><span class="lineno"> 2919</span>  <span class="comment">// NULL C string is considered different to any non-NULL C string,</span></div><div class="line"><a name="l02920"></a><span class="lineno"> 2920</span>  <span class="comment">// including the empty string.</span></div><div class="line"><a name="l02921"></a><span class="lineno"> 2921</span>  <span class="keyword">static</span> <span class="keywordtype">bool</span> CStringEquals(<span class="keyword">const</span> <span class="keywordtype">char</span>* lhs, <span class="keyword">const</span> <span class="keywordtype">char</span>* rhs);</div><div class="line"><a name="l02922"></a><span class="lineno"> 2922</span> </div><div class="line"><a name="l02923"></a><span class="lineno"> 2923</span>  <span class="comment">// Converts a wide C string to a String using the UTF-8 encoding.</span></div><div class="line"><a name="l02924"></a><span class="lineno"> 2924</span>  <span class="comment">// NULL will be converted to "(null)". If an error occurred during</span></div><div class="line"><a name="l02925"></a><span class="lineno"> 2925</span>  <span class="comment">// the conversion, "(failed to convert from wide string)" is</span></div><div class="line"><a name="l02926"></a><span class="lineno"> 2926</span>  <span class="comment">// returned.</span></div><div class="line"><a name="l02927"></a><span class="lineno"> 2927</span>  <span class="keyword">static</span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a> ShowWideCString(<span class="keyword">const</span> <span class="keywordtype">wchar_t</span>* wide_c_str);</div><div class="line"><a name="l02928"></a><span class="lineno"> 2928</span> </div><div class="line"><a name="l02929"></a><span class="lineno"> 2929</span>  <span class="comment">// Compares two wide C strings. Returns true iff they have the same</span></div><div class="line"><a name="l02930"></a><span class="lineno"> 2930</span>  <span class="comment">// content.</span></div><div class="line"><a name="l02931"></a><span class="lineno"> 2931</span>  <span class="comment">//</span></div><div class="line"><a name="l02932"></a><span class="lineno"> 2932</span>  <span class="comment">// Unlike wcscmp(), this function can handle NULL argument(s). A</span></div><div class="line"><a name="l02933"></a><span class="lineno"> 2933</span>  <span class="comment">// NULL C string is considered different to any non-NULL C string,</span></div><div class="line"><a name="l02934"></a><span class="lineno"> 2934</span>  <span class="comment">// including the empty string.</span></div><div class="line"><a name="l02935"></a><span class="lineno"> 2935</span>  <span class="keyword">static</span> <span class="keywordtype">bool</span> WideCStringEquals(<span class="keyword">const</span> <span class="keywordtype">wchar_t</span>* lhs, <span class="keyword">const</span> <span class="keywordtype">wchar_t</span>* rhs);</div><div class="line"><a name="l02936"></a><span class="lineno"> 2936</span> </div><div class="line"><a name="l02937"></a><span class="lineno"> 2937</span>  <span class="comment">// Compares two C strings, ignoring case. Returns true iff they</span></div><div class="line"><a name="l02938"></a><span class="lineno"> 2938</span>  <span class="comment">// have the same content.</span></div><div class="line"><a name="l02939"></a><span class="lineno"> 2939</span>  <span class="comment">//</span></div><div class="line"><a name="l02940"></a><span class="lineno"> 2940</span>  <span class="comment">// Unlike strcasecmp(), this function can handle NULL argument(s).</span></div><div class="line"><a name="l02941"></a><span class="lineno"> 2941</span>  <span class="comment">// A NULL C string is considered different to any non-NULL C string,</span></div><div class="line"><a name="l02942"></a><span class="lineno"> 2942</span>  <span class="comment">// including the empty string.</span></div><div class="line"><a name="l02943"></a><span class="lineno"> 2943</span>  <span class="keyword">static</span> <span class="keywordtype">bool</span> CaseInsensitiveCStringEquals(<span class="keyword">const</span> <span class="keywordtype">char</span>* lhs,</div><div class="line"><a name="l02944"></a><span class="lineno"> 2944</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* rhs);</div><div class="line"><a name="l02945"></a><span class="lineno"> 2945</span> </div><div class="line"><a name="l02946"></a><span class="lineno"> 2946</span>  <span class="comment">// Compares two wide C strings, ignoring case. Returns true iff they</span></div><div class="line"><a name="l02947"></a><span class="lineno"> 2947</span>  <span class="comment">// have the same content.</span></div><div class="line"><a name="l02948"></a><span class="lineno"> 2948</span>  <span class="comment">//</span></div><div class="line"><a name="l02949"></a><span class="lineno"> 2949</span>  <span class="comment">// Unlike wcscasecmp(), this function can handle NULL argument(s).</span></div><div class="line"><a name="l02950"></a><span class="lineno"> 2950</span>  <span class="comment">// A NULL C string is considered different to any non-NULL wide C string,</span></div><div class="line"><a name="l02951"></a><span class="lineno"> 2951</span>  <span class="comment">// including the empty string.</span></div><div class="line"><a name="l02952"></a><span class="lineno"> 2952</span>  <span class="comment">// NB: The implementations on different platforms slightly differ.</span></div><div class="line"><a name="l02953"></a><span class="lineno"> 2953</span>  <span class="comment">// On windows, this method uses _wcsicmp which compares according to LC_CTYPE</span></div><div class="line"><a name="l02954"></a><span class="lineno"> 2954</span>  <span class="comment">// environment variable. On GNU platform this method uses wcscasecmp</span></div><div class="line"><a name="l02955"></a><span class="lineno"> 2955</span>  <span class="comment">// which compares according to LC_CTYPE category of the current locale.</span></div><div class="line"><a name="l02956"></a><span class="lineno"> 2956</span>  <span class="comment">// On MacOS X, it uses towlower, which also uses LC_CTYPE category of the</span></div><div class="line"><a name="l02957"></a><span class="lineno"> 2957</span>  <span class="comment">// current locale.</span></div><div class="line"><a name="l02958"></a><span class="lineno"> 2958</span>  <span class="keyword">static</span> <span class="keywordtype">bool</span> CaseInsensitiveWideCStringEquals(<span class="keyword">const</span> <span class="keywordtype">wchar_t</span>* lhs,</div><div class="line"><a name="l02959"></a><span class="lineno"> 2959</span>  <span class="keyword">const</span> <span class="keywordtype">wchar_t</span>* rhs);</div><div class="line"><a name="l02960"></a><span class="lineno"> 2960</span> </div><div class="line"><a name="l02961"></a><span class="lineno"> 2961</span>  <span class="comment">// Returns true iff the given string ends with the given suffix, ignoring</span></div><div class="line"><a name="l02962"></a><span class="lineno"> 2962</span>  <span class="comment">// case. Any string is considered to end with an empty suffix.</span></div><div class="line"><a name="l02963"></a><span class="lineno"> 2963</span>  <span class="keyword">static</span> <span class="keywordtype">bool</span> EndsWithCaseInsensitive(</div><div class="line"><a name="l02964"></a><span class="lineno"> 2964</span>  <span class="keyword">const</span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a>& str, <span class="keyword">const</span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a>& suffix);</div><div class="line"><a name="l02965"></a><span class="lineno"> 2965</span> </div><div class="line"><a name="l02966"></a><span class="lineno"> 2966</span>  <span class="comment">// Formats an int value as "%02d".</span></div><div class="line"><a name="l02967"></a><span class="lineno"> 2967</span>  <span class="keyword">static</span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a> FormatIntWidth2(<span class="keywordtype">int</span> value); <span class="comment">// "%02d" for width == 2</span></div><div class="line"><a name="l02968"></a><span class="lineno"> 2968</span> </div><div class="line"><a name="l02969"></a><span class="lineno"> 2969</span>  <span class="comment">// Formats an int value as "%X".</span></div><div class="line"><a name="l02970"></a><span class="lineno"> 2970</span>  <span class="keyword">static</span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a> FormatHexInt(<span class="keywordtype">int</span> value);</div><div class="line"><a name="l02971"></a><span class="lineno"> 2971</span> </div><div class="line"><a name="l02972"></a><span class="lineno"> 2972</span>  <span class="comment">// Formats a byte as "%02X".</span></div><div class="line"><a name="l02973"></a><span class="lineno"> 2973</span>  <span class="keyword">static</span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a> FormatByte(<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> value);</div><div class="line"><a name="l02974"></a><span class="lineno"> 2974</span> </div><div class="line"><a name="l02975"></a><span class="lineno"> 2975</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l02976"></a><span class="lineno"> 2976</span>  String(); <span class="comment">// Not meant to be instantiated.</span></div><div class="line"><a name="l02977"></a><span class="lineno"> 2977</span> }; <span class="comment">// class String</span></div><div class="line"><a name="l02978"></a><span class="lineno"> 2978</span> </div><div class="line"><a name="l02979"></a><span class="lineno"> 2979</span> <span class="comment">// Gets the content of the stringstream's buffer as an std::string. Each '\0'</span></div><div class="line"><a name="l02980"></a><span class="lineno"> 2980</span> <span class="comment">// character in the buffer is replaced with "\\0".</span></div><div class="line"><a name="l02981"></a><span class="lineno"> 2981</span> <a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a> StringStreamToString(::std::stringstream* stream);</div><div class="line"><a name="l02982"></a><span class="lineno"> 2982</span> </div><div class="line"><a name="l02983"></a><span class="lineno"> 2983</span> } <span class="comment">// namespace internal</span></div><div class="line"><a name="l02984"></a><span class="lineno"> 2984</span> } <span class="comment">// namespace testing</span></div><div class="line"><a name="l02985"></a><span class="lineno"> 2985</span> </div><div class="line"><a name="l02986"></a><span class="lineno"> 2986</span> <span class="preprocessor">#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_</span></div><div class="line"><a name="l02987"></a><span class="lineno"> 2987</span> </div><div class="line"><a name="l02988"></a><span class="lineno"><a class="line" href="gtest_8h.html#a88f79832f9d045112a76e9da8611cc13"> 2988</a></span> <a class="code" href="gtest_8h.html#a86994cc68e844d8b82089c70408dfc61">GTEST_DISABLE_MSC_WARNINGS_PUSH_</a>(4251 \</div><div class="line"><a name="l02989"></a><span class="lineno"> 2989</span> <span class="comment">/* class A needs to have dll-interface to be used by clients of class B */</span>)</div><div class="line"><a name="l02990"></a><span class="lineno"> 2990</span> </div><div class="line"><a name="l02991"></a><span class="lineno"> 2991</span> namespace <a class="code" href="namespacetesting.html">testing</a> {</div><div class="line"><a name="l02992"></a><span class="lineno"> 2992</span> <span class="keyword">namespace </span>internal {</div><div class="line"><a name="l02993"></a><span class="lineno"> 2993</span> </div><div class="line"><a name="l02994"></a><span class="lineno"> 2994</span> <span class="comment">// FilePath - a class for file and directory pathname manipulation which</span></div><div class="line"><a name="l02995"></a><span class="lineno"> 2995</span> <span class="comment">// handles platform-specific conventions (like the pathname separator).</span></div><div class="line"><a name="l02996"></a><span class="lineno"> 2996</span> <span class="comment">// Used for helper functions for naming files in a directory for xml output.</span></div><div class="line"><a name="l02997"></a><span class="lineno"> 2997</span> <span class="comment">// Except for Set methods, all methods are const or static, which provides an</span></div><div class="line"><a name="l02998"></a><span class="lineno"> 2998</span> <span class="comment">// "immutable value object" -- useful for peace of mind.</span></div><div class="line"><a name="l02999"></a><span class="lineno"> 2999</span> <span class="comment">// A FilePath with a value ending in a path separator ("like/this/") represents</span></div><div class="line"><a name="l03000"></a><span class="lineno"> 3000</span> <span class="comment">// a directory, otherwise it is assumed to represent a file. In either case,</span></div><div class="line"><a name="l03001"></a><span class="lineno"> 3001</span> <span class="comment">// it may or may not represent an actual file or directory in the file system.</span></div><div class="line"><a name="l03002"></a><span class="lineno"> 3002</span> <span class="comment">// Names are NOT checked for syntax correctness -- no checking for illegal</span></div><div class="line"><a name="l03003"></a><span class="lineno"> 3003</span> <span class="comment">// characters, malformed paths, etc.</span></div><div class="line"><a name="l03004"></a><span class="lineno"> 3004</span> </div><div class="line"><a name="l03005"></a><span class="lineno"> 3005</span> <span class="keyword">class </span><a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> FilePath {</div><div class="line"><a name="l03006"></a><span class="lineno"> 3006</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l03007"></a><span class="lineno"> 3007</span>  FilePath() : pathname_(<span class="stringliteral">""</span>) { }</div><div class="line"><a name="l03008"></a><span class="lineno"> 3008</span>  FilePath(<span class="keyword">const</span> FilePath& rhs) : pathname_(rhs.pathname_) { }</div><div class="line"><a name="l03009"></a><span class="lineno"> 3009</span> </div><div class="line"><a name="l03010"></a><span class="lineno"> 3010</span>  <span class="keyword">explicit</span> FilePath(<span class="keyword">const</span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a>& pathname) : pathname_(pathname) {</div><div class="line"><a name="l03011"></a><span class="lineno"> 3011</span>  Normalize();</div><div class="line"><a name="l03012"></a><span class="lineno"> 3012</span>  }</div><div class="line"><a name="l03013"></a><span class="lineno"> 3013</span> </div><div class="line"><a name="l03014"></a><span class="lineno"> 3014</span>  FilePath& operator=(<span class="keyword">const</span> FilePath& rhs) {</div><div class="line"><a name="l03015"></a><span class="lineno"> 3015</span>  Set(rhs);</div><div class="line"><a name="l03016"></a><span class="lineno"> 3016</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l03017"></a><span class="lineno"> 3017</span>  }</div><div class="line"><a name="l03018"></a><span class="lineno"> 3018</span> </div><div class="line"><a name="l03019"></a><span class="lineno"> 3019</span>  <span class="keywordtype">void</span> Set(<span class="keyword">const</span> FilePath& rhs) {</div><div class="line"><a name="l03020"></a><span class="lineno"> 3020</span>  pathname_ = rhs.pathname_;</div><div class="line"><a name="l03021"></a><span class="lineno"> 3021</span>  }</div><div class="line"><a name="l03022"></a><span class="lineno"> 3022</span> </div><div class="line"><a name="l03023"></a><span class="lineno"> 3023</span>  <span class="keyword">const</span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a>& <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">string</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> pathname_; }</div><div class="line"><a name="l03024"></a><span class="lineno"> 3024</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* c_str()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> pathname_.c_str(); }</div><div class="line"><a name="l03025"></a><span class="lineno"> 3025</span> </div><div class="line"><a name="l03026"></a><span class="lineno"> 3026</span>  <span class="comment">// Returns the current working directory, or "" if unsuccessful.</span></div><div class="line"><a name="l03027"></a><span class="lineno"> 3027</span>  <span class="keyword">static</span> FilePath GetCurrentDir();</div><div class="line"><a name="l03028"></a><span class="lineno"> 3028</span> </div><div class="line"><a name="l03029"></a><span class="lineno"> 3029</span>  <span class="comment">// Given directory = "dir", base_name = "test", number = 0,</span></div><div class="line"><a name="l03030"></a><span class="lineno"> 3030</span>  <span class="comment">// extension = "xml", returns "dir/test.xml". If number is greater</span></div><div class="line"><a name="l03031"></a><span class="lineno"> 3031</span>  <span class="comment">// than zero (e.g., 12), returns "dir/test_12.xml".</span></div><div class="line"><a name="l03032"></a><span class="lineno"> 3032</span>  <span class="comment">// On Windows platform, uses \ as the separator rather than /.</span></div><div class="line"><a name="l03033"></a><span class="lineno"> 3033</span>  <span class="keyword">static</span> FilePath MakeFileName(<span class="keyword">const</span> FilePath& directory,</div><div class="line"><a name="l03034"></a><span class="lineno"> 3034</span>  <span class="keyword">const</span> FilePath& base_name,</div><div class="line"><a name="l03035"></a><span class="lineno"> 3035</span>  <span class="keywordtype">int</span> number,</div><div class="line"><a name="l03036"></a><span class="lineno"> 3036</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* extension);</div><div class="line"><a name="l03037"></a><span class="lineno"> 3037</span> </div><div class="line"><a name="l03038"></a><span class="lineno"> 3038</span>  <span class="comment">// Given directory = "dir", relative_path = "test.xml",</span></div><div class="line"><a name="l03039"></a><span class="lineno"> 3039</span>  <span class="comment">// returns "dir/test.xml".</span></div><div class="line"><a name="l03040"></a><span class="lineno"> 3040</span>  <span class="comment">// On Windows, uses \ as the separator rather than /.</span></div><div class="line"><a name="l03041"></a><span class="lineno"> 3041</span>  <span class="keyword">static</span> FilePath ConcatPaths(<span class="keyword">const</span> FilePath& directory,</div><div class="line"><a name="l03042"></a><span class="lineno"> 3042</span>  <span class="keyword">const</span> FilePath& relative_path);</div><div class="line"><a name="l03043"></a><span class="lineno"> 3043</span> </div><div class="line"><a name="l03044"></a><span class="lineno"> 3044</span>  <span class="comment">// Returns a pathname for a file that does not currently exist. The pathname</span></div><div class="line"><a name="l03045"></a><span class="lineno"> 3045</span>  <span class="comment">// will be directory/base_name.extension or</span></div><div class="line"><a name="l03046"></a><span class="lineno"> 3046</span>  <span class="comment">// directory/base_name_<number>.extension if directory/base_name.extension</span></div><div class="line"><a name="l03047"></a><span class="lineno"> 3047</span>  <span class="comment">// already exists. The number will be incremented until a pathname is found</span></div><div class="line"><a name="l03048"></a><span class="lineno"> 3048</span>  <span class="comment">// that does not already exist.</span></div><div class="line"><a name="l03049"></a><span class="lineno"> 3049</span>  <span class="comment">// Examples: 'dir/foo_test.xml' or 'dir/foo_test_1.xml'.</span></div><div class="line"><a name="l03050"></a><span class="lineno"> 3050</span>  <span class="comment">// There could be a race condition if two or more processes are calling this</span></div><div class="line"><a name="l03051"></a><span class="lineno"> 3051</span>  <span class="comment">// function at the same time -- they could both pick the same filename.</span></div><div class="line"><a name="l03052"></a><span class="lineno"> 3052</span>  <span class="keyword">static</span> FilePath GenerateUniqueFileName(<span class="keyword">const</span> FilePath& directory,</div><div class="line"><a name="l03053"></a><span class="lineno"> 3053</span>  <span class="keyword">const</span> FilePath& base_name,</div><div class="line"><a name="l03054"></a><span class="lineno"> 3054</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* extension);</div><div class="line"><a name="l03055"></a><span class="lineno"> 3055</span> </div><div class="line"><a name="l03056"></a><span class="lineno"> 3056</span>  <span class="comment">// Returns true iff the path is "".</span></div><div class="line"><a name="l03057"></a><span class="lineno"> 3057</span>  <span class="keywordtype">bool</span> IsEmpty()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> pathname_.empty(); }</div><div class="line"><a name="l03058"></a><span class="lineno"> 3058</span> </div><div class="line"><a name="l03059"></a><span class="lineno"> 3059</span>  <span class="comment">// If input name has a trailing separator character, removes it and returns</span></div><div class="line"><a name="l03060"></a><span class="lineno"> 3060</span>  <span class="comment">// the name, otherwise return the name string unmodified.</span></div><div class="line"><a name="l03061"></a><span class="lineno"> 3061</span>  <span class="comment">// On Windows platform, uses \ as the separator, other platforms use /.</span></div><div class="line"><a name="l03062"></a><span class="lineno"> 3062</span>  FilePath RemoveTrailingPathSeparator() <span class="keyword">const</span>;</div><div class="line"><a name="l03063"></a><span class="lineno"> 3063</span> </div><div class="line"><a name="l03064"></a><span class="lineno"> 3064</span>  <span class="comment">// Returns a copy of the FilePath with the directory part removed.</span></div><div class="line"><a name="l03065"></a><span class="lineno"> 3065</span>  <span class="comment">// Example: FilePath("path/to/file").RemoveDirectoryName() returns</span></div><div class="line"><a name="l03066"></a><span class="lineno"> 3066</span>  <span class="comment">// FilePath("file"). If there is no directory part ("just_a_file"), it returns</span></div><div class="line"><a name="l03067"></a><span class="lineno"> 3067</span>  <span class="comment">// the FilePath unmodified. If there is no file part ("just_a_dir/") it</span></div><div class="line"><a name="l03068"></a><span class="lineno"> 3068</span>  <span class="comment">// returns an empty FilePath ("").</span></div><div class="line"><a name="l03069"></a><span class="lineno"> 3069</span>  <span class="comment">// On Windows platform, '\' is the path separator, otherwise it is '/'.</span></div><div class="line"><a name="l03070"></a><span class="lineno"> 3070</span>  FilePath RemoveDirectoryName() <span class="keyword">const</span>;</div><div class="line"><a name="l03071"></a><span class="lineno"> 3071</span> </div><div class="line"><a name="l03072"></a><span class="lineno"> 3072</span>  <span class="comment">// RemoveFileName returns the directory path with the filename removed.</span></div><div class="line"><a name="l03073"></a><span class="lineno"> 3073</span>  <span class="comment">// Example: FilePath("path/to/file").RemoveFileName() returns "path/to/".</span></div><div class="line"><a name="l03074"></a><span class="lineno"> 3074</span>  <span class="comment">// If the FilePath is "a_file" or "/a_file", RemoveFileName returns</span></div><div class="line"><a name="l03075"></a><span class="lineno"> 3075</span>  <span class="comment">// FilePath("./") or, on Windows, FilePath(".\\"). If the filepath does</span></div><div class="line"><a name="l03076"></a><span class="lineno"> 3076</span>  <span class="comment">// not have a file, like "just/a/dir/", it returns the FilePath unmodified.</span></div><div class="line"><a name="l03077"></a><span class="lineno"> 3077</span>  <span class="comment">// On Windows platform, '\' is the path separator, otherwise it is '/'.</span></div><div class="line"><a name="l03078"></a><span class="lineno"> 3078</span>  FilePath RemoveFileName() <span class="keyword">const</span>;</div><div class="line"><a name="l03079"></a><span class="lineno"> 3079</span> </div><div class="line"><a name="l03080"></a><span class="lineno"> 3080</span>  <span class="comment">// Returns a copy of the FilePath with the case-insensitive extension removed.</span></div><div class="line"><a name="l03081"></a><span class="lineno"> 3081</span>  <span class="comment">// Example: FilePath("dir/file.exe").RemoveExtension("EXE") returns</span></div><div class="line"><a name="l03082"></a><span class="lineno"> 3082</span>  <span class="comment">// FilePath("dir/file"). If a case-insensitive extension is not</span></div><div class="line"><a name="l03083"></a><span class="lineno"> 3083</span>  <span class="comment">// found, returns a copy of the original FilePath.</span></div><div class="line"><a name="l03084"></a><span class="lineno"> 3084</span>  FilePath RemoveExtension(<span class="keyword">const</span> <span class="keywordtype">char</span>* extension) <span class="keyword">const</span>;</div><div class="line"><a name="l03085"></a><span class="lineno"> 3085</span> </div><div class="line"><a name="l03086"></a><span class="lineno"> 3086</span>  <span class="comment">// Creates directories so that path exists. Returns true if successful or if</span></div><div class="line"><a name="l03087"></a><span class="lineno"> 3087</span>  <span class="comment">// the directories already exist; returns false if unable to create</span></div><div class="line"><a name="l03088"></a><span class="lineno"> 3088</span>  <span class="comment">// directories for any reason. Will also return false if the FilePath does</span></div><div class="line"><a name="l03089"></a><span class="lineno"> 3089</span>  <span class="comment">// not represent a directory (that is, it doesn't end with a path separator).</span></div><div class="line"><a name="l03090"></a><span class="lineno"> 3090</span>  <span class="keywordtype">bool</span> CreateDirectoriesRecursively() <span class="keyword">const</span>;</div><div class="line"><a name="l03091"></a><span class="lineno"> 3091</span> </div><div class="line"><a name="l03092"></a><span class="lineno"> 3092</span>  <span class="comment">// Create the directory so that path exists. Returns true if successful or</span></div><div class="line"><a name="l03093"></a><span class="lineno"> 3093</span>  <span class="comment">// if the directory already exists; returns false if unable to create the</span></div><div class="line"><a name="l03094"></a><span class="lineno"> 3094</span>  <span class="comment">// directory for any reason, including if the parent directory does not</span></div><div class="line"><a name="l03095"></a><span class="lineno"> 3095</span>  <span class="comment">// exist. Not named "CreateDirectory" because that's a macro on Windows.</span></div><div class="line"><a name="l03096"></a><span class="lineno"> 3096</span>  <span class="keywordtype">bool</span> CreateFolder() <span class="keyword">const</span>;</div><div class="line"><a name="l03097"></a><span class="lineno"> 3097</span> </div><div class="line"><a name="l03098"></a><span class="lineno"> 3098</span>  <span class="comment">// Returns true if FilePath describes something in the file-system,</span></div><div class="line"><a name="l03099"></a><span class="lineno"> 3099</span>  <span class="comment">// either a file, directory, or whatever, and that something exists.</span></div><div class="line"><a name="l03100"></a><span class="lineno"> 3100</span>  <span class="keywordtype">bool</span> FileOrDirectoryExists() <span class="keyword">const</span>;</div><div class="line"><a name="l03101"></a><span class="lineno"> 3101</span> </div><div class="line"><a name="l03102"></a><span class="lineno"> 3102</span>  <span class="comment">// Returns true if pathname describes a directory in the file-system</span></div><div class="line"><a name="l03103"></a><span class="lineno"> 3103</span>  <span class="comment">// that exists.</span></div><div class="line"><a name="l03104"></a><span class="lineno"> 3104</span>  <span class="keywordtype">bool</span> DirectoryExists() <span class="keyword">const</span>;</div><div class="line"><a name="l03105"></a><span class="lineno"> 3105</span> </div><div class="line"><a name="l03106"></a><span class="lineno"> 3106</span>  <span class="comment">// Returns true if FilePath ends with a path separator, which indicates that</span></div><div class="line"><a name="l03107"></a><span class="lineno"> 3107</span>  <span class="comment">// it is intended to represent a directory. Returns false otherwise.</span></div><div class="line"><a name="l03108"></a><span class="lineno"> 3108</span>  <span class="comment">// This does NOT check that a directory (or file) actually exists.</span></div><div class="line"><a name="l03109"></a><span class="lineno"> 3109</span>  <span class="keywordtype">bool</span> IsDirectory() <span class="keyword">const</span>;</div><div class="line"><a name="l03110"></a><span class="lineno"> 3110</span> </div><div class="line"><a name="l03111"></a><span class="lineno"> 3111</span>  <span class="comment">// Returns true if pathname describes a root directory. (Windows has one</span></div><div class="line"><a name="l03112"></a><span class="lineno"> 3112</span>  <span class="comment">// root directory per disk drive.)</span></div><div class="line"><a name="l03113"></a><span class="lineno"> 3113</span>  <span class="keywordtype">bool</span> IsRootDirectory() <span class="keyword">const</span>;</div><div class="line"><a name="l03114"></a><span class="lineno"> 3114</span> </div><div class="line"><a name="l03115"></a><span class="lineno"> 3115</span>  <span class="comment">// Returns true if pathname describes an absolute path.</span></div><div class="line"><a name="l03116"></a><span class="lineno"> 3116</span>  <span class="keywordtype">bool</span> IsAbsolutePath() <span class="keyword">const</span>;</div><div class="line"><a name="l03117"></a><span class="lineno"> 3117</span> </div><div class="line"><a name="l03118"></a><span class="lineno"> 3118</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l03119"></a><span class="lineno"> 3119</span>  <span class="comment">// Replaces multiple consecutive separators with a single separator.</span></div><div class="line"><a name="l03120"></a><span class="lineno"> 3120</span>  <span class="comment">// For example, "bar///foo" becomes "bar/foo". Does not eliminate other</span></div><div class="line"><a name="l03121"></a><span class="lineno"> 3121</span>  <span class="comment">// redundancies that might be in a pathname involving "." or "..".</span></div><div class="line"><a name="l03122"></a><span class="lineno"> 3122</span>  <span class="comment">//</span></div><div class="line"><a name="l03123"></a><span class="lineno"> 3123</span>  <span class="comment">// A pathname with multiple consecutive separators may occur either through</span></div><div class="line"><a name="l03124"></a><span class="lineno"> 3124</span>  <span class="comment">// user error or as a result of some scripts or APIs that generate a pathname</span></div><div class="line"><a name="l03125"></a><span class="lineno"> 3125</span>  <span class="comment">// with a trailing separator. On other platforms the same API or script</span></div><div class="line"><a name="l03126"></a><span class="lineno"> 3126</span>  <span class="comment">// may NOT generate a pathname with a trailing "/". Then elsewhere that</span></div><div class="line"><a name="l03127"></a><span class="lineno"> 3127</span>  <span class="comment">// pathname may have another "/" and pathname components added to it,</span></div><div class="line"><a name="l03128"></a><span class="lineno"> 3128</span>  <span class="comment">// without checking for the separator already being there.</span></div><div class="line"><a name="l03129"></a><span class="lineno"> 3129</span>  <span class="comment">// The script language and operating system may allow paths like "foo//bar"</span></div><div class="line"><a name="l03130"></a><span class="lineno"> 3130</span>  <span class="comment">// but some of the functions in FilePath will not handle that correctly. In</span></div><div class="line"><a name="l03131"></a><span class="lineno"> 3131</span>  <span class="comment">// particular, RemoveTrailingPathSeparator() only removes one separator, and</span></div><div class="line"><a name="l03132"></a><span class="lineno"> 3132</span>  <span class="comment">// it is called in CreateDirectoriesRecursively() assuming that it will change</span></div><div class="line"><a name="l03133"></a><span class="lineno"> 3133</span>  <span class="comment">// a pathname from directory syntax (trailing separator) to filename syntax.</span></div><div class="line"><a name="l03134"></a><span class="lineno"> 3134</span>  <span class="comment">//</span></div><div class="line"><a name="l03135"></a><span class="lineno"> 3135</span>  <span class="comment">// On Windows this method also replaces the alternate path separator '/' with</span></div><div class="line"><a name="l03136"></a><span class="lineno"> 3136</span>  <span class="comment">// the primary path separator '\\', so that for example "bar\\/\\foo" becomes</span></div><div class="line"><a name="l03137"></a><span class="lineno"> 3137</span>  <span class="comment">// "bar\\foo".</span></div><div class="line"><a name="l03138"></a><span class="lineno"> 3138</span> </div><div class="line"><a name="l03139"></a><span class="lineno"> 3139</span>  <span class="keywordtype">void</span> Normalize();</div><div class="line"><a name="l03140"></a><span class="lineno"> 3140</span> </div><div class="line"><a name="l03141"></a><span class="lineno"> 3141</span>  <span class="comment">// Returns a pointer to the last occurence of a valid path separator in</span></div><div class="line"><a name="l03142"></a><span class="lineno"> 3142</span>  <span class="comment">// the FilePath. On Windows, for example, both '/' and '\' are valid path</span></div><div class="line"><a name="l03143"></a><span class="lineno"> 3143</span>  <span class="comment">// separators. Returns NULL if no path separator was found.</span></div><div class="line"><a name="l03144"></a><span class="lineno"> 3144</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* FindLastPathSeparator() <span class="keyword">const</span>;</div><div class="line"><a name="l03145"></a><span class="lineno"> 3145</span> </div><div class="line"><a name="l03146"></a><span class="lineno"> 3146</span>  <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a> pathname_;</div><div class="line"><a name="l03147"></a><span class="lineno"> 3147</span> }; <span class="comment">// class FilePath</span></div><div class="line"><a name="l03148"></a><span class="lineno"> 3148</span> </div><div class="line"><a name="l03149"></a><span class="lineno"> 3149</span> } <span class="comment">// namespace internal</span></div><div class="line"><a name="l03150"></a><span class="lineno"> 3150</span> } <span class="comment">// namespace testing</span></div><div class="line"><a name="l03151"></a><span class="lineno"> 3151</span> </div><div class="line"><a name="l03152"></a><span class="lineno"> 3152</span> <a class="code" href="gtest_8h.html#aebf8277c9069c1e124f9a5bbe2948061">GTEST_DISABLE_MSC_WARNINGS_POP_</a>() <span class="comment">// 4251</span></div><div class="line"><a name="l03153"></a><span class="lineno"> 3153</span> </div><div class="line"><a name="l03154"></a><span class="lineno"> 3154</span> <span class="preprocessor">#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_</span></div><div class="line"><a name="l03155"></a><span class="lineno"> 3155</span> <span class="comment">// This file was GENERATED by command:</span></div><div class="line"><a name="l03156"></a><span class="lineno"> 3156</span> <span class="comment">// pump.py gtest-type-util.h.pump</span></div><div class="line"><a name="l03157"></a><span class="lineno"> 3157</span> <span class="comment">// DO NOT EDIT BY HAND!!!</span></div><div class="line"><a name="l03158"></a><span class="lineno"> 3158</span> </div><div class="line"><a name="l03159"></a><span class="lineno"> 3159</span> <span class="comment">// Copyright 2008 Google Inc.</span></div><div class="line"><a name="l03160"></a><span class="lineno"> 3160</span> <span class="comment">// All Rights Reserved.</span></div><div class="line"><a name="l03161"></a><span class="lineno"> 3161</span> <span class="comment">//</span></div><div class="line"><a name="l03162"></a><span class="lineno"> 3162</span> <span class="comment">// Redistribution and use in source and binary forms, with or without</span></div><div class="line"><a name="l03163"></a><span class="lineno"> 3163</span> <span class="comment">// modification, are permitted provided that the following conditions are</span></div><div class="line"><a name="l03164"></a><span class="lineno"> 3164</span> <span class="comment">// met:</span></div><div class="line"><a name="l03165"></a><span class="lineno"> 3165</span> <span class="comment">//</span></div><div class="line"><a name="l03166"></a><span class="lineno"> 3166</span> <span class="comment">// * Redistributions of source code must retain the above copyright</span></div><div class="line"><a name="l03167"></a><span class="lineno"> 3167</span> <span class="comment">// notice, this list of conditions and the following disclaimer.</span></div><div class="line"><a name="l03168"></a><span class="lineno"> 3168</span> <span class="comment">// * Redistributions in binary form must reproduce the above</span></div><div class="line"><a name="l03169"></a><span class="lineno"> 3169</span> <span class="comment">// copyright notice, this list of conditions and the following disclaimer</span></div><div class="line"><a name="l03170"></a><span class="lineno"> 3170</span> <span class="comment">// in the documentation and/or other materials provided with the</span></div><div class="line"><a name="l03171"></a><span class="lineno"> 3171</span> <span class="comment">// distribution.</span></div><div class="line"><a name="l03172"></a><span class="lineno"> 3172</span> <span class="comment">// * Neither the name of Google Inc. nor the names of its</span></div><div class="line"><a name="l03173"></a><span class="lineno"> 3173</span> <span class="comment">// contributors may be used to endorse or promote products derived from</span></div><div class="line"><a name="l03174"></a><span class="lineno"> 3174</span> <span class="comment">// this software without specific prior written permission.</span></div><div class="line"><a name="l03175"></a><span class="lineno"> 3175</span> <span class="comment">//</span></div><div class="line"><a name="l03176"></a><span class="lineno"> 3176</span> <span class="comment">// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS</span></div><div class="line"><a name="l03177"></a><span class="lineno"> 3177</span> <span class="comment">// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT</span></div><div class="line"><a name="l03178"></a><span class="lineno"> 3178</span> <span class="comment">// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR</span></div><div class="line"><a name="l03179"></a><span class="lineno"> 3179</span> <span class="comment">// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT</span></div><div class="line"><a name="l03180"></a><span class="lineno"> 3180</span> <span class="comment">// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,</span></div><div class="line"><a name="l03181"></a><span class="lineno"> 3181</span> <span class="comment">// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT</span></div><div class="line"><a name="l03182"></a><span class="lineno"> 3182</span> <span class="comment">// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,</span></div><div class="line"><a name="l03183"></a><span class="lineno"> 3183</span> <span class="comment">// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY</span></div><div class="line"><a name="l03184"></a><span class="lineno"> 3184</span> <span class="comment">// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</span></div><div class="line"><a name="l03185"></a><span class="lineno"> 3185</span> <span class="comment">// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE</span></div><div class="line"><a name="l03186"></a><span class="lineno"> 3186</span> <span class="comment">// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span></div><div class="line"><a name="l03187"></a><span class="lineno"> 3187</span> </div><div class="line"><a name="l03188"></a><span class="lineno"> 3188</span> <span class="comment">// Type utilities needed for implementing typed and type-parameterized</span></div><div class="line"><a name="l03189"></a><span class="lineno"> 3189</span> <span class="comment">// tests. This file is generated by a SCRIPT. DO NOT EDIT BY HAND!</span></div><div class="line"><a name="l03190"></a><span class="lineno"> 3190</span> <span class="comment">//</span></div><div class="line"><a name="l03191"></a><span class="lineno"> 3191</span> <span class="comment">// Currently we support at most 50 types in a list, and at most 50</span></div><div class="line"><a name="l03192"></a><span class="lineno"> 3192</span> <span class="comment">// type-parameterized tests in one type-parameterized test suite.</span></div><div class="line"><a name="l03193"></a><span class="lineno"> 3193</span> <span class="comment">// Please contact googletestframework@googlegroups.com if you need</span></div><div class="line"><a name="l03194"></a><span class="lineno"> 3194</span> <span class="comment">// more.</span></div><div class="line"><a name="l03195"></a><span class="lineno"> 3195</span> </div><div class="line"><a name="l03196"></a><span class="lineno"> 3196</span> <span class="comment">// GOOGLETEST_CM0001 DO NOT DELETE</span></div><div class="line"><a name="l03197"></a><span class="lineno"> 3197</span> </div><div class="line"><a name="l03198"></a><span class="lineno"> 3198</span> <span class="preprocessor">#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_</span></div><div class="line"><a name="l03199"></a><span class="lineno"> 3199</span> <span class="preprocessor">#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_</span></div><div class="line"><a name="l03200"></a><span class="lineno"> 3200</span> </div><div class="line"><a name="l03201"></a><span class="lineno"> 3201</span> </div><div class="line"><a name="l03202"></a><span class="lineno"> 3202</span> <span class="comment">// #ifdef __GNUC__ is too general here. It is possible to use gcc without using</span></div><div class="line"><a name="l03203"></a><span class="lineno"> 3203</span> <span class="comment">// libstdc++ (which is where cxxabi.h comes from).</span></div><div class="line"><a name="l03204"></a><span class="lineno"> 3204</span> <span class="preprocessor"># if GTEST_HAS_CXXABI_H_</span></div><div class="line"><a name="l03205"></a><span class="lineno"> 3205</span> <span class="preprocessor"># include <cxxabi.h></span></div><div class="line"><a name="l03206"></a><span class="lineno"> 3206</span> <span class="preprocessor"># elif defined(__HP_aCC)</span></div><div class="line"><a name="l03207"></a><span class="lineno"> 3207</span> <span class="preprocessor"># include <acxx_demangle.h></span></div><div class="line"><a name="l03208"></a><span class="lineno"> 3208</span> <span class="preprocessor"># endif // GTEST_HASH_CXXABI_H_</span></div><div class="line"><a name="l03209"></a><span class="lineno"> 3209</span> </div><div class="line"><a name="l03210"></a><span class="lineno"> 3210</span> <span class="keyword">namespace </span><a class="code" href="namespacetesting.html">testing</a> {</div><div class="line"><a name="l03211"></a><span class="lineno"> 3211</span> <span class="keyword">namespace </span>internal {</div><div class="line"><a name="l03212"></a><span class="lineno"> 3212</span> </div><div class="line"><a name="l03213"></a><span class="lineno"> 3213</span> <span class="comment">// Canonicalizes a given name with respect to the Standard C++ Library.</span></div><div class="line"><a name="l03214"></a><span class="lineno"> 3214</span> <span class="comment">// This handles removing the inline namespace within `std` that is</span></div><div class="line"><a name="l03215"></a><span class="lineno"> 3215</span> <span class="comment">// used by various standard libraries (e.g., `std::__1`). Names outside</span></div><div class="line"><a name="l03216"></a><span class="lineno"> 3216</span> <span class="comment">// of namespace std are returned unmodified.</span></div><div class="line"><a name="l03217"></a><span class="lineno"> 3217</span> <span class="keyword">inline</span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a> CanonicalizeForStdLibVersioning(<a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a> s) {</div><div class="line"><a name="l03218"></a><span class="lineno"> 3218</span>  <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">char</span> prefix[] = <span class="stringliteral">"std::__"</span>;</div><div class="line"><a name="l03219"></a><span class="lineno"> 3219</span>  <span class="keywordflow">if</span> (s.compare(0, strlen(prefix), prefix) == 0) {</div><div class="line"><a name="l03220"></a><span class="lineno"> 3220</span>  std::string::size_type end = s.find(<span class="stringliteral">"::"</span>, strlen(prefix));</div><div class="line"><a name="l03221"></a><span class="lineno"> 3221</span>  <span class="keywordflow">if</span> (end != s.npos) {</div><div class="line"><a name="l03222"></a><span class="lineno"> 3222</span>  <span class="comment">// Erase everything between the initial `std` and the second `::`.</span></div><div class="line"><a name="l03223"></a><span class="lineno"> 3223</span>  s.erase(strlen(<span class="stringliteral">"std"</span>), end - strlen(<span class="stringliteral">"std"</span>));</div><div class="line"><a name="l03224"></a><span class="lineno"> 3224</span>  }</div><div class="line"><a name="l03225"></a><span class="lineno"> 3225</span>  }</div><div class="line"><a name="l03226"></a><span class="lineno"> 3226</span>  <span class="keywordflow">return</span> s;</div><div class="line"><a name="l03227"></a><span class="lineno"> 3227</span> }</div><div class="line"><a name="l03228"></a><span class="lineno"> 3228</span> </div><div class="line"><a name="l03229"></a><span class="lineno"> 3229</span> <span class="comment">// GetTypeName<T>() returns a human-readable name of type T.</span></div><div class="line"><a name="l03230"></a><span class="lineno"> 3230</span> <span class="comment">// NB: This function is also used in Google Mock, so don't move it inside of</span></div><div class="line"><a name="l03231"></a><span class="lineno"> 3231</span> <span class="comment">// the typed-test-only section below.</span></div><div class="line"><a name="l03232"></a><span class="lineno"> 3232</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l03233"></a><span class="lineno"> 3233</span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a> GetTypeName() {</div><div class="line"><a name="l03234"></a><span class="lineno"> 3234</span> <span class="preprocessor"># if GTEST_HAS_RTTI</span></div><div class="line"><a name="l03235"></a><span class="lineno"> 3235</span> </div><div class="line"><a name="l03236"></a><span class="lineno"> 3236</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* <span class="keyword">const</span> name = <span class="keyword">typeid</span>(T).name();</div><div class="line"><a name="l03237"></a><span class="lineno"> 3237</span> <span class="preprocessor"># if GTEST_HAS_CXXABI_H_ || defined(__HP_aCC)</span></div><div class="line"><a name="l03238"></a><span class="lineno"> 3238</span>  <span class="keywordtype">int</span> status = 0;</div><div class="line"><a name="l03239"></a><span class="lineno"> 3239</span>  <span class="comment">// gcc's implementation of typeid(T).name() mangles the type name,</span></div><div class="line"><a name="l03240"></a><span class="lineno"> 3240</span>  <span class="comment">// so we have to demangle it.</span></div><div class="line"><a name="l03241"></a><span class="lineno"> 3241</span> <span class="preprocessor"># if GTEST_HAS_CXXABI_H_</span></div><div class="line"><a name="l03242"></a><span class="lineno"> 3242</span>  <span class="keyword">using</span> abi::__cxa_demangle;</div><div class="line"><a name="l03243"></a><span class="lineno"> 3243</span> <span class="preprocessor"># endif // GTEST_HAS_CXXABI_H_</span></div><div class="line"><a name="l03244"></a><span class="lineno"> 3244</span>  <span class="keywordtype">char</span>* <span class="keyword">const</span> readable_name = __cxa_demangle(name, <span class="keyword">nullptr</span>, <span class="keyword">nullptr</span>, &status);</div><div class="line"><a name="l03245"></a><span class="lineno"> 3245</span>  <span class="keyword">const</span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a> name_str(status == 0 ? readable_name : name);</div><div class="line"><a name="l03246"></a><span class="lineno"> 3246</span>  free(readable_name);</div><div class="line"><a name="l03247"></a><span class="lineno"> 3247</span>  <span class="keywordflow">return</span> CanonicalizeForStdLibVersioning(name_str);</div><div class="line"><a name="l03248"></a><span class="lineno"> 3248</span> <span class="preprocessor"># else</span></div><div class="line"><a name="l03249"></a><span class="lineno"> 3249</span>  <span class="keywordflow">return</span> name;</div><div class="line"><a name="l03250"></a><span class="lineno"> 3250</span> <span class="preprocessor"># endif // GTEST_HAS_CXXABI_H_ || __HP_aCC</span></div><div class="line"><a name="l03251"></a><span class="lineno"> 3251</span> </div><div class="line"><a name="l03252"></a><span class="lineno"> 3252</span> <span class="preprocessor"># else</span></div><div class="line"><a name="l03253"></a><span class="lineno"> 3253</span> </div><div class="line"><a name="l03254"></a><span class="lineno"> 3254</span>  <span class="keywordflow">return</span> <span class="stringliteral">"<type>"</span>;</div><div class="line"><a name="l03255"></a><span class="lineno"> 3255</span> </div><div class="line"><a name="l03256"></a><span class="lineno"> 3256</span> <span class="preprocessor"># endif // GTEST_HAS_RTTI</span></div><div class="line"><a name="l03257"></a><span class="lineno"> 3257</span> }</div><div class="line"><a name="l03258"></a><span class="lineno"> 3258</span> </div><div class="line"><a name="l03259"></a><span class="lineno"> 3259</span> <span class="preprocessor">#if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P</span></div><div class="line"><a name="l03260"></a><span class="lineno"> 3260</span> </div><div class="line"><a name="l03261"></a><span class="lineno"> 3261</span> <span class="comment">// AssertyTypeEq<T1, T2>::type is defined iff T1 and T2 are the same</span></div><div class="line"><a name="l03262"></a><span class="lineno"> 3262</span> <span class="comment">// type. This can be used as a compile-time assertion to ensure that</span></div><div class="line"><a name="l03263"></a><span class="lineno"> 3263</span> <span class="comment">// two types are equal.</span></div><div class="line"><a name="l03264"></a><span class="lineno"> 3264</span> </div><div class="line"><a name="l03265"></a><span class="lineno"> 3265</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2></div><div class="line"><a name="l03266"></a><span class="lineno"> 3266</span> <span class="keyword">struct </span>AssertTypeEq;</div><div class="line"><a name="l03267"></a><span class="lineno"> 3267</span> </div><div class="line"><a name="l03268"></a><span class="lineno"> 3268</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l03269"></a><span class="lineno"> 3269</span> <span class="keyword">struct </span>AssertTypeEq<T, T> {</div><div class="line"><a name="l03270"></a><span class="lineno"> 3270</span>  <span class="keyword">typedef</span> <span class="keywordtype">bool</span> type;</div><div class="line"><a name="l03271"></a><span class="lineno"> 3271</span> };</div><div class="line"><a name="l03272"></a><span class="lineno"> 3272</span> </div><div class="line"><a name="l03273"></a><span class="lineno"> 3273</span> <span class="comment">// A unique type used as the default value for the arguments of class</span></div><div class="line"><a name="l03274"></a><span class="lineno"> 3274</span> <span class="comment">// template Types. This allows us to simulate variadic templates</span></div><div class="line"><a name="l03275"></a><span class="lineno"> 3275</span> <span class="comment">// (e.g. Types<int>, Type<int, double>, and etc), which C++ doesn't</span></div><div class="line"><a name="l03276"></a><span class="lineno"> 3276</span> <span class="comment">// support directly.</span></div><div class="line"><a name="l03277"></a><span class="lineno"> 3277</span> <span class="keyword">struct </span>None {};</div><div class="line"><a name="l03278"></a><span class="lineno"> 3278</span> </div><div class="line"><a name="l03279"></a><span class="lineno"> 3279</span> <span class="comment">// The following family of struct and struct templates are used to</span></div><div class="line"><a name="l03280"></a><span class="lineno"> 3280</span> <span class="comment">// represent type lists. In particular, TypesN<T1, T2, ..., TN></span></div><div class="line"><a name="l03281"></a><span class="lineno"> 3281</span> <span class="comment">// represents a type list with N types (T1, T2, ..., and TN) in it.</span></div><div class="line"><a name="l03282"></a><span class="lineno"> 3282</span> <span class="comment">// Except for Types0, every struct in the family has two member types:</span></div><div class="line"><a name="l03283"></a><span class="lineno"> 3283</span> <span class="comment">// Head for the first type in the list, and Tail for the rest of the</span></div><div class="line"><a name="l03284"></a><span class="lineno"> 3284</span> <span class="comment">// list.</span></div><div class="line"><a name="l03285"></a><span class="lineno"> 3285</span> </div><div class="line"><a name="l03286"></a><span class="lineno"> 3286</span> <span class="comment">// The empty type list.</span></div><div class="line"><a name="l03287"></a><span class="lineno"> 3287</span> <span class="keyword">struct </span>Types0 {};</div><div class="line"><a name="l03288"></a><span class="lineno"> 3288</span> </div><div class="line"><a name="l03289"></a><span class="lineno"> 3289</span> <span class="comment">// Type lists of length 1, 2, 3, and so on.</span></div><div class="line"><a name="l03290"></a><span class="lineno"> 3290</span> </div><div class="line"><a name="l03291"></a><span class="lineno"> 3291</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1></div><div class="line"><a name="l03292"></a><span class="lineno"> 3292</span> <span class="keyword">struct </span>Types1 {</div><div class="line"><a name="l03293"></a><span class="lineno"> 3293</span>  <span class="keyword">typedef</span> T1 Head;</div><div class="line"><a name="l03294"></a><span class="lineno"> 3294</span>  <span class="keyword">typedef</span> Types0 Tail;</div><div class="line"><a name="l03295"></a><span class="lineno"> 3295</span> };</div><div class="line"><a name="l03296"></a><span class="lineno"> 3296</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2></div><div class="line"><a name="l03297"></a><span class="lineno"> 3297</span> <span class="keyword">struct </span>Types2 {</div><div class="line"><a name="l03298"></a><span class="lineno"> 3298</span>  <span class="keyword">typedef</span> T1 Head;</div><div class="line"><a name="l03299"></a><span class="lineno"> 3299</span>  <span class="keyword">typedef</span> Types1<T2> Tail;</div><div class="line"><a name="l03300"></a><span class="lineno"> 3300</span> };</div><div class="line"><a name="l03301"></a><span class="lineno"> 3301</span> </div><div class="line"><a name="l03302"></a><span class="lineno"> 3302</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3></div><div class="line"><a name="l03303"></a><span class="lineno"> 3303</span> <span class="keyword">struct </span>Types3 {</div><div class="line"><a name="l03304"></a><span class="lineno"> 3304</span>  <span class="keyword">typedef</span> T1 Head;</div><div class="line"><a name="l03305"></a><span class="lineno"> 3305</span>  <span class="keyword">typedef</span> Types2<T2, T3> Tail;</div><div class="line"><a name="l03306"></a><span class="lineno"> 3306</span> };</div><div class="line"><a name="l03307"></a><span class="lineno"> 3307</span> </div><div class="line"><a name="l03308"></a><span class="lineno"> 3308</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4></div><div class="line"><a name="l03309"></a><span class="lineno"> 3309</span> <span class="keyword">struct </span>Types4 {</div><div class="line"><a name="l03310"></a><span class="lineno"> 3310</span>  <span class="keyword">typedef</span> T1 Head;</div><div class="line"><a name="l03311"></a><span class="lineno"> 3311</span>  <span class="keyword">typedef</span> Types3<T2, T3, T4> Tail;</div><div class="line"><a name="l03312"></a><span class="lineno"> 3312</span> };</div><div class="line"><a name="l03313"></a><span class="lineno"> 3313</span> </div><div class="line"><a name="l03314"></a><span class="lineno"> 3314</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5></div><div class="line"><a name="l03315"></a><span class="lineno"> 3315</span> <span class="keyword">struct </span>Types5 {</div><div class="line"><a name="l03316"></a><span class="lineno"> 3316</span>  <span class="keyword">typedef</span> T1 Head;</div><div class="line"><a name="l03317"></a><span class="lineno"> 3317</span>  <span class="keyword">typedef</span> Types4<T2, T3, T4, T5> Tail;</div><div class="line"><a name="l03318"></a><span class="lineno"> 3318</span> };</div><div class="line"><a name="l03319"></a><span class="lineno"> 3319</span> </div><div class="line"><a name="l03320"></a><span class="lineno"> 3320</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l03321"></a><span class="lineno"> 3321</span>  <span class="keyword">typename</span> T6></div><div class="line"><a name="l03322"></a><span class="lineno"> 3322</span> <span class="keyword">struct </span>Types6 {</div><div class="line"><a name="l03323"></a><span class="lineno"> 3323</span>  <span class="keyword">typedef</span> T1 Head;</div><div class="line"><a name="l03324"></a><span class="lineno"> 3324</span>  <span class="keyword">typedef</span> Types5<T2, T3, T4, T5, T6> Tail;</div><div class="line"><a name="l03325"></a><span class="lineno"> 3325</span> };</div><div class="line"><a name="l03326"></a><span class="lineno"> 3326</span> </div><div class="line"><a name="l03327"></a><span class="lineno"> 3327</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l03328"></a><span class="lineno"> 3328</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7></div><div class="line"><a name="l03329"></a><span class="lineno"> 3329</span> <span class="keyword">struct </span>Types7 {</div><div class="line"><a name="l03330"></a><span class="lineno"> 3330</span>  <span class="keyword">typedef</span> T1 Head;</div><div class="line"><a name="l03331"></a><span class="lineno"> 3331</span>  <span class="keyword">typedef</span> Types6<T2, T3, T4, T5, T6, T7> Tail;</div><div class="line"><a name="l03332"></a><span class="lineno"> 3332</span> };</div><div class="line"><a name="l03333"></a><span class="lineno"> 3333</span> </div><div class="line"><a name="l03334"></a><span class="lineno"> 3334</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l03335"></a><span class="lineno"> 3335</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8></div><div class="line"><a name="l03336"></a><span class="lineno"> 3336</span> <span class="keyword">struct </span>Types8 {</div><div class="line"><a name="l03337"></a><span class="lineno"> 3337</span>  <span class="keyword">typedef</span> T1 Head;</div><div class="line"><a name="l03338"></a><span class="lineno"> 3338</span>  <span class="keyword">typedef</span> Types7<T2, T3, T4, T5, T6, T7, T8> Tail;</div><div class="line"><a name="l03339"></a><span class="lineno"> 3339</span> };</div><div class="line"><a name="l03340"></a><span class="lineno"> 3340</span> </div><div class="line"><a name="l03341"></a><span class="lineno"> 3341</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l03342"></a><span class="lineno"> 3342</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9></div><div class="line"><a name="l03343"></a><span class="lineno"> 3343</span> <span class="keyword">struct </span>Types9 {</div><div class="line"><a name="l03344"></a><span class="lineno"> 3344</span>  <span class="keyword">typedef</span> T1 Head;</div><div class="line"><a name="l03345"></a><span class="lineno"> 3345</span>  <span class="keyword">typedef</span> Types8<T2, T3, T4, T5, T6, T7, T8, T9> Tail;</div><div class="line"><a name="l03346"></a><span class="lineno"> 3346</span> };</div><div class="line"><a name="l03347"></a><span class="lineno"> 3347</span> </div><div class="line"><a name="l03348"></a><span class="lineno"> 3348</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l03349"></a><span class="lineno"> 3349</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10></div><div class="line"><a name="l03350"></a><span class="lineno"> 3350</span> <span class="keyword">struct </span>Types10 {</div><div class="line"><a name="l03351"></a><span class="lineno"> 3351</span>  <span class="keyword">typedef</span> T1 Head;</div><div class="line"><a name="l03352"></a><span class="lineno"> 3352</span>  <span class="keyword">typedef</span> Types9<T2, T3, T4, T5, T6, T7, T8, T9, T10> Tail;</div><div class="line"><a name="l03353"></a><span class="lineno"> 3353</span> };</div><div class="line"><a name="l03354"></a><span class="lineno"> 3354</span> </div><div class="line"><a name="l03355"></a><span class="lineno"> 3355</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l03356"></a><span class="lineno"> 3356</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l03357"></a><span class="lineno"> 3357</span>  <span class="keyword">typename</span> T11></div><div class="line"><a name="l03358"></a><span class="lineno"> 3358</span> <span class="keyword">struct </span>Types11 {</div><div class="line"><a name="l03359"></a><span class="lineno"> 3359</span>  <span class="keyword">typedef</span> T1 Head;</div><div class="line"><a name="l03360"></a><span class="lineno"> 3360</span>  <span class="keyword">typedef</span> Types10<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> Tail;</div><div class="line"><a name="l03361"></a><span class="lineno"> 3361</span> };</div><div class="line"><a name="l03362"></a><span class="lineno"> 3362</span> </div><div class="line"><a name="l03363"></a><span class="lineno"> 3363</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l03364"></a><span class="lineno"> 3364</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l03365"></a><span class="lineno"> 3365</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12></div><div class="line"><a name="l03366"></a><span class="lineno"> 3366</span> <span class="keyword">struct </span>Types12 {</div><div class="line"><a name="l03367"></a><span class="lineno"> 3367</span>  <span class="keyword">typedef</span> T1 Head;</div><div class="line"><a name="l03368"></a><span class="lineno"> 3368</span>  <span class="keyword">typedef</span> Types11<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> Tail;</div><div class="line"><a name="l03369"></a><span class="lineno"> 3369</span> };</div><div class="line"><a name="l03370"></a><span class="lineno"> 3370</span> </div><div class="line"><a name="l03371"></a><span class="lineno"> 3371</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l03372"></a><span class="lineno"> 3372</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l03373"></a><span class="lineno"> 3373</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13></div><div class="line"><a name="l03374"></a><span class="lineno"> 3374</span> <span class="keyword">struct </span>Types13 {</div><div class="line"><a name="l03375"></a><span class="lineno"> 3375</span>  <span class="keyword">typedef</span> T1 Head;</div><div class="line"><a name="l03376"></a><span class="lineno"> 3376</span>  <span class="keyword">typedef</span> Types12<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> Tail;</div><div class="line"><a name="l03377"></a><span class="lineno"> 3377</span> };</div><div class="line"><a name="l03378"></a><span class="lineno"> 3378</span> </div><div class="line"><a name="l03379"></a><span class="lineno"> 3379</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l03380"></a><span class="lineno"> 3380</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l03381"></a><span class="lineno"> 3381</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14></div><div class="line"><a name="l03382"></a><span class="lineno"> 3382</span> <span class="keyword">struct </span>Types14 {</div><div class="line"><a name="l03383"></a><span class="lineno"> 3383</span>  <span class="keyword">typedef</span> T1 Head;</div><div class="line"><a name="l03384"></a><span class="lineno"> 3384</span>  <span class="keyword">typedef</span> Types13<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> Tail;</div><div class="line"><a name="l03385"></a><span class="lineno"> 3385</span> };</div><div class="line"><a name="l03386"></a><span class="lineno"> 3386</span> </div><div class="line"><a name="l03387"></a><span class="lineno"> 3387</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l03388"></a><span class="lineno"> 3388</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l03389"></a><span class="lineno"> 3389</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14, <span class="keyword">typename</span> T15></div><div class="line"><a name="l03390"></a><span class="lineno"> 3390</span> <span class="keyword">struct </span>Types15 {</div><div class="line"><a name="l03391"></a><span class="lineno"> 3391</span>  <span class="keyword">typedef</span> T1 Head;</div><div class="line"><a name="l03392"></a><span class="lineno"> 3392</span>  <span class="keyword">typedef</span> Types14<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l03393"></a><span class="lineno"> 3393</span>  T15> Tail;</div><div class="line"><a name="l03394"></a><span class="lineno"> 3394</span> };</div><div class="line"><a name="l03395"></a><span class="lineno"> 3395</span> </div><div class="line"><a name="l03396"></a><span class="lineno"> 3396</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l03397"></a><span class="lineno"> 3397</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l03398"></a><span class="lineno"> 3398</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14, <span class="keyword">typename</span> T15,</div><div class="line"><a name="l03399"></a><span class="lineno"> 3399</span>  <span class="keyword">typename</span> T16></div><div class="line"><a name="l03400"></a><span class="lineno"> 3400</span> <span class="keyword">struct </span>Types16 {</div><div class="line"><a name="l03401"></a><span class="lineno"> 3401</span>  <span class="keyword">typedef</span> T1 Head;</div><div class="line"><a name="l03402"></a><span class="lineno"> 3402</span>  <span class="keyword">typedef</span> Types15<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,</div><div class="line"><a name="l03403"></a><span class="lineno"> 3403</span>  T16> Tail;</div><div class="line"><a name="l03404"></a><span class="lineno"> 3404</span> };</div><div class="line"><a name="l03405"></a><span class="lineno"> 3405</span> </div><div class="line"><a name="l03406"></a><span class="lineno"> 3406</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l03407"></a><span class="lineno"> 3407</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l03408"></a><span class="lineno"> 3408</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14, <span class="keyword">typename</span> T15,</div><div class="line"><a name="l03409"></a><span class="lineno"> 3409</span>  <span class="keyword">typename</span> T16, <span class="keyword">typename</span> T17></div><div class="line"><a name="l03410"></a><span class="lineno"> 3410</span> <span class="keyword">struct </span>Types17 {</div><div class="line"><a name="l03411"></a><span class="lineno"> 3411</span>  <span class="keyword">typedef</span> T1 Head;</div><div class="line"><a name="l03412"></a><span class="lineno"> 3412</span>  <span class="keyword">typedef</span> Types16<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,</div><div class="line"><a name="l03413"></a><span class="lineno"> 3413</span>  T16, T17> Tail;</div><div class="line"><a name="l03414"></a><span class="lineno"> 3414</span> };</div><div class="line"><a name="l03415"></a><span class="lineno"> 3415</span> </div><div class="line"><a name="l03416"></a><span class="lineno"> 3416</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l03417"></a><span class="lineno"> 3417</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l03418"></a><span class="lineno"> 3418</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14, <span class="keyword">typename</span> T15,</div><div class="line"><a name="l03419"></a><span class="lineno"> 3419</span>  <span class="keyword">typename</span> T16, <span class="keyword">typename</span> T17, <span class="keyword">typename</span> T18></div><div class="line"><a name="l03420"></a><span class="lineno"> 3420</span> <span class="keyword">struct </span>Types18 {</div><div class="line"><a name="l03421"></a><span class="lineno"> 3421</span>  <span class="keyword">typedef</span> T1 Head;</div><div class="line"><a name="l03422"></a><span class="lineno"> 3422</span>  <span class="keyword">typedef</span> Types17<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,</div><div class="line"><a name="l03423"></a><span class="lineno"> 3423</span>  T16, T17, T18> Tail;</div><div class="line"><a name="l03424"></a><span class="lineno"> 3424</span> };</div><div class="line"><a name="l03425"></a><span class="lineno"> 3425</span> </div><div class="line"><a name="l03426"></a><span class="lineno"> 3426</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l03427"></a><span class="lineno"> 3427</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l03428"></a><span class="lineno"> 3428</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14, <span class="keyword">typename</span> T15,</div><div class="line"><a name="l03429"></a><span class="lineno"> 3429</span>  <span class="keyword">typename</span> T16, <span class="keyword">typename</span> T17, <span class="keyword">typename</span> T18, <span class="keyword">typename</span> T19></div><div class="line"><a name="l03430"></a><span class="lineno"> 3430</span> <span class="keyword">struct </span>Types19 {</div><div class="line"><a name="l03431"></a><span class="lineno"> 3431</span>  <span class="keyword">typedef</span> T1 Head;</div><div class="line"><a name="l03432"></a><span class="lineno"> 3432</span>  <span class="keyword">typedef</span> Types18<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,</div><div class="line"><a name="l03433"></a><span class="lineno"> 3433</span>  T16, T17, T18, T19> Tail;</div><div class="line"><a name="l03434"></a><span class="lineno"> 3434</span> };</div><div class="line"><a name="l03435"></a><span class="lineno"> 3435</span> </div><div class="line"><a name="l03436"></a><span class="lineno"> 3436</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l03437"></a><span class="lineno"> 3437</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l03438"></a><span class="lineno"> 3438</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14, <span class="keyword">typename</span> T15,</div><div class="line"><a name="l03439"></a><span class="lineno"> 3439</span>  <span class="keyword">typename</span> T16, <span class="keyword">typename</span> T17, <span class="keyword">typename</span> T18, <span class="keyword">typename</span> T19, <span class="keyword">typename</span> T20></div><div class="line"><a name="l03440"></a><span class="lineno"> 3440</span> <span class="keyword">struct </span>Types20 {</div><div class="line"><a name="l03441"></a><span class="lineno"> 3441</span>  <span class="keyword">typedef</span> T1 Head;</div><div class="line"><a name="l03442"></a><span class="lineno"> 3442</span>  <span class="keyword">typedef</span> Types19<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,</div><div class="line"><a name="l03443"></a><span class="lineno"> 3443</span>  T16, T17, T18, T19, T20> Tail;</div><div class="line"><a name="l03444"></a><span class="lineno"> 3444</span> };</div><div class="line"><a name="l03445"></a><span class="lineno"> 3445</span> </div><div class="line"><a name="l03446"></a><span class="lineno"> 3446</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l03447"></a><span class="lineno"> 3447</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l03448"></a><span class="lineno"> 3448</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14, <span class="keyword">typename</span> T15,</div><div class="line"><a name="l03449"></a><span class="lineno"> 3449</span>  <span class="keyword">typename</span> T16, <span class="keyword">typename</span> T17, <span class="keyword">typename</span> T18, <span class="keyword">typename</span> T19, <span class="keyword">typename</span> T20,</div><div class="line"><a name="l03450"></a><span class="lineno"> 3450</span>  <span class="keyword">typename</span> T21></div><div class="line"><a name="l03451"></a><span class="lineno"> 3451</span> <span class="keyword">struct </span>Types21 {</div><div class="line"><a name="l03452"></a><span class="lineno"> 3452</span>  <span class="keyword">typedef</span> T1 Head;</div><div class="line"><a name="l03453"></a><span class="lineno"> 3453</span>  <span class="keyword">typedef</span> Types20<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,</div><div class="line"><a name="l03454"></a><span class="lineno"> 3454</span>  T16, T17, T18, T19, T20, T21> Tail;</div><div class="line"><a name="l03455"></a><span class="lineno"> 3455</span> };</div><div class="line"><a name="l03456"></a><span class="lineno"> 3456</span> </div><div class="line"><a name="l03457"></a><span class="lineno"> 3457</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l03458"></a><span class="lineno"> 3458</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l03459"></a><span class="lineno"> 3459</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14, <span class="keyword">typename</span> T15,</div><div class="line"><a name="l03460"></a><span class="lineno"> 3460</span>  <span class="keyword">typename</span> T16, <span class="keyword">typename</span> T17, <span class="keyword">typename</span> T18, <span class="keyword">typename</span> T19, <span class="keyword">typename</span> T20,</div><div class="line"><a name="l03461"></a><span class="lineno"> 3461</span>  <span class="keyword">typename</span> T21, <span class="keyword">typename</span> T22></div><div class="line"><a name="l03462"></a><span class="lineno"> 3462</span> <span class="keyword">struct </span>Types22 {</div><div class="line"><a name="l03463"></a><span class="lineno"> 3463</span>  <span class="keyword">typedef</span> T1 Head;</div><div class="line"><a name="l03464"></a><span class="lineno"> 3464</span>  <span class="keyword">typedef</span> Types21<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,</div><div class="line"><a name="l03465"></a><span class="lineno"> 3465</span>  T16, T17, T18, T19, T20, T21, T22> Tail;</div><div class="line"><a name="l03466"></a><span class="lineno"> 3466</span> };</div><div class="line"><a name="l03467"></a><span class="lineno"> 3467</span> </div><div class="line"><a name="l03468"></a><span class="lineno"> 3468</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l03469"></a><span class="lineno"> 3469</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l03470"></a><span class="lineno"> 3470</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14, <span class="keyword">typename</span> T15,</div><div class="line"><a name="l03471"></a><span class="lineno"> 3471</span>  <span class="keyword">typename</span> T16, <span class="keyword">typename</span> T17, <span class="keyword">typename</span> T18, <span class="keyword">typename</span> T19, <span class="keyword">typename</span> T20,</div><div class="line"><a name="l03472"></a><span class="lineno"> 3472</span>  <span class="keyword">typename</span> T21, <span class="keyword">typename</span> T22, <span class="keyword">typename</span> T23></div><div class="line"><a name="l03473"></a><span class="lineno"> 3473</span> <span class="keyword">struct </span>Types23 {</div><div class="line"><a name="l03474"></a><span class="lineno"> 3474</span>  <span class="keyword">typedef</span> T1 Head;</div><div class="line"><a name="l03475"></a><span class="lineno"> 3475</span>  <span class="keyword">typedef</span> Types22<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,</div><div class="line"><a name="l03476"></a><span class="lineno"> 3476</span>  T16, T17, T18, T19, T20, T21, T22, T23> Tail;</div><div class="line"><a name="l03477"></a><span class="lineno"> 3477</span> };</div><div class="line"><a name="l03478"></a><span class="lineno"> 3478</span> </div><div class="line"><a name="l03479"></a><span class="lineno"> 3479</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l03480"></a><span class="lineno"> 3480</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l03481"></a><span class="lineno"> 3481</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14, <span class="keyword">typename</span> T15,</div><div class="line"><a name="l03482"></a><span class="lineno"> 3482</span>  <span class="keyword">typename</span> T16, <span class="keyword">typename</span> T17, <span class="keyword">typename</span> T18, <span class="keyword">typename</span> T19, <span class="keyword">typename</span> T20,</div><div class="line"><a name="l03483"></a><span class="lineno"> 3483</span>  <span class="keyword">typename</span> T21, <span class="keyword">typename</span> T22, <span class="keyword">typename</span> T23, <span class="keyword">typename</span> T24></div><div class="line"><a name="l03484"></a><span class="lineno"> 3484</span> <span class="keyword">struct </span>Types24 {</div><div class="line"><a name="l03485"></a><span class="lineno"> 3485</span>  <span class="keyword">typedef</span> T1 Head;</div><div class="line"><a name="l03486"></a><span class="lineno"> 3486</span>  <span class="keyword">typedef</span> Types23<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,</div><div class="line"><a name="l03487"></a><span class="lineno"> 3487</span>  T16, T17, T18, T19, T20, T21, T22, T23, T24> Tail;</div><div class="line"><a name="l03488"></a><span class="lineno"> 3488</span> };</div><div class="line"><a name="l03489"></a><span class="lineno"> 3489</span> </div><div class="line"><a name="l03490"></a><span class="lineno"> 3490</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l03491"></a><span class="lineno"> 3491</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l03492"></a><span class="lineno"> 3492</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14, <span class="keyword">typename</span> T15,</div><div class="line"><a name="l03493"></a><span class="lineno"> 3493</span>  <span class="keyword">typename</span> T16, <span class="keyword">typename</span> T17, <span class="keyword">typename</span> T18, <span class="keyword">typename</span> T19, <span class="keyword">typename</span> T20,</div><div class="line"><a name="l03494"></a><span class="lineno"> 3494</span>  <span class="keyword">typename</span> T21, <span class="keyword">typename</span> T22, <span class="keyword">typename</span> T23, <span class="keyword">typename</span> T24, <span class="keyword">typename</span> T25></div><div class="line"><a name="l03495"></a><span class="lineno"> 3495</span> <span class="keyword">struct </span>Types25 {</div><div class="line"><a name="l03496"></a><span class="lineno"> 3496</span>  <span class="keyword">typedef</span> T1 Head;</div><div class="line"><a name="l03497"></a><span class="lineno"> 3497</span>  <span class="keyword">typedef</span> Types24<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,</div><div class="line"><a name="l03498"></a><span class="lineno"> 3498</span>  T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Tail;</div><div class="line"><a name="l03499"></a><span class="lineno"> 3499</span> };</div><div class="line"><a name="l03500"></a><span class="lineno"> 3500</span> </div><div class="line"><a name="l03501"></a><span class="lineno"> 3501</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l03502"></a><span class="lineno"> 3502</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l03503"></a><span class="lineno"> 3503</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14, <span class="keyword">typename</span> T15,</div><div class="line"><a name="l03504"></a><span class="lineno"> 3504</span>  <span class="keyword">typename</span> T16, <span class="keyword">typename</span> T17, <span class="keyword">typename</span> T18, <span class="keyword">typename</span> T19, <span class="keyword">typename</span> T20,</div><div class="line"><a name="l03505"></a><span class="lineno"> 3505</span>  <span class="keyword">typename</span> T21, <span class="keyword">typename</span> T22, <span class="keyword">typename</span> T23, <span class="keyword">typename</span> T24, <span class="keyword">typename</span> T25,</div><div class="line"><a name="l03506"></a><span class="lineno"> 3506</span>  <span class="keyword">typename</span> T26></div><div class="line"><a name="l03507"></a><span class="lineno"> 3507</span> <span class="keyword">struct </span>Types26 {</div><div class="line"><a name="l03508"></a><span class="lineno"> 3508</span>  <span class="keyword">typedef</span> T1 Head;</div><div class="line"><a name="l03509"></a><span class="lineno"> 3509</span>  <span class="keyword">typedef</span> Types25<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,</div><div class="line"><a name="l03510"></a><span class="lineno"> 3510</span>  T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> Tail;</div><div class="line"><a name="l03511"></a><span class="lineno"> 3511</span> };</div><div class="line"><a name="l03512"></a><span class="lineno"> 3512</span> </div><div class="line"><a name="l03513"></a><span class="lineno"> 3513</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l03514"></a><span class="lineno"> 3514</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l03515"></a><span class="lineno"> 3515</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14, <span class="keyword">typename</span> T15,</div><div class="line"><a name="l03516"></a><span class="lineno"> 3516</span>  <span class="keyword">typename</span> T16, <span class="keyword">typename</span> T17, <span class="keyword">typename</span> T18, <span class="keyword">typename</span> T19, <span class="keyword">typename</span> T20,</div><div class="line"><a name="l03517"></a><span class="lineno"> 3517</span>  <span class="keyword">typename</span> T21, <span class="keyword">typename</span> T22, <span class="keyword">typename</span> T23, <span class="keyword">typename</span> T24, <span class="keyword">typename</span> T25,</div><div class="line"><a name="l03518"></a><span class="lineno"> 3518</span>  <span class="keyword">typename</span> T26, <span class="keyword">typename</span> T27></div><div class="line"><a name="l03519"></a><span class="lineno"> 3519</span> <span class="keyword">struct </span>Types27 {</div><div class="line"><a name="l03520"></a><span class="lineno"> 3520</span>  <span class="keyword">typedef</span> T1 Head;</div><div class="line"><a name="l03521"></a><span class="lineno"> 3521</span>  <span class="keyword">typedef</span> Types26<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,</div><div class="line"><a name="l03522"></a><span class="lineno"> 3522</span>  T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27> Tail;</div><div class="line"><a name="l03523"></a><span class="lineno"> 3523</span> };</div><div class="line"><a name="l03524"></a><span class="lineno"> 3524</span> </div><div class="line"><a name="l03525"></a><span class="lineno"> 3525</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l03526"></a><span class="lineno"> 3526</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l03527"></a><span class="lineno"> 3527</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14, <span class="keyword">typename</span> T15,</div><div class="line"><a name="l03528"></a><span class="lineno"> 3528</span>  <span class="keyword">typename</span> T16, <span class="keyword">typename</span> T17, <span class="keyword">typename</span> T18, <span class="keyword">typename</span> T19, <span class="keyword">typename</span> T20,</div><div class="line"><a name="l03529"></a><span class="lineno"> 3529</span>  <span class="keyword">typename</span> T21, <span class="keyword">typename</span> T22, <span class="keyword">typename</span> T23, <span class="keyword">typename</span> T24, <span class="keyword">typename</span> T25,</div><div class="line"><a name="l03530"></a><span class="lineno"> 3530</span>  <span class="keyword">typename</span> T26, <span class="keyword">typename</span> T27, <span class="keyword">typename</span> T28></div><div class="line"><a name="l03531"></a><span class="lineno"> 3531</span> <span class="keyword">struct </span>Types28 {</div><div class="line"><a name="l03532"></a><span class="lineno"> 3532</span>  <span class="keyword">typedef</span> T1 Head;</div><div class="line"><a name="l03533"></a><span class="lineno"> 3533</span>  <span class="keyword">typedef</span> Types27<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,</div><div class="line"><a name="l03534"></a><span class="lineno"> 3534</span>  T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28> Tail;</div><div class="line"><a name="l03535"></a><span class="lineno"> 3535</span> };</div><div class="line"><a name="l03536"></a><span class="lineno"> 3536</span> </div><div class="line"><a name="l03537"></a><span class="lineno"> 3537</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l03538"></a><span class="lineno"> 3538</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l03539"></a><span class="lineno"> 3539</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14, <span class="keyword">typename</span> T15,</div><div class="line"><a name="l03540"></a><span class="lineno"> 3540</span>  <span class="keyword">typename</span> T16, <span class="keyword">typename</span> T17, <span class="keyword">typename</span> T18, <span class="keyword">typename</span> T19, <span class="keyword">typename</span> T20,</div><div class="line"><a name="l03541"></a><span class="lineno"> 3541</span>  <span class="keyword">typename</span> T21, <span class="keyword">typename</span> T22, <span class="keyword">typename</span> T23, <span class="keyword">typename</span> T24, <span class="keyword">typename</span> T25,</div><div class="line"><a name="l03542"></a><span class="lineno"> 3542</span>  <span class="keyword">typename</span> T26, <span class="keyword">typename</span> T27, <span class="keyword">typename</span> T28, <span class="keyword">typename</span> T29></div><div class="line"><a name="l03543"></a><span class="lineno"> 3543</span> <span class="keyword">struct </span>Types29 {</div><div class="line"><a name="l03544"></a><span class="lineno"> 3544</span>  <span class="keyword">typedef</span> T1 Head;</div><div class="line"><a name="l03545"></a><span class="lineno"> 3545</span>  <span class="keyword">typedef</span> Types28<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,</div><div class="line"><a name="l03546"></a><span class="lineno"> 3546</span>  T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,</div><div class="line"><a name="l03547"></a><span class="lineno"> 3547</span>  T29> Tail;</div><div class="line"><a name="l03548"></a><span class="lineno"> 3548</span> };</div><div class="line"><a name="l03549"></a><span class="lineno"> 3549</span> </div><div class="line"><a name="l03550"></a><span class="lineno"> 3550</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l03551"></a><span class="lineno"> 3551</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l03552"></a><span class="lineno"> 3552</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14, <span class="keyword">typename</span> T15,</div><div class="line"><a name="l03553"></a><span class="lineno"> 3553</span>  <span class="keyword">typename</span> T16, <span class="keyword">typename</span> T17, <span class="keyword">typename</span> T18, <span class="keyword">typename</span> T19, <span class="keyword">typename</span> T20,</div><div class="line"><a name="l03554"></a><span class="lineno"> 3554</span>  <span class="keyword">typename</span> T21, <span class="keyword">typename</span> T22, <span class="keyword">typename</span> T23, <span class="keyword">typename</span> T24, <span class="keyword">typename</span> T25,</div><div class="line"><a name="l03555"></a><span class="lineno"> 3555</span>  <span class="keyword">typename</span> T26, <span class="keyword">typename</span> T27, <span class="keyword">typename</span> T28, <span class="keyword">typename</span> T29, <span class="keyword">typename</span> T30></div><div class="line"><a name="l03556"></a><span class="lineno"> 3556</span> <span class="keyword">struct </span>Types30 {</div><div class="line"><a name="l03557"></a><span class="lineno"> 3557</span>  <span class="keyword">typedef</span> T1 Head;</div><div class="line"><a name="l03558"></a><span class="lineno"> 3558</span>  <span class="keyword">typedef</span> Types29<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,</div><div class="line"><a name="l03559"></a><span class="lineno"> 3559</span>  T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,</div><div class="line"><a name="l03560"></a><span class="lineno"> 3560</span>  T30> Tail;</div><div class="line"><a name="l03561"></a><span class="lineno"> 3561</span> };</div><div class="line"><a name="l03562"></a><span class="lineno"> 3562</span> </div><div class="line"><a name="l03563"></a><span class="lineno"> 3563</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l03564"></a><span class="lineno"> 3564</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l03565"></a><span class="lineno"> 3565</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14, <span class="keyword">typename</span> T15,</div><div class="line"><a name="l03566"></a><span class="lineno"> 3566</span>  <span class="keyword">typename</span> T16, <span class="keyword">typename</span> T17, <span class="keyword">typename</span> T18, <span class="keyword">typename</span> T19, <span class="keyword">typename</span> T20,</div><div class="line"><a name="l03567"></a><span class="lineno"> 3567</span>  <span class="keyword">typename</span> T21, <span class="keyword">typename</span> T22, <span class="keyword">typename</span> T23, <span class="keyword">typename</span> T24, <span class="keyword">typename</span> T25,</div><div class="line"><a name="l03568"></a><span class="lineno"> 3568</span>  <span class="keyword">typename</span> T26, <span class="keyword">typename</span> T27, <span class="keyword">typename</span> T28, <span class="keyword">typename</span> T29, <span class="keyword">typename</span> T30,</div><div class="line"><a name="l03569"></a><span class="lineno"> 3569</span>  <span class="keyword">typename</span> T31></div><div class="line"><a name="l03570"></a><span class="lineno"> 3570</span> <span class="keyword">struct </span>Types31 {</div><div class="line"><a name="l03571"></a><span class="lineno"> 3571</span>  <span class="keyword">typedef</span> T1 Head;</div><div class="line"><a name="l03572"></a><span class="lineno"> 3572</span>  <span class="keyword">typedef</span> Types30<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,</div><div class="line"><a name="l03573"></a><span class="lineno"> 3573</span>  T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,</div><div class="line"><a name="l03574"></a><span class="lineno"> 3574</span>  T30, T31> Tail;</div><div class="line"><a name="l03575"></a><span class="lineno"> 3575</span> };</div><div class="line"><a name="l03576"></a><span class="lineno"> 3576</span> </div><div class="line"><a name="l03577"></a><span class="lineno"> 3577</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l03578"></a><span class="lineno"> 3578</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l03579"></a><span class="lineno"> 3579</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14, <span class="keyword">typename</span> T15,</div><div class="line"><a name="l03580"></a><span class="lineno"> 3580</span>  <span class="keyword">typename</span> T16, <span class="keyword">typename</span> T17, <span class="keyword">typename</span> T18, <span class="keyword">typename</span> T19, <span class="keyword">typename</span> T20,</div><div class="line"><a name="l03581"></a><span class="lineno"> 3581</span>  <span class="keyword">typename</span> T21, <span class="keyword">typename</span> T22, <span class="keyword">typename</span> T23, <span class="keyword">typename</span> T24, <span class="keyword">typename</span> T25,</div><div class="line"><a name="l03582"></a><span class="lineno"> 3582</span>  <span class="keyword">typename</span> T26, <span class="keyword">typename</span> T27, <span class="keyword">typename</span> T28, <span class="keyword">typename</span> T29, <span class="keyword">typename</span> T30,</div><div class="line"><a name="l03583"></a><span class="lineno"> 3583</span>  <span class="keyword">typename</span> T31, <span class="keyword">typename</span> T32></div><div class="line"><a name="l03584"></a><span class="lineno"> 3584</span> <span class="keyword">struct </span>Types32 {</div><div class="line"><a name="l03585"></a><span class="lineno"> 3585</span>  <span class="keyword">typedef</span> T1 Head;</div><div class="line"><a name="l03586"></a><span class="lineno"> 3586</span>  <span class="keyword">typedef</span> Types31<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,</div><div class="line"><a name="l03587"></a><span class="lineno"> 3587</span>  T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,</div><div class="line"><a name="l03588"></a><span class="lineno"> 3588</span>  T30, T31, T32> Tail;</div><div class="line"><a name="l03589"></a><span class="lineno"> 3589</span> };</div><div class="line"><a name="l03590"></a><span class="lineno"> 3590</span> </div><div class="line"><a name="l03591"></a><span class="lineno"> 3591</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l03592"></a><span class="lineno"> 3592</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l03593"></a><span class="lineno"> 3593</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14, <span class="keyword">typename</span> T15,</div><div class="line"><a name="l03594"></a><span class="lineno"> 3594</span>  <span class="keyword">typename</span> T16, <span class="keyword">typename</span> T17, <span class="keyword">typename</span> T18, <span class="keyword">typename</span> T19, <span class="keyword">typename</span> T20,</div><div class="line"><a name="l03595"></a><span class="lineno"> 3595</span>  <span class="keyword">typename</span> T21, <span class="keyword">typename</span> T22, <span class="keyword">typename</span> T23, <span class="keyword">typename</span> T24, <span class="keyword">typename</span> T25,</div><div class="line"><a name="l03596"></a><span class="lineno"> 3596</span>  <span class="keyword">typename</span> T26, <span class="keyword">typename</span> T27, <span class="keyword">typename</span> T28, <span class="keyword">typename</span> T29, <span class="keyword">typename</span> T30,</div><div class="line"><a name="l03597"></a><span class="lineno"> 3597</span>  <span class="keyword">typename</span> T31, <span class="keyword">typename</span> T32, <span class="keyword">typename</span> T33></div><div class="line"><a name="l03598"></a><span class="lineno"> 3598</span> <span class="keyword">struct </span>Types33 {</div><div class="line"><a name="l03599"></a><span class="lineno"> 3599</span>  <span class="keyword">typedef</span> T1 Head;</div><div class="line"><a name="l03600"></a><span class="lineno"> 3600</span>  <span class="keyword">typedef</span> Types32<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,</div><div class="line"><a name="l03601"></a><span class="lineno"> 3601</span>  T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,</div><div class="line"><a name="l03602"></a><span class="lineno"> 3602</span>  T30, T31, T32, T33> Tail;</div><div class="line"><a name="l03603"></a><span class="lineno"> 3603</span> };</div><div class="line"><a name="l03604"></a><span class="lineno"> 3604</span> </div><div class="line"><a name="l03605"></a><span class="lineno"> 3605</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l03606"></a><span class="lineno"> 3606</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l03607"></a><span class="lineno"> 3607</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14, <span class="keyword">typename</span> T15,</div><div class="line"><a name="l03608"></a><span class="lineno"> 3608</span>  <span class="keyword">typename</span> T16, <span class="keyword">typename</span> T17, <span class="keyword">typename</span> T18, <span class="keyword">typename</span> T19, <span class="keyword">typename</span> T20,</div><div class="line"><a name="l03609"></a><span class="lineno"> 3609</span>  <span class="keyword">typename</span> T21, <span class="keyword">typename</span> T22, <span class="keyword">typename</span> T23, <span class="keyword">typename</span> T24, <span class="keyword">typename</span> T25,</div><div class="line"><a name="l03610"></a><span class="lineno"> 3610</span>  <span class="keyword">typename</span> T26, <span class="keyword">typename</span> T27, <span class="keyword">typename</span> T28, <span class="keyword">typename</span> T29, <span class="keyword">typename</span> T30,</div><div class="line"><a name="l03611"></a><span class="lineno"> 3611</span>  <span class="keyword">typename</span> T31, <span class="keyword">typename</span> T32, <span class="keyword">typename</span> T33, <span class="keyword">typename</span> T34></div><div class="line"><a name="l03612"></a><span class="lineno"> 3612</span> <span class="keyword">struct </span>Types34 {</div><div class="line"><a name="l03613"></a><span class="lineno"> 3613</span>  <span class="keyword">typedef</span> T1 Head;</div><div class="line"><a name="l03614"></a><span class="lineno"> 3614</span>  <span class="keyword">typedef</span> Types33<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,</div><div class="line"><a name="l03615"></a><span class="lineno"> 3615</span>  T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,</div><div class="line"><a name="l03616"></a><span class="lineno"> 3616</span>  T30, T31, T32, T33, T34> Tail;</div><div class="line"><a name="l03617"></a><span class="lineno"> 3617</span> };</div><div class="line"><a name="l03618"></a><span class="lineno"> 3618</span> </div><div class="line"><a name="l03619"></a><span class="lineno"> 3619</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l03620"></a><span class="lineno"> 3620</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l03621"></a><span class="lineno"> 3621</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14, <span class="keyword">typename</span> T15,</div><div class="line"><a name="l03622"></a><span class="lineno"> 3622</span>  <span class="keyword">typename</span> T16, <span class="keyword">typename</span> T17, <span class="keyword">typename</span> T18, <span class="keyword">typename</span> T19, <span class="keyword">typename</span> T20,</div><div class="line"><a name="l03623"></a><span class="lineno"> 3623</span>  <span class="keyword">typename</span> T21, <span class="keyword">typename</span> T22, <span class="keyword">typename</span> T23, <span class="keyword">typename</span> T24, <span class="keyword">typename</span> T25,</div><div class="line"><a name="l03624"></a><span class="lineno"> 3624</span>  <span class="keyword">typename</span> T26, <span class="keyword">typename</span> T27, <span class="keyword">typename</span> T28, <span class="keyword">typename</span> T29, <span class="keyword">typename</span> T30,</div><div class="line"><a name="l03625"></a><span class="lineno"> 3625</span>  <span class="keyword">typename</span> T31, <span class="keyword">typename</span> T32, <span class="keyword">typename</span> T33, <span class="keyword">typename</span> T34, <span class="keyword">typename</span> T35></div><div class="line"><a name="l03626"></a><span class="lineno"> 3626</span> <span class="keyword">struct </span>Types35 {</div><div class="line"><a name="l03627"></a><span class="lineno"> 3627</span>  <span class="keyword">typedef</span> T1 Head;</div><div class="line"><a name="l03628"></a><span class="lineno"> 3628</span>  <span class="keyword">typedef</span> Types34<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,</div><div class="line"><a name="l03629"></a><span class="lineno"> 3629</span>  T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,</div><div class="line"><a name="l03630"></a><span class="lineno"> 3630</span>  T30, T31, T32, T33, T34, T35> Tail;</div><div class="line"><a name="l03631"></a><span class="lineno"> 3631</span> };</div><div class="line"><a name="l03632"></a><span class="lineno"> 3632</span> </div><div class="line"><a name="l03633"></a><span class="lineno"> 3633</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l03634"></a><span class="lineno"> 3634</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l03635"></a><span class="lineno"> 3635</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14, <span class="keyword">typename</span> T15,</div><div class="line"><a name="l03636"></a><span class="lineno"> 3636</span>  <span class="keyword">typename</span> T16, <span class="keyword">typename</span> T17, <span class="keyword">typename</span> T18, <span class="keyword">typename</span> T19, <span class="keyword">typename</span> T20,</div><div class="line"><a name="l03637"></a><span class="lineno"> 3637</span>  <span class="keyword">typename</span> T21, <span class="keyword">typename</span> T22, <span class="keyword">typename</span> T23, <span class="keyword">typename</span> T24, <span class="keyword">typename</span> T25,</div><div class="line"><a name="l03638"></a><span class="lineno"> 3638</span>  <span class="keyword">typename</span> T26, <span class="keyword">typename</span> T27, <span class="keyword">typename</span> T28, <span class="keyword">typename</span> T29, <span class="keyword">typename</span> T30,</div><div class="line"><a name="l03639"></a><span class="lineno"> 3639</span>  <span class="keyword">typename</span> T31, <span class="keyword">typename</span> T32, <span class="keyword">typename</span> T33, <span class="keyword">typename</span> T34, <span class="keyword">typename</span> T35,</div><div class="line"><a name="l03640"></a><span class="lineno"> 3640</span>  <span class="keyword">typename</span> T36></div><div class="line"><a name="l03641"></a><span class="lineno"> 3641</span> <span class="keyword">struct </span>Types36 {</div><div class="line"><a name="l03642"></a><span class="lineno"> 3642</span>  <span class="keyword">typedef</span> T1 Head;</div><div class="line"><a name="l03643"></a><span class="lineno"> 3643</span>  <span class="keyword">typedef</span> Types35<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,</div><div class="line"><a name="l03644"></a><span class="lineno"> 3644</span>  T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,</div><div class="line"><a name="l03645"></a><span class="lineno"> 3645</span>  T30, T31, T32, T33, T34, T35, T36> Tail;</div><div class="line"><a name="l03646"></a><span class="lineno"> 3646</span> };</div><div class="line"><a name="l03647"></a><span class="lineno"> 3647</span> </div><div class="line"><a name="l03648"></a><span class="lineno"> 3648</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l03649"></a><span class="lineno"> 3649</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l03650"></a><span class="lineno"> 3650</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14, <span class="keyword">typename</span> T15,</div><div class="line"><a name="l03651"></a><span class="lineno"> 3651</span>  <span class="keyword">typename</span> T16, <span class="keyword">typename</span> T17, <span class="keyword">typename</span> T18, <span class="keyword">typename</span> T19, <span class="keyword">typename</span> T20,</div><div class="line"><a name="l03652"></a><span class="lineno"> 3652</span>  <span class="keyword">typename</span> T21, <span class="keyword">typename</span> T22, <span class="keyword">typename</span> T23, <span class="keyword">typename</span> T24, <span class="keyword">typename</span> T25,</div><div class="line"><a name="l03653"></a><span class="lineno"> 3653</span>  <span class="keyword">typename</span> T26, <span class="keyword">typename</span> T27, <span class="keyword">typename</span> T28, <span class="keyword">typename</span> T29, <span class="keyword">typename</span> T30,</div><div class="line"><a name="l03654"></a><span class="lineno"> 3654</span>  <span class="keyword">typename</span> T31, <span class="keyword">typename</span> T32, <span class="keyword">typename</span> T33, <span class="keyword">typename</span> T34, <span class="keyword">typename</span> T35,</div><div class="line"><a name="l03655"></a><span class="lineno"> 3655</span>  <span class="keyword">typename</span> T36, <span class="keyword">typename</span> T37></div><div class="line"><a name="l03656"></a><span class="lineno"> 3656</span> <span class="keyword">struct </span>Types37 {</div><div class="line"><a name="l03657"></a><span class="lineno"> 3657</span>  <span class="keyword">typedef</span> T1 Head;</div><div class="line"><a name="l03658"></a><span class="lineno"> 3658</span>  <span class="keyword">typedef</span> Types36<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,</div><div class="line"><a name="l03659"></a><span class="lineno"> 3659</span>  T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,</div><div class="line"><a name="l03660"></a><span class="lineno"> 3660</span>  T30, T31, T32, T33, T34, T35, T36, T37> Tail;</div><div class="line"><a name="l03661"></a><span class="lineno"> 3661</span> };</div><div class="line"><a name="l03662"></a><span class="lineno"> 3662</span> </div><div class="line"><a name="l03663"></a><span class="lineno"> 3663</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l03664"></a><span class="lineno"> 3664</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l03665"></a><span class="lineno"> 3665</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14, <span class="keyword">typename</span> T15,</div><div class="line"><a name="l03666"></a><span class="lineno"> 3666</span>  <span class="keyword">typename</span> T16, <span class="keyword">typename</span> T17, <span class="keyword">typename</span> T18, <span class="keyword">typename</span> T19, <span class="keyword">typename</span> T20,</div><div class="line"><a name="l03667"></a><span class="lineno"> 3667</span>  <span class="keyword">typename</span> T21, <span class="keyword">typename</span> T22, <span class="keyword">typename</span> T23, <span class="keyword">typename</span> T24, <span class="keyword">typename</span> T25,</div><div class="line"><a name="l03668"></a><span class="lineno"> 3668</span>  <span class="keyword">typename</span> T26, <span class="keyword">typename</span> T27, <span class="keyword">typename</span> T28, <span class="keyword">typename</span> T29, <span class="keyword">typename</span> T30,</div><div class="line"><a name="l03669"></a><span class="lineno"> 3669</span>  <span class="keyword">typename</span> T31, <span class="keyword">typename</span> T32, <span class="keyword">typename</span> T33, <span class="keyword">typename</span> T34, <span class="keyword">typename</span> T35,</div><div class="line"><a name="l03670"></a><span class="lineno"> 3670</span>  <span class="keyword">typename</span> T36, <span class="keyword">typename</span> T37, <span class="keyword">typename</span> T38></div><div class="line"><a name="l03671"></a><span class="lineno"> 3671</span> <span class="keyword">struct </span>Types38 {</div><div class="line"><a name="l03672"></a><span class="lineno"> 3672</span>  <span class="keyword">typedef</span> T1 Head;</div><div class="line"><a name="l03673"></a><span class="lineno"> 3673</span>  <span class="keyword">typedef</span> Types37<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,</div><div class="line"><a name="l03674"></a><span class="lineno"> 3674</span>  T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,</div><div class="line"><a name="l03675"></a><span class="lineno"> 3675</span>  T30, T31, T32, T33, T34, T35, T36, T37, T38> Tail;</div><div class="line"><a name="l03676"></a><span class="lineno"> 3676</span> };</div><div class="line"><a name="l03677"></a><span class="lineno"> 3677</span> </div><div class="line"><a name="l03678"></a><span class="lineno"> 3678</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l03679"></a><span class="lineno"> 3679</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l03680"></a><span class="lineno"> 3680</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14, <span class="keyword">typename</span> T15,</div><div class="line"><a name="l03681"></a><span class="lineno"> 3681</span>  <span class="keyword">typename</span> T16, <span class="keyword">typename</span> T17, <span class="keyword">typename</span> T18, <span class="keyword">typename</span> T19, <span class="keyword">typename</span> T20,</div><div class="line"><a name="l03682"></a><span class="lineno"> 3682</span>  <span class="keyword">typename</span> T21, <span class="keyword">typename</span> T22, <span class="keyword">typename</span> T23, <span class="keyword">typename</span> T24, <span class="keyword">typename</span> T25,</div><div class="line"><a name="l03683"></a><span class="lineno"> 3683</span>  <span class="keyword">typename</span> T26, <span class="keyword">typename</span> T27, <span class="keyword">typename</span> T28, <span class="keyword">typename</span> T29, <span class="keyword">typename</span> T30,</div><div class="line"><a name="l03684"></a><span class="lineno"> 3684</span>  <span class="keyword">typename</span> T31, <span class="keyword">typename</span> T32, <span class="keyword">typename</span> T33, <span class="keyword">typename</span> T34, <span class="keyword">typename</span> T35,</div><div class="line"><a name="l03685"></a><span class="lineno"> 3685</span>  <span class="keyword">typename</span> T36, <span class="keyword">typename</span> T37, <span class="keyword">typename</span> T38, <span class="keyword">typename</span> T39></div><div class="line"><a name="l03686"></a><span class="lineno"> 3686</span> <span class="keyword">struct </span>Types39 {</div><div class="line"><a name="l03687"></a><span class="lineno"> 3687</span>  <span class="keyword">typedef</span> T1 Head;</div><div class="line"><a name="l03688"></a><span class="lineno"> 3688</span>  <span class="keyword">typedef</span> Types38<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,</div><div class="line"><a name="l03689"></a><span class="lineno"> 3689</span>  T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,</div><div class="line"><a name="l03690"></a><span class="lineno"> 3690</span>  T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Tail;</div><div class="line"><a name="l03691"></a><span class="lineno"> 3691</span> };</div><div class="line"><a name="l03692"></a><span class="lineno"> 3692</span> </div><div class="line"><a name="l03693"></a><span class="lineno"> 3693</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l03694"></a><span class="lineno"> 3694</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l03695"></a><span class="lineno"> 3695</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14, <span class="keyword">typename</span> T15,</div><div class="line"><a name="l03696"></a><span class="lineno"> 3696</span>  <span class="keyword">typename</span> T16, <span class="keyword">typename</span> T17, <span class="keyword">typename</span> T18, <span class="keyword">typename</span> T19, <span class="keyword">typename</span> T20,</div><div class="line"><a name="l03697"></a><span class="lineno"> 3697</span>  <span class="keyword">typename</span> T21, <span class="keyword">typename</span> T22, <span class="keyword">typename</span> T23, <span class="keyword">typename</span> T24, <span class="keyword">typename</span> T25,</div><div class="line"><a name="l03698"></a><span class="lineno"> 3698</span>  <span class="keyword">typename</span> T26, <span class="keyword">typename</span> T27, <span class="keyword">typename</span> T28, <span class="keyword">typename</span> T29, <span class="keyword">typename</span> T30,</div><div class="line"><a name="l03699"></a><span class="lineno"> 3699</span>  <span class="keyword">typename</span> T31, <span class="keyword">typename</span> T32, <span class="keyword">typename</span> T33, <span class="keyword">typename</span> T34, <span class="keyword">typename</span> T35,</div><div class="line"><a name="l03700"></a><span class="lineno"> 3700</span>  <span class="keyword">typename</span> T36, <span class="keyword">typename</span> T37, <span class="keyword">typename</span> T38, <span class="keyword">typename</span> T39, <span class="keyword">typename</span> T40></div><div class="line"><a name="l03701"></a><span class="lineno"> 3701</span> <span class="keyword">struct </span>Types40 {</div><div class="line"><a name="l03702"></a><span class="lineno"> 3702</span>  <span class="keyword">typedef</span> T1 Head;</div><div class="line"><a name="l03703"></a><span class="lineno"> 3703</span>  <span class="keyword">typedef</span> Types39<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,</div><div class="line"><a name="l03704"></a><span class="lineno"> 3704</span>  T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,</div><div class="line"><a name="l03705"></a><span class="lineno"> 3705</span>  T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Tail;</div><div class="line"><a name="l03706"></a><span class="lineno"> 3706</span> };</div><div class="line"><a name="l03707"></a><span class="lineno"> 3707</span> </div><div class="line"><a name="l03708"></a><span class="lineno"> 3708</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l03709"></a><span class="lineno"> 3709</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l03710"></a><span class="lineno"> 3710</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14, <span class="keyword">typename</span> T15,</div><div class="line"><a name="l03711"></a><span class="lineno"> 3711</span>  <span class="keyword">typename</span> T16, <span class="keyword">typename</span> T17, <span class="keyword">typename</span> T18, <span class="keyword">typename</span> T19, <span class="keyword">typename</span> T20,</div><div class="line"><a name="l03712"></a><span class="lineno"> 3712</span>  <span class="keyword">typename</span> T21, <span class="keyword">typename</span> T22, <span class="keyword">typename</span> T23, <span class="keyword">typename</span> T24, <span class="keyword">typename</span> T25,</div><div class="line"><a name="l03713"></a><span class="lineno"> 3713</span>  <span class="keyword">typename</span> T26, <span class="keyword">typename</span> T27, <span class="keyword">typename</span> T28, <span class="keyword">typename</span> T29, <span class="keyword">typename</span> T30,</div><div class="line"><a name="l03714"></a><span class="lineno"> 3714</span>  <span class="keyword">typename</span> T31, <span class="keyword">typename</span> T32, <span class="keyword">typename</span> T33, <span class="keyword">typename</span> T34, <span class="keyword">typename</span> T35,</div><div class="line"><a name="l03715"></a><span class="lineno"> 3715</span>  <span class="keyword">typename</span> T36, <span class="keyword">typename</span> T37, <span class="keyword">typename</span> T38, <span class="keyword">typename</span> T39, <span class="keyword">typename</span> T40,</div><div class="line"><a name="l03716"></a><span class="lineno"> 3716</span>  <span class="keyword">typename</span> T41></div><div class="line"><a name="l03717"></a><span class="lineno"> 3717</span> <span class="keyword">struct </span>Types41 {</div><div class="line"><a name="l03718"></a><span class="lineno"> 3718</span>  <span class="keyword">typedef</span> T1 Head;</div><div class="line"><a name="l03719"></a><span class="lineno"> 3719</span>  <span class="keyword">typedef</span> Types40<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,</div><div class="line"><a name="l03720"></a><span class="lineno"> 3720</span>  T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,</div><div class="line"><a name="l03721"></a><span class="lineno"> 3721</span>  T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41> Tail;</div><div class="line"><a name="l03722"></a><span class="lineno"> 3722</span> };</div><div class="line"><a name="l03723"></a><span class="lineno"> 3723</span> </div><div class="line"><a name="l03724"></a><span class="lineno"> 3724</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l03725"></a><span class="lineno"> 3725</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l03726"></a><span class="lineno"> 3726</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14, <span class="keyword">typename</span> T15,</div><div class="line"><a name="l03727"></a><span class="lineno"> 3727</span>  <span class="keyword">typename</span> T16, <span class="keyword">typename</span> T17, <span class="keyword">typename</span> T18, <span class="keyword">typename</span> T19, <span class="keyword">typename</span> T20,</div><div class="line"><a name="l03728"></a><span class="lineno"> 3728</span>  <span class="keyword">typename</span> T21, <span class="keyword">typename</span> T22, <span class="keyword">typename</span> T23, <span class="keyword">typename</span> T24, <span class="keyword">typename</span> T25,</div><div class="line"><a name="l03729"></a><span class="lineno"> 3729</span>  <span class="keyword">typename</span> T26, <span class="keyword">typename</span> T27, <span class="keyword">typename</span> T28, <span class="keyword">typename</span> T29, <span class="keyword">typename</span> T30,</div><div class="line"><a name="l03730"></a><span class="lineno"> 3730</span>  <span class="keyword">typename</span> T31, <span class="keyword">typename</span> T32, <span class="keyword">typename</span> T33, <span class="keyword">typename</span> T34, <span class="keyword">typename</span> T35,</div><div class="line"><a name="l03731"></a><span class="lineno"> 3731</span>  <span class="keyword">typename</span> T36, <span class="keyword">typename</span> T37, <span class="keyword">typename</span> T38, <span class="keyword">typename</span> T39, <span class="keyword">typename</span> T40,</div><div class="line"><a name="l03732"></a><span class="lineno"> 3732</span>  <span class="keyword">typename</span> T41, <span class="keyword">typename</span> T42></div><div class="line"><a name="l03733"></a><span class="lineno"> 3733</span> <span class="keyword">struct </span>Types42 {</div><div class="line"><a name="l03734"></a><span class="lineno"> 3734</span>  <span class="keyword">typedef</span> T1 Head;</div><div class="line"><a name="l03735"></a><span class="lineno"> 3735</span>  <span class="keyword">typedef</span> Types41<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,</div><div class="line"><a name="l03736"></a><span class="lineno"> 3736</span>  T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,</div><div class="line"><a name="l03737"></a><span class="lineno"> 3737</span>  T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42> Tail;</div><div class="line"><a name="l03738"></a><span class="lineno"> 3738</span> };</div><div class="line"><a name="l03739"></a><span class="lineno"> 3739</span> </div><div class="line"><a name="l03740"></a><span class="lineno"> 3740</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l03741"></a><span class="lineno"> 3741</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l03742"></a><span class="lineno"> 3742</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14, <span class="keyword">typename</span> T15,</div><div class="line"><a name="l03743"></a><span class="lineno"> 3743</span>  <span class="keyword">typename</span> T16, <span class="keyword">typename</span> T17, <span class="keyword">typename</span> T18, <span class="keyword">typename</span> T19, <span class="keyword">typename</span> T20,</div><div class="line"><a name="l03744"></a><span class="lineno"> 3744</span>  <span class="keyword">typename</span> T21, <span class="keyword">typename</span> T22, <span class="keyword">typename</span> T23, <span class="keyword">typename</span> T24, <span class="keyword">typename</span> T25,</div><div class="line"><a name="l03745"></a><span class="lineno"> 3745</span>  <span class="keyword">typename</span> T26, <span class="keyword">typename</span> T27, <span class="keyword">typename</span> T28, <span class="keyword">typename</span> T29, <span class="keyword">typename</span> T30,</div><div class="line"><a name="l03746"></a><span class="lineno"> 3746</span>  <span class="keyword">typename</span> T31, <span class="keyword">typename</span> T32, <span class="keyword">typename</span> T33, <span class="keyword">typename</span> T34, <span class="keyword">typename</span> T35,</div><div class="line"><a name="l03747"></a><span class="lineno"> 3747</span>  <span class="keyword">typename</span> T36, <span class="keyword">typename</span> T37, <span class="keyword">typename</span> T38, <span class="keyword">typename</span> T39, <span class="keyword">typename</span> T40,</div><div class="line"><a name="l03748"></a><span class="lineno"> 3748</span>  <span class="keyword">typename</span> T41, <span class="keyword">typename</span> T42, <span class="keyword">typename</span> T43></div><div class="line"><a name="l03749"></a><span class="lineno"> 3749</span> <span class="keyword">struct </span>Types43 {</div><div class="line"><a name="l03750"></a><span class="lineno"> 3750</span>  <span class="keyword">typedef</span> T1 Head;</div><div class="line"><a name="l03751"></a><span class="lineno"> 3751</span>  <span class="keyword">typedef</span> Types42<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,</div><div class="line"><a name="l03752"></a><span class="lineno"> 3752</span>  T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,</div><div class="line"><a name="l03753"></a><span class="lineno"> 3753</span>  T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,</div><div class="line"><a name="l03754"></a><span class="lineno"> 3754</span>  T43> Tail;</div><div class="line"><a name="l03755"></a><span class="lineno"> 3755</span> };</div><div class="line"><a name="l03756"></a><span class="lineno"> 3756</span> </div><div class="line"><a name="l03757"></a><span class="lineno"> 3757</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l03758"></a><span class="lineno"> 3758</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l03759"></a><span class="lineno"> 3759</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14, <span class="keyword">typename</span> T15,</div><div class="line"><a name="l03760"></a><span class="lineno"> 3760</span>  <span class="keyword">typename</span> T16, <span class="keyword">typename</span> T17, <span class="keyword">typename</span> T18, <span class="keyword">typename</span> T19, <span class="keyword">typename</span> T20,</div><div class="line"><a name="l03761"></a><span class="lineno"> 3761</span>  <span class="keyword">typename</span> T21, <span class="keyword">typename</span> T22, <span class="keyword">typename</span> T23, <span class="keyword">typename</span> T24, <span class="keyword">typename</span> T25,</div><div class="line"><a name="l03762"></a><span class="lineno"> 3762</span>  <span class="keyword">typename</span> T26, <span class="keyword">typename</span> T27, <span class="keyword">typename</span> T28, <span class="keyword">typename</span> T29, <span class="keyword">typename</span> T30,</div><div class="line"><a name="l03763"></a><span class="lineno"> 3763</span>  <span class="keyword">typename</span> T31, <span class="keyword">typename</span> T32, <span class="keyword">typename</span> T33, <span class="keyword">typename</span> T34, <span class="keyword">typename</span> T35,</div><div class="line"><a name="l03764"></a><span class="lineno"> 3764</span>  <span class="keyword">typename</span> T36, <span class="keyword">typename</span> T37, <span class="keyword">typename</span> T38, <span class="keyword">typename</span> T39, <span class="keyword">typename</span> T40,</div><div class="line"><a name="l03765"></a><span class="lineno"> 3765</span>  <span class="keyword">typename</span> T41, <span class="keyword">typename</span> T42, <span class="keyword">typename</span> T43, <span class="keyword">typename</span> T44></div><div class="line"><a name="l03766"></a><span class="lineno"> 3766</span> <span class="keyword">struct </span>Types44 {</div><div class="line"><a name="l03767"></a><span class="lineno"> 3767</span>  <span class="keyword">typedef</span> T1 Head;</div><div class="line"><a name="l03768"></a><span class="lineno"> 3768</span>  <span class="keyword">typedef</span> Types43<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,</div><div class="line"><a name="l03769"></a><span class="lineno"> 3769</span>  T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,</div><div class="line"><a name="l03770"></a><span class="lineno"> 3770</span>  T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,</div><div class="line"><a name="l03771"></a><span class="lineno"> 3771</span>  T44> Tail;</div><div class="line"><a name="l03772"></a><span class="lineno"> 3772</span> };</div><div class="line"><a name="l03773"></a><span class="lineno"> 3773</span> </div><div class="line"><a name="l03774"></a><span class="lineno"> 3774</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l03775"></a><span class="lineno"> 3775</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l03776"></a><span class="lineno"> 3776</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14, <span class="keyword">typename</span> T15,</div><div class="line"><a name="l03777"></a><span class="lineno"> 3777</span>  <span class="keyword">typename</span> T16, <span class="keyword">typename</span> T17, <span class="keyword">typename</span> T18, <span class="keyword">typename</span> T19, <span class="keyword">typename</span> T20,</div><div class="line"><a name="l03778"></a><span class="lineno"> 3778</span>  <span class="keyword">typename</span> T21, <span class="keyword">typename</span> T22, <span class="keyword">typename</span> T23, <span class="keyword">typename</span> T24, <span class="keyword">typename</span> T25,</div><div class="line"><a name="l03779"></a><span class="lineno"> 3779</span>  <span class="keyword">typename</span> T26, <span class="keyword">typename</span> T27, <span class="keyword">typename</span> T28, <span class="keyword">typename</span> T29, <span class="keyword">typename</span> T30,</div><div class="line"><a name="l03780"></a><span class="lineno"> 3780</span>  <span class="keyword">typename</span> T31, <span class="keyword">typename</span> T32, <span class="keyword">typename</span> T33, <span class="keyword">typename</span> T34, <span class="keyword">typename</span> T35,</div><div class="line"><a name="l03781"></a><span class="lineno"> 3781</span>  <span class="keyword">typename</span> T36, <span class="keyword">typename</span> T37, <span class="keyword">typename</span> T38, <span class="keyword">typename</span> T39, <span class="keyword">typename</span> T40,</div><div class="line"><a name="l03782"></a><span class="lineno"> 3782</span>  <span class="keyword">typename</span> T41, <span class="keyword">typename</span> T42, <span class="keyword">typename</span> T43, <span class="keyword">typename</span> T44, <span class="keyword">typename</span> T45></div><div class="line"><a name="l03783"></a><span class="lineno"> 3783</span> <span class="keyword">struct </span>Types45 {</div><div class="line"><a name="l03784"></a><span class="lineno"> 3784</span>  <span class="keyword">typedef</span> T1 Head;</div><div class="line"><a name="l03785"></a><span class="lineno"> 3785</span>  <span class="keyword">typedef</span> Types44<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,</div><div class="line"><a name="l03786"></a><span class="lineno"> 3786</span>  T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,</div><div class="line"><a name="l03787"></a><span class="lineno"> 3787</span>  T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,</div><div class="line"><a name="l03788"></a><span class="lineno"> 3788</span>  T44, T45> Tail;</div><div class="line"><a name="l03789"></a><span class="lineno"> 3789</span> };</div><div class="line"><a name="l03790"></a><span class="lineno"> 3790</span> </div><div class="line"><a name="l03791"></a><span class="lineno"> 3791</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l03792"></a><span class="lineno"> 3792</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l03793"></a><span class="lineno"> 3793</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14, <span class="keyword">typename</span> T15,</div><div class="line"><a name="l03794"></a><span class="lineno"> 3794</span>  <span class="keyword">typename</span> T16, <span class="keyword">typename</span> T17, <span class="keyword">typename</span> T18, <span class="keyword">typename</span> T19, <span class="keyword">typename</span> T20,</div><div class="line"><a name="l03795"></a><span class="lineno"> 3795</span>  <span class="keyword">typename</span> T21, <span class="keyword">typename</span> T22, <span class="keyword">typename</span> T23, <span class="keyword">typename</span> T24, <span class="keyword">typename</span> T25,</div><div class="line"><a name="l03796"></a><span class="lineno"> 3796</span>  <span class="keyword">typename</span> T26, <span class="keyword">typename</span> T27, <span class="keyword">typename</span> T28, <span class="keyword">typename</span> T29, <span class="keyword">typename</span> T30,</div><div class="line"><a name="l03797"></a><span class="lineno"> 3797</span>  <span class="keyword">typename</span> T31, <span class="keyword">typename</span> T32, <span class="keyword">typename</span> T33, <span class="keyword">typename</span> T34, <span class="keyword">typename</span> T35,</div><div class="line"><a name="l03798"></a><span class="lineno"> 3798</span>  <span class="keyword">typename</span> T36, <span class="keyword">typename</span> T37, <span class="keyword">typename</span> T38, <span class="keyword">typename</span> T39, <span class="keyword">typename</span> T40,</div><div class="line"><a name="l03799"></a><span class="lineno"> 3799</span>  <span class="keyword">typename</span> T41, <span class="keyword">typename</span> T42, <span class="keyword">typename</span> T43, <span class="keyword">typename</span> T44, <span class="keyword">typename</span> T45,</div><div class="line"><a name="l03800"></a><span class="lineno"> 3800</span>  <span class="keyword">typename</span> T46></div><div class="line"><a name="l03801"></a><span class="lineno"> 3801</span> <span class="keyword">struct </span>Types46 {</div><div class="line"><a name="l03802"></a><span class="lineno"> 3802</span>  <span class="keyword">typedef</span> T1 Head;</div><div class="line"><a name="l03803"></a><span class="lineno"> 3803</span>  <span class="keyword">typedef</span> Types45<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,</div><div class="line"><a name="l03804"></a><span class="lineno"> 3804</span>  T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,</div><div class="line"><a name="l03805"></a><span class="lineno"> 3805</span>  T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,</div><div class="line"><a name="l03806"></a><span class="lineno"> 3806</span>  T44, T45, T46> Tail;</div><div class="line"><a name="l03807"></a><span class="lineno"> 3807</span> };</div><div class="line"><a name="l03808"></a><span class="lineno"> 3808</span> </div><div class="line"><a name="l03809"></a><span class="lineno"> 3809</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l03810"></a><span class="lineno"> 3810</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l03811"></a><span class="lineno"> 3811</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14, <span class="keyword">typename</span> T15,</div><div class="line"><a name="l03812"></a><span class="lineno"> 3812</span>  <span class="keyword">typename</span> T16, <span class="keyword">typename</span> T17, <span class="keyword">typename</span> T18, <span class="keyword">typename</span> T19, <span class="keyword">typename</span> T20,</div><div class="line"><a name="l03813"></a><span class="lineno"> 3813</span>  <span class="keyword">typename</span> T21, <span class="keyword">typename</span> T22, <span class="keyword">typename</span> T23, <span class="keyword">typename</span> T24, <span class="keyword">typename</span> T25,</div><div class="line"><a name="l03814"></a><span class="lineno"> 3814</span>  <span class="keyword">typename</span> T26, <span class="keyword">typename</span> T27, <span class="keyword">typename</span> T28, <span class="keyword">typename</span> T29, <span class="keyword">typename</span> T30,</div><div class="line"><a name="l03815"></a><span class="lineno"> 3815</span>  <span class="keyword">typename</span> T31, <span class="keyword">typename</span> T32, <span class="keyword">typename</span> T33, <span class="keyword">typename</span> T34, <span class="keyword">typename</span> T35,</div><div class="line"><a name="l03816"></a><span class="lineno"> 3816</span>  <span class="keyword">typename</span> T36, <span class="keyword">typename</span> T37, <span class="keyword">typename</span> T38, <span class="keyword">typename</span> T39, <span class="keyword">typename</span> T40,</div><div class="line"><a name="l03817"></a><span class="lineno"> 3817</span>  <span class="keyword">typename</span> T41, <span class="keyword">typename</span> T42, <span class="keyword">typename</span> T43, <span class="keyword">typename</span> T44, <span class="keyword">typename</span> T45,</div><div class="line"><a name="l03818"></a><span class="lineno"> 3818</span>  <span class="keyword">typename</span> T46, <span class="keyword">typename</span> T47></div><div class="line"><a name="l03819"></a><span class="lineno"> 3819</span> <span class="keyword">struct </span>Types47 {</div><div class="line"><a name="l03820"></a><span class="lineno"> 3820</span>  <span class="keyword">typedef</span> T1 Head;</div><div class="line"><a name="l03821"></a><span class="lineno"> 3821</span>  <span class="keyword">typedef</span> Types46<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,</div><div class="line"><a name="l03822"></a><span class="lineno"> 3822</span>  T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,</div><div class="line"><a name="l03823"></a><span class="lineno"> 3823</span>  T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,</div><div class="line"><a name="l03824"></a><span class="lineno"> 3824</span>  T44, T45, T46, T47> Tail;</div><div class="line"><a name="l03825"></a><span class="lineno"> 3825</span> };</div><div class="line"><a name="l03826"></a><span class="lineno"> 3826</span> </div><div class="line"><a name="l03827"></a><span class="lineno"> 3827</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l03828"></a><span class="lineno"> 3828</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l03829"></a><span class="lineno"> 3829</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14, <span class="keyword">typename</span> T15,</div><div class="line"><a name="l03830"></a><span class="lineno"> 3830</span>  <span class="keyword">typename</span> T16, <span class="keyword">typename</span> T17, <span class="keyword">typename</span> T18, <span class="keyword">typename</span> T19, <span class="keyword">typename</span> T20,</div><div class="line"><a name="l03831"></a><span class="lineno"> 3831</span>  <span class="keyword">typename</span> T21, <span class="keyword">typename</span> T22, <span class="keyword">typename</span> T23, <span class="keyword">typename</span> T24, <span class="keyword">typename</span> T25,</div><div class="line"><a name="l03832"></a><span class="lineno"> 3832</span>  <span class="keyword">typename</span> T26, <span class="keyword">typename</span> T27, <span class="keyword">typename</span> T28, <span class="keyword">typename</span> T29, <span class="keyword">typename</span> T30,</div><div class="line"><a name="l03833"></a><span class="lineno"> 3833</span>  <span class="keyword">typename</span> T31, <span class="keyword">typename</span> T32, <span class="keyword">typename</span> T33, <span class="keyword">typename</span> T34, <span class="keyword">typename</span> T35,</div><div class="line"><a name="l03834"></a><span class="lineno"> 3834</span>  <span class="keyword">typename</span> T36, <span class="keyword">typename</span> T37, <span class="keyword">typename</span> T38, <span class="keyword">typename</span> T39, <span class="keyword">typename</span> T40,</div><div class="line"><a name="l03835"></a><span class="lineno"> 3835</span>  <span class="keyword">typename</span> T41, <span class="keyword">typename</span> T42, <span class="keyword">typename</span> T43, <span class="keyword">typename</span> T44, <span class="keyword">typename</span> T45,</div><div class="line"><a name="l03836"></a><span class="lineno"> 3836</span>  <span class="keyword">typename</span> T46, <span class="keyword">typename</span> T47, <span class="keyword">typename</span> T48></div><div class="line"><a name="l03837"></a><span class="lineno"> 3837</span> <span class="keyword">struct </span>Types48 {</div><div class="line"><a name="l03838"></a><span class="lineno"> 3838</span>  <span class="keyword">typedef</span> T1 Head;</div><div class="line"><a name="l03839"></a><span class="lineno"> 3839</span>  <span class="keyword">typedef</span> Types47<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,</div><div class="line"><a name="l03840"></a><span class="lineno"> 3840</span>  T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,</div><div class="line"><a name="l03841"></a><span class="lineno"> 3841</span>  T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,</div><div class="line"><a name="l03842"></a><span class="lineno"> 3842</span>  T44, T45, T46, T47, T48> Tail;</div><div class="line"><a name="l03843"></a><span class="lineno"> 3843</span> };</div><div class="line"><a name="l03844"></a><span class="lineno"> 3844</span> </div><div class="line"><a name="l03845"></a><span class="lineno"> 3845</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l03846"></a><span class="lineno"> 3846</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l03847"></a><span class="lineno"> 3847</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14, <span class="keyword">typename</span> T15,</div><div class="line"><a name="l03848"></a><span class="lineno"> 3848</span>  <span class="keyword">typename</span> T16, <span class="keyword">typename</span> T17, <span class="keyword">typename</span> T18, <span class="keyword">typename</span> T19, <span class="keyword">typename</span> T20,</div><div class="line"><a name="l03849"></a><span class="lineno"> 3849</span>  <span class="keyword">typename</span> T21, <span class="keyword">typename</span> T22, <span class="keyword">typename</span> T23, <span class="keyword">typename</span> T24, <span class="keyword">typename</span> T25,</div><div class="line"><a name="l03850"></a><span class="lineno"> 3850</span>  <span class="keyword">typename</span> T26, <span class="keyword">typename</span> T27, <span class="keyword">typename</span> T28, <span class="keyword">typename</span> T29, <span class="keyword">typename</span> T30,</div><div class="line"><a name="l03851"></a><span class="lineno"> 3851</span>  <span class="keyword">typename</span> T31, <span class="keyword">typename</span> T32, <span class="keyword">typename</span> T33, <span class="keyword">typename</span> T34, <span class="keyword">typename</span> T35,</div><div class="line"><a name="l03852"></a><span class="lineno"> 3852</span>  <span class="keyword">typename</span> T36, <span class="keyword">typename</span> T37, <span class="keyword">typename</span> T38, <span class="keyword">typename</span> T39, <span class="keyword">typename</span> T40,</div><div class="line"><a name="l03853"></a><span class="lineno"> 3853</span>  <span class="keyword">typename</span> T41, <span class="keyword">typename</span> T42, <span class="keyword">typename</span> T43, <span class="keyword">typename</span> T44, <span class="keyword">typename</span> T45,</div><div class="line"><a name="l03854"></a><span class="lineno"> 3854</span>  <span class="keyword">typename</span> T46, <span class="keyword">typename</span> T47, <span class="keyword">typename</span> T48, <span class="keyword">typename</span> T49></div><div class="line"><a name="l03855"></a><span class="lineno"> 3855</span> <span class="keyword">struct </span>Types49 {</div><div class="line"><a name="l03856"></a><span class="lineno"> 3856</span>  <span class="keyword">typedef</span> T1 Head;</div><div class="line"><a name="l03857"></a><span class="lineno"> 3857</span>  <span class="keyword">typedef</span> Types48<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,</div><div class="line"><a name="l03858"></a><span class="lineno"> 3858</span>  T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,</div><div class="line"><a name="l03859"></a><span class="lineno"> 3859</span>  T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,</div><div class="line"><a name="l03860"></a><span class="lineno"> 3860</span>  T44, T45, T46, T47, T48, T49> Tail;</div><div class="line"><a name="l03861"></a><span class="lineno"> 3861</span> };</div><div class="line"><a name="l03862"></a><span class="lineno"> 3862</span> </div><div class="line"><a name="l03863"></a><span class="lineno"> 3863</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l03864"></a><span class="lineno"> 3864</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l03865"></a><span class="lineno"> 3865</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14, <span class="keyword">typename</span> T15,</div><div class="line"><a name="l03866"></a><span class="lineno"> 3866</span>  <span class="keyword">typename</span> T16, <span class="keyword">typename</span> T17, <span class="keyword">typename</span> T18, <span class="keyword">typename</span> T19, <span class="keyword">typename</span> T20,</div><div class="line"><a name="l03867"></a><span class="lineno"> 3867</span>  <span class="keyword">typename</span> T21, <span class="keyword">typename</span> T22, <span class="keyword">typename</span> T23, <span class="keyword">typename</span> T24, <span class="keyword">typename</span> T25,</div><div class="line"><a name="l03868"></a><span class="lineno"> 3868</span>  <span class="keyword">typename</span> T26, <span class="keyword">typename</span> T27, <span class="keyword">typename</span> T28, <span class="keyword">typename</span> T29, <span class="keyword">typename</span> T30,</div><div class="line"><a name="l03869"></a><span class="lineno"> 3869</span>  <span class="keyword">typename</span> T31, <span class="keyword">typename</span> T32, <span class="keyword">typename</span> T33, <span class="keyword">typename</span> T34, <span class="keyword">typename</span> T35,</div><div class="line"><a name="l03870"></a><span class="lineno"> 3870</span>  <span class="keyword">typename</span> T36, <span class="keyword">typename</span> T37, <span class="keyword">typename</span> T38, <span class="keyword">typename</span> T39, <span class="keyword">typename</span> T40,</div><div class="line"><a name="l03871"></a><span class="lineno"> 3871</span>  <span class="keyword">typename</span> T41, <span class="keyword">typename</span> T42, <span class="keyword">typename</span> T43, <span class="keyword">typename</span> T44, <span class="keyword">typename</span> T45,</div><div class="line"><a name="l03872"></a><span class="lineno"> 3872</span>  <span class="keyword">typename</span> T46, <span class="keyword">typename</span> T47, <span class="keyword">typename</span> T48, <span class="keyword">typename</span> T49, <span class="keyword">typename</span> T50></div><div class="line"><a name="l03873"></a><span class="lineno"> 3873</span> <span class="keyword">struct </span>Types50 {</div><div class="line"><a name="l03874"></a><span class="lineno"> 3874</span>  <span class="keyword">typedef</span> T1 Head;</div><div class="line"><a name="l03875"></a><span class="lineno"> 3875</span>  <span class="keyword">typedef</span> Types49<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,</div><div class="line"><a name="l03876"></a><span class="lineno"> 3876</span>  T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,</div><div class="line"><a name="l03877"></a><span class="lineno"> 3877</span>  T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,</div><div class="line"><a name="l03878"></a><span class="lineno"> 3878</span>  T44, T45, T46, T47, T48, T49, T50> Tail;</div><div class="line"><a name="l03879"></a><span class="lineno"> 3879</span> };</div><div class="line"><a name="l03880"></a><span class="lineno"> 3880</span> </div><div class="line"><a name="l03881"></a><span class="lineno"> 3881</span> </div><div class="line"><a name="l03882"></a><span class="lineno"> 3882</span> } <span class="comment">// namespace internal</span></div><div class="line"><a name="l03883"></a><span class="lineno"> 3883</span> </div><div class="line"><a name="l03884"></a><span class="lineno"> 3884</span> <span class="comment">// We don't want to require the users to write TypesN<...> directly,</span></div><div class="line"><a name="l03885"></a><span class="lineno"> 3885</span> <span class="comment">// as that would require them to count the length. Types<...> is much</span></div><div class="line"><a name="l03886"></a><span class="lineno"> 3886</span> <span class="comment">// easier to write, but generates horrible messages when there is a</span></div><div class="line"><a name="l03887"></a><span class="lineno"> 3887</span> <span class="comment">// compiler error, as gcc insists on printing out each template</span></div><div class="line"><a name="l03888"></a><span class="lineno"> 3888</span> <span class="comment">// argument, even if it has the default value (this means Types<int></span></div><div class="line"><a name="l03889"></a><span class="lineno"> 3889</span> <span class="comment">// will appear as Types<int, None, None, ..., None> in the compiler</span></div><div class="line"><a name="l03890"></a><span class="lineno"> 3890</span> <span class="comment">// errors).</span></div><div class="line"><a name="l03891"></a><span class="lineno"> 3891</span> <span class="comment">//</span></div><div class="line"><a name="l03892"></a><span class="lineno"> 3892</span> <span class="comment">// Our solution is to combine the best part of the two approaches: a</span></div><div class="line"><a name="l03893"></a><span class="lineno"> 3893</span> <span class="comment">// user would write Types<T1, ..., TN>, and Google Test will translate</span></div><div class="line"><a name="l03894"></a><span class="lineno"> 3894</span> <span class="comment">// that to TypesN<T1, ..., TN> internally to make error messages</span></div><div class="line"><a name="l03895"></a><span class="lineno"> 3895</span> <span class="comment">// readable. The translation is done by the 'type' member of the</span></div><div class="line"><a name="l03896"></a><span class="lineno"> 3896</span> <span class="comment">// Types template.</span></div><div class="line"><a name="l03897"></a><span class="lineno"> 3897</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1 = internal::None, <span class="keyword">typename</span> T2 = internal::None,</div><div class="line"><a name="l03898"></a><span class="lineno"> 3898</span>  <span class="keyword">typename</span> T3 = internal::None, <span class="keyword">typename</span> T4 = internal::None,</div><div class="line"><a name="l03899"></a><span class="lineno"> 3899</span>  <span class="keyword">typename</span> T5 = internal::None, <span class="keyword">typename</span> T6 = internal::None,</div><div class="line"><a name="l03900"></a><span class="lineno"> 3900</span>  <span class="keyword">typename</span> T7 = internal::None, <span class="keyword">typename</span> T8 = internal::None,</div><div class="line"><a name="l03901"></a><span class="lineno"> 3901</span>  <span class="keyword">typename</span> T9 = internal::None, <span class="keyword">typename</span> T10 = internal::None,</div><div class="line"><a name="l03902"></a><span class="lineno"> 3902</span>  <span class="keyword">typename</span> T11 = internal::None, <span class="keyword">typename</span> T12 = internal::None,</div><div class="line"><a name="l03903"></a><span class="lineno"> 3903</span>  <span class="keyword">typename</span> T13 = internal::None, <span class="keyword">typename</span> T14 = internal::None,</div><div class="line"><a name="l03904"></a><span class="lineno"> 3904</span>  <span class="keyword">typename</span> T15 = internal::None, <span class="keyword">typename</span> T16 = internal::None,</div><div class="line"><a name="l03905"></a><span class="lineno"> 3905</span>  <span class="keyword">typename</span> T17 = internal::None, <span class="keyword">typename</span> T18 = internal::None,</div><div class="line"><a name="l03906"></a><span class="lineno"> 3906</span>  <span class="keyword">typename</span> T19 = internal::None, <span class="keyword">typename</span> T20 = internal::None,</div><div class="line"><a name="l03907"></a><span class="lineno"> 3907</span>  <span class="keyword">typename</span> T21 = internal::None, <span class="keyword">typename</span> T22 = internal::None,</div><div class="line"><a name="l03908"></a><span class="lineno"> 3908</span>  <span class="keyword">typename</span> T23 = internal::None, <span class="keyword">typename</span> T24 = internal::None,</div><div class="line"><a name="l03909"></a><span class="lineno"> 3909</span>  <span class="keyword">typename</span> T25 = internal::None, <span class="keyword">typename</span> T26 = internal::None,</div><div class="line"><a name="l03910"></a><span class="lineno"> 3910</span>  <span class="keyword">typename</span> T27 = internal::None, <span class="keyword">typename</span> T28 = internal::None,</div><div class="line"><a name="l03911"></a><span class="lineno"> 3911</span>  <span class="keyword">typename</span> T29 = internal::None, <span class="keyword">typename</span> T30 = internal::None,</div><div class="line"><a name="l03912"></a><span class="lineno"> 3912</span>  <span class="keyword">typename</span> T31 = internal::None, <span class="keyword">typename</span> T32 = internal::None,</div><div class="line"><a name="l03913"></a><span class="lineno"> 3913</span>  <span class="keyword">typename</span> T33 = internal::None, <span class="keyword">typename</span> T34 = internal::None,</div><div class="line"><a name="l03914"></a><span class="lineno"> 3914</span>  <span class="keyword">typename</span> T35 = internal::None, <span class="keyword">typename</span> T36 = internal::None,</div><div class="line"><a name="l03915"></a><span class="lineno"> 3915</span>  <span class="keyword">typename</span> T37 = internal::None, <span class="keyword">typename</span> T38 = internal::None,</div><div class="line"><a name="l03916"></a><span class="lineno"> 3916</span>  <span class="keyword">typename</span> T39 = internal::None, <span class="keyword">typename</span> T40 = internal::None,</div><div class="line"><a name="l03917"></a><span class="lineno"> 3917</span>  <span class="keyword">typename</span> T41 = internal::None, <span class="keyword">typename</span> T42 = internal::None,</div><div class="line"><a name="l03918"></a><span class="lineno"> 3918</span>  <span class="keyword">typename</span> T43 = internal::None, <span class="keyword">typename</span> T44 = internal::None,</div><div class="line"><a name="l03919"></a><span class="lineno"> 3919</span>  <span class="keyword">typename</span> T45 = internal::None, <span class="keyword">typename</span> T46 = internal::None,</div><div class="line"><a name="l03920"></a><span class="lineno"> 3920</span>  <span class="keyword">typename</span> T47 = internal::None, <span class="keyword">typename</span> T48 = internal::None,</div><div class="line"><a name="l03921"></a><span class="lineno"> 3921</span>  <span class="keyword">typename</span> T49 = internal::None, <span class="keyword">typename</span> T50 = internal::None></div><div class="line"><a name="l03922"></a><span class="lineno"> 3922</span> <span class="keyword">struct </span>Types {</div><div class="line"><a name="l03923"></a><span class="lineno"> 3923</span>  <span class="keyword">typedef</span> internal::Types50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,</div><div class="line"><a name="l03924"></a><span class="lineno"> 3924</span>  T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,</div><div class="line"><a name="l03925"></a><span class="lineno"> 3925</span>  T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,</div><div class="line"><a name="l03926"></a><span class="lineno"> 3926</span>  T41, T42, T43, T44, T45, T46, T47, T48, T49, T50> type;</div><div class="line"><a name="l03927"></a><span class="lineno"> 3927</span> };</div><div class="line"><a name="l03928"></a><span class="lineno"> 3928</span> </div><div class="line"><a name="l03929"></a><span class="lineno"> 3929</span> <span class="keyword">template</span> <></div><div class="line"><a name="l03930"></a><span class="lineno"> 3930</span> <span class="keyword">struct </span>Types<internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l03931"></a><span class="lineno"> 3931</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l03932"></a><span class="lineno"> 3932</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l03933"></a><span class="lineno"> 3933</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l03934"></a><span class="lineno"> 3934</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l03935"></a><span class="lineno"> 3935</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l03936"></a><span class="lineno"> 3936</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l03937"></a><span class="lineno"> 3937</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l03938"></a><span class="lineno"> 3938</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l03939"></a><span class="lineno"> 3939</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l03940"></a><span class="lineno"> 3940</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l03941"></a><span class="lineno"> 3941</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l03942"></a><span class="lineno"> 3942</span>  internal::None, internal::None> {</div><div class="line"><a name="l03943"></a><span class="lineno"> 3943</span>  <span class="keyword">typedef</span> internal::Types0 type;</div><div class="line"><a name="l03944"></a><span class="lineno"> 3944</span> };</div><div class="line"><a name="l03945"></a><span class="lineno"> 3945</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1></div><div class="line"><a name="l03946"></a><span class="lineno"> 3946</span> <span class="keyword">struct </span>Types<T1, internal::None, internal::None, internal::None,</div><div class="line"><a name="l03947"></a><span class="lineno"> 3947</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l03948"></a><span class="lineno"> 3948</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l03949"></a><span class="lineno"> 3949</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l03950"></a><span class="lineno"> 3950</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l03951"></a><span class="lineno"> 3951</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l03952"></a><span class="lineno"> 3952</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l03953"></a><span class="lineno"> 3953</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l03954"></a><span class="lineno"> 3954</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l03955"></a><span class="lineno"> 3955</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l03956"></a><span class="lineno"> 3956</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l03957"></a><span class="lineno"> 3957</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l03958"></a><span class="lineno"> 3958</span>  internal::None, internal::None> {</div><div class="line"><a name="l03959"></a><span class="lineno"> 3959</span>  <span class="keyword">typedef</span> internal::Types1<T1> type;</div><div class="line"><a name="l03960"></a><span class="lineno"> 3960</span> };</div><div class="line"><a name="l03961"></a><span class="lineno"> 3961</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2></div><div class="line"><a name="l03962"></a><span class="lineno"> 3962</span> <span class="keyword">struct </span>Types<T1, T2, internal::None, internal::None, internal::None,</div><div class="line"><a name="l03963"></a><span class="lineno"> 3963</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l03964"></a><span class="lineno"> 3964</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l03965"></a><span class="lineno"> 3965</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l03966"></a><span class="lineno"> 3966</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l03967"></a><span class="lineno"> 3967</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l03968"></a><span class="lineno"> 3968</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l03969"></a><span class="lineno"> 3969</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l03970"></a><span class="lineno"> 3970</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l03971"></a><span class="lineno"> 3971</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l03972"></a><span class="lineno"> 3972</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l03973"></a><span class="lineno"> 3973</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l03974"></a><span class="lineno"> 3974</span>  internal::None> {</div><div class="line"><a name="l03975"></a><span class="lineno"> 3975</span>  <span class="keyword">typedef</span> internal::Types2<T1, T2> type;</div><div class="line"><a name="l03976"></a><span class="lineno"> 3976</span> };</div><div class="line"><a name="l03977"></a><span class="lineno"> 3977</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3></div><div class="line"><a name="l03978"></a><span class="lineno"> 3978</span> <span class="keyword">struct </span>Types<T1, T2, T3, internal::None, internal::None, internal::None,</div><div class="line"><a name="l03979"></a><span class="lineno"> 3979</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l03980"></a><span class="lineno"> 3980</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l03981"></a><span class="lineno"> 3981</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l03982"></a><span class="lineno"> 3982</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l03983"></a><span class="lineno"> 3983</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l03984"></a><span class="lineno"> 3984</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l03985"></a><span class="lineno"> 3985</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l03986"></a><span class="lineno"> 3986</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l03987"></a><span class="lineno"> 3987</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l03988"></a><span class="lineno"> 3988</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l03989"></a><span class="lineno"> 3989</span>  internal::None, internal::None, internal::None, internal::None> {</div><div class="line"><a name="l03990"></a><span class="lineno"> 3990</span>  <span class="keyword">typedef</span> internal::Types3<T1, T2, T3> type;</div><div class="line"><a name="l03991"></a><span class="lineno"> 3991</span> };</div><div class="line"><a name="l03992"></a><span class="lineno"> 3992</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4></div><div class="line"><a name="l03993"></a><span class="lineno"> 3993</span> <span class="keyword">struct </span>Types<T1, T2, T3, T4, internal::None, internal::None, internal::None,</div><div class="line"><a name="l03994"></a><span class="lineno"> 3994</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l03995"></a><span class="lineno"> 3995</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l03996"></a><span class="lineno"> 3996</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l03997"></a><span class="lineno"> 3997</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l03998"></a><span class="lineno"> 3998</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l03999"></a><span class="lineno"> 3999</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04000"></a><span class="lineno"> 4000</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04001"></a><span class="lineno"> 4001</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04002"></a><span class="lineno"> 4002</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04003"></a><span class="lineno"> 4003</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04004"></a><span class="lineno"> 4004</span>  internal::None, internal::None, internal::None> {</div><div class="line"><a name="l04005"></a><span class="lineno"> 4005</span>  <span class="keyword">typedef</span> internal::Types4<T1, T2, T3, T4> type;</div><div class="line"><a name="l04006"></a><span class="lineno"> 4006</span> };</div><div class="line"><a name="l04007"></a><span class="lineno"> 4007</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5></div><div class="line"><a name="l04008"></a><span class="lineno"> 4008</span> <span class="keyword">struct </span>Types<T1, T2, T3, T4, T5, internal::None, internal::None,</div><div class="line"><a name="l04009"></a><span class="lineno"> 4009</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04010"></a><span class="lineno"> 4010</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04011"></a><span class="lineno"> 4011</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04012"></a><span class="lineno"> 4012</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04013"></a><span class="lineno"> 4013</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04014"></a><span class="lineno"> 4014</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04015"></a><span class="lineno"> 4015</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04016"></a><span class="lineno"> 4016</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04017"></a><span class="lineno"> 4017</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04018"></a><span class="lineno"> 4018</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04019"></a><span class="lineno"> 4019</span>  internal::None, internal::None, internal::None> {</div><div class="line"><a name="l04020"></a><span class="lineno"> 4020</span>  <span class="keyword">typedef</span> internal::Types5<T1, T2, T3, T4, T5> type;</div><div class="line"><a name="l04021"></a><span class="lineno"> 4021</span> };</div><div class="line"><a name="l04022"></a><span class="lineno"> 4022</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l04023"></a><span class="lineno"> 4023</span>  <span class="keyword">typename</span> T6></div><div class="line"><a name="l04024"></a><span class="lineno"> 4024</span> <span class="keyword">struct </span>Types<T1, T2, T3, T4, T5, T6, internal::None, internal::None,</div><div class="line"><a name="l04025"></a><span class="lineno"> 4025</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04026"></a><span class="lineno"> 4026</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04027"></a><span class="lineno"> 4027</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04028"></a><span class="lineno"> 4028</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04029"></a><span class="lineno"> 4029</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04030"></a><span class="lineno"> 4030</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04031"></a><span class="lineno"> 4031</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04032"></a><span class="lineno"> 4032</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04033"></a><span class="lineno"> 4033</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04034"></a><span class="lineno"> 4034</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04035"></a><span class="lineno"> 4035</span>  internal::None, internal::None> {</div><div class="line"><a name="l04036"></a><span class="lineno"> 4036</span>  <span class="keyword">typedef</span> internal::Types6<T1, T2, T3, T4, T5, T6> type;</div><div class="line"><a name="l04037"></a><span class="lineno"> 4037</span> };</div><div class="line"><a name="l04038"></a><span class="lineno"> 4038</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l04039"></a><span class="lineno"> 4039</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7></div><div class="line"><a name="l04040"></a><span class="lineno"> 4040</span> <span class="keyword">struct </span>Types<T1, T2, T3, T4, T5, T6, T7, internal::None, internal::None,</div><div class="line"><a name="l04041"></a><span class="lineno"> 4041</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04042"></a><span class="lineno"> 4042</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04043"></a><span class="lineno"> 4043</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04044"></a><span class="lineno"> 4044</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04045"></a><span class="lineno"> 4045</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04046"></a><span class="lineno"> 4046</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04047"></a><span class="lineno"> 4047</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04048"></a><span class="lineno"> 4048</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04049"></a><span class="lineno"> 4049</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04050"></a><span class="lineno"> 4050</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04051"></a><span class="lineno"> 4051</span>  internal::None> {</div><div class="line"><a name="l04052"></a><span class="lineno"> 4052</span>  <span class="keyword">typedef</span> internal::Types7<T1, T2, T3, T4, T5, T6, T7> type;</div><div class="line"><a name="l04053"></a><span class="lineno"> 4053</span> };</div><div class="line"><a name="l04054"></a><span class="lineno"> 4054</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l04055"></a><span class="lineno"> 4055</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8></div><div class="line"><a name="l04056"></a><span class="lineno"> 4056</span> <span class="keyword">struct </span>Types<T1, T2, T3, T4, T5, T6, T7, T8, internal::None, internal::None,</div><div class="line"><a name="l04057"></a><span class="lineno"> 4057</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04058"></a><span class="lineno"> 4058</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04059"></a><span class="lineno"> 4059</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04060"></a><span class="lineno"> 4060</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04061"></a><span class="lineno"> 4061</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04062"></a><span class="lineno"> 4062</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04063"></a><span class="lineno"> 4063</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04064"></a><span class="lineno"> 4064</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04065"></a><span class="lineno"> 4065</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04066"></a><span class="lineno"> 4066</span>  internal::None, internal::None, internal::None, internal::None> {</div><div class="line"><a name="l04067"></a><span class="lineno"> 4067</span>  <span class="keyword">typedef</span> internal::Types8<T1, T2, T3, T4, T5, T6, T7, T8> type;</div><div class="line"><a name="l04068"></a><span class="lineno"> 4068</span> };</div><div class="line"><a name="l04069"></a><span class="lineno"> 4069</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l04070"></a><span class="lineno"> 4070</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9></div><div class="line"><a name="l04071"></a><span class="lineno"> 4071</span> <span class="keyword">struct </span>Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, internal::None,</div><div class="line"><a name="l04072"></a><span class="lineno"> 4072</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04073"></a><span class="lineno"> 4073</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04074"></a><span class="lineno"> 4074</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04075"></a><span class="lineno"> 4075</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04076"></a><span class="lineno"> 4076</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04077"></a><span class="lineno"> 4077</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04078"></a><span class="lineno"> 4078</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04079"></a><span class="lineno"> 4079</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04080"></a><span class="lineno"> 4080</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04081"></a><span class="lineno"> 4081</span>  internal::None, internal::None, internal::None, internal::None> {</div><div class="line"><a name="l04082"></a><span class="lineno"> 4082</span>  <span class="keyword">typedef</span> internal::Types9<T1, T2, T3, T4, T5, T6, T7, T8, T9> type;</div><div class="line"><a name="l04083"></a><span class="lineno"> 4083</span> };</div><div class="line"><a name="l04084"></a><span class="lineno"> 4084</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l04085"></a><span class="lineno"> 4085</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10></div><div class="line"><a name="l04086"></a><span class="lineno"> 4086</span> <span class="keyword">struct </span>Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, internal::None,</div><div class="line"><a name="l04087"></a><span class="lineno"> 4087</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04088"></a><span class="lineno"> 4088</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04089"></a><span class="lineno"> 4089</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04090"></a><span class="lineno"> 4090</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04091"></a><span class="lineno"> 4091</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04092"></a><span class="lineno"> 4092</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04093"></a><span class="lineno"> 4093</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04094"></a><span class="lineno"> 4094</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04095"></a><span class="lineno"> 4095</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04096"></a><span class="lineno"> 4096</span>  internal::None, internal::None, internal::None> {</div><div class="line"><a name="l04097"></a><span class="lineno"> 4097</span>  <span class="keyword">typedef</span> internal::Types10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> type;</div><div class="line"><a name="l04098"></a><span class="lineno"> 4098</span> };</div><div class="line"><a name="l04099"></a><span class="lineno"> 4099</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l04100"></a><span class="lineno"> 4100</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l04101"></a><span class="lineno"> 4101</span>  <span class="keyword">typename</span> T11></div><div class="line"><a name="l04102"></a><span class="lineno"> 4102</span> <span class="keyword">struct </span>Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, internal::None,</div><div class="line"><a name="l04103"></a><span class="lineno"> 4103</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04104"></a><span class="lineno"> 4104</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04105"></a><span class="lineno"> 4105</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04106"></a><span class="lineno"> 4106</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04107"></a><span class="lineno"> 4107</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04108"></a><span class="lineno"> 4108</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04109"></a><span class="lineno"> 4109</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04110"></a><span class="lineno"> 4110</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04111"></a><span class="lineno"> 4111</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04112"></a><span class="lineno"> 4112</span>  internal::None, internal::None> {</div><div class="line"><a name="l04113"></a><span class="lineno"> 4113</span>  <span class="keyword">typedef</span> internal::Types11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> type;</div><div class="line"><a name="l04114"></a><span class="lineno"> 4114</span> };</div><div class="line"><a name="l04115"></a><span class="lineno"> 4115</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l04116"></a><span class="lineno"> 4116</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l04117"></a><span class="lineno"> 4117</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12></div><div class="line"><a name="l04118"></a><span class="lineno"> 4118</span> <span class="keyword">struct </span>Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, internal::None,</div><div class="line"><a name="l04119"></a><span class="lineno"> 4119</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04120"></a><span class="lineno"> 4120</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04121"></a><span class="lineno"> 4121</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04122"></a><span class="lineno"> 4122</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04123"></a><span class="lineno"> 4123</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04124"></a><span class="lineno"> 4124</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04125"></a><span class="lineno"> 4125</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04126"></a><span class="lineno"> 4126</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04127"></a><span class="lineno"> 4127</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04128"></a><span class="lineno"> 4128</span>  internal::None> {</div><div class="line"><a name="l04129"></a><span class="lineno"> 4129</span>  <span class="keyword">typedef</span> internal::Types12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,</div><div class="line"><a name="l04130"></a><span class="lineno"> 4130</span>  T12> type;</div><div class="line"><a name="l04131"></a><span class="lineno"> 4131</span> };</div><div class="line"><a name="l04132"></a><span class="lineno"> 4132</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l04133"></a><span class="lineno"> 4133</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l04134"></a><span class="lineno"> 4134</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13></div><div class="line"><a name="l04135"></a><span class="lineno"> 4135</span> <span class="keyword">struct </span>Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,</div><div class="line"><a name="l04136"></a><span class="lineno"> 4136</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04137"></a><span class="lineno"> 4137</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04138"></a><span class="lineno"> 4138</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04139"></a><span class="lineno"> 4139</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04140"></a><span class="lineno"> 4140</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04141"></a><span class="lineno"> 4141</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04142"></a><span class="lineno"> 4142</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04143"></a><span class="lineno"> 4143</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04144"></a><span class="lineno"> 4144</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04145"></a><span class="lineno"> 4145</span>  internal::None> {</div><div class="line"><a name="l04146"></a><span class="lineno"> 4146</span>  <span class="keyword">typedef</span> internal::Types13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,</div><div class="line"><a name="l04147"></a><span class="lineno"> 4147</span>  T13> type;</div><div class="line"><a name="l04148"></a><span class="lineno"> 4148</span> };</div><div class="line"><a name="l04149"></a><span class="lineno"> 4149</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l04150"></a><span class="lineno"> 4150</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l04151"></a><span class="lineno"> 4151</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14></div><div class="line"><a name="l04152"></a><span class="lineno"> 4152</span> <span class="keyword">struct </span>Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l04153"></a><span class="lineno"> 4153</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04154"></a><span class="lineno"> 4154</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04155"></a><span class="lineno"> 4155</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04156"></a><span class="lineno"> 4156</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04157"></a><span class="lineno"> 4157</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04158"></a><span class="lineno"> 4158</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04159"></a><span class="lineno"> 4159</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04160"></a><span class="lineno"> 4160</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04161"></a><span class="lineno"> 4161</span>  internal::None, internal::None, internal::None, internal::None> {</div><div class="line"><a name="l04162"></a><span class="lineno"> 4162</span>  <span class="keyword">typedef</span> internal::Types14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,</div><div class="line"><a name="l04163"></a><span class="lineno"> 4163</span>  T13, T14> type;</div><div class="line"><a name="l04164"></a><span class="lineno"> 4164</span> };</div><div class="line"><a name="l04165"></a><span class="lineno"> 4165</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l04166"></a><span class="lineno"> 4166</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l04167"></a><span class="lineno"> 4167</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14, <span class="keyword">typename</span> T15></div><div class="line"><a name="l04168"></a><span class="lineno"> 4168</span> <span class="keyword">struct </span>Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,</div><div class="line"><a name="l04169"></a><span class="lineno"> 4169</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04170"></a><span class="lineno"> 4170</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04171"></a><span class="lineno"> 4171</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04172"></a><span class="lineno"> 4172</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04173"></a><span class="lineno"> 4173</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04174"></a><span class="lineno"> 4174</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04175"></a><span class="lineno"> 4175</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04176"></a><span class="lineno"> 4176</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04177"></a><span class="lineno"> 4177</span>  internal::None, internal::None, internal::None> {</div><div class="line"><a name="l04178"></a><span class="lineno"> 4178</span>  <span class="keyword">typedef</span> internal::Types15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,</div><div class="line"><a name="l04179"></a><span class="lineno"> 4179</span>  T13, T14, T15> type;</div><div class="line"><a name="l04180"></a><span class="lineno"> 4180</span> };</div><div class="line"><a name="l04181"></a><span class="lineno"> 4181</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l04182"></a><span class="lineno"> 4182</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l04183"></a><span class="lineno"> 4183</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14, <span class="keyword">typename</span> T15,</div><div class="line"><a name="l04184"></a><span class="lineno"> 4184</span>  <span class="keyword">typename</span> T16></div><div class="line"><a name="l04185"></a><span class="lineno"> 4185</span> <span class="keyword">struct </span>Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,</div><div class="line"><a name="l04186"></a><span class="lineno"> 4186</span>  T16, internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04187"></a><span class="lineno"> 4187</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04188"></a><span class="lineno"> 4188</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04189"></a><span class="lineno"> 4189</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04190"></a><span class="lineno"> 4190</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04191"></a><span class="lineno"> 4191</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04192"></a><span class="lineno"> 4192</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04193"></a><span class="lineno"> 4193</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04194"></a><span class="lineno"> 4194</span>  internal::None, internal::None> {</div><div class="line"><a name="l04195"></a><span class="lineno"> 4195</span>  <span class="keyword">typedef</span> internal::Types16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,</div><div class="line"><a name="l04196"></a><span class="lineno"> 4196</span>  T13, T14, T15, T16> type;</div><div class="line"><a name="l04197"></a><span class="lineno"> 4197</span> };</div><div class="line"><a name="l04198"></a><span class="lineno"> 4198</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l04199"></a><span class="lineno"> 4199</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l04200"></a><span class="lineno"> 4200</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14, <span class="keyword">typename</span> T15,</div><div class="line"><a name="l04201"></a><span class="lineno"> 4201</span>  <span class="keyword">typename</span> T16, <span class="keyword">typename</span> T17></div><div class="line"><a name="l04202"></a><span class="lineno"> 4202</span> <span class="keyword">struct </span>Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,</div><div class="line"><a name="l04203"></a><span class="lineno"> 4203</span>  T16, T17, internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04204"></a><span class="lineno"> 4204</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04205"></a><span class="lineno"> 4205</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04206"></a><span class="lineno"> 4206</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04207"></a><span class="lineno"> 4207</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04208"></a><span class="lineno"> 4208</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04209"></a><span class="lineno"> 4209</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04210"></a><span class="lineno"> 4210</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04211"></a><span class="lineno"> 4211</span>  internal::None> {</div><div class="line"><a name="l04212"></a><span class="lineno"> 4212</span>  <span class="keyword">typedef</span> internal::Types17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,</div><div class="line"><a name="l04213"></a><span class="lineno"> 4213</span>  T13, T14, T15, T16, T17> type;</div><div class="line"><a name="l04214"></a><span class="lineno"> 4214</span> };</div><div class="line"><a name="l04215"></a><span class="lineno"> 4215</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l04216"></a><span class="lineno"> 4216</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l04217"></a><span class="lineno"> 4217</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14, <span class="keyword">typename</span> T15,</div><div class="line"><a name="l04218"></a><span class="lineno"> 4218</span>  <span class="keyword">typename</span> T16, <span class="keyword">typename</span> T17, <span class="keyword">typename</span> T18></div><div class="line"><a name="l04219"></a><span class="lineno"> 4219</span> <span class="keyword">struct </span>Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,</div><div class="line"><a name="l04220"></a><span class="lineno"> 4220</span>  T16, T17, T18, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04221"></a><span class="lineno"> 4221</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04222"></a><span class="lineno"> 4222</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04223"></a><span class="lineno"> 4223</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04224"></a><span class="lineno"> 4224</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04225"></a><span class="lineno"> 4225</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04226"></a><span class="lineno"> 4226</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04227"></a><span class="lineno"> 4227</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04228"></a><span class="lineno"> 4228</span>  internal::None> {</div><div class="line"><a name="l04229"></a><span class="lineno"> 4229</span>  <span class="keyword">typedef</span> internal::Types18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,</div><div class="line"><a name="l04230"></a><span class="lineno"> 4230</span>  T13, T14, T15, T16, T17, T18> type;</div><div class="line"><a name="l04231"></a><span class="lineno"> 4231</span> };</div><div class="line"><a name="l04232"></a><span class="lineno"> 4232</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l04233"></a><span class="lineno"> 4233</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l04234"></a><span class="lineno"> 4234</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14, <span class="keyword">typename</span> T15,</div><div class="line"><a name="l04235"></a><span class="lineno"> 4235</span>  <span class="keyword">typename</span> T16, <span class="keyword">typename</span> T17, <span class="keyword">typename</span> T18, <span class="keyword">typename</span> T19></div><div class="line"><a name="l04236"></a><span class="lineno"> 4236</span> <span class="keyword">struct </span>Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,</div><div class="line"><a name="l04237"></a><span class="lineno"> 4237</span>  T16, T17, T18, T19, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04238"></a><span class="lineno"> 4238</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04239"></a><span class="lineno"> 4239</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04240"></a><span class="lineno"> 4240</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04241"></a><span class="lineno"> 4241</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04242"></a><span class="lineno"> 4242</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04243"></a><span class="lineno"> 4243</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04244"></a><span class="lineno"> 4244</span>  internal::None, internal::None, internal::None, internal::None> {</div><div class="line"><a name="l04245"></a><span class="lineno"> 4245</span>  <span class="keyword">typedef</span> internal::Types19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,</div><div class="line"><a name="l04246"></a><span class="lineno"> 4246</span>  T13, T14, T15, T16, T17, T18, T19> type;</div><div class="line"><a name="l04247"></a><span class="lineno"> 4247</span> };</div><div class="line"><a name="l04248"></a><span class="lineno"> 4248</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l04249"></a><span class="lineno"> 4249</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l04250"></a><span class="lineno"> 4250</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14, <span class="keyword">typename</span> T15,</div><div class="line"><a name="l04251"></a><span class="lineno"> 4251</span>  <span class="keyword">typename</span> T16, <span class="keyword">typename</span> T17, <span class="keyword">typename</span> T18, <span class="keyword">typename</span> T19, <span class="keyword">typename</span> T20></div><div class="line"><a name="l04252"></a><span class="lineno"> 4252</span> <span class="keyword">struct </span>Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,</div><div class="line"><a name="l04253"></a><span class="lineno"> 4253</span>  T16, T17, T18, T19, T20, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04254"></a><span class="lineno"> 4254</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04255"></a><span class="lineno"> 4255</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04256"></a><span class="lineno"> 4256</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04257"></a><span class="lineno"> 4257</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04258"></a><span class="lineno"> 4258</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04259"></a><span class="lineno"> 4259</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04260"></a><span class="lineno"> 4260</span>  internal::None, internal::None, internal::None> {</div><div class="line"><a name="l04261"></a><span class="lineno"> 4261</span>  <span class="keyword">typedef</span> internal::Types20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,</div><div class="line"><a name="l04262"></a><span class="lineno"> 4262</span>  T13, T14, T15, T16, T17, T18, T19, T20> type;</div><div class="line"><a name="l04263"></a><span class="lineno"> 4263</span> };</div><div class="line"><a name="l04264"></a><span class="lineno"> 4264</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l04265"></a><span class="lineno"> 4265</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l04266"></a><span class="lineno"> 4266</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14, <span class="keyword">typename</span> T15,</div><div class="line"><a name="l04267"></a><span class="lineno"> 4267</span>  <span class="keyword">typename</span> T16, <span class="keyword">typename</span> T17, <span class="keyword">typename</span> T18, <span class="keyword">typename</span> T19, <span class="keyword">typename</span> T20,</div><div class="line"><a name="l04268"></a><span class="lineno"> 4268</span>  <span class="keyword">typename</span> T21></div><div class="line"><a name="l04269"></a><span class="lineno"> 4269</span> <span class="keyword">struct </span>Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,</div><div class="line"><a name="l04270"></a><span class="lineno"> 4270</span>  T16, T17, T18, T19, T20, T21, internal::None, internal::None,</div><div class="line"><a name="l04271"></a><span class="lineno"> 4271</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04272"></a><span class="lineno"> 4272</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04273"></a><span class="lineno"> 4273</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04274"></a><span class="lineno"> 4274</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04275"></a><span class="lineno"> 4275</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04276"></a><span class="lineno"> 4276</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04277"></a><span class="lineno"> 4277</span>  internal::None, internal::None, internal::None> {</div><div class="line"><a name="l04278"></a><span class="lineno"> 4278</span>  <span class="keyword">typedef</span> internal::Types21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,</div><div class="line"><a name="l04279"></a><span class="lineno"> 4279</span>  T13, T14, T15, T16, T17, T18, T19, T20, T21> type;</div><div class="line"><a name="l04280"></a><span class="lineno"> 4280</span> };</div><div class="line"><a name="l04281"></a><span class="lineno"> 4281</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l04282"></a><span class="lineno"> 4282</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l04283"></a><span class="lineno"> 4283</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14, <span class="keyword">typename</span> T15,</div><div class="line"><a name="l04284"></a><span class="lineno"> 4284</span>  <span class="keyword">typename</span> T16, <span class="keyword">typename</span> T17, <span class="keyword">typename</span> T18, <span class="keyword">typename</span> T19, <span class="keyword">typename</span> T20,</div><div class="line"><a name="l04285"></a><span class="lineno"> 4285</span>  <span class="keyword">typename</span> T21, <span class="keyword">typename</span> T22></div><div class="line"><a name="l04286"></a><span class="lineno"> 4286</span> <span class="keyword">struct </span>Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,</div><div class="line"><a name="l04287"></a><span class="lineno"> 4287</span>  T16, T17, T18, T19, T20, T21, T22, internal::None, internal::None,</div><div class="line"><a name="l04288"></a><span class="lineno"> 4288</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04289"></a><span class="lineno"> 4289</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04290"></a><span class="lineno"> 4290</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04291"></a><span class="lineno"> 4291</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04292"></a><span class="lineno"> 4292</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04293"></a><span class="lineno"> 4293</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04294"></a><span class="lineno"> 4294</span>  internal::None, internal::None> {</div><div class="line"><a name="l04295"></a><span class="lineno"> 4295</span>  <span class="keyword">typedef</span> internal::Types22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,</div><div class="line"><a name="l04296"></a><span class="lineno"> 4296</span>  T13, T14, T15, T16, T17, T18, T19, T20, T21, T22> type;</div><div class="line"><a name="l04297"></a><span class="lineno"> 4297</span> };</div><div class="line"><a name="l04298"></a><span class="lineno"> 4298</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l04299"></a><span class="lineno"> 4299</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l04300"></a><span class="lineno"> 4300</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14, <span class="keyword">typename</span> T15,</div><div class="line"><a name="l04301"></a><span class="lineno"> 4301</span>  <span class="keyword">typename</span> T16, <span class="keyword">typename</span> T17, <span class="keyword">typename</span> T18, <span class="keyword">typename</span> T19, <span class="keyword">typename</span> T20,</div><div class="line"><a name="l04302"></a><span class="lineno"> 4302</span>  <span class="keyword">typename</span> T21, <span class="keyword">typename</span> T22, <span class="keyword">typename</span> T23></div><div class="line"><a name="l04303"></a><span class="lineno"> 4303</span> <span class="keyword">struct </span>Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,</div><div class="line"><a name="l04304"></a><span class="lineno"> 4304</span>  T16, T17, T18, T19, T20, T21, T22, T23, internal::None, internal::None,</div><div class="line"><a name="l04305"></a><span class="lineno"> 4305</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04306"></a><span class="lineno"> 4306</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04307"></a><span class="lineno"> 4307</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04308"></a><span class="lineno"> 4308</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04309"></a><span class="lineno"> 4309</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04310"></a><span class="lineno"> 4310</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04311"></a><span class="lineno"> 4311</span>  internal::None> {</div><div class="line"><a name="l04312"></a><span class="lineno"> 4312</span>  <span class="keyword">typedef</span> internal::Types23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,</div><div class="line"><a name="l04313"></a><span class="lineno"> 4313</span>  T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> type;</div><div class="line"><a name="l04314"></a><span class="lineno"> 4314</span> };</div><div class="line"><a name="l04315"></a><span class="lineno"> 4315</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l04316"></a><span class="lineno"> 4316</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l04317"></a><span class="lineno"> 4317</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14, <span class="keyword">typename</span> T15,</div><div class="line"><a name="l04318"></a><span class="lineno"> 4318</span>  <span class="keyword">typename</span> T16, <span class="keyword">typename</span> T17, <span class="keyword">typename</span> T18, <span class="keyword">typename</span> T19, <span class="keyword">typename</span> T20,</div><div class="line"><a name="l04319"></a><span class="lineno"> 4319</span>  <span class="keyword">typename</span> T21, <span class="keyword">typename</span> T22, <span class="keyword">typename</span> T23, <span class="keyword">typename</span> T24></div><div class="line"><a name="l04320"></a><span class="lineno"> 4320</span> <span class="keyword">struct </span>Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,</div><div class="line"><a name="l04321"></a><span class="lineno"> 4321</span>  T16, T17, T18, T19, T20, T21, T22, T23, T24, internal::None,</div><div class="line"><a name="l04322"></a><span class="lineno"> 4322</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04323"></a><span class="lineno"> 4323</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04324"></a><span class="lineno"> 4324</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04325"></a><span class="lineno"> 4325</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04326"></a><span class="lineno"> 4326</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04327"></a><span class="lineno"> 4327</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04328"></a><span class="lineno"> 4328</span>  internal::None> {</div><div class="line"><a name="l04329"></a><span class="lineno"> 4329</span>  <span class="keyword">typedef</span> internal::Types24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,</div><div class="line"><a name="l04330"></a><span class="lineno"> 4330</span>  T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> type;</div><div class="line"><a name="l04331"></a><span class="lineno"> 4331</span> };</div><div class="line"><a name="l04332"></a><span class="lineno"> 4332</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l04333"></a><span class="lineno"> 4333</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l04334"></a><span class="lineno"> 4334</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14, <span class="keyword">typename</span> T15,</div><div class="line"><a name="l04335"></a><span class="lineno"> 4335</span>  <span class="keyword">typename</span> T16, <span class="keyword">typename</span> T17, <span class="keyword">typename</span> T18, <span class="keyword">typename</span> T19, <span class="keyword">typename</span> T20,</div><div class="line"><a name="l04336"></a><span class="lineno"> 4336</span>  <span class="keyword">typename</span> T21, <span class="keyword">typename</span> T22, <span class="keyword">typename</span> T23, <span class="keyword">typename</span> T24, <span class="keyword">typename</span> T25></div><div class="line"><a name="l04337"></a><span class="lineno"> 4337</span> <span class="keyword">struct </span>Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,</div><div class="line"><a name="l04338"></a><span class="lineno"> 4338</span>  T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, internal::None,</div><div class="line"><a name="l04339"></a><span class="lineno"> 4339</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04340"></a><span class="lineno"> 4340</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04341"></a><span class="lineno"> 4341</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04342"></a><span class="lineno"> 4342</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04343"></a><span class="lineno"> 4343</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04344"></a><span class="lineno"> 4344</span>  internal::None, internal::None, internal::None, internal::None> {</div><div class="line"><a name="l04345"></a><span class="lineno"> 4345</span>  <span class="keyword">typedef</span> internal::Types25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,</div><div class="line"><a name="l04346"></a><span class="lineno"> 4346</span>  T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> type;</div><div class="line"><a name="l04347"></a><span class="lineno"> 4347</span> };</div><div class="line"><a name="l04348"></a><span class="lineno"> 4348</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l04349"></a><span class="lineno"> 4349</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l04350"></a><span class="lineno"> 4350</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14, <span class="keyword">typename</span> T15,</div><div class="line"><a name="l04351"></a><span class="lineno"> 4351</span>  <span class="keyword">typename</span> T16, <span class="keyword">typename</span> T17, <span class="keyword">typename</span> T18, <span class="keyword">typename</span> T19, <span class="keyword">typename</span> T20,</div><div class="line"><a name="l04352"></a><span class="lineno"> 4352</span>  <span class="keyword">typename</span> T21, <span class="keyword">typename</span> T22, <span class="keyword">typename</span> T23, <span class="keyword">typename</span> T24, <span class="keyword">typename</span> T25,</div><div class="line"><a name="l04353"></a><span class="lineno"> 4353</span>  <span class="keyword">typename</span> T26></div><div class="line"><a name="l04354"></a><span class="lineno"> 4354</span> <span class="keyword">struct </span>Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,</div><div class="line"><a name="l04355"></a><span class="lineno"> 4355</span>  T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, internal::None,</div><div class="line"><a name="l04356"></a><span class="lineno"> 4356</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04357"></a><span class="lineno"> 4357</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04358"></a><span class="lineno"> 4358</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04359"></a><span class="lineno"> 4359</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04360"></a><span class="lineno"> 4360</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04361"></a><span class="lineno"> 4361</span>  internal::None, internal::None, internal::None> {</div><div class="line"><a name="l04362"></a><span class="lineno"> 4362</span>  <span class="keyword">typedef</span> internal::Types26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,</div><div class="line"><a name="l04363"></a><span class="lineno"> 4363</span>  T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,</div><div class="line"><a name="l04364"></a><span class="lineno"> 4364</span>  T26> type;</div><div class="line"><a name="l04365"></a><span class="lineno"> 4365</span> };</div><div class="line"><a name="l04366"></a><span class="lineno"> 4366</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l04367"></a><span class="lineno"> 4367</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l04368"></a><span class="lineno"> 4368</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14, <span class="keyword">typename</span> T15,</div><div class="line"><a name="l04369"></a><span class="lineno"> 4369</span>  <span class="keyword">typename</span> T16, <span class="keyword">typename</span> T17, <span class="keyword">typename</span> T18, <span class="keyword">typename</span> T19, <span class="keyword">typename</span> T20,</div><div class="line"><a name="l04370"></a><span class="lineno"> 4370</span>  <span class="keyword">typename</span> T21, <span class="keyword">typename</span> T22, <span class="keyword">typename</span> T23, <span class="keyword">typename</span> T24, <span class="keyword">typename</span> T25,</div><div class="line"><a name="l04371"></a><span class="lineno"> 4371</span>  <span class="keyword">typename</span> T26, <span class="keyword">typename</span> T27></div><div class="line"><a name="l04372"></a><span class="lineno"> 4372</span> <span class="keyword">struct </span>Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,</div><div class="line"><a name="l04373"></a><span class="lineno"> 4373</span>  T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, internal::None,</div><div class="line"><a name="l04374"></a><span class="lineno"> 4374</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04375"></a><span class="lineno"> 4375</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04376"></a><span class="lineno"> 4376</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04377"></a><span class="lineno"> 4377</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04378"></a><span class="lineno"> 4378</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04379"></a><span class="lineno"> 4379</span>  internal::None, internal::None> {</div><div class="line"><a name="l04380"></a><span class="lineno"> 4380</span>  <span class="keyword">typedef</span> internal::Types27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,</div><div class="line"><a name="l04381"></a><span class="lineno"> 4381</span>  T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,</div><div class="line"><a name="l04382"></a><span class="lineno"> 4382</span>  T27> type;</div><div class="line"><a name="l04383"></a><span class="lineno"> 4383</span> };</div><div class="line"><a name="l04384"></a><span class="lineno"> 4384</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l04385"></a><span class="lineno"> 4385</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l04386"></a><span class="lineno"> 4386</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14, <span class="keyword">typename</span> T15,</div><div class="line"><a name="l04387"></a><span class="lineno"> 4387</span>  <span class="keyword">typename</span> T16, <span class="keyword">typename</span> T17, <span class="keyword">typename</span> T18, <span class="keyword">typename</span> T19, <span class="keyword">typename</span> T20,</div><div class="line"><a name="l04388"></a><span class="lineno"> 4388</span>  <span class="keyword">typename</span> T21, <span class="keyword">typename</span> T22, <span class="keyword">typename</span> T23, <span class="keyword">typename</span> T24, <span class="keyword">typename</span> T25,</div><div class="line"><a name="l04389"></a><span class="lineno"> 4389</span>  <span class="keyword">typename</span> T26, <span class="keyword">typename</span> T27, <span class="keyword">typename</span> T28></div><div class="line"><a name="l04390"></a><span class="lineno"> 4390</span> <span class="keyword">struct </span>Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,</div><div class="line"><a name="l04391"></a><span class="lineno"> 4391</span>  T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,</div><div class="line"><a name="l04392"></a><span class="lineno"> 4392</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04393"></a><span class="lineno"> 4393</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04394"></a><span class="lineno"> 4394</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04395"></a><span class="lineno"> 4395</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04396"></a><span class="lineno"> 4396</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04397"></a><span class="lineno"> 4397</span>  internal::None, internal::None> {</div><div class="line"><a name="l04398"></a><span class="lineno"> 4398</span>  <span class="keyword">typedef</span> internal::Types28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,</div><div class="line"><a name="l04399"></a><span class="lineno"> 4399</span>  T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,</div><div class="line"><a name="l04400"></a><span class="lineno"> 4400</span>  T27, T28> type;</div><div class="line"><a name="l04401"></a><span class="lineno"> 4401</span> };</div><div class="line"><a name="l04402"></a><span class="lineno"> 4402</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l04403"></a><span class="lineno"> 4403</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l04404"></a><span class="lineno"> 4404</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14, <span class="keyword">typename</span> T15,</div><div class="line"><a name="l04405"></a><span class="lineno"> 4405</span>  <span class="keyword">typename</span> T16, <span class="keyword">typename</span> T17, <span class="keyword">typename</span> T18, <span class="keyword">typename</span> T19, <span class="keyword">typename</span> T20,</div><div class="line"><a name="l04406"></a><span class="lineno"> 4406</span>  <span class="keyword">typename</span> T21, <span class="keyword">typename</span> T22, <span class="keyword">typename</span> T23, <span class="keyword">typename</span> T24, <span class="keyword">typename</span> T25,</div><div class="line"><a name="l04407"></a><span class="lineno"> 4407</span>  <span class="keyword">typename</span> T26, <span class="keyword">typename</span> T27, <span class="keyword">typename</span> T28, <span class="keyword">typename</span> T29></div><div class="line"><a name="l04408"></a><span class="lineno"> 4408</span> <span class="keyword">struct </span>Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,</div><div class="line"><a name="l04409"></a><span class="lineno"> 4409</span>  T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,</div><div class="line"><a name="l04410"></a><span class="lineno"> 4410</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04411"></a><span class="lineno"> 4411</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04412"></a><span class="lineno"> 4412</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04413"></a><span class="lineno"> 4413</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04414"></a><span class="lineno"> 4414</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04415"></a><span class="lineno"> 4415</span>  internal::None> {</div><div class="line"><a name="l04416"></a><span class="lineno"> 4416</span>  <span class="keyword">typedef</span> internal::Types29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,</div><div class="line"><a name="l04417"></a><span class="lineno"> 4417</span>  T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,</div><div class="line"><a name="l04418"></a><span class="lineno"> 4418</span>  T27, T28, T29> type;</div><div class="line"><a name="l04419"></a><span class="lineno"> 4419</span> };</div><div class="line"><a name="l04420"></a><span class="lineno"> 4420</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l04421"></a><span class="lineno"> 4421</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l04422"></a><span class="lineno"> 4422</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14, <span class="keyword">typename</span> T15,</div><div class="line"><a name="l04423"></a><span class="lineno"> 4423</span>  <span class="keyword">typename</span> T16, <span class="keyword">typename</span> T17, <span class="keyword">typename</span> T18, <span class="keyword">typename</span> T19, <span class="keyword">typename</span> T20,</div><div class="line"><a name="l04424"></a><span class="lineno"> 4424</span>  <span class="keyword">typename</span> T21, <span class="keyword">typename</span> T22, <span class="keyword">typename</span> T23, <span class="keyword">typename</span> T24, <span class="keyword">typename</span> T25,</div><div class="line"><a name="l04425"></a><span class="lineno"> 4425</span>  <span class="keyword">typename</span> T26, <span class="keyword">typename</span> T27, <span class="keyword">typename</span> T28, <span class="keyword">typename</span> T29, <span class="keyword">typename</span> T30></div><div class="line"><a name="l04426"></a><span class="lineno"> 4426</span> <span class="keyword">struct </span>Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,</div><div class="line"><a name="l04427"></a><span class="lineno"> 4427</span>  T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,</div><div class="line"><a name="l04428"></a><span class="lineno"> 4428</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04429"></a><span class="lineno"> 4429</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04430"></a><span class="lineno"> 4430</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04431"></a><span class="lineno"> 4431</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04432"></a><span class="lineno"> 4432</span>  internal::None, internal::None, internal::None, internal::None> {</div><div class="line"><a name="l04433"></a><span class="lineno"> 4433</span>  <span class="keyword">typedef</span> internal::Types30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,</div><div class="line"><a name="l04434"></a><span class="lineno"> 4434</span>  T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,</div><div class="line"><a name="l04435"></a><span class="lineno"> 4435</span>  T27, T28, T29, T30> type;</div><div class="line"><a name="l04436"></a><span class="lineno"> 4436</span> };</div><div class="line"><a name="l04437"></a><span class="lineno"> 4437</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l04438"></a><span class="lineno"> 4438</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l04439"></a><span class="lineno"> 4439</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14, <span class="keyword">typename</span> T15,</div><div class="line"><a name="l04440"></a><span class="lineno"> 4440</span>  <span class="keyword">typename</span> T16, <span class="keyword">typename</span> T17, <span class="keyword">typename</span> T18, <span class="keyword">typename</span> T19, <span class="keyword">typename</span> T20,</div><div class="line"><a name="l04441"></a><span class="lineno"> 4441</span>  <span class="keyword">typename</span> T21, <span class="keyword">typename</span> T22, <span class="keyword">typename</span> T23, <span class="keyword">typename</span> T24, <span class="keyword">typename</span> T25,</div><div class="line"><a name="l04442"></a><span class="lineno"> 4442</span>  <span class="keyword">typename</span> T26, <span class="keyword">typename</span> T27, <span class="keyword">typename</span> T28, <span class="keyword">typename</span> T29, <span class="keyword">typename</span> T30,</div><div class="line"><a name="l04443"></a><span class="lineno"> 4443</span>  <span class="keyword">typename</span> T31></div><div class="line"><a name="l04444"></a><span class="lineno"> 4444</span> <span class="keyword">struct </span>Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,</div><div class="line"><a name="l04445"></a><span class="lineno"> 4445</span>  T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,</div><div class="line"><a name="l04446"></a><span class="lineno"> 4446</span>  T31, internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04447"></a><span class="lineno"> 4447</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04448"></a><span class="lineno"> 4448</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04449"></a><span class="lineno"> 4449</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04450"></a><span class="lineno"> 4450</span>  internal::None, internal::None, internal::None> {</div><div class="line"><a name="l04451"></a><span class="lineno"> 4451</span>  <span class="keyword">typedef</span> internal::Types31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,</div><div class="line"><a name="l04452"></a><span class="lineno"> 4452</span>  T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,</div><div class="line"><a name="l04453"></a><span class="lineno"> 4453</span>  T27, T28, T29, T30, T31> type;</div><div class="line"><a name="l04454"></a><span class="lineno"> 4454</span> };</div><div class="line"><a name="l04455"></a><span class="lineno"> 4455</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l04456"></a><span class="lineno"> 4456</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l04457"></a><span class="lineno"> 4457</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14, <span class="keyword">typename</span> T15,</div><div class="line"><a name="l04458"></a><span class="lineno"> 4458</span>  <span class="keyword">typename</span> T16, <span class="keyword">typename</span> T17, <span class="keyword">typename</span> T18, <span class="keyword">typename</span> T19, <span class="keyword">typename</span> T20,</div><div class="line"><a name="l04459"></a><span class="lineno"> 4459</span>  <span class="keyword">typename</span> T21, <span class="keyword">typename</span> T22, <span class="keyword">typename</span> T23, <span class="keyword">typename</span> T24, <span class="keyword">typename</span> T25,</div><div class="line"><a name="l04460"></a><span class="lineno"> 4460</span>  <span class="keyword">typename</span> T26, <span class="keyword">typename</span> T27, <span class="keyword">typename</span> T28, <span class="keyword">typename</span> T29, <span class="keyword">typename</span> T30,</div><div class="line"><a name="l04461"></a><span class="lineno"> 4461</span>  <span class="keyword">typename</span> T31, <span class="keyword">typename</span> T32></div><div class="line"><a name="l04462"></a><span class="lineno"> 4462</span> <span class="keyword">struct </span>Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,</div><div class="line"><a name="l04463"></a><span class="lineno"> 4463</span>  T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,</div><div class="line"><a name="l04464"></a><span class="lineno"> 4464</span>  T31, T32, internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04465"></a><span class="lineno"> 4465</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04466"></a><span class="lineno"> 4466</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04467"></a><span class="lineno"> 4467</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04468"></a><span class="lineno"> 4468</span>  internal::None, internal::None> {</div><div class="line"><a name="l04469"></a><span class="lineno"> 4469</span>  <span class="keyword">typedef</span> internal::Types32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,</div><div class="line"><a name="l04470"></a><span class="lineno"> 4470</span>  T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,</div><div class="line"><a name="l04471"></a><span class="lineno"> 4471</span>  T27, T28, T29, T30, T31, T32> type;</div><div class="line"><a name="l04472"></a><span class="lineno"> 4472</span> };</div><div class="line"><a name="l04473"></a><span class="lineno"> 4473</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l04474"></a><span class="lineno"> 4474</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l04475"></a><span class="lineno"> 4475</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14, <span class="keyword">typename</span> T15,</div><div class="line"><a name="l04476"></a><span class="lineno"> 4476</span>  <span class="keyword">typename</span> T16, <span class="keyword">typename</span> T17, <span class="keyword">typename</span> T18, <span class="keyword">typename</span> T19, <span class="keyword">typename</span> T20,</div><div class="line"><a name="l04477"></a><span class="lineno"> 4477</span>  <span class="keyword">typename</span> T21, <span class="keyword">typename</span> T22, <span class="keyword">typename</span> T23, <span class="keyword">typename</span> T24, <span class="keyword">typename</span> T25,</div><div class="line"><a name="l04478"></a><span class="lineno"> 4478</span>  <span class="keyword">typename</span> T26, <span class="keyword">typename</span> T27, <span class="keyword">typename</span> T28, <span class="keyword">typename</span> T29, <span class="keyword">typename</span> T30,</div><div class="line"><a name="l04479"></a><span class="lineno"> 4479</span>  <span class="keyword">typename</span> T31, <span class="keyword">typename</span> T32, <span class="keyword">typename</span> T33></div><div class="line"><a name="l04480"></a><span class="lineno"> 4480</span> <span class="keyword">struct </span>Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,</div><div class="line"><a name="l04481"></a><span class="lineno"> 4481</span>  T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,</div><div class="line"><a name="l04482"></a><span class="lineno"> 4482</span>  T31, T32, T33, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04483"></a><span class="lineno"> 4483</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04484"></a><span class="lineno"> 4484</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04485"></a><span class="lineno"> 4485</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04486"></a><span class="lineno"> 4486</span>  internal::None, internal::None> {</div><div class="line"><a name="l04487"></a><span class="lineno"> 4487</span>  <span class="keyword">typedef</span> internal::Types33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,</div><div class="line"><a name="l04488"></a><span class="lineno"> 4488</span>  T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,</div><div class="line"><a name="l04489"></a><span class="lineno"> 4489</span>  T27, T28, T29, T30, T31, T32, T33> type;</div><div class="line"><a name="l04490"></a><span class="lineno"> 4490</span> };</div><div class="line"><a name="l04491"></a><span class="lineno"> 4491</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l04492"></a><span class="lineno"> 4492</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l04493"></a><span class="lineno"> 4493</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14, <span class="keyword">typename</span> T15,</div><div class="line"><a name="l04494"></a><span class="lineno"> 4494</span>  <span class="keyword">typename</span> T16, <span class="keyword">typename</span> T17, <span class="keyword">typename</span> T18, <span class="keyword">typename</span> T19, <span class="keyword">typename</span> T20,</div><div class="line"><a name="l04495"></a><span class="lineno"> 4495</span>  <span class="keyword">typename</span> T21, <span class="keyword">typename</span> T22, <span class="keyword">typename</span> T23, <span class="keyword">typename</span> T24, <span class="keyword">typename</span> T25,</div><div class="line"><a name="l04496"></a><span class="lineno"> 4496</span>  <span class="keyword">typename</span> T26, <span class="keyword">typename</span> T27, <span class="keyword">typename</span> T28, <span class="keyword">typename</span> T29, <span class="keyword">typename</span> T30,</div><div class="line"><a name="l04497"></a><span class="lineno"> 4497</span>  <span class="keyword">typename</span> T31, <span class="keyword">typename</span> T32, <span class="keyword">typename</span> T33, <span class="keyword">typename</span> T34></div><div class="line"><a name="l04498"></a><span class="lineno"> 4498</span> <span class="keyword">struct </span>Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,</div><div class="line"><a name="l04499"></a><span class="lineno"> 4499</span>  T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,</div><div class="line"><a name="l04500"></a><span class="lineno"> 4500</span>  T31, T32, T33, T34, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04501"></a><span class="lineno"> 4501</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04502"></a><span class="lineno"> 4502</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04503"></a><span class="lineno"> 4503</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04504"></a><span class="lineno"> 4504</span>  internal::None> {</div><div class="line"><a name="l04505"></a><span class="lineno"> 4505</span>  <span class="keyword">typedef</span> internal::Types34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,</div><div class="line"><a name="l04506"></a><span class="lineno"> 4506</span>  T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,</div><div class="line"><a name="l04507"></a><span class="lineno"> 4507</span>  T27, T28, T29, T30, T31, T32, T33, T34> type;</div><div class="line"><a name="l04508"></a><span class="lineno"> 4508</span> };</div><div class="line"><a name="l04509"></a><span class="lineno"> 4509</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l04510"></a><span class="lineno"> 4510</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l04511"></a><span class="lineno"> 4511</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14, <span class="keyword">typename</span> T15,</div><div class="line"><a name="l04512"></a><span class="lineno"> 4512</span>  <span class="keyword">typename</span> T16, <span class="keyword">typename</span> T17, <span class="keyword">typename</span> T18, <span class="keyword">typename</span> T19, <span class="keyword">typename</span> T20,</div><div class="line"><a name="l04513"></a><span class="lineno"> 4513</span>  <span class="keyword">typename</span> T21, <span class="keyword">typename</span> T22, <span class="keyword">typename</span> T23, <span class="keyword">typename</span> T24, <span class="keyword">typename</span> T25,</div><div class="line"><a name="l04514"></a><span class="lineno"> 4514</span>  <span class="keyword">typename</span> T26, <span class="keyword">typename</span> T27, <span class="keyword">typename</span> T28, <span class="keyword">typename</span> T29, <span class="keyword">typename</span> T30,</div><div class="line"><a name="l04515"></a><span class="lineno"> 4515</span>  <span class="keyword">typename</span> T31, <span class="keyword">typename</span> T32, <span class="keyword">typename</span> T33, <span class="keyword">typename</span> T34, <span class="keyword">typename</span> T35></div><div class="line"><a name="l04516"></a><span class="lineno"> 4516</span> <span class="keyword">struct </span>Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,</div><div class="line"><a name="l04517"></a><span class="lineno"> 4517</span>  T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,</div><div class="line"><a name="l04518"></a><span class="lineno"> 4518</span>  T31, T32, T33, T34, T35, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04519"></a><span class="lineno"> 4519</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04520"></a><span class="lineno"> 4520</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04521"></a><span class="lineno"> 4521</span>  internal::None, internal::None, internal::None, internal::None> {</div><div class="line"><a name="l04522"></a><span class="lineno"> 4522</span>  <span class="keyword">typedef</span> internal::Types35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,</div><div class="line"><a name="l04523"></a><span class="lineno"> 4523</span>  T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,</div><div class="line"><a name="l04524"></a><span class="lineno"> 4524</span>  T27, T28, T29, T30, T31, T32, T33, T34, T35> type;</div><div class="line"><a name="l04525"></a><span class="lineno"> 4525</span> };</div><div class="line"><a name="l04526"></a><span class="lineno"> 4526</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l04527"></a><span class="lineno"> 4527</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l04528"></a><span class="lineno"> 4528</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14, <span class="keyword">typename</span> T15,</div><div class="line"><a name="l04529"></a><span class="lineno"> 4529</span>  <span class="keyword">typename</span> T16, <span class="keyword">typename</span> T17, <span class="keyword">typename</span> T18, <span class="keyword">typename</span> T19, <span class="keyword">typename</span> T20,</div><div class="line"><a name="l04530"></a><span class="lineno"> 4530</span>  <span class="keyword">typename</span> T21, <span class="keyword">typename</span> T22, <span class="keyword">typename</span> T23, <span class="keyword">typename</span> T24, <span class="keyword">typename</span> T25,</div><div class="line"><a name="l04531"></a><span class="lineno"> 4531</span>  <span class="keyword">typename</span> T26, <span class="keyword">typename</span> T27, <span class="keyword">typename</span> T28, <span class="keyword">typename</span> T29, <span class="keyword">typename</span> T30,</div><div class="line"><a name="l04532"></a><span class="lineno"> 4532</span>  <span class="keyword">typename</span> T31, <span class="keyword">typename</span> T32, <span class="keyword">typename</span> T33, <span class="keyword">typename</span> T34, <span class="keyword">typename</span> T35,</div><div class="line"><a name="l04533"></a><span class="lineno"> 4533</span>  <span class="keyword">typename</span> T36></div><div class="line"><a name="l04534"></a><span class="lineno"> 4534</span> <span class="keyword">struct </span>Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,</div><div class="line"><a name="l04535"></a><span class="lineno"> 4535</span>  T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,</div><div class="line"><a name="l04536"></a><span class="lineno"> 4536</span>  T31, T32, T33, T34, T35, T36, internal::None, internal::None,</div><div class="line"><a name="l04537"></a><span class="lineno"> 4537</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04538"></a><span class="lineno"> 4538</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04539"></a><span class="lineno"> 4539</span>  internal::None, internal::None, internal::None, internal::None> {</div><div class="line"><a name="l04540"></a><span class="lineno"> 4540</span>  <span class="keyword">typedef</span> internal::Types36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,</div><div class="line"><a name="l04541"></a><span class="lineno"> 4541</span>  T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,</div><div class="line"><a name="l04542"></a><span class="lineno"> 4542</span>  T27, T28, T29, T30, T31, T32, T33, T34, T35, T36> type;</div><div class="line"><a name="l04543"></a><span class="lineno"> 4543</span> };</div><div class="line"><a name="l04544"></a><span class="lineno"> 4544</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l04545"></a><span class="lineno"> 4545</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l04546"></a><span class="lineno"> 4546</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14, <span class="keyword">typename</span> T15,</div><div class="line"><a name="l04547"></a><span class="lineno"> 4547</span>  <span class="keyword">typename</span> T16, <span class="keyword">typename</span> T17, <span class="keyword">typename</span> T18, <span class="keyword">typename</span> T19, <span class="keyword">typename</span> T20,</div><div class="line"><a name="l04548"></a><span class="lineno"> 4548</span>  <span class="keyword">typename</span> T21, <span class="keyword">typename</span> T22, <span class="keyword">typename</span> T23, <span class="keyword">typename</span> T24, <span class="keyword">typename</span> T25,</div><div class="line"><a name="l04549"></a><span class="lineno"> 4549</span>  <span class="keyword">typename</span> T26, <span class="keyword">typename</span> T27, <span class="keyword">typename</span> T28, <span class="keyword">typename</span> T29, <span class="keyword">typename</span> T30,</div><div class="line"><a name="l04550"></a><span class="lineno"> 4550</span>  <span class="keyword">typename</span> T31, <span class="keyword">typename</span> T32, <span class="keyword">typename</span> T33, <span class="keyword">typename</span> T34, <span class="keyword">typename</span> T35,</div><div class="line"><a name="l04551"></a><span class="lineno"> 4551</span>  <span class="keyword">typename</span> T36, <span class="keyword">typename</span> T37></div><div class="line"><a name="l04552"></a><span class="lineno"> 4552</span> <span class="keyword">struct </span>Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,</div><div class="line"><a name="l04553"></a><span class="lineno"> 4553</span>  T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,</div><div class="line"><a name="l04554"></a><span class="lineno"> 4554</span>  T31, T32, T33, T34, T35, T36, T37, internal::None, internal::None,</div><div class="line"><a name="l04555"></a><span class="lineno"> 4555</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04556"></a><span class="lineno"> 4556</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04557"></a><span class="lineno"> 4557</span>  internal::None, internal::None, internal::None> {</div><div class="line"><a name="l04558"></a><span class="lineno"> 4558</span>  <span class="keyword">typedef</span> internal::Types37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,</div><div class="line"><a name="l04559"></a><span class="lineno"> 4559</span>  T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,</div><div class="line"><a name="l04560"></a><span class="lineno"> 4560</span>  T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37> type;</div><div class="line"><a name="l04561"></a><span class="lineno"> 4561</span> };</div><div class="line"><a name="l04562"></a><span class="lineno"> 4562</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l04563"></a><span class="lineno"> 4563</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l04564"></a><span class="lineno"> 4564</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14, <span class="keyword">typename</span> T15,</div><div class="line"><a name="l04565"></a><span class="lineno"> 4565</span>  <span class="keyword">typename</span> T16, <span class="keyword">typename</span> T17, <span class="keyword">typename</span> T18, <span class="keyword">typename</span> T19, <span class="keyword">typename</span> T20,</div><div class="line"><a name="l04566"></a><span class="lineno"> 4566</span>  <span class="keyword">typename</span> T21, <span class="keyword">typename</span> T22, <span class="keyword">typename</span> T23, <span class="keyword">typename</span> T24, <span class="keyword">typename</span> T25,</div><div class="line"><a name="l04567"></a><span class="lineno"> 4567</span>  <span class="keyword">typename</span> T26, <span class="keyword">typename</span> T27, <span class="keyword">typename</span> T28, <span class="keyword">typename</span> T29, <span class="keyword">typename</span> T30,</div><div class="line"><a name="l04568"></a><span class="lineno"> 4568</span>  <span class="keyword">typename</span> T31, <span class="keyword">typename</span> T32, <span class="keyword">typename</span> T33, <span class="keyword">typename</span> T34, <span class="keyword">typename</span> T35,</div><div class="line"><a name="l04569"></a><span class="lineno"> 4569</span>  <span class="keyword">typename</span> T36, <span class="keyword">typename</span> T37, <span class="keyword">typename</span> T38></div><div class="line"><a name="l04570"></a><span class="lineno"> 4570</span> <span class="keyword">struct </span>Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,</div><div class="line"><a name="l04571"></a><span class="lineno"> 4571</span>  T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,</div><div class="line"><a name="l04572"></a><span class="lineno"> 4572</span>  T31, T32, T33, T34, T35, T36, T37, T38, internal::None, internal::None,</div><div class="line"><a name="l04573"></a><span class="lineno"> 4573</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04574"></a><span class="lineno"> 4574</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04575"></a><span class="lineno"> 4575</span>  internal::None, internal::None> {</div><div class="line"><a name="l04576"></a><span class="lineno"> 4576</span>  <span class="keyword">typedef</span> internal::Types38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,</div><div class="line"><a name="l04577"></a><span class="lineno"> 4577</span>  T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,</div><div class="line"><a name="l04578"></a><span class="lineno"> 4578</span>  T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> type;</div><div class="line"><a name="l04579"></a><span class="lineno"> 4579</span> };</div><div class="line"><a name="l04580"></a><span class="lineno"> 4580</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l04581"></a><span class="lineno"> 4581</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l04582"></a><span class="lineno"> 4582</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14, <span class="keyword">typename</span> T15,</div><div class="line"><a name="l04583"></a><span class="lineno"> 4583</span>  <span class="keyword">typename</span> T16, <span class="keyword">typename</span> T17, <span class="keyword">typename</span> T18, <span class="keyword">typename</span> T19, <span class="keyword">typename</span> T20,</div><div class="line"><a name="l04584"></a><span class="lineno"> 4584</span>  <span class="keyword">typename</span> T21, <span class="keyword">typename</span> T22, <span class="keyword">typename</span> T23, <span class="keyword">typename</span> T24, <span class="keyword">typename</span> T25,</div><div class="line"><a name="l04585"></a><span class="lineno"> 4585</span>  <span class="keyword">typename</span> T26, <span class="keyword">typename</span> T27, <span class="keyword">typename</span> T28, <span class="keyword">typename</span> T29, <span class="keyword">typename</span> T30,</div><div class="line"><a name="l04586"></a><span class="lineno"> 4586</span>  <span class="keyword">typename</span> T31, <span class="keyword">typename</span> T32, <span class="keyword">typename</span> T33, <span class="keyword">typename</span> T34, <span class="keyword">typename</span> T35,</div><div class="line"><a name="l04587"></a><span class="lineno"> 4587</span>  <span class="keyword">typename</span> T36, <span class="keyword">typename</span> T37, <span class="keyword">typename</span> T38, <span class="keyword">typename</span> T39></div><div class="line"><a name="l04588"></a><span class="lineno"> 4588</span> <span class="keyword">struct </span>Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,</div><div class="line"><a name="l04589"></a><span class="lineno"> 4589</span>  T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,</div><div class="line"><a name="l04590"></a><span class="lineno"> 4590</span>  T31, T32, T33, T34, T35, T36, T37, T38, T39, internal::None,</div><div class="line"><a name="l04591"></a><span class="lineno"> 4591</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04592"></a><span class="lineno"> 4592</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04593"></a><span class="lineno"> 4593</span>  internal::None, internal::None> {</div><div class="line"><a name="l04594"></a><span class="lineno"> 4594</span>  <span class="keyword">typedef</span> internal::Types39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,</div><div class="line"><a name="l04595"></a><span class="lineno"> 4595</span>  T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,</div><div class="line"><a name="l04596"></a><span class="lineno"> 4596</span>  T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> type;</div><div class="line"><a name="l04597"></a><span class="lineno"> 4597</span> };</div><div class="line"><a name="l04598"></a><span class="lineno"> 4598</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l04599"></a><span class="lineno"> 4599</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l04600"></a><span class="lineno"> 4600</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14, <span class="keyword">typename</span> T15,</div><div class="line"><a name="l04601"></a><span class="lineno"> 4601</span>  <span class="keyword">typename</span> T16, <span class="keyword">typename</span> T17, <span class="keyword">typename</span> T18, <span class="keyword">typename</span> T19, <span class="keyword">typename</span> T20,</div><div class="line"><a name="l04602"></a><span class="lineno"> 4602</span>  <span class="keyword">typename</span> T21, <span class="keyword">typename</span> T22, <span class="keyword">typename</span> T23, <span class="keyword">typename</span> T24, <span class="keyword">typename</span> T25,</div><div class="line"><a name="l04603"></a><span class="lineno"> 4603</span>  <span class="keyword">typename</span> T26, <span class="keyword">typename</span> T27, <span class="keyword">typename</span> T28, <span class="keyword">typename</span> T29, <span class="keyword">typename</span> T30,</div><div class="line"><a name="l04604"></a><span class="lineno"> 4604</span>  <span class="keyword">typename</span> T31, <span class="keyword">typename</span> T32, <span class="keyword">typename</span> T33, <span class="keyword">typename</span> T34, <span class="keyword">typename</span> T35,</div><div class="line"><a name="l04605"></a><span class="lineno"> 4605</span>  <span class="keyword">typename</span> T36, <span class="keyword">typename</span> T37, <span class="keyword">typename</span> T38, <span class="keyword">typename</span> T39, <span class="keyword">typename</span> T40></div><div class="line"><a name="l04606"></a><span class="lineno"> 4606</span> <span class="keyword">struct </span>Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,</div><div class="line"><a name="l04607"></a><span class="lineno"> 4607</span>  T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,</div><div class="line"><a name="l04608"></a><span class="lineno"> 4608</span>  T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, internal::None,</div><div class="line"><a name="l04609"></a><span class="lineno"> 4609</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04610"></a><span class="lineno"> 4610</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04611"></a><span class="lineno"> 4611</span>  internal::None> {</div><div class="line"><a name="l04612"></a><span class="lineno"> 4612</span>  <span class="keyword">typedef</span> internal::Types40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,</div><div class="line"><a name="l04613"></a><span class="lineno"> 4613</span>  T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,</div><div class="line"><a name="l04614"></a><span class="lineno"> 4614</span>  T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,</div><div class="line"><a name="l04615"></a><span class="lineno"> 4615</span>  T40> type;</div><div class="line"><a name="l04616"></a><span class="lineno"> 4616</span> };</div><div class="line"><a name="l04617"></a><span class="lineno"> 4617</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l04618"></a><span class="lineno"> 4618</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l04619"></a><span class="lineno"> 4619</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14, <span class="keyword">typename</span> T15,</div><div class="line"><a name="l04620"></a><span class="lineno"> 4620</span>  <span class="keyword">typename</span> T16, <span class="keyword">typename</span> T17, <span class="keyword">typename</span> T18, <span class="keyword">typename</span> T19, <span class="keyword">typename</span> T20,</div><div class="line"><a name="l04621"></a><span class="lineno"> 4621</span>  <span class="keyword">typename</span> T21, <span class="keyword">typename</span> T22, <span class="keyword">typename</span> T23, <span class="keyword">typename</span> T24, <span class="keyword">typename</span> T25,</div><div class="line"><a name="l04622"></a><span class="lineno"> 4622</span>  <span class="keyword">typename</span> T26, <span class="keyword">typename</span> T27, <span class="keyword">typename</span> T28, <span class="keyword">typename</span> T29, <span class="keyword">typename</span> T30,</div><div class="line"><a name="l04623"></a><span class="lineno"> 4623</span>  <span class="keyword">typename</span> T31, <span class="keyword">typename</span> T32, <span class="keyword">typename</span> T33, <span class="keyword">typename</span> T34, <span class="keyword">typename</span> T35,</div><div class="line"><a name="l04624"></a><span class="lineno"> 4624</span>  <span class="keyword">typename</span> T36, <span class="keyword">typename</span> T37, <span class="keyword">typename</span> T38, <span class="keyword">typename</span> T39, <span class="keyword">typename</span> T40,</div><div class="line"><a name="l04625"></a><span class="lineno"> 4625</span>  <span class="keyword">typename</span> T41></div><div class="line"><a name="l04626"></a><span class="lineno"> 4626</span> <span class="keyword">struct </span>Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,</div><div class="line"><a name="l04627"></a><span class="lineno"> 4627</span>  T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,</div><div class="line"><a name="l04628"></a><span class="lineno"> 4628</span>  T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, internal::None,</div><div class="line"><a name="l04629"></a><span class="lineno"> 4629</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04630"></a><span class="lineno"> 4630</span>  internal::None, internal::None, internal::None, internal::None> {</div><div class="line"><a name="l04631"></a><span class="lineno"> 4631</span>  <span class="keyword">typedef</span> internal::Types41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,</div><div class="line"><a name="l04632"></a><span class="lineno"> 4632</span>  T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,</div><div class="line"><a name="l04633"></a><span class="lineno"> 4633</span>  T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,</div><div class="line"><a name="l04634"></a><span class="lineno"> 4634</span>  T41> type;</div><div class="line"><a name="l04635"></a><span class="lineno"> 4635</span> };</div><div class="line"><a name="l04636"></a><span class="lineno"> 4636</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l04637"></a><span class="lineno"> 4637</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l04638"></a><span class="lineno"> 4638</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14, <span class="keyword">typename</span> T15,</div><div class="line"><a name="l04639"></a><span class="lineno"> 4639</span>  <span class="keyword">typename</span> T16, <span class="keyword">typename</span> T17, <span class="keyword">typename</span> T18, <span class="keyword">typename</span> T19, <span class="keyword">typename</span> T20,</div><div class="line"><a name="l04640"></a><span class="lineno"> 4640</span>  <span class="keyword">typename</span> T21, <span class="keyword">typename</span> T22, <span class="keyword">typename</span> T23, <span class="keyword">typename</span> T24, <span class="keyword">typename</span> T25,</div><div class="line"><a name="l04641"></a><span class="lineno"> 4641</span>  <span class="keyword">typename</span> T26, <span class="keyword">typename</span> T27, <span class="keyword">typename</span> T28, <span class="keyword">typename</span> T29, <span class="keyword">typename</span> T30,</div><div class="line"><a name="l04642"></a><span class="lineno"> 4642</span>  <span class="keyword">typename</span> T31, <span class="keyword">typename</span> T32, <span class="keyword">typename</span> T33, <span class="keyword">typename</span> T34, <span class="keyword">typename</span> T35,</div><div class="line"><a name="l04643"></a><span class="lineno"> 4643</span>  <span class="keyword">typename</span> T36, <span class="keyword">typename</span> T37, <span class="keyword">typename</span> T38, <span class="keyword">typename</span> T39, <span class="keyword">typename</span> T40,</div><div class="line"><a name="l04644"></a><span class="lineno"> 4644</span>  <span class="keyword">typename</span> T41, <span class="keyword">typename</span> T42></div><div class="line"><a name="l04645"></a><span class="lineno"> 4645</span> <span class="keyword">struct </span>Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,</div><div class="line"><a name="l04646"></a><span class="lineno"> 4646</span>  T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,</div><div class="line"><a name="l04647"></a><span class="lineno"> 4647</span>  T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, internal::None,</div><div class="line"><a name="l04648"></a><span class="lineno"> 4648</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04649"></a><span class="lineno"> 4649</span>  internal::None, internal::None, internal::None> {</div><div class="line"><a name="l04650"></a><span class="lineno"> 4650</span>  <span class="keyword">typedef</span> internal::Types42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,</div><div class="line"><a name="l04651"></a><span class="lineno"> 4651</span>  T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,</div><div class="line"><a name="l04652"></a><span class="lineno"> 4652</span>  T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,</div><div class="line"><a name="l04653"></a><span class="lineno"> 4653</span>  T41, T42> type;</div><div class="line"><a name="l04654"></a><span class="lineno"> 4654</span> };</div><div class="line"><a name="l04655"></a><span class="lineno"> 4655</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l04656"></a><span class="lineno"> 4656</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l04657"></a><span class="lineno"> 4657</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14, <span class="keyword">typename</span> T15,</div><div class="line"><a name="l04658"></a><span class="lineno"> 4658</span>  <span class="keyword">typename</span> T16, <span class="keyword">typename</span> T17, <span class="keyword">typename</span> T18, <span class="keyword">typename</span> T19, <span class="keyword">typename</span> T20,</div><div class="line"><a name="l04659"></a><span class="lineno"> 4659</span>  <span class="keyword">typename</span> T21, <span class="keyword">typename</span> T22, <span class="keyword">typename</span> T23, <span class="keyword">typename</span> T24, <span class="keyword">typename</span> T25,</div><div class="line"><a name="l04660"></a><span class="lineno"> 4660</span>  <span class="keyword">typename</span> T26, <span class="keyword">typename</span> T27, <span class="keyword">typename</span> T28, <span class="keyword">typename</span> T29, <span class="keyword">typename</span> T30,</div><div class="line"><a name="l04661"></a><span class="lineno"> 4661</span>  <span class="keyword">typename</span> T31, <span class="keyword">typename</span> T32, <span class="keyword">typename</span> T33, <span class="keyword">typename</span> T34, <span class="keyword">typename</span> T35,</div><div class="line"><a name="l04662"></a><span class="lineno"> 4662</span>  <span class="keyword">typename</span> T36, <span class="keyword">typename</span> T37, <span class="keyword">typename</span> T38, <span class="keyword">typename</span> T39, <span class="keyword">typename</span> T40,</div><div class="line"><a name="l04663"></a><span class="lineno"> 4663</span>  <span class="keyword">typename</span> T41, <span class="keyword">typename</span> T42, <span class="keyword">typename</span> T43></div><div class="line"><a name="l04664"></a><span class="lineno"> 4664</span> <span class="keyword">struct </span>Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,</div><div class="line"><a name="l04665"></a><span class="lineno"> 4665</span>  T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,</div><div class="line"><a name="l04666"></a><span class="lineno"> 4666</span>  T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,</div><div class="line"><a name="l04667"></a><span class="lineno"> 4667</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04668"></a><span class="lineno"> 4668</span>  internal::None, internal::None, internal::None> {</div><div class="line"><a name="l04669"></a><span class="lineno"> 4669</span>  <span class="keyword">typedef</span> internal::Types43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,</div><div class="line"><a name="l04670"></a><span class="lineno"> 4670</span>  T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,</div><div class="line"><a name="l04671"></a><span class="lineno"> 4671</span>  T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,</div><div class="line"><a name="l04672"></a><span class="lineno"> 4672</span>  T41, T42, T43> type;</div><div class="line"><a name="l04673"></a><span class="lineno"> 4673</span> };</div><div class="line"><a name="l04674"></a><span class="lineno"> 4674</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l04675"></a><span class="lineno"> 4675</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l04676"></a><span class="lineno"> 4676</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14, <span class="keyword">typename</span> T15,</div><div class="line"><a name="l04677"></a><span class="lineno"> 4677</span>  <span class="keyword">typename</span> T16, <span class="keyword">typename</span> T17, <span class="keyword">typename</span> T18, <span class="keyword">typename</span> T19, <span class="keyword">typename</span> T20,</div><div class="line"><a name="l04678"></a><span class="lineno"> 4678</span>  <span class="keyword">typename</span> T21, <span class="keyword">typename</span> T22, <span class="keyword">typename</span> T23, <span class="keyword">typename</span> T24, <span class="keyword">typename</span> T25,</div><div class="line"><a name="l04679"></a><span class="lineno"> 4679</span>  <span class="keyword">typename</span> T26, <span class="keyword">typename</span> T27, <span class="keyword">typename</span> T28, <span class="keyword">typename</span> T29, <span class="keyword">typename</span> T30,</div><div class="line"><a name="l04680"></a><span class="lineno"> 4680</span>  <span class="keyword">typename</span> T31, <span class="keyword">typename</span> T32, <span class="keyword">typename</span> T33, <span class="keyword">typename</span> T34, <span class="keyword">typename</span> T35,</div><div class="line"><a name="l04681"></a><span class="lineno"> 4681</span>  <span class="keyword">typename</span> T36, <span class="keyword">typename</span> T37, <span class="keyword">typename</span> T38, <span class="keyword">typename</span> T39, <span class="keyword">typename</span> T40,</div><div class="line"><a name="l04682"></a><span class="lineno"> 4682</span>  <span class="keyword">typename</span> T41, <span class="keyword">typename</span> T42, <span class="keyword">typename</span> T43, <span class="keyword">typename</span> T44></div><div class="line"><a name="l04683"></a><span class="lineno"> 4683</span> <span class="keyword">struct </span>Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,</div><div class="line"><a name="l04684"></a><span class="lineno"> 4684</span>  T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,</div><div class="line"><a name="l04685"></a><span class="lineno"> 4685</span>  T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,</div><div class="line"><a name="l04686"></a><span class="lineno"> 4686</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04687"></a><span class="lineno"> 4687</span>  internal::None, internal::None> {</div><div class="line"><a name="l04688"></a><span class="lineno"> 4688</span>  <span class="keyword">typedef</span> internal::Types44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,</div><div class="line"><a name="l04689"></a><span class="lineno"> 4689</span>  T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,</div><div class="line"><a name="l04690"></a><span class="lineno"> 4690</span>  T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,</div><div class="line"><a name="l04691"></a><span class="lineno"> 4691</span>  T41, T42, T43, T44> type;</div><div class="line"><a name="l04692"></a><span class="lineno"> 4692</span> };</div><div class="line"><a name="l04693"></a><span class="lineno"> 4693</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l04694"></a><span class="lineno"> 4694</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l04695"></a><span class="lineno"> 4695</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14, <span class="keyword">typename</span> T15,</div><div class="line"><a name="l04696"></a><span class="lineno"> 4696</span>  <span class="keyword">typename</span> T16, <span class="keyword">typename</span> T17, <span class="keyword">typename</span> T18, <span class="keyword">typename</span> T19, <span class="keyword">typename</span> T20,</div><div class="line"><a name="l04697"></a><span class="lineno"> 4697</span>  <span class="keyword">typename</span> T21, <span class="keyword">typename</span> T22, <span class="keyword">typename</span> T23, <span class="keyword">typename</span> T24, <span class="keyword">typename</span> T25,</div><div class="line"><a name="l04698"></a><span class="lineno"> 4698</span>  <span class="keyword">typename</span> T26, <span class="keyword">typename</span> T27, <span class="keyword">typename</span> T28, <span class="keyword">typename</span> T29, <span class="keyword">typename</span> T30,</div><div class="line"><a name="l04699"></a><span class="lineno"> 4699</span>  <span class="keyword">typename</span> T31, <span class="keyword">typename</span> T32, <span class="keyword">typename</span> T33, <span class="keyword">typename</span> T34, <span class="keyword">typename</span> T35,</div><div class="line"><a name="l04700"></a><span class="lineno"> 4700</span>  <span class="keyword">typename</span> T36, <span class="keyword">typename</span> T37, <span class="keyword">typename</span> T38, <span class="keyword">typename</span> T39, <span class="keyword">typename</span> T40,</div><div class="line"><a name="l04701"></a><span class="lineno"> 4701</span>  <span class="keyword">typename</span> T41, <span class="keyword">typename</span> T42, <span class="keyword">typename</span> T43, <span class="keyword">typename</span> T44, <span class="keyword">typename</span> T45></div><div class="line"><a name="l04702"></a><span class="lineno"> 4702</span> <span class="keyword">struct </span>Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,</div><div class="line"><a name="l04703"></a><span class="lineno"> 4703</span>  T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,</div><div class="line"><a name="l04704"></a><span class="lineno"> 4704</span>  T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,</div><div class="line"><a name="l04705"></a><span class="lineno"> 4705</span>  internal::None, internal::None, internal::None, internal::None,</div><div class="line"><a name="l04706"></a><span class="lineno"> 4706</span>  internal::None> {</div><div class="line"><a name="l04707"></a><span class="lineno"> 4707</span>  <span class="keyword">typedef</span> internal::Types45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,</div><div class="line"><a name="l04708"></a><span class="lineno"> 4708</span>  T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,</div><div class="line"><a name="l04709"></a><span class="lineno"> 4709</span>  T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,</div><div class="line"><a name="l04710"></a><span class="lineno"> 4710</span>  T41, T42, T43, T44, T45> type;</div><div class="line"><a name="l04711"></a><span class="lineno"> 4711</span> };</div><div class="line"><a name="l04712"></a><span class="lineno"> 4712</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l04713"></a><span class="lineno"> 4713</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l04714"></a><span class="lineno"> 4714</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14, <span class="keyword">typename</span> T15,</div><div class="line"><a name="l04715"></a><span class="lineno"> 4715</span>  <span class="keyword">typename</span> T16, <span class="keyword">typename</span> T17, <span class="keyword">typename</span> T18, <span class="keyword">typename</span> T19, <span class="keyword">typename</span> T20,</div><div class="line"><a name="l04716"></a><span class="lineno"> 4716</span>  <span class="keyword">typename</span> T21, <span class="keyword">typename</span> T22, <span class="keyword">typename</span> T23, <span class="keyword">typename</span> T24, <span class="keyword">typename</span> T25,</div><div class="line"><a name="l04717"></a><span class="lineno"> 4717</span>  <span class="keyword">typename</span> T26, <span class="keyword">typename</span> T27, <span class="keyword">typename</span> T28, <span class="keyword">typename</span> T29, <span class="keyword">typename</span> T30,</div><div class="line"><a name="l04718"></a><span class="lineno"> 4718</span>  <span class="keyword">typename</span> T31, <span class="keyword">typename</span> T32, <span class="keyword">typename</span> T33, <span class="keyword">typename</span> T34, <span class="keyword">typename</span> T35,</div><div class="line"><a name="l04719"></a><span class="lineno"> 4719</span>  <span class="keyword">typename</span> T36, <span class="keyword">typename</span> T37, <span class="keyword">typename</span> T38, <span class="keyword">typename</span> T39, <span class="keyword">typename</span> T40,</div><div class="line"><a name="l04720"></a><span class="lineno"> 4720</span>  <span class="keyword">typename</span> T41, <span class="keyword">typename</span> T42, <span class="keyword">typename</span> T43, <span class="keyword">typename</span> T44, <span class="keyword">typename</span> T45,</div><div class="line"><a name="l04721"></a><span class="lineno"> 4721</span>  <span class="keyword">typename</span> T46></div><div class="line"><a name="l04722"></a><span class="lineno"> 4722</span> <span class="keyword">struct </span>Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,</div><div class="line"><a name="l04723"></a><span class="lineno"> 4723</span>  T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,</div><div class="line"><a name="l04724"></a><span class="lineno"> 4724</span>  T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,</div><div class="line"><a name="l04725"></a><span class="lineno"> 4725</span>  T46, internal::None, internal::None, internal::None, internal::None> {</div><div class="line"><a name="l04726"></a><span class="lineno"> 4726</span>  <span class="keyword">typedef</span> internal::Types46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,</div><div class="line"><a name="l04727"></a><span class="lineno"> 4727</span>  T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,</div><div class="line"><a name="l04728"></a><span class="lineno"> 4728</span>  T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,</div><div class="line"><a name="l04729"></a><span class="lineno"> 4729</span>  T41, T42, T43, T44, T45, T46> type;</div><div class="line"><a name="l04730"></a><span class="lineno"> 4730</span> };</div><div class="line"><a name="l04731"></a><span class="lineno"> 4731</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l04732"></a><span class="lineno"> 4732</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l04733"></a><span class="lineno"> 4733</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14, <span class="keyword">typename</span> T15,</div><div class="line"><a name="l04734"></a><span class="lineno"> 4734</span>  <span class="keyword">typename</span> T16, <span class="keyword">typename</span> T17, <span class="keyword">typename</span> T18, <span class="keyword">typename</span> T19, <span class="keyword">typename</span> T20,</div><div class="line"><a name="l04735"></a><span class="lineno"> 4735</span>  <span class="keyword">typename</span> T21, <span class="keyword">typename</span> T22, <span class="keyword">typename</span> T23, <span class="keyword">typename</span> T24, <span class="keyword">typename</span> T25,</div><div class="line"><a name="l04736"></a><span class="lineno"> 4736</span>  <span class="keyword">typename</span> T26, <span class="keyword">typename</span> T27, <span class="keyword">typename</span> T28, <span class="keyword">typename</span> T29, <span class="keyword">typename</span> T30,</div><div class="line"><a name="l04737"></a><span class="lineno"> 4737</span>  <span class="keyword">typename</span> T31, <span class="keyword">typename</span> T32, <span class="keyword">typename</span> T33, <span class="keyword">typename</span> T34, <span class="keyword">typename</span> T35,</div><div class="line"><a name="l04738"></a><span class="lineno"> 4738</span>  <span class="keyword">typename</span> T36, <span class="keyword">typename</span> T37, <span class="keyword">typename</span> T38, <span class="keyword">typename</span> T39, <span class="keyword">typename</span> T40,</div><div class="line"><a name="l04739"></a><span class="lineno"> 4739</span>  <span class="keyword">typename</span> T41, <span class="keyword">typename</span> T42, <span class="keyword">typename</span> T43, <span class="keyword">typename</span> T44, <span class="keyword">typename</span> T45,</div><div class="line"><a name="l04740"></a><span class="lineno"> 4740</span>  <span class="keyword">typename</span> T46, <span class="keyword">typename</span> T47></div><div class="line"><a name="l04741"></a><span class="lineno"> 4741</span> <span class="keyword">struct </span>Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,</div><div class="line"><a name="l04742"></a><span class="lineno"> 4742</span>  T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,</div><div class="line"><a name="l04743"></a><span class="lineno"> 4743</span>  T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,</div><div class="line"><a name="l04744"></a><span class="lineno"> 4744</span>  T46, T47, internal::None, internal::None, internal::None> {</div><div class="line"><a name="l04745"></a><span class="lineno"> 4745</span>  <span class="keyword">typedef</span> internal::Types47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,</div><div class="line"><a name="l04746"></a><span class="lineno"> 4746</span>  T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,</div><div class="line"><a name="l04747"></a><span class="lineno"> 4747</span>  T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,</div><div class="line"><a name="l04748"></a><span class="lineno"> 4748</span>  T41, T42, T43, T44, T45, T46, T47> type;</div><div class="line"><a name="l04749"></a><span class="lineno"> 4749</span> };</div><div class="line"><a name="l04750"></a><span class="lineno"> 4750</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l04751"></a><span class="lineno"> 4751</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l04752"></a><span class="lineno"> 4752</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14, <span class="keyword">typename</span> T15,</div><div class="line"><a name="l04753"></a><span class="lineno"> 4753</span>  <span class="keyword">typename</span> T16, <span class="keyword">typename</span> T17, <span class="keyword">typename</span> T18, <span class="keyword">typename</span> T19, <span class="keyword">typename</span> T20,</div><div class="line"><a name="l04754"></a><span class="lineno"> 4754</span>  <span class="keyword">typename</span> T21, <span class="keyword">typename</span> T22, <span class="keyword">typename</span> T23, <span class="keyword">typename</span> T24, <span class="keyword">typename</span> T25,</div><div class="line"><a name="l04755"></a><span class="lineno"> 4755</span>  <span class="keyword">typename</span> T26, <span class="keyword">typename</span> T27, <span class="keyword">typename</span> T28, <span class="keyword">typename</span> T29, <span class="keyword">typename</span> T30,</div><div class="line"><a name="l04756"></a><span class="lineno"> 4756</span>  <span class="keyword">typename</span> T31, <span class="keyword">typename</span> T32, <span class="keyword">typename</span> T33, <span class="keyword">typename</span> T34, <span class="keyword">typename</span> T35,</div><div class="line"><a name="l04757"></a><span class="lineno"> 4757</span>  <span class="keyword">typename</span> T36, <span class="keyword">typename</span> T37, <span class="keyword">typename</span> T38, <span class="keyword">typename</span> T39, <span class="keyword">typename</span> T40,</div><div class="line"><a name="l04758"></a><span class="lineno"> 4758</span>  <span class="keyword">typename</span> T41, <span class="keyword">typename</span> T42, <span class="keyword">typename</span> T43, <span class="keyword">typename</span> T44, <span class="keyword">typename</span> T45,</div><div class="line"><a name="l04759"></a><span class="lineno"> 4759</span>  <span class="keyword">typename</span> T46, <span class="keyword">typename</span> T47, <span class="keyword">typename</span> T48></div><div class="line"><a name="l04760"></a><span class="lineno"> 4760</span> <span class="keyword">struct </span>Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,</div><div class="line"><a name="l04761"></a><span class="lineno"> 4761</span>  T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,</div><div class="line"><a name="l04762"></a><span class="lineno"> 4762</span>  T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,</div><div class="line"><a name="l04763"></a><span class="lineno"> 4763</span>  T46, T47, T48, internal::None, internal::None> {</div><div class="line"><a name="l04764"></a><span class="lineno"> 4764</span>  <span class="keyword">typedef</span> internal::Types48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,</div><div class="line"><a name="l04765"></a><span class="lineno"> 4765</span>  T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,</div><div class="line"><a name="l04766"></a><span class="lineno"> 4766</span>  T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,</div><div class="line"><a name="l04767"></a><span class="lineno"> 4767</span>  T41, T42, T43, T44, T45, T46, T47, T48> type;</div><div class="line"><a name="l04768"></a><span class="lineno"> 4768</span> };</div><div class="line"><a name="l04769"></a><span class="lineno"> 4769</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l04770"></a><span class="lineno"> 4770</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l04771"></a><span class="lineno"> 4771</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14, <span class="keyword">typename</span> T15,</div><div class="line"><a name="l04772"></a><span class="lineno"> 4772</span>  <span class="keyword">typename</span> T16, <span class="keyword">typename</span> T17, <span class="keyword">typename</span> T18, <span class="keyword">typename</span> T19, <span class="keyword">typename</span> T20,</div><div class="line"><a name="l04773"></a><span class="lineno"> 4773</span>  <span class="keyword">typename</span> T21, <span class="keyword">typename</span> T22, <span class="keyword">typename</span> T23, <span class="keyword">typename</span> T24, <span class="keyword">typename</span> T25,</div><div class="line"><a name="l04774"></a><span class="lineno"> 4774</span>  <span class="keyword">typename</span> T26, <span class="keyword">typename</span> T27, <span class="keyword">typename</span> T28, <span class="keyword">typename</span> T29, <span class="keyword">typename</span> T30,</div><div class="line"><a name="l04775"></a><span class="lineno"> 4775</span>  <span class="keyword">typename</span> T31, <span class="keyword">typename</span> T32, <span class="keyword">typename</span> T33, <span class="keyword">typename</span> T34, <span class="keyword">typename</span> T35,</div><div class="line"><a name="l04776"></a><span class="lineno"> 4776</span>  <span class="keyword">typename</span> T36, <span class="keyword">typename</span> T37, <span class="keyword">typename</span> T38, <span class="keyword">typename</span> T39, <span class="keyword">typename</span> T40,</div><div class="line"><a name="l04777"></a><span class="lineno"> 4777</span>  <span class="keyword">typename</span> T41, <span class="keyword">typename</span> T42, <span class="keyword">typename</span> T43, <span class="keyword">typename</span> T44, <span class="keyword">typename</span> T45,</div><div class="line"><a name="l04778"></a><span class="lineno"> 4778</span>  <span class="keyword">typename</span> T46, <span class="keyword">typename</span> T47, <span class="keyword">typename</span> T48, <span class="keyword">typename</span> T49></div><div class="line"><a name="l04779"></a><span class="lineno"> 4779</span> <span class="keyword">struct </span>Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,</div><div class="line"><a name="l04780"></a><span class="lineno"> 4780</span>  T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,</div><div class="line"><a name="l04781"></a><span class="lineno"> 4781</span>  T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,</div><div class="line"><a name="l04782"></a><span class="lineno"> 4782</span>  T46, T47, T48, T49, internal::None> {</div><div class="line"><a name="l04783"></a><span class="lineno"> 4783</span>  <span class="keyword">typedef</span> internal::Types49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,</div><div class="line"><a name="l04784"></a><span class="lineno"> 4784</span>  T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,</div><div class="line"><a name="l04785"></a><span class="lineno"> 4785</span>  T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,</div><div class="line"><a name="l04786"></a><span class="lineno"> 4786</span>  T41, T42, T43, T44, T45, T46, T47, T48, T49> type;</div><div class="line"><a name="l04787"></a><span class="lineno"> 4787</span> };</div><div class="line"><a name="l04788"></a><span class="lineno"> 4788</span> </div><div class="line"><a name="l04789"></a><span class="lineno"> 4789</span> <span class="keyword">namespace </span>internal {</div><div class="line"><a name="l04790"></a><span class="lineno"> 4790</span> </div><div class="line"><a name="l04791"></a><span class="lineno"> 4791</span> <span class="preprocessor"># define GTEST_TEMPLATE_ template <typename T> class</span></div><div class="line"><a name="l04792"></a><span class="lineno"> 4792</span> </div><div class="line"><a name="l04793"></a><span class="lineno"> 4793</span> <span class="comment">// The template "selector" struct TemplateSel<Tmpl> is used to</span></div><div class="line"><a name="l04794"></a><span class="lineno"> 4794</span> <span class="comment">// represent Tmpl, which must be a class template with one type</span></div><div class="line"><a name="l04795"></a><span class="lineno"> 4795</span> <span class="comment">// parameter, as a type. TemplateSel<Tmpl>::Bind<T>::type is defined</span></div><div class="line"><a name="l04796"></a><span class="lineno"> 4796</span> <span class="comment">// as the type Tmpl<T>. This allows us to actually instantiate the</span></div><div class="line"><a name="l04797"></a><span class="lineno"> 4797</span> <span class="comment">// template "selected" by TemplateSel<Tmpl>.</span></div><div class="line"><a name="l04798"></a><span class="lineno"> 4798</span> <span class="comment">//</span></div><div class="line"><a name="l04799"></a><span class="lineno"> 4799</span> <span class="comment">// This trick is necessary for simulating typedef for class templates,</span></div><div class="line"><a name="l04800"></a><span class="lineno"> 4800</span> <span class="comment">// which C++ doesn't support directly.</span></div><div class="line"><a name="l04801"></a><span class="lineno"> 4801</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ Tmpl></div><div class="line"><a name="l04802"></a><span class="lineno"> 4802</span> <span class="keyword">struct </span>TemplateSel {</div><div class="line"><a name="l04803"></a><span class="lineno"> 4803</span>  <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l04804"></a><span class="lineno"> 4804</span>  <span class="keyword">struct </span>Bind {</div><div class="line"><a name="l04805"></a><span class="lineno"> 4805</span>  <span class="keyword">typedef</span> Tmpl<T> type;</div><div class="line"><a name="l04806"></a><span class="lineno"> 4806</span>  };</div><div class="line"><a name="l04807"></a><span class="lineno"> 4807</span> };</div><div class="line"><a name="l04808"></a><span class="lineno"> 4808</span> </div><div class="line"><a name="l04809"></a><span class="lineno"> 4809</span> <span class="preprocessor"># define GTEST_BIND_(TmplSel, T) \</span></div><div class="line"><a name="l04810"></a><span class="lineno"> 4810</span> <span class="preprocessor"> TmplSel::template Bind<T>::type</span></div><div class="line"><a name="l04811"></a><span class="lineno"> 4811</span> </div><div class="line"><a name="l04812"></a><span class="lineno"> 4812</span> <span class="comment">// A unique struct template used as the default value for the</span></div><div class="line"><a name="l04813"></a><span class="lineno"> 4813</span> <span class="comment">// arguments of class template Templates. This allows us to simulate</span></div><div class="line"><a name="l04814"></a><span class="lineno"> 4814</span> <span class="comment">// variadic templates (e.g. Templates<int>, Templates<int, double>,</span></div><div class="line"><a name="l04815"></a><span class="lineno"> 4815</span> <span class="comment">// and etc), which C++ doesn't support directly.</span></div><div class="line"><a name="l04816"></a><span class="lineno"> 4816</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l04817"></a><span class="lineno"> 4817</span> <span class="keyword">struct </span>NoneT {};</div><div class="line"><a name="l04818"></a><span class="lineno"> 4818</span> </div><div class="line"><a name="l04819"></a><span class="lineno"> 4819</span> <span class="comment">// The following family of struct and struct templates are used to</span></div><div class="line"><a name="l04820"></a><span class="lineno"> 4820</span> <span class="comment">// represent template lists. In particular, TemplatesN<T1, T2, ...,</span></div><div class="line"><a name="l04821"></a><span class="lineno"> 4821</span> <span class="comment">// TN> represents a list of N templates (T1, T2, ..., and TN). Except</span></div><div class="line"><a name="l04822"></a><span class="lineno"> 4822</span> <span class="comment">// for Templates0, every struct in the family has two member types:</span></div><div class="line"><a name="l04823"></a><span class="lineno"> 4823</span> <span class="comment">// Head for the selector of the first template in the list, and Tail</span></div><div class="line"><a name="l04824"></a><span class="lineno"> 4824</span> <span class="comment">// for the rest of the list.</span></div><div class="line"><a name="l04825"></a><span class="lineno"> 4825</span> </div><div class="line"><a name="l04826"></a><span class="lineno"> 4826</span> <span class="comment">// The empty template list.</span></div><div class="line"><a name="l04827"></a><span class="lineno"> 4827</span> <span class="keyword">struct </span>Templates0 {};</div><div class="line"><a name="l04828"></a><span class="lineno"> 4828</span> </div><div class="line"><a name="l04829"></a><span class="lineno"> 4829</span> <span class="comment">// Template lists of length 1, 2, 3, and so on.</span></div><div class="line"><a name="l04830"></a><span class="lineno"> 4830</span> </div><div class="line"><a name="l04831"></a><span class="lineno"> 4831</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1></div><div class="line"><a name="l04832"></a><span class="lineno"> 4832</span> <span class="keyword">struct </span>Templates1 {</div><div class="line"><a name="l04833"></a><span class="lineno"> 4833</span>  <span class="keyword">typedef</span> TemplateSel<T1> Head;</div><div class="line"><a name="l04834"></a><span class="lineno"> 4834</span>  <span class="keyword">typedef</span> Templates0 Tail;</div><div class="line"><a name="l04835"></a><span class="lineno"> 4835</span> };</div><div class="line"><a name="l04836"></a><span class="lineno"> 4836</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2></div><div class="line"><a name="l04837"></a><span class="lineno"> 4837</span> <span class="keyword">struct </span>Templates2 {</div><div class="line"><a name="l04838"></a><span class="lineno"> 4838</span>  <span class="keyword">typedef</span> TemplateSel<T1> Head;</div><div class="line"><a name="l04839"></a><span class="lineno"> 4839</span>  <span class="keyword">typedef</span> Templates1<T2> Tail;</div><div class="line"><a name="l04840"></a><span class="lineno"> 4840</span> };</div><div class="line"><a name="l04841"></a><span class="lineno"> 4841</span> </div><div class="line"><a name="l04842"></a><span class="lineno"> 4842</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3></div><div class="line"><a name="l04843"></a><span class="lineno"> 4843</span> <span class="keyword">struct </span>Templates3 {</div><div class="line"><a name="l04844"></a><span class="lineno"> 4844</span>  <span class="keyword">typedef</span> TemplateSel<T1> Head;</div><div class="line"><a name="l04845"></a><span class="lineno"> 4845</span>  <span class="keyword">typedef</span> Templates2<T2, T3> Tail;</div><div class="line"><a name="l04846"></a><span class="lineno"> 4846</span> };</div><div class="line"><a name="l04847"></a><span class="lineno"> 4847</span> </div><div class="line"><a name="l04848"></a><span class="lineno"> 4848</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l04849"></a><span class="lineno"> 4849</span>  GTEST_TEMPLATE_ T4></div><div class="line"><a name="l04850"></a><span class="lineno"> 4850</span> <span class="keyword">struct </span>Templates4 {</div><div class="line"><a name="l04851"></a><span class="lineno"> 4851</span>  <span class="keyword">typedef</span> TemplateSel<T1> Head;</div><div class="line"><a name="l04852"></a><span class="lineno"> 4852</span>  <span class="keyword">typedef</span> Templates3<T2, T3, T4> Tail;</div><div class="line"><a name="l04853"></a><span class="lineno"> 4853</span> };</div><div class="line"><a name="l04854"></a><span class="lineno"> 4854</span> </div><div class="line"><a name="l04855"></a><span class="lineno"> 4855</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l04856"></a><span class="lineno"> 4856</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5></div><div class="line"><a name="l04857"></a><span class="lineno"> 4857</span> <span class="keyword">struct </span>Templates5 {</div><div class="line"><a name="l04858"></a><span class="lineno"> 4858</span>  <span class="keyword">typedef</span> TemplateSel<T1> Head;</div><div class="line"><a name="l04859"></a><span class="lineno"> 4859</span>  <span class="keyword">typedef</span> Templates4<T2, T3, T4, T5> Tail;</div><div class="line"><a name="l04860"></a><span class="lineno"> 4860</span> };</div><div class="line"><a name="l04861"></a><span class="lineno"> 4861</span> </div><div class="line"><a name="l04862"></a><span class="lineno"> 4862</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l04863"></a><span class="lineno"> 4863</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6></div><div class="line"><a name="l04864"></a><span class="lineno"> 4864</span> <span class="keyword">struct </span>Templates6 {</div><div class="line"><a name="l04865"></a><span class="lineno"> 4865</span>  <span class="keyword">typedef</span> TemplateSel<T1> Head;</div><div class="line"><a name="l04866"></a><span class="lineno"> 4866</span>  <span class="keyword">typedef</span> Templates5<T2, T3, T4, T5, T6> Tail;</div><div class="line"><a name="l04867"></a><span class="lineno"> 4867</span> };</div><div class="line"><a name="l04868"></a><span class="lineno"> 4868</span> </div><div class="line"><a name="l04869"></a><span class="lineno"> 4869</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l04870"></a><span class="lineno"> 4870</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l04871"></a><span class="lineno"> 4871</span>  GTEST_TEMPLATE_ T7></div><div class="line"><a name="l04872"></a><span class="lineno"> 4872</span> <span class="keyword">struct </span>Templates7 {</div><div class="line"><a name="l04873"></a><span class="lineno"> 4873</span>  <span class="keyword">typedef</span> TemplateSel<T1> Head;</div><div class="line"><a name="l04874"></a><span class="lineno"> 4874</span>  <span class="keyword">typedef</span> Templates6<T2, T3, T4, T5, T6, T7> Tail;</div><div class="line"><a name="l04875"></a><span class="lineno"> 4875</span> };</div><div class="line"><a name="l04876"></a><span class="lineno"> 4876</span> </div><div class="line"><a name="l04877"></a><span class="lineno"> 4877</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l04878"></a><span class="lineno"> 4878</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l04879"></a><span class="lineno"> 4879</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8></div><div class="line"><a name="l04880"></a><span class="lineno"> 4880</span> <span class="keyword">struct </span>Templates8 {</div><div class="line"><a name="l04881"></a><span class="lineno"> 4881</span>  <span class="keyword">typedef</span> TemplateSel<T1> Head;</div><div class="line"><a name="l04882"></a><span class="lineno"> 4882</span>  <span class="keyword">typedef</span> Templates7<T2, T3, T4, T5, T6, T7, T8> Tail;</div><div class="line"><a name="l04883"></a><span class="lineno"> 4883</span> };</div><div class="line"><a name="l04884"></a><span class="lineno"> 4884</span> </div><div class="line"><a name="l04885"></a><span class="lineno"> 4885</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l04886"></a><span class="lineno"> 4886</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l04887"></a><span class="lineno"> 4887</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9></div><div class="line"><a name="l04888"></a><span class="lineno"> 4888</span> <span class="keyword">struct </span>Templates9 {</div><div class="line"><a name="l04889"></a><span class="lineno"> 4889</span>  <span class="keyword">typedef</span> TemplateSel<T1> Head;</div><div class="line"><a name="l04890"></a><span class="lineno"> 4890</span>  <span class="keyword">typedef</span> Templates8<T2, T3, T4, T5, T6, T7, T8, T9> Tail;</div><div class="line"><a name="l04891"></a><span class="lineno"> 4891</span> };</div><div class="line"><a name="l04892"></a><span class="lineno"> 4892</span> </div><div class="line"><a name="l04893"></a><span class="lineno"> 4893</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l04894"></a><span class="lineno"> 4894</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l04895"></a><span class="lineno"> 4895</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l04896"></a><span class="lineno"> 4896</span>  GTEST_TEMPLATE_ T10></div><div class="line"><a name="l04897"></a><span class="lineno"> 4897</span> <span class="keyword">struct </span>Templates10 {</div><div class="line"><a name="l04898"></a><span class="lineno"> 4898</span>  <span class="keyword">typedef</span> TemplateSel<T1> Head;</div><div class="line"><a name="l04899"></a><span class="lineno"> 4899</span>  <span class="keyword">typedef</span> Templates9<T2, T3, T4, T5, T6, T7, T8, T9, T10> Tail;</div><div class="line"><a name="l04900"></a><span class="lineno"> 4900</span> };</div><div class="line"><a name="l04901"></a><span class="lineno"> 4901</span> </div><div class="line"><a name="l04902"></a><span class="lineno"> 4902</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l04903"></a><span class="lineno"> 4903</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l04904"></a><span class="lineno"> 4904</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l04905"></a><span class="lineno"> 4905</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11></div><div class="line"><a name="l04906"></a><span class="lineno"> 4906</span> <span class="keyword">struct </span>Templates11 {</div><div class="line"><a name="l04907"></a><span class="lineno"> 4907</span>  <span class="keyword">typedef</span> TemplateSel<T1> Head;</div><div class="line"><a name="l04908"></a><span class="lineno"> 4908</span>  <span class="keyword">typedef</span> Templates10<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> Tail;</div><div class="line"><a name="l04909"></a><span class="lineno"> 4909</span> };</div><div class="line"><a name="l04910"></a><span class="lineno"> 4910</span> </div><div class="line"><a name="l04911"></a><span class="lineno"> 4911</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l04912"></a><span class="lineno"> 4912</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l04913"></a><span class="lineno"> 4913</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l04914"></a><span class="lineno"> 4914</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12></div><div class="line"><a name="l04915"></a><span class="lineno"> 4915</span> <span class="keyword">struct </span>Templates12 {</div><div class="line"><a name="l04916"></a><span class="lineno"> 4916</span>  <span class="keyword">typedef</span> TemplateSel<T1> Head;</div><div class="line"><a name="l04917"></a><span class="lineno"> 4917</span>  <span class="keyword">typedef</span> Templates11<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> Tail;</div><div class="line"><a name="l04918"></a><span class="lineno"> 4918</span> };</div><div class="line"><a name="l04919"></a><span class="lineno"> 4919</span> </div><div class="line"><a name="l04920"></a><span class="lineno"> 4920</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l04921"></a><span class="lineno"> 4921</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l04922"></a><span class="lineno"> 4922</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l04923"></a><span class="lineno"> 4923</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l04924"></a><span class="lineno"> 4924</span>  GTEST_TEMPLATE_ T13></div><div class="line"><a name="l04925"></a><span class="lineno"> 4925</span> <span class="keyword">struct </span>Templates13 {</div><div class="line"><a name="l04926"></a><span class="lineno"> 4926</span>  <span class="keyword">typedef</span> TemplateSel<T1> Head;</div><div class="line"><a name="l04927"></a><span class="lineno"> 4927</span>  <span class="keyword">typedef</span> Templates12<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> Tail;</div><div class="line"><a name="l04928"></a><span class="lineno"> 4928</span> };</div><div class="line"><a name="l04929"></a><span class="lineno"> 4929</span> </div><div class="line"><a name="l04930"></a><span class="lineno"> 4930</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l04931"></a><span class="lineno"> 4931</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l04932"></a><span class="lineno"> 4932</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l04933"></a><span class="lineno"> 4933</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l04934"></a><span class="lineno"> 4934</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14></div><div class="line"><a name="l04935"></a><span class="lineno"> 4935</span> <span class="keyword">struct </span>Templates14 {</div><div class="line"><a name="l04936"></a><span class="lineno"> 4936</span>  <span class="keyword">typedef</span> TemplateSel<T1> Head;</div><div class="line"><a name="l04937"></a><span class="lineno"> 4937</span>  <span class="keyword">typedef</span> Templates13<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,</div><div class="line"><a name="l04938"></a><span class="lineno"> 4938</span>  T14> Tail;</div><div class="line"><a name="l04939"></a><span class="lineno"> 4939</span> };</div><div class="line"><a name="l04940"></a><span class="lineno"> 4940</span> </div><div class="line"><a name="l04941"></a><span class="lineno"> 4941</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l04942"></a><span class="lineno"> 4942</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l04943"></a><span class="lineno"> 4943</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l04944"></a><span class="lineno"> 4944</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l04945"></a><span class="lineno"> 4945</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15></div><div class="line"><a name="l04946"></a><span class="lineno"> 4946</span> <span class="keyword">struct </span>Templates15 {</div><div class="line"><a name="l04947"></a><span class="lineno"> 4947</span>  <span class="keyword">typedef</span> TemplateSel<T1> Head;</div><div class="line"><a name="l04948"></a><span class="lineno"> 4948</span>  <span class="keyword">typedef</span> Templates14<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l04949"></a><span class="lineno"> 4949</span>  T15> Tail;</div><div class="line"><a name="l04950"></a><span class="lineno"> 4950</span> };</div><div class="line"><a name="l04951"></a><span class="lineno"> 4951</span> </div><div class="line"><a name="l04952"></a><span class="lineno"> 4952</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l04953"></a><span class="lineno"> 4953</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l04954"></a><span class="lineno"> 4954</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l04955"></a><span class="lineno"> 4955</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l04956"></a><span class="lineno"> 4956</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,</div><div class="line"><a name="l04957"></a><span class="lineno"> 4957</span>  GTEST_TEMPLATE_ T16></div><div class="line"><a name="l04958"></a><span class="lineno"> 4958</span> <span class="keyword">struct </span>Templates16 {</div><div class="line"><a name="l04959"></a><span class="lineno"> 4959</span>  <span class="keyword">typedef</span> TemplateSel<T1> Head;</div><div class="line"><a name="l04960"></a><span class="lineno"> 4960</span>  <span class="keyword">typedef</span> Templates15<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l04961"></a><span class="lineno"> 4961</span>  T15, T16> Tail;</div><div class="line"><a name="l04962"></a><span class="lineno"> 4962</span> };</div><div class="line"><a name="l04963"></a><span class="lineno"> 4963</span> </div><div class="line"><a name="l04964"></a><span class="lineno"> 4964</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l04965"></a><span class="lineno"> 4965</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l04966"></a><span class="lineno"> 4966</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l04967"></a><span class="lineno"> 4967</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l04968"></a><span class="lineno"> 4968</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,</div><div class="line"><a name="l04969"></a><span class="lineno"> 4969</span>  GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17></div><div class="line"><a name="l04970"></a><span class="lineno"> 4970</span> <span class="keyword">struct </span>Templates17 {</div><div class="line"><a name="l04971"></a><span class="lineno"> 4971</span>  <span class="keyword">typedef</span> TemplateSel<T1> Head;</div><div class="line"><a name="l04972"></a><span class="lineno"> 4972</span>  <span class="keyword">typedef</span> Templates16<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l04973"></a><span class="lineno"> 4973</span>  T15, T16, T17> Tail;</div><div class="line"><a name="l04974"></a><span class="lineno"> 4974</span> };</div><div class="line"><a name="l04975"></a><span class="lineno"> 4975</span> </div><div class="line"><a name="l04976"></a><span class="lineno"> 4976</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l04977"></a><span class="lineno"> 4977</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l04978"></a><span class="lineno"> 4978</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l04979"></a><span class="lineno"> 4979</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l04980"></a><span class="lineno"> 4980</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,</div><div class="line"><a name="l04981"></a><span class="lineno"> 4981</span>  GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18></div><div class="line"><a name="l04982"></a><span class="lineno"> 4982</span> <span class="keyword">struct </span>Templates18 {</div><div class="line"><a name="l04983"></a><span class="lineno"> 4983</span>  <span class="keyword">typedef</span> TemplateSel<T1> Head;</div><div class="line"><a name="l04984"></a><span class="lineno"> 4984</span>  <span class="keyword">typedef</span> Templates17<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l04985"></a><span class="lineno"> 4985</span>  T15, T16, T17, T18> Tail;</div><div class="line"><a name="l04986"></a><span class="lineno"> 4986</span> };</div><div class="line"><a name="l04987"></a><span class="lineno"> 4987</span> </div><div class="line"><a name="l04988"></a><span class="lineno"> 4988</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l04989"></a><span class="lineno"> 4989</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l04990"></a><span class="lineno"> 4990</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l04991"></a><span class="lineno"> 4991</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l04992"></a><span class="lineno"> 4992</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,</div><div class="line"><a name="l04993"></a><span class="lineno"> 4993</span>  GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,</div><div class="line"><a name="l04994"></a><span class="lineno"> 4994</span>  GTEST_TEMPLATE_ T19></div><div class="line"><a name="l04995"></a><span class="lineno"> 4995</span> <span class="keyword">struct </span>Templates19 {</div><div class="line"><a name="l04996"></a><span class="lineno"> 4996</span>  <span class="keyword">typedef</span> TemplateSel<T1> Head;</div><div class="line"><a name="l04997"></a><span class="lineno"> 4997</span>  <span class="keyword">typedef</span> Templates18<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l04998"></a><span class="lineno"> 4998</span>  T15, T16, T17, T18, T19> Tail;</div><div class="line"><a name="l04999"></a><span class="lineno"> 4999</span> };</div><div class="line"><a name="l05000"></a><span class="lineno"> 5000</span> </div><div class="line"><a name="l05001"></a><span class="lineno"> 5001</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l05002"></a><span class="lineno"> 5002</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l05003"></a><span class="lineno"> 5003</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l05004"></a><span class="lineno"> 5004</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l05005"></a><span class="lineno"> 5005</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,</div><div class="line"><a name="l05006"></a><span class="lineno"> 5006</span>  GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,</div><div class="line"><a name="l05007"></a><span class="lineno"> 5007</span>  GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20></div><div class="line"><a name="l05008"></a><span class="lineno"> 5008</span> <span class="keyword">struct </span>Templates20 {</div><div class="line"><a name="l05009"></a><span class="lineno"> 5009</span>  <span class="keyword">typedef</span> TemplateSel<T1> Head;</div><div class="line"><a name="l05010"></a><span class="lineno"> 5010</span>  <span class="keyword">typedef</span> Templates19<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l05011"></a><span class="lineno"> 5011</span>  T15, T16, T17, T18, T19, T20> Tail;</div><div class="line"><a name="l05012"></a><span class="lineno"> 5012</span> };</div><div class="line"><a name="l05013"></a><span class="lineno"> 5013</span> </div><div class="line"><a name="l05014"></a><span class="lineno"> 5014</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l05015"></a><span class="lineno"> 5015</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l05016"></a><span class="lineno"> 5016</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l05017"></a><span class="lineno"> 5017</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l05018"></a><span class="lineno"> 5018</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,</div><div class="line"><a name="l05019"></a><span class="lineno"> 5019</span>  GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,</div><div class="line"><a name="l05020"></a><span class="lineno"> 5020</span>  GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21></div><div class="line"><a name="l05021"></a><span class="lineno"> 5021</span> <span class="keyword">struct </span>Templates21 {</div><div class="line"><a name="l05022"></a><span class="lineno"> 5022</span>  <span class="keyword">typedef</span> TemplateSel<T1> Head;</div><div class="line"><a name="l05023"></a><span class="lineno"> 5023</span>  <span class="keyword">typedef</span> Templates20<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l05024"></a><span class="lineno"> 5024</span>  T15, T16, T17, T18, T19, T20, T21> Tail;</div><div class="line"><a name="l05025"></a><span class="lineno"> 5025</span> };</div><div class="line"><a name="l05026"></a><span class="lineno"> 5026</span> </div><div class="line"><a name="l05027"></a><span class="lineno"> 5027</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l05028"></a><span class="lineno"> 5028</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l05029"></a><span class="lineno"> 5029</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l05030"></a><span class="lineno"> 5030</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l05031"></a><span class="lineno"> 5031</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,</div><div class="line"><a name="l05032"></a><span class="lineno"> 5032</span>  GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,</div><div class="line"><a name="l05033"></a><span class="lineno"> 5033</span>  GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,</div><div class="line"><a name="l05034"></a><span class="lineno"> 5034</span>  GTEST_TEMPLATE_ T22></div><div class="line"><a name="l05035"></a><span class="lineno"> 5035</span> <span class="keyword">struct </span>Templates22 {</div><div class="line"><a name="l05036"></a><span class="lineno"> 5036</span>  <span class="keyword">typedef</span> TemplateSel<T1> Head;</div><div class="line"><a name="l05037"></a><span class="lineno"> 5037</span>  <span class="keyword">typedef</span> Templates21<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l05038"></a><span class="lineno"> 5038</span>  T15, T16, T17, T18, T19, T20, T21, T22> Tail;</div><div class="line"><a name="l05039"></a><span class="lineno"> 5039</span> };</div><div class="line"><a name="l05040"></a><span class="lineno"> 5040</span> </div><div class="line"><a name="l05041"></a><span class="lineno"> 5041</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l05042"></a><span class="lineno"> 5042</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l05043"></a><span class="lineno"> 5043</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l05044"></a><span class="lineno"> 5044</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l05045"></a><span class="lineno"> 5045</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,</div><div class="line"><a name="l05046"></a><span class="lineno"> 5046</span>  GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,</div><div class="line"><a name="l05047"></a><span class="lineno"> 5047</span>  GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,</div><div class="line"><a name="l05048"></a><span class="lineno"> 5048</span>  GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23></div><div class="line"><a name="l05049"></a><span class="lineno"> 5049</span> <span class="keyword">struct </span>Templates23 {</div><div class="line"><a name="l05050"></a><span class="lineno"> 5050</span>  <span class="keyword">typedef</span> TemplateSel<T1> Head;</div><div class="line"><a name="l05051"></a><span class="lineno"> 5051</span>  <span class="keyword">typedef</span> Templates22<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l05052"></a><span class="lineno"> 5052</span>  T15, T16, T17, T18, T19, T20, T21, T22, T23> Tail;</div><div class="line"><a name="l05053"></a><span class="lineno"> 5053</span> };</div><div class="line"><a name="l05054"></a><span class="lineno"> 5054</span> </div><div class="line"><a name="l05055"></a><span class="lineno"> 5055</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l05056"></a><span class="lineno"> 5056</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l05057"></a><span class="lineno"> 5057</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l05058"></a><span class="lineno"> 5058</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l05059"></a><span class="lineno"> 5059</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,</div><div class="line"><a name="l05060"></a><span class="lineno"> 5060</span>  GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,</div><div class="line"><a name="l05061"></a><span class="lineno"> 5061</span>  GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,</div><div class="line"><a name="l05062"></a><span class="lineno"> 5062</span>  GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24></div><div class="line"><a name="l05063"></a><span class="lineno"> 5063</span> <span class="keyword">struct </span>Templates24 {</div><div class="line"><a name="l05064"></a><span class="lineno"> 5064</span>  <span class="keyword">typedef</span> TemplateSel<T1> Head;</div><div class="line"><a name="l05065"></a><span class="lineno"> 5065</span>  <span class="keyword">typedef</span> Templates23<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l05066"></a><span class="lineno"> 5066</span>  T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> Tail;</div><div class="line"><a name="l05067"></a><span class="lineno"> 5067</span> };</div><div class="line"><a name="l05068"></a><span class="lineno"> 5068</span> </div><div class="line"><a name="l05069"></a><span class="lineno"> 5069</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l05070"></a><span class="lineno"> 5070</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l05071"></a><span class="lineno"> 5071</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l05072"></a><span class="lineno"> 5072</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l05073"></a><span class="lineno"> 5073</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,</div><div class="line"><a name="l05074"></a><span class="lineno"> 5074</span>  GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,</div><div class="line"><a name="l05075"></a><span class="lineno"> 5075</span>  GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,</div><div class="line"><a name="l05076"></a><span class="lineno"> 5076</span>  GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,</div><div class="line"><a name="l05077"></a><span class="lineno"> 5077</span>  GTEST_TEMPLATE_ T25></div><div class="line"><a name="l05078"></a><span class="lineno"> 5078</span> <span class="keyword">struct </span>Templates25 {</div><div class="line"><a name="l05079"></a><span class="lineno"> 5079</span>  <span class="keyword">typedef</span> TemplateSel<T1> Head;</div><div class="line"><a name="l05080"></a><span class="lineno"> 5080</span>  <span class="keyword">typedef</span> Templates24<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l05081"></a><span class="lineno"> 5081</span>  T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Tail;</div><div class="line"><a name="l05082"></a><span class="lineno"> 5082</span> };</div><div class="line"><a name="l05083"></a><span class="lineno"> 5083</span> </div><div class="line"><a name="l05084"></a><span class="lineno"> 5084</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l05085"></a><span class="lineno"> 5085</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l05086"></a><span class="lineno"> 5086</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l05087"></a><span class="lineno"> 5087</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l05088"></a><span class="lineno"> 5088</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,</div><div class="line"><a name="l05089"></a><span class="lineno"> 5089</span>  GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,</div><div class="line"><a name="l05090"></a><span class="lineno"> 5090</span>  GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,</div><div class="line"><a name="l05091"></a><span class="lineno"> 5091</span>  GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,</div><div class="line"><a name="l05092"></a><span class="lineno"> 5092</span>  GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26></div><div class="line"><a name="l05093"></a><span class="lineno"> 5093</span> <span class="keyword">struct </span>Templates26 {</div><div class="line"><a name="l05094"></a><span class="lineno"> 5094</span>  <span class="keyword">typedef</span> TemplateSel<T1> Head;</div><div class="line"><a name="l05095"></a><span class="lineno"> 5095</span>  <span class="keyword">typedef</span> Templates25<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l05096"></a><span class="lineno"> 5096</span>  T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> Tail;</div><div class="line"><a name="l05097"></a><span class="lineno"> 5097</span> };</div><div class="line"><a name="l05098"></a><span class="lineno"> 5098</span> </div><div class="line"><a name="l05099"></a><span class="lineno"> 5099</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l05100"></a><span class="lineno"> 5100</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l05101"></a><span class="lineno"> 5101</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l05102"></a><span class="lineno"> 5102</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l05103"></a><span class="lineno"> 5103</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,</div><div class="line"><a name="l05104"></a><span class="lineno"> 5104</span>  GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,</div><div class="line"><a name="l05105"></a><span class="lineno"> 5105</span>  GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,</div><div class="line"><a name="l05106"></a><span class="lineno"> 5106</span>  GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,</div><div class="line"><a name="l05107"></a><span class="lineno"> 5107</span>  GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27></div><div class="line"><a name="l05108"></a><span class="lineno"> 5108</span> <span class="keyword">struct </span>Templates27 {</div><div class="line"><a name="l05109"></a><span class="lineno"> 5109</span>  <span class="keyword">typedef</span> TemplateSel<T1> Head;</div><div class="line"><a name="l05110"></a><span class="lineno"> 5110</span>  <span class="keyword">typedef</span> Templates26<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l05111"></a><span class="lineno"> 5111</span>  T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27> Tail;</div><div class="line"><a name="l05112"></a><span class="lineno"> 5112</span> };</div><div class="line"><a name="l05113"></a><span class="lineno"> 5113</span> </div><div class="line"><a name="l05114"></a><span class="lineno"> 5114</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l05115"></a><span class="lineno"> 5115</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l05116"></a><span class="lineno"> 5116</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l05117"></a><span class="lineno"> 5117</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l05118"></a><span class="lineno"> 5118</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,</div><div class="line"><a name="l05119"></a><span class="lineno"> 5119</span>  GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,</div><div class="line"><a name="l05120"></a><span class="lineno"> 5120</span>  GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,</div><div class="line"><a name="l05121"></a><span class="lineno"> 5121</span>  GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,</div><div class="line"><a name="l05122"></a><span class="lineno"> 5122</span>  GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,</div><div class="line"><a name="l05123"></a><span class="lineno"> 5123</span>  GTEST_TEMPLATE_ T28></div><div class="line"><a name="l05124"></a><span class="lineno"> 5124</span> <span class="keyword">struct </span>Templates28 {</div><div class="line"><a name="l05125"></a><span class="lineno"> 5125</span>  <span class="keyword">typedef</span> TemplateSel<T1> Head;</div><div class="line"><a name="l05126"></a><span class="lineno"> 5126</span>  <span class="keyword">typedef</span> Templates27<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l05127"></a><span class="lineno"> 5127</span>  T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,</div><div class="line"><a name="l05128"></a><span class="lineno"> 5128</span>  T28> Tail;</div><div class="line"><a name="l05129"></a><span class="lineno"> 5129</span> };</div><div class="line"><a name="l05130"></a><span class="lineno"> 5130</span> </div><div class="line"><a name="l05131"></a><span class="lineno"> 5131</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l05132"></a><span class="lineno"> 5132</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l05133"></a><span class="lineno"> 5133</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l05134"></a><span class="lineno"> 5134</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l05135"></a><span class="lineno"> 5135</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,</div><div class="line"><a name="l05136"></a><span class="lineno"> 5136</span>  GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,</div><div class="line"><a name="l05137"></a><span class="lineno"> 5137</span>  GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,</div><div class="line"><a name="l05138"></a><span class="lineno"> 5138</span>  GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,</div><div class="line"><a name="l05139"></a><span class="lineno"> 5139</span>  GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,</div><div class="line"><a name="l05140"></a><span class="lineno"> 5140</span>  GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29></div><div class="line"><a name="l05141"></a><span class="lineno"> 5141</span> <span class="keyword">struct </span>Templates29 {</div><div class="line"><a name="l05142"></a><span class="lineno"> 5142</span>  <span class="keyword">typedef</span> TemplateSel<T1> Head;</div><div class="line"><a name="l05143"></a><span class="lineno"> 5143</span>  <span class="keyword">typedef</span> Templates28<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l05144"></a><span class="lineno"> 5144</span>  T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,</div><div class="line"><a name="l05145"></a><span class="lineno"> 5145</span>  T29> Tail;</div><div class="line"><a name="l05146"></a><span class="lineno"> 5146</span> };</div><div class="line"><a name="l05147"></a><span class="lineno"> 5147</span> </div><div class="line"><a name="l05148"></a><span class="lineno"> 5148</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l05149"></a><span class="lineno"> 5149</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l05150"></a><span class="lineno"> 5150</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l05151"></a><span class="lineno"> 5151</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l05152"></a><span class="lineno"> 5152</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,</div><div class="line"><a name="l05153"></a><span class="lineno"> 5153</span>  GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,</div><div class="line"><a name="l05154"></a><span class="lineno"> 5154</span>  GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,</div><div class="line"><a name="l05155"></a><span class="lineno"> 5155</span>  GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,</div><div class="line"><a name="l05156"></a><span class="lineno"> 5156</span>  GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,</div><div class="line"><a name="l05157"></a><span class="lineno"> 5157</span>  GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30></div><div class="line"><a name="l05158"></a><span class="lineno"> 5158</span> <span class="keyword">struct </span>Templates30 {</div><div class="line"><a name="l05159"></a><span class="lineno"> 5159</span>  <span class="keyword">typedef</span> TemplateSel<T1> Head;</div><div class="line"><a name="l05160"></a><span class="lineno"> 5160</span>  <span class="keyword">typedef</span> Templates29<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l05161"></a><span class="lineno"> 5161</span>  T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,</div><div class="line"><a name="l05162"></a><span class="lineno"> 5162</span>  T29, T30> Tail;</div><div class="line"><a name="l05163"></a><span class="lineno"> 5163</span> };</div><div class="line"><a name="l05164"></a><span class="lineno"> 5164</span> </div><div class="line"><a name="l05165"></a><span class="lineno"> 5165</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l05166"></a><span class="lineno"> 5166</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l05167"></a><span class="lineno"> 5167</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l05168"></a><span class="lineno"> 5168</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l05169"></a><span class="lineno"> 5169</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,</div><div class="line"><a name="l05170"></a><span class="lineno"> 5170</span>  GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,</div><div class="line"><a name="l05171"></a><span class="lineno"> 5171</span>  GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,</div><div class="line"><a name="l05172"></a><span class="lineno"> 5172</span>  GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,</div><div class="line"><a name="l05173"></a><span class="lineno"> 5173</span>  GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,</div><div class="line"><a name="l05174"></a><span class="lineno"> 5174</span>  GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,</div><div class="line"><a name="l05175"></a><span class="lineno"> 5175</span>  GTEST_TEMPLATE_ T31></div><div class="line"><a name="l05176"></a><span class="lineno"> 5176</span> <span class="keyword">struct </span>Templates31 {</div><div class="line"><a name="l05177"></a><span class="lineno"> 5177</span>  <span class="keyword">typedef</span> TemplateSel<T1> Head;</div><div class="line"><a name="l05178"></a><span class="lineno"> 5178</span>  <span class="keyword">typedef</span> Templates30<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l05179"></a><span class="lineno"> 5179</span>  T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,</div><div class="line"><a name="l05180"></a><span class="lineno"> 5180</span>  T29, T30, T31> Tail;</div><div class="line"><a name="l05181"></a><span class="lineno"> 5181</span> };</div><div class="line"><a name="l05182"></a><span class="lineno"> 5182</span> </div><div class="line"><a name="l05183"></a><span class="lineno"> 5183</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l05184"></a><span class="lineno"> 5184</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l05185"></a><span class="lineno"> 5185</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l05186"></a><span class="lineno"> 5186</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l05187"></a><span class="lineno"> 5187</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,</div><div class="line"><a name="l05188"></a><span class="lineno"> 5188</span>  GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,</div><div class="line"><a name="l05189"></a><span class="lineno"> 5189</span>  GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,</div><div class="line"><a name="l05190"></a><span class="lineno"> 5190</span>  GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,</div><div class="line"><a name="l05191"></a><span class="lineno"> 5191</span>  GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,</div><div class="line"><a name="l05192"></a><span class="lineno"> 5192</span>  GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,</div><div class="line"><a name="l05193"></a><span class="lineno"> 5193</span>  GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32></div><div class="line"><a name="l05194"></a><span class="lineno"> 5194</span> <span class="keyword">struct </span>Templates32 {</div><div class="line"><a name="l05195"></a><span class="lineno"> 5195</span>  <span class="keyword">typedef</span> TemplateSel<T1> Head;</div><div class="line"><a name="l05196"></a><span class="lineno"> 5196</span>  <span class="keyword">typedef</span> Templates31<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l05197"></a><span class="lineno"> 5197</span>  T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,</div><div class="line"><a name="l05198"></a><span class="lineno"> 5198</span>  T29, T30, T31, T32> Tail;</div><div class="line"><a name="l05199"></a><span class="lineno"> 5199</span> };</div><div class="line"><a name="l05200"></a><span class="lineno"> 5200</span> </div><div class="line"><a name="l05201"></a><span class="lineno"> 5201</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l05202"></a><span class="lineno"> 5202</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l05203"></a><span class="lineno"> 5203</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l05204"></a><span class="lineno"> 5204</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l05205"></a><span class="lineno"> 5205</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,</div><div class="line"><a name="l05206"></a><span class="lineno"> 5206</span>  GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,</div><div class="line"><a name="l05207"></a><span class="lineno"> 5207</span>  GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,</div><div class="line"><a name="l05208"></a><span class="lineno"> 5208</span>  GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,</div><div class="line"><a name="l05209"></a><span class="lineno"> 5209</span>  GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,</div><div class="line"><a name="l05210"></a><span class="lineno"> 5210</span>  GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,</div><div class="line"><a name="l05211"></a><span class="lineno"> 5211</span>  GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33></div><div class="line"><a name="l05212"></a><span class="lineno"> 5212</span> <span class="keyword">struct </span>Templates33 {</div><div class="line"><a name="l05213"></a><span class="lineno"> 5213</span>  <span class="keyword">typedef</span> TemplateSel<T1> Head;</div><div class="line"><a name="l05214"></a><span class="lineno"> 5214</span>  <span class="keyword">typedef</span> Templates32<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l05215"></a><span class="lineno"> 5215</span>  T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,</div><div class="line"><a name="l05216"></a><span class="lineno"> 5216</span>  T29, T30, T31, T32, T33> Tail;</div><div class="line"><a name="l05217"></a><span class="lineno"> 5217</span> };</div><div class="line"><a name="l05218"></a><span class="lineno"> 5218</span> </div><div class="line"><a name="l05219"></a><span class="lineno"> 5219</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l05220"></a><span class="lineno"> 5220</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l05221"></a><span class="lineno"> 5221</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l05222"></a><span class="lineno"> 5222</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l05223"></a><span class="lineno"> 5223</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,</div><div class="line"><a name="l05224"></a><span class="lineno"> 5224</span>  GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,</div><div class="line"><a name="l05225"></a><span class="lineno"> 5225</span>  GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,</div><div class="line"><a name="l05226"></a><span class="lineno"> 5226</span>  GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,</div><div class="line"><a name="l05227"></a><span class="lineno"> 5227</span>  GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,</div><div class="line"><a name="l05228"></a><span class="lineno"> 5228</span>  GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,</div><div class="line"><a name="l05229"></a><span class="lineno"> 5229</span>  GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,</div><div class="line"><a name="l05230"></a><span class="lineno"> 5230</span>  GTEST_TEMPLATE_ T34></div><div class="line"><a name="l05231"></a><span class="lineno"> 5231</span> <span class="keyword">struct </span>Templates34 {</div><div class="line"><a name="l05232"></a><span class="lineno"> 5232</span>  <span class="keyword">typedef</span> TemplateSel<T1> Head;</div><div class="line"><a name="l05233"></a><span class="lineno"> 5233</span>  <span class="keyword">typedef</span> Templates33<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l05234"></a><span class="lineno"> 5234</span>  T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,</div><div class="line"><a name="l05235"></a><span class="lineno"> 5235</span>  T29, T30, T31, T32, T33, T34> Tail;</div><div class="line"><a name="l05236"></a><span class="lineno"> 5236</span> };</div><div class="line"><a name="l05237"></a><span class="lineno"> 5237</span> </div><div class="line"><a name="l05238"></a><span class="lineno"> 5238</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l05239"></a><span class="lineno"> 5239</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l05240"></a><span class="lineno"> 5240</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l05241"></a><span class="lineno"> 5241</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l05242"></a><span class="lineno"> 5242</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,</div><div class="line"><a name="l05243"></a><span class="lineno"> 5243</span>  GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,</div><div class="line"><a name="l05244"></a><span class="lineno"> 5244</span>  GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,</div><div class="line"><a name="l05245"></a><span class="lineno"> 5245</span>  GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,</div><div class="line"><a name="l05246"></a><span class="lineno"> 5246</span>  GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,</div><div class="line"><a name="l05247"></a><span class="lineno"> 5247</span>  GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,</div><div class="line"><a name="l05248"></a><span class="lineno"> 5248</span>  GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,</div><div class="line"><a name="l05249"></a><span class="lineno"> 5249</span>  GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35></div><div class="line"><a name="l05250"></a><span class="lineno"> 5250</span> <span class="keyword">struct </span>Templates35 {</div><div class="line"><a name="l05251"></a><span class="lineno"> 5251</span>  <span class="keyword">typedef</span> TemplateSel<T1> Head;</div><div class="line"><a name="l05252"></a><span class="lineno"> 5252</span>  <span class="keyword">typedef</span> Templates34<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l05253"></a><span class="lineno"> 5253</span>  T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,</div><div class="line"><a name="l05254"></a><span class="lineno"> 5254</span>  T29, T30, T31, T32, T33, T34, T35> Tail;</div><div class="line"><a name="l05255"></a><span class="lineno"> 5255</span> };</div><div class="line"><a name="l05256"></a><span class="lineno"> 5256</span> </div><div class="line"><a name="l05257"></a><span class="lineno"> 5257</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l05258"></a><span class="lineno"> 5258</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l05259"></a><span class="lineno"> 5259</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l05260"></a><span class="lineno"> 5260</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l05261"></a><span class="lineno"> 5261</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,</div><div class="line"><a name="l05262"></a><span class="lineno"> 5262</span>  GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,</div><div class="line"><a name="l05263"></a><span class="lineno"> 5263</span>  GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,</div><div class="line"><a name="l05264"></a><span class="lineno"> 5264</span>  GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,</div><div class="line"><a name="l05265"></a><span class="lineno"> 5265</span>  GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,</div><div class="line"><a name="l05266"></a><span class="lineno"> 5266</span>  GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,</div><div class="line"><a name="l05267"></a><span class="lineno"> 5267</span>  GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,</div><div class="line"><a name="l05268"></a><span class="lineno"> 5268</span>  GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36></div><div class="line"><a name="l05269"></a><span class="lineno"> 5269</span> <span class="keyword">struct </span>Templates36 {</div><div class="line"><a name="l05270"></a><span class="lineno"> 5270</span>  <span class="keyword">typedef</span> TemplateSel<T1> Head;</div><div class="line"><a name="l05271"></a><span class="lineno"> 5271</span>  <span class="keyword">typedef</span> Templates35<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l05272"></a><span class="lineno"> 5272</span>  T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,</div><div class="line"><a name="l05273"></a><span class="lineno"> 5273</span>  T29, T30, T31, T32, T33, T34, T35, T36> Tail;</div><div class="line"><a name="l05274"></a><span class="lineno"> 5274</span> };</div><div class="line"><a name="l05275"></a><span class="lineno"> 5275</span> </div><div class="line"><a name="l05276"></a><span class="lineno"> 5276</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l05277"></a><span class="lineno"> 5277</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l05278"></a><span class="lineno"> 5278</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l05279"></a><span class="lineno"> 5279</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l05280"></a><span class="lineno"> 5280</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,</div><div class="line"><a name="l05281"></a><span class="lineno"> 5281</span>  GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,</div><div class="line"><a name="l05282"></a><span class="lineno"> 5282</span>  GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,</div><div class="line"><a name="l05283"></a><span class="lineno"> 5283</span>  GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,</div><div class="line"><a name="l05284"></a><span class="lineno"> 5284</span>  GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,</div><div class="line"><a name="l05285"></a><span class="lineno"> 5285</span>  GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,</div><div class="line"><a name="l05286"></a><span class="lineno"> 5286</span>  GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,</div><div class="line"><a name="l05287"></a><span class="lineno"> 5287</span>  GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,</div><div class="line"><a name="l05288"></a><span class="lineno"> 5288</span>  GTEST_TEMPLATE_ T37></div><div class="line"><a name="l05289"></a><span class="lineno"> 5289</span> <span class="keyword">struct </span>Templates37 {</div><div class="line"><a name="l05290"></a><span class="lineno"> 5290</span>  <span class="keyword">typedef</span> TemplateSel<T1> Head;</div><div class="line"><a name="l05291"></a><span class="lineno"> 5291</span>  <span class="keyword">typedef</span> Templates36<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l05292"></a><span class="lineno"> 5292</span>  T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,</div><div class="line"><a name="l05293"></a><span class="lineno"> 5293</span>  T29, T30, T31, T32, T33, T34, T35, T36, T37> Tail;</div><div class="line"><a name="l05294"></a><span class="lineno"> 5294</span> };</div><div class="line"><a name="l05295"></a><span class="lineno"> 5295</span> </div><div class="line"><a name="l05296"></a><span class="lineno"> 5296</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l05297"></a><span class="lineno"> 5297</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l05298"></a><span class="lineno"> 5298</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l05299"></a><span class="lineno"> 5299</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l05300"></a><span class="lineno"> 5300</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,</div><div class="line"><a name="l05301"></a><span class="lineno"> 5301</span>  GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,</div><div class="line"><a name="l05302"></a><span class="lineno"> 5302</span>  GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,</div><div class="line"><a name="l05303"></a><span class="lineno"> 5303</span>  GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,</div><div class="line"><a name="l05304"></a><span class="lineno"> 5304</span>  GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,</div><div class="line"><a name="l05305"></a><span class="lineno"> 5305</span>  GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,</div><div class="line"><a name="l05306"></a><span class="lineno"> 5306</span>  GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,</div><div class="line"><a name="l05307"></a><span class="lineno"> 5307</span>  GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,</div><div class="line"><a name="l05308"></a><span class="lineno"> 5308</span>  GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38></div><div class="line"><a name="l05309"></a><span class="lineno"> 5309</span> <span class="keyword">struct </span>Templates38 {</div><div class="line"><a name="l05310"></a><span class="lineno"> 5310</span>  <span class="keyword">typedef</span> TemplateSel<T1> Head;</div><div class="line"><a name="l05311"></a><span class="lineno"> 5311</span>  <span class="keyword">typedef</span> Templates37<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l05312"></a><span class="lineno"> 5312</span>  T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,</div><div class="line"><a name="l05313"></a><span class="lineno"> 5313</span>  T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> Tail;</div><div class="line"><a name="l05314"></a><span class="lineno"> 5314</span> };</div><div class="line"><a name="l05315"></a><span class="lineno"> 5315</span> </div><div class="line"><a name="l05316"></a><span class="lineno"> 5316</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l05317"></a><span class="lineno"> 5317</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l05318"></a><span class="lineno"> 5318</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l05319"></a><span class="lineno"> 5319</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l05320"></a><span class="lineno"> 5320</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,</div><div class="line"><a name="l05321"></a><span class="lineno"> 5321</span>  GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,</div><div class="line"><a name="l05322"></a><span class="lineno"> 5322</span>  GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,</div><div class="line"><a name="l05323"></a><span class="lineno"> 5323</span>  GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,</div><div class="line"><a name="l05324"></a><span class="lineno"> 5324</span>  GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,</div><div class="line"><a name="l05325"></a><span class="lineno"> 5325</span>  GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,</div><div class="line"><a name="l05326"></a><span class="lineno"> 5326</span>  GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,</div><div class="line"><a name="l05327"></a><span class="lineno"> 5327</span>  GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,</div><div class="line"><a name="l05328"></a><span class="lineno"> 5328</span>  GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39></div><div class="line"><a name="l05329"></a><span class="lineno"> 5329</span> <span class="keyword">struct </span>Templates39 {</div><div class="line"><a name="l05330"></a><span class="lineno"> 5330</span>  <span class="keyword">typedef</span> TemplateSel<T1> Head;</div><div class="line"><a name="l05331"></a><span class="lineno"> 5331</span>  <span class="keyword">typedef</span> Templates38<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l05332"></a><span class="lineno"> 5332</span>  T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,</div><div class="line"><a name="l05333"></a><span class="lineno"> 5333</span>  T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Tail;</div><div class="line"><a name="l05334"></a><span class="lineno"> 5334</span> };</div><div class="line"><a name="l05335"></a><span class="lineno"> 5335</span> </div><div class="line"><a name="l05336"></a><span class="lineno"> 5336</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l05337"></a><span class="lineno"> 5337</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l05338"></a><span class="lineno"> 5338</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l05339"></a><span class="lineno"> 5339</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l05340"></a><span class="lineno"> 5340</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,</div><div class="line"><a name="l05341"></a><span class="lineno"> 5341</span>  GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,</div><div class="line"><a name="l05342"></a><span class="lineno"> 5342</span>  GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,</div><div class="line"><a name="l05343"></a><span class="lineno"> 5343</span>  GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,</div><div class="line"><a name="l05344"></a><span class="lineno"> 5344</span>  GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,</div><div class="line"><a name="l05345"></a><span class="lineno"> 5345</span>  GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,</div><div class="line"><a name="l05346"></a><span class="lineno"> 5346</span>  GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,</div><div class="line"><a name="l05347"></a><span class="lineno"> 5347</span>  GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,</div><div class="line"><a name="l05348"></a><span class="lineno"> 5348</span>  GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,</div><div class="line"><a name="l05349"></a><span class="lineno"> 5349</span>  GTEST_TEMPLATE_ T40></div><div class="line"><a name="l05350"></a><span class="lineno"> 5350</span> <span class="keyword">struct </span>Templates40 {</div><div class="line"><a name="l05351"></a><span class="lineno"> 5351</span>  <span class="keyword">typedef</span> TemplateSel<T1> Head;</div><div class="line"><a name="l05352"></a><span class="lineno"> 5352</span>  <span class="keyword">typedef</span> Templates39<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l05353"></a><span class="lineno"> 5353</span>  T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,</div><div class="line"><a name="l05354"></a><span class="lineno"> 5354</span>  T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Tail;</div><div class="line"><a name="l05355"></a><span class="lineno"> 5355</span> };</div><div class="line"><a name="l05356"></a><span class="lineno"> 5356</span> </div><div class="line"><a name="l05357"></a><span class="lineno"> 5357</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l05358"></a><span class="lineno"> 5358</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l05359"></a><span class="lineno"> 5359</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l05360"></a><span class="lineno"> 5360</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l05361"></a><span class="lineno"> 5361</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,</div><div class="line"><a name="l05362"></a><span class="lineno"> 5362</span>  GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,</div><div class="line"><a name="l05363"></a><span class="lineno"> 5363</span>  GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,</div><div class="line"><a name="l05364"></a><span class="lineno"> 5364</span>  GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,</div><div class="line"><a name="l05365"></a><span class="lineno"> 5365</span>  GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,</div><div class="line"><a name="l05366"></a><span class="lineno"> 5366</span>  GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,</div><div class="line"><a name="l05367"></a><span class="lineno"> 5367</span>  GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,</div><div class="line"><a name="l05368"></a><span class="lineno"> 5368</span>  GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,</div><div class="line"><a name="l05369"></a><span class="lineno"> 5369</span>  GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,</div><div class="line"><a name="l05370"></a><span class="lineno"> 5370</span>  GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41></div><div class="line"><a name="l05371"></a><span class="lineno"> 5371</span> <span class="keyword">struct </span>Templates41 {</div><div class="line"><a name="l05372"></a><span class="lineno"> 5372</span>  <span class="keyword">typedef</span> TemplateSel<T1> Head;</div><div class="line"><a name="l05373"></a><span class="lineno"> 5373</span>  <span class="keyword">typedef</span> Templates40<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l05374"></a><span class="lineno"> 5374</span>  T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,</div><div class="line"><a name="l05375"></a><span class="lineno"> 5375</span>  T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41> Tail;</div><div class="line"><a name="l05376"></a><span class="lineno"> 5376</span> };</div><div class="line"><a name="l05377"></a><span class="lineno"> 5377</span> </div><div class="line"><a name="l05378"></a><span class="lineno"> 5378</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l05379"></a><span class="lineno"> 5379</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l05380"></a><span class="lineno"> 5380</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l05381"></a><span class="lineno"> 5381</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l05382"></a><span class="lineno"> 5382</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,</div><div class="line"><a name="l05383"></a><span class="lineno"> 5383</span>  GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,</div><div class="line"><a name="l05384"></a><span class="lineno"> 5384</span>  GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,</div><div class="line"><a name="l05385"></a><span class="lineno"> 5385</span>  GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,</div><div class="line"><a name="l05386"></a><span class="lineno"> 5386</span>  GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,</div><div class="line"><a name="l05387"></a><span class="lineno"> 5387</span>  GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,</div><div class="line"><a name="l05388"></a><span class="lineno"> 5388</span>  GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,</div><div class="line"><a name="l05389"></a><span class="lineno"> 5389</span>  GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,</div><div class="line"><a name="l05390"></a><span class="lineno"> 5390</span>  GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,</div><div class="line"><a name="l05391"></a><span class="lineno"> 5391</span>  GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42></div><div class="line"><a name="l05392"></a><span class="lineno"> 5392</span> <span class="keyword">struct </span>Templates42 {</div><div class="line"><a name="l05393"></a><span class="lineno"> 5393</span>  <span class="keyword">typedef</span> TemplateSel<T1> Head;</div><div class="line"><a name="l05394"></a><span class="lineno"> 5394</span>  <span class="keyword">typedef</span> Templates41<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l05395"></a><span class="lineno"> 5395</span>  T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,</div><div class="line"><a name="l05396"></a><span class="lineno"> 5396</span>  T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,</div><div class="line"><a name="l05397"></a><span class="lineno"> 5397</span>  T42> Tail;</div><div class="line"><a name="l05398"></a><span class="lineno"> 5398</span> };</div><div class="line"><a name="l05399"></a><span class="lineno"> 5399</span> </div><div class="line"><a name="l05400"></a><span class="lineno"> 5400</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l05401"></a><span class="lineno"> 5401</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l05402"></a><span class="lineno"> 5402</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l05403"></a><span class="lineno"> 5403</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l05404"></a><span class="lineno"> 5404</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,</div><div class="line"><a name="l05405"></a><span class="lineno"> 5405</span>  GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,</div><div class="line"><a name="l05406"></a><span class="lineno"> 5406</span>  GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,</div><div class="line"><a name="l05407"></a><span class="lineno"> 5407</span>  GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,</div><div class="line"><a name="l05408"></a><span class="lineno"> 5408</span>  GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,</div><div class="line"><a name="l05409"></a><span class="lineno"> 5409</span>  GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,</div><div class="line"><a name="l05410"></a><span class="lineno"> 5410</span>  GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,</div><div class="line"><a name="l05411"></a><span class="lineno"> 5411</span>  GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,</div><div class="line"><a name="l05412"></a><span class="lineno"> 5412</span>  GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,</div><div class="line"><a name="l05413"></a><span class="lineno"> 5413</span>  GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,</div><div class="line"><a name="l05414"></a><span class="lineno"> 5414</span>  GTEST_TEMPLATE_ T43></div><div class="line"><a name="l05415"></a><span class="lineno"> 5415</span> <span class="keyword">struct </span>Templates43 {</div><div class="line"><a name="l05416"></a><span class="lineno"> 5416</span>  <span class="keyword">typedef</span> TemplateSel<T1> Head;</div><div class="line"><a name="l05417"></a><span class="lineno"> 5417</span>  <span class="keyword">typedef</span> Templates42<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l05418"></a><span class="lineno"> 5418</span>  T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,</div><div class="line"><a name="l05419"></a><span class="lineno"> 5419</span>  T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,</div><div class="line"><a name="l05420"></a><span class="lineno"> 5420</span>  T43> Tail;</div><div class="line"><a name="l05421"></a><span class="lineno"> 5421</span> };</div><div class="line"><a name="l05422"></a><span class="lineno"> 5422</span> </div><div class="line"><a name="l05423"></a><span class="lineno"> 5423</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l05424"></a><span class="lineno"> 5424</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l05425"></a><span class="lineno"> 5425</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l05426"></a><span class="lineno"> 5426</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l05427"></a><span class="lineno"> 5427</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,</div><div class="line"><a name="l05428"></a><span class="lineno"> 5428</span>  GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,</div><div class="line"><a name="l05429"></a><span class="lineno"> 5429</span>  GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,</div><div class="line"><a name="l05430"></a><span class="lineno"> 5430</span>  GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,</div><div class="line"><a name="l05431"></a><span class="lineno"> 5431</span>  GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,</div><div class="line"><a name="l05432"></a><span class="lineno"> 5432</span>  GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,</div><div class="line"><a name="l05433"></a><span class="lineno"> 5433</span>  GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,</div><div class="line"><a name="l05434"></a><span class="lineno"> 5434</span>  GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,</div><div class="line"><a name="l05435"></a><span class="lineno"> 5435</span>  GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,</div><div class="line"><a name="l05436"></a><span class="lineno"> 5436</span>  GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,</div><div class="line"><a name="l05437"></a><span class="lineno"> 5437</span>  GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44></div><div class="line"><a name="l05438"></a><span class="lineno"> 5438</span> <span class="keyword">struct </span>Templates44 {</div><div class="line"><a name="l05439"></a><span class="lineno"> 5439</span>  <span class="keyword">typedef</span> TemplateSel<T1> Head;</div><div class="line"><a name="l05440"></a><span class="lineno"> 5440</span>  <span class="keyword">typedef</span> Templates43<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l05441"></a><span class="lineno"> 5441</span>  T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,</div><div class="line"><a name="l05442"></a><span class="lineno"> 5442</span>  T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,</div><div class="line"><a name="l05443"></a><span class="lineno"> 5443</span>  T43, T44> Tail;</div><div class="line"><a name="l05444"></a><span class="lineno"> 5444</span> };</div><div class="line"><a name="l05445"></a><span class="lineno"> 5445</span> </div><div class="line"><a name="l05446"></a><span class="lineno"> 5446</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l05447"></a><span class="lineno"> 5447</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l05448"></a><span class="lineno"> 5448</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l05449"></a><span class="lineno"> 5449</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l05450"></a><span class="lineno"> 5450</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,</div><div class="line"><a name="l05451"></a><span class="lineno"> 5451</span>  GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,</div><div class="line"><a name="l05452"></a><span class="lineno"> 5452</span>  GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,</div><div class="line"><a name="l05453"></a><span class="lineno"> 5453</span>  GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,</div><div class="line"><a name="l05454"></a><span class="lineno"> 5454</span>  GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,</div><div class="line"><a name="l05455"></a><span class="lineno"> 5455</span>  GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,</div><div class="line"><a name="l05456"></a><span class="lineno"> 5456</span>  GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,</div><div class="line"><a name="l05457"></a><span class="lineno"> 5457</span>  GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,</div><div class="line"><a name="l05458"></a><span class="lineno"> 5458</span>  GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,</div><div class="line"><a name="l05459"></a><span class="lineno"> 5459</span>  GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,</div><div class="line"><a name="l05460"></a><span class="lineno"> 5460</span>  GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45></div><div class="line"><a name="l05461"></a><span class="lineno"> 5461</span> <span class="keyword">struct </span>Templates45 {</div><div class="line"><a name="l05462"></a><span class="lineno"> 5462</span>  <span class="keyword">typedef</span> TemplateSel<T1> Head;</div><div class="line"><a name="l05463"></a><span class="lineno"> 5463</span>  <span class="keyword">typedef</span> Templates44<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l05464"></a><span class="lineno"> 5464</span>  T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,</div><div class="line"><a name="l05465"></a><span class="lineno"> 5465</span>  T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,</div><div class="line"><a name="l05466"></a><span class="lineno"> 5466</span>  T43, T44, T45> Tail;</div><div class="line"><a name="l05467"></a><span class="lineno"> 5467</span> };</div><div class="line"><a name="l05468"></a><span class="lineno"> 5468</span> </div><div class="line"><a name="l05469"></a><span class="lineno"> 5469</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l05470"></a><span class="lineno"> 5470</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l05471"></a><span class="lineno"> 5471</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l05472"></a><span class="lineno"> 5472</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l05473"></a><span class="lineno"> 5473</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,</div><div class="line"><a name="l05474"></a><span class="lineno"> 5474</span>  GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,</div><div class="line"><a name="l05475"></a><span class="lineno"> 5475</span>  GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,</div><div class="line"><a name="l05476"></a><span class="lineno"> 5476</span>  GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,</div><div class="line"><a name="l05477"></a><span class="lineno"> 5477</span>  GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,</div><div class="line"><a name="l05478"></a><span class="lineno"> 5478</span>  GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,</div><div class="line"><a name="l05479"></a><span class="lineno"> 5479</span>  GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,</div><div class="line"><a name="l05480"></a><span class="lineno"> 5480</span>  GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,</div><div class="line"><a name="l05481"></a><span class="lineno"> 5481</span>  GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,</div><div class="line"><a name="l05482"></a><span class="lineno"> 5482</span>  GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,</div><div class="line"><a name="l05483"></a><span class="lineno"> 5483</span>  GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,</div><div class="line"><a name="l05484"></a><span class="lineno"> 5484</span>  GTEST_TEMPLATE_ T46></div><div class="line"><a name="l05485"></a><span class="lineno"> 5485</span> <span class="keyword">struct </span>Templates46 {</div><div class="line"><a name="l05486"></a><span class="lineno"> 5486</span>  <span class="keyword">typedef</span> TemplateSel<T1> Head;</div><div class="line"><a name="l05487"></a><span class="lineno"> 5487</span>  <span class="keyword">typedef</span> Templates45<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l05488"></a><span class="lineno"> 5488</span>  T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,</div><div class="line"><a name="l05489"></a><span class="lineno"> 5489</span>  T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,</div><div class="line"><a name="l05490"></a><span class="lineno"> 5490</span>  T43, T44, T45, T46> Tail;</div><div class="line"><a name="l05491"></a><span class="lineno"> 5491</span> };</div><div class="line"><a name="l05492"></a><span class="lineno"> 5492</span> </div><div class="line"><a name="l05493"></a><span class="lineno"> 5493</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l05494"></a><span class="lineno"> 5494</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l05495"></a><span class="lineno"> 5495</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l05496"></a><span class="lineno"> 5496</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l05497"></a><span class="lineno"> 5497</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,</div><div class="line"><a name="l05498"></a><span class="lineno"> 5498</span>  GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,</div><div class="line"><a name="l05499"></a><span class="lineno"> 5499</span>  GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,</div><div class="line"><a name="l05500"></a><span class="lineno"> 5500</span>  GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,</div><div class="line"><a name="l05501"></a><span class="lineno"> 5501</span>  GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,</div><div class="line"><a name="l05502"></a><span class="lineno"> 5502</span>  GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,</div><div class="line"><a name="l05503"></a><span class="lineno"> 5503</span>  GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,</div><div class="line"><a name="l05504"></a><span class="lineno"> 5504</span>  GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,</div><div class="line"><a name="l05505"></a><span class="lineno"> 5505</span>  GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,</div><div class="line"><a name="l05506"></a><span class="lineno"> 5506</span>  GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,</div><div class="line"><a name="l05507"></a><span class="lineno"> 5507</span>  GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,</div><div class="line"><a name="l05508"></a><span class="lineno"> 5508</span>  GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47></div><div class="line"><a name="l05509"></a><span class="lineno"> 5509</span> <span class="keyword">struct </span>Templates47 {</div><div class="line"><a name="l05510"></a><span class="lineno"> 5510</span>  <span class="keyword">typedef</span> TemplateSel<T1> Head;</div><div class="line"><a name="l05511"></a><span class="lineno"> 5511</span>  <span class="keyword">typedef</span> Templates46<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l05512"></a><span class="lineno"> 5512</span>  T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,</div><div class="line"><a name="l05513"></a><span class="lineno"> 5513</span>  T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,</div><div class="line"><a name="l05514"></a><span class="lineno"> 5514</span>  T43, T44, T45, T46, T47> Tail;</div><div class="line"><a name="l05515"></a><span class="lineno"> 5515</span> };</div><div class="line"><a name="l05516"></a><span class="lineno"> 5516</span> </div><div class="line"><a name="l05517"></a><span class="lineno"> 5517</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l05518"></a><span class="lineno"> 5518</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l05519"></a><span class="lineno"> 5519</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l05520"></a><span class="lineno"> 5520</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l05521"></a><span class="lineno"> 5521</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,</div><div class="line"><a name="l05522"></a><span class="lineno"> 5522</span>  GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,</div><div class="line"><a name="l05523"></a><span class="lineno"> 5523</span>  GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,</div><div class="line"><a name="l05524"></a><span class="lineno"> 5524</span>  GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,</div><div class="line"><a name="l05525"></a><span class="lineno"> 5525</span>  GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,</div><div class="line"><a name="l05526"></a><span class="lineno"> 5526</span>  GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,</div><div class="line"><a name="l05527"></a><span class="lineno"> 5527</span>  GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,</div><div class="line"><a name="l05528"></a><span class="lineno"> 5528</span>  GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,</div><div class="line"><a name="l05529"></a><span class="lineno"> 5529</span>  GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,</div><div class="line"><a name="l05530"></a><span class="lineno"> 5530</span>  GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,</div><div class="line"><a name="l05531"></a><span class="lineno"> 5531</span>  GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,</div><div class="line"><a name="l05532"></a><span class="lineno"> 5532</span>  GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48></div><div class="line"><a name="l05533"></a><span class="lineno"> 5533</span> <span class="keyword">struct </span>Templates48 {</div><div class="line"><a name="l05534"></a><span class="lineno"> 5534</span>  <span class="keyword">typedef</span> TemplateSel<T1> Head;</div><div class="line"><a name="l05535"></a><span class="lineno"> 5535</span>  <span class="keyword">typedef</span> Templates47<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l05536"></a><span class="lineno"> 5536</span>  T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,</div><div class="line"><a name="l05537"></a><span class="lineno"> 5537</span>  T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,</div><div class="line"><a name="l05538"></a><span class="lineno"> 5538</span>  T43, T44, T45, T46, T47, T48> Tail;</div><div class="line"><a name="l05539"></a><span class="lineno"> 5539</span> };</div><div class="line"><a name="l05540"></a><span class="lineno"> 5540</span> </div><div class="line"><a name="l05541"></a><span class="lineno"> 5541</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l05542"></a><span class="lineno"> 5542</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l05543"></a><span class="lineno"> 5543</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l05544"></a><span class="lineno"> 5544</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l05545"></a><span class="lineno"> 5545</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,</div><div class="line"><a name="l05546"></a><span class="lineno"> 5546</span>  GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,</div><div class="line"><a name="l05547"></a><span class="lineno"> 5547</span>  GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,</div><div class="line"><a name="l05548"></a><span class="lineno"> 5548</span>  GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,</div><div class="line"><a name="l05549"></a><span class="lineno"> 5549</span>  GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,</div><div class="line"><a name="l05550"></a><span class="lineno"> 5550</span>  GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,</div><div class="line"><a name="l05551"></a><span class="lineno"> 5551</span>  GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,</div><div class="line"><a name="l05552"></a><span class="lineno"> 5552</span>  GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,</div><div class="line"><a name="l05553"></a><span class="lineno"> 5553</span>  GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,</div><div class="line"><a name="l05554"></a><span class="lineno"> 5554</span>  GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,</div><div class="line"><a name="l05555"></a><span class="lineno"> 5555</span>  GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,</div><div class="line"><a name="l05556"></a><span class="lineno"> 5556</span>  GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48,</div><div class="line"><a name="l05557"></a><span class="lineno"> 5557</span>  GTEST_TEMPLATE_ T49></div><div class="line"><a name="l05558"></a><span class="lineno"> 5558</span> <span class="keyword">struct </span>Templates49 {</div><div class="line"><a name="l05559"></a><span class="lineno"> 5559</span>  <span class="keyword">typedef</span> TemplateSel<T1> Head;</div><div class="line"><a name="l05560"></a><span class="lineno"> 5560</span>  <span class="keyword">typedef</span> Templates48<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l05561"></a><span class="lineno"> 5561</span>  T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,</div><div class="line"><a name="l05562"></a><span class="lineno"> 5562</span>  T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,</div><div class="line"><a name="l05563"></a><span class="lineno"> 5563</span>  T43, T44, T45, T46, T47, T48, T49> Tail;</div><div class="line"><a name="l05564"></a><span class="lineno"> 5564</span> };</div><div class="line"><a name="l05565"></a><span class="lineno"> 5565</span> </div><div class="line"><a name="l05566"></a><span class="lineno"> 5566</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l05567"></a><span class="lineno"> 5567</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l05568"></a><span class="lineno"> 5568</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l05569"></a><span class="lineno"> 5569</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l05570"></a><span class="lineno"> 5570</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,</div><div class="line"><a name="l05571"></a><span class="lineno"> 5571</span>  GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,</div><div class="line"><a name="l05572"></a><span class="lineno"> 5572</span>  GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,</div><div class="line"><a name="l05573"></a><span class="lineno"> 5573</span>  GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,</div><div class="line"><a name="l05574"></a><span class="lineno"> 5574</span>  GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,</div><div class="line"><a name="l05575"></a><span class="lineno"> 5575</span>  GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,</div><div class="line"><a name="l05576"></a><span class="lineno"> 5576</span>  GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,</div><div class="line"><a name="l05577"></a><span class="lineno"> 5577</span>  GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,</div><div class="line"><a name="l05578"></a><span class="lineno"> 5578</span>  GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,</div><div class="line"><a name="l05579"></a><span class="lineno"> 5579</span>  GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,</div><div class="line"><a name="l05580"></a><span class="lineno"> 5580</span>  GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,</div><div class="line"><a name="l05581"></a><span class="lineno"> 5581</span>  GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48,</div><div class="line"><a name="l05582"></a><span class="lineno"> 5582</span>  GTEST_TEMPLATE_ T49, GTEST_TEMPLATE_ T50></div><div class="line"><a name="l05583"></a><span class="lineno"> 5583</span> <span class="keyword">struct </span>Templates50 {</div><div class="line"><a name="l05584"></a><span class="lineno"> 5584</span>  <span class="keyword">typedef</span> TemplateSel<T1> Head;</div><div class="line"><a name="l05585"></a><span class="lineno"> 5585</span>  <span class="keyword">typedef</span> Templates49<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l05586"></a><span class="lineno"> 5586</span>  T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,</div><div class="line"><a name="l05587"></a><span class="lineno"> 5587</span>  T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,</div><div class="line"><a name="l05588"></a><span class="lineno"> 5588</span>  T43, T44, T45, T46, T47, T48, T49, T50> Tail;</div><div class="line"><a name="l05589"></a><span class="lineno"> 5589</span> };</div><div class="line"><a name="l05590"></a><span class="lineno"> 5590</span> </div><div class="line"><a name="l05591"></a><span class="lineno"> 5591</span> </div><div class="line"><a name="l05592"></a><span class="lineno"> 5592</span> <span class="comment">// We don't want to require the users to write TemplatesN<...> directly,</span></div><div class="line"><a name="l05593"></a><span class="lineno"> 5593</span> <span class="comment">// as that would require them to count the length. Templates<...> is much</span></div><div class="line"><a name="l05594"></a><span class="lineno"> 5594</span> <span class="comment">// easier to write, but generates horrible messages when there is a</span></div><div class="line"><a name="l05595"></a><span class="lineno"> 5595</span> <span class="comment">// compiler error, as gcc insists on printing out each template</span></div><div class="line"><a name="l05596"></a><span class="lineno"> 5596</span> <span class="comment">// argument, even if it has the default value (this means Templates<list></span></div><div class="line"><a name="l05597"></a><span class="lineno"> 5597</span> <span class="comment">// will appear as Templates<list, NoneT, NoneT, ..., NoneT> in the compiler</span></div><div class="line"><a name="l05598"></a><span class="lineno"> 5598</span> <span class="comment">// errors).</span></div><div class="line"><a name="l05599"></a><span class="lineno"> 5599</span> <span class="comment">//</span></div><div class="line"><a name="l05600"></a><span class="lineno"> 5600</span> <span class="comment">// Our solution is to combine the best part of the two approaches: a</span></div><div class="line"><a name="l05601"></a><span class="lineno"> 5601</span> <span class="comment">// user would write Templates<T1, ..., TN>, and Google Test will translate</span></div><div class="line"><a name="l05602"></a><span class="lineno"> 5602</span> <span class="comment">// that to TemplatesN<T1, ..., TN> internally to make error messages</span></div><div class="line"><a name="l05603"></a><span class="lineno"> 5603</span> <span class="comment">// readable. The translation is done by the 'type' member of the</span></div><div class="line"><a name="l05604"></a><span class="lineno"> 5604</span> <span class="comment">// Templates template.</span></div><div class="line"><a name="l05605"></a><span class="lineno"> 5605</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1 = NoneT, GTEST_TEMPLATE_ T2 = NoneT,</div><div class="line"><a name="l05606"></a><span class="lineno"> 5606</span>  GTEST_TEMPLATE_ T3 = NoneT, GTEST_TEMPLATE_ T4 = NoneT,</div><div class="line"><a name="l05607"></a><span class="lineno"> 5607</span>  GTEST_TEMPLATE_ T5 = NoneT, GTEST_TEMPLATE_ T6 = NoneT,</div><div class="line"><a name="l05608"></a><span class="lineno"> 5608</span>  GTEST_TEMPLATE_ T7 = NoneT, GTEST_TEMPLATE_ T8 = NoneT,</div><div class="line"><a name="l05609"></a><span class="lineno"> 5609</span>  GTEST_TEMPLATE_ T9 = NoneT, GTEST_TEMPLATE_ T10 = NoneT,</div><div class="line"><a name="l05610"></a><span class="lineno"> 5610</span>  GTEST_TEMPLATE_ T11 = NoneT, GTEST_TEMPLATE_ T12 = NoneT,</div><div class="line"><a name="l05611"></a><span class="lineno"> 5611</span>  GTEST_TEMPLATE_ T13 = NoneT, GTEST_TEMPLATE_ T14 = NoneT,</div><div class="line"><a name="l05612"></a><span class="lineno"> 5612</span>  GTEST_TEMPLATE_ T15 = NoneT, GTEST_TEMPLATE_ T16 = NoneT,</div><div class="line"><a name="l05613"></a><span class="lineno"> 5613</span>  GTEST_TEMPLATE_ T17 = NoneT, GTEST_TEMPLATE_ T18 = NoneT,</div><div class="line"><a name="l05614"></a><span class="lineno"> 5614</span>  GTEST_TEMPLATE_ T19 = NoneT, GTEST_TEMPLATE_ T20 = NoneT,</div><div class="line"><a name="l05615"></a><span class="lineno"> 5615</span>  GTEST_TEMPLATE_ T21 = NoneT, GTEST_TEMPLATE_ T22 = NoneT,</div><div class="line"><a name="l05616"></a><span class="lineno"> 5616</span>  GTEST_TEMPLATE_ T23 = NoneT, GTEST_TEMPLATE_ T24 = NoneT,</div><div class="line"><a name="l05617"></a><span class="lineno"> 5617</span>  GTEST_TEMPLATE_ T25 = NoneT, GTEST_TEMPLATE_ T26 = NoneT,</div><div class="line"><a name="l05618"></a><span class="lineno"> 5618</span>  GTEST_TEMPLATE_ T27 = NoneT, GTEST_TEMPLATE_ T28 = NoneT,</div><div class="line"><a name="l05619"></a><span class="lineno"> 5619</span>  GTEST_TEMPLATE_ T29 = NoneT, GTEST_TEMPLATE_ T30 = NoneT,</div><div class="line"><a name="l05620"></a><span class="lineno"> 5620</span>  GTEST_TEMPLATE_ T31 = NoneT, GTEST_TEMPLATE_ T32 = NoneT,</div><div class="line"><a name="l05621"></a><span class="lineno"> 5621</span>  GTEST_TEMPLATE_ T33 = NoneT, GTEST_TEMPLATE_ T34 = NoneT,</div><div class="line"><a name="l05622"></a><span class="lineno"> 5622</span>  GTEST_TEMPLATE_ T35 = NoneT, GTEST_TEMPLATE_ T36 = NoneT,</div><div class="line"><a name="l05623"></a><span class="lineno"> 5623</span>  GTEST_TEMPLATE_ T37 = NoneT, GTEST_TEMPLATE_ T38 = NoneT,</div><div class="line"><a name="l05624"></a><span class="lineno"> 5624</span>  GTEST_TEMPLATE_ T39 = NoneT, GTEST_TEMPLATE_ T40 = NoneT,</div><div class="line"><a name="l05625"></a><span class="lineno"> 5625</span>  GTEST_TEMPLATE_ T41 = NoneT, GTEST_TEMPLATE_ T42 = NoneT,</div><div class="line"><a name="l05626"></a><span class="lineno"> 5626</span>  GTEST_TEMPLATE_ T43 = NoneT, GTEST_TEMPLATE_ T44 = NoneT,</div><div class="line"><a name="l05627"></a><span class="lineno"> 5627</span>  GTEST_TEMPLATE_ T45 = NoneT, GTEST_TEMPLATE_ T46 = NoneT,</div><div class="line"><a name="l05628"></a><span class="lineno"> 5628</span>  GTEST_TEMPLATE_ T47 = NoneT, GTEST_TEMPLATE_ T48 = NoneT,</div><div class="line"><a name="l05629"></a><span class="lineno"> 5629</span>  GTEST_TEMPLATE_ T49 = NoneT, GTEST_TEMPLATE_ T50 = NoneT></div><div class="line"><a name="l05630"></a><span class="lineno"> 5630</span> <span class="keyword">struct </span>Templates {</div><div class="line"><a name="l05631"></a><span class="lineno"> 5631</span>  <span class="keyword">typedef</span> Templates50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,</div><div class="line"><a name="l05632"></a><span class="lineno"> 5632</span>  T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,</div><div class="line"><a name="l05633"></a><span class="lineno"> 5633</span>  T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,</div><div class="line"><a name="l05634"></a><span class="lineno"> 5634</span>  T42, T43, T44, T45, T46, T47, T48, T49, T50> type;</div><div class="line"><a name="l05635"></a><span class="lineno"> 5635</span> };</div><div class="line"><a name="l05636"></a><span class="lineno"> 5636</span> </div><div class="line"><a name="l05637"></a><span class="lineno"> 5637</span> <span class="keyword">template</span> <></div><div class="line"><a name="l05638"></a><span class="lineno"> 5638</span> <span class="keyword">struct </span>Templates<NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05639"></a><span class="lineno"> 5639</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05640"></a><span class="lineno"> 5640</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05641"></a><span class="lineno"> 5641</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05642"></a><span class="lineno"> 5642</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05643"></a><span class="lineno"> 5643</span>  NoneT> {</div><div class="line"><a name="l05644"></a><span class="lineno"> 5644</span>  <span class="keyword">typedef</span> Templates0 type;</div><div class="line"><a name="l05645"></a><span class="lineno"> 5645</span> };</div><div class="line"><a name="l05646"></a><span class="lineno"> 5646</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1></div><div class="line"><a name="l05647"></a><span class="lineno"> 5647</span> <span class="keyword">struct </span>Templates<T1, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05648"></a><span class="lineno"> 5648</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05649"></a><span class="lineno"> 5649</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05650"></a><span class="lineno"> 5650</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05651"></a><span class="lineno"> 5651</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05652"></a><span class="lineno"> 5652</span>  NoneT> {</div><div class="line"><a name="l05653"></a><span class="lineno"> 5653</span>  <span class="keyword">typedef</span> Templates1<T1> type;</div><div class="line"><a name="l05654"></a><span class="lineno"> 5654</span> };</div><div class="line"><a name="l05655"></a><span class="lineno"> 5655</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2></div><div class="line"><a name="l05656"></a><span class="lineno"> 5656</span> <span class="keyword">struct </span>Templates<T1, T2, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05657"></a><span class="lineno"> 5657</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05658"></a><span class="lineno"> 5658</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05659"></a><span class="lineno"> 5659</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05660"></a><span class="lineno"> 5660</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05661"></a><span class="lineno"> 5661</span>  NoneT> {</div><div class="line"><a name="l05662"></a><span class="lineno"> 5662</span>  <span class="keyword">typedef</span> Templates2<T1, T2> type;</div><div class="line"><a name="l05663"></a><span class="lineno"> 5663</span> };</div><div class="line"><a name="l05664"></a><span class="lineno"> 5664</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3></div><div class="line"><a name="l05665"></a><span class="lineno"> 5665</span> <span class="keyword">struct </span>Templates<T1, T2, T3, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05666"></a><span class="lineno"> 5666</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05667"></a><span class="lineno"> 5667</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05668"></a><span class="lineno"> 5668</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05669"></a><span class="lineno"> 5669</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {</div><div class="line"><a name="l05670"></a><span class="lineno"> 5670</span>  <span class="keyword">typedef</span> Templates3<T1, T2, T3> type;</div><div class="line"><a name="l05671"></a><span class="lineno"> 5671</span> };</div><div class="line"><a name="l05672"></a><span class="lineno"> 5672</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l05673"></a><span class="lineno"> 5673</span>  GTEST_TEMPLATE_ T4></div><div class="line"><a name="l05674"></a><span class="lineno"> 5674</span> <span class="keyword">struct </span>Templates<T1, T2, T3, T4, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05675"></a><span class="lineno"> 5675</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05676"></a><span class="lineno"> 5676</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05677"></a><span class="lineno"> 5677</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05678"></a><span class="lineno"> 5678</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {</div><div class="line"><a name="l05679"></a><span class="lineno"> 5679</span>  <span class="keyword">typedef</span> Templates4<T1, T2, T3, T4> type;</div><div class="line"><a name="l05680"></a><span class="lineno"> 5680</span> };</div><div class="line"><a name="l05681"></a><span class="lineno"> 5681</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l05682"></a><span class="lineno"> 5682</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5></div><div class="line"><a name="l05683"></a><span class="lineno"> 5683</span> <span class="keyword">struct </span>Templates<T1, T2, T3, T4, T5, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05684"></a><span class="lineno"> 5684</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05685"></a><span class="lineno"> 5685</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05686"></a><span class="lineno"> 5686</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05687"></a><span class="lineno"> 5687</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {</div><div class="line"><a name="l05688"></a><span class="lineno"> 5688</span>  <span class="keyword">typedef</span> Templates5<T1, T2, T3, T4, T5> type;</div><div class="line"><a name="l05689"></a><span class="lineno"> 5689</span> };</div><div class="line"><a name="l05690"></a><span class="lineno"> 5690</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l05691"></a><span class="lineno"> 5691</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6></div><div class="line"><a name="l05692"></a><span class="lineno"> 5692</span> <span class="keyword">struct </span>Templates<T1, T2, T3, T4, T5, T6, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05693"></a><span class="lineno"> 5693</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05694"></a><span class="lineno"> 5694</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05695"></a><span class="lineno"> 5695</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05696"></a><span class="lineno"> 5696</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {</div><div class="line"><a name="l05697"></a><span class="lineno"> 5697</span>  <span class="keyword">typedef</span> Templates6<T1, T2, T3, T4, T5, T6> type;</div><div class="line"><a name="l05698"></a><span class="lineno"> 5698</span> };</div><div class="line"><a name="l05699"></a><span class="lineno"> 5699</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l05700"></a><span class="lineno"> 5700</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l05701"></a><span class="lineno"> 5701</span>  GTEST_TEMPLATE_ T7></div><div class="line"><a name="l05702"></a><span class="lineno"> 5702</span> <span class="keyword">struct </span>Templates<T1, T2, T3, T4, T5, T6, T7, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05703"></a><span class="lineno"> 5703</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05704"></a><span class="lineno"> 5704</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05705"></a><span class="lineno"> 5705</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05706"></a><span class="lineno"> 5706</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {</div><div class="line"><a name="l05707"></a><span class="lineno"> 5707</span>  <span class="keyword">typedef</span> Templates7<T1, T2, T3, T4, T5, T6, T7> type;</div><div class="line"><a name="l05708"></a><span class="lineno"> 5708</span> };</div><div class="line"><a name="l05709"></a><span class="lineno"> 5709</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l05710"></a><span class="lineno"> 5710</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l05711"></a><span class="lineno"> 5711</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8></div><div class="line"><a name="l05712"></a><span class="lineno"> 5712</span> <span class="keyword">struct </span>Templates<T1, T2, T3, T4, T5, T6, T7, T8, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05713"></a><span class="lineno"> 5713</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05714"></a><span class="lineno"> 5714</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05715"></a><span class="lineno"> 5715</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05716"></a><span class="lineno"> 5716</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {</div><div class="line"><a name="l05717"></a><span class="lineno"> 5717</span>  <span class="keyword">typedef</span> Templates8<T1, T2, T3, T4, T5, T6, T7, T8> type;</div><div class="line"><a name="l05718"></a><span class="lineno"> 5718</span> };</div><div class="line"><a name="l05719"></a><span class="lineno"> 5719</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l05720"></a><span class="lineno"> 5720</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l05721"></a><span class="lineno"> 5721</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9></div><div class="line"><a name="l05722"></a><span class="lineno"> 5722</span> <span class="keyword">struct </span>Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05723"></a><span class="lineno"> 5723</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05724"></a><span class="lineno"> 5724</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05725"></a><span class="lineno"> 5725</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05726"></a><span class="lineno"> 5726</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {</div><div class="line"><a name="l05727"></a><span class="lineno"> 5727</span>  <span class="keyword">typedef</span> Templates9<T1, T2, T3, T4, T5, T6, T7, T8, T9> type;</div><div class="line"><a name="l05728"></a><span class="lineno"> 5728</span> };</div><div class="line"><a name="l05729"></a><span class="lineno"> 5729</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l05730"></a><span class="lineno"> 5730</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l05731"></a><span class="lineno"> 5731</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l05732"></a><span class="lineno"> 5732</span>  GTEST_TEMPLATE_ T10></div><div class="line"><a name="l05733"></a><span class="lineno"> 5733</span> <span class="keyword">struct </span>Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05734"></a><span class="lineno"> 5734</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05735"></a><span class="lineno"> 5735</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05736"></a><span class="lineno"> 5736</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05737"></a><span class="lineno"> 5737</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {</div><div class="line"><a name="l05738"></a><span class="lineno"> 5738</span>  <span class="keyword">typedef</span> Templates10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> type;</div><div class="line"><a name="l05739"></a><span class="lineno"> 5739</span> };</div><div class="line"><a name="l05740"></a><span class="lineno"> 5740</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l05741"></a><span class="lineno"> 5741</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l05742"></a><span class="lineno"> 5742</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l05743"></a><span class="lineno"> 5743</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11></div><div class="line"><a name="l05744"></a><span class="lineno"> 5744</span> <span class="keyword">struct </span>Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, NoneT, NoneT,</div><div class="line"><a name="l05745"></a><span class="lineno"> 5745</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05746"></a><span class="lineno"> 5746</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05747"></a><span class="lineno"> 5747</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05748"></a><span class="lineno"> 5748</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {</div><div class="line"><a name="l05749"></a><span class="lineno"> 5749</span>  <span class="keyword">typedef</span> Templates11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> type;</div><div class="line"><a name="l05750"></a><span class="lineno"> 5750</span> };</div><div class="line"><a name="l05751"></a><span class="lineno"> 5751</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l05752"></a><span class="lineno"> 5752</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l05753"></a><span class="lineno"> 5753</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l05754"></a><span class="lineno"> 5754</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12></div><div class="line"><a name="l05755"></a><span class="lineno"> 5755</span> <span class="keyword">struct </span>Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, NoneT,</div><div class="line"><a name="l05756"></a><span class="lineno"> 5756</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05757"></a><span class="lineno"> 5757</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05758"></a><span class="lineno"> 5758</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05759"></a><span class="lineno"> 5759</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {</div><div class="line"><a name="l05760"></a><span class="lineno"> 5760</span>  <span class="keyword">typedef</span> Templates12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> type;</div><div class="line"><a name="l05761"></a><span class="lineno"> 5761</span> };</div><div class="line"><a name="l05762"></a><span class="lineno"> 5762</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l05763"></a><span class="lineno"> 5763</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l05764"></a><span class="lineno"> 5764</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l05765"></a><span class="lineno"> 5765</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l05766"></a><span class="lineno"> 5766</span>  GTEST_TEMPLATE_ T13></div><div class="line"><a name="l05767"></a><span class="lineno"> 5767</span> <span class="keyword">struct </span>Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, NoneT,</div><div class="line"><a name="l05768"></a><span class="lineno"> 5768</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05769"></a><span class="lineno"> 5769</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05770"></a><span class="lineno"> 5770</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05771"></a><span class="lineno"> 5771</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {</div><div class="line"><a name="l05772"></a><span class="lineno"> 5772</span>  <span class="keyword">typedef</span> Templates13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,</div><div class="line"><a name="l05773"></a><span class="lineno"> 5773</span>  T13> type;</div><div class="line"><a name="l05774"></a><span class="lineno"> 5774</span> };</div><div class="line"><a name="l05775"></a><span class="lineno"> 5775</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l05776"></a><span class="lineno"> 5776</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l05777"></a><span class="lineno"> 5777</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l05778"></a><span class="lineno"> 5778</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l05779"></a><span class="lineno"> 5779</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14></div><div class="line"><a name="l05780"></a><span class="lineno"> 5780</span> <span class="keyword">struct </span>Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l05781"></a><span class="lineno"> 5781</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05782"></a><span class="lineno"> 5782</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05783"></a><span class="lineno"> 5783</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05784"></a><span class="lineno"> 5784</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {</div><div class="line"><a name="l05785"></a><span class="lineno"> 5785</span>  <span class="keyword">typedef</span> Templates14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,</div><div class="line"><a name="l05786"></a><span class="lineno"> 5786</span>  T14> type;</div><div class="line"><a name="l05787"></a><span class="lineno"> 5787</span> };</div><div class="line"><a name="l05788"></a><span class="lineno"> 5788</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l05789"></a><span class="lineno"> 5789</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l05790"></a><span class="lineno"> 5790</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l05791"></a><span class="lineno"> 5791</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l05792"></a><span class="lineno"> 5792</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15></div><div class="line"><a name="l05793"></a><span class="lineno"> 5793</span> <span class="keyword">struct </span>Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l05794"></a><span class="lineno"> 5794</span>  T15, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05795"></a><span class="lineno"> 5795</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05796"></a><span class="lineno"> 5796</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05797"></a><span class="lineno"> 5797</span>  NoneT, NoneT, NoneT, NoneT, NoneT> {</div><div class="line"><a name="l05798"></a><span class="lineno"> 5798</span>  <span class="keyword">typedef</span> Templates15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,</div><div class="line"><a name="l05799"></a><span class="lineno"> 5799</span>  T14, T15> type;</div><div class="line"><a name="l05800"></a><span class="lineno"> 5800</span> };</div><div class="line"><a name="l05801"></a><span class="lineno"> 5801</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l05802"></a><span class="lineno"> 5802</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l05803"></a><span class="lineno"> 5803</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l05804"></a><span class="lineno"> 5804</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l05805"></a><span class="lineno"> 5805</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,</div><div class="line"><a name="l05806"></a><span class="lineno"> 5806</span>  GTEST_TEMPLATE_ T16></div><div class="line"><a name="l05807"></a><span class="lineno"> 5807</span> <span class="keyword">struct </span>Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l05808"></a><span class="lineno"> 5808</span>  T15, T16, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05809"></a><span class="lineno"> 5809</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05810"></a><span class="lineno"> 5810</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05811"></a><span class="lineno"> 5811</span>  NoneT, NoneT, NoneT, NoneT, NoneT> {</div><div class="line"><a name="l05812"></a><span class="lineno"> 5812</span>  <span class="keyword">typedef</span> Templates16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,</div><div class="line"><a name="l05813"></a><span class="lineno"> 5813</span>  T14, T15, T16> type;</div><div class="line"><a name="l05814"></a><span class="lineno"> 5814</span> };</div><div class="line"><a name="l05815"></a><span class="lineno"> 5815</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l05816"></a><span class="lineno"> 5816</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l05817"></a><span class="lineno"> 5817</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l05818"></a><span class="lineno"> 5818</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l05819"></a><span class="lineno"> 5819</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,</div><div class="line"><a name="l05820"></a><span class="lineno"> 5820</span>  GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17></div><div class="line"><a name="l05821"></a><span class="lineno"> 5821</span> <span class="keyword">struct </span>Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l05822"></a><span class="lineno"> 5822</span>  T15, T16, T17, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05823"></a><span class="lineno"> 5823</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05824"></a><span class="lineno"> 5824</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05825"></a><span class="lineno"> 5825</span>  NoneT, NoneT, NoneT, NoneT, NoneT> {</div><div class="line"><a name="l05826"></a><span class="lineno"> 5826</span>  <span class="keyword">typedef</span> Templates17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,</div><div class="line"><a name="l05827"></a><span class="lineno"> 5827</span>  T14, T15, T16, T17> type;</div><div class="line"><a name="l05828"></a><span class="lineno"> 5828</span> };</div><div class="line"><a name="l05829"></a><span class="lineno"> 5829</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l05830"></a><span class="lineno"> 5830</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l05831"></a><span class="lineno"> 5831</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l05832"></a><span class="lineno"> 5832</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l05833"></a><span class="lineno"> 5833</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,</div><div class="line"><a name="l05834"></a><span class="lineno"> 5834</span>  GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18></div><div class="line"><a name="l05835"></a><span class="lineno"> 5835</span> <span class="keyword">struct </span>Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l05836"></a><span class="lineno"> 5836</span>  T15, T16, T17, T18, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05837"></a><span class="lineno"> 5837</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05838"></a><span class="lineno"> 5838</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05839"></a><span class="lineno"> 5839</span>  NoneT, NoneT, NoneT, NoneT> {</div><div class="line"><a name="l05840"></a><span class="lineno"> 5840</span>  <span class="keyword">typedef</span> Templates18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,</div><div class="line"><a name="l05841"></a><span class="lineno"> 5841</span>  T14, T15, T16, T17, T18> type;</div><div class="line"><a name="l05842"></a><span class="lineno"> 5842</span> };</div><div class="line"><a name="l05843"></a><span class="lineno"> 5843</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l05844"></a><span class="lineno"> 5844</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l05845"></a><span class="lineno"> 5845</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l05846"></a><span class="lineno"> 5846</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l05847"></a><span class="lineno"> 5847</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,</div><div class="line"><a name="l05848"></a><span class="lineno"> 5848</span>  GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,</div><div class="line"><a name="l05849"></a><span class="lineno"> 5849</span>  GTEST_TEMPLATE_ T19></div><div class="line"><a name="l05850"></a><span class="lineno"> 5850</span> <span class="keyword">struct </span>Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l05851"></a><span class="lineno"> 5851</span>  T15, T16, T17, T18, T19, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05852"></a><span class="lineno"> 5852</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05853"></a><span class="lineno"> 5853</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05854"></a><span class="lineno"> 5854</span>  NoneT, NoneT, NoneT, NoneT> {</div><div class="line"><a name="l05855"></a><span class="lineno"> 5855</span>  <span class="keyword">typedef</span> Templates19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,</div><div class="line"><a name="l05856"></a><span class="lineno"> 5856</span>  T14, T15, T16, T17, T18, T19> type;</div><div class="line"><a name="l05857"></a><span class="lineno"> 5857</span> };</div><div class="line"><a name="l05858"></a><span class="lineno"> 5858</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l05859"></a><span class="lineno"> 5859</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l05860"></a><span class="lineno"> 5860</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l05861"></a><span class="lineno"> 5861</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l05862"></a><span class="lineno"> 5862</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,</div><div class="line"><a name="l05863"></a><span class="lineno"> 5863</span>  GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,</div><div class="line"><a name="l05864"></a><span class="lineno"> 5864</span>  GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20></div><div class="line"><a name="l05865"></a><span class="lineno"> 5865</span> <span class="keyword">struct </span>Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l05866"></a><span class="lineno"> 5866</span>  T15, T16, T17, T18, T19, T20, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05867"></a><span class="lineno"> 5867</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05868"></a><span class="lineno"> 5868</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05869"></a><span class="lineno"> 5869</span>  NoneT, NoneT, NoneT, NoneT> {</div><div class="line"><a name="l05870"></a><span class="lineno"> 5870</span>  <span class="keyword">typedef</span> Templates20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,</div><div class="line"><a name="l05871"></a><span class="lineno"> 5871</span>  T14, T15, T16, T17, T18, T19, T20> type;</div><div class="line"><a name="l05872"></a><span class="lineno"> 5872</span> };</div><div class="line"><a name="l05873"></a><span class="lineno"> 5873</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l05874"></a><span class="lineno"> 5874</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l05875"></a><span class="lineno"> 5875</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l05876"></a><span class="lineno"> 5876</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l05877"></a><span class="lineno"> 5877</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,</div><div class="line"><a name="l05878"></a><span class="lineno"> 5878</span>  GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,</div><div class="line"><a name="l05879"></a><span class="lineno"> 5879</span>  GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21></div><div class="line"><a name="l05880"></a><span class="lineno"> 5880</span> <span class="keyword">struct </span>Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l05881"></a><span class="lineno"> 5881</span>  T15, T16, T17, T18, T19, T20, T21, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05882"></a><span class="lineno"> 5882</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05883"></a><span class="lineno"> 5883</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05884"></a><span class="lineno"> 5884</span>  NoneT, NoneT, NoneT, NoneT> {</div><div class="line"><a name="l05885"></a><span class="lineno"> 5885</span>  <span class="keyword">typedef</span> Templates21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,</div><div class="line"><a name="l05886"></a><span class="lineno"> 5886</span>  T14, T15, T16, T17, T18, T19, T20, T21> type;</div><div class="line"><a name="l05887"></a><span class="lineno"> 5887</span> };</div><div class="line"><a name="l05888"></a><span class="lineno"> 5888</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l05889"></a><span class="lineno"> 5889</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l05890"></a><span class="lineno"> 5890</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l05891"></a><span class="lineno"> 5891</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l05892"></a><span class="lineno"> 5892</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,</div><div class="line"><a name="l05893"></a><span class="lineno"> 5893</span>  GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,</div><div class="line"><a name="l05894"></a><span class="lineno"> 5894</span>  GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,</div><div class="line"><a name="l05895"></a><span class="lineno"> 5895</span>  GTEST_TEMPLATE_ T22></div><div class="line"><a name="l05896"></a><span class="lineno"> 5896</span> <span class="keyword">struct </span>Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l05897"></a><span class="lineno"> 5897</span>  T15, T16, T17, T18, T19, T20, T21, T22, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05898"></a><span class="lineno"> 5898</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05899"></a><span class="lineno"> 5899</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05900"></a><span class="lineno"> 5900</span>  NoneT, NoneT, NoneT> {</div><div class="line"><a name="l05901"></a><span class="lineno"> 5901</span>  <span class="keyword">typedef</span> Templates22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,</div><div class="line"><a name="l05902"></a><span class="lineno"> 5902</span>  T14, T15, T16, T17, T18, T19, T20, T21, T22> type;</div><div class="line"><a name="l05903"></a><span class="lineno"> 5903</span> };</div><div class="line"><a name="l05904"></a><span class="lineno"> 5904</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l05905"></a><span class="lineno"> 5905</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l05906"></a><span class="lineno"> 5906</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l05907"></a><span class="lineno"> 5907</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l05908"></a><span class="lineno"> 5908</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,</div><div class="line"><a name="l05909"></a><span class="lineno"> 5909</span>  GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,</div><div class="line"><a name="l05910"></a><span class="lineno"> 5910</span>  GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,</div><div class="line"><a name="l05911"></a><span class="lineno"> 5911</span>  GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23></div><div class="line"><a name="l05912"></a><span class="lineno"> 5912</span> <span class="keyword">struct </span>Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l05913"></a><span class="lineno"> 5913</span>  T15, T16, T17, T18, T19, T20, T21, T22, T23, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05914"></a><span class="lineno"> 5914</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05915"></a><span class="lineno"> 5915</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05916"></a><span class="lineno"> 5916</span>  NoneT, NoneT, NoneT> {</div><div class="line"><a name="l05917"></a><span class="lineno"> 5917</span>  <span class="keyword">typedef</span> Templates23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,</div><div class="line"><a name="l05918"></a><span class="lineno"> 5918</span>  T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> type;</div><div class="line"><a name="l05919"></a><span class="lineno"> 5919</span> };</div><div class="line"><a name="l05920"></a><span class="lineno"> 5920</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l05921"></a><span class="lineno"> 5921</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l05922"></a><span class="lineno"> 5922</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l05923"></a><span class="lineno"> 5923</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l05924"></a><span class="lineno"> 5924</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,</div><div class="line"><a name="l05925"></a><span class="lineno"> 5925</span>  GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,</div><div class="line"><a name="l05926"></a><span class="lineno"> 5926</span>  GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,</div><div class="line"><a name="l05927"></a><span class="lineno"> 5927</span>  GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24></div><div class="line"><a name="l05928"></a><span class="lineno"> 5928</span> <span class="keyword">struct </span>Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l05929"></a><span class="lineno"> 5929</span>  T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05930"></a><span class="lineno"> 5930</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05931"></a><span class="lineno"> 5931</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05932"></a><span class="lineno"> 5932</span>  NoneT, NoneT, NoneT> {</div><div class="line"><a name="l05933"></a><span class="lineno"> 5933</span>  <span class="keyword">typedef</span> Templates24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,</div><div class="line"><a name="l05934"></a><span class="lineno"> 5934</span>  T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> type;</div><div class="line"><a name="l05935"></a><span class="lineno"> 5935</span> };</div><div class="line"><a name="l05936"></a><span class="lineno"> 5936</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l05937"></a><span class="lineno"> 5937</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l05938"></a><span class="lineno"> 5938</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l05939"></a><span class="lineno"> 5939</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l05940"></a><span class="lineno"> 5940</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,</div><div class="line"><a name="l05941"></a><span class="lineno"> 5941</span>  GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,</div><div class="line"><a name="l05942"></a><span class="lineno"> 5942</span>  GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,</div><div class="line"><a name="l05943"></a><span class="lineno"> 5943</span>  GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,</div><div class="line"><a name="l05944"></a><span class="lineno"> 5944</span>  GTEST_TEMPLATE_ T25></div><div class="line"><a name="l05945"></a><span class="lineno"> 5945</span> <span class="keyword">struct </span>Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l05946"></a><span class="lineno"> 5946</span>  T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05947"></a><span class="lineno"> 5947</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05948"></a><span class="lineno"> 5948</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05949"></a><span class="lineno"> 5949</span>  NoneT, NoneT> {</div><div class="line"><a name="l05950"></a><span class="lineno"> 5950</span>  <span class="keyword">typedef</span> Templates25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,</div><div class="line"><a name="l05951"></a><span class="lineno"> 5951</span>  T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> type;</div><div class="line"><a name="l05952"></a><span class="lineno"> 5952</span> };</div><div class="line"><a name="l05953"></a><span class="lineno"> 5953</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l05954"></a><span class="lineno"> 5954</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l05955"></a><span class="lineno"> 5955</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l05956"></a><span class="lineno"> 5956</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l05957"></a><span class="lineno"> 5957</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,</div><div class="line"><a name="l05958"></a><span class="lineno"> 5958</span>  GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,</div><div class="line"><a name="l05959"></a><span class="lineno"> 5959</span>  GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,</div><div class="line"><a name="l05960"></a><span class="lineno"> 5960</span>  GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,</div><div class="line"><a name="l05961"></a><span class="lineno"> 5961</span>  GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26></div><div class="line"><a name="l05962"></a><span class="lineno"> 5962</span> <span class="keyword">struct </span>Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l05963"></a><span class="lineno"> 5963</span>  T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, NoneT, NoneT,</div><div class="line"><a name="l05964"></a><span class="lineno"> 5964</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05965"></a><span class="lineno"> 5965</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05966"></a><span class="lineno"> 5966</span>  NoneT, NoneT> {</div><div class="line"><a name="l05967"></a><span class="lineno"> 5967</span>  <span class="keyword">typedef</span> Templates26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,</div><div class="line"><a name="l05968"></a><span class="lineno"> 5968</span>  T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> type;</div><div class="line"><a name="l05969"></a><span class="lineno"> 5969</span> };</div><div class="line"><a name="l05970"></a><span class="lineno"> 5970</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l05971"></a><span class="lineno"> 5971</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l05972"></a><span class="lineno"> 5972</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l05973"></a><span class="lineno"> 5973</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l05974"></a><span class="lineno"> 5974</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,</div><div class="line"><a name="l05975"></a><span class="lineno"> 5975</span>  GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,</div><div class="line"><a name="l05976"></a><span class="lineno"> 5976</span>  GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,</div><div class="line"><a name="l05977"></a><span class="lineno"> 5977</span>  GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,</div><div class="line"><a name="l05978"></a><span class="lineno"> 5978</span>  GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27></div><div class="line"><a name="l05979"></a><span class="lineno"> 5979</span> <span class="keyword">struct </span>Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l05980"></a><span class="lineno"> 5980</span>  T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, NoneT,</div><div class="line"><a name="l05981"></a><span class="lineno"> 5981</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05982"></a><span class="lineno"> 5982</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l05983"></a><span class="lineno"> 5983</span>  NoneT, NoneT> {</div><div class="line"><a name="l05984"></a><span class="lineno"> 5984</span>  <span class="keyword">typedef</span> Templates27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,</div><div class="line"><a name="l05985"></a><span class="lineno"> 5985</span>  T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,</div><div class="line"><a name="l05986"></a><span class="lineno"> 5986</span>  T27> type;</div><div class="line"><a name="l05987"></a><span class="lineno"> 5987</span> };</div><div class="line"><a name="l05988"></a><span class="lineno"> 5988</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l05989"></a><span class="lineno"> 5989</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l05990"></a><span class="lineno"> 5990</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l05991"></a><span class="lineno"> 5991</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l05992"></a><span class="lineno"> 5992</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,</div><div class="line"><a name="l05993"></a><span class="lineno"> 5993</span>  GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,</div><div class="line"><a name="l05994"></a><span class="lineno"> 5994</span>  GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,</div><div class="line"><a name="l05995"></a><span class="lineno"> 5995</span>  GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,</div><div class="line"><a name="l05996"></a><span class="lineno"> 5996</span>  GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,</div><div class="line"><a name="l05997"></a><span class="lineno"> 5997</span>  GTEST_TEMPLATE_ T28></div><div class="line"><a name="l05998"></a><span class="lineno"> 5998</span> <span class="keyword">struct </span>Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l05999"></a><span class="lineno"> 5999</span>  T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,</div><div class="line"><a name="l06000"></a><span class="lineno"> 6000</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l06001"></a><span class="lineno"> 6001</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l06002"></a><span class="lineno"> 6002</span>  NoneT, NoneT> {</div><div class="line"><a name="l06003"></a><span class="lineno"> 6003</span>  <span class="keyword">typedef</span> Templates28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,</div><div class="line"><a name="l06004"></a><span class="lineno"> 6004</span>  T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,</div><div class="line"><a name="l06005"></a><span class="lineno"> 6005</span>  T28> type;</div><div class="line"><a name="l06006"></a><span class="lineno"> 6006</span> };</div><div class="line"><a name="l06007"></a><span class="lineno"> 6007</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l06008"></a><span class="lineno"> 6008</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l06009"></a><span class="lineno"> 6009</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l06010"></a><span class="lineno"> 6010</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l06011"></a><span class="lineno"> 6011</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,</div><div class="line"><a name="l06012"></a><span class="lineno"> 6012</span>  GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,</div><div class="line"><a name="l06013"></a><span class="lineno"> 6013</span>  GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,</div><div class="line"><a name="l06014"></a><span class="lineno"> 6014</span>  GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,</div><div class="line"><a name="l06015"></a><span class="lineno"> 6015</span>  GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,</div><div class="line"><a name="l06016"></a><span class="lineno"> 6016</span>  GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29></div><div class="line"><a name="l06017"></a><span class="lineno"> 6017</span> <span class="keyword">struct </span>Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l06018"></a><span class="lineno"> 6018</span>  T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,</div><div class="line"><a name="l06019"></a><span class="lineno"> 6019</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l06020"></a><span class="lineno"> 6020</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l06021"></a><span class="lineno"> 6021</span>  NoneT> {</div><div class="line"><a name="l06022"></a><span class="lineno"> 6022</span>  <span class="keyword">typedef</span> Templates29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,</div><div class="line"><a name="l06023"></a><span class="lineno"> 6023</span>  T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,</div><div class="line"><a name="l06024"></a><span class="lineno"> 6024</span>  T28, T29> type;</div><div class="line"><a name="l06025"></a><span class="lineno"> 6025</span> };</div><div class="line"><a name="l06026"></a><span class="lineno"> 6026</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l06027"></a><span class="lineno"> 6027</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l06028"></a><span class="lineno"> 6028</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l06029"></a><span class="lineno"> 6029</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l06030"></a><span class="lineno"> 6030</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,</div><div class="line"><a name="l06031"></a><span class="lineno"> 6031</span>  GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,</div><div class="line"><a name="l06032"></a><span class="lineno"> 6032</span>  GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,</div><div class="line"><a name="l06033"></a><span class="lineno"> 6033</span>  GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,</div><div class="line"><a name="l06034"></a><span class="lineno"> 6034</span>  GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,</div><div class="line"><a name="l06035"></a><span class="lineno"> 6035</span>  GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30></div><div class="line"><a name="l06036"></a><span class="lineno"> 6036</span> <span class="keyword">struct </span>Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l06037"></a><span class="lineno"> 6037</span>  T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,</div><div class="line"><a name="l06038"></a><span class="lineno"> 6038</span>  T30, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l06039"></a><span class="lineno"> 6039</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {</div><div class="line"><a name="l06040"></a><span class="lineno"> 6040</span>  <span class="keyword">typedef</span> Templates30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,</div><div class="line"><a name="l06041"></a><span class="lineno"> 6041</span>  T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,</div><div class="line"><a name="l06042"></a><span class="lineno"> 6042</span>  T28, T29, T30> type;</div><div class="line"><a name="l06043"></a><span class="lineno"> 6043</span> };</div><div class="line"><a name="l06044"></a><span class="lineno"> 6044</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l06045"></a><span class="lineno"> 6045</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l06046"></a><span class="lineno"> 6046</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l06047"></a><span class="lineno"> 6047</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l06048"></a><span class="lineno"> 6048</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,</div><div class="line"><a name="l06049"></a><span class="lineno"> 6049</span>  GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,</div><div class="line"><a name="l06050"></a><span class="lineno"> 6050</span>  GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,</div><div class="line"><a name="l06051"></a><span class="lineno"> 6051</span>  GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,</div><div class="line"><a name="l06052"></a><span class="lineno"> 6052</span>  GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,</div><div class="line"><a name="l06053"></a><span class="lineno"> 6053</span>  GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,</div><div class="line"><a name="l06054"></a><span class="lineno"> 6054</span>  GTEST_TEMPLATE_ T31></div><div class="line"><a name="l06055"></a><span class="lineno"> 6055</span> <span class="keyword">struct </span>Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l06056"></a><span class="lineno"> 6056</span>  T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,</div><div class="line"><a name="l06057"></a><span class="lineno"> 6057</span>  T30, T31, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l06058"></a><span class="lineno"> 6058</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {</div><div class="line"><a name="l06059"></a><span class="lineno"> 6059</span>  <span class="keyword">typedef</span> Templates31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,</div><div class="line"><a name="l06060"></a><span class="lineno"> 6060</span>  T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,</div><div class="line"><a name="l06061"></a><span class="lineno"> 6061</span>  T28, T29, T30, T31> type;</div><div class="line"><a name="l06062"></a><span class="lineno"> 6062</span> };</div><div class="line"><a name="l06063"></a><span class="lineno"> 6063</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l06064"></a><span class="lineno"> 6064</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l06065"></a><span class="lineno"> 6065</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l06066"></a><span class="lineno"> 6066</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l06067"></a><span class="lineno"> 6067</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,</div><div class="line"><a name="l06068"></a><span class="lineno"> 6068</span>  GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,</div><div class="line"><a name="l06069"></a><span class="lineno"> 6069</span>  GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,</div><div class="line"><a name="l06070"></a><span class="lineno"> 6070</span>  GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,</div><div class="line"><a name="l06071"></a><span class="lineno"> 6071</span>  GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,</div><div class="line"><a name="l06072"></a><span class="lineno"> 6072</span>  GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,</div><div class="line"><a name="l06073"></a><span class="lineno"> 6073</span>  GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32></div><div class="line"><a name="l06074"></a><span class="lineno"> 6074</span> <span class="keyword">struct </span>Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l06075"></a><span class="lineno"> 6075</span>  T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,</div><div class="line"><a name="l06076"></a><span class="lineno"> 6076</span>  T30, T31, T32, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l06077"></a><span class="lineno"> 6077</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {</div><div class="line"><a name="l06078"></a><span class="lineno"> 6078</span>  <span class="keyword">typedef</span> Templates32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,</div><div class="line"><a name="l06079"></a><span class="lineno"> 6079</span>  T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,</div><div class="line"><a name="l06080"></a><span class="lineno"> 6080</span>  T28, T29, T30, T31, T32> type;</div><div class="line"><a name="l06081"></a><span class="lineno"> 6081</span> };</div><div class="line"><a name="l06082"></a><span class="lineno"> 6082</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l06083"></a><span class="lineno"> 6083</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l06084"></a><span class="lineno"> 6084</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l06085"></a><span class="lineno"> 6085</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l06086"></a><span class="lineno"> 6086</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,</div><div class="line"><a name="l06087"></a><span class="lineno"> 6087</span>  GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,</div><div class="line"><a name="l06088"></a><span class="lineno"> 6088</span>  GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,</div><div class="line"><a name="l06089"></a><span class="lineno"> 6089</span>  GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,</div><div class="line"><a name="l06090"></a><span class="lineno"> 6090</span>  GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,</div><div class="line"><a name="l06091"></a><span class="lineno"> 6091</span>  GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,</div><div class="line"><a name="l06092"></a><span class="lineno"> 6092</span>  GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33></div><div class="line"><a name="l06093"></a><span class="lineno"> 6093</span> <span class="keyword">struct </span>Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l06094"></a><span class="lineno"> 6094</span>  T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,</div><div class="line"><a name="l06095"></a><span class="lineno"> 6095</span>  T30, T31, T32, T33, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l06096"></a><span class="lineno"> 6096</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {</div><div class="line"><a name="l06097"></a><span class="lineno"> 6097</span>  <span class="keyword">typedef</span> Templates33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,</div><div class="line"><a name="l06098"></a><span class="lineno"> 6098</span>  T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,</div><div class="line"><a name="l06099"></a><span class="lineno"> 6099</span>  T28, T29, T30, T31, T32, T33> type;</div><div class="line"><a name="l06100"></a><span class="lineno"> 6100</span> };</div><div class="line"><a name="l06101"></a><span class="lineno"> 6101</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l06102"></a><span class="lineno"> 6102</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l06103"></a><span class="lineno"> 6103</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l06104"></a><span class="lineno"> 6104</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l06105"></a><span class="lineno"> 6105</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,</div><div class="line"><a name="l06106"></a><span class="lineno"> 6106</span>  GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,</div><div class="line"><a name="l06107"></a><span class="lineno"> 6107</span>  GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,</div><div class="line"><a name="l06108"></a><span class="lineno"> 6108</span>  GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,</div><div class="line"><a name="l06109"></a><span class="lineno"> 6109</span>  GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,</div><div class="line"><a name="l06110"></a><span class="lineno"> 6110</span>  GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,</div><div class="line"><a name="l06111"></a><span class="lineno"> 6111</span>  GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,</div><div class="line"><a name="l06112"></a><span class="lineno"> 6112</span>  GTEST_TEMPLATE_ T34></div><div class="line"><a name="l06113"></a><span class="lineno"> 6113</span> <span class="keyword">struct </span>Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l06114"></a><span class="lineno"> 6114</span>  T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,</div><div class="line"><a name="l06115"></a><span class="lineno"> 6115</span>  T30, T31, T32, T33, T34, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l06116"></a><span class="lineno"> 6116</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {</div><div class="line"><a name="l06117"></a><span class="lineno"> 6117</span>  <span class="keyword">typedef</span> Templates34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,</div><div class="line"><a name="l06118"></a><span class="lineno"> 6118</span>  T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,</div><div class="line"><a name="l06119"></a><span class="lineno"> 6119</span>  T28, T29, T30, T31, T32, T33, T34> type;</div><div class="line"><a name="l06120"></a><span class="lineno"> 6120</span> };</div><div class="line"><a name="l06121"></a><span class="lineno"> 6121</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l06122"></a><span class="lineno"> 6122</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l06123"></a><span class="lineno"> 6123</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l06124"></a><span class="lineno"> 6124</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l06125"></a><span class="lineno"> 6125</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,</div><div class="line"><a name="l06126"></a><span class="lineno"> 6126</span>  GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,</div><div class="line"><a name="l06127"></a><span class="lineno"> 6127</span>  GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,</div><div class="line"><a name="l06128"></a><span class="lineno"> 6128</span>  GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,</div><div class="line"><a name="l06129"></a><span class="lineno"> 6129</span>  GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,</div><div class="line"><a name="l06130"></a><span class="lineno"> 6130</span>  GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,</div><div class="line"><a name="l06131"></a><span class="lineno"> 6131</span>  GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,</div><div class="line"><a name="l06132"></a><span class="lineno"> 6132</span>  GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35></div><div class="line"><a name="l06133"></a><span class="lineno"> 6133</span> <span class="keyword">struct </span>Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l06134"></a><span class="lineno"> 6134</span>  T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,</div><div class="line"><a name="l06135"></a><span class="lineno"> 6135</span>  T30, T31, T32, T33, T34, T35, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l06136"></a><span class="lineno"> 6136</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {</div><div class="line"><a name="l06137"></a><span class="lineno"> 6137</span>  <span class="keyword">typedef</span> Templates35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,</div><div class="line"><a name="l06138"></a><span class="lineno"> 6138</span>  T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,</div><div class="line"><a name="l06139"></a><span class="lineno"> 6139</span>  T28, T29, T30, T31, T32, T33, T34, T35> type;</div><div class="line"><a name="l06140"></a><span class="lineno"> 6140</span> };</div><div class="line"><a name="l06141"></a><span class="lineno"> 6141</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l06142"></a><span class="lineno"> 6142</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l06143"></a><span class="lineno"> 6143</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l06144"></a><span class="lineno"> 6144</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l06145"></a><span class="lineno"> 6145</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,</div><div class="line"><a name="l06146"></a><span class="lineno"> 6146</span>  GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,</div><div class="line"><a name="l06147"></a><span class="lineno"> 6147</span>  GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,</div><div class="line"><a name="l06148"></a><span class="lineno"> 6148</span>  GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,</div><div class="line"><a name="l06149"></a><span class="lineno"> 6149</span>  GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,</div><div class="line"><a name="l06150"></a><span class="lineno"> 6150</span>  GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,</div><div class="line"><a name="l06151"></a><span class="lineno"> 6151</span>  GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,</div><div class="line"><a name="l06152"></a><span class="lineno"> 6152</span>  GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36></div><div class="line"><a name="l06153"></a><span class="lineno"> 6153</span> <span class="keyword">struct </span>Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l06154"></a><span class="lineno"> 6154</span>  T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,</div><div class="line"><a name="l06155"></a><span class="lineno"> 6155</span>  T30, T31, T32, T33, T34, T35, T36, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l06156"></a><span class="lineno"> 6156</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {</div><div class="line"><a name="l06157"></a><span class="lineno"> 6157</span>  <span class="keyword">typedef</span> Templates36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,</div><div class="line"><a name="l06158"></a><span class="lineno"> 6158</span>  T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,</div><div class="line"><a name="l06159"></a><span class="lineno"> 6159</span>  T28, T29, T30, T31, T32, T33, T34, T35, T36> type;</div><div class="line"><a name="l06160"></a><span class="lineno"> 6160</span> };</div><div class="line"><a name="l06161"></a><span class="lineno"> 6161</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l06162"></a><span class="lineno"> 6162</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l06163"></a><span class="lineno"> 6163</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l06164"></a><span class="lineno"> 6164</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l06165"></a><span class="lineno"> 6165</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,</div><div class="line"><a name="l06166"></a><span class="lineno"> 6166</span>  GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,</div><div class="line"><a name="l06167"></a><span class="lineno"> 6167</span>  GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,</div><div class="line"><a name="l06168"></a><span class="lineno"> 6168</span>  GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,</div><div class="line"><a name="l06169"></a><span class="lineno"> 6169</span>  GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,</div><div class="line"><a name="l06170"></a><span class="lineno"> 6170</span>  GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,</div><div class="line"><a name="l06171"></a><span class="lineno"> 6171</span>  GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,</div><div class="line"><a name="l06172"></a><span class="lineno"> 6172</span>  GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,</div><div class="line"><a name="l06173"></a><span class="lineno"> 6173</span>  GTEST_TEMPLATE_ T37></div><div class="line"><a name="l06174"></a><span class="lineno"> 6174</span> <span class="keyword">struct </span>Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l06175"></a><span class="lineno"> 6175</span>  T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,</div><div class="line"><a name="l06176"></a><span class="lineno"> 6176</span>  T30, T31, T32, T33, T34, T35, T36, T37, NoneT, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l06177"></a><span class="lineno"> 6177</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {</div><div class="line"><a name="l06178"></a><span class="lineno"> 6178</span>  <span class="keyword">typedef</span> Templates37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,</div><div class="line"><a name="l06179"></a><span class="lineno"> 6179</span>  T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,</div><div class="line"><a name="l06180"></a><span class="lineno"> 6180</span>  T28, T29, T30, T31, T32, T33, T34, T35, T36, T37> type;</div><div class="line"><a name="l06181"></a><span class="lineno"> 6181</span> };</div><div class="line"><a name="l06182"></a><span class="lineno"> 6182</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l06183"></a><span class="lineno"> 6183</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l06184"></a><span class="lineno"> 6184</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l06185"></a><span class="lineno"> 6185</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l06186"></a><span class="lineno"> 6186</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,</div><div class="line"><a name="l06187"></a><span class="lineno"> 6187</span>  GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,</div><div class="line"><a name="l06188"></a><span class="lineno"> 6188</span>  GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,</div><div class="line"><a name="l06189"></a><span class="lineno"> 6189</span>  GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,</div><div class="line"><a name="l06190"></a><span class="lineno"> 6190</span>  GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,</div><div class="line"><a name="l06191"></a><span class="lineno"> 6191</span>  GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,</div><div class="line"><a name="l06192"></a><span class="lineno"> 6192</span>  GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,</div><div class="line"><a name="l06193"></a><span class="lineno"> 6193</span>  GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,</div><div class="line"><a name="l06194"></a><span class="lineno"> 6194</span>  GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38></div><div class="line"><a name="l06195"></a><span class="lineno"> 6195</span> <span class="keyword">struct </span>Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l06196"></a><span class="lineno"> 6196</span>  T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,</div><div class="line"><a name="l06197"></a><span class="lineno"> 6197</span>  T30, T31, T32, T33, T34, T35, T36, T37, T38, NoneT, NoneT, NoneT, NoneT,</div><div class="line"><a name="l06198"></a><span class="lineno"> 6198</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {</div><div class="line"><a name="l06199"></a><span class="lineno"> 6199</span>  <span class="keyword">typedef</span> Templates38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,</div><div class="line"><a name="l06200"></a><span class="lineno"> 6200</span>  T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,</div><div class="line"><a name="l06201"></a><span class="lineno"> 6201</span>  T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> type;</div><div class="line"><a name="l06202"></a><span class="lineno"> 6202</span> };</div><div class="line"><a name="l06203"></a><span class="lineno"> 6203</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l06204"></a><span class="lineno"> 6204</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l06205"></a><span class="lineno"> 6205</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l06206"></a><span class="lineno"> 6206</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l06207"></a><span class="lineno"> 6207</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,</div><div class="line"><a name="l06208"></a><span class="lineno"> 6208</span>  GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,</div><div class="line"><a name="l06209"></a><span class="lineno"> 6209</span>  GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,</div><div class="line"><a name="l06210"></a><span class="lineno"> 6210</span>  GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,</div><div class="line"><a name="l06211"></a><span class="lineno"> 6211</span>  GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,</div><div class="line"><a name="l06212"></a><span class="lineno"> 6212</span>  GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,</div><div class="line"><a name="l06213"></a><span class="lineno"> 6213</span>  GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,</div><div class="line"><a name="l06214"></a><span class="lineno"> 6214</span>  GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,</div><div class="line"><a name="l06215"></a><span class="lineno"> 6215</span>  GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39></div><div class="line"><a name="l06216"></a><span class="lineno"> 6216</span> <span class="keyword">struct </span>Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l06217"></a><span class="lineno"> 6217</span>  T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,</div><div class="line"><a name="l06218"></a><span class="lineno"> 6218</span>  T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, NoneT, NoneT, NoneT,</div><div class="line"><a name="l06219"></a><span class="lineno"> 6219</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {</div><div class="line"><a name="l06220"></a><span class="lineno"> 6220</span>  <span class="keyword">typedef</span> Templates39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,</div><div class="line"><a name="l06221"></a><span class="lineno"> 6221</span>  T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,</div><div class="line"><a name="l06222"></a><span class="lineno"> 6222</span>  T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> type;</div><div class="line"><a name="l06223"></a><span class="lineno"> 6223</span> };</div><div class="line"><a name="l06224"></a><span class="lineno"> 6224</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l06225"></a><span class="lineno"> 6225</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l06226"></a><span class="lineno"> 6226</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l06227"></a><span class="lineno"> 6227</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l06228"></a><span class="lineno"> 6228</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,</div><div class="line"><a name="l06229"></a><span class="lineno"> 6229</span>  GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,</div><div class="line"><a name="l06230"></a><span class="lineno"> 6230</span>  GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,</div><div class="line"><a name="l06231"></a><span class="lineno"> 6231</span>  GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,</div><div class="line"><a name="l06232"></a><span class="lineno"> 6232</span>  GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,</div><div class="line"><a name="l06233"></a><span class="lineno"> 6233</span>  GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,</div><div class="line"><a name="l06234"></a><span class="lineno"> 6234</span>  GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,</div><div class="line"><a name="l06235"></a><span class="lineno"> 6235</span>  GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,</div><div class="line"><a name="l06236"></a><span class="lineno"> 6236</span>  GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,</div><div class="line"><a name="l06237"></a><span class="lineno"> 6237</span>  GTEST_TEMPLATE_ T40></div><div class="line"><a name="l06238"></a><span class="lineno"> 6238</span> <span class="keyword">struct </span>Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l06239"></a><span class="lineno"> 6239</span>  T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,</div><div class="line"><a name="l06240"></a><span class="lineno"> 6240</span>  T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, NoneT, NoneT, NoneT,</div><div class="line"><a name="l06241"></a><span class="lineno"> 6241</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {</div><div class="line"><a name="l06242"></a><span class="lineno"> 6242</span>  <span class="keyword">typedef</span> Templates40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,</div><div class="line"><a name="l06243"></a><span class="lineno"> 6243</span>  T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,</div><div class="line"><a name="l06244"></a><span class="lineno"> 6244</span>  T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> type;</div><div class="line"><a name="l06245"></a><span class="lineno"> 6245</span> };</div><div class="line"><a name="l06246"></a><span class="lineno"> 6246</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l06247"></a><span class="lineno"> 6247</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l06248"></a><span class="lineno"> 6248</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l06249"></a><span class="lineno"> 6249</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l06250"></a><span class="lineno"> 6250</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,</div><div class="line"><a name="l06251"></a><span class="lineno"> 6251</span>  GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,</div><div class="line"><a name="l06252"></a><span class="lineno"> 6252</span>  GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,</div><div class="line"><a name="l06253"></a><span class="lineno"> 6253</span>  GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,</div><div class="line"><a name="l06254"></a><span class="lineno"> 6254</span>  GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,</div><div class="line"><a name="l06255"></a><span class="lineno"> 6255</span>  GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,</div><div class="line"><a name="l06256"></a><span class="lineno"> 6256</span>  GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,</div><div class="line"><a name="l06257"></a><span class="lineno"> 6257</span>  GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,</div><div class="line"><a name="l06258"></a><span class="lineno"> 6258</span>  GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,</div><div class="line"><a name="l06259"></a><span class="lineno"> 6259</span>  GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41></div><div class="line"><a name="l06260"></a><span class="lineno"> 6260</span> <span class="keyword">struct </span>Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l06261"></a><span class="lineno"> 6261</span>  T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,</div><div class="line"><a name="l06262"></a><span class="lineno"> 6262</span>  T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, NoneT, NoneT,</div><div class="line"><a name="l06263"></a><span class="lineno"> 6263</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {</div><div class="line"><a name="l06264"></a><span class="lineno"> 6264</span>  <span class="keyword">typedef</span> Templates41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,</div><div class="line"><a name="l06265"></a><span class="lineno"> 6265</span>  T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,</div><div class="line"><a name="l06266"></a><span class="lineno"> 6266</span>  T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,</div><div class="line"><a name="l06267"></a><span class="lineno"> 6267</span>  T41> type;</div><div class="line"><a name="l06268"></a><span class="lineno"> 6268</span> };</div><div class="line"><a name="l06269"></a><span class="lineno"> 6269</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l06270"></a><span class="lineno"> 6270</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l06271"></a><span class="lineno"> 6271</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l06272"></a><span class="lineno"> 6272</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l06273"></a><span class="lineno"> 6273</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,</div><div class="line"><a name="l06274"></a><span class="lineno"> 6274</span>  GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,</div><div class="line"><a name="l06275"></a><span class="lineno"> 6275</span>  GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,</div><div class="line"><a name="l06276"></a><span class="lineno"> 6276</span>  GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,</div><div class="line"><a name="l06277"></a><span class="lineno"> 6277</span>  GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,</div><div class="line"><a name="l06278"></a><span class="lineno"> 6278</span>  GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,</div><div class="line"><a name="l06279"></a><span class="lineno"> 6279</span>  GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,</div><div class="line"><a name="l06280"></a><span class="lineno"> 6280</span>  GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,</div><div class="line"><a name="l06281"></a><span class="lineno"> 6281</span>  GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,</div><div class="line"><a name="l06282"></a><span class="lineno"> 6282</span>  GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42></div><div class="line"><a name="l06283"></a><span class="lineno"> 6283</span> <span class="keyword">struct </span>Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l06284"></a><span class="lineno"> 6284</span>  T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,</div><div class="line"><a name="l06285"></a><span class="lineno"> 6285</span>  T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, NoneT,</div><div class="line"><a name="l06286"></a><span class="lineno"> 6286</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {</div><div class="line"><a name="l06287"></a><span class="lineno"> 6287</span>  <span class="keyword">typedef</span> Templates42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,</div><div class="line"><a name="l06288"></a><span class="lineno"> 6288</span>  T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,</div><div class="line"><a name="l06289"></a><span class="lineno"> 6289</span>  T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,</div><div class="line"><a name="l06290"></a><span class="lineno"> 6290</span>  T42> type;</div><div class="line"><a name="l06291"></a><span class="lineno"> 6291</span> };</div><div class="line"><a name="l06292"></a><span class="lineno"> 6292</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l06293"></a><span class="lineno"> 6293</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l06294"></a><span class="lineno"> 6294</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l06295"></a><span class="lineno"> 6295</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l06296"></a><span class="lineno"> 6296</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,</div><div class="line"><a name="l06297"></a><span class="lineno"> 6297</span>  GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,</div><div class="line"><a name="l06298"></a><span class="lineno"> 6298</span>  GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,</div><div class="line"><a name="l06299"></a><span class="lineno"> 6299</span>  GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,</div><div class="line"><a name="l06300"></a><span class="lineno"> 6300</span>  GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,</div><div class="line"><a name="l06301"></a><span class="lineno"> 6301</span>  GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,</div><div class="line"><a name="l06302"></a><span class="lineno"> 6302</span>  GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,</div><div class="line"><a name="l06303"></a><span class="lineno"> 6303</span>  GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,</div><div class="line"><a name="l06304"></a><span class="lineno"> 6304</span>  GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,</div><div class="line"><a name="l06305"></a><span class="lineno"> 6305</span>  GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,</div><div class="line"><a name="l06306"></a><span class="lineno"> 6306</span>  GTEST_TEMPLATE_ T43></div><div class="line"><a name="l06307"></a><span class="lineno"> 6307</span> <span class="keyword">struct </span>Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l06308"></a><span class="lineno"> 6308</span>  T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,</div><div class="line"><a name="l06309"></a><span class="lineno"> 6309</span>  T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,</div><div class="line"><a name="l06310"></a><span class="lineno"> 6310</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {</div><div class="line"><a name="l06311"></a><span class="lineno"> 6311</span>  <span class="keyword">typedef</span> Templates43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,</div><div class="line"><a name="l06312"></a><span class="lineno"> 6312</span>  T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,</div><div class="line"><a name="l06313"></a><span class="lineno"> 6313</span>  T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,</div><div class="line"><a name="l06314"></a><span class="lineno"> 6314</span>  T42, T43> type;</div><div class="line"><a name="l06315"></a><span class="lineno"> 6315</span> };</div><div class="line"><a name="l06316"></a><span class="lineno"> 6316</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l06317"></a><span class="lineno"> 6317</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l06318"></a><span class="lineno"> 6318</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l06319"></a><span class="lineno"> 6319</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l06320"></a><span class="lineno"> 6320</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,</div><div class="line"><a name="l06321"></a><span class="lineno"> 6321</span>  GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,</div><div class="line"><a name="l06322"></a><span class="lineno"> 6322</span>  GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,</div><div class="line"><a name="l06323"></a><span class="lineno"> 6323</span>  GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,</div><div class="line"><a name="l06324"></a><span class="lineno"> 6324</span>  GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,</div><div class="line"><a name="l06325"></a><span class="lineno"> 6325</span>  GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,</div><div class="line"><a name="l06326"></a><span class="lineno"> 6326</span>  GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,</div><div class="line"><a name="l06327"></a><span class="lineno"> 6327</span>  GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,</div><div class="line"><a name="l06328"></a><span class="lineno"> 6328</span>  GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,</div><div class="line"><a name="l06329"></a><span class="lineno"> 6329</span>  GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,</div><div class="line"><a name="l06330"></a><span class="lineno"> 6330</span>  GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44></div><div class="line"><a name="l06331"></a><span class="lineno"> 6331</span> <span class="keyword">struct </span>Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l06332"></a><span class="lineno"> 6332</span>  T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,</div><div class="line"><a name="l06333"></a><span class="lineno"> 6333</span>  T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,</div><div class="line"><a name="l06334"></a><span class="lineno"> 6334</span>  NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {</div><div class="line"><a name="l06335"></a><span class="lineno"> 6335</span>  <span class="keyword">typedef</span> Templates44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,</div><div class="line"><a name="l06336"></a><span class="lineno"> 6336</span>  T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,</div><div class="line"><a name="l06337"></a><span class="lineno"> 6337</span>  T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,</div><div class="line"><a name="l06338"></a><span class="lineno"> 6338</span>  T42, T43, T44> type;</div><div class="line"><a name="l06339"></a><span class="lineno"> 6339</span> };</div><div class="line"><a name="l06340"></a><span class="lineno"> 6340</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l06341"></a><span class="lineno"> 6341</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l06342"></a><span class="lineno"> 6342</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l06343"></a><span class="lineno"> 6343</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l06344"></a><span class="lineno"> 6344</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,</div><div class="line"><a name="l06345"></a><span class="lineno"> 6345</span>  GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,</div><div class="line"><a name="l06346"></a><span class="lineno"> 6346</span>  GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,</div><div class="line"><a name="l06347"></a><span class="lineno"> 6347</span>  GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,</div><div class="line"><a name="l06348"></a><span class="lineno"> 6348</span>  GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,</div><div class="line"><a name="l06349"></a><span class="lineno"> 6349</span>  GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,</div><div class="line"><a name="l06350"></a><span class="lineno"> 6350</span>  GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,</div><div class="line"><a name="l06351"></a><span class="lineno"> 6351</span>  GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,</div><div class="line"><a name="l06352"></a><span class="lineno"> 6352</span>  GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,</div><div class="line"><a name="l06353"></a><span class="lineno"> 6353</span>  GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,</div><div class="line"><a name="l06354"></a><span class="lineno"> 6354</span>  GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45></div><div class="line"><a name="l06355"></a><span class="lineno"> 6355</span> <span class="keyword">struct </span>Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l06356"></a><span class="lineno"> 6356</span>  T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,</div><div class="line"><a name="l06357"></a><span class="lineno"> 6357</span>  T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,</div><div class="line"><a name="l06358"></a><span class="lineno"> 6358</span>  T45, NoneT, NoneT, NoneT, NoneT, NoneT> {</div><div class="line"><a name="l06359"></a><span class="lineno"> 6359</span>  <span class="keyword">typedef</span> Templates45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,</div><div class="line"><a name="l06360"></a><span class="lineno"> 6360</span>  T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,</div><div class="line"><a name="l06361"></a><span class="lineno"> 6361</span>  T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,</div><div class="line"><a name="l06362"></a><span class="lineno"> 6362</span>  T42, T43, T44, T45> type;</div><div class="line"><a name="l06363"></a><span class="lineno"> 6363</span> };</div><div class="line"><a name="l06364"></a><span class="lineno"> 6364</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l06365"></a><span class="lineno"> 6365</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l06366"></a><span class="lineno"> 6366</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l06367"></a><span class="lineno"> 6367</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l06368"></a><span class="lineno"> 6368</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,</div><div class="line"><a name="l06369"></a><span class="lineno"> 6369</span>  GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,</div><div class="line"><a name="l06370"></a><span class="lineno"> 6370</span>  GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,</div><div class="line"><a name="l06371"></a><span class="lineno"> 6371</span>  GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,</div><div class="line"><a name="l06372"></a><span class="lineno"> 6372</span>  GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,</div><div class="line"><a name="l06373"></a><span class="lineno"> 6373</span>  GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,</div><div class="line"><a name="l06374"></a><span class="lineno"> 6374</span>  GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,</div><div class="line"><a name="l06375"></a><span class="lineno"> 6375</span>  GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,</div><div class="line"><a name="l06376"></a><span class="lineno"> 6376</span>  GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,</div><div class="line"><a name="l06377"></a><span class="lineno"> 6377</span>  GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,</div><div class="line"><a name="l06378"></a><span class="lineno"> 6378</span>  GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,</div><div class="line"><a name="l06379"></a><span class="lineno"> 6379</span>  GTEST_TEMPLATE_ T46></div><div class="line"><a name="l06380"></a><span class="lineno"> 6380</span> <span class="keyword">struct </span>Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l06381"></a><span class="lineno"> 6381</span>  T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,</div><div class="line"><a name="l06382"></a><span class="lineno"> 6382</span>  T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,</div><div class="line"><a name="l06383"></a><span class="lineno"> 6383</span>  T45, T46, NoneT, NoneT, NoneT, NoneT> {</div><div class="line"><a name="l06384"></a><span class="lineno"> 6384</span>  <span class="keyword">typedef</span> Templates46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,</div><div class="line"><a name="l06385"></a><span class="lineno"> 6385</span>  T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,</div><div class="line"><a name="l06386"></a><span class="lineno"> 6386</span>  T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,</div><div class="line"><a name="l06387"></a><span class="lineno"> 6387</span>  T42, T43, T44, T45, T46> type;</div><div class="line"><a name="l06388"></a><span class="lineno"> 6388</span> };</div><div class="line"><a name="l06389"></a><span class="lineno"> 6389</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l06390"></a><span class="lineno"> 6390</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l06391"></a><span class="lineno"> 6391</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l06392"></a><span class="lineno"> 6392</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l06393"></a><span class="lineno"> 6393</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,</div><div class="line"><a name="l06394"></a><span class="lineno"> 6394</span>  GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,</div><div class="line"><a name="l06395"></a><span class="lineno"> 6395</span>  GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,</div><div class="line"><a name="l06396"></a><span class="lineno"> 6396</span>  GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,</div><div class="line"><a name="l06397"></a><span class="lineno"> 6397</span>  GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,</div><div class="line"><a name="l06398"></a><span class="lineno"> 6398</span>  GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,</div><div class="line"><a name="l06399"></a><span class="lineno"> 6399</span>  GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,</div><div class="line"><a name="l06400"></a><span class="lineno"> 6400</span>  GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,</div><div class="line"><a name="l06401"></a><span class="lineno"> 6401</span>  GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,</div><div class="line"><a name="l06402"></a><span class="lineno"> 6402</span>  GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,</div><div class="line"><a name="l06403"></a><span class="lineno"> 6403</span>  GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,</div><div class="line"><a name="l06404"></a><span class="lineno"> 6404</span>  GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47></div><div class="line"><a name="l06405"></a><span class="lineno"> 6405</span> <span class="keyword">struct </span>Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l06406"></a><span class="lineno"> 6406</span>  T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,</div><div class="line"><a name="l06407"></a><span class="lineno"> 6407</span>  T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,</div><div class="line"><a name="l06408"></a><span class="lineno"> 6408</span>  T45, T46, T47, NoneT, NoneT, NoneT> {</div><div class="line"><a name="l06409"></a><span class="lineno"> 6409</span>  <span class="keyword">typedef</span> Templates47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,</div><div class="line"><a name="l06410"></a><span class="lineno"> 6410</span>  T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,</div><div class="line"><a name="l06411"></a><span class="lineno"> 6411</span>  T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,</div><div class="line"><a name="l06412"></a><span class="lineno"> 6412</span>  T42, T43, T44, T45, T46, T47> type;</div><div class="line"><a name="l06413"></a><span class="lineno"> 6413</span> };</div><div class="line"><a name="l06414"></a><span class="lineno"> 6414</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l06415"></a><span class="lineno"> 6415</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l06416"></a><span class="lineno"> 6416</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l06417"></a><span class="lineno"> 6417</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l06418"></a><span class="lineno"> 6418</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,</div><div class="line"><a name="l06419"></a><span class="lineno"> 6419</span>  GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,</div><div class="line"><a name="l06420"></a><span class="lineno"> 6420</span>  GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,</div><div class="line"><a name="l06421"></a><span class="lineno"> 6421</span>  GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,</div><div class="line"><a name="l06422"></a><span class="lineno"> 6422</span>  GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,</div><div class="line"><a name="l06423"></a><span class="lineno"> 6423</span>  GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,</div><div class="line"><a name="l06424"></a><span class="lineno"> 6424</span>  GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,</div><div class="line"><a name="l06425"></a><span class="lineno"> 6425</span>  GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,</div><div class="line"><a name="l06426"></a><span class="lineno"> 6426</span>  GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,</div><div class="line"><a name="l06427"></a><span class="lineno"> 6427</span>  GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,</div><div class="line"><a name="l06428"></a><span class="lineno"> 6428</span>  GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,</div><div class="line"><a name="l06429"></a><span class="lineno"> 6429</span>  GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48></div><div class="line"><a name="l06430"></a><span class="lineno"> 6430</span> <span class="keyword">struct </span>Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l06431"></a><span class="lineno"> 6431</span>  T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,</div><div class="line"><a name="l06432"></a><span class="lineno"> 6432</span>  T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,</div><div class="line"><a name="l06433"></a><span class="lineno"> 6433</span>  T45, T46, T47, T48, NoneT, NoneT> {</div><div class="line"><a name="l06434"></a><span class="lineno"> 6434</span>  <span class="keyword">typedef</span> Templates48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,</div><div class="line"><a name="l06435"></a><span class="lineno"> 6435</span>  T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,</div><div class="line"><a name="l06436"></a><span class="lineno"> 6436</span>  T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,</div><div class="line"><a name="l06437"></a><span class="lineno"> 6437</span>  T42, T43, T44, T45, T46, T47, T48> type;</div><div class="line"><a name="l06438"></a><span class="lineno"> 6438</span> };</div><div class="line"><a name="l06439"></a><span class="lineno"> 6439</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,</div><div class="line"><a name="l06440"></a><span class="lineno"> 6440</span>  GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,</div><div class="line"><a name="l06441"></a><span class="lineno"> 6441</span>  GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,</div><div class="line"><a name="l06442"></a><span class="lineno"> 6442</span>  GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,</div><div class="line"><a name="l06443"></a><span class="lineno"> 6443</span>  GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,</div><div class="line"><a name="l06444"></a><span class="lineno"> 6444</span>  GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,</div><div class="line"><a name="l06445"></a><span class="lineno"> 6445</span>  GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,</div><div class="line"><a name="l06446"></a><span class="lineno"> 6446</span>  GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,</div><div class="line"><a name="l06447"></a><span class="lineno"> 6447</span>  GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,</div><div class="line"><a name="l06448"></a><span class="lineno"> 6448</span>  GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,</div><div class="line"><a name="l06449"></a><span class="lineno"> 6449</span>  GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,</div><div class="line"><a name="l06450"></a><span class="lineno"> 6450</span>  GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,</div><div class="line"><a name="l06451"></a><span class="lineno"> 6451</span>  GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,</div><div class="line"><a name="l06452"></a><span class="lineno"> 6452</span>  GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,</div><div class="line"><a name="l06453"></a><span class="lineno"> 6453</span>  GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,</div><div class="line"><a name="l06454"></a><span class="lineno"> 6454</span>  GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48,</div><div class="line"><a name="l06455"></a><span class="lineno"> 6455</span>  GTEST_TEMPLATE_ T49></div><div class="line"><a name="l06456"></a><span class="lineno"> 6456</span> <span class="keyword">struct </span>Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,</div><div class="line"><a name="l06457"></a><span class="lineno"> 6457</span>  T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,</div><div class="line"><a name="l06458"></a><span class="lineno"> 6458</span>  T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,</div><div class="line"><a name="l06459"></a><span class="lineno"> 6459</span>  T45, T46, T47, T48, T49, NoneT> {</div><div class="line"><a name="l06460"></a><span class="lineno"> 6460</span>  <span class="keyword">typedef</span> Templates49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,</div><div class="line"><a name="l06461"></a><span class="lineno"> 6461</span>  T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,</div><div class="line"><a name="l06462"></a><span class="lineno"> 6462</span>  T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,</div><div class="line"><a name="l06463"></a><span class="lineno"> 6463</span>  T42, T43, T44, T45, T46, T47, T48, T49> type;</div><div class="line"><a name="l06464"></a><span class="lineno"> 6464</span> };</div><div class="line"><a name="l06465"></a><span class="lineno"> 6465</span> </div><div class="line"><a name="l06466"></a><span class="lineno"> 6466</span> <span class="comment">// The TypeList template makes it possible to use either a single type</span></div><div class="line"><a name="l06467"></a><span class="lineno"> 6467</span> <span class="comment">// or a Types<...> list in TYPED_TEST_SUITE() and</span></div><div class="line"><a name="l06468"></a><span class="lineno"> 6468</span> <span class="comment">// INSTANTIATE_TYPED_TEST_SUITE_P().</span></div><div class="line"><a name="l06469"></a><span class="lineno"> 6469</span> </div><div class="line"><a name="l06470"></a><span class="lineno"> 6470</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l06471"></a><span class="lineno"> 6471</span> <span class="keyword">struct </span>TypeList {</div><div class="line"><a name="l06472"></a><span class="lineno"> 6472</span>  <span class="keyword">typedef</span> Types1<T> type;</div><div class="line"><a name="l06473"></a><span class="lineno"> 6473</span> };</div><div class="line"><a name="l06474"></a><span class="lineno"> 6474</span> </div><div class="line"><a name="l06475"></a><span class="lineno"> 6475</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l06476"></a><span class="lineno"> 6476</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10,</div><div class="line"><a name="l06477"></a><span class="lineno"> 6477</span>  <span class="keyword">typename</span> T11, <span class="keyword">typename</span> T12, <span class="keyword">typename</span> T13, <span class="keyword">typename</span> T14, <span class="keyword">typename</span> T15,</div><div class="line"><a name="l06478"></a><span class="lineno"> 6478</span>  <span class="keyword">typename</span> T16, <span class="keyword">typename</span> T17, <span class="keyword">typename</span> T18, <span class="keyword">typename</span> T19, <span class="keyword">typename</span> T20,</div><div class="line"><a name="l06479"></a><span class="lineno"> 6479</span>  <span class="keyword">typename</span> T21, <span class="keyword">typename</span> T22, <span class="keyword">typename</span> T23, <span class="keyword">typename</span> T24, <span class="keyword">typename</span> T25,</div><div class="line"><a name="l06480"></a><span class="lineno"> 6480</span>  <span class="keyword">typename</span> T26, <span class="keyword">typename</span> T27, <span class="keyword">typename</span> T28, <span class="keyword">typename</span> T29, <span class="keyword">typename</span> T30,</div><div class="line"><a name="l06481"></a><span class="lineno"> 6481</span>  <span class="keyword">typename</span> T31, <span class="keyword">typename</span> T32, <span class="keyword">typename</span> T33, <span class="keyword">typename</span> T34, <span class="keyword">typename</span> T35,</div><div class="line"><a name="l06482"></a><span class="lineno"> 6482</span>  <span class="keyword">typename</span> T36, <span class="keyword">typename</span> T37, <span class="keyword">typename</span> T38, <span class="keyword">typename</span> T39, <span class="keyword">typename</span> T40,</div><div class="line"><a name="l06483"></a><span class="lineno"> 6483</span>  <span class="keyword">typename</span> T41, <span class="keyword">typename</span> T42, <span class="keyword">typename</span> T43, <span class="keyword">typename</span> T44, <span class="keyword">typename</span> T45,</div><div class="line"><a name="l06484"></a><span class="lineno"> 6484</span>  <span class="keyword">typename</span> T46, <span class="keyword">typename</span> T47, <span class="keyword">typename</span> T48, <span class="keyword">typename</span> T49, <span class="keyword">typename</span> T50></div><div class="line"><a name="l06485"></a><span class="lineno"> 6485</span> <span class="keyword">struct </span>TypeList<Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,</div><div class="line"><a name="l06486"></a><span class="lineno"> 6486</span>  T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,</div><div class="line"><a name="l06487"></a><span class="lineno"> 6487</span>  T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,</div><div class="line"><a name="l06488"></a><span class="lineno"> 6488</span>  T44, T45, T46, T47, T48, T49, T50> > {</div><div class="line"><a name="l06489"></a><span class="lineno"> 6489</span>  <span class="keyword">typedef</span> <span class="keyword">typename</span> Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,</div><div class="line"><a name="l06490"></a><span class="lineno"> 6490</span>  T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,</div><div class="line"><a name="l06491"></a><span class="lineno"> 6491</span>  T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,</div><div class="line"><a name="l06492"></a><span class="lineno"> 6492</span>  T41, T42, T43, T44, T45, T46, T47, T48, T49, T50>::type type;</div><div class="line"><a name="l06493"></a><span class="lineno"> 6493</span> };</div><div class="line"><a name="l06494"></a><span class="lineno"> 6494</span> </div><div class="line"><a name="l06495"></a><span class="lineno"> 6495</span> <span class="preprocessor">#endif // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P</span></div><div class="line"><a name="l06496"></a><span class="lineno"> 6496</span> </div><div class="line"><a name="l06497"></a><span class="lineno"> 6497</span> } <span class="comment">// namespace internal</span></div><div class="line"><a name="l06498"></a><span class="lineno"> 6498</span> } <span class="comment">// namespace testing</span></div><div class="line"><a name="l06499"></a><span class="lineno"> 6499</span> </div><div class="line"><a name="l06500"></a><span class="lineno"> 6500</span> <span class="preprocessor">#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_</span></div><div class="line"><a name="l06501"></a><span class="lineno"> 6501</span> </div><div class="line"><a name="l06502"></a><span class="lineno"> 6502</span> <span class="comment">// Due to C++ preprocessor weirdness, we need double indirection to</span></div><div class="line"><a name="l06503"></a><span class="lineno"> 6503</span> <span class="comment">// concatenate two tokens when one of them is __LINE__. Writing</span></div><div class="line"><a name="l06504"></a><span class="lineno"> 6504</span> <span class="comment">//</span></div><div class="line"><a name="l06505"></a><span class="lineno"> 6505</span> <span class="comment">// foo ## __LINE__</span></div><div class="line"><a name="l06506"></a><span class="lineno"> 6506</span> <span class="comment">//</span></div><div class="line"><a name="l06507"></a><span class="lineno"> 6507</span> <span class="comment">// will result in the token foo__LINE__, instead of foo followed by</span></div><div class="line"><a name="l06508"></a><span class="lineno"> 6508</span> <span class="comment">// the current line number. For more details, see</span></div><div class="line"><a name="l06509"></a><span class="lineno"> 6509</span> <span class="comment">// http://www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.6</span></div><div class="line"><a name="l06510"></a><span class="lineno"><a class="line" href="gtest_8h.html#ae3c336cbe1ae2bd1b1d019333e4428a0"> 6510</a></span> <span class="preprocessor">#define GTEST_CONCAT_TOKEN_(foo, bar) GTEST_CONCAT_TOKEN_IMPL_(foo, bar)</span></div><div class="line"><a name="l06511"></a><span class="lineno"><a class="line" href="gtest_8h.html#aa39fb5346d3573feebe4257cb3a01fde"> 6511</a></span> <span class="preprocessor">#define GTEST_CONCAT_TOKEN_IMPL_(foo, bar) foo ## bar</span></div><div class="line"><a name="l06512"></a><span class="lineno"> 6512</span> </div><div class="line"><a name="l06513"></a><span class="lineno"> 6513</span> <span class="comment">// Stringifies its argument.</span></div><div class="line"><a name="l06514"></a><span class="lineno"><a class="line" href="gtest_8h.html#affa935d4361fa573644e9c739dde2b14"> 6514</a></span> <span class="preprocessor">#define GTEST_STRINGIFY_(name) #name</span></div><div class="line"><a name="l06515"></a><span class="lineno"> 6515</span> </div><div class="line"><a name="l06516"></a><span class="lineno"> 6516</span> <span class="keyword">class </span>ProtocolMessage;</div><div class="line"><a name="l06517"></a><span class="lineno"><a class="line" href="namespaceproto2.html"> 6517</a></span> <span class="keyword">namespace </span><a class="code" href="namespaceproto2.html">proto2</a> { <span class="keyword">class </span>Message; }</div><div class="line"><a name="l06518"></a><span class="lineno"> 6518</span> </div><div class="line"><a name="l06519"></a><span class="lineno"> 6519</span> <span class="keyword">namespace </span><a class="code" href="namespacetesting.html">testing</a> {</div><div class="line"><a name="l06520"></a><span class="lineno"> 6520</span> </div><div class="line"><a name="l06521"></a><span class="lineno"> 6521</span> <span class="comment">// Forward declarations.</span></div><div class="line"><a name="l06522"></a><span class="lineno"> 6522</span> </div><div class="line"><a name="l06523"></a><span class="lineno"> 6523</span> <span class="keyword">class </span>AssertionResult; <span class="comment">// Result of an assertion.</span></div><div class="line"><a name="l06524"></a><span class="lineno"> 6524</span> <span class="keyword">class </span>Message; <span class="comment">// Represents a failure message.</span></div><div class="line"><a name="l06525"></a><span class="lineno"> 6525</span> <span class="keyword">class </span>Test; <span class="comment">// Represents a test.</span></div><div class="line"><a name="l06526"></a><span class="lineno"> 6526</span> <span class="keyword">class </span>TestInfo; <span class="comment">// Information about a test.</span></div><div class="line"><a name="l06527"></a><span class="lineno"> 6527</span> <span class="keyword">class </span>TestPartResult; <span class="comment">// Result of a test part.</span></div><div class="line"><a name="l06528"></a><span class="lineno"> 6528</span> <span class="keyword">class </span>UnitTest; <span class="comment">// A collection of test suites.</span></div><div class="line"><a name="l06529"></a><span class="lineno"> 6529</span> </div><div class="line"><a name="l06530"></a><span class="lineno"> 6530</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l06531"></a><span class="lineno"> 6531</span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">::std::string</a> <a class="code" href="namespacetesting.html#aa5717bb1144edd1d262d310ba70c82ed">PrintToString</a>(<span class="keyword">const</span> T& value);</div><div class="line"><a name="l06532"></a><span class="lineno"> 6532</span> </div><div class="line"><a name="l06533"></a><span class="lineno"> 6533</span> <span class="keyword">namespace </span>internal {</div><div class="line"><a name="l06534"></a><span class="lineno"> 6534</span> </div><div class="line"><a name="l06535"></a><span class="lineno"> 6535</span> <span class="keyword">struct </span>TraceInfo; <span class="comment">// Information about a trace point.</span></div><div class="line"><a name="l06536"></a><span class="lineno"> 6536</span> <span class="keyword">class </span>TestInfoImpl; <span class="comment">// Opaque implementation of TestInfo</span></div><div class="line"><a name="l06537"></a><span class="lineno"> 6537</span> <span class="keyword">class </span>UnitTestImpl; <span class="comment">// Opaque implementation of UnitTest</span></div><div class="line"><a name="l06538"></a><span class="lineno"> 6538</span> </div><div class="line"><a name="l06539"></a><span class="lineno"> 6539</span> <span class="comment">// The text used in failure messages to indicate the start of the</span></div><div class="line"><a name="l06540"></a><span class="lineno"> 6540</span> <span class="comment">// stack trace.</span></div><div class="line"><a name="l06541"></a><span class="lineno"> 6541</span> <a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> <span class="keyword">extern</span> <span class="keyword">const</span> <span class="keywordtype">char</span> <a class="code" href="namespacetesting_1_1internal.html#a999c7ef9ff01b6d2d76669372c444aa3">kStackTraceMarker</a>[];</div><div class="line"><a name="l06542"></a><span class="lineno"> 6542</span> </div><div class="line"><a name="l06543"></a><span class="lineno"> 6543</span> <span class="comment">// An IgnoredValue object can be implicitly constructed from ANY value.</span></div><div class="line"><a name="l06544"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_ignored_value.html"> 6544</a></span> <span class="keyword">class </span><a class="code" href="classtesting_1_1internal_1_1_ignored_value.html">IgnoredValue</a> {</div><div class="line"><a name="l06545"></a><span class="lineno"> 6545</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l06546"></a><span class="lineno"> 6546</span>  <span class="comment">// This constructor template allows any value to be implicitly</span></div><div class="line"><a name="l06547"></a><span class="lineno"> 6547</span>  <span class="comment">// converted to IgnoredValue. The object has no data member and</span></div><div class="line"><a name="l06548"></a><span class="lineno"> 6548</span>  <span class="comment">// doesn't try to remember anything about the argument. We</span></div><div class="line"><a name="l06549"></a><span class="lineno"> 6549</span>  <span class="comment">// deliberately omit the 'explicit' keyword in order to allow the</span></div><div class="line"><a name="l06550"></a><span class="lineno"> 6550</span>  <span class="comment">// conversion to be implicit.</span></div><div class="line"><a name="l06551"></a><span class="lineno"> 6551</span>  <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l06552"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_ignored_value.html#a6c72839c07a9da8d027efb253144bd91"> 6552</a></span>  <a class="code" href="classtesting_1_1internal_1_1_ignored_value.html#a6c72839c07a9da8d027efb253144bd91">IgnoredValue</a>(<span class="keyword">const</span> T& <span class="comment">/* ignored */</span>) {} <span class="comment">// NOLINT(runtime/explicit)</span></div><div class="line"><a name="l06553"></a><span class="lineno"> 6553</span> };</div><div class="line"><a name="l06554"></a><span class="lineno"> 6554</span> </div><div class="line"><a name="l06555"></a><span class="lineno"> 6555</span> <span class="comment">// Two overloaded helpers for checking at compile time whether an</span></div><div class="line"><a name="l06556"></a><span class="lineno"> 6556</span> <span class="comment">// expression is a null pointer literal (i.e. NULL or any 0-valued</span></div><div class="line"><a name="l06557"></a><span class="lineno"> 6557</span> <span class="comment">// compile-time integral constant). These helpers have no</span></div><div class="line"><a name="l06558"></a><span class="lineno"> 6558</span> <span class="comment">// implementations, as we only need their signatures.</span></div><div class="line"><a name="l06559"></a><span class="lineno"> 6559</span> <span class="comment">//</span></div><div class="line"><a name="l06560"></a><span class="lineno"> 6560</span> <span class="comment">// Given IsNullLiteralHelper(x), the compiler will pick the first</span></div><div class="line"><a name="l06561"></a><span class="lineno"> 6561</span> <span class="comment">// version if x can be implicitly converted to Secret*, and pick the</span></div><div class="line"><a name="l06562"></a><span class="lineno"> 6562</span> <span class="comment">// second version otherwise. Since Secret is a secret and incomplete</span></div><div class="line"><a name="l06563"></a><span class="lineno"> 6563</span> <span class="comment">// type, the only expression a user can write that has type Secret* is</span></div><div class="line"><a name="l06564"></a><span class="lineno"> 6564</span> <span class="comment">// a null pointer literal. Therefore, we know that x is a null</span></div><div class="line"><a name="l06565"></a><span class="lineno"> 6565</span> <span class="comment">// pointer literal if and only if the first version is picked by the</span></div><div class="line"><a name="l06566"></a><span class="lineno"> 6566</span> <span class="comment">// compiler.</span></div><div class="line"><a name="l06567"></a><span class="lineno"> 6567</span> <a class="code" href="namespacetesting_1_1internal.html#a62f917c3424d8841de9b49b5ec28edb4">std::true_type</a> <a class="code" href="namespacetesting_1_1internal.html#a3db36c62f31a9439117c41c2b13f4941">IsNullLiteralHelper</a>(Secret*);</div><div class="line"><a name="l06568"></a><span class="lineno"> 6568</span> <a class="code" href="namespacetesting_1_1internal.html#abb1d0789f19bdde21affccbd1078b525">std::false_type</a> <a class="code" href="namespacetesting_1_1internal.html#a3db36c62f31a9439117c41c2b13f4941">IsNullLiteralHelper</a>(IgnoredValue);</div><div class="line"><a name="l06569"></a><span class="lineno"> 6569</span> </div><div class="line"><a name="l06570"></a><span class="lineno"> 6570</span> <span class="comment">// A compile-time bool constant that is true if and only if x is a null pointer</span></div><div class="line"><a name="l06571"></a><span class="lineno"> 6571</span> <span class="comment">// literal (i.e. nullptr, NULL or any 0-valued compile-time integral constant).</span></div><div class="line"><a name="l06572"></a><span class="lineno"><a class="line" href="gtest_8h.html#ae5dd8e23090e08856613878fa1ff6fca"> 6572</a></span> <span class="preprocessor">#define GTEST_IS_NULL_LITERAL_(x) \</span></div><div class="line"><a name="l06573"></a><span class="lineno"> 6573</span> <span class="preprocessor"> decltype(::testing::internal::IsNullLiteralHelper(x))::value</span></div><div class="line"><a name="l06574"></a><span class="lineno"> 6574</span> </div><div class="line"><a name="l06575"></a><span class="lineno"> 6575</span> <span class="comment">// Appends the user-supplied message to the Google-Test-generated message.</span></div><div class="line"><a name="l06576"></a><span class="lineno"> 6576</span> <a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a> <a class="code" href="namespacetesting_1_1internal.html#af69e146a989e8d48def39a0cc59461c9">AppendUserMessage</a>(</div><div class="line"><a name="l06577"></a><span class="lineno"> 6577</span>  <span class="keyword">const</span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a>& gtest_msg, <span class="keyword">const</span> Message& user_msg);</div><div class="line"><a name="l06578"></a><span class="lineno"> 6578</span> </div><div class="line"><a name="l06579"></a><span class="lineno"> 6579</span> <span class="preprocessor">#if GTEST_HAS_EXCEPTIONS</span></div><div class="line"><a name="l06580"></a><span class="lineno"> 6580</span> </div><div class="line"><a name="l06581"></a><span class="lineno"> 6581</span> <a class="code" href="gtest_8h.html#a86994cc68e844d8b82089c70408dfc61">GTEST_DISABLE_MSC_WARNINGS_PUSH_</a>(4275 \</div><div class="line"><a name="l06582"></a><span class="lineno"> 6582</span> <span class="comment">/* an exported class was derived from a class that was not exported */</span>)</div><div class="line"><a name="l06583"></a><span class="lineno"> 6583</span> </div><div class="line"><a name="l06584"></a><span class="lineno"> 6584</span> <span class="comment">// This exception is thrown by (and only by) a failed Google Test</span></div><div class="line"><a name="l06585"></a><span class="lineno"> 6585</span> <span class="comment">// assertion when GTEST_FLAG(throw_on_failure) is true (if exceptions</span></div><div class="line"><a name="l06586"></a><span class="lineno"> 6586</span> <span class="comment">// are enabled). We derive it from std::runtime_error, which is for</span></div><div class="line"><a name="l06587"></a><span class="lineno"> 6587</span> <span class="comment">// errors presumably detectable only at run time. Since</span></div><div class="line"><a name="l06588"></a><span class="lineno"> 6588</span> <span class="comment">// std::runtime_error inherits from std::exception, many testing</span></div><div class="line"><a name="l06589"></a><span class="lineno"> 6589</span> <span class="comment">// frameworks know how to extract and print the message inside it.</span></div><div class="line"><a name="l06590"></a><span class="lineno"> 6590</span> class <a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> GoogleTestFailureException : public ::std::runtime_error {</div><div class="line"><a name="l06591"></a><span class="lineno"> 6591</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l06592"></a><span class="lineno"> 6592</span>  <span class="keyword">explicit</span> GoogleTestFailureException(<span class="keyword">const</span> TestPartResult& failure);</div><div class="line"><a name="l06593"></a><span class="lineno"> 6593</span> };</div><div class="line"><a name="l06594"></a><span class="lineno"> 6594</span> </div><div class="line"><a name="l06595"></a><span class="lineno"> 6595</span> <a class="code" href="gtest_8h.html#aebf8277c9069c1e124f9a5bbe2948061">GTEST_DISABLE_MSC_WARNINGS_POP_</a>() <span class="comment">// 4275</span></div><div class="line"><a name="l06596"></a><span class="lineno"> 6596</span> </div><div class="line"><a name="l06597"></a><span class="lineno"> 6597</span> <span class="preprocessor">#endif // GTEST_HAS_EXCEPTIONS</span></div><div class="line"><a name="l06598"></a><span class="lineno"> 6598</span> </div><div class="line"><a name="l06599"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal_1_1edit__distance.html"> 6599</a></span> <span class="keyword">namespace </span>edit_distance {</div><div class="line"><a name="l06600"></a><span class="lineno"> 6600</span> <span class="comment">// Returns the optimal edits to go from 'left' to 'right'.</span></div><div class="line"><a name="l06601"></a><span class="lineno"> 6601</span> <span class="comment">// All edits cost the same, with replace having lower priority than</span></div><div class="line"><a name="l06602"></a><span class="lineno"> 6602</span> <span class="comment">// add/remove.</span></div><div class="line"><a name="l06603"></a><span class="lineno"> 6603</span> <span class="comment">// Simple implementation of the Wagner-Fischer algorithm.</span></div><div class="line"><a name="l06604"></a><span class="lineno"> 6604</span> <span class="comment">// See http://en.wikipedia.org/wiki/Wagner-Fischer_algorithm</span></div><div class="line"><a name="l06605"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal_1_1edit__distance.html#ad46aa6da12aec1a3f166310478b53a08afdbf30ecf9f32f60c646a34a358615f2"> 6605</a></span> <span class="keyword">enum</span> <a class="code" href="namespacetesting_1_1internal_1_1edit__distance.html#ad46aa6da12aec1a3f166310478b53a08">EditType</a> { <a class="code" href="namespacetesting_1_1internal_1_1edit__distance.html#ad46aa6da12aec1a3f166310478b53a08a7bdb9c74613a94f21b7489e0b5640a63">kMatch</a>, <a class="code" href="namespacetesting_1_1internal_1_1edit__distance.html#ad46aa6da12aec1a3f166310478b53a08a63400b073f5b311a87d568b5ae27ffe8">kAdd</a>, <a class="code" href="namespacetesting_1_1internal_1_1edit__distance.html#ad46aa6da12aec1a3f166310478b53a08a814768ef6cd0264a0a10b1e701a63e78">kRemove</a>, <a class="code" href="namespacetesting_1_1internal_1_1edit__distance.html#ad46aa6da12aec1a3f166310478b53a08afdbf30ecf9f32f60c646a34a358615f2">kReplace</a> };</div><div class="line"><a name="l06606"></a><span class="lineno"> 6606</span> <a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> std::vector<EditType> <a class="code" href="namespacetesting_1_1internal_1_1edit__distance.html#ad28f23b77f716200bc6644bfc7413a63">CalculateOptimalEdits</a>(</div><div class="line"><a name="l06607"></a><span class="lineno"> 6607</span>  <span class="keyword">const</span> std::vector<size_t>& left, <span class="keyword">const</span> std::vector<size_t>& right);</div><div class="line"><a name="l06608"></a><span class="lineno"> 6608</span> </div><div class="line"><a name="l06609"></a><span class="lineno"> 6609</span> <span class="comment">// Same as above, but the input is represented as strings.</span></div><div class="line"><a name="l06610"></a><span class="lineno"> 6610</span> <a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> std::vector<EditType> <a class="code" href="namespacetesting_1_1internal_1_1edit__distance.html#ad28f23b77f716200bc6644bfc7413a63">CalculateOptimalEdits</a>(</div><div class="line"><a name="l06611"></a><span class="lineno"> 6611</span>  <span class="keyword">const</span> std::vector<std::string>& left,</div><div class="line"><a name="l06612"></a><span class="lineno"> 6612</span>  <span class="keyword">const</span> std::vector<std::string>& right);</div><div class="line"><a name="l06613"></a><span class="lineno"> 6613</span> </div><div class="line"><a name="l06614"></a><span class="lineno"> 6614</span> <span class="comment">// Create a diff of the input strings in Unified diff format.</span></div><div class="line"><a name="l06615"></a><span class="lineno"> 6615</span> <a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a> <a class="code" href="namespacetesting_1_1internal_1_1edit__distance.html#a48cffebc6d3169ad1df7849b5f7fb5ff">CreateUnifiedDiff</a>(<span class="keyword">const</span> std::vector<std::string>& left,</div><div class="line"><a name="l06616"></a><span class="lineno"> 6616</span>  <span class="keyword">const</span> std::vector<std::string>& right,</div><div class="line"><a name="l06617"></a><span class="lineno"> 6617</span>  <span class="keywordtype">size_t</span> context = 2);</div><div class="line"><a name="l06618"></a><span class="lineno"> 6618</span> </div><div class="line"><a name="l06619"></a><span class="lineno"> 6619</span> } <span class="comment">// namespace edit_distance</span></div><div class="line"><a name="l06620"></a><span class="lineno"> 6620</span> </div><div class="line"><a name="l06621"></a><span class="lineno"> 6621</span> <span class="comment">// Calculate the diff between 'left' and 'right' and return it in unified diff</span></div><div class="line"><a name="l06622"></a><span class="lineno"> 6622</span> <span class="comment">// format.</span></div><div class="line"><a name="l06623"></a><span class="lineno"> 6623</span> <span class="comment">// If not null, stores in 'total_line_count' the total number of lines found</span></div><div class="line"><a name="l06624"></a><span class="lineno"> 6624</span> <span class="comment">// in left + right.</span></div><div class="line"><a name="l06625"></a><span class="lineno"> 6625</span> <a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a> <a class="code" href="namespacetesting_1_1internal.html#a513107ff8defa97d949937fc1350a56c">DiffStrings</a>(<span class="keyword">const</span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a>& left,</div><div class="line"><a name="l06626"></a><span class="lineno"> 6626</span>  <span class="keyword">const</span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a>& right,</div><div class="line"><a name="l06627"></a><span class="lineno"> 6627</span>  <span class="keywordtype">size_t</span>* total_line_count);</div><div class="line"><a name="l06628"></a><span class="lineno"> 6628</span> </div><div class="line"><a name="l06629"></a><span class="lineno"> 6629</span> <span class="comment">// Constructs and returns the message for an equality assertion</span></div><div class="line"><a name="l06630"></a><span class="lineno"> 6630</span> <span class="comment">// (e.g. ASSERT_EQ, EXPECT_STREQ, etc) failure.</span></div><div class="line"><a name="l06631"></a><span class="lineno"> 6631</span> <span class="comment">//</span></div><div class="line"><a name="l06632"></a><span class="lineno"> 6632</span> <span class="comment">// The first four parameters are the expressions used in the assertion</span></div><div class="line"><a name="l06633"></a><span class="lineno"> 6633</span> <span class="comment">// and their values, as strings. For example, for ASSERT_EQ(foo, bar)</span></div><div class="line"><a name="l06634"></a><span class="lineno"> 6634</span> <span class="comment">// where foo is 5 and bar is 6, we have:</span></div><div class="line"><a name="l06635"></a><span class="lineno"> 6635</span> <span class="comment">//</span></div><div class="line"><a name="l06636"></a><span class="lineno"> 6636</span> <span class="comment">// expected_expression: "foo"</span></div><div class="line"><a name="l06637"></a><span class="lineno"> 6637</span> <span class="comment">// actual_expression: "bar"</span></div><div class="line"><a name="l06638"></a><span class="lineno"> 6638</span> <span class="comment">// expected_value: "5"</span></div><div class="line"><a name="l06639"></a><span class="lineno"> 6639</span> <span class="comment">// actual_value: "6"</span></div><div class="line"><a name="l06640"></a><span class="lineno"> 6640</span> <span class="comment">//</span></div><div class="line"><a name="l06641"></a><span class="lineno"> 6641</span> <span class="comment">// The ignoring_case parameter is true iff the assertion is a</span></div><div class="line"><a name="l06642"></a><span class="lineno"> 6642</span> <span class="comment">// *_STRCASEEQ*. When it's true, the string " (ignoring case)" will</span></div><div class="line"><a name="l06643"></a><span class="lineno"> 6643</span> <span class="comment">// be inserted into the message.</span></div><div class="line"><a name="l06644"></a><span class="lineno"> 6644</span> <a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> AssertionResult <a class="code" href="namespacetesting_1_1internal.html#ac61e2ba2cbf259fd6ee5ffd4e49c9445">EqFailure</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* expected_expression,</div><div class="line"><a name="l06645"></a><span class="lineno"> 6645</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* actual_expression,</div><div class="line"><a name="l06646"></a><span class="lineno"> 6646</span>  <span class="keyword">const</span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a>& expected_value,</div><div class="line"><a name="l06647"></a><span class="lineno"> 6647</span>  <span class="keyword">const</span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a>& actual_value,</div><div class="line"><a name="l06648"></a><span class="lineno"> 6648</span>  <span class="keywordtype">bool</span> ignoring_case);</div><div class="line"><a name="l06649"></a><span class="lineno"> 6649</span> </div><div class="line"><a name="l06650"></a><span class="lineno"> 6650</span> <span class="comment">// Constructs a failure message for Boolean assertions such as EXPECT_TRUE.</span></div><div class="line"><a name="l06651"></a><span class="lineno"> 6651</span> <a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a> <a class="code" href="namespacetesting_1_1internal.html#aed8d3ad4341f8f2de53440e39c995632">GetBoolAssertionFailureMessage</a>(</div><div class="line"><a name="l06652"></a><span class="lineno"> 6652</span>  <span class="keyword">const</span> AssertionResult& assertion_result,</div><div class="line"><a name="l06653"></a><span class="lineno"> 6653</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* expression_text,</div><div class="line"><a name="l06654"></a><span class="lineno"> 6654</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* actual_predicate_value,</div><div class="line"><a name="l06655"></a><span class="lineno"> 6655</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* expected_predicate_value);</div><div class="line"><a name="l06656"></a><span class="lineno"> 6656</span> </div><div class="line"><a name="l06657"></a><span class="lineno"> 6657</span> <span class="comment">// This template class represents an IEEE floating-point number</span></div><div class="line"><a name="l06658"></a><span class="lineno"> 6658</span> <span class="comment">// (either single-precision or double-precision, depending on the</span></div><div class="line"><a name="l06659"></a><span class="lineno"> 6659</span> <span class="comment">// template parameters).</span></div><div class="line"><a name="l06660"></a><span class="lineno"> 6660</span> <span class="comment">//</span></div><div class="line"><a name="l06661"></a><span class="lineno"> 6661</span> <span class="comment">// The purpose of this class is to do more sophisticated number</span></div><div class="line"><a name="l06662"></a><span class="lineno"> 6662</span> <span class="comment">// comparison. (Due to round-off error, etc, it's very unlikely that</span></div><div class="line"><a name="l06663"></a><span class="lineno"> 6663</span> <span class="comment">// two floating-points will be equal exactly. Hence a naive</span></div><div class="line"><a name="l06664"></a><span class="lineno"> 6664</span> <span class="comment">// comparison by the == operation often doesn't work.)</span></div><div class="line"><a name="l06665"></a><span class="lineno"> 6665</span> <span class="comment">//</span></div><div class="line"><a name="l06666"></a><span class="lineno"> 6666</span> <span class="comment">// Format of IEEE floating-point:</span></div><div class="line"><a name="l06667"></a><span class="lineno"> 6667</span> <span class="comment">//</span></div><div class="line"><a name="l06668"></a><span class="lineno"> 6668</span> <span class="comment">// The most-significant bit being the leftmost, an IEEE</span></div><div class="line"><a name="l06669"></a><span class="lineno"> 6669</span> <span class="comment">// floating-point looks like</span></div><div class="line"><a name="l06670"></a><span class="lineno"> 6670</span> <span class="comment">//</span></div><div class="line"><a name="l06671"></a><span class="lineno"> 6671</span> <span class="comment">// sign_bit exponent_bits fraction_bits</span></div><div class="line"><a name="l06672"></a><span class="lineno"> 6672</span> <span class="comment">//</span></div><div class="line"><a name="l06673"></a><span class="lineno"> 6673</span> <span class="comment">// Here, sign_bit is a single bit that designates the sign of the</span></div><div class="line"><a name="l06674"></a><span class="lineno"> 6674</span> <span class="comment">// number.</span></div><div class="line"><a name="l06675"></a><span class="lineno"> 6675</span> <span class="comment">//</span></div><div class="line"><a name="l06676"></a><span class="lineno"> 6676</span> <span class="comment">// For float, there are 8 exponent bits and 23 fraction bits.</span></div><div class="line"><a name="l06677"></a><span class="lineno"> 6677</span> <span class="comment">//</span></div><div class="line"><a name="l06678"></a><span class="lineno"> 6678</span> <span class="comment">// For double, there are 11 exponent bits and 52 fraction bits.</span></div><div class="line"><a name="l06679"></a><span class="lineno"> 6679</span> <span class="comment">//</span></div><div class="line"><a name="l06680"></a><span class="lineno"> 6680</span> <span class="comment">// More details can be found at</span></div><div class="line"><a name="l06681"></a><span class="lineno"> 6681</span> <span class="comment">// http://en.wikipedia.org/wiki/IEEE_floating-point_standard.</span></div><div class="line"><a name="l06682"></a><span class="lineno"> 6682</span> <span class="comment">//</span></div><div class="line"><a name="l06683"></a><span class="lineno"> 6683</span> <span class="comment">// Template parameter:</span></div><div class="line"><a name="l06684"></a><span class="lineno"> 6684</span> <span class="comment">//</span></div><div class="line"><a name="l06685"></a><span class="lineno"> 6685</span> <span class="comment">// RawType: the raw floating-point type (either float or double)</span></div><div class="line"><a name="l06686"></a><span class="lineno"> 6686</span> <span class="keyword">template</span> <<span class="keyword">typename</span> RawType></div><div class="line"><a name="l06687"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_floating_point.html"> 6687</a></span> <span class="keyword">class </span><a class="code" href="classtesting_1_1internal_1_1_floating_point.html">FloatingPoint</a> {</div><div class="line"><a name="l06688"></a><span class="lineno"> 6688</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l06689"></a><span class="lineno"> 6689</span>  <span class="comment">// Defines the unsigned integer type that has the same size as the</span></div><div class="line"><a name="l06690"></a><span class="lineno"> 6690</span>  <span class="comment">// floating point number.</span></div><div class="line"><a name="l06691"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_floating_point.html#abf228bf6cd48f12c8b44c85b4971a731"> 6691</a></span>  <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_type_with_size.html">TypeWithSize<sizeof(RawType)>::UInt</a> <a class="code" href="classtesting_1_1internal_1_1_floating_point.html#abf228bf6cd48f12c8b44c85b4971a731">Bits</a>;</div><div class="line"><a name="l06692"></a><span class="lineno"> 6692</span> </div><div class="line"><a name="l06693"></a><span class="lineno"> 6693</span>  <span class="comment">// Constants.</span></div><div class="line"><a name="l06694"></a><span class="lineno"> 6694</span> </div><div class="line"><a name="l06695"></a><span class="lineno"> 6695</span>  <span class="comment">// # of bits in a number.</span></div><div class="line"><a name="l06696"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_floating_point.html#ab819d2e8f93e9e482373999f0f8d71b9"> 6696</a></span>  <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">size_t</span> <a class="code" href="classtesting_1_1internal_1_1_floating_point.html#ab819d2e8f93e9e482373999f0f8d71b9">kBitCount</a> = 8*<span class="keyword">sizeof</span>(RawType);</div><div class="line"><a name="l06697"></a><span class="lineno"> 6697</span> </div><div class="line"><a name="l06698"></a><span class="lineno"> 6698</span>  <span class="comment">// # of fraction bits in a number.</span></div><div class="line"><a name="l06699"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_floating_point.html#a0b756a6d2a4f5f5b41ca79651c06c043"> 6699</a></span>  <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">size_t</span> <a class="code" href="classtesting_1_1internal_1_1_floating_point.html#a0b756a6d2a4f5f5b41ca79651c06c043">kFractionBitCount</a> =</div><div class="line"><a name="l06700"></a><span class="lineno"> 6700</span>  std::numeric_limits<RawType>::digits - 1;</div><div class="line"><a name="l06701"></a><span class="lineno"> 6701</span> </div><div class="line"><a name="l06702"></a><span class="lineno"> 6702</span>  <span class="comment">// # of exponent bits in a number.</span></div><div class="line"><a name="l06703"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_floating_point.html#a1973d843c00781053d3073daa8a40119"> 6703</a></span>  <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">size_t</span> <a class="code" href="classtesting_1_1internal_1_1_floating_point.html#a1973d843c00781053d3073daa8a40119">kExponentBitCount</a> = <a class="code" href="classtesting_1_1internal_1_1_floating_point.html#ab819d2e8f93e9e482373999f0f8d71b9">kBitCount</a> - 1 - <a class="code" href="classtesting_1_1internal_1_1_floating_point.html#a0b756a6d2a4f5f5b41ca79651c06c043">kFractionBitCount</a>;</div><div class="line"><a name="l06704"></a><span class="lineno"> 6704</span> </div><div class="line"><a name="l06705"></a><span class="lineno"> 6705</span>  <span class="comment">// The mask for the sign bit.</span></div><div class="line"><a name="l06706"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_floating_point.html#aca98b5ea6f2222a66a82e52421682efa"> 6706</a></span>  <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_floating_point.html#abf228bf6cd48f12c8b44c85b4971a731">Bits</a> <a class="code" href="classtesting_1_1internal_1_1_floating_point.html#aca98b5ea6f2222a66a82e52421682efa">kSignBitMask</a> = <span class="keyword">static_cast<</span><a class="code" href="classtesting_1_1internal_1_1_floating_point.html#abf228bf6cd48f12c8b44c85b4971a731">Bits</a><span class="keyword">></span>(1) << (<a class="code" href="classtesting_1_1internal_1_1_floating_point.html#ab819d2e8f93e9e482373999f0f8d71b9">kBitCount</a> - 1);</div><div class="line"><a name="l06707"></a><span class="lineno"> 6707</span> </div><div class="line"><a name="l06708"></a><span class="lineno"> 6708</span>  <span class="comment">// The mask for the fraction bits.</span></div><div class="line"><a name="l06709"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_floating_point.html#a0ac75d4ffd24f14bca452abe8a718da1"> 6709</a></span>  <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_floating_point.html#abf228bf6cd48f12c8b44c85b4971a731">Bits</a> <a class="code" href="classtesting_1_1internal_1_1_floating_point.html#a0ac75d4ffd24f14bca452abe8a718da1">kFractionBitMask</a> =</div><div class="line"><a name="l06710"></a><span class="lineno"> 6710</span>  ~static_cast<<a class="code" href="classtesting_1_1internal_1_1_floating_point.html#abf228bf6cd48f12c8b44c85b4971a731">Bits</a>>(0) >> (<a class="code" href="classtesting_1_1internal_1_1_floating_point.html#a1973d843c00781053d3073daa8a40119">kExponentBitCount</a> + 1);</div><div class="line"><a name="l06711"></a><span class="lineno"> 6711</span> </div><div class="line"><a name="l06712"></a><span class="lineno"> 6712</span>  <span class="comment">// The mask for the exponent bits.</span></div><div class="line"><a name="l06713"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_floating_point.html#a66065dfc4d5f41100f686159637af23b"> 6713</a></span>  <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_floating_point.html#abf228bf6cd48f12c8b44c85b4971a731">Bits</a> <a class="code" href="classtesting_1_1internal_1_1_floating_point.html#a66065dfc4d5f41100f686159637af23b">kExponentBitMask</a> = ~(<a class="code" href="classtesting_1_1internal_1_1_floating_point.html#aca98b5ea6f2222a66a82e52421682efa">kSignBitMask</a> | <a class="code" href="classtesting_1_1internal_1_1_floating_point.html#a0ac75d4ffd24f14bca452abe8a718da1">kFractionBitMask</a>);</div><div class="line"><a name="l06714"></a><span class="lineno"> 6714</span> </div><div class="line"><a name="l06715"></a><span class="lineno"> 6715</span>  <span class="comment">// How many ULP's (Units in the Last Place) we want to tolerate when</span></div><div class="line"><a name="l06716"></a><span class="lineno"> 6716</span>  <span class="comment">// comparing two numbers. The larger the value, the more error we</span></div><div class="line"><a name="l06717"></a><span class="lineno"> 6717</span>  <span class="comment">// allow. A 0 value means that two numbers must be exactly the same</span></div><div class="line"><a name="l06718"></a><span class="lineno"> 6718</span>  <span class="comment">// to be considered equal.</span></div><div class="line"><a name="l06719"></a><span class="lineno"> 6719</span>  <span class="comment">//</span></div><div class="line"><a name="l06720"></a><span class="lineno"> 6720</span>  <span class="comment">// The maximum error of a single floating-point operation is 0.5</span></div><div class="line"><a name="l06721"></a><span class="lineno"> 6721</span>  <span class="comment">// units in the last place. On Intel CPU's, all floating-point</span></div><div class="line"><a name="l06722"></a><span class="lineno"> 6722</span>  <span class="comment">// calculations are done with 80-bit precision, while double has 64</span></div><div class="line"><a name="l06723"></a><span class="lineno"> 6723</span>  <span class="comment">// bits. Therefore, 4 should be enough for ordinary use.</span></div><div class="line"><a name="l06724"></a><span class="lineno"> 6724</span>  <span class="comment">//</span></div><div class="line"><a name="l06725"></a><span class="lineno"> 6725</span>  <span class="comment">// See the following article for more details on ULP:</span></div><div class="line"><a name="l06726"></a><span class="lineno"> 6726</span>  <span class="comment">// http://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/</span></div><div class="line"><a name="l06727"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_floating_point.html#aac498b3714d93f8e88cdc30e4c5935f6"> 6727</a></span>  <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">size_t</span> <a class="code" href="classtesting_1_1internal_1_1_floating_point.html#aac498b3714d93f8e88cdc30e4c5935f6">kMaxUlps</a> = 4;</div><div class="line"><a name="l06728"></a><span class="lineno"> 6728</span> </div><div class="line"><a name="l06729"></a><span class="lineno"> 6729</span>  <span class="comment">// Constructs a FloatingPoint from a raw floating-point number.</span></div><div class="line"><a name="l06730"></a><span class="lineno"> 6730</span>  <span class="comment">//</span></div><div class="line"><a name="l06731"></a><span class="lineno"> 6731</span>  <span class="comment">// On an Intel CPU, passing a non-normalized NAN (Not a Number)</span></div><div class="line"><a name="l06732"></a><span class="lineno"> 6732</span>  <span class="comment">// around may change its bits, although the new value is guaranteed</span></div><div class="line"><a name="l06733"></a><span class="lineno"> 6733</span>  <span class="comment">// to be also a NAN. Therefore, don't expect this constructor to</span></div><div class="line"><a name="l06734"></a><span class="lineno"> 6734</span>  <span class="comment">// preserve the bits in x when x is a NAN.</span></div><div class="line"><a name="l06735"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_floating_point.html#a0dabf840863e0df84046f171c891fe71"> 6735</a></span>  <span class="keyword">explicit</span> <a class="code" href="classtesting_1_1internal_1_1_floating_point.html#a0dabf840863e0df84046f171c891fe71">FloatingPoint</a>(<span class="keyword">const</span> RawType& x) { u_.value_ = x; }</div><div class="line"><a name="l06736"></a><span class="lineno"> 6736</span> </div><div class="line"><a name="l06737"></a><span class="lineno"> 6737</span>  <span class="comment">// Static methods</span></div><div class="line"><a name="l06738"></a><span class="lineno"> 6738</span> </div><div class="line"><a name="l06739"></a><span class="lineno"> 6739</span>  <span class="comment">// Reinterprets a bit pattern as a floating-point number.</span></div><div class="line"><a name="l06740"></a><span class="lineno"> 6740</span>  <span class="comment">//</span></div><div class="line"><a name="l06741"></a><span class="lineno"> 6741</span>  <span class="comment">// This function is needed to test the AlmostEquals() method.</span></div><div class="line"><a name="l06742"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_floating_point.html#ac551f793522e54fbd8a25acb79eac5b1"> 6742</a></span>  <span class="keyword">static</span> RawType <a class="code" href="classtesting_1_1internal_1_1_floating_point.html#ac551f793522e54fbd8a25acb79eac5b1">ReinterpretBits</a>(<span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_floating_point.html#abf228bf6cd48f12c8b44c85b4971a731">Bits</a> <a class="code" href="classtesting_1_1internal_1_1_floating_point.html#aab053be914bdc9e507c0db89740c318c">bits</a>) {</div><div class="line"><a name="l06743"></a><span class="lineno"> 6743</span>  <a class="code" href="classtesting_1_1internal_1_1_floating_point.html">FloatingPoint</a> fp(0);</div><div class="line"><a name="l06744"></a><span class="lineno"> 6744</span>  fp.u_.bits_ = <a class="code" href="classtesting_1_1internal_1_1_floating_point.html#aab053be914bdc9e507c0db89740c318c">bits</a>;</div><div class="line"><a name="l06745"></a><span class="lineno"> 6745</span>  <span class="keywordflow">return</span> fp.u_.value_;</div><div class="line"><a name="l06746"></a><span class="lineno"> 6746</span>  }</div><div class="line"><a name="l06747"></a><span class="lineno"> 6747</span> </div><div class="line"><a name="l06748"></a><span class="lineno"> 6748</span>  <span class="comment">// Returns the floating-point number that represent positive infinity.</span></div><div class="line"><a name="l06749"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_floating_point.html#a460027cc19cf01ae8e09cc3796b2b575"> 6749</a></span>  <span class="keyword">static</span> RawType <a class="code" href="classtesting_1_1internal_1_1_floating_point.html#a460027cc19cf01ae8e09cc3796b2b575">Infinity</a>() {</div><div class="line"><a name="l06750"></a><span class="lineno"> 6750</span>  <span class="keywordflow">return</span> <a class="code" href="classtesting_1_1internal_1_1_floating_point.html#ac551f793522e54fbd8a25acb79eac5b1">ReinterpretBits</a>(<a class="code" href="classtesting_1_1internal_1_1_floating_point.html#a66065dfc4d5f41100f686159637af23b">kExponentBitMask</a>);</div><div class="line"><a name="l06751"></a><span class="lineno"> 6751</span>  }</div><div class="line"><a name="l06752"></a><span class="lineno"> 6752</span> </div><div class="line"><a name="l06753"></a><span class="lineno"> 6753</span>  <span class="comment">// Returns the maximum representable finite floating-point number.</span></div><div class="line"><a name="l06754"></a><span class="lineno"> 6754</span>  <span class="keyword">static</span> RawType <a class="code" href="classtesting_1_1internal_1_1_floating_point.html#aae5954d8a57d3ff0987c6930cb68e114">Max</a>();</div><div class="line"><a name="l06755"></a><span class="lineno"> 6755</span> </div><div class="line"><a name="l06756"></a><span class="lineno"> 6756</span>  <span class="comment">// Non-static methods</span></div><div class="line"><a name="l06757"></a><span class="lineno"> 6757</span> </div><div class="line"><a name="l06758"></a><span class="lineno"> 6758</span>  <span class="comment">// Returns the bits that represents this number.</span></div><div class="line"><a name="l06759"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_floating_point.html#aab053be914bdc9e507c0db89740c318c"> 6759</a></span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_floating_point.html#abf228bf6cd48f12c8b44c85b4971a731">Bits</a> &<a class="code" href="classtesting_1_1internal_1_1_floating_point.html#aab053be914bdc9e507c0db89740c318c">bits</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> u_.bits_; }</div><div class="line"><a name="l06760"></a><span class="lineno"> 6760</span> </div><div class="line"><a name="l06761"></a><span class="lineno"> 6761</span>  <span class="comment">// Returns the exponent bits of this number.</span></div><div class="line"><a name="l06762"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_floating_point.html#af6bf8fab8df572ecb137a3516ff390ae"> 6762</a></span>  <a class="code" href="classtesting_1_1internal_1_1_floating_point.html#abf228bf6cd48f12c8b44c85b4971a731">Bits</a> <a class="code" href="classtesting_1_1internal_1_1_floating_point.html#af6bf8fab8df572ecb137a3516ff390ae">exponent_bits</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="classtesting_1_1internal_1_1_floating_point.html#a66065dfc4d5f41100f686159637af23b">kExponentBitMask</a> & u_.bits_; }</div><div class="line"><a name="l06763"></a><span class="lineno"> 6763</span> </div><div class="line"><a name="l06764"></a><span class="lineno"> 6764</span>  <span class="comment">// Returns the fraction bits of this number.</span></div><div class="line"><a name="l06765"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_floating_point.html#aa17337e50a2ac855719bc0676529558f"> 6765</a></span>  <a class="code" href="classtesting_1_1internal_1_1_floating_point.html#abf228bf6cd48f12c8b44c85b4971a731">Bits</a> <a class="code" href="classtesting_1_1internal_1_1_floating_point.html#aa17337e50a2ac855719bc0676529558f">fraction_bits</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="classtesting_1_1internal_1_1_floating_point.html#a0ac75d4ffd24f14bca452abe8a718da1">kFractionBitMask</a> & u_.bits_; }</div><div class="line"><a name="l06766"></a><span class="lineno"> 6766</span> </div><div class="line"><a name="l06767"></a><span class="lineno"> 6767</span>  <span class="comment">// Returns the sign bit of this number.</span></div><div class="line"><a name="l06768"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_floating_point.html#afb8a816bb598225d775caaf43a893ef0"> 6768</a></span>  <a class="code" href="classtesting_1_1internal_1_1_floating_point.html#abf228bf6cd48f12c8b44c85b4971a731">Bits</a> <a class="code" href="classtesting_1_1internal_1_1_floating_point.html#afb8a816bb598225d775caaf43a893ef0">sign_bit</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="classtesting_1_1internal_1_1_floating_point.html#aca98b5ea6f2222a66a82e52421682efa">kSignBitMask</a> & u_.bits_; }</div><div class="line"><a name="l06769"></a><span class="lineno"> 6769</span> </div><div class="line"><a name="l06770"></a><span class="lineno"> 6770</span>  <span class="comment">// Returns true iff this is NAN (not a number).</span></div><div class="line"><a name="l06771"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_floating_point.html#a1fc654fd206efa98e480aa1e034f30d5"> 6771</a></span>  <span class="keywordtype">bool</span> <a class="code" href="classtesting_1_1internal_1_1_floating_point.html#a1fc654fd206efa98e480aa1e034f30d5">is_nan</a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l06772"></a><span class="lineno"> 6772</span>  <span class="comment">// It's a NAN if the exponent bits are all ones and the fraction</span></div><div class="line"><a name="l06773"></a><span class="lineno"> 6773</span>  <span class="comment">// bits are not entirely zeros.</span></div><div class="line"><a name="l06774"></a><span class="lineno"> 6774</span>  <span class="keywordflow">return</span> (<a class="code" href="classtesting_1_1internal_1_1_floating_point.html#af6bf8fab8df572ecb137a3516ff390ae">exponent_bits</a>() == <a class="code" href="classtesting_1_1internal_1_1_floating_point.html#a66065dfc4d5f41100f686159637af23b">kExponentBitMask</a>) && (<a class="code" href="classtesting_1_1internal_1_1_floating_point.html#aa17337e50a2ac855719bc0676529558f">fraction_bits</a>() != 0);</div><div class="line"><a name="l06775"></a><span class="lineno"> 6775</span>  }</div><div class="line"><a name="l06776"></a><span class="lineno"> 6776</span> </div><div class="line"><a name="l06777"></a><span class="lineno"> 6777</span>  <span class="comment">// Returns true iff this number is at most kMaxUlps ULP's away from</span></div><div class="line"><a name="l06778"></a><span class="lineno"> 6778</span>  <span class="comment">// rhs. In particular, this function:</span></div><div class="line"><a name="l06779"></a><span class="lineno"> 6779</span>  <span class="comment">//</span></div><div class="line"><a name="l06780"></a><span class="lineno"> 6780</span>  <span class="comment">// - returns false if either number is (or both are) NAN.</span></div><div class="line"><a name="l06781"></a><span class="lineno"> 6781</span>  <span class="comment">// - treats really large numbers as almost equal to infinity.</span></div><div class="line"><a name="l06782"></a><span class="lineno"> 6782</span>  <span class="comment">// - thinks +0.0 and -0.0 are 0 DLP's apart.</span></div><div class="line"><a name="l06783"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_floating_point.html#a965214c1af2f9ac5adb1393794aa81e5"> 6783</a></span>  <span class="keywordtype">bool</span> <a class="code" href="classtesting_1_1internal_1_1_floating_point.html#a965214c1af2f9ac5adb1393794aa81e5">AlmostEquals</a>(<span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_floating_point.html">FloatingPoint</a>& rhs)<span class="keyword"> const </span>{</div><div class="line"><a name="l06784"></a><span class="lineno"> 6784</span>  <span class="comment">// The IEEE standard says that any comparison operation involving</span></div><div class="line"><a name="l06785"></a><span class="lineno"> 6785</span>  <span class="comment">// a NAN must return false.</span></div><div class="line"><a name="l06786"></a><span class="lineno"> 6786</span>  <span class="keywordflow">if</span> (<a class="code" href="classtesting_1_1internal_1_1_floating_point.html#a1fc654fd206efa98e480aa1e034f30d5">is_nan</a>() || rhs.<a class="code" href="classtesting_1_1internal_1_1_floating_point.html#a1fc654fd206efa98e480aa1e034f30d5">is_nan</a>()) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l06787"></a><span class="lineno"> 6787</span> </div><div class="line"><a name="l06788"></a><span class="lineno"> 6788</span>  <span class="keywordflow">return</span> DistanceBetweenSignAndMagnitudeNumbers(u_.bits_, rhs.u_.bits_)</div><div class="line"><a name="l06789"></a><span class="lineno"> 6789</span>  <= <a class="code" href="classtesting_1_1internal_1_1_floating_point.html#aac498b3714d93f8e88cdc30e4c5935f6">kMaxUlps</a>;</div><div class="line"><a name="l06790"></a><span class="lineno"> 6790</span>  }</div><div class="line"><a name="l06791"></a><span class="lineno"> 6791</span> </div><div class="line"><a name="l06792"></a><span class="lineno"> 6792</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l06793"></a><span class="lineno"> 6793</span>  <span class="comment">// The data type used to store the actual floating-point number.</span></div><div class="line"><a name="l06794"></a><span class="lineno"> 6794</span>  <span class="keyword">union </span>FloatingPointUnion {</div><div class="line"><a name="l06795"></a><span class="lineno"> 6795</span>  RawType value_; <span class="comment">// The raw floating-point number.</span></div><div class="line"><a name="l06796"></a><span class="lineno"> 6796</span>  <a class="code" href="classtesting_1_1internal_1_1_floating_point.html#abf228bf6cd48f12c8b44c85b4971a731">Bits</a> bits_; <span class="comment">// The bits that represent the number.</span></div><div class="line"><a name="l06797"></a><span class="lineno"> 6797</span>  };</div><div class="line"><a name="l06798"></a><span class="lineno"> 6798</span> </div><div class="line"><a name="l06799"></a><span class="lineno"> 6799</span>  <span class="comment">// Converts an integer from the sign-and-magnitude representation to</span></div><div class="line"><a name="l06800"></a><span class="lineno"> 6800</span>  <span class="comment">// the biased representation. More precisely, let N be 2 to the</span></div><div class="line"><a name="l06801"></a><span class="lineno"> 6801</span>  <span class="comment">// power of (kBitCount - 1), an integer x is represented by the</span></div><div class="line"><a name="l06802"></a><span class="lineno"> 6802</span>  <span class="comment">// unsigned number x + N.</span></div><div class="line"><a name="l06803"></a><span class="lineno"> 6803</span>  <span class="comment">//</span></div><div class="line"><a name="l06804"></a><span class="lineno"> 6804</span>  <span class="comment">// For instance,</span></div><div class="line"><a name="l06805"></a><span class="lineno"> 6805</span>  <span class="comment">//</span></div><div class="line"><a name="l06806"></a><span class="lineno"> 6806</span>  <span class="comment">// -N + 1 (the most negative number representable using</span></div><div class="line"><a name="l06807"></a><span class="lineno"> 6807</span>  <span class="comment">// sign-and-magnitude) is represented by 1;</span></div><div class="line"><a name="l06808"></a><span class="lineno"> 6808</span>  <span class="comment">// 0 is represented by N; and</span></div><div class="line"><a name="l06809"></a><span class="lineno"> 6809</span>  <span class="comment">// N - 1 (the biggest number representable using</span></div><div class="line"><a name="l06810"></a><span class="lineno"> 6810</span>  <span class="comment">// sign-and-magnitude) is represented by 2N - 1.</span></div><div class="line"><a name="l06811"></a><span class="lineno"> 6811</span>  <span class="comment">//</span></div><div class="line"><a name="l06812"></a><span class="lineno"> 6812</span>  <span class="comment">// Read http://en.wikipedia.org/wiki/Signed_number_representations</span></div><div class="line"><a name="l06813"></a><span class="lineno"> 6813</span>  <span class="comment">// for more details on signed number representations.</span></div><div class="line"><a name="l06814"></a><span class="lineno"> 6814</span>  <span class="keyword">static</span> <a class="code" href="classtesting_1_1internal_1_1_floating_point.html#abf228bf6cd48f12c8b44c85b4971a731">Bits</a> SignAndMagnitudeToBiased(<span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_floating_point.html#abf228bf6cd48f12c8b44c85b4971a731">Bits</a> &sam) {</div><div class="line"><a name="l06815"></a><span class="lineno"> 6815</span>  <span class="keywordflow">if</span> (<a class="code" href="classtesting_1_1internal_1_1_floating_point.html#aca98b5ea6f2222a66a82e52421682efa">kSignBitMask</a> & sam) {</div><div class="line"><a name="l06816"></a><span class="lineno"> 6816</span>  <span class="comment">// sam represents a negative number.</span></div><div class="line"><a name="l06817"></a><span class="lineno"> 6817</span>  <span class="keywordflow">return</span> ~sam + 1;</div><div class="line"><a name="l06818"></a><span class="lineno"> 6818</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l06819"></a><span class="lineno"> 6819</span>  <span class="comment">// sam represents a positive number.</span></div><div class="line"><a name="l06820"></a><span class="lineno"> 6820</span>  <span class="keywordflow">return</span> <a class="code" href="classtesting_1_1internal_1_1_floating_point.html#aca98b5ea6f2222a66a82e52421682efa">kSignBitMask</a> | sam;</div><div class="line"><a name="l06821"></a><span class="lineno"> 6821</span>  }</div><div class="line"><a name="l06822"></a><span class="lineno"> 6822</span>  }</div><div class="line"><a name="l06823"></a><span class="lineno"> 6823</span> </div><div class="line"><a name="l06824"></a><span class="lineno"> 6824</span>  <span class="comment">// Given two numbers in the sign-and-magnitude representation,</span></div><div class="line"><a name="l06825"></a><span class="lineno"> 6825</span>  <span class="comment">// returns the distance between them as an unsigned number.</span></div><div class="line"><a name="l06826"></a><span class="lineno"> 6826</span>  <span class="keyword">static</span> <a class="code" href="classtesting_1_1internal_1_1_floating_point.html#abf228bf6cd48f12c8b44c85b4971a731">Bits</a> DistanceBetweenSignAndMagnitudeNumbers(<span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_floating_point.html#abf228bf6cd48f12c8b44c85b4971a731">Bits</a> &sam1,</div><div class="line"><a name="l06827"></a><span class="lineno"> 6827</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_floating_point.html#abf228bf6cd48f12c8b44c85b4971a731">Bits</a> &sam2) {</div><div class="line"><a name="l06828"></a><span class="lineno"> 6828</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_floating_point.html#abf228bf6cd48f12c8b44c85b4971a731">Bits</a> biased1 = SignAndMagnitudeToBiased(sam1);</div><div class="line"><a name="l06829"></a><span class="lineno"> 6829</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_floating_point.html#abf228bf6cd48f12c8b44c85b4971a731">Bits</a> biased2 = SignAndMagnitudeToBiased(sam2);</div><div class="line"><a name="l06830"></a><span class="lineno"> 6830</span>  <span class="keywordflow">return</span> (biased1 >= biased2) ? (biased1 - biased2) : (biased2 - biased1);</div><div class="line"><a name="l06831"></a><span class="lineno"> 6831</span>  }</div><div class="line"><a name="l06832"></a><span class="lineno"> 6832</span> </div><div class="line"><a name="l06833"></a><span class="lineno"> 6833</span>  FloatingPointUnion u_;</div><div class="line"><a name="l06834"></a><span class="lineno"> 6834</span> };</div><div class="line"><a name="l06835"></a><span class="lineno"> 6835</span> </div><div class="line"><a name="l06836"></a><span class="lineno"> 6836</span> <span class="comment">// We cannot use std::numeric_limits<T>::max() as it clashes with the max()</span></div><div class="line"><a name="l06837"></a><span class="lineno"> 6837</span> <span class="comment">// macro defined by <windows.h>.</span></div><div class="line"><a name="l06838"></a><span class="lineno"> 6838</span> <span class="keyword">template</span> <></div><div class="line"><a name="l06839"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_floating_point.html#af2eda9331e679229a1baa3404b57b51d"> 6839</a></span> <span class="keyword">inline</span> <span class="keywordtype">float</span> <a class="code" href="classtesting_1_1internal_1_1_floating_point.html#aae5954d8a57d3ff0987c6930cb68e114">FloatingPoint<float>::Max</a>() { <span class="keywordflow">return</span> FLT_MAX; }</div><div class="line"><a name="l06840"></a><span class="lineno"> 6840</span> <span class="keyword">template</span> <></div><div class="line"><a name="l06841"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_floating_point.html#afc2e85c0e886cb13b2300e961c9a9648"> 6841</a></span> <span class="keyword">inline</span> <span class="keywordtype">double</span> <a class="code" href="classtesting_1_1internal_1_1_floating_point.html#aae5954d8a57d3ff0987c6930cb68e114">FloatingPoint<double>::Max</a>() { <span class="keywordflow">return</span> DBL_MAX; }</div><div class="line"><a name="l06842"></a><span class="lineno"> 6842</span> </div><div class="line"><a name="l06843"></a><span class="lineno"> 6843</span> <span class="comment">// Typedefs the instances of the FloatingPoint template class that we</span></div><div class="line"><a name="l06844"></a><span class="lineno"> 6844</span> <span class="comment">// care to use.</span></div><div class="line"><a name="l06845"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#a02e1981f5ff70609e6ac06e006ff519a"> 6845</a></span> <span class="keyword">typedef</span> <a class="code" href="classtesting_1_1internal_1_1_floating_point.html">FloatingPoint<float></a> <a class="code" href="namespacetesting_1_1internal.html#a02e1981f5ff70609e6ac06e006ff519a">Float</a>;</div><div class="line"><a name="l06846"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#a66a7579b1893b260c31dad577f7a5c48"> 6846</a></span> <span class="keyword">typedef</span> <a class="code" href="classtesting_1_1internal_1_1_floating_point.html">FloatingPoint<double></a> <a class="code" href="namespacetesting_1_1internal.html#a66a7579b1893b260c31dad577f7a5c48">Double</a>;</div><div class="line"><a name="l06847"></a><span class="lineno"> 6847</span> </div><div class="line"><a name="l06848"></a><span class="lineno"> 6848</span> <span class="comment">// In order to catch the mistake of putting tests that use different</span></div><div class="line"><a name="l06849"></a><span class="lineno"> 6849</span> <span class="comment">// test fixture classes in the same test suite, we need to assign</span></div><div class="line"><a name="l06850"></a><span class="lineno"> 6850</span> <span class="comment">// unique IDs to fixture classes and compare them. The TypeId type is</span></div><div class="line"><a name="l06851"></a><span class="lineno"> 6851</span> <span class="comment">// used to hold such IDs. The user should treat TypeId as an opaque</span></div><div class="line"><a name="l06852"></a><span class="lineno"> 6852</span> <span class="comment">// type: the only operation allowed on TypeId values is to compare</span></div><div class="line"><a name="l06853"></a><span class="lineno"> 6853</span> <span class="comment">// them for equality using the == operator.</span></div><div class="line"><a name="l06854"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#ab1114197d3c657d8b7f8e0c5caa12d00"> 6854</a></span> <span class="keyword">typedef</span> <span class="keyword">const</span> <span class="keywordtype">void</span>* <a class="code" href="namespacetesting_1_1internal.html#ab1114197d3c657d8b7f8e0c5caa12d00">TypeId</a>;</div><div class="line"><a name="l06855"></a><span class="lineno"> 6855</span> </div><div class="line"><a name="l06856"></a><span class="lineno"> 6856</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l06857"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_type_id_helper.html"> 6857</a></span> <span class="keyword">class </span><a class="code" href="classtesting_1_1internal_1_1_type_id_helper.html">TypeIdHelper</a> {</div><div class="line"><a name="l06858"></a><span class="lineno"> 6858</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l06859"></a><span class="lineno"> 6859</span>  <span class="comment">// dummy_ must not have a const type. Otherwise an overly eager</span></div><div class="line"><a name="l06860"></a><span class="lineno"> 6860</span>  <span class="comment">// compiler (e.g. MSVC 7.1 & 8.0) may try to merge</span></div><div class="line"><a name="l06861"></a><span class="lineno"> 6861</span>  <span class="comment">// TypeIdHelper<T>::dummy_ for different Ts as an "optimization".</span></div><div class="line"><a name="l06862"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_type_id_helper.html#a372268b1520d965d0bdf01ebad3d270e"> 6862</a></span>  <span class="keyword">static</span> <span class="keywordtype">bool</span> <a class="code" href="classtesting_1_1internal_1_1_type_id_helper.html#a372268b1520d965d0bdf01ebad3d270e">dummy_</a>;</div><div class="line"><a name="l06863"></a><span class="lineno"> 6863</span> };</div><div class="line"><a name="l06864"></a><span class="lineno"> 6864</span> </div><div class="line"><a name="l06865"></a><span class="lineno"> 6865</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l06866"></a><span class="lineno"> 6866</span> <span class="keywordtype">bool</span> <a class="code" href="classtesting_1_1internal_1_1_type_id_helper.html">TypeIdHelper<T>::dummy_</a> = <span class="keyword">false</span>;</div><div class="line"><a name="l06867"></a><span class="lineno"> 6867</span> </div><div class="line"><a name="l06868"></a><span class="lineno"> 6868</span> <span class="comment">// GetTypeId<T>() returns the ID of type T. Different values will be</span></div><div class="line"><a name="l06869"></a><span class="lineno"> 6869</span> <span class="comment">// returned for different types. Calling the function twice with the</span></div><div class="line"><a name="l06870"></a><span class="lineno"> 6870</span> <span class="comment">// same type argument is guaranteed to return the same ID.</span></div><div class="line"><a name="l06871"></a><span class="lineno"> 6871</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l06872"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#a6b108e56fdc68ea937ffb3759fb55ab0"> 6872</a></span> <a class="code" href="namespacetesting_1_1internal.html#ab1114197d3c657d8b7f8e0c5caa12d00">TypeId</a> <a class="code" href="namespacetesting_1_1internal.html#a6b108e56fdc68ea937ffb3759fb55ab0">GetTypeId</a>() {</div><div class="line"><a name="l06873"></a><span class="lineno"> 6873</span>  <span class="comment">// The compiler is required to allocate a different</span></div><div class="line"><a name="l06874"></a><span class="lineno"> 6874</span>  <span class="comment">// TypeIdHelper<T>::dummy_ variable for each T used to instantiate</span></div><div class="line"><a name="l06875"></a><span class="lineno"> 6875</span>  <span class="comment">// the template. Therefore, the address of dummy_ is guaranteed to</span></div><div class="line"><a name="l06876"></a><span class="lineno"> 6876</span>  <span class="comment">// be unique.</span></div><div class="line"><a name="l06877"></a><span class="lineno"> 6877</span>  <span class="keywordflow">return</span> &(<a class="code" href="classtesting_1_1internal_1_1_type_id_helper.html">TypeIdHelper<T>::dummy_</a>);</div><div class="line"><a name="l06878"></a><span class="lineno"> 6878</span> }</div><div class="line"><a name="l06879"></a><span class="lineno"> 6879</span> </div><div class="line"><a name="l06880"></a><span class="lineno"> 6880</span> <span class="comment">// Returns the type ID of ::testing::Test. Always call this instead</span></div><div class="line"><a name="l06881"></a><span class="lineno"> 6881</span> <span class="comment">// of GetTypeId< ::testing::Test>() to get the type ID of</span></div><div class="line"><a name="l06882"></a><span class="lineno"> 6882</span> <span class="comment">// ::testing::Test, as the latter may give the wrong result due to a</span></div><div class="line"><a name="l06883"></a><span class="lineno"> 6883</span> <span class="comment">// suspected linker bug when compiling Google Test as a Mac OS X</span></div><div class="line"><a name="l06884"></a><span class="lineno"> 6884</span> <span class="comment">// framework.</span></div><div class="line"><a name="l06885"></a><span class="lineno"> 6885</span> <a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> <a class="code" href="namespacetesting_1_1internal.html#ab1114197d3c657d8b7f8e0c5caa12d00">TypeId</a> <a class="code" href="namespacetesting_1_1internal.html#a1e85cf16bb95b60f879d48ba1fbfc1c9">GetTestTypeId</a>();</div><div class="line"><a name="l06886"></a><span class="lineno"> 6886</span> </div><div class="line"><a name="l06887"></a><span class="lineno"> 6887</span> <span class="comment">// Defines the abstract factory interface that creates instances</span></div><div class="line"><a name="l06888"></a><span class="lineno"> 6888</span> <span class="comment">// of a Test object.</span></div><div class="line"><a name="l06889"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_test_factory_base.html"> 6889</a></span> <span class="keyword">class </span><a class="code" href="classtesting_1_1internal_1_1_test_factory_base.html">TestFactoryBase</a> {</div><div class="line"><a name="l06890"></a><span class="lineno"> 6890</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l06891"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_test_factory_base.html#a18f22a7594336a36642289c1decddc9e"> 6891</a></span>  <span class="keyword">virtual</span> <a class="code" href="classtesting_1_1internal_1_1_test_factory_base.html#a18f22a7594336a36642289c1decddc9e">~TestFactoryBase</a>() {}</div><div class="line"><a name="l06892"></a><span class="lineno"> 6892</span> </div><div class="line"><a name="l06893"></a><span class="lineno"> 6893</span>  <span class="comment">// Creates a test instance to run. The instance is both created and destroyed</span></div><div class="line"><a name="l06894"></a><span class="lineno"> 6894</span>  <span class="comment">// within TestInfoImpl::Run()</span></div><div class="line"><a name="l06895"></a><span class="lineno"> 6895</span>  <span class="keyword">virtual</span> <a class="code" href="classtesting_1_1_test.html">Test</a>* <a class="code" href="classtesting_1_1internal_1_1_test_factory_base.html#a07ac3ca0b196cdb092da0bb186b7c030">CreateTest</a>() = 0;</div><div class="line"><a name="l06896"></a><span class="lineno"> 6896</span> </div><div class="line"><a name="l06897"></a><span class="lineno"> 6897</span>  <span class="keyword">protected</span>:</div><div class="line"><a name="l06898"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_test_factory_base.html#afedbf147b2a213517b315880d8c81427"> 6898</a></span>  <a class="code" href="classtesting_1_1internal_1_1_test_factory_base.html#afedbf147b2a213517b315880d8c81427">TestFactoryBase</a>() {}</div><div class="line"><a name="l06899"></a><span class="lineno"> 6899</span> </div><div class="line"><a name="l06900"></a><span class="lineno"> 6900</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l06901"></a><span class="lineno"> 6901</span>  GTEST_DISALLOW_COPY_AND_ASSIGN_(<a class="code" href="classtesting_1_1internal_1_1_test_factory_base.html">TestFactoryBase</a>);</div><div class="line"><a name="l06902"></a><span class="lineno"> 6902</span> };</div><div class="line"><a name="l06903"></a><span class="lineno"> 6903</span> </div><div class="line"><a name="l06904"></a><span class="lineno"> 6904</span> <span class="comment">// This class provides implementation of TeastFactoryBase interface.</span></div><div class="line"><a name="l06905"></a><span class="lineno"> 6905</span> <span class="comment">// It is used in TEST and TEST_F macros.</span></div><div class="line"><a name="l06906"></a><span class="lineno"> 6906</span> <span class="keyword">template</span> <<span class="keyword">class</span> TestClass></div><div class="line"><a name="l06907"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_test_factory_impl.html"> 6907</a></span> <span class="keyword">class </span><a class="code" href="classtesting_1_1internal_1_1_test_factory_impl.html">TestFactoryImpl</a> : <span class="keyword">public</span> <a class="code" href="classtesting_1_1internal_1_1_test_factory_base.html">TestFactoryBase</a> {</div><div class="line"><a name="l06908"></a><span class="lineno"> 6908</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l06909"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_test_factory_impl.html#ab9b9236ef39b14f0a78e611748e970e3"> 6909</a></span>  <a class="code" href="classtesting_1_1_test.html">Test</a>* <a class="code" href="classtesting_1_1internal_1_1_test_factory_impl.html#ab9b9236ef39b14f0a78e611748e970e3">CreateTest</a>()<span class="keyword"> override </span>{ <span class="keywordflow">return</span> <span class="keyword">new</span> TestClass; }</div><div class="line"><a name="l06910"></a><span class="lineno"> 6910</span> };</div><div class="line"><a name="l06911"></a><span class="lineno"> 6911</span> </div><div class="line"><a name="l06912"></a><span class="lineno"> 6912</span> <span class="preprocessor">#if GTEST_OS_WINDOWS</span></div><div class="line"><a name="l06913"></a><span class="lineno"> 6913</span> </div><div class="line"><a name="l06914"></a><span class="lineno"> 6914</span> <span class="comment">// Predicate-formatters for implementing the HRESULT checking macros</span></div><div class="line"><a name="l06915"></a><span class="lineno"> 6915</span> <span class="comment">// {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED}</span></div><div class="line"><a name="l06916"></a><span class="lineno"> 6916</span> <span class="comment">// We pass a long instead of HRESULT to avoid causing an</span></div><div class="line"><a name="l06917"></a><span class="lineno"> 6917</span> <span class="comment">// include dependency for the HRESULT type.</span></div><div class="line"><a name="l06918"></a><span class="lineno"> 6918</span> <a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> AssertionResult IsHRESULTSuccess(<span class="keyword">const</span> <span class="keywordtype">char</span>* expr,</div><div class="line"><a name="l06919"></a><span class="lineno"> 6919</span>  <span class="keywordtype">long</span> hr); <span class="comment">// NOLINT</span></div><div class="line"><a name="l06920"></a><span class="lineno"> 6920</span> <a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> AssertionResult IsHRESULTFailure(<span class="keyword">const</span> <span class="keywordtype">char</span>* expr,</div><div class="line"><a name="l06921"></a><span class="lineno"> 6921</span>  <span class="keywordtype">long</span> hr); <span class="comment">// NOLINT</span></div><div class="line"><a name="l06922"></a><span class="lineno"> 6922</span> </div><div class="line"><a name="l06923"></a><span class="lineno"> 6923</span> <span class="preprocessor">#endif // GTEST_OS_WINDOWS</span></div><div class="line"><a name="l06924"></a><span class="lineno"> 6924</span> </div><div class="line"><a name="l06925"></a><span class="lineno"> 6925</span> <span class="comment">// Types of SetUpTestSuite() and TearDownTestSuite() functions.</span></div><div class="line"><a name="l06926"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#a83e4e0732ac6a9dcfe6ee299dc1b9fa2"> 6926</a></span> <span class="keyword">using</span> <a class="code" href="namespacetesting_1_1internal.html#a83e4e0732ac6a9dcfe6ee299dc1b9fa2">SetUpTestSuiteFunc</a> = void (*)();</div><div class="line"><a name="l06927"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#a8257a87aa42cebaa54b0c48a6ae657a5"> 6927</a></span> <span class="keyword">using</span> <a class="code" href="namespacetesting_1_1internal.html#a8257a87aa42cebaa54b0c48a6ae657a5">TearDownTestSuiteFunc</a> = void (*)();</div><div class="line"><a name="l06928"></a><span class="lineno"> 6928</span> </div><div class="line"><a name="l06929"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_code_location.html"> 6929</a></span> <span class="keyword">struct </span><a class="code" href="structtesting_1_1internal_1_1_code_location.html">CodeLocation</a> {</div><div class="line"><a name="l06930"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_code_location.html#a323a11851c81629d632c47b9b767b8ac"> 6930</a></span>  <a class="code" href="structtesting_1_1internal_1_1_code_location.html#a323a11851c81629d632c47b9b767b8ac">CodeLocation</a>(<span class="keyword">const</span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a>& a_file, <span class="keywordtype">int</span> a_line)</div><div class="line"><a name="l06931"></a><span class="lineno"> 6931</span>  : <a class="code" href="structtesting_1_1internal_1_1_code_location.html#a38118056ad3c11359920274e393bc6b3">file</a>(a_file), <a class="code" href="structtesting_1_1internal_1_1_code_location.html#a01c977c7e8834a05a6d6c40b0c416045">line</a>(a_line) {}</div><div class="line"><a name="l06932"></a><span class="lineno"> 6932</span> </div><div class="line"><a name="l06933"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_code_location.html#a38118056ad3c11359920274e393bc6b3"> 6933</a></span>  <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a> <a class="code" href="structtesting_1_1internal_1_1_code_location.html#a38118056ad3c11359920274e393bc6b3">file</a>;</div><div class="line"><a name="l06934"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_code_location.html#a01c977c7e8834a05a6d6c40b0c416045"> 6934</a></span>  <span class="keywordtype">int</span> <a class="code" href="structtesting_1_1internal_1_1_code_location.html#a01c977c7e8834a05a6d6c40b0c416045">line</a>;</div><div class="line"><a name="l06935"></a><span class="lineno"> 6935</span> };</div><div class="line"><a name="l06936"></a><span class="lineno"> 6936</span> </div><div class="line"><a name="l06937"></a><span class="lineno"> 6937</span> <span class="comment">// Helper to identify which setup function for TestCase / TestSuite to call.</span></div><div class="line"><a name="l06938"></a><span class="lineno"> 6938</span> <span class="comment">// Only one function is allowed, either TestCase or TestSute but not both.</span></div><div class="line"><a name="l06939"></a><span class="lineno"> 6939</span> </div><div class="line"><a name="l06940"></a><span class="lineno"> 6940</span> <span class="comment">// Utility functions to help SuiteApiResolver</span></div><div class="line"><a name="l06941"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#a04786aa10f8b0bf38a5ead94d00475f4"> 6941</a></span> <span class="keyword">using</span> <a class="code" href="namespacetesting_1_1internal.html#a04786aa10f8b0bf38a5ead94d00475f4">SetUpTearDownSuiteFuncType</a> = void (*)();</div><div class="line"><a name="l06942"></a><span class="lineno"> 6942</span> </div><div class="line"><a name="l06943"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#a9579a78c229ea302caded45d65f77336"> 6943</a></span> <span class="keyword">inline</span> <a class="code" href="namespacetesting_1_1internal.html#a04786aa10f8b0bf38a5ead94d00475f4">SetUpTearDownSuiteFuncType</a> <a class="code" href="namespacetesting_1_1internal.html#a9579a78c229ea302caded45d65f77336">GetNotDefaultOrNull</a>(</div><div class="line"><a name="l06944"></a><span class="lineno"> 6944</span>  <a class="code" href="namespacetesting_1_1internal.html#a04786aa10f8b0bf38a5ead94d00475f4">SetUpTearDownSuiteFuncType</a> a, <a class="code" href="namespacetesting_1_1internal.html#a04786aa10f8b0bf38a5ead94d00475f4">SetUpTearDownSuiteFuncType</a> def) {</div><div class="line"><a name="l06945"></a><span class="lineno"> 6945</span>  <span class="keywordflow">return</span> a == def ? nullptr : a;</div><div class="line"><a name="l06946"></a><span class="lineno"> 6946</span> }</div><div class="line"><a name="l06947"></a><span class="lineno"> 6947</span> </div><div class="line"><a name="l06948"></a><span class="lineno"> 6948</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l06949"></a><span class="lineno"> 6949</span> <span class="comment">// Note that SuiteApiResolver inherits from T because</span></div><div class="line"><a name="l06950"></a><span class="lineno"> 6950</span> <span class="comment">// SetUpTestSuite()/TearDownTestSuite() could be protected. Ths way</span></div><div class="line"><a name="l06951"></a><span class="lineno"> 6951</span> <span class="comment">// SuiteApiResolver can access them.</span></div><div class="line"><a name="l06952"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_suite_api_resolver.html"> 6952</a></span> <span class="keyword">struct </span><a class="code" href="structtesting_1_1internal_1_1_suite_api_resolver.html">SuiteApiResolver</a> : T {</div><div class="line"><a name="l06953"></a><span class="lineno"> 6953</span>  <span class="comment">// testing::Test is only forward declared at this point. So we make it a</span></div><div class="line"><a name="l06954"></a><span class="lineno"> 6954</span>  <span class="comment">// dependend class for the compiler to be OK with it.</span></div><div class="line"><a name="l06955"></a><span class="lineno"> 6955</span>  <span class="keyword">using</span> <a class="code" href="structtesting_1_1internal_1_1_suite_api_resolver.html#a343c36f492a946d302b1cfc930266768">Test</a> =</div><div class="line"><a name="l06956"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_suite_api_resolver.html#a343c36f492a946d302b1cfc930266768"> 6956</a></span>  <span class="keyword">typename</span> std::conditional<sizeof(T) != 0, ::testing::Test, void>::type;</div><div class="line"><a name="l06957"></a><span class="lineno"> 6957</span> </div><div class="line"><a name="l06958"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_suite_api_resolver.html#a460c8a0039577824e9170e6c332b530f"> 6958</a></span>  <span class="keyword">static</span> <a class="code" href="namespacetesting_1_1internal.html#a04786aa10f8b0bf38a5ead94d00475f4">SetUpTearDownSuiteFuncType</a> <a class="code" href="structtesting_1_1internal_1_1_suite_api_resolver.html#a460c8a0039577824e9170e6c332b530f">GetSetUpCaseOrSuite</a>() {</div><div class="line"><a name="l06959"></a><span class="lineno"> 6959</span>  <a class="code" href="namespacetesting_1_1internal.html#a04786aa10f8b0bf38a5ead94d00475f4">SetUpTearDownSuiteFuncType</a> test_case_fp =</div><div class="line"><a name="l06960"></a><span class="lineno"> 6960</span>  <a class="code" href="namespacetesting_1_1internal.html#a9579a78c229ea302caded45d65f77336">GetNotDefaultOrNull</a>(&T::SetUpTestCase, &<a class="code" href="classtesting_1_1_test.html#a5ccbac42fee8c5b00b0bfe89b6c49d79">Test::SetUpTestCase</a>);</div><div class="line"><a name="l06961"></a><span class="lineno"> 6961</span>  <a class="code" href="namespacetesting_1_1internal.html#a04786aa10f8b0bf38a5ead94d00475f4">SetUpTearDownSuiteFuncType</a> test_suite_fp =</div><div class="line"><a name="l06962"></a><span class="lineno"> 6962</span>  <a class="code" href="namespacetesting_1_1internal.html#a9579a78c229ea302caded45d65f77336">GetNotDefaultOrNull</a>(&T::SetUpTestSuite, &<a class="code" href="classtesting_1_1_test.html#ae173b07a0fdd09fc1d417a2bb6cbdd76">Test::SetUpTestSuite</a>);</div><div class="line"><a name="l06963"></a><span class="lineno"> 6963</span> </div><div class="line"><a name="l06964"></a><span class="lineno"> 6964</span>  <a class="code" href="gtest_8h.html#ab54343f0a36dc4cb0ce8a478dd7847b8">GTEST_CHECK_</a>(!test_case_fp || !test_suite_fp)</div><div class="line"><a name="l06965"></a><span class="lineno"> 6965</span>  << <span class="stringliteral">"Test can not provide both SetUpTestSuite and SetUpTestCase, please "</span></div><div class="line"><a name="l06966"></a><span class="lineno"> 6966</span>  <span class="stringliteral">"make sure there is only one present "</span>;</div><div class="line"><a name="l06967"></a><span class="lineno"> 6967</span> </div><div class="line"><a name="l06968"></a><span class="lineno"> 6968</span>  <span class="keywordflow">return</span> test_case_fp != <span class="keyword">nullptr</span> ? test_case_fp : test_suite_fp;</div><div class="line"><a name="l06969"></a><span class="lineno"> 6969</span>  }</div><div class="line"><a name="l06970"></a><span class="lineno"> 6970</span> </div><div class="line"><a name="l06971"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_suite_api_resolver.html#a8495afe4e71c81842119035a71db7e18"> 6971</a></span>  <span class="keyword">static</span> <a class="code" href="namespacetesting_1_1internal.html#a04786aa10f8b0bf38a5ead94d00475f4">SetUpTearDownSuiteFuncType</a> <a class="code" href="structtesting_1_1internal_1_1_suite_api_resolver.html#a8495afe4e71c81842119035a71db7e18">GetTearDownCaseOrSuite</a>() {</div><div class="line"><a name="l06972"></a><span class="lineno"> 6972</span>  <a class="code" href="namespacetesting_1_1internal.html#a04786aa10f8b0bf38a5ead94d00475f4">SetUpTearDownSuiteFuncType</a> test_case_fp =</div><div class="line"><a name="l06973"></a><span class="lineno"> 6973</span>  <a class="code" href="namespacetesting_1_1internal.html#a9579a78c229ea302caded45d65f77336">GetNotDefaultOrNull</a>(&T::TearDownTestCase, &<a class="code" href="classtesting_1_1_test.html#af374706cbaf0ffc460f4fd04e7c150f1">Test::TearDownTestCase</a>);</div><div class="line"><a name="l06974"></a><span class="lineno"> 6974</span>  <a class="code" href="namespacetesting_1_1internal.html#a04786aa10f8b0bf38a5ead94d00475f4">SetUpTearDownSuiteFuncType</a> test_suite_fp =</div><div class="line"><a name="l06975"></a><span class="lineno"> 6975</span>  <a class="code" href="namespacetesting_1_1internal.html#a9579a78c229ea302caded45d65f77336">GetNotDefaultOrNull</a>(&T::TearDownTestSuite, &<a class="code" href="classtesting_1_1_test.html#a7704c8223ba28338a66ca2eaeba66383">Test::TearDownTestSuite</a>);</div><div class="line"><a name="l06976"></a><span class="lineno"> 6976</span> </div><div class="line"><a name="l06977"></a><span class="lineno"> 6977</span>  <a class="code" href="gtest_8h.html#ab54343f0a36dc4cb0ce8a478dd7847b8">GTEST_CHECK_</a>(!test_case_fp || !test_suite_fp)</div><div class="line"><a name="l06978"></a><span class="lineno"> 6978</span>  << <span class="stringliteral">"Test can not provide both TearDownTestSuite and TearDownTestCase,"</span></div><div class="line"><a name="l06979"></a><span class="lineno"> 6979</span>  <span class="stringliteral">" please make sure there is only one present "</span>;</div><div class="line"><a name="l06980"></a><span class="lineno"> 6980</span> </div><div class="line"><a name="l06981"></a><span class="lineno"> 6981</span>  <span class="keywordflow">return</span> test_case_fp != <span class="keyword">nullptr</span> ? test_case_fp : test_suite_fp;</div><div class="line"><a name="l06982"></a><span class="lineno"> 6982</span>  }</div><div class="line"><a name="l06983"></a><span class="lineno"> 6983</span> };</div><div class="line"><a name="l06984"></a><span class="lineno"> 6984</span> </div><div class="line"><a name="l06985"></a><span class="lineno"> 6985</span> <span class="comment">// Creates a new TestInfo object and registers it with Google Test;</span></div><div class="line"><a name="l06986"></a><span class="lineno"> 6986</span> <span class="comment">// returns the created object.</span></div><div class="line"><a name="l06987"></a><span class="lineno"> 6987</span> <span class="comment">//</span></div><div class="line"><a name="l06988"></a><span class="lineno"> 6988</span> <span class="comment">// Arguments:</span></div><div class="line"><a name="l06989"></a><span class="lineno"> 6989</span> <span class="comment">//</span></div><div class="line"><a name="l06990"></a><span class="lineno"> 6990</span> <span class="comment">// test_suite_name: name of the test suite</span></div><div class="line"><a name="l06991"></a><span class="lineno"> 6991</span> <span class="comment">// name: name of the test</span></div><div class="line"><a name="l06992"></a><span class="lineno"> 6992</span> <span class="comment">// type_param the name of the test's type parameter, or NULL if</span></div><div class="line"><a name="l06993"></a><span class="lineno"> 6993</span> <span class="comment">// this is not a typed or a type-parameterized test.</span></div><div class="line"><a name="l06994"></a><span class="lineno"> 6994</span> <span class="comment">// value_param text representation of the test's value parameter,</span></div><div class="line"><a name="l06995"></a><span class="lineno"> 6995</span> <span class="comment">// or NULL if this is not a type-parameterized test.</span></div><div class="line"><a name="l06996"></a><span class="lineno"> 6996</span> <span class="comment">// code_location: code location where the test is defined</span></div><div class="line"><a name="l06997"></a><span class="lineno"> 6997</span> <span class="comment">// fixture_class_id: ID of the test fixture class</span></div><div class="line"><a name="l06998"></a><span class="lineno"> 6998</span> <span class="comment">// set_up_tc: pointer to the function that sets up the test suite</span></div><div class="line"><a name="l06999"></a><span class="lineno"> 6999</span> <span class="comment">// tear_down_tc: pointer to the function that tears down the test suite</span></div><div class="line"><a name="l07000"></a><span class="lineno"> 7000</span> <span class="comment">// factory: pointer to the factory that creates a test object.</span></div><div class="line"><a name="l07001"></a><span class="lineno"> 7001</span> <span class="comment">// The newly created TestInfo instance will assume</span></div><div class="line"><a name="l07002"></a><span class="lineno"> 7002</span> <span class="comment">// ownership of the factory object.</span></div><div class="line"><a name="l07003"></a><span class="lineno"> 7003</span> <a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> <a class="code" href="classtesting_1_1_test_info.html">TestInfo</a>* <a class="code" href="namespacetesting_1_1internal.html#a7ab4072540184e26119ad853f45059f7">MakeAndRegisterTestInfo</a>(</div><div class="line"><a name="l07004"></a><span class="lineno"> 7004</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* test_suite_name, <span class="keyword">const</span> <span class="keywordtype">char</span>* name, <span class="keyword">const</span> <span class="keywordtype">char</span>* type_param,</div><div class="line"><a name="l07005"></a><span class="lineno"> 7005</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* value_param, CodeLocation code_location,</div><div class="line"><a name="l07006"></a><span class="lineno"> 7006</span>  <a class="code" href="namespacetesting_1_1internal.html#ab1114197d3c657d8b7f8e0c5caa12d00">TypeId</a> fixture_class_id, <a class="code" href="namespacetesting_1_1internal.html#a83e4e0732ac6a9dcfe6ee299dc1b9fa2">SetUpTestSuiteFunc</a> set_up_tc,</div><div class="line"><a name="l07007"></a><span class="lineno"> 7007</span>  <a class="code" href="namespacetesting_1_1internal.html#a8257a87aa42cebaa54b0c48a6ae657a5">TearDownTestSuiteFunc</a> tear_down_tc, TestFactoryBase* factory);</div><div class="line"><a name="l07008"></a><span class="lineno"> 7008</span> </div><div class="line"><a name="l07009"></a><span class="lineno"> 7009</span> <span class="comment">// If *pstr starts with the given prefix, modifies *pstr to be right</span></div><div class="line"><a name="l07010"></a><span class="lineno"> 7010</span> <span class="comment">// past the prefix and returns true; otherwise leaves *pstr unchanged</span></div><div class="line"><a name="l07011"></a><span class="lineno"> 7011</span> <span class="comment">// and returns false. None of pstr, *pstr, and prefix can be NULL.</span></div><div class="line"><a name="l07012"></a><span class="lineno"> 7012</span> <a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> <span class="keywordtype">bool</span> <a class="code" href="namespacetesting_1_1internal.html#aac72b20299ad4a99554ce161e1769560">SkipPrefix</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* prefix, <span class="keyword">const</span> <span class="keywordtype">char</span>** pstr);</div><div class="line"><a name="l07013"></a><span class="lineno"> 7013</span> </div><div class="line"><a name="l07014"></a><span class="lineno"> 7014</span> <span class="preprocessor">#if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P</span></div><div class="line"><a name="l07015"></a><span class="lineno"> 7015</span> </div><div class="line"><a name="l07016"></a><span class="lineno"> 7016</span> <a class="code" href="gtest_8h.html#a86994cc68e844d8b82089c70408dfc61">GTEST_DISABLE_MSC_WARNINGS_PUSH_</a>(4251 \</div><div class="line"><a name="l07017"></a><span class="lineno"> 7017</span> <span class="comment">/* class A needs to have dll-interface to be used by clients of class B */</span>)</div><div class="line"><a name="l07018"></a><span class="lineno"> 7018</span> </div><div class="line"><a name="l07019"></a><span class="lineno"> 7019</span> <span class="comment">// State of the definition of a type-parameterized test suite.</span></div><div class="line"><a name="l07020"></a><span class="lineno"> 7020</span> class <a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> TypedTestSuitePState {</div><div class="line"><a name="l07021"></a><span class="lineno"> 7021</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l07022"></a><span class="lineno"> 7022</span>  TypedTestSuitePState() : registered_(false) {}</div><div class="line"><a name="l07023"></a><span class="lineno"> 7023</span> </div><div class="line"><a name="l07024"></a><span class="lineno"> 7024</span>  <span class="comment">// Adds the given test name to defined_test_names_ and return true</span></div><div class="line"><a name="l07025"></a><span class="lineno"> 7025</span>  <span class="comment">// if the test suite hasn't been registered; otherwise aborts the</span></div><div class="line"><a name="l07026"></a><span class="lineno"> 7026</span>  <span class="comment">// program.</span></div><div class="line"><a name="l07027"></a><span class="lineno"> 7027</span>  <span class="keywordtype">bool</span> AddTestName(<span class="keyword">const</span> <span class="keywordtype">char</span>* file, <span class="keywordtype">int</span> line, <span class="keyword">const</span> <span class="keywordtype">char</span>* case_name,</div><div class="line"><a name="l07028"></a><span class="lineno"> 7028</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* test_name) {</div><div class="line"><a name="l07029"></a><span class="lineno"> 7029</span>  <span class="keywordflow">if</span> (registered_) {</div><div class="line"><a name="l07030"></a><span class="lineno"> 7030</span>  fprintf(stderr,</div><div class="line"><a name="l07031"></a><span class="lineno"> 7031</span>  <span class="stringliteral">"%s Test %s must be defined before "</span></div><div class="line"><a name="l07032"></a><span class="lineno"> 7032</span>  <span class="stringliteral">"REGISTER_TYPED_TEST_SUITE_P(%s, ...).\n"</span>,</div><div class="line"><a name="l07033"></a><span class="lineno"> 7033</span>  <a class="code" href="namespacetesting_1_1internal.html#a31b7c3abed4a7c395f42c61e993989f4">FormatFileLocation</a>(file, line).c_str(), test_name, case_name);</div><div class="line"><a name="l07034"></a><span class="lineno"> 7034</span>  fflush(stderr);</div><div class="line"><a name="l07035"></a><span class="lineno"> 7035</span>  <a class="code" href="namespacetesting_1_1internal_1_1posix.html#a69b8278c59359dd6a6f941b4643db9fb">posix::Abort</a>();</div><div class="line"><a name="l07036"></a><span class="lineno"> 7036</span>  }</div><div class="line"><a name="l07037"></a><span class="lineno"> 7037</span>  registered_tests_.insert(</div><div class="line"><a name="l07038"></a><span class="lineno"> 7038</span>  ::std::make_pair(test_name, CodeLocation(file, line)));</div><div class="line"><a name="l07039"></a><span class="lineno"> 7039</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l07040"></a><span class="lineno"> 7040</span>  }</div><div class="line"><a name="l07041"></a><span class="lineno"> 7041</span> </div><div class="line"><a name="l07042"></a><span class="lineno"> 7042</span>  <span class="keywordtype">bool</span> TestExists(<span class="keyword">const</span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a>& test_name)<span class="keyword"> const </span>{</div><div class="line"><a name="l07043"></a><span class="lineno"> 7043</span>  <span class="keywordflow">return</span> registered_tests_.count(test_name) > 0;</div><div class="line"><a name="l07044"></a><span class="lineno"> 7044</span>  }</div><div class="line"><a name="l07045"></a><span class="lineno"> 7045</span> </div><div class="line"><a name="l07046"></a><span class="lineno"> 7046</span>  <span class="keyword">const</span> CodeLocation& GetCodeLocation(<span class="keyword">const</span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a>& test_name)<span class="keyword"> const </span>{</div><div class="line"><a name="l07047"></a><span class="lineno"> 7047</span>  RegisteredTestsMap::const_iterator it = registered_tests_.find(test_name);</div><div class="line"><a name="l07048"></a><span class="lineno"> 7048</span>  <a class="code" href="gtest_8h.html#ab54343f0a36dc4cb0ce8a478dd7847b8">GTEST_CHECK_</a>(it != registered_tests_.end());</div><div class="line"><a name="l07049"></a><span class="lineno"> 7049</span>  <span class="keywordflow">return</span> it->second;</div><div class="line"><a name="l07050"></a><span class="lineno"> 7050</span>  }</div><div class="line"><a name="l07051"></a><span class="lineno"> 7051</span> </div><div class="line"><a name="l07052"></a><span class="lineno"> 7052</span>  <span class="comment">// Verifies that registered_tests match the test names in</span></div><div class="line"><a name="l07053"></a><span class="lineno"> 7053</span>  <span class="comment">// defined_test_names_; returns registered_tests if successful, or</span></div><div class="line"><a name="l07054"></a><span class="lineno"> 7054</span>  <span class="comment">// aborts the program otherwise.</span></div><div class="line"><a name="l07055"></a><span class="lineno"> 7055</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* VerifyRegisteredTestNames(</div><div class="line"><a name="l07056"></a><span class="lineno"> 7056</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* file, <span class="keywordtype">int</span> line, <span class="keyword">const</span> <span class="keywordtype">char</span>* registered_tests);</div><div class="line"><a name="l07057"></a><span class="lineno"> 7057</span> </div><div class="line"><a name="l07058"></a><span class="lineno"> 7058</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l07059"></a><span class="lineno"> 7059</span>  typedef ::std::map<std::string, CodeLocation> RegisteredTestsMap;</div><div class="line"><a name="l07060"></a><span class="lineno"> 7060</span> </div><div class="line"><a name="l07061"></a><span class="lineno"> 7061</span>  <span class="keywordtype">bool</span> registered_;</div><div class="line"><a name="l07062"></a><span class="lineno"> 7062</span>  RegisteredTestsMap registered_tests_;</div><div class="line"><a name="l07063"></a><span class="lineno"> 7063</span> };</div><div class="line"><a name="l07064"></a><span class="lineno"> 7064</span> </div><div class="line"><a name="l07065"></a><span class="lineno"> 7065</span> <span class="comment">// Legacy API is deprecated but still available</span></div><div class="line"><a name="l07066"></a><span class="lineno"> 7066</span> <span class="preprocessor">#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_</span></div><div class="line"><a name="l07067"></a><span class="lineno"> 7067</span> <span class="keyword">using</span> TypedTestCasePState = TypedTestSuitePState;</div><div class="line"><a name="l07068"></a><span class="lineno"> 7068</span> <span class="preprocessor">#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_</span></div><div class="line"><a name="l07069"></a><span class="lineno"> 7069</span> </div><div class="line"><a name="l07070"></a><span class="lineno"> 7070</span> <a class="code" href="gtest_8h.html#aebf8277c9069c1e124f9a5bbe2948061">GTEST_DISABLE_MSC_WARNINGS_POP_</a>() <span class="comment">// 4251</span></div><div class="line"><a name="l07071"></a><span class="lineno"> 7071</span> </div><div class="line"><a name="l07072"></a><span class="lineno"> 7072</span> <span class="comment">// Skips to the first non-space char after the first comma in 'str';</span></div><div class="line"><a name="l07073"></a><span class="lineno"> 7073</span> <span class="comment">// returns NULL if no comma is found in 'str'.</span></div><div class="line"><a name="l07074"></a><span class="lineno"> 7074</span> inline const <span class="keywordtype">char</span>* SkipComma(const <span class="keywordtype">char</span>* str) {</div><div class="line"><a name="l07075"></a><span class="lineno"> 7075</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* comma = strchr(str, <span class="charliteral">','</span>);</div><div class="line"><a name="l07076"></a><span class="lineno"> 7076</span>  <span class="keywordflow">if</span> (comma == <span class="keyword">nullptr</span>) {</div><div class="line"><a name="l07077"></a><span class="lineno"> 7077</span>  <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div><div class="line"><a name="l07078"></a><span class="lineno"> 7078</span>  }</div><div class="line"><a name="l07079"></a><span class="lineno"> 7079</span>  <span class="keywordflow">while</span> (<a class="code" href="namespacetesting_1_1internal.html#af429e04f70f9c10f6aa76a5d1ccd389f">IsSpace</a>(*(++comma))) {}</div><div class="line"><a name="l07080"></a><span class="lineno"> 7080</span>  <span class="keywordflow">return</span> comma;</div><div class="line"><a name="l07081"></a><span class="lineno"> 7081</span> }</div><div class="line"><a name="l07082"></a><span class="lineno"> 7082</span> </div><div class="line"><a name="l07083"></a><span class="lineno"> 7083</span> <span class="comment">// Returns the prefix of 'str' before the first comma in it; returns</span></div><div class="line"><a name="l07084"></a><span class="lineno"> 7084</span> <span class="comment">// the entire string if it contains no comma.</span></div><div class="line"><a name="l07085"></a><span class="lineno"> 7085</span> <span class="keyword">inline</span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a> GetPrefixUntilComma(<span class="keyword">const</span> <span class="keywordtype">char</span>* str) {</div><div class="line"><a name="l07086"></a><span class="lineno"> 7086</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* comma = strchr(str, <span class="charliteral">','</span>);</div><div class="line"><a name="l07087"></a><span class="lineno"> 7087</span>  <span class="keywordflow">return</span> comma == <span class="keyword">nullptr</span> ? str : <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a>(str, comma);</div><div class="line"><a name="l07088"></a><span class="lineno"> 7088</span> }</div><div class="line"><a name="l07089"></a><span class="lineno"> 7089</span> </div><div class="line"><a name="l07090"></a><span class="lineno"> 7090</span> <span class="comment">// Splits a given string on a given delimiter, populating a given</span></div><div class="line"><a name="l07091"></a><span class="lineno"> 7091</span> <span class="comment">// vector with the fields.</span></div><div class="line"><a name="l07092"></a><span class="lineno"> 7092</span> <span class="keywordtype">void</span> SplitString(<a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">const ::std::string</a>& str, <span class="keywordtype">char</span> delimiter,</div><div class="line"><a name="l07093"></a><span class="lineno"> 7093</span>  ::std::vector< ::std::string>* dest);</div><div class="line"><a name="l07094"></a><span class="lineno"> 7094</span> </div><div class="line"><a name="l07095"></a><span class="lineno"> 7095</span> <span class="comment">// The default argument to the template below for the case when the user does</span></div><div class="line"><a name="l07096"></a><span class="lineno"> 7096</span> <span class="comment">// not provide a name generator.</span></div><div class="line"><a name="l07097"></a><span class="lineno"> 7097</span> <span class="keyword">struct </span>DefaultNameGenerator {</div><div class="line"><a name="l07098"></a><span class="lineno"> 7098</span>  <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l07099"></a><span class="lineno"> 7099</span>  <span class="keyword">static</span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a> GetName(<span class="keywordtype">int</span> i) {</div><div class="line"><a name="l07100"></a><span class="lineno"> 7100</span>  <span class="keywordflow">return</span> <a class="code" href="namespacetesting_1_1internal.html#aad4beed95d0846e6ffc5da0978ef3bb9">StreamableToString</a>(i);</div><div class="line"><a name="l07101"></a><span class="lineno"> 7101</span>  }</div><div class="line"><a name="l07102"></a><span class="lineno"> 7102</span> };</div><div class="line"><a name="l07103"></a><span class="lineno"> 7103</span> </div><div class="line"><a name="l07104"></a><span class="lineno"> 7104</span> <span class="keyword">template</span> <<span class="keyword">typename</span> Prov<span class="keywordtype">id</span>ed = DefaultNameGenerator></div><div class="line"><a name="l07105"></a><span class="lineno"> 7105</span> <span class="keyword">struct </span>NameGeneratorSelector {</div><div class="line"><a name="l07106"></a><span class="lineno"> 7106</span>  <span class="keyword">typedef</span> Provided type;</div><div class="line"><a name="l07107"></a><span class="lineno"> 7107</span> };</div><div class="line"><a name="l07108"></a><span class="lineno"> 7108</span> </div><div class="line"><a name="l07109"></a><span class="lineno"> 7109</span> <span class="keyword">template</span> <<span class="keyword">typename</span> NameGenerator></div><div class="line"><a name="l07110"></a><span class="lineno"> 7110</span> <span class="keywordtype">void</span> GenerateNamesRecursively(Types0, std::vector<std::string>*, <span class="keywordtype">int</span>) {}</div><div class="line"><a name="l07111"></a><span class="lineno"> 7111</span> </div><div class="line"><a name="l07112"></a><span class="lineno"> 7112</span> <span class="keyword">template</span> <<span class="keyword">typename</span> NameGenerator, <span class="keyword">typename</span> Types></div><div class="line"><a name="l07113"></a><span class="lineno"> 7113</span> <span class="keywordtype">void</span> GenerateNamesRecursively(Types, std::vector<std::string>* result, <span class="keywordtype">int</span> i) {</div><div class="line"><a name="l07114"></a><span class="lineno"> 7114</span>  result->push_back(NameGenerator::template GetName<typename Types::Head>(i));</div><div class="line"><a name="l07115"></a><span class="lineno"> 7115</span>  GenerateNamesRecursively<NameGenerator>(<span class="keyword">typename</span> Types::Tail(), result,</div><div class="line"><a name="l07116"></a><span class="lineno"> 7116</span>  i + 1);</div><div class="line"><a name="l07117"></a><span class="lineno"> 7117</span> }</div><div class="line"><a name="l07118"></a><span class="lineno"> 7118</span> </div><div class="line"><a name="l07119"></a><span class="lineno"> 7119</span> <span class="keyword">template</span> <<span class="keyword">typename</span> NameGenerator, <span class="keyword">typename</span> Types></div><div class="line"><a name="l07120"></a><span class="lineno"> 7120</span> std::vector<std::string> GenerateNames() {</div><div class="line"><a name="l07121"></a><span class="lineno"> 7121</span>  std::vector<std::string> result;</div><div class="line"><a name="l07122"></a><span class="lineno"> 7122</span>  GenerateNamesRecursively<NameGenerator>(Types(), &result, 0);</div><div class="line"><a name="l07123"></a><span class="lineno"> 7123</span>  <span class="keywordflow">return</span> result;</div><div class="line"><a name="l07124"></a><span class="lineno"> 7124</span> }</div><div class="line"><a name="l07125"></a><span class="lineno"> 7125</span> </div><div class="line"><a name="l07126"></a><span class="lineno"> 7126</span> <span class="comment">// TypeParameterizedTest<Fixture, TestSel, Types>::Register()</span></div><div class="line"><a name="l07127"></a><span class="lineno"> 7127</span> <span class="comment">// registers a list of type-parameterized tests with Google Test. The</span></div><div class="line"><a name="l07128"></a><span class="lineno"> 7128</span> <span class="comment">// return value is insignificant - we just need to return something</span></div><div class="line"><a name="l07129"></a><span class="lineno"> 7129</span> <span class="comment">// such that we can call this function in a namespace scope.</span></div><div class="line"><a name="l07130"></a><span class="lineno"> 7130</span> <span class="comment">//</span></div><div class="line"><a name="l07131"></a><span class="lineno"> 7131</span> <span class="comment">// Implementation note: The GTEST_TEMPLATE_ macro declares a template</span></div><div class="line"><a name="l07132"></a><span class="lineno"> 7132</span> <span class="comment">// template parameter. It's defined in gtest-type-util.h.</span></div><div class="line"><a name="l07133"></a><span class="lineno"> 7133</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ Fixture, <span class="keyword">class</span> TestSel, <span class="keyword">typename</span> Types></div><div class="line"><a name="l07134"></a><span class="lineno"> 7134</span> <span class="keyword">class </span>TypeParameterizedTest {</div><div class="line"><a name="l07135"></a><span class="lineno"> 7135</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l07136"></a><span class="lineno"> 7136</span>  <span class="comment">// 'index' is the index of the test in the type list 'Types'</span></div><div class="line"><a name="l07137"></a><span class="lineno"> 7137</span>  <span class="comment">// specified in INSTANTIATE_TYPED_TEST_SUITE_P(Prefix, TestSuite,</span></div><div class="line"><a name="l07138"></a><span class="lineno"> 7138</span>  <span class="comment">// Types). Valid values for 'index' are [0, N - 1] where N is the</span></div><div class="line"><a name="l07139"></a><span class="lineno"> 7139</span>  <span class="comment">// length of Types.</span></div><div class="line"><a name="l07140"></a><span class="lineno"> 7140</span>  <span class="keyword">static</span> <span class="keywordtype">bool</span> Register(<span class="keyword">const</span> <span class="keywordtype">char</span>* prefix, <span class="keyword">const</span> CodeLocation& code_location,</div><div class="line"><a name="l07141"></a><span class="lineno"> 7141</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* case_name, <span class="keyword">const</span> <span class="keywordtype">char</span>* test_names, <span class="keywordtype">int</span> index,</div><div class="line"><a name="l07142"></a><span class="lineno"> 7142</span>  <span class="keyword">const</span> std::vector<std::string>& type_names =</div><div class="line"><a name="l07143"></a><span class="lineno"> 7143</span>  GenerateNames<DefaultNameGenerator, Types>()) {</div><div class="line"><a name="l07144"></a><span class="lineno"> 7144</span>  <span class="keyword">typedef</span> <span class="keyword">typename</span> Types::Head Type;</div><div class="line"><a name="l07145"></a><span class="lineno"> 7145</span>  <span class="keyword">typedef</span> Fixture<Type> FixtureClass;</div><div class="line"><a name="l07146"></a><span class="lineno"> 7146</span>  <span class="keyword">typedef</span> <span class="keyword">typename</span> GTEST_BIND_(TestSel, Type) TestClass;</div><div class="line"><a name="l07147"></a><span class="lineno"> 7147</span> </div><div class="line"><a name="l07148"></a><span class="lineno"> 7148</span>  <span class="comment">// First, registers the first type-parameterized test in the type</span></div><div class="line"><a name="l07149"></a><span class="lineno"> 7149</span>  <span class="comment">// list.</span></div><div class="line"><a name="l07150"></a><span class="lineno"> 7150</span>  <a class="code" href="namespacetesting_1_1internal.html#a7ab4072540184e26119ad853f45059f7">MakeAndRegisterTestInfo</a>(</div><div class="line"><a name="l07151"></a><span class="lineno"> 7151</span>  (<a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a>(prefix) + (prefix[0] == <span class="charliteral">'\0'</span> ? <span class="stringliteral">""</span> : <span class="stringliteral">"/"</span>) + case_name +</div><div class="line"><a name="l07152"></a><span class="lineno"> 7152</span>  <span class="stringliteral">"/"</span> + type_names[index])</div><div class="line"><a name="l07153"></a><span class="lineno"> 7153</span>  .c_str(),</div><div class="line"><a name="l07154"></a><span class="lineno"> 7154</span>  <a class="code" href="namespacetesting_1_1internal.html#aa6afda12e567c353e2e9b9c2e8cae14f">StripTrailingSpaces</a>(GetPrefixUntilComma(test_names)).c_str(),</div><div class="line"><a name="l07155"></a><span class="lineno"> 7155</span>  GetTypeName<Type>().c_str(),</div><div class="line"><a name="l07156"></a><span class="lineno"> 7156</span>  <span class="keyword">nullptr</span>, <span class="comment">// No value parameter.</span></div><div class="line"><a name="l07157"></a><span class="lineno"> 7157</span>  code_location, GetTypeId<FixtureClass>(),</div><div class="line"><a name="l07158"></a><span class="lineno"> 7158</span>  <a class="code" href="structtesting_1_1internal_1_1_suite_api_resolver.html#a460c8a0039577824e9170e6c332b530f">SuiteApiResolver<TestClass>::GetSetUpCaseOrSuite</a>(),</div><div class="line"><a name="l07159"></a><span class="lineno"> 7159</span>  <a class="code" href="structtesting_1_1internal_1_1_suite_api_resolver.html#a8495afe4e71c81842119035a71db7e18">SuiteApiResolver<TestClass>::GetTearDownCaseOrSuite</a>(),</div><div class="line"><a name="l07160"></a><span class="lineno"> 7160</span>  <span class="keyword">new</span> TestFactoryImpl<TestClass>);</div><div class="line"><a name="l07161"></a><span class="lineno"> 7161</span> </div><div class="line"><a name="l07162"></a><span class="lineno"> 7162</span>  <span class="comment">// Next, recurses (at compile time) with the tail of the type list.</span></div><div class="line"><a name="l07163"></a><span class="lineno"> 7163</span>  <span class="keywordflow">return</span> TypeParameterizedTest<Fixture, TestSel,</div><div class="line"><a name="l07164"></a><span class="lineno"> 7164</span>  <span class="keyword">typename</span> Types::Tail>::Register(prefix,</div><div class="line"><a name="l07165"></a><span class="lineno"> 7165</span>  code_location,</div><div class="line"><a name="l07166"></a><span class="lineno"> 7166</span>  case_name,</div><div class="line"><a name="l07167"></a><span class="lineno"> 7167</span>  test_names,</div><div class="line"><a name="l07168"></a><span class="lineno"> 7168</span>  index + 1,</div><div class="line"><a name="l07169"></a><span class="lineno"> 7169</span>  type_names);</div><div class="line"><a name="l07170"></a><span class="lineno"> 7170</span>  }</div><div class="line"><a name="l07171"></a><span class="lineno"> 7171</span> };</div><div class="line"><a name="l07172"></a><span class="lineno"> 7172</span> </div><div class="line"><a name="l07173"></a><span class="lineno"> 7173</span> <span class="comment">// The base case for the compile time recursion.</span></div><div class="line"><a name="l07174"></a><span class="lineno"> 7174</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ Fixture, <span class="keyword">class</span> TestSel></div><div class="line"><a name="l07175"></a><span class="lineno"> 7175</span> <span class="keyword">class </span>TypeParameterizedTest<Fixture, TestSel, Types0> {</div><div class="line"><a name="l07176"></a><span class="lineno"> 7176</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l07177"></a><span class="lineno"> 7177</span>  <span class="keyword">static</span> <span class="keywordtype">bool</span> Register(<span class="keyword">const</span> <span class="keywordtype">char</span>* <span class="comment">/*prefix*/</span>, <span class="keyword">const</span> CodeLocation&,</div><div class="line"><a name="l07178"></a><span class="lineno"> 7178</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* <span class="comment">/*case_name*/</span>, <span class="keyword">const</span> <span class="keywordtype">char</span>* <span class="comment">/*test_names*/</span>,</div><div class="line"><a name="l07179"></a><span class="lineno"> 7179</span>  <span class="keywordtype">int</span> <span class="comment">/*index*/</span>,</div><div class="line"><a name="l07180"></a><span class="lineno"> 7180</span>  <span class="keyword">const</span> std::vector<std::string>& =</div><div class="line"><a name="l07181"></a><span class="lineno"> 7181</span>  std::vector<std::string>() <span class="comment">/*type_names*/</span>) {</div><div class="line"><a name="l07182"></a><span class="lineno"> 7182</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l07183"></a><span class="lineno"> 7183</span>  }</div><div class="line"><a name="l07184"></a><span class="lineno"> 7184</span> };</div><div class="line"><a name="l07185"></a><span class="lineno"> 7185</span> </div><div class="line"><a name="l07186"></a><span class="lineno"> 7186</span> <span class="comment">// TypeParameterizedTestSuite<Fixture, Tests, Types>::Register()</span></div><div class="line"><a name="l07187"></a><span class="lineno"> 7187</span> <span class="comment">// registers *all combinations* of 'Tests' and 'Types' with Google</span></div><div class="line"><a name="l07188"></a><span class="lineno"> 7188</span> <span class="comment">// Test. The return value is insignificant - we just need to return</span></div><div class="line"><a name="l07189"></a><span class="lineno"> 7189</span> <span class="comment">// something such that we can call this function in a namespace scope.</span></div><div class="line"><a name="l07190"></a><span class="lineno"> 7190</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ Fixture, <span class="keyword">typename</span> Tests, <span class="keyword">typename</span> Types></div><div class="line"><a name="l07191"></a><span class="lineno"> 7191</span> <span class="keyword">class </span>TypeParameterizedTestSuite {</div><div class="line"><a name="l07192"></a><span class="lineno"> 7192</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l07193"></a><span class="lineno"> 7193</span>  <span class="keyword">static</span> <span class="keywordtype">bool</span> Register(<span class="keyword">const</span> <span class="keywordtype">char</span>* prefix, CodeLocation code_location,</div><div class="line"><a name="l07194"></a><span class="lineno"> 7194</span>  <span class="keyword">const</span> TypedTestSuitePState* state, <span class="keyword">const</span> <span class="keywordtype">char</span>* case_name,</div><div class="line"><a name="l07195"></a><span class="lineno"> 7195</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* test_names,</div><div class="line"><a name="l07196"></a><span class="lineno"> 7196</span>  <span class="keyword">const</span> std::vector<std::string>& type_names =</div><div class="line"><a name="l07197"></a><span class="lineno"> 7197</span>  GenerateNames<DefaultNameGenerator, Types>()) {</div><div class="line"><a name="l07198"></a><span class="lineno"> 7198</span>  <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a> test_name = <a class="code" href="namespacetesting_1_1internal.html#aa6afda12e567c353e2e9b9c2e8cae14f">StripTrailingSpaces</a>(</div><div class="line"><a name="l07199"></a><span class="lineno"> 7199</span>  GetPrefixUntilComma(test_names));</div><div class="line"><a name="l07200"></a><span class="lineno"> 7200</span>  <span class="keywordflow">if</span> (!state->TestExists(test_name)) {</div><div class="line"><a name="l07201"></a><span class="lineno"> 7201</span>  fprintf(stderr, <span class="stringliteral">"Failed to get code location for test %s.%s at %s."</span>,</div><div class="line"><a name="l07202"></a><span class="lineno"> 7202</span>  case_name, test_name.c_str(),</div><div class="line"><a name="l07203"></a><span class="lineno"> 7203</span>  <a class="code" href="namespacetesting_1_1internal.html#a31b7c3abed4a7c395f42c61e993989f4">FormatFileLocation</a>(code_location.file.c_str(),</div><div class="line"><a name="l07204"></a><span class="lineno"> 7204</span>  code_location.line).c_str());</div><div class="line"><a name="l07205"></a><span class="lineno"> 7205</span>  fflush(stderr);</div><div class="line"><a name="l07206"></a><span class="lineno"> 7206</span>  <a class="code" href="namespacetesting_1_1internal_1_1posix.html#a69b8278c59359dd6a6f941b4643db9fb">posix::Abort</a>();</div><div class="line"><a name="l07207"></a><span class="lineno"> 7207</span>  }</div><div class="line"><a name="l07208"></a><span class="lineno"> 7208</span>  <span class="keyword">const</span> CodeLocation& test_location = state->GetCodeLocation(test_name);</div><div class="line"><a name="l07209"></a><span class="lineno"> 7209</span> </div><div class="line"><a name="l07210"></a><span class="lineno"> 7210</span>  <span class="keyword">typedef</span> <span class="keyword">typename</span> Tests::Head Head;</div><div class="line"><a name="l07211"></a><span class="lineno"> 7211</span> </div><div class="line"><a name="l07212"></a><span class="lineno"> 7212</span>  <span class="comment">// First, register the first test in 'Test' for each type in 'Types'.</span></div><div class="line"><a name="l07213"></a><span class="lineno"> 7213</span>  TypeParameterizedTest<Fixture, Head, Types>::Register(</div><div class="line"><a name="l07214"></a><span class="lineno"> 7214</span>  prefix, test_location, case_name, test_names, 0, type_names);</div><div class="line"><a name="l07215"></a><span class="lineno"> 7215</span> </div><div class="line"><a name="l07216"></a><span class="lineno"> 7216</span>  <span class="comment">// Next, recurses (at compile time) with the tail of the test list.</span></div><div class="line"><a name="l07217"></a><span class="lineno"> 7217</span>  <span class="keywordflow">return</span> TypeParameterizedTestSuite<Fixture, <span class="keyword">typename</span> Tests::Tail,</div><div class="line"><a name="l07218"></a><span class="lineno"> 7218</span>  Types>::Register(prefix, code_location,</div><div class="line"><a name="l07219"></a><span class="lineno"> 7219</span>  state, case_name,</div><div class="line"><a name="l07220"></a><span class="lineno"> 7220</span>  SkipComma(test_names),</div><div class="line"><a name="l07221"></a><span class="lineno"> 7221</span>  type_names);</div><div class="line"><a name="l07222"></a><span class="lineno"> 7222</span>  }</div><div class="line"><a name="l07223"></a><span class="lineno"> 7223</span> };</div><div class="line"><a name="l07224"></a><span class="lineno"> 7224</span> </div><div class="line"><a name="l07225"></a><span class="lineno"> 7225</span> <span class="comment">// The base case for the compile time recursion.</span></div><div class="line"><a name="l07226"></a><span class="lineno"> 7226</span> <span class="keyword">template</span> <GTEST_TEMPLATE_ Fixture, <span class="keyword">typename</span> Types></div><div class="line"><a name="l07227"></a><span class="lineno"> 7227</span> <span class="keyword">class </span>TypeParameterizedTestSuite<Fixture, Templates0, Types> {</div><div class="line"><a name="l07228"></a><span class="lineno"> 7228</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l07229"></a><span class="lineno"> 7229</span>  <span class="keyword">static</span> <span class="keywordtype">bool</span> Register(<span class="keyword">const</span> <span class="keywordtype">char</span>* <span class="comment">/*prefix*/</span>, <span class="keyword">const</span> CodeLocation&,</div><div class="line"><a name="l07230"></a><span class="lineno"> 7230</span>  <span class="keyword">const</span> TypedTestSuitePState* <span class="comment">/*state*/</span>,</div><div class="line"><a name="l07231"></a><span class="lineno"> 7231</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* <span class="comment">/*case_name*/</span>, <span class="keyword">const</span> <span class="keywordtype">char</span>* <span class="comment">/*test_names*/</span>,</div><div class="line"><a name="l07232"></a><span class="lineno"> 7232</span>  <span class="keyword">const</span> std::vector<std::string>& =</div><div class="line"><a name="l07233"></a><span class="lineno"> 7233</span>  std::vector<std::string>() <span class="comment">/*type_names*/</span>) {</div><div class="line"><a name="l07234"></a><span class="lineno"> 7234</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l07235"></a><span class="lineno"> 7235</span>  }</div><div class="line"><a name="l07236"></a><span class="lineno"> 7236</span> };</div><div class="line"><a name="l07237"></a><span class="lineno"> 7237</span> </div><div class="line"><a name="l07238"></a><span class="lineno"> 7238</span> <span class="preprocessor">#endif // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P</span></div><div class="line"><a name="l07239"></a><span class="lineno"> 7239</span> </div><div class="line"><a name="l07240"></a><span class="lineno"> 7240</span> <span class="comment">// Returns the current OS stack trace as an std::string.</span></div><div class="line"><a name="l07241"></a><span class="lineno"> 7241</span> <span class="comment">//</span></div><div class="line"><a name="l07242"></a><span class="lineno"> 7242</span> <span class="comment">// The maximum number of stack frames to be included is specified by</span></div><div class="line"><a name="l07243"></a><span class="lineno"> 7243</span> <span class="comment">// the gtest_stack_trace_depth flag. The skip_count parameter</span></div><div class="line"><a name="l07244"></a><span class="lineno"> 7244</span> <span class="comment">// specifies the number of top frames to be skipped, which doesn't</span></div><div class="line"><a name="l07245"></a><span class="lineno"> 7245</span> <span class="comment">// count against the number of frames to be included.</span></div><div class="line"><a name="l07246"></a><span class="lineno"> 7246</span> <span class="comment">//</span></div><div class="line"><a name="l07247"></a><span class="lineno"> 7247</span> <span class="comment">// For example, if Foo() calls Bar(), which in turn calls</span></div><div class="line"><a name="l07248"></a><span class="lineno"> 7248</span> <span class="comment">// GetCurrentOsStackTraceExceptTop(..., 1), Foo() will be included in</span></div><div class="line"><a name="l07249"></a><span class="lineno"> 7249</span> <span class="comment">// the trace but Bar() and GetCurrentOsStackTraceExceptTop() won't.</span></div><div class="line"><a name="l07250"></a><span class="lineno"> 7250</span> <a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a> <a class="code" href="namespacetesting_1_1internal.html#ae7ae495d3207e26968dfbd537c5e6dee">GetCurrentOsStackTraceExceptTop</a>(</div><div class="line"><a name="l07251"></a><span class="lineno"> 7251</span>  UnitTest* unit_test, <span class="keywordtype">int</span> skip_count);</div><div class="line"><a name="l07252"></a><span class="lineno"> 7252</span> </div><div class="line"><a name="l07253"></a><span class="lineno"> 7253</span> <span class="comment">// Helpers for suppressing warnings on unreachable code or constant</span></div><div class="line"><a name="l07254"></a><span class="lineno"> 7254</span> <span class="comment">// condition.</span></div><div class="line"><a name="l07255"></a><span class="lineno"> 7255</span> </div><div class="line"><a name="l07256"></a><span class="lineno"> 7256</span> <span class="comment">// Always returns true.</span></div><div class="line"><a name="l07257"></a><span class="lineno"> 7257</span> <a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> <span class="keywordtype">bool</span> <a class="code" href="namespacetesting_1_1internal.html#a4d46f09c3bfe68700b7f728d2cc3782f">AlwaysTrue</a>();</div><div class="line"><a name="l07258"></a><span class="lineno"> 7258</span> </div><div class="line"><a name="l07259"></a><span class="lineno"> 7259</span> <span class="comment">// Always returns false.</span></div><div class="line"><a name="l07260"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#a4b24c851ab13569b1b15b3d259b60d2e"> 7260</a></span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="namespacetesting_1_1internal.html#a4b24c851ab13569b1b15b3d259b60d2e">AlwaysFalse</a>() { <span class="keywordflow">return</span> !<a class="code" href="namespacetesting_1_1internal.html#a4d46f09c3bfe68700b7f728d2cc3782f">AlwaysTrue</a>(); }</div><div class="line"><a name="l07261"></a><span class="lineno"> 7261</span> </div><div class="line"><a name="l07262"></a><span class="lineno"> 7262</span> <span class="comment">// Helper for suppressing false warning from Clang on a const char*</span></div><div class="line"><a name="l07263"></a><span class="lineno"> 7263</span> <span class="comment">// variable declared in a conditional expression always being NULL in</span></div><div class="line"><a name="l07264"></a><span class="lineno"> 7264</span> <span class="comment">// the else branch.</span></div><div class="line"><a name="l07265"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_const_char_ptr.html"> 7265</a></span> <span class="keyword">struct </span><a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> <a class="code" href="structtesting_1_1internal_1_1_const_char_ptr.html">ConstCharPtr</a> {</div><div class="line"><a name="l07266"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_const_char_ptr.html#ae94f6453fa679d815994eccc63062907"> 7266</a></span>  <a class="code" href="structtesting_1_1internal_1_1_const_char_ptr.html#ae94f6453fa679d815994eccc63062907">ConstCharPtr</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* str) : value(str) {}</div><div class="line"><a name="l07267"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_const_char_ptr.html#a85c8174b5d4db8fe96863509ba767b27"> 7267</a></span>  <span class="keyword">operator</span> bool()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <span class="keyword">true</span>; }</div><div class="line"><a name="l07268"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_const_char_ptr.html#adba40d23d5986904b605946f643cf26e"> 7268</a></span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="structtesting_1_1internal_1_1_const_char_ptr.html#adba40d23d5986904b605946f643cf26e">value</a>;</div><div class="line"><a name="l07269"></a><span class="lineno"> 7269</span> };</div><div class="line"><a name="l07270"></a><span class="lineno"> 7270</span> </div><div class="line"><a name="l07271"></a><span class="lineno"> 7271</span> <span class="comment">// A simple Linear Congruential Generator for generating random</span></div><div class="line"><a name="l07272"></a><span class="lineno"> 7272</span> <span class="comment">// numbers with a uniform distribution. Unlike rand() and srand(), it</span></div><div class="line"><a name="l07273"></a><span class="lineno"> 7273</span> <span class="comment">// doesn't use global state (and therefore can't interfere with user</span></div><div class="line"><a name="l07274"></a><span class="lineno"> 7274</span> <span class="comment">// code). Unlike rand_r(), it's portable. An LCG isn't very random,</span></div><div class="line"><a name="l07275"></a><span class="lineno"> 7275</span> <span class="comment">// but it's good enough for our purposes.</span></div><div class="line"><a name="l07276"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_random.html"> 7276</a></span> <span class="keyword">class </span><a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> <a class="code" href="classtesting_1_1internal_1_1_random.html">Random</a> {</div><div class="line"><a name="l07277"></a><span class="lineno"> 7277</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l07278"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_random.html#a36d72dd7063d0b5338f229e75382fdd2"> 7278</a></span>  <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="namespacetesting_1_1internal.html#a40d4fffcd2bf56f18b1c380615aa85e3">UInt32</a> kMaxRange = 1u << 31;</div><div class="line"><a name="l07279"></a><span class="lineno"> 7279</span> </div><div class="line"><a name="l07280"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_random.html#a6e112be5e7cce00551f6383025f69460"> 7280</a></span>  <span class="keyword">explicit</span> <a class="code" href="classtesting_1_1internal_1_1_random.html#a6e112be5e7cce00551f6383025f69460">Random</a>(<a class="code" href="namespacetesting_1_1internal.html#a40d4fffcd2bf56f18b1c380615aa85e3">UInt32</a> seed) : state_(seed) {}</div><div class="line"><a name="l07281"></a><span class="lineno"> 7281</span> </div><div class="line"><a name="l07282"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_random.html#adf2f24199318a46f885c78f50d89a69e"> 7282</a></span>  <span class="keywordtype">void</span> <a class="code" href="classtesting_1_1internal_1_1_random.html#adf2f24199318a46f885c78f50d89a69e">Reseed</a>(<a class="code" href="namespacetesting_1_1internal.html#a40d4fffcd2bf56f18b1c380615aa85e3">UInt32</a> seed) { state_ = seed; }</div><div class="line"><a name="l07283"></a><span class="lineno"> 7283</span> </div><div class="line"><a name="l07284"></a><span class="lineno"> 7284</span>  <span class="comment">// Generates a random number from [0, range). Crashes if 'range' is</span></div><div class="line"><a name="l07285"></a><span class="lineno"> 7285</span>  <span class="comment">// 0 or greater than kMaxRange.</span></div><div class="line"><a name="l07286"></a><span class="lineno"> 7286</span>  <a class="code" href="namespacetesting_1_1internal.html#a40d4fffcd2bf56f18b1c380615aa85e3">UInt32</a> Generate(<a class="code" href="namespacetesting_1_1internal.html#a40d4fffcd2bf56f18b1c380615aa85e3">UInt32</a> range);</div><div class="line"><a name="l07287"></a><span class="lineno"> 7287</span> </div><div class="line"><a name="l07288"></a><span class="lineno"> 7288</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l07289"></a><span class="lineno"> 7289</span>  <a class="code" href="namespacetesting_1_1internal.html#a40d4fffcd2bf56f18b1c380615aa85e3">UInt32</a> state_;</div><div class="line"><a name="l07290"></a><span class="lineno"> 7290</span>  <a class="code" href="gtest_8h.html#aed8c1888c32b588b0681e88b95031e29">GTEST_DISALLOW_COPY_AND_ASSIGN_</a>(<a class="code" href="classtesting_1_1internal_1_1_random.html">Random</a>);</div><div class="line"><a name="l07291"></a><span class="lineno"> 7291</span> };</div><div class="line"><a name="l07292"></a><span class="lineno"> 7292</span> </div><div class="line"><a name="l07293"></a><span class="lineno"> 7293</span> <span class="comment">// Defining a variable of type CompileAssertTypesEqual<T1, T2> will cause a</span></div><div class="line"><a name="l07294"></a><span class="lineno"> 7294</span> <span class="comment">// compiler error iff T1 and T2 are different types.</span></div><div class="line"><a name="l07295"></a><span class="lineno"> 7295</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2></div><div class="line"><a name="l07296"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_compile_assert_types_equal.html"> 7296</a></span> <span class="keyword">struct </span><a class="code" href="structtesting_1_1internal_1_1_compile_assert_types_equal.html">CompileAssertTypesEqual</a>;</div><div class="line"><a name="l07297"></a><span class="lineno"> 7297</span> </div><div class="line"><a name="l07298"></a><span class="lineno"> 7298</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l07299"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_compile_assert_types_equal_3_01_t_00_01_t_01_4.html"> 7299</a></span> <span class="keyword">struct </span><a class="code" href="structtesting_1_1internal_1_1_compile_assert_types_equal.html">CompileAssertTypesEqual</a><T, T> {</div><div class="line"><a name="l07300"></a><span class="lineno"> 7300</span> };</div><div class="line"><a name="l07301"></a><span class="lineno"> 7301</span> </div><div class="line"><a name="l07302"></a><span class="lineno"> 7302</span> <span class="comment">// Removes the reference from a type if it is a reference type,</span></div><div class="line"><a name="l07303"></a><span class="lineno"> 7303</span> <span class="comment">// otherwise leaves it unchanged. This is the same as</span></div><div class="line"><a name="l07304"></a><span class="lineno"> 7304</span> <span class="comment">// tr1::remove_reference, which is not widely available yet.</span></div><div class="line"><a name="l07305"></a><span class="lineno"> 7305</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l07306"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_remove_reference.html#a9ca4f6499579225f7986b789ee4b2895"> 7306</a></span> <span class="keyword">struct </span><a class="code" href="structtesting_1_1internal_1_1_remove_reference.html">RemoveReference</a> { <span class="keyword">typedef</span> T <a class="code" href="structtesting_1_1internal_1_1_remove_reference.html#a9ca4f6499579225f7986b789ee4b2895">type</a>; }; <span class="comment">// NOLINT</span></div><div class="line"><a name="l07307"></a><span class="lineno"> 7307</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l07308"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_remove_reference_3_01_t_01_6_01_4.html#a3d0f32a66759f333c2dd66aa31005e6d"> 7308</a></span> <span class="keyword">struct </span><a class="code" href="structtesting_1_1internal_1_1_remove_reference.html">RemoveReference</a><T&> { <span class="keyword">typedef</span> T <a class="code" href="structtesting_1_1internal_1_1_remove_reference_3_01_t_01_6_01_4.html#a3d0f32a66759f333c2dd66aa31005e6d">type</a>; }; <span class="comment">// NOLINT</span></div><div class="line"><a name="l07309"></a><span class="lineno"> 7309</span> </div><div class="line"><a name="l07310"></a><span class="lineno"> 7310</span> <span class="comment">// A handy wrapper around RemoveReference that works when the argument</span></div><div class="line"><a name="l07311"></a><span class="lineno"> 7311</span> <span class="comment">// T depends on template parameters.</span></div><div class="line"><a name="l07312"></a><span class="lineno"><a class="line" href="gtest_8h.html#a84c72f25a6a6600e3ff8381ca6982ae9"> 7312</a></span> <span class="preprocessor">#define GTEST_REMOVE_REFERENCE_(T) \</span></div><div class="line"><a name="l07313"></a><span class="lineno"> 7313</span> <span class="preprocessor"> typename ::testing::internal::RemoveReference<T>::type</span></div><div class="line"><a name="l07314"></a><span class="lineno"> 7314</span> </div><div class="line"><a name="l07315"></a><span class="lineno"> 7315</span> <span class="comment">// Removes const from a type if it is a const type, otherwise leaves</span></div><div class="line"><a name="l07316"></a><span class="lineno"> 7316</span> <span class="comment">// it unchanged. This is the same as tr1::remove_const, which is not</span></div><div class="line"><a name="l07317"></a><span class="lineno"> 7317</span> <span class="comment">// widely available yet.</span></div><div class="line"><a name="l07318"></a><span class="lineno"> 7318</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l07319"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_remove_const.html#a1be32027ea4edcc0d15abd59aba4a97f"> 7319</a></span> <span class="keyword">struct </span><a class="code" href="structtesting_1_1internal_1_1_remove_const.html">RemoveConst</a> { <span class="keyword">typedef</span> T <a class="code" href="structtesting_1_1internal_1_1_remove_const.html#a1be32027ea4edcc0d15abd59aba4a97f">type</a>; }; <span class="comment">// NOLINT</span></div><div class="line"><a name="l07320"></a><span class="lineno"> 7320</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l07321"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_remove_const_3_01const_01_t_01_4.html#ac88c6824d228ab05091e5a4f1c1a95fc"> 7321</a></span> <span class="keyword">struct </span><a class="code" href="structtesting_1_1internal_1_1_remove_const.html">RemoveConst</a><const T> { <span class="keyword">typedef</span> T <a class="code" href="structtesting_1_1internal_1_1_remove_const_3_01const_01_t_01_4.html#ac88c6824d228ab05091e5a4f1c1a95fc">type</a>; }; <span class="comment">// NOLINT</span></div><div class="line"><a name="l07322"></a><span class="lineno"> 7322</span> </div><div class="line"><a name="l07323"></a><span class="lineno"> 7323</span> <span class="comment">// MSVC 8.0, Sun C++, and IBM XL C++ have a bug which causes the above</span></div><div class="line"><a name="l07324"></a><span class="lineno"> 7324</span> <span class="comment">// definition to fail to remove the const in 'const int[3]' and 'const</span></div><div class="line"><a name="l07325"></a><span class="lineno"> 7325</span> <span class="comment">// char[3][4]'. The following specialization works around the bug.</span></div><div class="line"><a name="l07326"></a><span class="lineno"> 7326</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T, <span class="keywordtype">size_t</span> N></div><div class="line"><a name="l07327"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_remove_const_3_01const_01_t[_n]_4.html"> 7327</a></span> <span class="keyword">struct </span><a class="code" href="structtesting_1_1internal_1_1_remove_const.html">RemoveConst</a><const T[N]> {</div><div class="line"><a name="l07328"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_remove_const_3_01const_01_t[_n]_4.html#ac976b53cb5d031a120fafbe790650068"> 7328</a></span>  <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="structtesting_1_1internal_1_1_remove_const.html#a1be32027ea4edcc0d15abd59aba4a97f">RemoveConst<T>::type</a> <a class="code" href="structtesting_1_1internal_1_1_remove_const.html#a1be32027ea4edcc0d15abd59aba4a97f">type</a>[N];</div><div class="line"><a name="l07329"></a><span class="lineno"> 7329</span> };</div><div class="line"><a name="l07330"></a><span class="lineno"> 7330</span> </div><div class="line"><a name="l07331"></a><span class="lineno"> 7331</span> <span class="comment">// A handy wrapper around RemoveConst that works when the argument</span></div><div class="line"><a name="l07332"></a><span class="lineno"> 7332</span> <span class="comment">// T depends on template parameters.</span></div><div class="line"><a name="l07333"></a><span class="lineno"><a class="line" href="gtest_8h.html#a2ffec8c60510eb130af387f5ce9a756a"> 7333</a></span> <span class="preprocessor">#define GTEST_REMOVE_CONST_(T) \</span></div><div class="line"><a name="l07334"></a><span class="lineno"> 7334</span> <span class="preprocessor"> typename ::testing::internal::RemoveConst<T>::type</span></div><div class="line"><a name="l07335"></a><span class="lineno"> 7335</span> </div><div class="line"><a name="l07336"></a><span class="lineno"> 7336</span> <span class="comment">// Turns const U&, U&, const U, and U all into U.</span></div><div class="line"><a name="l07337"></a><span class="lineno"><a class="line" href="gtest_8h.html#a874567b176266188fabfffb8393267ce"> 7337</a></span> <span class="preprocessor">#define GTEST_REMOVE_REFERENCE_AND_CONST_(T) \</span></div><div class="line"><a name="l07338"></a><span class="lineno"> 7338</span> <span class="preprocessor"> GTEST_REMOVE_CONST_(GTEST_REMOVE_REFERENCE_(T))</span></div><div class="line"><a name="l07339"></a><span class="lineno"> 7339</span> </div><div class="line"><a name="l07340"></a><span class="lineno"> 7340</span> <span class="comment">// ImplicitlyConvertible<From, To>::value is a compile-time bool</span></div><div class="line"><a name="l07341"></a><span class="lineno"> 7341</span> <span class="comment">// constant that's true iff type From can be implicitly converted to</span></div><div class="line"><a name="l07342"></a><span class="lineno"> 7342</span> <span class="comment">// type To.</span></div><div class="line"><a name="l07343"></a><span class="lineno"> 7343</span> <span class="keyword">template</span> <<span class="keyword">typename</span> From, <span class="keyword">typename</span> To></div><div class="line"><a name="l07344"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_implicitly_convertible.html"> 7344</a></span> <span class="keyword">class </span><a class="code" href="classtesting_1_1internal_1_1_implicitly_convertible.html">ImplicitlyConvertible</a> {</div><div class="line"><a name="l07345"></a><span class="lineno"> 7345</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l07346"></a><span class="lineno"> 7346</span>  <span class="comment">// We need the following helper functions only for their types.</span></div><div class="line"><a name="l07347"></a><span class="lineno"> 7347</span>  <span class="comment">// They have no implementations.</span></div><div class="line"><a name="l07348"></a><span class="lineno"> 7348</span> </div><div class="line"><a name="l07349"></a><span class="lineno"> 7349</span>  <span class="comment">// MakeFrom() is an expression whose type is From. We cannot simply</span></div><div class="line"><a name="l07350"></a><span class="lineno"> 7350</span>  <span class="comment">// use From(), as the type From may not have a public default</span></div><div class="line"><a name="l07351"></a><span class="lineno"> 7351</span>  <span class="comment">// constructor.</span></div><div class="line"><a name="l07352"></a><span class="lineno"> 7352</span>  <span class="keyword">static</span> <span class="keyword">typename</span> <a class="code" href="structtesting_1_1internal_1_1_add_reference.html#a2df8dd7c4e41f6390e6e66b1a9a67bb4">AddReference<From>::type</a> MakeFrom();</div><div class="line"><a name="l07353"></a><span class="lineno"> 7353</span> </div><div class="line"><a name="l07354"></a><span class="lineno"> 7354</span>  <span class="comment">// These two functions are overloaded. Given an expression</span></div><div class="line"><a name="l07355"></a><span class="lineno"> 7355</span>  <span class="comment">// Helper(x), the compiler will pick the first version if x can be</span></div><div class="line"><a name="l07356"></a><span class="lineno"> 7356</span>  <span class="comment">// implicitly converted to type To; otherwise it will pick the</span></div><div class="line"><a name="l07357"></a><span class="lineno"> 7357</span>  <span class="comment">// second version.</span></div><div class="line"><a name="l07358"></a><span class="lineno"> 7358</span>  <span class="comment">//</span></div><div class="line"><a name="l07359"></a><span class="lineno"> 7359</span>  <span class="comment">// The first version returns a value of size 1, and the second</span></div><div class="line"><a name="l07360"></a><span class="lineno"> 7360</span>  <span class="comment">// version returns a value of size 2. Therefore, by checking the</span></div><div class="line"><a name="l07361"></a><span class="lineno"> 7361</span>  <span class="comment">// size of Helper(x), which can be done at compile time, we can tell</span></div><div class="line"><a name="l07362"></a><span class="lineno"> 7362</span>  <span class="comment">// which version of Helper() is used, and hence whether x can be</span></div><div class="line"><a name="l07363"></a><span class="lineno"> 7363</span>  <span class="comment">// implicitly converted to type To.</span></div><div class="line"><a name="l07364"></a><span class="lineno"> 7364</span>  <span class="keyword">static</span> <span class="keywordtype">char</span> Helper(To);</div><div class="line"><a name="l07365"></a><span class="lineno"> 7365</span>  <span class="keyword">static</span> char (&Helper(...))[2]; <span class="comment">// NOLINT</span></div><div class="line"><a name="l07366"></a><span class="lineno"> 7366</span> </div><div class="line"><a name="l07367"></a><span class="lineno"> 7367</span>  <span class="comment">// We have to put the 'public' section after the 'private' section,</span></div><div class="line"><a name="l07368"></a><span class="lineno"> 7368</span>  <span class="comment">// or MSVC refuses to compile the code.</span></div><div class="line"><a name="l07369"></a><span class="lineno"> 7369</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l07370"></a><span class="lineno"> 7370</span> <span class="preprocessor">#if defined(__BORLANDC__)</span></div><div class="line"><a name="l07371"></a><span class="lineno"> 7371</span>  <span class="comment">// C++Builder cannot use member overload resolution during template</span></div><div class="line"><a name="l07372"></a><span class="lineno"> 7372</span>  <span class="comment">// instantiation. The simplest workaround is to use its C++0x type traits</span></div><div class="line"><a name="l07373"></a><span class="lineno"> 7373</span>  <span class="comment">// functions (C++Builder 2009 and above only).</span></div><div class="line"><a name="l07374"></a><span class="lineno"> 7374</span>  <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> <a class="code" href="classtesting_1_1internal_1_1_implicitly_convertible.html#aea51cecabca681fb75659e224771b7b7">value</a> = __is_convertible(From, To);</div><div class="line"><a name="l07375"></a><span class="lineno"> 7375</span> <span class="preprocessor">#else</span></div><div class="line"><a name="l07376"></a><span class="lineno"> 7376</span>  <span class="comment">// MSVC warns about implicitly converting from double to int for</span></div><div class="line"><a name="l07377"></a><span class="lineno"> 7377</span>  <span class="comment">// possible loss of data, so we need to temporarily disable the</span></div><div class="line"><a name="l07378"></a><span class="lineno"> 7378</span>  <span class="comment">// warning.</span></div><div class="line"><a name="l07379"></a><span class="lineno"> 7379</span>  <a class="code" href="gtest_8h.html#a86994cc68e844d8b82089c70408dfc61">GTEST_DISABLE_MSC_WARNINGS_PUSH_</a>(4244)</div><div class="line"><a name="l07380"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_implicitly_convertible.html#aea51cecabca681fb75659e224771b7b7"> 7380</a></span>  static const <span class="keywordtype">bool</span> <a class="code" href="classtesting_1_1internal_1_1_implicitly_convertible.html#aea51cecabca681fb75659e224771b7b7">value</a> =</div><div class="line"><a name="l07381"></a><span class="lineno"> 7381</span>  sizeof(Helper(<a class="code" href="classtesting_1_1internal_1_1_implicitly_convertible.html">ImplicitlyConvertible</a>::MakeFrom())) == 1;</div><div class="line"><a name="l07382"></a><span class="lineno"> 7382</span>  <a class="code" href="gtest_8h.html#aebf8277c9069c1e124f9a5bbe2948061">GTEST_DISABLE_MSC_WARNINGS_POP_</a>()</div><div class="line"><a name="l07383"></a><span class="lineno"> 7383</span> <span class="preprocessor">#endif // __BORLANDC__</span></div><div class="line"><a name="l07384"></a><span class="lineno"> 7384</span> };</div><div class="line"><a name="l07385"></a><span class="lineno"> 7385</span> <span class="keyword">template</span> <<span class="keyword">typename</span> From, <span class="keyword">typename</span> To></div><div class="line"><a name="l07386"></a><span class="lineno"> 7386</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> <a class="code" href="classtesting_1_1internal_1_1_implicitly_convertible.html">ImplicitlyConvertible<From, To>::value</a>;</div><div class="line"><a name="l07387"></a><span class="lineno"> 7387</span> </div><div class="line"><a name="l07388"></a><span class="lineno"> 7388</span> <span class="comment">// IsAProtocolMessage<T>::value is a compile-time bool constant that's</span></div><div class="line"><a name="l07389"></a><span class="lineno"> 7389</span> <span class="comment">// true iff T is type ProtocolMessage, proto2::Message, or a subclass</span></div><div class="line"><a name="l07390"></a><span class="lineno"> 7390</span> <span class="comment">// of those.</span></div><div class="line"><a name="l07391"></a><span class="lineno"> 7391</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l07392"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_is_a_protocol_message.html"> 7392</a></span> <span class="keyword">struct </span><a class="code" href="structtesting_1_1internal_1_1_is_a_protocol_message.html">IsAProtocolMessage</a></div><div class="line"><a name="l07393"></a><span class="lineno"> 7393</span>  : <span class="keyword">public</span> <a class="code" href="structtesting_1_1internal_1_1bool__constant.html">bool_constant</a><</div><div class="line"><a name="l07394"></a><span class="lineno"> 7394</span>  ImplicitlyConvertible<const T*, const ::ProtocolMessage*>::value ||</div><div class="line"><a name="l07395"></a><span class="lineno"> 7395</span>  ImplicitlyConvertible<const T*, const ::proto2::Message*>::value> {</div><div class="line"><a name="l07396"></a><span class="lineno"> 7396</span> };</div><div class="line"><a name="l07397"></a><span class="lineno"> 7397</span> </div><div class="line"><a name="l07398"></a><span class="lineno"> 7398</span> <span class="comment">// When the compiler sees expression IsContainerTest<C>(0), if C is an</span></div><div class="line"><a name="l07399"></a><span class="lineno"> 7399</span> <span class="comment">// STL-style container class, the first overload of IsContainerTest</span></div><div class="line"><a name="l07400"></a><span class="lineno"> 7400</span> <span class="comment">// will be viable (since both C::iterator* and C::const_iterator* are</span></div><div class="line"><a name="l07401"></a><span class="lineno"> 7401</span> <span class="comment">// valid types and NULL can be implicitly converted to them). It will</span></div><div class="line"><a name="l07402"></a><span class="lineno"> 7402</span> <span class="comment">// be picked over the second overload as 'int' is a perfect match for</span></div><div class="line"><a name="l07403"></a><span class="lineno"> 7403</span> <span class="comment">// the type of argument 0. If C::iterator or C::const_iterator is not</span></div><div class="line"><a name="l07404"></a><span class="lineno"> 7404</span> <span class="comment">// a valid type, the first overload is not viable, and the second</span></div><div class="line"><a name="l07405"></a><span class="lineno"> 7405</span> <span class="comment">// overload will be picked. Therefore, we can determine whether C is</span></div><div class="line"><a name="l07406"></a><span class="lineno"> 7406</span> <span class="comment">// a container class by checking the type of IsContainerTest<C>(0).</span></div><div class="line"><a name="l07407"></a><span class="lineno"> 7407</span> <span class="comment">// The value of the expression is insignificant.</span></div><div class="line"><a name="l07408"></a><span class="lineno"> 7408</span> <span class="comment">//</span></div><div class="line"><a name="l07409"></a><span class="lineno"> 7409</span> <span class="comment">// In C++11 mode we check the existence of a const_iterator and that an</span></div><div class="line"><a name="l07410"></a><span class="lineno"> 7410</span> <span class="comment">// iterator is properly implemented for the container.</span></div><div class="line"><a name="l07411"></a><span class="lineno"> 7411</span> <span class="comment">//</span></div><div class="line"><a name="l07412"></a><span class="lineno"> 7412</span> <span class="comment">// For pre-C++11 that we look for both C::iterator and C::const_iterator.</span></div><div class="line"><a name="l07413"></a><span class="lineno"> 7413</span> <span class="comment">// The reason is that C++ injects the name of a class as a member of the</span></div><div class="line"><a name="l07414"></a><span class="lineno"> 7414</span> <span class="comment">// class itself (e.g. you can refer to class iterator as either</span></div><div class="line"><a name="l07415"></a><span class="lineno"> 7415</span> <span class="comment">// 'iterator' or 'iterator::iterator'). If we look for C::iterator</span></div><div class="line"><a name="l07416"></a><span class="lineno"> 7416</span> <span class="comment">// only, for example, we would mistakenly think that a class named</span></div><div class="line"><a name="l07417"></a><span class="lineno"> 7417</span> <span class="comment">// iterator is an STL container.</span></div><div class="line"><a name="l07418"></a><span class="lineno"> 7418</span> <span class="comment">//</span></div><div class="line"><a name="l07419"></a><span class="lineno"> 7419</span> <span class="comment">// Also note that the simpler approach of overloading</span></div><div class="line"><a name="l07420"></a><span class="lineno"> 7420</span> <span class="comment">// IsContainerTest(typename C::const_iterator*) and</span></div><div class="line"><a name="l07421"></a><span class="lineno"> 7421</span> <span class="comment">// IsContainerTest(...) doesn't work with Visual Age C++ and Sun C++.</span></div><div class="line"><a name="l07422"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#ad8f0c2883245f1df2a53618a49f0deb3"> 7422</a></span> <span class="keyword">typedef</span> <span class="keywordtype">int</span> <a class="code" href="namespacetesting_1_1internal.html#ad8f0c2883245f1df2a53618a49f0deb3">IsContainer</a>;</div><div class="line"><a name="l07423"></a><span class="lineno"> 7423</span> <span class="keyword">template</span> <<span class="keyword">class </span>C,</div><div class="line"><a name="l07424"></a><span class="lineno"> 7424</span>  <span class="keyword">class </span>Iterator = decltype(::std::declval<const C&>().begin()),</div><div class="line"><a name="l07425"></a><span class="lineno"> 7425</span>  <span class="keyword">class </span>= decltype(::std::declval<const C&>().end()),</div><div class="line"><a name="l07426"></a><span class="lineno"> 7426</span>  <span class="keyword">class </span>= decltype(++::std::declval<Iterator&>()),</div><div class="line"><a name="l07427"></a><span class="lineno"> 7427</span>  <span class="keyword">class </span>= decltype(*::std::declval<Iterator>()),</div><div class="line"><a name="l07428"></a><span class="lineno"> 7428</span>  <span class="keyword">class </span>= <span class="keyword">typename</span> C::const_iterator></div><div class="line"><a name="l07429"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#a764748b94f628bdd1dcd39dc81e8b71f"> 7429</a></span> <a class="code" href="namespacetesting_1_1internal.html#ad8f0c2883245f1df2a53618a49f0deb3">IsContainer</a> <a class="code" href="namespacetesting_1_1internal.html#a764748b94f628bdd1dcd39dc81e8b71f">IsContainerTest</a>(<span class="keywordtype">int</span> <span class="comment">/* dummy */</span>) {</div><div class="line"><a name="l07430"></a><span class="lineno"> 7430</span>  <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l07431"></a><span class="lineno"> 7431</span> }</div><div class="line"><a name="l07432"></a><span class="lineno"> 7432</span> </div><div class="line"><a name="l07433"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#abf080521ce135deb510e0a7830fd3d33"> 7433</a></span> <span class="keyword">typedef</span> <span class="keywordtype">char</span> <a class="code" href="namespacetesting_1_1internal.html#abf080521ce135deb510e0a7830fd3d33">IsNotContainer</a>;</div><div class="line"><a name="l07434"></a><span class="lineno"> 7434</span> <span class="keyword">template</span> <<span class="keyword">class</span> C></div><div class="line"><a name="l07435"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#af545a2ae928b8a9e7581978234464275"> 7435</a></span> <a class="code" href="namespacetesting_1_1internal.html#abf080521ce135deb510e0a7830fd3d33">IsNotContainer</a> <a class="code" href="namespacetesting_1_1internal.html#a764748b94f628bdd1dcd39dc81e8b71f">IsContainerTest</a>(<span class="keywordtype">long</span> <span class="comment">/* dummy */</span>) { <span class="keywordflow">return</span> <span class="charliteral">'\0'</span>; }</div><div class="line"><a name="l07436"></a><span class="lineno"> 7436</span> </div><div class="line"><a name="l07437"></a><span class="lineno"> 7437</span> <span class="comment">// Trait to detect whether a type T is a hash table.</span></div><div class="line"><a name="l07438"></a><span class="lineno"> 7438</span> <span class="comment">// The heuristic used is that the type contains an inner type `hasher` and does</span></div><div class="line"><a name="l07439"></a><span class="lineno"> 7439</span> <span class="comment">// not contain an inner type `reverse_iterator`.</span></div><div class="line"><a name="l07440"></a><span class="lineno"> 7440</span> <span class="comment">// If the container is iterable in reverse, then order might actually matter.</span></div><div class="line"><a name="l07441"></a><span class="lineno"> 7441</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l07442"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_is_hash_table.html"> 7442</a></span> <span class="keyword">struct </span><a class="code" href="structtesting_1_1internal_1_1_is_hash_table.html">IsHashTable</a> {</div><div class="line"><a name="l07443"></a><span class="lineno"> 7443</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l07444"></a><span class="lineno"> 7444</span>  <span class="keyword">template</span> <<span class="keyword">typename</span> U></div><div class="line"><a name="l07445"></a><span class="lineno"> 7445</span>  <span class="keyword">static</span> <span class="keywordtype">char</span> test(<span class="keyword">typename</span> U::hasher*, <span class="keyword">typename</span> U::reverse_iterator*);</div><div class="line"><a name="l07446"></a><span class="lineno"> 7446</span>  <span class="keyword">template</span> <<span class="keyword">typename</span> U></div><div class="line"><a name="l07447"></a><span class="lineno"> 7447</span>  <span class="keyword">static</span> <span class="keywordtype">int</span> test(<span class="keyword">typename</span> U::hasher*, ...);</div><div class="line"><a name="l07448"></a><span class="lineno"> 7448</span>  <span class="keyword">template</span> <<span class="keyword">typename</span> U></div><div class="line"><a name="l07449"></a><span class="lineno"> 7449</span>  <span class="keyword">static</span> <span class="keywordtype">char</span> test(...);</div><div class="line"><a name="l07450"></a><span class="lineno"> 7450</span> </div><div class="line"><a name="l07451"></a><span class="lineno"> 7451</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l07452"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_is_hash_table.html#a165e0a3eddfa5fadf9b950be6432d848"> 7452</a></span>  <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> <a class="code" href="structtesting_1_1internal_1_1_is_hash_table.html#a165e0a3eddfa5fadf9b950be6432d848">value</a> = <span class="keyword">sizeof</span>(test<T>(<span class="keyword">nullptr</span>, <span class="keyword">nullptr</span>)) == <span class="keyword">sizeof</span>(int);</div><div class="line"><a name="l07453"></a><span class="lineno"> 7453</span> };</div><div class="line"><a name="l07454"></a><span class="lineno"> 7454</span> </div><div class="line"><a name="l07455"></a><span class="lineno"> 7455</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l07456"></a><span class="lineno"> 7456</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> <a class="code" href="structtesting_1_1internal_1_1_is_hash_table.html">IsHashTable<T>::value</a>;</div><div class="line"><a name="l07457"></a><span class="lineno"> 7457</span> </div><div class="line"><a name="l07458"></a><span class="lineno"> 7458</span> <span class="keyword">template</span> <<span class="keyword">typename</span> C,</div><div class="line"><a name="l07459"></a><span class="lineno"> 7459</span>  <span class="keywordtype">bool</span> = <span class="keyword">sizeof</span>(IsContainerTest<C>(0)) == <span class="keyword">sizeof</span>(<a class="code" href="namespacetesting_1_1internal.html#ad8f0c2883245f1df2a53618a49f0deb3">IsContainer</a>)></div><div class="line"><a name="l07460"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_is_recursive_container_impl.html"> 7460</a></span> <span class="keyword">struct</span> <a class="code" href="structtesting_1_1internal_1_1_is_recursive_container_impl.html">IsRecursiveContainerImpl</a>;</div><div class="line"><a name="l07461"></a><span class="lineno"> 7461</span> </div><div class="line"><a name="l07462"></a><span class="lineno"> 7462</span> <span class="keyword">template</span> <<span class="keyword">typename</span> C></div><div class="line"><a name="l07463"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_is_recursive_container_impl_3_01_c_00_01false_01_4.html"> 7463</a></span> <span class="keyword">struct </span><a class="code" href="structtesting_1_1internal_1_1_is_recursive_container_impl_3_01_c_00_01false_01_4.html">IsRecursiveContainerImpl<C, false></a> : <span class="keyword">public</span> <a class="code" href="structtesting_1_1internal_1_1bool__constant.html">false_type</a> {};</div><div class="line"><a name="l07464"></a><span class="lineno"> 7464</span> </div><div class="line"><a name="l07465"></a><span class="lineno"> 7465</span> <span class="comment">// Since the IsRecursiveContainerImpl depends on the IsContainerTest we need to</span></div><div class="line"><a name="l07466"></a><span class="lineno"> 7466</span> <span class="comment">// obey the same inconsistencies as the IsContainerTest, namely check if</span></div><div class="line"><a name="l07467"></a><span class="lineno"> 7467</span> <span class="comment">// something is a container is relying on only const_iterator in C++11 and</span></div><div class="line"><a name="l07468"></a><span class="lineno"> 7468</span> <span class="comment">// is relying on both const_iterator and iterator otherwise</span></div><div class="line"><a name="l07469"></a><span class="lineno"> 7469</span> <span class="keyword">template</span> <<span class="keyword">typename</span> C></div><div class="line"><a name="l07470"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_is_recursive_container_impl_3_01_c_00_01true_01_4.html"> 7470</a></span> <span class="keyword">struct </span><a class="code" href="structtesting_1_1internal_1_1_is_recursive_container_impl_3_01_c_00_01true_01_4.html">IsRecursiveContainerImpl<C, true></a> {</div><div class="line"><a name="l07471"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_is_recursive_container_impl_3_01_c_00_01true_01_4.html#a5e8e2cf58f0d2581e9e3ab5f5630cd61"> 7471</a></span>  <span class="keyword">using</span> <a class="code" href="structtesting_1_1internal_1_1_is_recursive_container_impl_3_01_c_00_01true_01_4.html#a5e8e2cf58f0d2581e9e3ab5f5630cd61">value_type</a> = decltype(*std::declval<typename C::const_iterator>());</div><div class="line"><a name="l07472"></a><span class="lineno"> 7472</span>  <span class="keyword">using</span> <a class="code" href="structtesting_1_1internal_1_1is__same.html">type</a> =</div><div class="line"><a name="l07473"></a><span class="lineno"> 7473</span>  <a class="code" href="structtesting_1_1internal_1_1is__same.html">is_same</a><<span class="keyword">typename</span> std::remove_const<</div><div class="line"><a name="l07474"></a><span class="lineno"> 7474</span>  <span class="keyword">typename</span> std::remove_reference<value_type>::type><a class="code" href="structtesting_1_1internal_1_1is__same.html">::type</a>,</div><div class="line"><a name="l07475"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_is_recursive_container_impl_3_01_c_00_01true_01_4.html#a24b611fbe1b9a7c524ee54ae01324388"> 7475</a></span>  C>;</div><div class="line"><a name="l07476"></a><span class="lineno"> 7476</span> };</div><div class="line"><a name="l07477"></a><span class="lineno"> 7477</span> </div><div class="line"><a name="l07478"></a><span class="lineno"> 7478</span> <span class="comment">// IsRecursiveContainer<Type> is a unary compile-time predicate that</span></div><div class="line"><a name="l07479"></a><span class="lineno"> 7479</span> <span class="comment">// evaluates whether C is a recursive container type. A recursive container</span></div><div class="line"><a name="l07480"></a><span class="lineno"> 7480</span> <span class="comment">// type is a container type whose value_type is equal to the container type</span></div><div class="line"><a name="l07481"></a><span class="lineno"> 7481</span> <span class="comment">// itself. An example for a recursive container type is</span></div><div class="line"><a name="l07482"></a><span class="lineno"> 7482</span> <span class="comment">// boost::filesystem::path, whose iterator has a value_type that is equal to</span></div><div class="line"><a name="l07483"></a><span class="lineno"> 7483</span> <span class="comment">// boost::filesystem::path.</span></div><div class="line"><a name="l07484"></a><span class="lineno"> 7484</span> <span class="keyword">template</span> <<span class="keyword">typename</span> C></div><div class="line"><a name="l07485"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_is_recursive_container.html"> 7485</a></span> <span class="keyword">struct </span><a class="code" href="structtesting_1_1internal_1_1_is_recursive_container.html">IsRecursiveContainer</a> : <span class="keyword">public</span> <a class="code" href="structtesting_1_1internal_1_1_is_recursive_container_impl.html">IsRecursiveContainerImpl</a><C>::type {};</div><div class="line"><a name="l07486"></a><span class="lineno"> 7486</span> </div><div class="line"><a name="l07487"></a><span class="lineno"> 7487</span> <span class="comment">// EnableIf<condition>::type is void when 'Cond' is true, and</span></div><div class="line"><a name="l07488"></a><span class="lineno"> 7488</span> <span class="comment">// undefined when 'Cond' is false. To use SFINAE to make a function</span></div><div class="line"><a name="l07489"></a><span class="lineno"> 7489</span> <span class="comment">// overload only apply when a particular expression is true, add</span></div><div class="line"><a name="l07490"></a><span class="lineno"> 7490</span> <span class="comment">// "typename EnableIf<expression>::type* = 0" as the last parameter.</span></div><div class="line"><a name="l07491"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_enable_if.html"> 7491</a></span> <span class="keyword">template</span><<span class="keywordtype">bool</span>> <span class="keyword">struct </span><a class="code" href="structtesting_1_1internal_1_1_enable_if.html">EnableIf</a>;</div><div class="line"><a name="l07492"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_enable_if_3_01true_01_4.html#a9398d803f1fdd99ff41823746f6299ff"> 7492</a></span> <span class="keyword">template</span><> <span class="keyword">struct </span><a class="code" href="structtesting_1_1internal_1_1_enable_if.html">EnableIf</a><true> { <span class="keyword">typedef</span> <span class="keywordtype">void</span> <a class="code" href="structtesting_1_1internal_1_1_enable_if_3_01true_01_4.html#a9398d803f1fdd99ff41823746f6299ff">type</a>; }; <span class="comment">// NOLINT</span></div><div class="line"><a name="l07493"></a><span class="lineno"> 7493</span> </div><div class="line"><a name="l07494"></a><span class="lineno"> 7494</span> <span class="comment">// Utilities for native arrays.</span></div><div class="line"><a name="l07495"></a><span class="lineno"> 7495</span> </div><div class="line"><a name="l07496"></a><span class="lineno"> 7496</span> <span class="comment">// ArrayEq() compares two k-dimensional native arrays using the</span></div><div class="line"><a name="l07497"></a><span class="lineno"> 7497</span> <span class="comment">// elements' operator==, where k can be any integer >= 0. When k is</span></div><div class="line"><a name="l07498"></a><span class="lineno"> 7498</span> <span class="comment">// 0, ArrayEq() degenerates into comparing a single pair of values.</span></div><div class="line"><a name="l07499"></a><span class="lineno"> 7499</span> </div><div class="line"><a name="l07500"></a><span class="lineno"> 7500</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T, <span class="keyword">typename</span> U></div><div class="line"><a name="l07501"></a><span class="lineno"> 7501</span> <span class="keywordtype">bool</span> <a class="code" href="namespacetesting_1_1internal.html#af4bebf36baf0b0a5b26d051dde55fa47">ArrayEq</a>(<span class="keyword">const</span> T* lhs, <span class="keywordtype">size_t</span> <a class="code" href="namespaceutl_1_1meta.html#a0edfc2c15e42531e53c0822264d220ec">size</a>, <span class="keyword">const</span> U* rhs);</div><div class="line"><a name="l07502"></a><span class="lineno"> 7502</span> </div><div class="line"><a name="l07503"></a><span class="lineno"> 7503</span> <span class="comment">// This generic version is used when k is 0.</span></div><div class="line"><a name="l07504"></a><span class="lineno"> 7504</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T, <span class="keyword">typename</span> U></div><div class="line"><a name="l07505"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#a49b4d0ee49c0f8c93bab29ebd20630cc"> 7505</a></span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="namespacetesting_1_1internal.html#af4bebf36baf0b0a5b26d051dde55fa47">ArrayEq</a>(<span class="keyword">const</span> T& lhs, <span class="keyword">const</span> U& rhs) { <span class="keywordflow">return</span> lhs == rhs; }</div><div class="line"><a name="l07506"></a><span class="lineno"> 7506</span> </div><div class="line"><a name="l07507"></a><span class="lineno"> 7507</span> <span class="comment">// This overload is used when k >= 1.</span></div><div class="line"><a name="l07508"></a><span class="lineno"> 7508</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T, <span class="keyword">typename</span> U, <span class="keywordtype">size_t</span> N></div><div class="line"><a name="l07509"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#a5cb6f81ee827130024261121c742b26c"> 7509</a></span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="namespacetesting_1_1internal.html#af4bebf36baf0b0a5b26d051dde55fa47">ArrayEq</a>(<span class="keyword">const</span> T(&lhs)[N], <span class="keyword">const</span> U(&rhs)[N]) {</div><div class="line"><a name="l07510"></a><span class="lineno"> 7510</span>  <span class="keywordflow">return</span> <a class="code" href="namespacetesting_1_1internal.html#af4bebf36baf0b0a5b26d051dde55fa47">internal::ArrayEq</a>(lhs, N, rhs);</div><div class="line"><a name="l07511"></a><span class="lineno"> 7511</span> }</div><div class="line"><a name="l07512"></a><span class="lineno"> 7512</span> </div><div class="line"><a name="l07513"></a><span class="lineno"> 7513</span> <span class="comment">// This helper reduces code bloat. If we instead put its logic inside</span></div><div class="line"><a name="l07514"></a><span class="lineno"> 7514</span> <span class="comment">// the previous ArrayEq() function, arrays with different sizes would</span></div><div class="line"><a name="l07515"></a><span class="lineno"> 7515</span> <span class="comment">// lead to different copies of the template code.</span></div><div class="line"><a name="l07516"></a><span class="lineno"> 7516</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T, <span class="keyword">typename</span> U></div><div class="line"><a name="l07517"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#af4bebf36baf0b0a5b26d051dde55fa47"> 7517</a></span> <span class="keywordtype">bool</span> <a class="code" href="namespacetesting_1_1internal.html#af4bebf36baf0b0a5b26d051dde55fa47">ArrayEq</a>(<span class="keyword">const</span> T* lhs, <span class="keywordtype">size_t</span> <a class="code" href="namespaceutl_1_1meta.html#a0edfc2c15e42531e53c0822264d220ec">size</a>, <span class="keyword">const</span> U* rhs) {</div><div class="line"><a name="l07518"></a><span class="lineno"> 7518</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i != <a class="code" href="namespaceutl_1_1meta.html#a0edfc2c15e42531e53c0822264d220ec">size</a>; i++) {</div><div class="line"><a name="l07519"></a><span class="lineno"> 7519</span>  <span class="keywordflow">if</span> (!<a class="code" href="namespacetesting_1_1internal.html#af4bebf36baf0b0a5b26d051dde55fa47">internal::ArrayEq</a>(lhs[i], rhs[i]))</div><div class="line"><a name="l07520"></a><span class="lineno"> 7520</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l07521"></a><span class="lineno"> 7521</span>  }</div><div class="line"><a name="l07522"></a><span class="lineno"> 7522</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l07523"></a><span class="lineno"> 7523</span> }</div><div class="line"><a name="l07524"></a><span class="lineno"> 7524</span> </div><div class="line"><a name="l07525"></a><span class="lineno"> 7525</span> <span class="comment">// Finds the first element in the iterator range [begin, end) that</span></div><div class="line"><a name="l07526"></a><span class="lineno"> 7526</span> <span class="comment">// equals elem. Element may be a native array type itself.</span></div><div class="line"><a name="l07527"></a><span class="lineno"> 7527</span> <span class="keyword">template</span> <<span class="keyword">typename</span> Iter, <span class="keyword">typename</span> Element></div><div class="line"><a name="l07528"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#a94a857fe6ff32cf4fdc4769a4071f239"> 7528</a></span> Iter <a class="code" href="namespacetesting_1_1internal.html#a94a857fe6ff32cf4fdc4769a4071f239">ArrayAwareFind</a>(Iter begin, Iter end, <span class="keyword">const</span> Element& elem) {</div><div class="line"><a name="l07529"></a><span class="lineno"> 7529</span>  <span class="keywordflow">for</span> (Iter it = begin; it != end; ++it) {</div><div class="line"><a name="l07530"></a><span class="lineno"> 7530</span>  <span class="keywordflow">if</span> (<a class="code" href="namespacetesting_1_1internal.html#af4bebf36baf0b0a5b26d051dde55fa47">internal::ArrayEq</a>(*it, elem))</div><div class="line"><a name="l07531"></a><span class="lineno"> 7531</span>  <span class="keywordflow">return</span> it;</div><div class="line"><a name="l07532"></a><span class="lineno"> 7532</span>  }</div><div class="line"><a name="l07533"></a><span class="lineno"> 7533</span>  <span class="keywordflow">return</span> end;</div><div class="line"><a name="l07534"></a><span class="lineno"> 7534</span> }</div><div class="line"><a name="l07535"></a><span class="lineno"> 7535</span> </div><div class="line"><a name="l07536"></a><span class="lineno"> 7536</span> <span class="comment">// CopyArray() copies a k-dimensional native array using the elements'</span></div><div class="line"><a name="l07537"></a><span class="lineno"> 7537</span> <span class="comment">// operator=, where k can be any integer >= 0. When k is 0,</span></div><div class="line"><a name="l07538"></a><span class="lineno"> 7538</span> <span class="comment">// CopyArray() degenerates into copying a single value.</span></div><div class="line"><a name="l07539"></a><span class="lineno"> 7539</span> </div><div class="line"><a name="l07540"></a><span class="lineno"> 7540</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T, <span class="keyword">typename</span> U></div><div class="line"><a name="l07541"></a><span class="lineno"> 7541</span> <span class="keywordtype">void</span> <a class="code" href="namespacetesting_1_1internal.html#afb1b9728aaaf6d9fe6246a19cfe3f7f5">CopyArray</a>(<span class="keyword">const</span> T* from, <span class="keywordtype">size_t</span> <a class="code" href="namespaceutl_1_1meta.html#a0edfc2c15e42531e53c0822264d220ec">size</a>, U* to);</div><div class="line"><a name="l07542"></a><span class="lineno"> 7542</span> </div><div class="line"><a name="l07543"></a><span class="lineno"> 7543</span> <span class="comment">// This generic version is used when k is 0.</span></div><div class="line"><a name="l07544"></a><span class="lineno"> 7544</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T, <span class="keyword">typename</span> U></div><div class="line"><a name="l07545"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#a84d0e746ba0827cc52b53d22000de0e8"> 7545</a></span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="namespacetesting_1_1internal.html#afb1b9728aaaf6d9fe6246a19cfe3f7f5">CopyArray</a>(<span class="keyword">const</span> T& from, U* to) { *to = from; }</div><div class="line"><a name="l07546"></a><span class="lineno"> 7546</span> </div><div class="line"><a name="l07547"></a><span class="lineno"> 7547</span> <span class="comment">// This overload is used when k >= 1.</span></div><div class="line"><a name="l07548"></a><span class="lineno"> 7548</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T, <span class="keyword">typename</span> U, <span class="keywordtype">size_t</span> N></div><div class="line"><a name="l07549"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#a1e7ae855686720615dcd5754c8181c62"> 7549</a></span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="namespacetesting_1_1internal.html#afb1b9728aaaf6d9fe6246a19cfe3f7f5">CopyArray</a>(<span class="keyword">const</span> T(&from)[N], U(*to)[N]) {</div><div class="line"><a name="l07550"></a><span class="lineno"> 7550</span>  <a class="code" href="namespacetesting_1_1internal.html#afb1b9728aaaf6d9fe6246a19cfe3f7f5">internal::CopyArray</a>(from, N, *to);</div><div class="line"><a name="l07551"></a><span class="lineno"> 7551</span> }</div><div class="line"><a name="l07552"></a><span class="lineno"> 7552</span> </div><div class="line"><a name="l07553"></a><span class="lineno"> 7553</span> <span class="comment">// This helper reduces code bloat. If we instead put its logic inside</span></div><div class="line"><a name="l07554"></a><span class="lineno"> 7554</span> <span class="comment">// the previous CopyArray() function, arrays with different sizes</span></div><div class="line"><a name="l07555"></a><span class="lineno"> 7555</span> <span class="comment">// would lead to different copies of the template code.</span></div><div class="line"><a name="l07556"></a><span class="lineno"> 7556</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T, <span class="keyword">typename</span> U></div><div class="line"><a name="l07557"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#afb1b9728aaaf6d9fe6246a19cfe3f7f5"> 7557</a></span> <span class="keywordtype">void</span> <a class="code" href="namespacetesting_1_1internal.html#afb1b9728aaaf6d9fe6246a19cfe3f7f5">CopyArray</a>(<span class="keyword">const</span> T* from, <span class="keywordtype">size_t</span> <a class="code" href="namespaceutl_1_1meta.html#a0edfc2c15e42531e53c0822264d220ec">size</a>, U* to) {</div><div class="line"><a name="l07558"></a><span class="lineno"> 7558</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i != <a class="code" href="namespaceutl_1_1meta.html#a0edfc2c15e42531e53c0822264d220ec">size</a>; i++) {</div><div class="line"><a name="l07559"></a><span class="lineno"> 7559</span>  <a class="code" href="namespacetesting_1_1internal.html#afb1b9728aaaf6d9fe6246a19cfe3f7f5">internal::CopyArray</a>(from[i], to + i);</div><div class="line"><a name="l07560"></a><span class="lineno"> 7560</span>  }</div><div class="line"><a name="l07561"></a><span class="lineno"> 7561</span> }</div><div class="line"><a name="l07562"></a><span class="lineno"> 7562</span> </div><div class="line"><a name="l07563"></a><span class="lineno"> 7563</span> <span class="comment">// The relation between an NativeArray object (see below) and the</span></div><div class="line"><a name="l07564"></a><span class="lineno"> 7564</span> <span class="comment">// native array it represents.</span></div><div class="line"><a name="l07565"></a><span class="lineno"> 7565</span> <span class="comment">// We use 2 different structs to allow non-copyable types to be used, as long</span></div><div class="line"><a name="l07566"></a><span class="lineno"> 7566</span> <span class="comment">// as RelationToSourceReference() is passed.</span></div><div class="line"><a name="l07567"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_relation_to_source_reference.html"> 7567</a></span> <span class="keyword">struct </span><a class="code" href="structtesting_1_1internal_1_1_relation_to_source_reference.html">RelationToSourceReference</a> {};</div><div class="line"><a name="l07568"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_relation_to_source_copy.html"> 7568</a></span> <span class="keyword">struct </span><a class="code" href="structtesting_1_1internal_1_1_relation_to_source_copy.html">RelationToSourceCopy</a> {};</div><div class="line"><a name="l07569"></a><span class="lineno"> 7569</span> </div><div class="line"><a name="l07570"></a><span class="lineno"> 7570</span> <span class="comment">// Adapts a native array to a read-only STL-style container. Instead</span></div><div class="line"><a name="l07571"></a><span class="lineno"> 7571</span> <span class="comment">// of the complete STL container concept, this adaptor only implements</span></div><div class="line"><a name="l07572"></a><span class="lineno"> 7572</span> <span class="comment">// members useful for Google Mock's container matchers. New members</span></div><div class="line"><a name="l07573"></a><span class="lineno"> 7573</span> <span class="comment">// should be added as needed. To simplify the implementation, we only</span></div><div class="line"><a name="l07574"></a><span class="lineno"> 7574</span> <span class="comment">// support Element being a raw type (i.e. having no top-level const or</span></div><div class="line"><a name="l07575"></a><span class="lineno"> 7575</span> <span class="comment">// reference modifier). It's the client's responsibility to satisfy</span></div><div class="line"><a name="l07576"></a><span class="lineno"> 7576</span> <span class="comment">// this requirement. Element can be an array type itself (hence</span></div><div class="line"><a name="l07577"></a><span class="lineno"> 7577</span> <span class="comment">// multi-dimensional arrays are supported).</span></div><div class="line"><a name="l07578"></a><span class="lineno"> 7578</span> <span class="keyword">template</span> <<span class="keyword">typename</span> Element></div><div class="line"><a name="l07579"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_native_array.html"> 7579</a></span> <span class="keyword">class </span><a class="code" href="classtesting_1_1internal_1_1_native_array.html">NativeArray</a> {</div><div class="line"><a name="l07580"></a><span class="lineno"> 7580</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l07581"></a><span class="lineno"> 7581</span>  <span class="comment">// STL-style container typedefs.</span></div><div class="line"><a name="l07582"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_native_array.html#a12216d686e16e4cc63d952fada5b2ba9"> 7582</a></span>  <span class="keyword">typedef</span> Element <a class="code" href="classtesting_1_1internal_1_1_native_array.html#a12216d686e16e4cc63d952fada5b2ba9">value_type</a>;</div><div class="line"><a name="l07583"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_native_array.html#ac1301a57977b57a1ad013e4e25fc2a72"> 7583</a></span>  <span class="keyword">typedef</span> Element* <a class="code" href="classtesting_1_1internal_1_1_native_array.html#ac1301a57977b57a1ad013e4e25fc2a72">iterator</a>;</div><div class="line"><a name="l07584"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_native_array.html#a9ce7c8408460d7158a2870456d134557"> 7584</a></span>  <span class="keyword">typedef</span> <span class="keyword">const</span> Element* <a class="code" href="classtesting_1_1internal_1_1_native_array.html#a9ce7c8408460d7158a2870456d134557">const_iterator</a>;</div><div class="line"><a name="l07585"></a><span class="lineno"> 7585</span> </div><div class="line"><a name="l07586"></a><span class="lineno"> 7586</span>  <span class="comment">// Constructs from a native array. References the source.</span></div><div class="line"><a name="l07587"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_native_array.html#a52b3689c62532703d11e9d82939a7141"> 7587</a></span>  <a class="code" href="classtesting_1_1internal_1_1_native_array.html#a52b3689c62532703d11e9d82939a7141">NativeArray</a>(<span class="keyword">const</span> Element* array, <span class="keywordtype">size_t</span> <a class="code" href="namespaceutl_1_1meta.html#ab5508236016638fa8e6b97cd17dfc9c2">count</a>, <a class="code" href="structtesting_1_1internal_1_1_relation_to_source_reference.html">RelationToSourceReference</a>) {</div><div class="line"><a name="l07588"></a><span class="lineno"> 7588</span>  InitRef(array, <a class="code" href="namespaceutl_1_1meta.html#ab5508236016638fa8e6b97cd17dfc9c2">count</a>);</div><div class="line"><a name="l07589"></a><span class="lineno"> 7589</span>  }</div><div class="line"><a name="l07590"></a><span class="lineno"> 7590</span> </div><div class="line"><a name="l07591"></a><span class="lineno"> 7591</span>  <span class="comment">// Constructs from a native array. Copies the source.</span></div><div class="line"><a name="l07592"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_native_array.html#ac184ee5741af5be3402213819c834405"> 7592</a></span>  <a class="code" href="classtesting_1_1internal_1_1_native_array.html#ac184ee5741af5be3402213819c834405">NativeArray</a>(<span class="keyword">const</span> Element* array, <span class="keywordtype">size_t</span> <a class="code" href="namespaceutl_1_1meta.html#ab5508236016638fa8e6b97cd17dfc9c2">count</a>, <a class="code" href="structtesting_1_1internal_1_1_relation_to_source_copy.html">RelationToSourceCopy</a>) {</div><div class="line"><a name="l07593"></a><span class="lineno"> 7593</span>  InitCopy(array, <a class="code" href="namespaceutl_1_1meta.html#ab5508236016638fa8e6b97cd17dfc9c2">count</a>);</div><div class="line"><a name="l07594"></a><span class="lineno"> 7594</span>  }</div><div class="line"><a name="l07595"></a><span class="lineno"> 7595</span> </div><div class="line"><a name="l07596"></a><span class="lineno"> 7596</span>  <span class="comment">// Copy constructor.</span></div><div class="line"><a name="l07597"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_native_array.html#abb346ac3040f5da733f594cc2d5958bc"> 7597</a></span>  <a class="code" href="classtesting_1_1internal_1_1_native_array.html#abb346ac3040f5da733f594cc2d5958bc">NativeArray</a>(<span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_native_array.html">NativeArray</a>& rhs) {</div><div class="line"><a name="l07598"></a><span class="lineno"> 7598</span>  (this->*rhs.clone_)(rhs.array_, rhs.size_);</div><div class="line"><a name="l07599"></a><span class="lineno"> 7599</span>  }</div><div class="line"><a name="l07600"></a><span class="lineno"> 7600</span> </div><div class="line"><a name="l07601"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_native_array.html#a55ab5948d473a487303dcf6e02ad1f60"> 7601</a></span>  <a class="code" href="classtesting_1_1internal_1_1_native_array.html#a55ab5948d473a487303dcf6e02ad1f60">~NativeArray</a>() {</div><div class="line"><a name="l07602"></a><span class="lineno"> 7602</span>  <span class="keywordflow">if</span> (clone_ != &NativeArray::InitRef)</div><div class="line"><a name="l07603"></a><span class="lineno"> 7603</span>  <span class="keyword">delete</span>[] array_;</div><div class="line"><a name="l07604"></a><span class="lineno"> 7604</span>  }</div><div class="line"><a name="l07605"></a><span class="lineno"> 7605</span> </div><div class="line"><a name="l07606"></a><span class="lineno"> 7606</span>  <span class="comment">// STL-style container methods.</span></div><div class="line"><a name="l07607"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_native_array.html#af96a4a5ca0cdd5d163c47a081f08bd89"> 7607</a></span>  <span class="keywordtype">size_t</span> <a class="code" href="classtesting_1_1internal_1_1_native_array.html#af96a4a5ca0cdd5d163c47a081f08bd89">size</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> size_; }</div><div class="line"><a name="l07608"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_native_array.html#a3046d93cfa23097e7b7c91f5f982dc78"> 7608</a></span>  <a class="code" href="classtesting_1_1internal_1_1_native_array.html#a9ce7c8408460d7158a2870456d134557">const_iterator</a> <a class="code" href="classtesting_1_1internal_1_1_native_array.html#a3046d93cfa23097e7b7c91f5f982dc78">begin</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> array_; }</div><div class="line"><a name="l07609"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_native_array.html#ae1cda748e49c6906421c6183c4d07c5a"> 7609</a></span>  <a class="code" href="classtesting_1_1internal_1_1_native_array.html#a9ce7c8408460d7158a2870456d134557">const_iterator</a> <a class="code" href="classtesting_1_1internal_1_1_native_array.html#ae1cda748e49c6906421c6183c4d07c5a">end</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> array_ + size_; }</div><div class="line"><a name="l07610"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_native_array.html#a81b90f5739ed812610e68dc34c9e3850"> 7610</a></span>  <span class="keywordtype">bool</span> <a class="code" href="classtesting_1_1internal_1_1_native_array.html#a81b90f5739ed812610e68dc34c9e3850">operator==</a>(<span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_native_array.html">NativeArray</a>& rhs)<span class="keyword"> const </span>{</div><div class="line"><a name="l07611"></a><span class="lineno"> 7611</span>  <span class="keywordflow">return</span> <a class="code" href="classtesting_1_1internal_1_1_native_array.html#af96a4a5ca0cdd5d163c47a081f08bd89">size</a>() == rhs.<a class="code" href="classtesting_1_1internal_1_1_native_array.html#af96a4a5ca0cdd5d163c47a081f08bd89">size</a>() &&</div><div class="line"><a name="l07612"></a><span class="lineno"> 7612</span>  <a class="code" href="namespacetesting_1_1internal.html#af4bebf36baf0b0a5b26d051dde55fa47">ArrayEq</a>(<a class="code" href="classtesting_1_1internal_1_1_native_array.html#a3046d93cfa23097e7b7c91f5f982dc78">begin</a>(), <a class="code" href="classtesting_1_1internal_1_1_native_array.html#af96a4a5ca0cdd5d163c47a081f08bd89">size</a>(), rhs.<a class="code" href="classtesting_1_1internal_1_1_native_array.html#a3046d93cfa23097e7b7c91f5f982dc78">begin</a>());</div><div class="line"><a name="l07613"></a><span class="lineno"> 7613</span>  }</div><div class="line"><a name="l07614"></a><span class="lineno"> 7614</span> </div><div class="line"><a name="l07615"></a><span class="lineno"> 7615</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l07616"></a><span class="lineno"> 7616</span>  <span class="keyword">enum</span> {</div><div class="line"><a name="l07617"></a><span class="lineno"> 7617</span>  kCheckTypeIsNotConstOrAReference = <a class="code" href="structtesting_1_1internal_1_1_static_assert_type_eq_helper.html">StaticAssertTypeEqHelper</a><</div><div class="line"><a name="l07618"></a><span class="lineno"> 7618</span>  Element, <a class="code" href="gtest_8h.html#a874567b176266188fabfffb8393267ce">GTEST_REMOVE_REFERENCE_AND_CONST_</a>(Element)>::value</div><div class="line"><a name="l07619"></a><span class="lineno"> 7619</span>  };</div><div class="line"><a name="l07620"></a><span class="lineno"> 7620</span> </div><div class="line"><a name="l07621"></a><span class="lineno"> 7621</span>  <span class="comment">// Initializes this object with a copy of the input.</span></div><div class="line"><a name="l07622"></a><span class="lineno"> 7622</span>  <span class="keywordtype">void</span> InitCopy(<span class="keyword">const</span> Element* array, <span class="keywordtype">size_t</span> a_size) {</div><div class="line"><a name="l07623"></a><span class="lineno"> 7623</span>  Element* <span class="keyword">const</span> copy = <span class="keyword">new</span> Element[a_size];</div><div class="line"><a name="l07624"></a><span class="lineno"> 7624</span>  <a class="code" href="namespacetesting_1_1internal.html#afb1b9728aaaf6d9fe6246a19cfe3f7f5">CopyArray</a>(array, a_size, copy);</div><div class="line"><a name="l07625"></a><span class="lineno"> 7625</span>  array_ = copy;</div><div class="line"><a name="l07626"></a><span class="lineno"> 7626</span>  size_ = a_size;</div><div class="line"><a name="l07627"></a><span class="lineno"> 7627</span>  clone_ = &NativeArray::InitCopy;</div><div class="line"><a name="l07628"></a><span class="lineno"> 7628</span>  }</div><div class="line"><a name="l07629"></a><span class="lineno"> 7629</span> </div><div class="line"><a name="l07630"></a><span class="lineno"> 7630</span>  <span class="comment">// Initializes this object with a reference of the input.</span></div><div class="line"><a name="l07631"></a><span class="lineno"> 7631</span>  <span class="keywordtype">void</span> InitRef(<span class="keyword">const</span> Element* array, <span class="keywordtype">size_t</span> a_size) {</div><div class="line"><a name="l07632"></a><span class="lineno"> 7632</span>  array_ = array;</div><div class="line"><a name="l07633"></a><span class="lineno"> 7633</span>  size_ = a_size;</div><div class="line"><a name="l07634"></a><span class="lineno"> 7634</span>  clone_ = &NativeArray::InitRef;</div><div class="line"><a name="l07635"></a><span class="lineno"> 7635</span>  }</div><div class="line"><a name="l07636"></a><span class="lineno"> 7636</span> </div><div class="line"><a name="l07637"></a><span class="lineno"> 7637</span>  <span class="keyword">const</span> Element* array_;</div><div class="line"><a name="l07638"></a><span class="lineno"> 7638</span>  <span class="keywordtype">size_t</span> size_;</div><div class="line"><a name="l07639"></a><span class="lineno"> 7639</span>  void (<a class="code" href="classtesting_1_1internal_1_1_native_array.html#a52b3689c62532703d11e9d82939a7141">NativeArray</a>::*clone_)(<span class="keyword">const</span> Element*, <a class="code" href="namespaceutl.html#a22cbecb50ee5c1032de66133e96cbac6">size_t</a>);</div><div class="line"><a name="l07640"></a><span class="lineno"> 7640</span> </div><div class="line"><a name="l07641"></a><span class="lineno"> 7641</span>  GTEST_DISALLOW_ASSIGN_(<a class="code" href="classtesting_1_1internal_1_1_native_array.html#a52b3689c62532703d11e9d82939a7141">NativeArray</a>);</div><div class="line"><a name="l07642"></a><span class="lineno"> 7642</span> };</div><div class="line"><a name="l07643"></a><span class="lineno"> 7643</span> </div><div class="line"><a name="l07644"></a><span class="lineno"> 7644</span> <span class="comment">// Backport of std::index_sequence.</span></div><div class="line"><a name="l07645"></a><span class="lineno"> 7645</span> <span class="keyword">template</span> <<span class="keywordtype">size_t</span>... Is></div><div class="line"><a name="l07646"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_index_sequence.html"> 7646</a></span> <span class="keyword">struct </span><a class="code" href="structtesting_1_1internal_1_1_index_sequence.html">IndexSequence</a> {</div><div class="line"><a name="l07647"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_index_sequence.html#a89bb13a7b5d169b69659f395dcec2b2d"> 7647</a></span>  <span class="keyword">using</span> <a class="code" href="structtesting_1_1internal_1_1_index_sequence.html">type</a> = <a class="code" href="structtesting_1_1internal_1_1_index_sequence.html">IndexSequence</a>;</div><div class="line"><a name="l07648"></a><span class="lineno"> 7648</span> };</div><div class="line"><a name="l07649"></a><span class="lineno"> 7649</span> </div><div class="line"><a name="l07650"></a><span class="lineno"> 7650</span> <span class="comment">// Double the IndexSequence, and one if plus_one is true.</span></div><div class="line"><a name="l07651"></a><span class="lineno"> 7651</span> <span class="keyword">template</span> <<span class="keywordtype">bool</span> plus_one, <span class="keyword">typename</span> T, <span class="keywordtype">size_t</span> sizeofT></div><div class="line"><a name="l07652"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_double_sequence.html"> 7652</a></span> <span class="keyword">struct </span><a class="code" href="structtesting_1_1internal_1_1_double_sequence.html">DoubleSequence</a>;</div><div class="line"><a name="l07653"></a><span class="lineno"> 7653</span> <span class="keyword">template</span> <<span class="keywordtype">size_t</span>... I, <span class="keywordtype">size_t</span> sizeofT></div><div class="line"><a name="l07654"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_double_sequence_3_01true_00_01_index_sequence_3_01_i_8_8_8_01_4_00_01sizeof_t_01_4.html"> 7654</a></span> <span class="keyword">struct </span><a class="code" href="structtesting_1_1internal_1_1_double_sequence.html">DoubleSequence</a><true, <a class="code" href="structtesting_1_1internal_1_1_index_sequence.html">IndexSequence</a><I...>, sizeofT> {</div><div class="line"><a name="l07655"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_double_sequence_3_01true_00_01_index_sequence_3_01_i_8_8_8_01_4_00_01sizeof_t_01_4.html#a6f0fbcc14f5264c7db52f3ba3e264545"> 7655</a></span>  <span class="keyword">using</span> <a class="code" href="structtesting_1_1internal_1_1_index_sequence.html">type</a> = <a class="code" href="structtesting_1_1internal_1_1_index_sequence.html">IndexSequence</a><I..., (sizeofT + I)..., 2 * sizeofT>;</div><div class="line"><a name="l07656"></a><span class="lineno"> 7656</span> };</div><div class="line"><a name="l07657"></a><span class="lineno"> 7657</span> <span class="keyword">template</span> <<span class="keywordtype">size_t</span>... I, <span class="keywordtype">size_t</span> sizeofT></div><div class="line"><a name="l07658"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_double_sequence_3_01false_00_01_index_sequence_3_01_i_8_8_8_01_4_00_01sizeof_t_01_4.html"> 7658</a></span> <span class="keyword">struct </span><a class="code" href="structtesting_1_1internal_1_1_double_sequence.html">DoubleSequence</a><false, <a class="code" href="structtesting_1_1internal_1_1_index_sequence.html">IndexSequence</a><I...>, sizeofT> {</div><div class="line"><a name="l07659"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_double_sequence_3_01false_00_01_index_sequence_3_01_i_8_8_8_01_4_00_01sizeof_t_01_4.html#af11568320fe19e984e2eb5ab9ad026aa"> 7659</a></span>  <span class="keyword">using</span> <a class="code" href="structtesting_1_1internal_1_1_index_sequence.html">type</a> = <a class="code" href="structtesting_1_1internal_1_1_index_sequence.html">IndexSequence</a><I..., (sizeofT + I)...>;</div><div class="line"><a name="l07660"></a><span class="lineno"> 7660</span> };</div><div class="line"><a name="l07661"></a><span class="lineno"> 7661</span> </div><div class="line"><a name="l07662"></a><span class="lineno"> 7662</span> <span class="comment">// Backport of std::make_index_sequence.</span></div><div class="line"><a name="l07663"></a><span class="lineno"> 7663</span> <span class="comment">// It uses O(ln(N)) instantiation depth.</span></div><div class="line"><a name="l07664"></a><span class="lineno"> 7664</span> <span class="keyword">template</span> <<span class="keywordtype">size_t</span> N></div><div class="line"><a name="l07665"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_make_index_sequence.html"> 7665</a></span> <span class="keyword">struct </span><a class="code" href="structtesting_1_1internal_1_1_make_index_sequence.html">MakeIndexSequence</a></div><div class="line"><a name="l07666"></a><span class="lineno"> 7666</span>  : <a class="code" href="structtesting_1_1internal_1_1_double_sequence.html">DoubleSequence</a><N % 2 == 1, typename MakeIndexSequence<N / 2>::type,</div><div class="line"><a name="l07667"></a><span class="lineno"> 7667</span>  N / 2>::type {};</div><div class="line"><a name="l07668"></a><span class="lineno"> 7668</span> </div><div class="line"><a name="l07669"></a><span class="lineno"> 7669</span> <span class="keyword">template</span> <></div><div class="line"><a name="l07670"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_make_index_sequence_3_010_01_4.html"> 7670</a></span> <span class="keyword">struct </span><a class="code" href="structtesting_1_1internal_1_1_make_index_sequence.html">MakeIndexSequence</a><0> : <a class="code" href="structtesting_1_1internal_1_1_index_sequence.html">IndexSequence</a><> {};</div><div class="line"><a name="l07671"></a><span class="lineno"> 7671</span> </div><div class="line"><a name="l07672"></a><span class="lineno"> 7672</span> <span class="comment">// FIXME: This implementation of ElemFromList is O(1) in instantiation depth,</span></div><div class="line"><a name="l07673"></a><span class="lineno"> 7673</span> <span class="comment">// but it is O(N^2) in total instantiations. Not sure if this is the best</span></div><div class="line"><a name="l07674"></a><span class="lineno"> 7674</span> <span class="comment">// tradeoff, as it will make it somewhat slow to compile.</span></div><div class="line"><a name="l07675"></a><span class="lineno"> 7675</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T, <span class="keywordtype">size_t</span>, <span class="keywordtype">size_t</span>></div><div class="line"><a name="l07676"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_elem_from_list_impl.html"> 7676</a></span> <span class="keyword">struct </span><a class="code" href="structtesting_1_1internal_1_1_elem_from_list_impl.html">ElemFromListImpl</a> {};</div><div class="line"><a name="l07677"></a><span class="lineno"> 7677</span> </div><div class="line"><a name="l07678"></a><span class="lineno"> 7678</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T, <span class="keywordtype">size_t</span> I></div><div class="line"><a name="l07679"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_elem_from_list_impl_3_01_t_00_01_i_00_01_i_01_4.html"> 7679</a></span> <span class="keyword">struct </span><a class="code" href="structtesting_1_1internal_1_1_elem_from_list_impl.html">ElemFromListImpl</a><T, I, I> {</div><div class="line"><a name="l07680"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_elem_from_list_impl_3_01_t_00_01_i_00_01_i_01_4.html#ab1552e339cc1ff1e0aa448d684ffaf39"> 7680</a></span>  <span class="keyword">using</span> <a class="code" href="structtesting_1_1internal_1_1_elem_from_list_impl_3_01_t_00_01_i_00_01_i_01_4.html#ab1552e339cc1ff1e0aa448d684ffaf39">type</a> = T;</div><div class="line"><a name="l07681"></a><span class="lineno"> 7681</span> };</div><div class="line"><a name="l07682"></a><span class="lineno"> 7682</span> </div><div class="line"><a name="l07683"></a><span class="lineno"> 7683</span> <span class="comment">// Get the Nth element from T...</span></div><div class="line"><a name="l07684"></a><span class="lineno"> 7684</span> <span class="comment">// It uses O(1) instantiation depth.</span></div><div class="line"><a name="l07685"></a><span class="lineno"> 7685</span> <span class="keyword">template</span> <<span class="keywordtype">size_t</span> N, <span class="keyword">typename</span> I, <span class="keyword">typename</span>... T></div><div class="line"><a name="l07686"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_elem_from_list.html"> 7686</a></span> <span class="keyword">struct </span><a class="code" href="structtesting_1_1internal_1_1_elem_from_list.html">ElemFromList</a>;</div><div class="line"><a name="l07687"></a><span class="lineno"> 7687</span> </div><div class="line"><a name="l07688"></a><span class="lineno"> 7688</span> <span class="keyword">template</span> <<span class="keywordtype">size_t</span> N, <span class="keywordtype">size_t</span>... I, <span class="keyword">typename</span>... T></div><div class="line"><a name="l07689"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_elem_from_list_3_01_n_00_01_index_sequence_3_01_i_8_8_8_01_4_00_01_t_8_8_8_01_4.html"> 7689</a></span> <span class="keyword">struct </span><a class="code" href="structtesting_1_1internal_1_1_elem_from_list.html">ElemFromList</a><N, <a class="code" href="structtesting_1_1internal_1_1_index_sequence.html">IndexSequence</a><I...>, T...></div><div class="line"><a name="l07690"></a><span class="lineno"> 7690</span>  : <a class="code" href="structtesting_1_1internal_1_1_elem_from_list_impl.html">ElemFromListImpl</a><T, N, I>... {};</div><div class="line"><a name="l07691"></a><span class="lineno"> 7691</span> </div><div class="line"><a name="l07692"></a><span class="lineno"> 7692</span> <span class="keyword">template</span> <<span class="keyword">typename</span>... T></div><div class="line"><a name="l07693"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_flat_tuple.html"> 7693</a></span> <span class="keyword">class </span><a class="code" href="classtesting_1_1internal_1_1_flat_tuple.html">FlatTuple</a>;</div><div class="line"><a name="l07694"></a><span class="lineno"> 7694</span> </div><div class="line"><a name="l07695"></a><span class="lineno"> 7695</span> <span class="keyword">template</span> <<span class="keyword">typename</span> Derived, <span class="keywordtype">size_t</span> I></div><div class="line"><a name="l07696"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_flat_tuple_elem_base.html"> 7696</a></span> <span class="keyword">struct </span><a class="code" href="structtesting_1_1internal_1_1_flat_tuple_elem_base.html">FlatTupleElemBase</a>;</div><div class="line"><a name="l07697"></a><span class="lineno"> 7697</span> </div><div class="line"><a name="l07698"></a><span class="lineno"> 7698</span> <span class="keyword">template</span> <<span class="keyword">typename</span>... T, <span class="keywordtype">size_t</span> I></div><div class="line"><a name="l07699"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_flat_tuple_elem_base_3_01_flat_tuple_3_01_t_8_8_8_01_4_00_01_i_01_4.html"> 7699</a></span> <span class="keyword">struct </span><a class="code" href="structtesting_1_1internal_1_1_flat_tuple_elem_base.html">FlatTupleElemBase</a><<a class="code" href="classtesting_1_1internal_1_1_flat_tuple.html">FlatTuple</a><T...>, I> {</div><div class="line"><a name="l07700"></a><span class="lineno"> 7700</span>  <span class="keyword">using</span> <a class="code" href="structtesting_1_1internal_1_1_flat_tuple_elem_base_3_01_flat_tuple_3_01_t_8_8_8_01_4_00_01_i_01_4.html#a6b87a445f87724f9363b348e6c697766">value_type</a> =</div><div class="line"><a name="l07701"></a><span class="lineno"> 7701</span>  <span class="keyword">typename</span> <a class="code" href="structtesting_1_1internal_1_1_elem_from_list.html">ElemFromList</a><I, <span class="keyword">typename</span> <a class="code" href="structtesting_1_1internal_1_1_make_index_sequence.html">MakeIndexSequence</a><<span class="keyword">sizeof</span>...(T)>::type,</div><div class="line"><a name="l07702"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_flat_tuple_elem_base_3_01_flat_tuple_3_01_t_8_8_8_01_4_00_01_i_01_4.html#a6b87a445f87724f9363b348e6c697766"> 7702</a></span>  T...>::type;</div><div class="line"><a name="l07703"></a><span class="lineno"> 7703</span>  <a class="code" href="structtesting_1_1internal_1_1_flat_tuple_elem_base.html">FlatTupleElemBase</a>() = <span class="keywordflow">default</span>;</div><div class="line"><a name="l07704"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_flat_tuple_elem_base_3_01_flat_tuple_3_01_t_8_8_8_01_4_00_01_i_01_4.html#a153da382b00977dfb5974f85dd31ea58"> 7704</a></span>  <span class="keyword">explicit</span> <a class="code" href="structtesting_1_1internal_1_1_flat_tuple_elem_base_3_01_flat_tuple_3_01_t_8_8_8_01_4_00_01_i_01_4.html#a153da382b00977dfb5974f85dd31ea58">FlatTupleElemBase</a>(<a class="code" href="structtesting_1_1internal_1_1_flat_tuple_elem_base_3_01_flat_tuple_3_01_t_8_8_8_01_4_00_01_i_01_4.html#a6b87a445f87724f9363b348e6c697766">value_type</a> t) : value(std::move(t)) {}</div><div class="line"><a name="l07705"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_flat_tuple_elem_base_3_01_flat_tuple_3_01_t_8_8_8_01_4_00_01_i_01_4.html#ac175518e7807c0b49c0ba8c1c78269ec"> 7705</a></span>  <a class="code" href="structtesting_1_1internal_1_1_flat_tuple_elem_base_3_01_flat_tuple_3_01_t_8_8_8_01_4_00_01_i_01_4.html#a6b87a445f87724f9363b348e6c697766">value_type</a> <a class="code" href="structtesting_1_1internal_1_1_flat_tuple_elem_base_3_01_flat_tuple_3_01_t_8_8_8_01_4_00_01_i_01_4.html#ac175518e7807c0b49c0ba8c1c78269ec">value</a>;</div><div class="line"><a name="l07706"></a><span class="lineno"> 7706</span> };</div><div class="line"><a name="l07707"></a><span class="lineno"> 7707</span> </div><div class="line"><a name="l07708"></a><span class="lineno"> 7708</span> <span class="keyword">template</span> <<span class="keyword">typename</span> Derived, <span class="keyword">typename</span> Idx></div><div class="line"><a name="l07709"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_flat_tuple_base.html"> 7709</a></span> <span class="keyword">struct </span><a class="code" href="structtesting_1_1internal_1_1_flat_tuple_base.html">FlatTupleBase</a>;</div><div class="line"><a name="l07710"></a><span class="lineno"> 7710</span> </div><div class="line"><a name="l07711"></a><span class="lineno"> 7711</span> <span class="keyword">template</span> <<span class="keywordtype">size_t</span>... Idx, <span class="keyword">typename</span>... T></div><div class="line"><a name="l07712"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_flat_tuple_base_3_01_flat_tuple_3_01_t_8_8_8_01_4_00_01_index_sequence_3_01_idx_8_8_8_01_4_01_4.html"> 7712</a></span> <span class="keyword">struct </span><a class="code" href="structtesting_1_1internal_1_1_flat_tuple_base.html">FlatTupleBase</a><<a class="code" href="classtesting_1_1internal_1_1_flat_tuple.html">FlatTuple</a><T...>, <a class="code" href="structtesting_1_1internal_1_1_index_sequence.html">IndexSequence</a><Idx...>></div><div class="line"><a name="l07713"></a><span class="lineno"> 7713</span>  : <a class="code" href="structtesting_1_1internal_1_1_flat_tuple_elem_base.html">FlatTupleElemBase</a><FlatTuple<T...>, Idx>... {</div><div class="line"><a name="l07714"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_flat_tuple_base_3_01_flat_tuple_3_01_t_8_8_8_01_4_00_01_index_sequence_3_01_idx_8_8_8_01_4_01_4.html#ada1941ebde1ec1c844b72970e0ccb304"> 7714</a></span>  <span class="keyword">using</span> <a class="code" href="structtesting_1_1internal_1_1_index_sequence.html">Indices</a> = <a class="code" href="structtesting_1_1internal_1_1_index_sequence.html">IndexSequence</a><Idx...>;</div><div class="line"><a name="l07715"></a><span class="lineno"> 7715</span>  <a class="code" href="structtesting_1_1internal_1_1_flat_tuple_base.html">FlatTupleBase</a>() = <span class="keywordflow">default</span>;</div><div class="line"><a name="l07716"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_flat_tuple_base_3_01_flat_tuple_3_01_t_8_8_8_01_4_00_01_index_sequence_3_01_idx_8_8_8_01_4_01_4.html#ac515eec5c0647748bf8fa4ff553c706e"> 7716</a></span>  <span class="keyword">explicit</span> <a class="code" href="structtesting_1_1internal_1_1_flat_tuple_base_3_01_flat_tuple_3_01_t_8_8_8_01_4_00_01_index_sequence_3_01_idx_8_8_8_01_4_01_4.html#ac515eec5c0647748bf8fa4ff553c706e">FlatTupleBase</a>(T... t)</div><div class="line"><a name="l07717"></a><span class="lineno"> 7717</span>  : <a class="code" href="structtesting_1_1internal_1_1_flat_tuple_elem_base.html">FlatTupleElemBase</a><<a class="code" href="classtesting_1_1internal_1_1_flat_tuple.html">FlatTuple</a><T...>, Idx>(std::move(t))... {}</div><div class="line"><a name="l07718"></a><span class="lineno"> 7718</span> };</div><div class="line"><a name="l07719"></a><span class="lineno"> 7719</span> </div><div class="line"><a name="l07720"></a><span class="lineno"> 7720</span> <span class="comment">// Analog to std::tuple but with different tradeoffs.</span></div><div class="line"><a name="l07721"></a><span class="lineno"> 7721</span> <span class="comment">// This class minimizes the template instantiation depth, thus allowing more</span></div><div class="line"><a name="l07722"></a><span class="lineno"> 7722</span> <span class="comment">// elements that std::tuple would. std::tuple has been seen to require an</span></div><div class="line"><a name="l07723"></a><span class="lineno"> 7723</span> <span class="comment">// instantiation depth of more than 10x the number of elements in some</span></div><div class="line"><a name="l07724"></a><span class="lineno"> 7724</span> <span class="comment">// implementations.</span></div><div class="line"><a name="l07725"></a><span class="lineno"> 7725</span> <span class="comment">// FlatTuple and ElemFromList are not recursive and have a fixed depth</span></div><div class="line"><a name="l07726"></a><span class="lineno"> 7726</span> <span class="comment">// regardless of T...</span></div><div class="line"><a name="l07727"></a><span class="lineno"> 7727</span> <span class="comment">// MakeIndexSequence, on the other hand, it is recursive but with an</span></div><div class="line"><a name="l07728"></a><span class="lineno"> 7728</span> <span class="comment">// instantiation depth of O(ln(N)).</span></div><div class="line"><a name="l07729"></a><span class="lineno"> 7729</span> <span class="keyword">template</span> <<span class="keyword">typename</span>... T></div><div class="line"><a name="l07730"></a><span class="lineno"> 7730</span> <span class="keyword">class </span>FlatTuple</div><div class="line"><a name="l07731"></a><span class="lineno"> 7731</span>  : <span class="keyword">private</span> FlatTupleBase<FlatTuple<T...>,</div><div class="line"><a name="l07732"></a><span class="lineno"> 7732</span>  typename MakeIndexSequence<sizeof...(T)>::type> {</div><div class="line"><a name="l07733"></a><span class="lineno"> 7733</span>  <span class="keyword">using</span> Indices = <span class="keyword">typename</span> FlatTuple::FlatTupleBase::Indices;</div><div class="line"><a name="l07734"></a><span class="lineno"> 7734</span> </div><div class="line"><a name="l07735"></a><span class="lineno"> 7735</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l07736"></a><span class="lineno"> 7736</span>  <a class="code" href="classtesting_1_1internal_1_1_flat_tuple.html#a056c58b5dd85f470ec5db1db9956c702">FlatTuple</a>() = <span class="keywordflow">default</span>;</div><div class="line"><a name="l07737"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_flat_tuple.html#a611d01b9ff2437e4b9cfe3bbedc6d6ae"> 7737</a></span>  <span class="keyword">explicit</span> <a class="code" href="classtesting_1_1internal_1_1_flat_tuple.html#a611d01b9ff2437e4b9cfe3bbedc6d6ae">FlatTuple</a>(T... t) : <a class="code" href="classtesting_1_1internal_1_1_flat_tuple.html">FlatTuple</a>::<a class="code" href="structtesting_1_1internal_1_1_flat_tuple_base.html">FlatTupleBase</a>(std::move(t)...) {}</div><div class="line"><a name="l07738"></a><span class="lineno"> 7738</span> </div><div class="line"><a name="l07739"></a><span class="lineno"> 7739</span>  <span class="keyword">template</span> <<span class="keywordtype">size_t</span> I></div><div class="line"><a name="l07740"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_flat_tuple.html#a9ea6508fa6413ceca5e38b8077c67938"> 7740</a></span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="structtesting_1_1internal_1_1_elem_from_list.html">ElemFromList</a><I, Indices, T...>::type& <a class="code" href="classtesting_1_1internal_1_1_flat_tuple.html#a9ea6508fa6413ceca5e38b8077c67938">Get</a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l07741"></a><span class="lineno"> 7741</span>  <span class="keywordflow">return</span> <span class="keyword">static_cast<</span><span class="keyword">const </span><a class="code" href="structtesting_1_1internal_1_1_flat_tuple_elem_base.html">FlatTupleElemBase<FlatTuple, I></a>*<span class="keyword">></span>(<span class="keyword">this</span>)->value;</div><div class="line"><a name="l07742"></a><span class="lineno"> 7742</span>  }</div><div class="line"><a name="l07743"></a><span class="lineno"> 7743</span> </div><div class="line"><a name="l07744"></a><span class="lineno"> 7744</span>  <span class="keyword">template</span> <<span class="keywordtype">size_t</span> I></div><div class="line"><a name="l07745"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_flat_tuple.html#a48a13560f8963f727d81a7922e3b3e50"> 7745</a></span>  <span class="keyword">typename</span> <a class="code" href="structtesting_1_1internal_1_1_elem_from_list.html">ElemFromList</a><I, Indices, T...>::type& <a class="code" href="classtesting_1_1internal_1_1_flat_tuple.html#a48a13560f8963f727d81a7922e3b3e50">Get</a>() {</div><div class="line"><a name="l07746"></a><span class="lineno"> 7746</span>  <span class="keywordflow">return</span> <span class="keyword">static_cast<</span><a class="code" href="structtesting_1_1internal_1_1_flat_tuple_elem_base.html">FlatTupleElemBase<FlatTuple, I></a>*<span class="keyword">></span>(<span class="keyword">this</span>)->value;</div><div class="line"><a name="l07747"></a><span class="lineno"> 7747</span>  }</div><div class="line"><a name="l07748"></a><span class="lineno"> 7748</span> };</div><div class="line"><a name="l07749"></a><span class="lineno"> 7749</span> </div><div class="line"><a name="l07750"></a><span class="lineno"> 7750</span> } <span class="comment">// namespace internal</span></div><div class="line"><a name="l07751"></a><span class="lineno"> 7751</span> } <span class="comment">// namespace testing</span></div><div class="line"><a name="l07752"></a><span class="lineno"> 7752</span> </div><div class="line"><a name="l07753"></a><span class="lineno"><a class="line" href="gtest_8h.html#a8d70025c45a47a493780746dfd66d565"> 7753</a></span> <span class="preprocessor">#define GTEST_MESSAGE_AT_(file, line, message, result_type) \</span></div><div class="line"><a name="l07754"></a><span class="lineno"> 7754</span> <span class="preprocessor"> ::testing::internal::AssertHelper(result_type, file, line, message) \</span></div><div class="line"><a name="l07755"></a><span class="lineno"> 7755</span> <span class="preprocessor"> = ::testing::Message()</span></div><div class="line"><a name="l07756"></a><span class="lineno"> 7756</span> </div><div class="line"><a name="l07757"></a><span class="lineno"><a class="line" href="gtest_8h.html#a94c73d5368ec946bc354d0992ad00810"> 7757</a></span> <span class="preprocessor">#define GTEST_MESSAGE_(message, result_type) \</span></div><div class="line"><a name="l07758"></a><span class="lineno"> 7758</span> <span class="preprocessor"> GTEST_MESSAGE_AT_(__FILE__, __LINE__, message, result_type)</span></div><div class="line"><a name="l07759"></a><span class="lineno"> 7759</span> </div><div class="line"><a name="l07760"></a><span class="lineno"><a class="line" href="gtest_8h.html#a0f9a4c3ea82cc7bf4478eaffdc168358"> 7760</a></span> <span class="preprocessor">#define GTEST_FATAL_FAILURE_(message) \</span></div><div class="line"><a name="l07761"></a><span class="lineno"> 7761</span> <span class="preprocessor"> return GTEST_MESSAGE_(message, ::testing::TestPartResult::kFatalFailure)</span></div><div class="line"><a name="l07762"></a><span class="lineno"> 7762</span> </div><div class="line"><a name="l07763"></a><span class="lineno"><a class="line" href="gtest_8h.html#a6cb7482cfa03661a91c698eb5895f642"> 7763</a></span> <span class="preprocessor">#define GTEST_NONFATAL_FAILURE_(message) \</span></div><div class="line"><a name="l07764"></a><span class="lineno"> 7764</span> <span class="preprocessor"> GTEST_MESSAGE_(message, ::testing::TestPartResult::kNonFatalFailure)</span></div><div class="line"><a name="l07765"></a><span class="lineno"> 7765</span> </div><div class="line"><a name="l07766"></a><span class="lineno"><a class="line" href="gtest_8h.html#abe012b550eb3807e8c49f7e161bd1567"> 7766</a></span> <span class="preprocessor">#define GTEST_SUCCESS_(message) \</span></div><div class="line"><a name="l07767"></a><span class="lineno"> 7767</span> <span class="preprocessor"> GTEST_MESSAGE_(message, ::testing::TestPartResult::kSuccess)</span></div><div class="line"><a name="l07768"></a><span class="lineno"> 7768</span> </div><div class="line"><a name="l07769"></a><span class="lineno"><a class="line" href="gtest_8h.html#ab75ed7a6cd9e466944ce680c1c07ab47"> 7769</a></span> <span class="preprocessor">#define GTEST_SKIP_(message) \</span></div><div class="line"><a name="l07770"></a><span class="lineno"> 7770</span> <span class="preprocessor"> return GTEST_MESSAGE_(message, ::testing::TestPartResult::kSkip)</span></div><div class="line"><a name="l07771"></a><span class="lineno"> 7771</span> </div><div class="line"><a name="l07772"></a><span class="lineno"> 7772</span> <span class="comment">// Suppress MSVC warning 4072 (unreachable code) for the code following</span></div><div class="line"><a name="l07773"></a><span class="lineno"> 7773</span> <span class="comment">// statement if it returns or throws (or doesn't return or throw in some</span></div><div class="line"><a name="l07774"></a><span class="lineno"> 7774</span> <span class="comment">// situations).</span></div><div class="line"><a name="l07775"></a><span class="lineno"><a class="line" href="gtest_8h.html#a2e66f7dfc5cb87e0fa0289f653173c69"> 7775</a></span> <span class="preprocessor">#define GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement) \</span></div><div class="line"><a name="l07776"></a><span class="lineno"> 7776</span> <span class="preprocessor"> if (::testing::internal::AlwaysTrue()) { statement; }</span></div><div class="line"><a name="l07777"></a><span class="lineno"> 7777</span> </div><div class="line"><a name="l07778"></a><span class="lineno"><a class="line" href="gtest_8h.html#a3f71db93eaf30b0cfca9612b9ac32106"> 7778</a></span> <span class="preprocessor">#define GTEST_TEST_THROW_(statement, expected_exception, fail) \</span></div><div class="line"><a name="l07779"></a><span class="lineno"> 7779</span> <span class="preprocessor"> GTEST_AMBIGUOUS_ELSE_BLOCKER_ \</span></div><div class="line"><a name="l07780"></a><span class="lineno"> 7780</span> <span class="preprocessor"> if (::testing::internal::ConstCharPtr gtest_msg = "") { \</span></div><div class="line"><a name="l07781"></a><span class="lineno"> 7781</span> <span class="preprocessor"> bool gtest_caught_expected = false; \</span></div><div class="line"><a name="l07782"></a><span class="lineno"> 7782</span> <span class="preprocessor"> try { \</span></div><div class="line"><a name="l07783"></a><span class="lineno"> 7783</span> <span class="preprocessor"> GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \</span></div><div class="line"><a name="l07784"></a><span class="lineno"> 7784</span> <span class="preprocessor"> } \</span></div><div class="line"><a name="l07785"></a><span class="lineno"> 7785</span> <span class="preprocessor"> catch (expected_exception const&) { \</span></div><div class="line"><a name="l07786"></a><span class="lineno"> 7786</span> <span class="preprocessor"> gtest_caught_expected = true; \</span></div><div class="line"><a name="l07787"></a><span class="lineno"> 7787</span> <span class="preprocessor"> } \</span></div><div class="line"><a name="l07788"></a><span class="lineno"> 7788</span> <span class="preprocessor"> catch (...) { \</span></div><div class="line"><a name="l07789"></a><span class="lineno"> 7789</span> <span class="preprocessor"> gtest_msg.value = \</span></div><div class="line"><a name="l07790"></a><span class="lineno"> 7790</span> <span class="preprocessor"> "Expected: " #statement " throws an exception of type " \</span></div><div class="line"><a name="l07791"></a><span class="lineno"> 7791</span> <span class="preprocessor"> #expected_exception ".\n Actual: it throws a different type."; \</span></div><div class="line"><a name="l07792"></a><span class="lineno"> 7792</span> <span class="preprocessor"> goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \</span></div><div class="line"><a name="l07793"></a><span class="lineno"> 7793</span> <span class="preprocessor"> } \</span></div><div class="line"><a name="l07794"></a><span class="lineno"> 7794</span> <span class="preprocessor"> if (!gtest_caught_expected) { \</span></div><div class="line"><a name="l07795"></a><span class="lineno"> 7795</span> <span class="preprocessor"> gtest_msg.value = \</span></div><div class="line"><a name="l07796"></a><span class="lineno"> 7796</span> <span class="preprocessor"> "Expected: " #statement " throws an exception of type " \</span></div><div class="line"><a name="l07797"></a><span class="lineno"> 7797</span> <span class="preprocessor"> #expected_exception ".\n Actual: it throws nothing."; \</span></div><div class="line"><a name="l07798"></a><span class="lineno"> 7798</span> <span class="preprocessor"> goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \</span></div><div class="line"><a name="l07799"></a><span class="lineno"> 7799</span> <span class="preprocessor"> } \</span></div><div class="line"><a name="l07800"></a><span class="lineno"> 7800</span> <span class="preprocessor"> } else \</span></div><div class="line"><a name="l07801"></a><span class="lineno"> 7801</span> <span class="preprocessor"> GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__): \</span></div><div class="line"><a name="l07802"></a><span class="lineno"> 7802</span> <span class="preprocessor"> fail(gtest_msg.value)</span></div><div class="line"><a name="l07803"></a><span class="lineno"> 7803</span> </div><div class="line"><a name="l07804"></a><span class="lineno"><a class="line" href="gtest_8h.html#a9a109d026b5a904646437d7570e13581"> 7804</a></span> <span class="preprocessor">#define GTEST_TEST_NO_THROW_(statement, fail) \</span></div><div class="line"><a name="l07805"></a><span class="lineno"> 7805</span> <span class="preprocessor"> GTEST_AMBIGUOUS_ELSE_BLOCKER_ \</span></div><div class="line"><a name="l07806"></a><span class="lineno"> 7806</span> <span class="preprocessor"> if (::testing::internal::AlwaysTrue()) { \</span></div><div class="line"><a name="l07807"></a><span class="lineno"> 7807</span> <span class="preprocessor"> try { \</span></div><div class="line"><a name="l07808"></a><span class="lineno"> 7808</span> <span class="preprocessor"> GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \</span></div><div class="line"><a name="l07809"></a><span class="lineno"> 7809</span> <span class="preprocessor"> } \</span></div><div class="line"><a name="l07810"></a><span class="lineno"> 7810</span> <span class="preprocessor"> catch (...) { \</span></div><div class="line"><a name="l07811"></a><span class="lineno"> 7811</span> <span class="preprocessor"> goto GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__); \</span></div><div class="line"><a name="l07812"></a><span class="lineno"> 7812</span> <span class="preprocessor"> } \</span></div><div class="line"><a name="l07813"></a><span class="lineno"> 7813</span> <span class="preprocessor"> } else \</span></div><div class="line"><a name="l07814"></a><span class="lineno"> 7814</span> <span class="preprocessor"> GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__): \</span></div><div class="line"><a name="l07815"></a><span class="lineno"> 7815</span> <span class="preprocessor"> fail("Expected: " #statement " doesn't throw an exception.\n" \</span></div><div class="line"><a name="l07816"></a><span class="lineno"> 7816</span> <span class="preprocessor"> " Actual: it throws.")</span></div><div class="line"><a name="l07817"></a><span class="lineno"> 7817</span> </div><div class="line"><a name="l07818"></a><span class="lineno"><a class="line" href="gtest_8h.html#af48bbd26d54d4afc5e4cef39b1c76ba3"> 7818</a></span> <span class="preprocessor">#define GTEST_TEST_ANY_THROW_(statement, fail) \</span></div><div class="line"><a name="l07819"></a><span class="lineno"> 7819</span> <span class="preprocessor"> GTEST_AMBIGUOUS_ELSE_BLOCKER_ \</span></div><div class="line"><a name="l07820"></a><span class="lineno"> 7820</span> <span class="preprocessor"> if (::testing::internal::AlwaysTrue()) { \</span></div><div class="line"><a name="l07821"></a><span class="lineno"> 7821</span> <span class="preprocessor"> bool gtest_caught_any = false; \</span></div><div class="line"><a name="l07822"></a><span class="lineno"> 7822</span> <span class="preprocessor"> try { \</span></div><div class="line"><a name="l07823"></a><span class="lineno"> 7823</span> <span class="preprocessor"> GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \</span></div><div class="line"><a name="l07824"></a><span class="lineno"> 7824</span> <span class="preprocessor"> } \</span></div><div class="line"><a name="l07825"></a><span class="lineno"> 7825</span> <span class="preprocessor"> catch (...) { \</span></div><div class="line"><a name="l07826"></a><span class="lineno"> 7826</span> <span class="preprocessor"> gtest_caught_any = true; \</span></div><div class="line"><a name="l07827"></a><span class="lineno"> 7827</span> <span class="preprocessor"> } \</span></div><div class="line"><a name="l07828"></a><span class="lineno"> 7828</span> <span class="preprocessor"> if (!gtest_caught_any) { \</span></div><div class="line"><a name="l07829"></a><span class="lineno"> 7829</span> <span class="preprocessor"> goto GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__); \</span></div><div class="line"><a name="l07830"></a><span class="lineno"> 7830</span> <span class="preprocessor"> } \</span></div><div class="line"><a name="l07831"></a><span class="lineno"> 7831</span> <span class="preprocessor"> } else \</span></div><div class="line"><a name="l07832"></a><span class="lineno"> 7832</span> <span class="preprocessor"> GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__): \</span></div><div class="line"><a name="l07833"></a><span class="lineno"> 7833</span> <span class="preprocessor"> fail("Expected: " #statement " throws an exception.\n" \</span></div><div class="line"><a name="l07834"></a><span class="lineno"> 7834</span> <span class="preprocessor"> " Actual: it doesn't.")</span></div><div class="line"><a name="l07835"></a><span class="lineno"> 7835</span> </div><div class="line"><a name="l07836"></a><span class="lineno"> 7836</span> </div><div class="line"><a name="l07837"></a><span class="lineno"> 7837</span> <span class="comment">// Implements Boolean test assertions such as EXPECT_TRUE. expression can be</span></div><div class="line"><a name="l07838"></a><span class="lineno"> 7838</span> <span class="comment">// either a boolean expression or an AssertionResult. text is a textual</span></div><div class="line"><a name="l07839"></a><span class="lineno"> 7839</span> <span class="comment">// represenation of expression as it was passed into the EXPECT_TRUE.</span></div><div class="line"><a name="l07840"></a><span class="lineno"><a class="line" href="gtest_8h.html#ae8912365e1d00a7a2bd248268c64aa1a"> 7840</a></span> <span class="preprocessor">#define GTEST_TEST_BOOLEAN_(expression, text, actual, expected, fail) \</span></div><div class="line"><a name="l07841"></a><span class="lineno"> 7841</span> <span class="preprocessor"> GTEST_AMBIGUOUS_ELSE_BLOCKER_ \</span></div><div class="line"><a name="l07842"></a><span class="lineno"> 7842</span> <span class="preprocessor"> if (const ::testing::AssertionResult gtest_ar_ = \</span></div><div class="line"><a name="l07843"></a><span class="lineno"> 7843</span> <span class="preprocessor"> ::testing::AssertionResult(expression)) \</span></div><div class="line"><a name="l07844"></a><span class="lineno"> 7844</span> <span class="preprocessor"> ; \</span></div><div class="line"><a name="l07845"></a><span class="lineno"> 7845</span> <span class="preprocessor"> else \</span></div><div class="line"><a name="l07846"></a><span class="lineno"> 7846</span> <span class="preprocessor"> fail(::testing::internal::GetBoolAssertionFailureMessage(\</span></div><div class="line"><a name="l07847"></a><span class="lineno"> 7847</span> <span class="preprocessor"> gtest_ar_, text, #actual, #expected).c_str())</span></div><div class="line"><a name="l07848"></a><span class="lineno"> 7848</span> </div><div class="line"><a name="l07849"></a><span class="lineno"><a class="line" href="gtest_8h.html#a1b37a3c446836d33040f3266a6236081"> 7849</a></span> <span class="preprocessor">#define GTEST_TEST_NO_FATAL_FAILURE_(statement, fail) \</span></div><div class="line"><a name="l07850"></a><span class="lineno"> 7850</span> <span class="preprocessor"> GTEST_AMBIGUOUS_ELSE_BLOCKER_ \</span></div><div class="line"><a name="l07851"></a><span class="lineno"> 7851</span> <span class="preprocessor"> if (::testing::internal::AlwaysTrue()) { \</span></div><div class="line"><a name="l07852"></a><span class="lineno"> 7852</span> <span class="preprocessor"> ::testing::internal::HasNewFatalFailureHelper gtest_fatal_failure_checker; \</span></div><div class="line"><a name="l07853"></a><span class="lineno"> 7853</span> <span class="preprocessor"> GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \</span></div><div class="line"><a name="l07854"></a><span class="lineno"> 7854</span> <span class="preprocessor"> if (gtest_fatal_failure_checker.has_new_fatal_failure()) { \</span></div><div class="line"><a name="l07855"></a><span class="lineno"> 7855</span> <span class="preprocessor"> goto GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__); \</span></div><div class="line"><a name="l07856"></a><span class="lineno"> 7856</span> <span class="preprocessor"> } \</span></div><div class="line"><a name="l07857"></a><span class="lineno"> 7857</span> <span class="preprocessor"> } else \</span></div><div class="line"><a name="l07858"></a><span class="lineno"> 7858</span> <span class="preprocessor"> GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__): \</span></div><div class="line"><a name="l07859"></a><span class="lineno"> 7859</span> <span class="preprocessor"> fail("Expected: " #statement " doesn't generate new fatal " \</span></div><div class="line"><a name="l07860"></a><span class="lineno"> 7860</span> <span class="preprocessor"> "failures in the current thread.\n" \</span></div><div class="line"><a name="l07861"></a><span class="lineno"> 7861</span> <span class="preprocessor"> " Actual: it does.")</span></div><div class="line"><a name="l07862"></a><span class="lineno"> 7862</span> </div><div class="line"><a name="l07863"></a><span class="lineno"> 7863</span> <span class="comment">// Expands to the name of the class that implements the given test.</span></div><div class="line"><a name="l07864"></a><span class="lineno"><a class="line" href="gtest_8h.html#ad4bc4ec847a06e7de981e81c9bb116cf"> 7864</a></span> <span class="preprocessor">#define GTEST_TEST_CLASS_NAME_(test_suite_name, test_name) \</span></div><div class="line"><a name="l07865"></a><span class="lineno"> 7865</span> <span class="preprocessor"> test_suite_name##_##test_name##_Test</span></div><div class="line"><a name="l07866"></a><span class="lineno"> 7866</span> </div><div class="line"><a name="l07867"></a><span class="lineno"> 7867</span> <span class="comment">// Helper macro for defining tests.</span></div><div class="line"><a name="l07868"></a><span class="lineno"><a class="line" href="gtest_8h.html#ab43103f7842de04474e362689f782a46"> 7868</a></span> <span class="preprocessor">#define GTEST_TEST_(test_suite_name, test_name, parent_class, parent_id) \</span></div><div class="line"><a name="l07869"></a><span class="lineno"> 7869</span> <span class="preprocessor"> class GTEST_TEST_CLASS_NAME_(test_suite_name, test_name) \</span></div><div class="line"><a name="l07870"></a><span class="lineno"> 7870</span> <span class="preprocessor"> : public parent_class { \</span></div><div class="line"><a name="l07871"></a><span class="lineno"> 7871</span> <span class="preprocessor"> public: \</span></div><div class="line"><a name="l07872"></a><span class="lineno"> 7872</span> <span class="preprocessor"> GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)() {} \</span></div><div class="line"><a name="l07873"></a><span class="lineno"> 7873</span> <span class="preprocessor"> \</span></div><div class="line"><a name="l07874"></a><span class="lineno"> 7874</span> <span class="preprocessor"> private: \</span></div><div class="line"><a name="l07875"></a><span class="lineno"> 7875</span> <span class="preprocessor"> virtual void TestBody(); \</span></div><div class="line"><a name="l07876"></a><span class="lineno"> 7876</span> <span class="preprocessor"> static ::testing::TestInfo* const test_info_ GTEST_ATTRIBUTE_UNUSED_; \</span></div><div class="line"><a name="l07877"></a><span class="lineno"> 7877</span> <span class="preprocessor"> GTEST_DISALLOW_COPY_AND_ASSIGN_(GTEST_TEST_CLASS_NAME_(test_suite_name, \</span></div><div class="line"><a name="l07878"></a><span class="lineno"> 7878</span> <span class="preprocessor"> test_name)); \</span></div><div class="line"><a name="l07879"></a><span class="lineno"> 7879</span> <span class="preprocessor"> }; \</span></div><div class="line"><a name="l07880"></a><span class="lineno"> 7880</span> <span class="preprocessor"> \</span></div><div class="line"><a name="l07881"></a><span class="lineno"> 7881</span> <span class="preprocessor"> ::testing::TestInfo* const GTEST_TEST_CLASS_NAME_(test_suite_name, \</span></div><div class="line"><a name="l07882"></a><span class="lineno"> 7882</span> <span class="preprocessor"> test_name)::test_info_ = \</span></div><div class="line"><a name="l07883"></a><span class="lineno"> 7883</span> <span class="preprocessor"> ::testing::internal::MakeAndRegisterTestInfo( \</span></div><div class="line"><a name="l07884"></a><span class="lineno"> 7884</span> <span class="preprocessor"> #test_suite_name, #test_name, nullptr, nullptr, \</span></div><div class="line"><a name="l07885"></a><span class="lineno"> 7885</span> <span class="preprocessor"> ::testing::internal::CodeLocation(__FILE__, __LINE__), (parent_id), \</span></div><div class="line"><a name="l07886"></a><span class="lineno"> 7886</span> <span class="preprocessor"> ::testing::internal::SuiteApiResolver< \</span></div><div class="line"><a name="l07887"></a><span class="lineno"> 7887</span> <span class="preprocessor"> parent_class>::GetSetUpCaseOrSuite(), \</span></div><div class="line"><a name="l07888"></a><span class="lineno"> 7888</span> <span class="preprocessor"> ::testing::internal::SuiteApiResolver< \</span></div><div class="line"><a name="l07889"></a><span class="lineno"> 7889</span> <span class="preprocessor"> parent_class>::GetTearDownCaseOrSuite(), \</span></div><div class="line"><a name="l07890"></a><span class="lineno"> 7890</span> <span class="preprocessor"> new ::testing::internal::TestFactoryImpl<GTEST_TEST_CLASS_NAME_( \</span></div><div class="line"><a name="l07891"></a><span class="lineno"> 7891</span> <span class="preprocessor"> test_suite_name, test_name)>); \</span></div><div class="line"><a name="l07892"></a><span class="lineno"> 7892</span> <span class="preprocessor"> void GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)::TestBody()</span></div><div class="line"><a name="l07893"></a><span class="lineno"> 7893</span> </div><div class="line"><a name="l07894"></a><span class="lineno"> 7894</span> <span class="comment">// Internal Macro to mark an API deprecated, for googletest usage only</span></div><div class="line"><a name="l07895"></a><span class="lineno"> 7895</span> <span class="comment">// Usage: class GTEST_INTERNAL_DEPRECATED(message) MyClass or</span></div><div class="line"><a name="l07896"></a><span class="lineno"> 7896</span> <span class="comment">// GTEST_INTERNAL_DEPRECATED(message) <return_type> myFunction(); Every usage of</span></div><div class="line"><a name="l07897"></a><span class="lineno"> 7897</span> <span class="comment">// a deprecated entity will trigger a warning when compiled with</span></div><div class="line"><a name="l07898"></a><span class="lineno"> 7898</span> <span class="comment">// `-Wdeprecated-declarations` option (clang, gcc, any __GNUC__ compiler).</span></div><div class="line"><a name="l07899"></a><span class="lineno"> 7899</span> <span class="comment">// For msvc /W3 option will need to be used</span></div><div class="line"><a name="l07900"></a><span class="lineno"> 7900</span> <span class="comment">// Note that for 'other' compilers this macro evaluates to nothing to prevent</span></div><div class="line"><a name="l07901"></a><span class="lineno"> 7901</span> <span class="comment">// compilations errors.</span></div><div class="line"><a name="l07902"></a><span class="lineno"> 7902</span> <span class="preprocessor">#if defined(_MSC_VER)</span></div><div class="line"><a name="l07903"></a><span class="lineno"> 7903</span> <span class="preprocessor">#define GTEST_INTERNAL_DEPRECATED(message) __declspec(deprecated(message))</span></div><div class="line"><a name="l07904"></a><span class="lineno"> 7904</span> <span class="preprocessor">#elif defined(__GNUC__)</span></div><div class="line"><a name="l07905"></a><span class="lineno"> 7905</span> <span class="preprocessor">#define GTEST_INTERNAL_DEPRECATED(message) __attribute__((deprecated(message)))</span></div><div class="line"><a name="l07906"></a><span class="lineno"> 7906</span> <span class="preprocessor">#else</span></div><div class="line"><a name="l07907"></a><span class="lineno"><a class="line" href="gtest_8h.html#a6aa594029905b65753d0e85f2db521ab"> 7907</a></span> <span class="preprocessor">#define GTEST_INTERNAL_DEPRECATED(message)</span></div><div class="line"><a name="l07908"></a><span class="lineno"> 7908</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l07909"></a><span class="lineno"> 7909</span> <span class="preprocessor">#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_</span></div><div class="line"><a name="l07910"></a><span class="lineno"> 7910</span> <span class="comment">// Copyright 2005, Google Inc.</span></div><div class="line"><a name="l07911"></a><span class="lineno"> 7911</span> <span class="comment">// All rights reserved.</span></div><div class="line"><a name="l07912"></a><span class="lineno"> 7912</span> <span class="comment">//</span></div><div class="line"><a name="l07913"></a><span class="lineno"> 7913</span> <span class="comment">// Redistribution and use in source and binary forms, with or without</span></div><div class="line"><a name="l07914"></a><span class="lineno"> 7914</span> <span class="comment">// modification, are permitted provided that the following conditions are</span></div><div class="line"><a name="l07915"></a><span class="lineno"> 7915</span> <span class="comment">// met:</span></div><div class="line"><a name="l07916"></a><span class="lineno"> 7916</span> <span class="comment">//</span></div><div class="line"><a name="l07917"></a><span class="lineno"> 7917</span> <span class="comment">// * Redistributions of source code must retain the above copyright</span></div><div class="line"><a name="l07918"></a><span class="lineno"> 7918</span> <span class="comment">// notice, this list of conditions and the following disclaimer.</span></div><div class="line"><a name="l07919"></a><span class="lineno"> 7919</span> <span class="comment">// * Redistributions in binary form must reproduce the above</span></div><div class="line"><a name="l07920"></a><span class="lineno"> 7920</span> <span class="comment">// copyright notice, this list of conditions and the following disclaimer</span></div><div class="line"><a name="l07921"></a><span class="lineno"> 7921</span> <span class="comment">// in the documentation and/or other materials provided with the</span></div><div class="line"><a name="l07922"></a><span class="lineno"> 7922</span> <span class="comment">// distribution.</span></div><div class="line"><a name="l07923"></a><span class="lineno"> 7923</span> <span class="comment">// * Neither the name of Google Inc. nor the names of its</span></div><div class="line"><a name="l07924"></a><span class="lineno"> 7924</span> <span class="comment">// contributors may be used to endorse or promote products derived from</span></div><div class="line"><a name="l07925"></a><span class="lineno"> 7925</span> <span class="comment">// this software without specific prior written permission.</span></div><div class="line"><a name="l07926"></a><span class="lineno"> 7926</span> <span class="comment">//</span></div><div class="line"><a name="l07927"></a><span class="lineno"> 7927</span> <span class="comment">// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS</span></div><div class="line"><a name="l07928"></a><span class="lineno"> 7928</span> <span class="comment">// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT</span></div><div class="line"><a name="l07929"></a><span class="lineno"> 7929</span> <span class="comment">// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR</span></div><div class="line"><a name="l07930"></a><span class="lineno"> 7930</span> <span class="comment">// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT</span></div><div class="line"><a name="l07931"></a><span class="lineno"> 7931</span> <span class="comment">// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,</span></div><div class="line"><a name="l07932"></a><span class="lineno"> 7932</span> <span class="comment">// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT</span></div><div class="line"><a name="l07933"></a><span class="lineno"> 7933</span> <span class="comment">// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,</span></div><div class="line"><a name="l07934"></a><span class="lineno"> 7934</span> <span class="comment">// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY</span></div><div class="line"><a name="l07935"></a><span class="lineno"> 7935</span> <span class="comment">// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</span></div><div class="line"><a name="l07936"></a><span class="lineno"> 7936</span> <span class="comment">// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE</span></div><div class="line"><a name="l07937"></a><span class="lineno"> 7937</span> <span class="comment">// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span></div><div class="line"><a name="l07938"></a><span class="lineno"> 7938</span> </div><div class="line"><a name="l07939"></a><span class="lineno"> 7939</span> <span class="comment">//</span></div><div class="line"><a name="l07940"></a><span class="lineno"> 7940</span> <span class="comment">// The Google C++ Testing and Mocking Framework (Google Test)</span></div><div class="line"><a name="l07941"></a><span class="lineno"> 7941</span> <span class="comment">//</span></div><div class="line"><a name="l07942"></a><span class="lineno"> 7942</span> <span class="comment">// This header file defines the public API for death tests. It is</span></div><div class="line"><a name="l07943"></a><span class="lineno"> 7943</span> <span class="comment">// #included by gtest.h so a user doesn't need to include this</span></div><div class="line"><a name="l07944"></a><span class="lineno"> 7944</span> <span class="comment">// directly.</span></div><div class="line"><a name="l07945"></a><span class="lineno"> 7945</span> <span class="comment">// GOOGLETEST_CM0001 DO NOT DELETE</span></div><div class="line"><a name="l07946"></a><span class="lineno"> 7946</span> </div><div class="line"><a name="l07947"></a><span class="lineno"> 7947</span> <span class="preprocessor">#ifndef GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_</span></div><div class="line"><a name="l07948"></a><span class="lineno"><a class="line" href="gtest_8h.html#a9be22723f67d5ad4d6d26214a84a19f9"> 7948</a></span> <span class="preprocessor">#define GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_</span></div><div class="line"><a name="l07949"></a><span class="lineno"> 7949</span> </div><div class="line"><a name="l07950"></a><span class="lineno"> 7950</span> <span class="comment">// Copyright 2005, Google Inc.</span></div><div class="line"><a name="l07951"></a><span class="lineno"> 7951</span> <span class="comment">// All rights reserved.</span></div><div class="line"><a name="l07952"></a><span class="lineno"> 7952</span> <span class="comment">//</span></div><div class="line"><a name="l07953"></a><span class="lineno"> 7953</span> <span class="comment">// Redistribution and use in source and binary forms, with or without</span></div><div class="line"><a name="l07954"></a><span class="lineno"> 7954</span> <span class="comment">// modification, are permitted provided that the following conditions are</span></div><div class="line"><a name="l07955"></a><span class="lineno"> 7955</span> <span class="comment">// met:</span></div><div class="line"><a name="l07956"></a><span class="lineno"> 7956</span> <span class="comment">//</span></div><div class="line"><a name="l07957"></a><span class="lineno"> 7957</span> <span class="comment">// * Redistributions of source code must retain the above copyright</span></div><div class="line"><a name="l07958"></a><span class="lineno"> 7958</span> <span class="comment">// notice, this list of conditions and the following disclaimer.</span></div><div class="line"><a name="l07959"></a><span class="lineno"> 7959</span> <span class="comment">// * Redistributions in binary form must reproduce the above</span></div><div class="line"><a name="l07960"></a><span class="lineno"> 7960</span> <span class="comment">// copyright notice, this list of conditions and the following disclaimer</span></div><div class="line"><a name="l07961"></a><span class="lineno"> 7961</span> <span class="comment">// in the documentation and/or other materials provided with the</span></div><div class="line"><a name="l07962"></a><span class="lineno"> 7962</span> <span class="comment">// distribution.</span></div><div class="line"><a name="l07963"></a><span class="lineno"> 7963</span> <span class="comment">// * Neither the name of Google Inc. nor the names of its</span></div><div class="line"><a name="l07964"></a><span class="lineno"> 7964</span> <span class="comment">// contributors may be used to endorse or promote products derived from</span></div><div class="line"><a name="l07965"></a><span class="lineno"> 7965</span> <span class="comment">// this software without specific prior written permission.</span></div><div class="line"><a name="l07966"></a><span class="lineno"> 7966</span> <span class="comment">//</span></div><div class="line"><a name="l07967"></a><span class="lineno"> 7967</span> <span class="comment">// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS</span></div><div class="line"><a name="l07968"></a><span class="lineno"> 7968</span> <span class="comment">// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT</span></div><div class="line"><a name="l07969"></a><span class="lineno"> 7969</span> <span class="comment">// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR</span></div><div class="line"><a name="l07970"></a><span class="lineno"> 7970</span> <span class="comment">// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT</span></div><div class="line"><a name="l07971"></a><span class="lineno"> 7971</span> <span class="comment">// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,</span></div><div class="line"><a name="l07972"></a><span class="lineno"> 7972</span> <span class="comment">// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT</span></div><div class="line"><a name="l07973"></a><span class="lineno"> 7973</span> <span class="comment">// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,</span></div><div class="line"><a name="l07974"></a><span class="lineno"> 7974</span> <span class="comment">// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY</span></div><div class="line"><a name="l07975"></a><span class="lineno"> 7975</span> <span class="comment">// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</span></div><div class="line"><a name="l07976"></a><span class="lineno"> 7976</span> <span class="comment">// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE</span></div><div class="line"><a name="l07977"></a><span class="lineno"> 7977</span> <span class="comment">// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span></div><div class="line"><a name="l07978"></a><span class="lineno"> 7978</span> <span class="comment">//</span></div><div class="line"><a name="l07979"></a><span class="lineno"> 7979</span> <span class="comment">// The Google C++ Testing and Mocking Framework (Google Test)</span></div><div class="line"><a name="l07980"></a><span class="lineno"> 7980</span> <span class="comment">//</span></div><div class="line"><a name="l07981"></a><span class="lineno"> 7981</span> <span class="comment">// This header file defines internal utilities needed for implementing</span></div><div class="line"><a name="l07982"></a><span class="lineno"> 7982</span> <span class="comment">// death tests. They are subject to change without notice.</span></div><div class="line"><a name="l07983"></a><span class="lineno"> 7983</span> <span class="comment">// GOOGLETEST_CM0001 DO NOT DELETE</span></div><div class="line"><a name="l07984"></a><span class="lineno"> 7984</span> </div><div class="line"><a name="l07985"></a><span class="lineno"> 7985</span> <span class="preprocessor">#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_</span></div><div class="line"><a name="l07986"></a><span class="lineno"><a class="line" href="gtest_8h.html#a83e03f206a1c53a656f7eac87c122d16"> 7986</a></span> <span class="preprocessor">#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_</span></div><div class="line"><a name="l07987"></a><span class="lineno"> 7987</span> </div><div class="line"><a name="l07988"></a><span class="lineno"> 7988</span> <span class="comment">// Copyright 2007, Google Inc.</span></div><div class="line"><a name="l07989"></a><span class="lineno"> 7989</span> <span class="comment">// All rights reserved.</span></div><div class="line"><a name="l07990"></a><span class="lineno"> 7990</span> <span class="comment">//</span></div><div class="line"><a name="l07991"></a><span class="lineno"> 7991</span> <span class="comment">// Redistribution and use in source and binary forms, with or without</span></div><div class="line"><a name="l07992"></a><span class="lineno"> 7992</span> <span class="comment">// modification, are permitted provided that the following conditions are</span></div><div class="line"><a name="l07993"></a><span class="lineno"> 7993</span> <span class="comment">// met:</span></div><div class="line"><a name="l07994"></a><span class="lineno"> 7994</span> <span class="comment">//</span></div><div class="line"><a name="l07995"></a><span class="lineno"> 7995</span> <span class="comment">// * Redistributions of source code must retain the above copyright</span></div><div class="line"><a name="l07996"></a><span class="lineno"> 7996</span> <span class="comment">// notice, this list of conditions and the following disclaimer.</span></div><div class="line"><a name="l07997"></a><span class="lineno"> 7997</span> <span class="comment">// * Redistributions in binary form must reproduce the above</span></div><div class="line"><a name="l07998"></a><span class="lineno"> 7998</span> <span class="comment">// copyright notice, this list of conditions and the following disclaimer</span></div><div class="line"><a name="l07999"></a><span class="lineno"> 7999</span> <span class="comment">// in the documentation and/or other materials provided with the</span></div><div class="line"><a name="l08000"></a><span class="lineno"> 8000</span> <span class="comment">// distribution.</span></div><div class="line"><a name="l08001"></a><span class="lineno"> 8001</span> <span class="comment">// * Neither the name of Google Inc. nor the names of its</span></div><div class="line"><a name="l08002"></a><span class="lineno"> 8002</span> <span class="comment">// contributors may be used to endorse or promote products derived from</span></div><div class="line"><a name="l08003"></a><span class="lineno"> 8003</span> <span class="comment">// this software without specific prior written permission.</span></div><div class="line"><a name="l08004"></a><span class="lineno"> 8004</span> <span class="comment">//</span></div><div class="line"><a name="l08005"></a><span class="lineno"> 8005</span> <span class="comment">// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS</span></div><div class="line"><a name="l08006"></a><span class="lineno"> 8006</span> <span class="comment">// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT</span></div><div class="line"><a name="l08007"></a><span class="lineno"> 8007</span> <span class="comment">// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR</span></div><div class="line"><a name="l08008"></a><span class="lineno"> 8008</span> <span class="comment">// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT</span></div><div class="line"><a name="l08009"></a><span class="lineno"> 8009</span> <span class="comment">// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,</span></div><div class="line"><a name="l08010"></a><span class="lineno"> 8010</span> <span class="comment">// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT</span></div><div class="line"><a name="l08011"></a><span class="lineno"> 8011</span> <span class="comment">// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,</span></div><div class="line"><a name="l08012"></a><span class="lineno"> 8012</span> <span class="comment">// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY</span></div><div class="line"><a name="l08013"></a><span class="lineno"> 8013</span> <span class="comment">// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</span></div><div class="line"><a name="l08014"></a><span class="lineno"> 8014</span> <span class="comment">// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE</span></div><div class="line"><a name="l08015"></a><span class="lineno"> 8015</span> <span class="comment">// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span></div><div class="line"><a name="l08016"></a><span class="lineno"> 8016</span> </div><div class="line"><a name="l08017"></a><span class="lineno"> 8017</span> <span class="comment">// The Google C++ Testing and Mocking Framework (Google Test)</span></div><div class="line"><a name="l08018"></a><span class="lineno"> 8018</span> <span class="comment">//</span></div><div class="line"><a name="l08019"></a><span class="lineno"> 8019</span> <span class="comment">// This file implements just enough of the matcher interface to allow</span></div><div class="line"><a name="l08020"></a><span class="lineno"> 8020</span> <span class="comment">// EXPECT_DEATH and friends to accept a matcher argument.</span></div><div class="line"><a name="l08021"></a><span class="lineno"> 8021</span> </div><div class="line"><a name="l08022"></a><span class="lineno"> 8022</span> <span class="comment">// IWYU pragma: private, include "testing/base/public/gunit.h"</span></div><div class="line"><a name="l08023"></a><span class="lineno"> 8023</span> <span class="comment">// IWYU pragma: friend third_party/googletest/googlemock/.*</span></div><div class="line"><a name="l08024"></a><span class="lineno"> 8024</span> <span class="comment">// IWYU pragma: friend third_party/googletest/googletest/.*</span></div><div class="line"><a name="l08025"></a><span class="lineno"> 8025</span> </div><div class="line"><a name="l08026"></a><span class="lineno"> 8026</span> <span class="preprocessor">#ifndef GTEST_INCLUDE_GTEST_GTEST_MATCHERS_H_</span></div><div class="line"><a name="l08027"></a><span class="lineno"><a class="line" href="gtest_8h.html#ac5d82b7725576c4a54ae99ce1cc861e0"> 8027</a></span> <span class="preprocessor">#define GTEST_INCLUDE_GTEST_GTEST_MATCHERS_H_</span></div><div class="line"><a name="l08028"></a><span class="lineno"> 8028</span> </div><div class="line"><a name="l08029"></a><span class="lineno"> 8029</span> <span class="preprocessor">#include <memory></span></div><div class="line"><a name="l08030"></a><span class="lineno"> 8030</span> <span class="preprocessor">#include <ostream></span></div><div class="line"><a name="l08031"></a><span class="lineno"> 8031</span> <span class="preprocessor">#include <string></span></div><div class="line"><a name="l08032"></a><span class="lineno"> 8032</span> </div><div class="line"><a name="l08033"></a><span class="lineno"> 8033</span> <span class="comment">// Copyright 2007, Google Inc.</span></div><div class="line"><a name="l08034"></a><span class="lineno"> 8034</span> <span class="comment">// All rights reserved.</span></div><div class="line"><a name="l08035"></a><span class="lineno"> 8035</span> <span class="comment">//</span></div><div class="line"><a name="l08036"></a><span class="lineno"> 8036</span> <span class="comment">// Redistribution and use in source and binary forms, with or without</span></div><div class="line"><a name="l08037"></a><span class="lineno"> 8037</span> <span class="comment">// modification, are permitted provided that the following conditions are</span></div><div class="line"><a name="l08038"></a><span class="lineno"> 8038</span> <span class="comment">// met:</span></div><div class="line"><a name="l08039"></a><span class="lineno"> 8039</span> <span class="comment">//</span></div><div class="line"><a name="l08040"></a><span class="lineno"> 8040</span> <span class="comment">// * Redistributions of source code must retain the above copyright</span></div><div class="line"><a name="l08041"></a><span class="lineno"> 8041</span> <span class="comment">// notice, this list of conditions and the following disclaimer.</span></div><div class="line"><a name="l08042"></a><span class="lineno"> 8042</span> <span class="comment">// * Redistributions in binary form must reproduce the above</span></div><div class="line"><a name="l08043"></a><span class="lineno"> 8043</span> <span class="comment">// copyright notice, this list of conditions and the following disclaimer</span></div><div class="line"><a name="l08044"></a><span class="lineno"> 8044</span> <span class="comment">// in the documentation and/or other materials provided with the</span></div><div class="line"><a name="l08045"></a><span class="lineno"> 8045</span> <span class="comment">// distribution.</span></div><div class="line"><a name="l08046"></a><span class="lineno"> 8046</span> <span class="comment">// * Neither the name of Google Inc. nor the names of its</span></div><div class="line"><a name="l08047"></a><span class="lineno"> 8047</span> <span class="comment">// contributors may be used to endorse or promote products derived from</span></div><div class="line"><a name="l08048"></a><span class="lineno"> 8048</span> <span class="comment">// this software without specific prior written permission.</span></div><div class="line"><a name="l08049"></a><span class="lineno"> 8049</span> <span class="comment">//</span></div><div class="line"><a name="l08050"></a><span class="lineno"> 8050</span> <span class="comment">// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS</span></div><div class="line"><a name="l08051"></a><span class="lineno"> 8051</span> <span class="comment">// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT</span></div><div class="line"><a name="l08052"></a><span class="lineno"> 8052</span> <span class="comment">// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR</span></div><div class="line"><a name="l08053"></a><span class="lineno"> 8053</span> <span class="comment">// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT</span></div><div class="line"><a name="l08054"></a><span class="lineno"> 8054</span> <span class="comment">// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,</span></div><div class="line"><a name="l08055"></a><span class="lineno"> 8055</span> <span class="comment">// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT</span></div><div class="line"><a name="l08056"></a><span class="lineno"> 8056</span> <span class="comment">// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,</span></div><div class="line"><a name="l08057"></a><span class="lineno"> 8057</span> <span class="comment">// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY</span></div><div class="line"><a name="l08058"></a><span class="lineno"> 8058</span> <span class="comment">// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</span></div><div class="line"><a name="l08059"></a><span class="lineno"> 8059</span> <span class="comment">// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE</span></div><div class="line"><a name="l08060"></a><span class="lineno"> 8060</span> <span class="comment">// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span></div><div class="line"><a name="l08061"></a><span class="lineno"> 8061</span> </div><div class="line"><a name="l08062"></a><span class="lineno"> 8062</span> </div><div class="line"><a name="l08063"></a><span class="lineno"> 8063</span> <span class="comment">// Google Test - The Google C++ Testing and Mocking Framework</span></div><div class="line"><a name="l08064"></a><span class="lineno"> 8064</span> <span class="comment">//</span></div><div class="line"><a name="l08065"></a><span class="lineno"> 8065</span> <span class="comment">// This file implements a universal value printer that can print a</span></div><div class="line"><a name="l08066"></a><span class="lineno"> 8066</span> <span class="comment">// value of any type T:</span></div><div class="line"><a name="l08067"></a><span class="lineno"> 8067</span> <span class="comment">//</span></div><div class="line"><a name="l08068"></a><span class="lineno"> 8068</span> <span class="comment">// void ::testing::internal::UniversalPrinter<T>::Print(value, ostream_ptr);</span></div><div class="line"><a name="l08069"></a><span class="lineno"> 8069</span> <span class="comment">//</span></div><div class="line"><a name="l08070"></a><span class="lineno"> 8070</span> <span class="comment">// A user can teach this function how to print a class type T by</span></div><div class="line"><a name="l08071"></a><span class="lineno"> 8071</span> <span class="comment">// defining either operator<<() or PrintTo() in the namespace that</span></div><div class="line"><a name="l08072"></a><span class="lineno"> 8072</span> <span class="comment">// defines T. More specifically, the FIRST defined function in the</span></div><div class="line"><a name="l08073"></a><span class="lineno"> 8073</span> <span class="comment">// following list will be used (assuming T is defined in namespace</span></div><div class="line"><a name="l08074"></a><span class="lineno"> 8074</span> <span class="comment">// foo):</span></div><div class="line"><a name="l08075"></a><span class="lineno"> 8075</span> <span class="comment">//</span></div><div class="line"><a name="l08076"></a><span class="lineno"> 8076</span> <span class="comment">// 1. foo::PrintTo(const T&, ostream*)</span></div><div class="line"><a name="l08077"></a><span class="lineno"> 8077</span> <span class="comment">// 2. operator<<(ostream&, const T&) defined in either foo or the</span></div><div class="line"><a name="l08078"></a><span class="lineno"> 8078</span> <span class="comment">// global namespace.</span></div><div class="line"><a name="l08079"></a><span class="lineno"> 8079</span> <span class="comment">//</span></div><div class="line"><a name="l08080"></a><span class="lineno"> 8080</span> <span class="comment">// However if T is an STL-style container then it is printed element-wise</span></div><div class="line"><a name="l08081"></a><span class="lineno"> 8081</span> <span class="comment">// unless foo::PrintTo(const T&, ostream*) is defined. Note that</span></div><div class="line"><a name="l08082"></a><span class="lineno"> 8082</span> <span class="comment">// operator<<() is ignored for container types.</span></div><div class="line"><a name="l08083"></a><span class="lineno"> 8083</span> <span class="comment">//</span></div><div class="line"><a name="l08084"></a><span class="lineno"> 8084</span> <span class="comment">// If none of the above is defined, it will print the debug string of</span></div><div class="line"><a name="l08085"></a><span class="lineno"> 8085</span> <span class="comment">// the value if it is a protocol buffer, or print the raw bytes in the</span></div><div class="line"><a name="l08086"></a><span class="lineno"> 8086</span> <span class="comment">// value otherwise.</span></div><div class="line"><a name="l08087"></a><span class="lineno"> 8087</span> <span class="comment">//</span></div><div class="line"><a name="l08088"></a><span class="lineno"> 8088</span> <span class="comment">// To aid debugging: when T is a reference type, the address of the</span></div><div class="line"><a name="l08089"></a><span class="lineno"> 8089</span> <span class="comment">// value is also printed; when T is a (const) char pointer, both the</span></div><div class="line"><a name="l08090"></a><span class="lineno"> 8090</span> <span class="comment">// pointer value and the NUL-terminated string it points to are</span></div><div class="line"><a name="l08091"></a><span class="lineno"> 8091</span> <span class="comment">// printed.</span></div><div class="line"><a name="l08092"></a><span class="lineno"> 8092</span> <span class="comment">//</span></div><div class="line"><a name="l08093"></a><span class="lineno"> 8093</span> <span class="comment">// We also provide some convenient wrappers:</span></div><div class="line"><a name="l08094"></a><span class="lineno"> 8094</span> <span class="comment">//</span></div><div class="line"><a name="l08095"></a><span class="lineno"> 8095</span> <span class="comment">// // Prints a value to a string. For a (const or not) char</span></div><div class="line"><a name="l08096"></a><span class="lineno"> 8096</span> <span class="comment">// // pointer, the NUL-terminated string (but not the pointer) is</span></div><div class="line"><a name="l08097"></a><span class="lineno"> 8097</span> <span class="comment">// // printed.</span></div><div class="line"><a name="l08098"></a><span class="lineno"> 8098</span> <span class="comment">// std::string ::testing::PrintToString(const T& value);</span></div><div class="line"><a name="l08099"></a><span class="lineno"> 8099</span> <span class="comment">//</span></div><div class="line"><a name="l08100"></a><span class="lineno"> 8100</span> <span class="comment">// // Prints a value tersely: for a reference type, the referenced</span></div><div class="line"><a name="l08101"></a><span class="lineno"> 8101</span> <span class="comment">// // value (but not the address) is printed; for a (const or not) char</span></div><div class="line"><a name="l08102"></a><span class="lineno"> 8102</span> <span class="comment">// // pointer, the NUL-terminated string (but not the pointer) is</span></div><div class="line"><a name="l08103"></a><span class="lineno"> 8103</span> <span class="comment">// // printed.</span></div><div class="line"><a name="l08104"></a><span class="lineno"> 8104</span> <span class="comment">// void ::testing::internal::UniversalTersePrint(const T& value, ostream*);</span></div><div class="line"><a name="l08105"></a><span class="lineno"> 8105</span> <span class="comment">//</span></div><div class="line"><a name="l08106"></a><span class="lineno"> 8106</span> <span class="comment">// // Prints value using the type inferred by the compiler. The difference</span></div><div class="line"><a name="l08107"></a><span class="lineno"> 8107</span> <span class="comment">// // from UniversalTersePrint() is that this function prints both the</span></div><div class="line"><a name="l08108"></a><span class="lineno"> 8108</span> <span class="comment">// // pointer and the NUL-terminated string for a (const or not) char pointer.</span></div><div class="line"><a name="l08109"></a><span class="lineno"> 8109</span> <span class="comment">// void ::testing::internal::UniversalPrint(const T& value, ostream*);</span></div><div class="line"><a name="l08110"></a><span class="lineno"> 8110</span> <span class="comment">//</span></div><div class="line"><a name="l08111"></a><span class="lineno"> 8111</span> <span class="comment">// // Prints the fields of a tuple tersely to a string vector, one</span></div><div class="line"><a name="l08112"></a><span class="lineno"> 8112</span> <span class="comment">// // element for each field. Tuple support must be enabled in</span></div><div class="line"><a name="l08113"></a><span class="lineno"> 8113</span> <span class="comment">// // gtest-port.h.</span></div><div class="line"><a name="l08114"></a><span class="lineno"> 8114</span> <span class="comment">// std::vector<string> UniversalTersePrintTupleFieldsToStrings(</span></div><div class="line"><a name="l08115"></a><span class="lineno"> 8115</span> <span class="comment">// const Tuple& value);</span></div><div class="line"><a name="l08116"></a><span class="lineno"> 8116</span> <span class="comment">//</span></div><div class="line"><a name="l08117"></a><span class="lineno"> 8117</span> <span class="comment">// Known limitation:</span></div><div class="line"><a name="l08118"></a><span class="lineno"> 8118</span> <span class="comment">//</span></div><div class="line"><a name="l08119"></a><span class="lineno"> 8119</span> <span class="comment">// The print primitives print the elements of an STL-style container</span></div><div class="line"><a name="l08120"></a><span class="lineno"> 8120</span> <span class="comment">// using the compiler-inferred type of *iter where iter is a</span></div><div class="line"><a name="l08121"></a><span class="lineno"> 8121</span> <span class="comment">// const_iterator of the container. When const_iterator is an input</span></div><div class="line"><a name="l08122"></a><span class="lineno"> 8122</span> <span class="comment">// iterator but not a forward iterator, this inferred type may not</span></div><div class="line"><a name="l08123"></a><span class="lineno"> 8123</span> <span class="comment">// match value_type, and the print output may be incorrect. In</span></div><div class="line"><a name="l08124"></a><span class="lineno"> 8124</span> <span class="comment">// practice, this is rarely a problem as for most containers</span></div><div class="line"><a name="l08125"></a><span class="lineno"> 8125</span> <span class="comment">// const_iterator is a forward iterator. We'll fix this if there's an</span></div><div class="line"><a name="l08126"></a><span class="lineno"> 8126</span> <span class="comment">// actual need for it. Note that this fix cannot rely on value_type</span></div><div class="line"><a name="l08127"></a><span class="lineno"> 8127</span> <span class="comment">// being defined as many user-defined container types don't have</span></div><div class="line"><a name="l08128"></a><span class="lineno"> 8128</span> <span class="comment">// value_type.</span></div><div class="line"><a name="l08129"></a><span class="lineno"> 8129</span> </div><div class="line"><a name="l08130"></a><span class="lineno"> 8130</span> <span class="comment">// GOOGLETEST_CM0001 DO NOT DELETE</span></div><div class="line"><a name="l08131"></a><span class="lineno"> 8131</span> </div><div class="line"><a name="l08132"></a><span class="lineno"> 8132</span> <span class="preprocessor">#ifndef GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_</span></div><div class="line"><a name="l08133"></a><span class="lineno"><a class="line" href="gtest_8h.html#a146e4a81159ecfdc33030e147a024346"> 8133</a></span> <span class="preprocessor">#define GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_</span></div><div class="line"><a name="l08134"></a><span class="lineno"> 8134</span> </div><div class="line"><a name="l08135"></a><span class="lineno"> 8135</span> <span class="preprocessor">#include <functional></span></div><div class="line"><a name="l08136"></a><span class="lineno"> 8136</span> <span class="preprocessor">#include <ostream></span> <span class="comment">// NOLINT</span></div><div class="line"><a name="l08137"></a><span class="lineno"> 8137</span> <span class="preprocessor">#include <sstream></span></div><div class="line"><a name="l08138"></a><span class="lineno"> 8138</span> <span class="preprocessor">#include <string></span></div><div class="line"><a name="l08139"></a><span class="lineno"> 8139</span> <span class="preprocessor">#include <tuple></span></div><div class="line"><a name="l08140"></a><span class="lineno"> 8140</span> <span class="preprocessor">#include <type_traits></span></div><div class="line"><a name="l08141"></a><span class="lineno"> 8141</span> <span class="preprocessor">#include <utility></span></div><div class="line"><a name="l08142"></a><span class="lineno"> 8142</span> <span class="preprocessor">#include <vector></span></div><div class="line"><a name="l08143"></a><span class="lineno"> 8143</span> </div><div class="line"><a name="l08144"></a><span class="lineno"> 8144</span> <span class="preprocessor">#if GTEST_HAS_ABSL</span></div><div class="line"><a name="l08145"></a><span class="lineno"> 8145</span> <span class="preprocessor">#include "absl/strings/string_view.h"</span></div><div class="line"><a name="l08146"></a><span class="lineno"> 8146</span> <span class="preprocessor">#include "absl/types/optional.h"</span></div><div class="line"><a name="l08147"></a><span class="lineno"> 8147</span> <span class="preprocessor">#include "absl/types/variant.h"</span></div><div class="line"><a name="l08148"></a><span class="lineno"> 8148</span> <span class="preprocessor">#endif // GTEST_HAS_ABSL</span></div><div class="line"><a name="l08149"></a><span class="lineno"> 8149</span> </div><div class="line"><a name="l08150"></a><span class="lineno"> 8150</span> <span class="keyword">namespace </span><a class="code" href="namespacetesting.html">testing</a> {</div><div class="line"><a name="l08151"></a><span class="lineno"> 8151</span> </div><div class="line"><a name="l08152"></a><span class="lineno"> 8152</span> <span class="comment">// Definitions in the 'internal' and 'internal2' name spaces are</span></div><div class="line"><a name="l08153"></a><span class="lineno"> 8153</span> <span class="comment">// subject to change without notice. DO NOT USE THEM IN USER CODE!</span></div><div class="line"><a name="l08154"></a><span class="lineno"> 8154</span> <span class="keyword">namespace </span>internal2 {</div><div class="line"><a name="l08155"></a><span class="lineno"> 8155</span> </div><div class="line"><a name="l08156"></a><span class="lineno"> 8156</span> <span class="comment">// Prints the given number of bytes in the given object to the given</span></div><div class="line"><a name="l08157"></a><span class="lineno"> 8157</span> <span class="comment">// ostream.</span></div><div class="line"><a name="l08158"></a><span class="lineno"> 8158</span> <a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> <span class="keywordtype">void</span> <a class="code" href="namespacetesting_1_1internal2.html#abfb9aa80365f93b952e9a4bea09947a8">PrintBytesInObjectTo</a>(<span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>* obj_bytes,</div><div class="line"><a name="l08159"></a><span class="lineno"> 8159</span>  <span class="keywordtype">size_t</span> <a class="code" href="namespaceutl_1_1meta.html#ab5508236016638fa8e6b97cd17dfc9c2">count</a>,</div><div class="line"><a name="l08160"></a><span class="lineno"> 8160</span>  ::std::ostream* os);</div><div class="line"><a name="l08161"></a><span class="lineno"> 8161</span> </div><div class="line"><a name="l08162"></a><span class="lineno"> 8162</span> <span class="comment">// For selecting which printer to use when a given type has neither <<</span></div><div class="line"><a name="l08163"></a><span class="lineno"> 8163</span> <span class="comment">// nor PrintTo().</span></div><div class="line"><a name="l08164"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal2.html#aeb8161b0b3ee503347b0662d7028fd57"> 8164</a></span> <span class="keyword">enum</span> <a class="code" href="namespacetesting_1_1internal2.html#aeb8161b0b3ee503347b0662d7028fd57">TypeKind</a> {</div><div class="line"><a name="l08165"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal2.html#aeb8161b0b3ee503347b0662d7028fd57a14aaf98a2547ecf43eef0868d54b1383"> 8165</a></span>  <a class="code" href="namespacetesting_1_1internal2.html#aeb8161b0b3ee503347b0662d7028fd57a14aaf98a2547ecf43eef0868d54b1383">kProtobuf</a>, <span class="comment">// a protobuf type</span></div><div class="line"><a name="l08166"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal2.html#aeb8161b0b3ee503347b0662d7028fd57a9bdcf3f1548f498b2b7f097306ea0224"> 8166</a></span>  <a class="code" href="namespacetesting_1_1internal2.html#aeb8161b0b3ee503347b0662d7028fd57a9bdcf3f1548f498b2b7f097306ea0224">kConvertibleToInteger</a>, <span class="comment">// a type implicitly convertible to BiggestInt</span></div><div class="line"><a name="l08167"></a><span class="lineno"> 8167</span>  <span class="comment">// (e.g. a named or unnamed enum type)</span></div><div class="line"><a name="l08168"></a><span class="lineno"> 8168</span> <span class="preprocessor">#if GTEST_HAS_ABSL</span></div><div class="line"><a name="l08169"></a><span class="lineno"> 8169</span>  kConvertibleToStringView, <span class="comment">// a type implicitly convertible to</span></div><div class="line"><a name="l08170"></a><span class="lineno"> 8170</span>  <span class="comment">// absl::string_view</span></div><div class="line"><a name="l08171"></a><span class="lineno"> 8171</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l08172"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal2.html#aeb8161b0b3ee503347b0662d7028fd57abe8aaea44751d6ebd0cdf5bd94451db1"> 8172</a></span>  <a class="code" href="namespacetesting_1_1internal2.html#aeb8161b0b3ee503347b0662d7028fd57abe8aaea44751d6ebd0cdf5bd94451db1">kOtherType</a> <span class="comment">// anything else</span></div><div class="line"><a name="l08173"></a><span class="lineno"> 8173</span> };</div><div class="line"><a name="l08174"></a><span class="lineno"> 8174</span> </div><div class="line"><a name="l08175"></a><span class="lineno"> 8175</span> <span class="comment">// TypeWithoutFormatter<T, kTypeKind>::PrintValue(value, os) is called</span></div><div class="line"><a name="l08176"></a><span class="lineno"> 8176</span> <span class="comment">// by the universal printer to print a value of type T when neither</span></div><div class="line"><a name="l08177"></a><span class="lineno"> 8177</span> <span class="comment">// operator<< nor PrintTo() is defined for T, where kTypeKind is the</span></div><div class="line"><a name="l08178"></a><span class="lineno"> 8178</span> <span class="comment">// "kind" of T as defined by enum TypeKind.</span></div><div class="line"><a name="l08179"></a><span class="lineno"> 8179</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T, TypeKind kTypeKind></div><div class="line"><a name="l08180"></a><span class="lineno"><a class="line" href="classtesting_1_1internal2_1_1_type_without_formatter.html"> 8180</a></span> <span class="keyword">class </span><a class="code" href="classtesting_1_1internal2_1_1_type_without_formatter.html">TypeWithoutFormatter</a> {</div><div class="line"><a name="l08181"></a><span class="lineno"> 8181</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l08182"></a><span class="lineno"> 8182</span>  <span class="comment">// This default version is called when kTypeKind is kOtherType.</span></div><div class="line"><a name="l08183"></a><span class="lineno"><a class="line" href="classtesting_1_1internal2_1_1_type_without_formatter.html#a6651f6f7be2c0f899729eeb6038f76d3"> 8183</a></span>  <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classtesting_1_1internal2_1_1_type_without_formatter.html#a6651f6f7be2c0f899729eeb6038f76d3">PrintValue</a>(<span class="keyword">const</span> T& value, ::std::ostream* os) {</div><div class="line"><a name="l08184"></a><span class="lineno"> 8184</span>  <a class="code" href="namespacetesting_1_1internal2.html#abfb9aa80365f93b952e9a4bea09947a8">PrintBytesInObjectTo</a>(static_cast<const unsigned char*>(</div><div class="line"><a name="l08185"></a><span class="lineno"> 8185</span>  reinterpret_cast<const void*>(&value)),</div><div class="line"><a name="l08186"></a><span class="lineno"> 8186</span>  <span class="keyword">sizeof</span>(value), os);</div><div class="line"><a name="l08187"></a><span class="lineno"> 8187</span>  }</div><div class="line"><a name="l08188"></a><span class="lineno"> 8188</span> };</div><div class="line"><a name="l08189"></a><span class="lineno"> 8189</span> </div><div class="line"><a name="l08190"></a><span class="lineno"> 8190</span> <span class="comment">// We print a protobuf using its ShortDebugString() when the string</span></div><div class="line"><a name="l08191"></a><span class="lineno"> 8191</span> <span class="comment">// doesn't exceed this many characters; otherwise we print it using</span></div><div class="line"><a name="l08192"></a><span class="lineno"> 8192</span> <span class="comment">// DebugString() for better readability.</span></div><div class="line"><a name="l08193"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal2.html#a140c8efd51e63a3def98445bff107518"> 8193</a></span> <span class="keyword">const</span> <span class="keywordtype">size_t</span> <a class="code" href="namespacetesting_1_1internal2.html#a140c8efd51e63a3def98445bff107518">kProtobufOneLinerMaxLength</a> = 50;</div><div class="line"><a name="l08194"></a><span class="lineno"> 8194</span> </div><div class="line"><a name="l08195"></a><span class="lineno"> 8195</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l08196"></a><span class="lineno"><a class="line" href="classtesting_1_1internal2_1_1_type_without_formatter_3_01_t_00_01k_protobuf_01_4.html"> 8196</a></span> <span class="keyword">class </span><a class="code" href="classtesting_1_1internal2_1_1_type_without_formatter.html">TypeWithoutFormatter</a><T, <a class="code" href="namespacetesting_1_1internal2.html#aeb8161b0b3ee503347b0662d7028fd57a14aaf98a2547ecf43eef0868d54b1383">kProtobuf</a>> {</div><div class="line"><a name="l08197"></a><span class="lineno"> 8197</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l08198"></a><span class="lineno"><a class="line" href="classtesting_1_1internal2_1_1_type_without_formatter_3_01_t_00_01k_protobuf_01_4.html#ac96fb775dc776f02da9a671ea0e04599"> 8198</a></span>  <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classtesting_1_1internal2_1_1_type_without_formatter_3_01_t_00_01k_protobuf_01_4.html#ac96fb775dc776f02da9a671ea0e04599">PrintValue</a>(<span class="keyword">const</span> T& value, ::std::ostream* os) {</div><div class="line"><a name="l08199"></a><span class="lineno"> 8199</span>  <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a> pretty_str = value.ShortDebugString();</div><div class="line"><a name="l08200"></a><span class="lineno"> 8200</span>  <span class="keywordflow">if</span> (pretty_str.length() > <a class="code" href="namespacetesting_1_1internal2.html#a140c8efd51e63a3def98445bff107518">kProtobufOneLinerMaxLength</a>) {</div><div class="line"><a name="l08201"></a><span class="lineno"> 8201</span>  pretty_str = <span class="stringliteral">"\n"</span> + value.DebugString();</div><div class="line"><a name="l08202"></a><span class="lineno"> 8202</span>  }</div><div class="line"><a name="l08203"></a><span class="lineno"> 8203</span>  *os << (<span class="stringliteral">"<"</span> + pretty_str + <span class="stringliteral">">"</span>);</div><div class="line"><a name="l08204"></a><span class="lineno"> 8204</span>  }</div><div class="line"><a name="l08205"></a><span class="lineno"> 8205</span> };</div><div class="line"><a name="l08206"></a><span class="lineno"> 8206</span> </div><div class="line"><a name="l08207"></a><span class="lineno"> 8207</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l08208"></a><span class="lineno"><a class="line" href="classtesting_1_1internal2_1_1_type_without_formatter_3_01_t_00_01k_convertible_to_integer_01_4.html"> 8208</a></span> <span class="keyword">class </span><a class="code" href="classtesting_1_1internal2_1_1_type_without_formatter.html">TypeWithoutFormatter</a><T, <a class="code" href="namespacetesting_1_1internal2.html#aeb8161b0b3ee503347b0662d7028fd57a9bdcf3f1548f498b2b7f097306ea0224">kConvertibleToInteger</a>> {</div><div class="line"><a name="l08209"></a><span class="lineno"> 8209</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l08210"></a><span class="lineno"> 8210</span>  <span class="comment">// Since T has no << operator or PrintTo() but can be implicitly</span></div><div class="line"><a name="l08211"></a><span class="lineno"> 8211</span>  <span class="comment">// converted to BiggestInt, we print it as a BiggestInt.</span></div><div class="line"><a name="l08212"></a><span class="lineno"> 8212</span>  <span class="comment">//</span></div><div class="line"><a name="l08213"></a><span class="lineno"> 8213</span>  <span class="comment">// Most likely T is an enum type (either named or unnamed), in which</span></div><div class="line"><a name="l08214"></a><span class="lineno"> 8214</span>  <span class="comment">// case printing it as an integer is the desired behavior. In case</span></div><div class="line"><a name="l08215"></a><span class="lineno"> 8215</span>  <span class="comment">// T is not an enum, printing it as an integer is the best we can do</span></div><div class="line"><a name="l08216"></a><span class="lineno"> 8216</span>  <span class="comment">// given that it has no user-defined printer.</span></div><div class="line"><a name="l08217"></a><span class="lineno"><a class="line" href="classtesting_1_1internal2_1_1_type_without_formatter_3_01_t_00_01k_convertible_to_integer_01_4.html#ab27a411afb608e730a57d232b3f4f486"> 8217</a></span>  <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classtesting_1_1internal2_1_1_type_without_formatter_3_01_t_00_01k_convertible_to_integer_01_4.html#ab27a411afb608e730a57d232b3f4f486">PrintValue</a>(<span class="keyword">const</span> T& value, ::std::ostream* os) {</div><div class="line"><a name="l08218"></a><span class="lineno"> 8218</span>  <span class="keyword">const</span> <a class="code" href="namespacetesting_1_1internal.html#a05c6bd9ede5ccdf25191a590d610dcc6">internal::BiggestInt</a> kBigInt = value;</div><div class="line"><a name="l08219"></a><span class="lineno"> 8219</span>  *os << kBigInt;</div><div class="line"><a name="l08220"></a><span class="lineno"> 8220</span>  }</div><div class="line"><a name="l08221"></a><span class="lineno"> 8221</span> };</div><div class="line"><a name="l08222"></a><span class="lineno"> 8222</span> </div><div class="line"><a name="l08223"></a><span class="lineno"> 8223</span> <span class="preprocessor">#if GTEST_HAS_ABSL</span></div><div class="line"><a name="l08224"></a><span class="lineno"> 8224</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l08225"></a><span class="lineno"> 8225</span> <span class="keyword">class </span>TypeWithoutFormatter<T, kConvertibleToStringView> {</div><div class="line"><a name="l08226"></a><span class="lineno"> 8226</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l08227"></a><span class="lineno"> 8227</span>  <span class="comment">// Since T has neither operator<< nor PrintTo() but can be implicitly</span></div><div class="line"><a name="l08228"></a><span class="lineno"> 8228</span>  <span class="comment">// converted to absl::string_view, we print it as a absl::string_view.</span></div><div class="line"><a name="l08229"></a><span class="lineno"> 8229</span>  <span class="comment">//</span></div><div class="line"><a name="l08230"></a><span class="lineno"> 8230</span>  <span class="comment">// Note: the implementation is further below, as it depends on</span></div><div class="line"><a name="l08231"></a><span class="lineno"> 8231</span>  <span class="comment">// internal::PrintTo symbol which is defined later in the file.</span></div><div class="line"><a name="l08232"></a><span class="lineno"> 8232</span>  <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classtesting_1_1internal2_1_1_type_without_formatter.html#a6651f6f7be2c0f899729eeb6038f76d3">PrintValue</a>(<span class="keyword">const</span> T& value, ::std::ostream* os);</div><div class="line"><a name="l08233"></a><span class="lineno"> 8233</span> };</div><div class="line"><a name="l08234"></a><span class="lineno"> 8234</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l08235"></a><span class="lineno"> 8235</span> </div><div class="line"><a name="l08236"></a><span class="lineno"> 8236</span> <span class="comment">// Prints the given value to the given ostream. If the value is a</span></div><div class="line"><a name="l08237"></a><span class="lineno"> 8237</span> <span class="comment">// protocol message, its debug string is printed; if it's an enum or</span></div><div class="line"><a name="l08238"></a><span class="lineno"> 8238</span> <span class="comment">// of a type implicitly convertible to BiggestInt, it's printed as an</span></div><div class="line"><a name="l08239"></a><span class="lineno"> 8239</span> <span class="comment">// integer; otherwise the bytes in the value are printed. This is</span></div><div class="line"><a name="l08240"></a><span class="lineno"> 8240</span> <span class="comment">// what UniversalPrinter<T>::Print() does when it knows nothing about</span></div><div class="line"><a name="l08241"></a><span class="lineno"> 8241</span> <span class="comment">// type T and T has neither << operator nor PrintTo().</span></div><div class="line"><a name="l08242"></a><span class="lineno"> 8242</span> <span class="comment">//</span></div><div class="line"><a name="l08243"></a><span class="lineno"> 8243</span> <span class="comment">// A user can override this behavior for a class type Foo by defining</span></div><div class="line"><a name="l08244"></a><span class="lineno"> 8244</span> <span class="comment">// a << operator in the namespace where Foo is defined.</span></div><div class="line"><a name="l08245"></a><span class="lineno"> 8245</span> <span class="comment">//</span></div><div class="line"><a name="l08246"></a><span class="lineno"> 8246</span> <span class="comment">// We put this operator in namespace 'internal2' instead of 'internal'</span></div><div class="line"><a name="l08247"></a><span class="lineno"> 8247</span> <span class="comment">// to simplify the implementation, as much code in 'internal' needs to</span></div><div class="line"><a name="l08248"></a><span class="lineno"> 8248</span> <span class="comment">// use << in STL, which would conflict with our own << were it defined</span></div><div class="line"><a name="l08249"></a><span class="lineno"> 8249</span> <span class="comment">// in 'internal'.</span></div><div class="line"><a name="l08250"></a><span class="lineno"> 8250</span> <span class="comment">//</span></div><div class="line"><a name="l08251"></a><span class="lineno"> 8251</span> <span class="comment">// Note that this operator<< takes a generic std::basic_ostream<Char,</span></div><div class="line"><a name="l08252"></a><span class="lineno"> 8252</span> <span class="comment">// CharTraits> type instead of the more restricted std::ostream. If</span></div><div class="line"><a name="l08253"></a><span class="lineno"> 8253</span> <span class="comment">// we define it to take an std::ostream instead, we'll get an</span></div><div class="line"><a name="l08254"></a><span class="lineno"> 8254</span> <span class="comment">// "ambiguous overloads" compiler error when trying to print a type</span></div><div class="line"><a name="l08255"></a><span class="lineno"> 8255</span> <span class="comment">// Foo that supports streaming to std::basic_ostream<Char,</span></div><div class="line"><a name="l08256"></a><span class="lineno"> 8256</span> <span class="comment">// CharTraits>, as the compiler cannot tell whether</span></div><div class="line"><a name="l08257"></a><span class="lineno"> 8257</span> <span class="comment">// operator<<(std::ostream&, const T&) or</span></div><div class="line"><a name="l08258"></a><span class="lineno"> 8258</span> <span class="comment">// operator<<(std::basic_stream<Char, CharTraits>, const Foo&) is more</span></div><div class="line"><a name="l08259"></a><span class="lineno"> 8259</span> <span class="comment">// specific.</span></div><div class="line"><a name="l08260"></a><span class="lineno"> 8260</span> <span class="keyword">template</span> <<span class="keyword">typename</span> Char, <span class="keyword">typename</span> CharTraits, <span class="keyword">typename</span> T></div><div class="line"><a name="l08261"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal2.html#a07dbe129beb8952074f04b599dfce39b"> 8261</a></span> ::std::basic_ostream<Char, CharTraits>& <a class="code" href="namespacetesting_1_1internal2.html#a07dbe129beb8952074f04b599dfce39b">operator<<</a>(</div><div class="line"><a name="l08262"></a><span class="lineno"> 8262</span>  ::std::basic_ostream<Char, CharTraits>& os, <span class="keyword">const</span> T& x) {</div><div class="line"><a name="l08263"></a><span class="lineno"> 8263</span>  <a class="code" href="classtesting_1_1internal2_1_1_type_without_formatter.html">TypeWithoutFormatter<T, (internal::IsAProtocolMessage<T>::value</a></div><div class="line"><a name="l08264"></a><span class="lineno"> 8264</span>  ? <a class="code" href="namespacetesting_1_1internal2.html#aeb8161b0b3ee503347b0662d7028fd57a14aaf98a2547ecf43eef0868d54b1383">kProtobuf</a></div><div class="line"><a name="l08265"></a><span class="lineno"> 8265</span>  : <a class="code" href="classtesting_1_1internal_1_1_implicitly_convertible.html">internal::ImplicitlyConvertible</a><</div><div class="line"><a name="l08266"></a><span class="lineno"> 8266</span>  <span class="keyword">const</span> T&, <a class="code" href="namespacetesting_1_1internal.html#a05c6bd9ede5ccdf25191a590d610dcc6">internal::BiggestInt</a>>::value</div><div class="line"><a name="l08267"></a><span class="lineno"> 8267</span>  ? <a class="code" href="namespacetesting_1_1internal2.html#aeb8161b0b3ee503347b0662d7028fd57a9bdcf3f1548f498b2b7f097306ea0224">kConvertibleToInteger</a></div><div class="line"><a name="l08268"></a><span class="lineno"> 8268</span>  :</div><div class="line"><a name="l08269"></a><span class="lineno"> 8269</span> <span class="preprocessor">#if GTEST_HAS_ABSL</span></div><div class="line"><a name="l08270"></a><span class="lineno"> 8270</span>  <a class="code" href="classtesting_1_1internal_1_1_implicitly_convertible.html">internal::ImplicitlyConvertible</a><</div><div class="line"><a name="l08271"></a><span class="lineno"> 8271</span>  <span class="keyword">const</span> T&, absl::string_view>::value</div><div class="line"><a name="l08272"></a><span class="lineno"> 8272</span>  ? kConvertibleToStringView</div><div class="line"><a name="l08273"></a><span class="lineno"> 8273</span>  :</div><div class="line"><a name="l08274"></a><span class="lineno"> 8274</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l08275"></a><span class="lineno"> 8275</span>  <a class="code" href="namespacetesting_1_1internal2.html#aeb8161b0b3ee503347b0662d7028fd57abe8aaea44751d6ebd0cdf5bd94451db1">kOtherType</a>)>::PrintValue(x, &os);</div><div class="line"><a name="l08276"></a><span class="lineno"> 8276</span>  <span class="keywordflow">return</span> os;</div><div class="line"><a name="l08277"></a><span class="lineno"> 8277</span> }</div><div class="line"><a name="l08278"></a><span class="lineno"> 8278</span> </div><div class="line"><a name="l08279"></a><span class="lineno"> 8279</span> } <span class="comment">// namespace internal2</span></div><div class="line"><a name="l08280"></a><span class="lineno"> 8280</span> } <span class="comment">// namespace testing</span></div><div class="line"><a name="l08281"></a><span class="lineno"> 8281</span> </div><div class="line"><a name="l08282"></a><span class="lineno"> 8282</span> <span class="comment">// This namespace MUST NOT BE NESTED IN ::testing, or the name look-up</span></div><div class="line"><a name="l08283"></a><span class="lineno"> 8283</span> <span class="comment">// magic needed for implementing UniversalPrinter won't work.</span></div><div class="line"><a name="l08284"></a><span class="lineno"><a class="line" href="namespacetesting__internal.html"> 8284</a></span> <span class="keyword">namespace </span><a class="code" href="namespacetesting__internal.html">testing_internal</a> {</div><div class="line"><a name="l08285"></a><span class="lineno"> 8285</span> </div><div class="line"><a name="l08286"></a><span class="lineno"> 8286</span> <span class="comment">// Used to print a value that is not an STL-style container when the</span></div><div class="line"><a name="l08287"></a><span class="lineno"> 8287</span> <span class="comment">// user doesn't define PrintTo() for it.</span></div><div class="line"><a name="l08288"></a><span class="lineno"> 8288</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l08289"></a><span class="lineno"><a class="line" href="namespacetesting__internal.html#a3f49d3d0c996242f9d383c850097a656"> 8289</a></span> <span class="keywordtype">void</span> <a class="code" href="namespacetesting__internal.html#a3f49d3d0c996242f9d383c850097a656">DefaultPrintNonContainerTo</a>(<span class="keyword">const</span> T& value, ::std::ostream* os) {</div><div class="line"><a name="l08290"></a><span class="lineno"> 8290</span>  <span class="comment">// With the following statement, during unqualified name lookup,</span></div><div class="line"><a name="l08291"></a><span class="lineno"> 8291</span>  <span class="comment">// testing::internal2::operator<< appears as if it was declared in</span></div><div class="line"><a name="l08292"></a><span class="lineno"> 8292</span>  <span class="comment">// the nearest enclosing namespace that contains both</span></div><div class="line"><a name="l08293"></a><span class="lineno"> 8293</span>  <span class="comment">// ::testing_internal and ::testing::internal2, i.e. the global</span></div><div class="line"><a name="l08294"></a><span class="lineno"> 8294</span>  <span class="comment">// namespace. For more details, refer to the C++ Standard section</span></div><div class="line"><a name="l08295"></a><span class="lineno"> 8295</span>  <span class="comment">// 7.3.4-1 [namespace.udir]. This allows us to fall back onto</span></div><div class="line"><a name="l08296"></a><span class="lineno"> 8296</span>  <span class="comment">// testing::internal2::operator<< in case T doesn't come with a <<</span></div><div class="line"><a name="l08297"></a><span class="lineno"> 8297</span>  <span class="comment">// operator.</span></div><div class="line"><a name="l08298"></a><span class="lineno"> 8298</span>  <span class="comment">//</span></div><div class="line"><a name="l08299"></a><span class="lineno"> 8299</span>  <span class="comment">// We cannot write 'using ::testing::internal2::operator<<;', which</span></div><div class="line"><a name="l08300"></a><span class="lineno"> 8300</span>  <span class="comment">// gcc 3.3 fails to compile due to a compiler bug.</span></div><div class="line"><a name="l08301"></a><span class="lineno"> 8301</span>  <span class="keyword">using namespace </span>::<a class="code" href="namespacetesting_1_1internal2.html">testing::internal2</a>; <span class="comment">// NOLINT</span></div><div class="line"><a name="l08302"></a><span class="lineno"> 8302</span> </div><div class="line"><a name="l08303"></a><span class="lineno"> 8303</span>  <span class="comment">// Assuming T is defined in namespace foo, in the next statement,</span></div><div class="line"><a name="l08304"></a><span class="lineno"> 8304</span>  <span class="comment">// the compiler will consider all of:</span></div><div class="line"><a name="l08305"></a><span class="lineno"> 8305</span>  <span class="comment">//</span></div><div class="line"><a name="l08306"></a><span class="lineno"> 8306</span>  <span class="comment">// 1. foo::operator<< (thanks to Koenig look-up),</span></div><div class="line"><a name="l08307"></a><span class="lineno"> 8307</span>  <span class="comment">// 2. ::operator<< (as the current namespace is enclosed in ::),</span></div><div class="line"><a name="l08308"></a><span class="lineno"> 8308</span>  <span class="comment">// 3. testing::internal2::operator<< (thanks to the using statement above).</span></div><div class="line"><a name="l08309"></a><span class="lineno"> 8309</span>  <span class="comment">//</span></div><div class="line"><a name="l08310"></a><span class="lineno"> 8310</span>  <span class="comment">// The operator<< whose type matches T best will be picked.</span></div><div class="line"><a name="l08311"></a><span class="lineno"> 8311</span>  <span class="comment">//</span></div><div class="line"><a name="l08312"></a><span class="lineno"> 8312</span>  <span class="comment">// We deliberately allow #2 to be a candidate, as sometimes it's</span></div><div class="line"><a name="l08313"></a><span class="lineno"> 8313</span>  <span class="comment">// impossible to define #1 (e.g. when foo is ::std, defining</span></div><div class="line"><a name="l08314"></a><span class="lineno"> 8314</span>  <span class="comment">// anything in it is undefined behavior unless you are a compiler</span></div><div class="line"><a name="l08315"></a><span class="lineno"> 8315</span>  <span class="comment">// vendor.).</span></div><div class="line"><a name="l08316"></a><span class="lineno"> 8316</span>  *os << value;</div><div class="line"><a name="l08317"></a><span class="lineno"> 8317</span> }</div><div class="line"><a name="l08318"></a><span class="lineno"> 8318</span> </div><div class="line"><a name="l08319"></a><span class="lineno"> 8319</span> } <span class="comment">// namespace testing_internal</span></div><div class="line"><a name="l08320"></a><span class="lineno"> 8320</span> </div><div class="line"><a name="l08321"></a><span class="lineno"> 8321</span> <span class="keyword">namespace </span><a class="code" href="namespacetesting.html">testing</a> {</div><div class="line"><a name="l08322"></a><span class="lineno"> 8322</span> <span class="keyword">namespace </span>internal {</div><div class="line"><a name="l08323"></a><span class="lineno"> 8323</span> </div><div class="line"><a name="l08324"></a><span class="lineno"> 8324</span> <span class="comment">// FormatForComparison<ToPrint, OtherOperand>::Format(value) formats a</span></div><div class="line"><a name="l08325"></a><span class="lineno"> 8325</span> <span class="comment">// value of type ToPrint that is an operand of a comparison assertion</span></div><div class="line"><a name="l08326"></a><span class="lineno"> 8326</span> <span class="comment">// (e.g. ASSERT_EQ). OtherOperand is the type of the other operand in</span></div><div class="line"><a name="l08327"></a><span class="lineno"> 8327</span> <span class="comment">// the comparison, and is used to help determine the best way to</span></div><div class="line"><a name="l08328"></a><span class="lineno"> 8328</span> <span class="comment">// format the value. In particular, when the value is a C string</span></div><div class="line"><a name="l08329"></a><span class="lineno"> 8329</span> <span class="comment">// (char pointer) and the other operand is an STL string object, we</span></div><div class="line"><a name="l08330"></a><span class="lineno"> 8330</span> <span class="comment">// want to format the C string as a string, since we know it is</span></div><div class="line"><a name="l08331"></a><span class="lineno"> 8331</span> <span class="comment">// compared by value with the string object. If the value is a char</span></div><div class="line"><a name="l08332"></a><span class="lineno"> 8332</span> <span class="comment">// pointer but the other operand is not an STL string object, we don't</span></div><div class="line"><a name="l08333"></a><span class="lineno"> 8333</span> <span class="comment">// know whether the pointer is supposed to point to a NUL-terminated</span></div><div class="line"><a name="l08334"></a><span class="lineno"> 8334</span> <span class="comment">// string, and thus want to print it as a pointer to be safe.</span></div><div class="line"><a name="l08335"></a><span class="lineno"> 8335</span> <span class="comment">//</span></div><div class="line"><a name="l08336"></a><span class="lineno"> 8336</span> <span class="comment">// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.</span></div><div class="line"><a name="l08337"></a><span class="lineno"> 8337</span> </div><div class="line"><a name="l08338"></a><span class="lineno"> 8338</span> <span class="comment">// The default case.</span></div><div class="line"><a name="l08339"></a><span class="lineno"> 8339</span> <span class="keyword">template</span> <<span class="keyword">typename</span> ToPr<span class="keywordtype">int</span>, <span class="keyword">typename</span> OtherOperand></div><div class="line"><a name="l08340"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_format_for_comparison.html"> 8340</a></span> <span class="keyword">class </span><a class="code" href="classtesting_1_1internal_1_1_format_for_comparison.html">FormatForComparison</a> {</div><div class="line"><a name="l08341"></a><span class="lineno"> 8341</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l08342"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_format_for_comparison.html#a2aeb688fc55b57abd3021d82eccad896"> 8342</a></span>  <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">static ::std::string</a> <a class="code" href="classtesting_1_1internal_1_1_format_for_comparison.html#a2aeb688fc55b57abd3021d82eccad896">Format</a>(<span class="keyword">const</span> ToPrint& value) {</div><div class="line"><a name="l08343"></a><span class="lineno"> 8343</span>  <a class="code" href="namespacetesting.html#aa5717bb1144edd1d262d310ba70c82ed">return ::testing::PrintToString</a>(value);</div><div class="line"><a name="l08344"></a><span class="lineno"> 8344</span>  }</div><div class="line"><a name="l08345"></a><span class="lineno"> 8345</span> };</div><div class="line"><a name="l08346"></a><span class="lineno"> 8346</span> </div><div class="line"><a name="l08347"></a><span class="lineno"> 8347</span> <span class="comment">// Array.</span></div><div class="line"><a name="l08348"></a><span class="lineno"> 8348</span> <span class="keyword">template</span> <<span class="keyword">typename</span> ToPr<span class="keywordtype">int</span>, <span class="keywordtype">size_t</span> N, <span class="keyword">typename</span> OtherOperand></div><div class="line"><a name="l08349"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_format_for_comparison_3_01_to_print[_n]_00_01_other_operand_01_4.html"> 8349</a></span> <span class="keyword">class </span><a class="code" href="classtesting_1_1internal_1_1_format_for_comparison.html">FormatForComparison</a><ToPrint[N], OtherOperand> {</div><div class="line"><a name="l08350"></a><span class="lineno"> 8350</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l08351"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_format_for_comparison_3_01_to_print[_n]_00_01_other_operand_01_4.html#a76c526461c8fa7df75f7b32ab889b9e0"> 8351</a></span>  <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">static ::std::string</a> <a class="code" href="classtesting_1_1internal_1_1_format_for_comparison_3_01_to_print[_n]_00_01_other_operand_01_4.html#a76c526461c8fa7df75f7b32ab889b9e0">Format</a>(<span class="keyword">const</span> ToPrint* value) {</div><div class="line"><a name="l08352"></a><span class="lineno"> 8352</span>  <span class="keywordflow">return</span> <a class="code" href="classtesting_1_1internal_1_1_format_for_comparison.html#a2aeb688fc55b57abd3021d82eccad896">FormatForComparison<const ToPrint*, OtherOperand>::Format</a>(value);</div><div class="line"><a name="l08353"></a><span class="lineno"> 8353</span>  }</div><div class="line"><a name="l08354"></a><span class="lineno"> 8354</span> };</div><div class="line"><a name="l08355"></a><span class="lineno"> 8355</span> </div><div class="line"><a name="l08356"></a><span class="lineno"> 8356</span> <span class="comment">// By default, print C string as pointers to be safe, as we don't know</span></div><div class="line"><a name="l08357"></a><span class="lineno"> 8357</span> <span class="comment">// whether they actually point to a NUL-terminated string.</span></div><div class="line"><a name="l08358"></a><span class="lineno"> 8358</span> </div><div class="line"><a name="l08359"></a><span class="lineno"><a class="line" href="gtest_8h.html#a79d4724b4bc2a1dd8493c366b5ca626a"> 8359</a></span> <span class="preprocessor">#define GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(CharType) \</span></div><div class="line"><a name="l08360"></a><span class="lineno"> 8360</span> <span class="preprocessor"> template <typename OtherOperand> \</span></div><div class="line"><a name="l08361"></a><span class="lineno"> 8361</span> <span class="preprocessor"> class FormatForComparison<CharType*, OtherOperand> { \</span></div><div class="line"><a name="l08362"></a><span class="lineno"> 8362</span> <span class="preprocessor"> public: \</span></div><div class="line"><a name="l08363"></a><span class="lineno"> 8363</span> <span class="preprocessor"> static ::std::string Format(CharType* value) { \</span></div><div class="line"><a name="l08364"></a><span class="lineno"> 8364</span> <span class="preprocessor"> return ::testing::PrintToString(static_cast<const void*>(value)); \</span></div><div class="line"><a name="l08365"></a><span class="lineno"> 8365</span> <span class="preprocessor"> } \</span></div><div class="line"><a name="l08366"></a><span class="lineno"> 8366</span> <span class="preprocessor"> }</span></div><div class="line"><a name="l08367"></a><span class="lineno"> 8367</span> </div><div class="line"><a name="l08368"></a><span class="lineno"> 8368</span> <a class="code" href="namespacetesting_1_1internal.html#a3682f962ae0ec1c0eca6444ca0a09e91">GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_</a>(<span class="keywordtype">char</span>);</div><div class="line"><a name="l08369"></a><span class="lineno"> 8369</span> <a class="code" href="namespacetesting_1_1internal.html#a3682f962ae0ec1c0eca6444ca0a09e91">GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>);</div><div class="line"><a name="l08370"></a><span class="lineno"> 8370</span> <a class="code" href="namespacetesting_1_1internal.html#a3682f962ae0ec1c0eca6444ca0a09e91">GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_</a>(<span class="keywordtype">wchar_t</span>);</div><div class="line"><a name="l08371"></a><span class="lineno"> 8371</span> <a class="code" href="namespacetesting_1_1internal.html#a3682f962ae0ec1c0eca6444ca0a09e91">GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_</a>(<span class="keyword">const</span> <span class="keywordtype">wchar_t</span>);</div><div class="line"><a name="l08372"></a><span class="lineno"> 8372</span> </div><div class="line"><a name="l08373"></a><span class="lineno"> 8373</span> <span class="preprocessor">#undef GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_</span></div><div class="line"><a name="l08374"></a><span class="lineno"> 8374</span> </div><div class="line"><a name="l08375"></a><span class="lineno"> 8375</span> <span class="comment">// If a C string is compared with an STL string object, we know it's meant</span></div><div class="line"><a name="l08376"></a><span class="lineno"> 8376</span> <span class="comment">// to point to a NUL-terminated string, and thus can print it as a string.</span></div><div class="line"><a name="l08377"></a><span class="lineno"> 8377</span> </div><div class="line"><a name="l08378"></a><span class="lineno"><a class="line" href="gtest_8h.html#ad6102ed2a0571d5196e606a061c16a10"> 8378</a></span> <span class="preprocessor">#define GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(CharType, OtherStringType) \</span></div><div class="line"><a name="l08379"></a><span class="lineno"> 8379</span> <span class="preprocessor"> template <> \</span></div><div class="line"><a name="l08380"></a><span class="lineno"> 8380</span> <span class="preprocessor"> class FormatForComparison<CharType*, OtherStringType> { \</span></div><div class="line"><a name="l08381"></a><span class="lineno"> 8381</span> <span class="preprocessor"> public: \</span></div><div class="line"><a name="l08382"></a><span class="lineno"> 8382</span> <span class="preprocessor"> static ::std::string Format(CharType* value) { \</span></div><div class="line"><a name="l08383"></a><span class="lineno"> 8383</span> <span class="preprocessor"> return ::testing::PrintToString(value); \</span></div><div class="line"><a name="l08384"></a><span class="lineno"> 8384</span> <span class="preprocessor"> } \</span></div><div class="line"><a name="l08385"></a><span class="lineno"> 8385</span> <span class="preprocessor"> }</span></div><div class="line"><a name="l08386"></a><span class="lineno"> 8386</span> </div><div class="line"><a name="l08387"></a><span class="lineno"> 8387</span> <a class="code" href="namespacetesting_1_1internal.html#aeac30230dcc362221bdd07d61eaa4ec1">GTEST_IMPL_FORMAT_C_STRING_AS_STRING_</a>(<span class="keywordtype">char</span>, ::<a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a>);</div><div class="line"><a name="l08388"></a><span class="lineno"> 8388</span> <a class="code" href="namespacetesting_1_1internal.html#aeac30230dcc362221bdd07d61eaa4ec1">GTEST_IMPL_FORMAT_C_STRING_AS_STRING_</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>, ::<a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a>);</div><div class="line"><a name="l08389"></a><span class="lineno"> 8389</span> </div><div class="line"><a name="l08390"></a><span class="lineno"> 8390</span> <span class="preprocessor">#if GTEST_HAS_GLOBAL_STRING</span></div><div class="line"><a name="l08391"></a><span class="lineno"> 8391</span> <a class="code" href="namespacetesting_1_1internal.html#aeac30230dcc362221bdd07d61eaa4ec1">GTEST_IMPL_FORMAT_C_STRING_AS_STRING_</a>(<span class="keywordtype">char</span>, ::<span class="keywordtype">string</span>);</div><div class="line"><a name="l08392"></a><span class="lineno"> 8392</span> <a class="code" href="namespacetesting_1_1internal.html#aeac30230dcc362221bdd07d61eaa4ec1">GTEST_IMPL_FORMAT_C_STRING_AS_STRING_</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>, ::<span class="keywordtype">string</span>);</div><div class="line"><a name="l08393"></a><span class="lineno"> 8393</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l08394"></a><span class="lineno"> 8394</span> </div><div class="line"><a name="l08395"></a><span class="lineno"> 8395</span> <span class="preprocessor">#if GTEST_HAS_GLOBAL_WSTRING</span></div><div class="line"><a name="l08396"></a><span class="lineno"> 8396</span> <a class="code" href="namespacetesting_1_1internal.html#aeac30230dcc362221bdd07d61eaa4ec1">GTEST_IMPL_FORMAT_C_STRING_AS_STRING_</a>(<span class="keywordtype">wchar_t</span>, ::<a class="code" href="namespacetesting_1_1internal.html#a3f543179329c353aee1d7b54a9a8e335">wstring</a>);</div><div class="line"><a name="l08397"></a><span class="lineno"> 8397</span> <a class="code" href="namespacetesting_1_1internal.html#aeac30230dcc362221bdd07d61eaa4ec1">GTEST_IMPL_FORMAT_C_STRING_AS_STRING_</a>(<span class="keyword">const</span> <span class="keywordtype">wchar_t</span>, ::<a class="code" href="namespacetesting_1_1internal.html#a3f543179329c353aee1d7b54a9a8e335">wstring</a>);</div><div class="line"><a name="l08398"></a><span class="lineno"> 8398</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l08399"></a><span class="lineno"> 8399</span> </div><div class="line"><a name="l08400"></a><span class="lineno"> 8400</span> <span class="preprocessor">#if GTEST_HAS_STD_WSTRING</span></div><div class="line"><a name="l08401"></a><span class="lineno"> 8401</span> <a class="code" href="namespacetesting_1_1internal.html#aeac30230dcc362221bdd07d61eaa4ec1">GTEST_IMPL_FORMAT_C_STRING_AS_STRING_</a>(<span class="keywordtype">wchar_t</span>, ::<a class="code" href="namespacetesting_1_1internal.html#a3f543179329c353aee1d7b54a9a8e335">std::wstring</a>);</div><div class="line"><a name="l08402"></a><span class="lineno"> 8402</span> <a class="code" href="namespacetesting_1_1internal.html#aeac30230dcc362221bdd07d61eaa4ec1">GTEST_IMPL_FORMAT_C_STRING_AS_STRING_</a>(<span class="keyword">const</span> <span class="keywordtype">wchar_t</span>, ::<a class="code" href="namespacetesting_1_1internal.html#a3f543179329c353aee1d7b54a9a8e335">std::wstring</a>);</div><div class="line"><a name="l08403"></a><span class="lineno"> 8403</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l08404"></a><span class="lineno"> 8404</span> </div><div class="line"><a name="l08405"></a><span class="lineno"> 8405</span> <span class="preprocessor">#undef GTEST_IMPL_FORMAT_C_STRING_AS_STRING_</span></div><div class="line"><a name="l08406"></a><span class="lineno"> 8406</span> </div><div class="line"><a name="l08407"></a><span class="lineno"> 8407</span> <span class="comment">// Formats a comparison assertion (e.g. ASSERT_EQ, EXPECT_LT, and etc)</span></div><div class="line"><a name="l08408"></a><span class="lineno"> 8408</span> <span class="comment">// operand to be used in a failure message. The type (but not value)</span></div><div class="line"><a name="l08409"></a><span class="lineno"> 8409</span> <span class="comment">// of the other operand may affect the format. This allows us to</span></div><div class="line"><a name="l08410"></a><span class="lineno"> 8410</span> <span class="comment">// print a char* as a raw pointer when it is compared against another</span></div><div class="line"><a name="l08411"></a><span class="lineno"> 8411</span> <span class="comment">// char* or void*, and print it as a C string when it is compared</span></div><div class="line"><a name="l08412"></a><span class="lineno"> 8412</span> <span class="comment">// against an std::string object, for example.</span></div><div class="line"><a name="l08413"></a><span class="lineno"> 8413</span> <span class="comment">//</span></div><div class="line"><a name="l08414"></a><span class="lineno"> 8414</span> <span class="comment">// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.</span></div><div class="line"><a name="l08415"></a><span class="lineno"> 8415</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2></div><div class="line"><a name="l08416"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#a91ab078f10adc669f09b7f604975c518"> 8416</a></span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a> <a class="code" href="namespacetesting_1_1internal.html#a91ab078f10adc669f09b7f604975c518">FormatForComparisonFailureMessage</a>(</div><div class="line"><a name="l08417"></a><span class="lineno"> 8417</span>  <span class="keyword">const</span> T1& value, <span class="keyword">const</span> T2& <span class="comment">/* other_operand */</span>) {</div><div class="line"><a name="l08418"></a><span class="lineno"> 8418</span>  <span class="keywordflow">return</span> <a class="code" href="classtesting_1_1internal_1_1_format_for_comparison.html#a2aeb688fc55b57abd3021d82eccad896">FormatForComparison<T1, T2>::Format</a>(value);</div><div class="line"><a name="l08419"></a><span class="lineno"> 8419</span> }</div><div class="line"><a name="l08420"></a><span class="lineno"> 8420</span> </div><div class="line"><a name="l08421"></a><span class="lineno"> 8421</span> <span class="comment">// UniversalPrinter<T>::Print(value, ostream_ptr) prints the given</span></div><div class="line"><a name="l08422"></a><span class="lineno"> 8422</span> <span class="comment">// value to the given ostream. The caller must ensure that</span></div><div class="line"><a name="l08423"></a><span class="lineno"> 8423</span> <span class="comment">// 'ostream_ptr' is not NULL, or the behavior is undefined.</span></div><div class="line"><a name="l08424"></a><span class="lineno"> 8424</span> <span class="comment">//</span></div><div class="line"><a name="l08425"></a><span class="lineno"> 8425</span> <span class="comment">// We define UniversalPrinter as a class template (as opposed to a</span></div><div class="line"><a name="l08426"></a><span class="lineno"> 8426</span> <span class="comment">// function template), as we need to partially specialize it for</span></div><div class="line"><a name="l08427"></a><span class="lineno"> 8427</span> <span class="comment">// reference types, which cannot be done with function templates.</span></div><div class="line"><a name="l08428"></a><span class="lineno"> 8428</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l08429"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_universal_printer.html"> 8429</a></span> <span class="keyword">class </span><a class="code" href="classtesting_1_1internal_1_1_universal_printer.html">UniversalPrinter</a>;</div><div class="line"><a name="l08430"></a><span class="lineno"> 8430</span> </div><div class="line"><a name="l08431"></a><span class="lineno"> 8431</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l08432"></a><span class="lineno"> 8432</span> <span class="keywordtype">void</span> <a class="code" href="namespacetesting_1_1internal.html#a30708fa2bacf11895b03bdb21eb72309">UniversalPrint</a>(<span class="keyword">const</span> T& value, ::std::ostream* os);</div><div class="line"><a name="l08433"></a><span class="lineno"> 8433</span> </div><div class="line"><a name="l08434"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#a17fb8f0125fa92404a249ed38a43faa4"> 8434</a></span> <span class="keyword">enum</span> <a class="code" href="namespacetesting_1_1internal.html#a17fb8f0125fa92404a249ed38a43faa4">DefaultPrinterType</a> {</div><div class="line"><a name="l08435"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#a17fb8f0125fa92404a249ed38a43faa4a945a19e59155ce1d335e8c3bcbdf61db"> 8435</a></span>  <a class="code" href="namespacetesting_1_1internal.html#a17fb8f0125fa92404a249ed38a43faa4a945a19e59155ce1d335e8c3bcbdf61db">kPrintContainer</a>,</div><div class="line"><a name="l08436"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#a17fb8f0125fa92404a249ed38a43faa4a8eaa6fff4a58832b30027df49f73dcbf"> 8436</a></span>  <a class="code" href="namespacetesting_1_1internal.html#a17fb8f0125fa92404a249ed38a43faa4a8eaa6fff4a58832b30027df49f73dcbf">kPrintPointer</a>,</div><div class="line"><a name="l08437"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#a17fb8f0125fa92404a249ed38a43faa4a5a066cde30e276c6460ba10d123d0c2c"> 8437</a></span>  <a class="code" href="namespacetesting_1_1internal.html#a17fb8f0125fa92404a249ed38a43faa4a5a066cde30e276c6460ba10d123d0c2c">kPrintFunctionPointer</a>,</div><div class="line"><a name="l08438"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#a17fb8f0125fa92404a249ed38a43faa4a6f88d77d9d763d8a009caf950cfbab28"> 8438</a></span>  <a class="code" href="namespacetesting_1_1internal.html#a17fb8f0125fa92404a249ed38a43faa4a6f88d77d9d763d8a009caf950cfbab28">kPrintOther</a>,</div><div class="line"><a name="l08439"></a><span class="lineno"> 8439</span> };</div><div class="line"><a name="l08440"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_wrap_printer_type.html"> 8440</a></span> <span class="keyword">template</span> <DefaultPr<span class="keywordtype">int</span>erType type> <span class="keyword">struct </span><a class="code" href="structtesting_1_1internal_1_1_wrap_printer_type.html">WrapPrinterType</a> {};</div><div class="line"><a name="l08441"></a><span class="lineno"> 8441</span> </div><div class="line"><a name="l08442"></a><span class="lineno"> 8442</span> <span class="comment">// Used to print an STL-style container when the user doesn't define</span></div><div class="line"><a name="l08443"></a><span class="lineno"> 8443</span> <span class="comment">// a PrintTo() for it.</span></div><div class="line"><a name="l08444"></a><span class="lineno"> 8444</span> <span class="keyword">template</span> <<span class="keyword">typename</span> C></div><div class="line"><a name="l08445"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#a2e96c98d5bd8ee4a1b92f8e3cde7dd40"> 8445</a></span> <span class="keywordtype">void</span> <a class="code" href="namespacetesting_1_1internal.html#a2e96c98d5bd8ee4a1b92f8e3cde7dd40">DefaultPrintTo</a>(<a class="code" href="structtesting_1_1internal_1_1_wrap_printer_type.html">WrapPrinterType<kPrintContainer></a> <span class="comment">/* dummy */</span>,</div><div class="line"><a name="l08446"></a><span class="lineno"> 8446</span>  <span class="keyword">const</span> C& container, ::std::ostream* os) {</div><div class="line"><a name="l08447"></a><span class="lineno"> 8447</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> kMaxCount = 32; <span class="comment">// The maximum number of elements to print.</span></div><div class="line"><a name="l08448"></a><span class="lineno"> 8448</span>  *os << <span class="charliteral">'{'</span>;</div><div class="line"><a name="l08449"></a><span class="lineno"> 8449</span>  <span class="keywordtype">size_t</span> <a class="code" href="namespaceutl_1_1meta.html#ab5508236016638fa8e6b97cd17dfc9c2">count</a> = 0;</div><div class="line"><a name="l08450"></a><span class="lineno"> 8450</span>  <span class="keywordflow">for</span> (<span class="keyword">typename</span> C::const_iterator it = container.begin();</div><div class="line"><a name="l08451"></a><span class="lineno"> 8451</span>  it != container.end(); ++it, ++<a class="code" href="namespaceutl_1_1meta.html#ab5508236016638fa8e6b97cd17dfc9c2">count</a>) {</div><div class="line"><a name="l08452"></a><span class="lineno"> 8452</span>  <span class="keywordflow">if</span> (<a class="code" href="namespaceutl_1_1meta.html#ab5508236016638fa8e6b97cd17dfc9c2">count</a> > 0) {</div><div class="line"><a name="l08453"></a><span class="lineno"> 8453</span>  *os << <span class="charliteral">','</span>;</div><div class="line"><a name="l08454"></a><span class="lineno"> 8454</span>  <span class="keywordflow">if</span> (<a class="code" href="namespaceutl_1_1meta.html#ab5508236016638fa8e6b97cd17dfc9c2">count</a> == kMaxCount) { <span class="comment">// Enough has been printed.</span></div><div class="line"><a name="l08455"></a><span class="lineno"> 8455</span>  *os << <span class="stringliteral">" ..."</span>;</div><div class="line"><a name="l08456"></a><span class="lineno"> 8456</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l08457"></a><span class="lineno"> 8457</span>  }</div><div class="line"><a name="l08458"></a><span class="lineno"> 8458</span>  }</div><div class="line"><a name="l08459"></a><span class="lineno"> 8459</span>  *os << <span class="charliteral">' '</span>;</div><div class="line"><a name="l08460"></a><span class="lineno"> 8460</span>  <span class="comment">// We cannot call PrintTo(*it, os) here as PrintTo() doesn't</span></div><div class="line"><a name="l08461"></a><span class="lineno"> 8461</span>  <span class="comment">// handle *it being a native array.</span></div><div class="line"><a name="l08462"></a><span class="lineno"> 8462</span>  <a class="code" href="namespacetesting_1_1internal.html#a30708fa2bacf11895b03bdb21eb72309">internal::UniversalPrint</a>(*it, os);</div><div class="line"><a name="l08463"></a><span class="lineno"> 8463</span>  }</div><div class="line"><a name="l08464"></a><span class="lineno"> 8464</span> </div><div class="line"><a name="l08465"></a><span class="lineno"> 8465</span>  <span class="keywordflow">if</span> (<a class="code" href="namespaceutl_1_1meta.html#ab5508236016638fa8e6b97cd17dfc9c2">count</a> > 0) {</div><div class="line"><a name="l08466"></a><span class="lineno"> 8466</span>  *os << <span class="charliteral">' '</span>;</div><div class="line"><a name="l08467"></a><span class="lineno"> 8467</span>  }</div><div class="line"><a name="l08468"></a><span class="lineno"> 8468</span>  *os << <span class="charliteral">'}'</span>;</div><div class="line"><a name="l08469"></a><span class="lineno"> 8469</span> }</div><div class="line"><a name="l08470"></a><span class="lineno"> 8470</span> </div><div class="line"><a name="l08471"></a><span class="lineno"> 8471</span> <span class="comment">// Used to print a pointer that is neither a char pointer nor a member</span></div><div class="line"><a name="l08472"></a><span class="lineno"> 8472</span> <span class="comment">// pointer, when the user doesn't define PrintTo() for it. (A member</span></div><div class="line"><a name="l08473"></a><span class="lineno"> 8473</span> <span class="comment">// variable pointer or member function pointer doesn't really point to</span></div><div class="line"><a name="l08474"></a><span class="lineno"> 8474</span> <span class="comment">// a location in the address space. Their representation is</span></div><div class="line"><a name="l08475"></a><span class="lineno"> 8475</span> <span class="comment">// implementation-defined. Therefore they will be printed as raw</span></div><div class="line"><a name="l08476"></a><span class="lineno"> 8476</span> <span class="comment">// bytes.)</span></div><div class="line"><a name="l08477"></a><span class="lineno"> 8477</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l08478"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#a074522dd8d77d61878a042b8d05cc64a"> 8478</a></span> <span class="keywordtype">void</span> <a class="code" href="namespacetesting_1_1internal.html#a2e96c98d5bd8ee4a1b92f8e3cde7dd40">DefaultPrintTo</a>(<a class="code" href="structtesting_1_1internal_1_1_wrap_printer_type.html">WrapPrinterType<kPrintPointer></a> <span class="comment">/* dummy */</span>,</div><div class="line"><a name="l08479"></a><span class="lineno"> 8479</span>  T* p, ::std::ostream* os) {</div><div class="line"><a name="l08480"></a><span class="lineno"> 8480</span>  <span class="keywordflow">if</span> (p == <span class="keyword">nullptr</span>) {</div><div class="line"><a name="l08481"></a><span class="lineno"> 8481</span>  *os << <span class="stringliteral">"NULL"</span>;</div><div class="line"><a name="l08482"></a><span class="lineno"> 8482</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l08483"></a><span class="lineno"> 8483</span>  <span class="comment">// T is not a function type. We just call << to print p,</span></div><div class="line"><a name="l08484"></a><span class="lineno"> 8484</span>  <span class="comment">// relying on ADL to pick up user-defined << for their pointer</span></div><div class="line"><a name="l08485"></a><span class="lineno"> 8485</span>  <span class="comment">// types, if any.</span></div><div class="line"><a name="l08486"></a><span class="lineno"> 8486</span>  *os << p;</div><div class="line"><a name="l08487"></a><span class="lineno"> 8487</span>  }</div><div class="line"><a name="l08488"></a><span class="lineno"> 8488</span> }</div><div class="line"><a name="l08489"></a><span class="lineno"> 8489</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l08490"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#a7729c07abcae6c69b9b370c39db61409"> 8490</a></span> <span class="keywordtype">void</span> <a class="code" href="namespacetesting_1_1internal.html#a2e96c98d5bd8ee4a1b92f8e3cde7dd40">DefaultPrintTo</a>(<a class="code" href="structtesting_1_1internal_1_1_wrap_printer_type.html">WrapPrinterType<kPrintFunctionPointer></a> <span class="comment">/* dummy */</span>,</div><div class="line"><a name="l08491"></a><span class="lineno"> 8491</span>  T* p, ::std::ostream* os) {</div><div class="line"><a name="l08492"></a><span class="lineno"> 8492</span>  <span class="keywordflow">if</span> (p == <span class="keyword">nullptr</span>) {</div><div class="line"><a name="l08493"></a><span class="lineno"> 8493</span>  *os << <span class="stringliteral">"NULL"</span>;</div><div class="line"><a name="l08494"></a><span class="lineno"> 8494</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l08495"></a><span class="lineno"> 8495</span>  <span class="comment">// T is a function type, so '*os << p' doesn't do what we want</span></div><div class="line"><a name="l08496"></a><span class="lineno"> 8496</span>  <span class="comment">// (it just prints p as bool). We want to print p as a const</span></div><div class="line"><a name="l08497"></a><span class="lineno"> 8497</span>  <span class="comment">// void*.</span></div><div class="line"><a name="l08498"></a><span class="lineno"> 8498</span>  *os << reinterpret_cast<const void*>(p);</div><div class="line"><a name="l08499"></a><span class="lineno"> 8499</span>  }</div><div class="line"><a name="l08500"></a><span class="lineno"> 8500</span> }</div><div class="line"><a name="l08501"></a><span class="lineno"> 8501</span> </div><div class="line"><a name="l08502"></a><span class="lineno"> 8502</span> <span class="comment">// Used to print a non-container, non-pointer value when the user</span></div><div class="line"><a name="l08503"></a><span class="lineno"> 8503</span> <span class="comment">// doesn't define PrintTo() for it.</span></div><div class="line"><a name="l08504"></a><span class="lineno"> 8504</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l08505"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#a72b1a69d96be8ea6382539f5c4fcac6d"> 8505</a></span> <span class="keywordtype">void</span> <a class="code" href="namespacetesting_1_1internal.html#a2e96c98d5bd8ee4a1b92f8e3cde7dd40">DefaultPrintTo</a>(<a class="code" href="structtesting_1_1internal_1_1_wrap_printer_type.html">WrapPrinterType<kPrintOther></a> <span class="comment">/* dummy */</span>,</div><div class="line"><a name="l08506"></a><span class="lineno"> 8506</span>  <span class="keyword">const</span> T& value, ::std::ostream* os) {</div><div class="line"><a name="l08507"></a><span class="lineno"> 8507</span>  <a class="code" href="namespacetesting__internal.html#a3f49d3d0c996242f9d383c850097a656">::testing_internal::DefaultPrintNonContainerTo</a>(value, os);</div><div class="line"><a name="l08508"></a><span class="lineno"> 8508</span> }</div><div class="line"><a name="l08509"></a><span class="lineno"> 8509</span> </div><div class="line"><a name="l08510"></a><span class="lineno"> 8510</span> <span class="comment">// Prints the given value using the << operator if it has one;</span></div><div class="line"><a name="l08511"></a><span class="lineno"> 8511</span> <span class="comment">// otherwise prints the bytes in it. This is what</span></div><div class="line"><a name="l08512"></a><span class="lineno"> 8512</span> <span class="comment">// UniversalPrinter<T>::Print() does when PrintTo() is not specialized</span></div><div class="line"><a name="l08513"></a><span class="lineno"> 8513</span> <span class="comment">// or overloaded for type T.</span></div><div class="line"><a name="l08514"></a><span class="lineno"> 8514</span> <span class="comment">//</span></div><div class="line"><a name="l08515"></a><span class="lineno"> 8515</span> <span class="comment">// A user can override this behavior for a class type Foo by defining</span></div><div class="line"><a name="l08516"></a><span class="lineno"> 8516</span> <span class="comment">// an overload of PrintTo() in the namespace where Foo is defined. We</span></div><div class="line"><a name="l08517"></a><span class="lineno"> 8517</span> <span class="comment">// give the user this option as sometimes defining a << operator for</span></div><div class="line"><a name="l08518"></a><span class="lineno"> 8518</span> <span class="comment">// Foo is not desirable (e.g. the coding style may prevent doing it,</span></div><div class="line"><a name="l08519"></a><span class="lineno"> 8519</span> <span class="comment">// or there is already a << operator but it doesn't do what the user</span></div><div class="line"><a name="l08520"></a><span class="lineno"> 8520</span> <span class="comment">// wants).</span></div><div class="line"><a name="l08521"></a><span class="lineno"> 8521</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l08522"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#adb3c27150dbe661db0e0c4be27533460"> 8522</a></span> <span class="keywordtype">void</span> <a class="code" href="namespacetesting_1_1internal.html#aa7e70a85d66f0c109e3e69629ef577f2">PrintTo</a>(<span class="keyword">const</span> T& value, ::std::ostream* os) {</div><div class="line"><a name="l08523"></a><span class="lineno"> 8523</span>  <span class="comment">// DefaultPrintTo() is overloaded. The type of its first argument</span></div><div class="line"><a name="l08524"></a><span class="lineno"> 8524</span>  <span class="comment">// determines which version will be picked.</span></div><div class="line"><a name="l08525"></a><span class="lineno"> 8525</span>  <span class="comment">//</span></div><div class="line"><a name="l08526"></a><span class="lineno"> 8526</span>  <span class="comment">// Note that we check for container types here, prior to we check</span></div><div class="line"><a name="l08527"></a><span class="lineno"> 8527</span>  <span class="comment">// for protocol message types in our operator<<. The rationale is:</span></div><div class="line"><a name="l08528"></a><span class="lineno"> 8528</span>  <span class="comment">//</span></div><div class="line"><a name="l08529"></a><span class="lineno"> 8529</span>  <span class="comment">// For protocol messages, we want to give people a chance to</span></div><div class="line"><a name="l08530"></a><span class="lineno"> 8530</span>  <span class="comment">// override Google Mock's format by defining a PrintTo() or</span></div><div class="line"><a name="l08531"></a><span class="lineno"> 8531</span>  <span class="comment">// operator<<. For STL containers, other formats can be</span></div><div class="line"><a name="l08532"></a><span class="lineno"> 8532</span>  <span class="comment">// incompatible with Google Mock's format for the container</span></div><div class="line"><a name="l08533"></a><span class="lineno"> 8533</span>  <span class="comment">// elements; therefore we check for container types here to ensure</span></div><div class="line"><a name="l08534"></a><span class="lineno"> 8534</span>  <span class="comment">// that our format is used.</span></div><div class="line"><a name="l08535"></a><span class="lineno"> 8535</span>  <span class="comment">//</span></div><div class="line"><a name="l08536"></a><span class="lineno"> 8536</span>  <span class="comment">// Note that MSVC and clang-cl do allow an implicit conversion from</span></div><div class="line"><a name="l08537"></a><span class="lineno"> 8537</span>  <span class="comment">// pointer-to-function to pointer-to-object, but clang-cl warns on it.</span></div><div class="line"><a name="l08538"></a><span class="lineno"> 8538</span>  <span class="comment">// So don't use ImplicitlyConvertible if it can be helped since it will</span></div><div class="line"><a name="l08539"></a><span class="lineno"> 8539</span>  <span class="comment">// cause this warning, and use a separate overload of DefaultPrintTo for</span></div><div class="line"><a name="l08540"></a><span class="lineno"> 8540</span>  <span class="comment">// function pointers so that the `*os << p` in the object pointer overload</span></div><div class="line"><a name="l08541"></a><span class="lineno"> 8541</span>  <span class="comment">// doesn't cause that warning either.</span></div><div class="line"><a name="l08542"></a><span class="lineno"> 8542</span>  <a class="code" href="namespacetesting_1_1internal.html#a2e96c98d5bd8ee4a1b92f8e3cde7dd40">DefaultPrintTo</a>(</div><div class="line"><a name="l08543"></a><span class="lineno"> 8543</span>  <a class="code" href="structtesting_1_1internal_1_1_wrap_printer_type.html">WrapPrinterType</a> <</div><div class="line"><a name="l08544"></a><span class="lineno"> 8544</span>  (<span class="keyword">sizeof</span>(IsContainerTest<T>(0)) == <span class="keyword">sizeof</span>(<a class="code" href="namespacetesting_1_1internal.html#ad8f0c2883245f1df2a53618a49f0deb3">IsContainer</a>)) &&</div><div class="line"><a name="l08545"></a><span class="lineno"> 8545</span>  !<a class="code" href="structtesting_1_1internal_1_1_is_recursive_container.html">IsRecursiveContainer<T>::value</a></div><div class="line"><a name="l08546"></a><span class="lineno"> 8546</span>  ? <a class="code" href="namespacetesting_1_1internal.html#a17fb8f0125fa92404a249ed38a43faa4a945a19e59155ce1d335e8c3bcbdf61db">kPrintContainer</a></div><div class="line"><a name="l08547"></a><span class="lineno"> 8547</span>  : !std::is_pointer<T>::value</div><div class="line"><a name="l08548"></a><span class="lineno"> 8548</span>  ? <a class="code" href="namespacetesting_1_1internal.html#a17fb8f0125fa92404a249ed38a43faa4a6f88d77d9d763d8a009caf950cfbab28">kPrintOther</a></div><div class="line"><a name="l08549"></a><span class="lineno"> 8549</span>  : std::is_function<<span class="keyword">typename</span> std::remove_pointer<T>::type>::value</div><div class="line"><a name="l08550"></a><span class="lineno"> 8550</span>  ? <a class="code" href="namespacetesting_1_1internal.html#a17fb8f0125fa92404a249ed38a43faa4a5a066cde30e276c6460ba10d123d0c2c">kPrintFunctionPointer</a></div><div class="line"><a name="l08551"></a><span class="lineno"> 8551</span>  : <a class="code" href="namespacetesting_1_1internal.html#a17fb8f0125fa92404a249ed38a43faa4a8eaa6fff4a58832b30027df49f73dcbf">kPrintPointer</a> > (),</div><div class="line"><a name="l08552"></a><span class="lineno"> 8552</span>  value, os);</div><div class="line"><a name="l08553"></a><span class="lineno"> 8553</span> }</div><div class="line"><a name="l08554"></a><span class="lineno"> 8554</span> </div><div class="line"><a name="l08555"></a><span class="lineno"> 8555</span> <span class="comment">// The following list of PrintTo() overloads tells</span></div><div class="line"><a name="l08556"></a><span class="lineno"> 8556</span> <span class="comment">// UniversalPrinter<T>::Print() how to print standard types (built-in</span></div><div class="line"><a name="l08557"></a><span class="lineno"> 8557</span> <span class="comment">// types, strings, plain arrays, and pointers).</span></div><div class="line"><a name="l08558"></a><span class="lineno"> 8558</span> </div><div class="line"><a name="l08559"></a><span class="lineno"> 8559</span> <span class="comment">// Overloads for various char types.</span></div><div class="line"><a name="l08560"></a><span class="lineno"> 8560</span> <a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> <span class="keywordtype">void</span> <a class="code" href="namespacetesting_1_1internal.html#aa7e70a85d66f0c109e3e69629ef577f2">PrintTo</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> c, ::std::ostream* os);</div><div class="line"><a name="l08561"></a><span class="lineno"> 8561</span> <a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> <span class="keywordtype">void</span> <a class="code" href="namespacetesting_1_1internal.html#aa7e70a85d66f0c109e3e69629ef577f2">PrintTo</a>(<span class="keywordtype">signed</span> <span class="keywordtype">char</span> c, ::std::ostream* os);</div><div class="line"><a name="l08562"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#a476bd3d411d4f129620aaf8999c257c0"> 8562</a></span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="namespacetesting_1_1internal.html#aa7e70a85d66f0c109e3e69629ef577f2">PrintTo</a>(<span class="keywordtype">char</span> c, ::std::ostream* os) {</div><div class="line"><a name="l08563"></a><span class="lineno"> 8563</span>  <span class="comment">// When printing a plain char, we always treat it as unsigned. This</span></div><div class="line"><a name="l08564"></a><span class="lineno"> 8564</span>  <span class="comment">// way, the output won't be affected by whether the compiler thinks</span></div><div class="line"><a name="l08565"></a><span class="lineno"> 8565</span>  <span class="comment">// char is signed or not.</span></div><div class="line"><a name="l08566"></a><span class="lineno"> 8566</span>  <a class="code" href="namespacetesting_1_1internal.html#aa7e70a85d66f0c109e3e69629ef577f2">PrintTo</a>(static_cast<unsigned char>(c), os);</div><div class="line"><a name="l08567"></a><span class="lineno"> 8567</span> }</div><div class="line"><a name="l08568"></a><span class="lineno"> 8568</span> </div><div class="line"><a name="l08569"></a><span class="lineno"> 8569</span> <span class="comment">// Overloads for other simple built-in types.</span></div><div class="line"><a name="l08570"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#a2979ac1ad3e05c51dcd7dca2eb34e6ce"> 8570</a></span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="namespacetesting_1_1internal.html#aa7e70a85d66f0c109e3e69629ef577f2">PrintTo</a>(<span class="keywordtype">bool</span> x, ::std::ostream* os) {</div><div class="line"><a name="l08571"></a><span class="lineno"> 8571</span>  *os << (x ? <span class="stringliteral">"true"</span> : <span class="stringliteral">"false"</span>);</div><div class="line"><a name="l08572"></a><span class="lineno"> 8572</span> }</div><div class="line"><a name="l08573"></a><span class="lineno"> 8573</span> </div><div class="line"><a name="l08574"></a><span class="lineno"> 8574</span> <span class="comment">// Overload for wchar_t type.</span></div><div class="line"><a name="l08575"></a><span class="lineno"> 8575</span> <span class="comment">// Prints a wchar_t as a symbol if it is printable or as its internal</span></div><div class="line"><a name="l08576"></a><span class="lineno"> 8576</span> <span class="comment">// code otherwise and also as its decimal code (except for L'\0').</span></div><div class="line"><a name="l08577"></a><span class="lineno"> 8577</span> <span class="comment">// The L'\0' char is printed as "L'\\0'". The decimal code is printed</span></div><div class="line"><a name="l08578"></a><span class="lineno"> 8578</span> <span class="comment">// as signed integer when wchar_t is implemented by the compiler</span></div><div class="line"><a name="l08579"></a><span class="lineno"> 8579</span> <span class="comment">// as a signed type and is printed as an unsigned integer when wchar_t</span></div><div class="line"><a name="l08580"></a><span class="lineno"> 8580</span> <span class="comment">// is implemented as an unsigned type.</span></div><div class="line"><a name="l08581"></a><span class="lineno"> 8581</span> <a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> <span class="keywordtype">void</span> <a class="code" href="namespacetesting_1_1internal.html#aa7e70a85d66f0c109e3e69629ef577f2">PrintTo</a>(<span class="keywordtype">wchar_t</span> wc, ::std::ostream* os);</div><div class="line"><a name="l08582"></a><span class="lineno"> 8582</span> </div><div class="line"><a name="l08583"></a><span class="lineno"> 8583</span> <span class="comment">// Overloads for C strings.</span></div><div class="line"><a name="l08584"></a><span class="lineno"> 8584</span> <a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> <span class="keywordtype">void</span> <a class="code" href="namespacetesting_1_1internal.html#aa7e70a85d66f0c109e3e69629ef577f2">PrintTo</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* s, ::std::ostream* os);</div><div class="line"><a name="l08585"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#a553eec7bb50de01c9e91cac4accc606f"> 8585</a></span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="namespacetesting_1_1internal.html#aa7e70a85d66f0c109e3e69629ef577f2">PrintTo</a>(<span class="keywordtype">char</span>* s, ::std::ostream* os) {</div><div class="line"><a name="l08586"></a><span class="lineno"> 8586</span>  <a class="code" href="namespacetesting_1_1internal.html#aa7e70a85d66f0c109e3e69629ef577f2">PrintTo</a>(ImplicitCast_<const char*>(s), os);</div><div class="line"><a name="l08587"></a><span class="lineno"> 8587</span> }</div><div class="line"><a name="l08588"></a><span class="lineno"> 8588</span> </div><div class="line"><a name="l08589"></a><span class="lineno"> 8589</span> <span class="comment">// signed/unsigned char is often used for representing binary data, so</span></div><div class="line"><a name="l08590"></a><span class="lineno"> 8590</span> <span class="comment">// we print pointers to it as void* to be safe.</span></div><div class="line"><a name="l08591"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#a792cc5665a34619ed7a6d54711433456"> 8591</a></span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="namespacetesting_1_1internal.html#aa7e70a85d66f0c109e3e69629ef577f2">PrintTo</a>(<span class="keyword">const</span> <span class="keywordtype">signed</span> <span class="keywordtype">char</span>* s, ::std::ostream* os) {</div><div class="line"><a name="l08592"></a><span class="lineno"> 8592</span>  <a class="code" href="namespacetesting_1_1internal.html#aa7e70a85d66f0c109e3e69629ef577f2">PrintTo</a>(ImplicitCast_<const void*>(s), os);</div><div class="line"><a name="l08593"></a><span class="lineno"> 8593</span> }</div><div class="line"><a name="l08594"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#a1320096b116f8cc4b688acbd5b783051"> 8594</a></span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="namespacetesting_1_1internal.html#aa7e70a85d66f0c109e3e69629ef577f2">PrintTo</a>(<span class="keywordtype">signed</span> <span class="keywordtype">char</span>* s, ::std::ostream* os) {</div><div class="line"><a name="l08595"></a><span class="lineno"> 8595</span>  <a class="code" href="namespacetesting_1_1internal.html#aa7e70a85d66f0c109e3e69629ef577f2">PrintTo</a>(ImplicitCast_<const void*>(s), os);</div><div class="line"><a name="l08596"></a><span class="lineno"> 8596</span> }</div><div class="line"><a name="l08597"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#a42c591f2164ad105b502a9262333aed2"> 8597</a></span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="namespacetesting_1_1internal.html#aa7e70a85d66f0c109e3e69629ef577f2">PrintTo</a>(<span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>* s, ::std::ostream* os) {</div><div class="line"><a name="l08598"></a><span class="lineno"> 8598</span>  <a class="code" href="namespacetesting_1_1internal.html#aa7e70a85d66f0c109e3e69629ef577f2">PrintTo</a>(ImplicitCast_<const void*>(s), os);</div><div class="line"><a name="l08599"></a><span class="lineno"> 8599</span> }</div><div class="line"><a name="l08600"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#a7fae797c500d66d0f5a9db4f205e3416"> 8600</a></span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="namespacetesting_1_1internal.html#aa7e70a85d66f0c109e3e69629ef577f2">PrintTo</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>* s, ::std::ostream* os) {</div><div class="line"><a name="l08601"></a><span class="lineno"> 8601</span>  <a class="code" href="namespacetesting_1_1internal.html#aa7e70a85d66f0c109e3e69629ef577f2">PrintTo</a>(ImplicitCast_<const void*>(s), os);</div><div class="line"><a name="l08602"></a><span class="lineno"> 8602</span> }</div><div class="line"><a name="l08603"></a><span class="lineno"> 8603</span> </div><div class="line"><a name="l08604"></a><span class="lineno"> 8604</span> <span class="comment">// MSVC can be configured to define wchar_t as a typedef of unsigned</span></div><div class="line"><a name="l08605"></a><span class="lineno"> 8605</span> <span class="comment">// short. It defines _NATIVE_WCHAR_T_DEFINED when wchar_t is a native</span></div><div class="line"><a name="l08606"></a><span class="lineno"> 8606</span> <span class="comment">// type. When wchar_t is a typedef, defining an overload for const</span></div><div class="line"><a name="l08607"></a><span class="lineno"> 8607</span> <span class="comment">// wchar_t* would cause unsigned short* be printed as a wide string,</span></div><div class="line"><a name="l08608"></a><span class="lineno"> 8608</span> <span class="comment">// possibly causing invalid memory accesses.</span></div><div class="line"><a name="l08609"></a><span class="lineno"> 8609</span> <span class="preprocessor">#if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED)</span></div><div class="line"><a name="l08610"></a><span class="lineno"> 8610</span> <span class="comment">// Overloads for wide C strings</span></div><div class="line"><a name="l08611"></a><span class="lineno"> 8611</span> <a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> <span class="keywordtype">void</span> <a class="code" href="namespacetesting_1_1internal.html#aa7e70a85d66f0c109e3e69629ef577f2">PrintTo</a>(<span class="keyword">const</span> <span class="keywordtype">wchar_t</span>* s, ::std::ostream* os);</div><div class="line"><a name="l08612"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#a8d41baa371fad3eb5a3dbe1bbc02c290"> 8612</a></span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="namespacetesting_1_1internal.html#aa7e70a85d66f0c109e3e69629ef577f2">PrintTo</a>(<span class="keywordtype">wchar_t</span>* s, ::std::ostream* os) {</div><div class="line"><a name="l08613"></a><span class="lineno"> 8613</span>  <a class="code" href="namespacetesting_1_1internal.html#aa7e70a85d66f0c109e3e69629ef577f2">PrintTo</a>(ImplicitCast_<const wchar_t*>(s), os);</div><div class="line"><a name="l08614"></a><span class="lineno"> 8614</span> }</div><div class="line"><a name="l08615"></a><span class="lineno"> 8615</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l08616"></a><span class="lineno"> 8616</span> </div><div class="line"><a name="l08617"></a><span class="lineno"> 8617</span> <span class="comment">// Overload for C arrays. Multi-dimensional arrays are printed</span></div><div class="line"><a name="l08618"></a><span class="lineno"> 8618</span> <span class="comment">// properly.</span></div><div class="line"><a name="l08619"></a><span class="lineno"> 8619</span> </div><div class="line"><a name="l08620"></a><span class="lineno"> 8620</span> <span class="comment">// Prints the given number of elements in an array, without printing</span></div><div class="line"><a name="l08621"></a><span class="lineno"> 8621</span> <span class="comment">// the curly braces.</span></div><div class="line"><a name="l08622"></a><span class="lineno"> 8622</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l08623"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#ad3013b6b4c825edee9fe18ff1d982faa"> 8623</a></span> <span class="keywordtype">void</span> <a class="code" href="namespacetesting_1_1internal.html#ad3013b6b4c825edee9fe18ff1d982faa">PrintRawArrayTo</a>(<span class="keyword">const</span> T a[], <span class="keywordtype">size_t</span> <a class="code" href="namespaceutl_1_1meta.html#ab5508236016638fa8e6b97cd17dfc9c2">count</a>, ::std::ostream* os) {</div><div class="line"><a name="l08624"></a><span class="lineno"> 8624</span>  <a class="code" href="namespacetesting_1_1internal.html#a30708fa2bacf11895b03bdb21eb72309">UniversalPrint</a>(a[0], os);</div><div class="line"><a name="l08625"></a><span class="lineno"> 8625</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 1; i != <a class="code" href="namespaceutl_1_1meta.html#ab5508236016638fa8e6b97cd17dfc9c2">count</a>; i++) {</div><div class="line"><a name="l08626"></a><span class="lineno"> 8626</span>  *os << <span class="stringliteral">", "</span>;</div><div class="line"><a name="l08627"></a><span class="lineno"> 8627</span>  <a class="code" href="namespacetesting_1_1internal.html#a30708fa2bacf11895b03bdb21eb72309">UniversalPrint</a>(a[i], os);</div><div class="line"><a name="l08628"></a><span class="lineno"> 8628</span>  }</div><div class="line"><a name="l08629"></a><span class="lineno"> 8629</span> }</div><div class="line"><a name="l08630"></a><span class="lineno"> 8630</span> </div><div class="line"><a name="l08631"></a><span class="lineno"> 8631</span> <span class="comment">// Overloads for ::string and ::std::string.</span></div><div class="line"><a name="l08632"></a><span class="lineno"> 8632</span> <span class="preprocessor">#if GTEST_HAS_GLOBAL_STRING</span></div><div class="line"><a name="l08633"></a><span class="lineno"> 8633</span> <a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> <span class="keywordtype">void</span> <a class="code" href="namespacetesting_1_1internal.html#ad609167d8d6792b0fb186539e0e159bd">PrintStringTo</a>(<a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">const ::string</a>&s, ::std::ostream* os);</div><div class="line"><a name="l08634"></a><span class="lineno"> 8634</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="namespacetesting_1_1internal.html#aa7e70a85d66f0c109e3e69629ef577f2">PrintTo</a>(<a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">const ::string</a>& s, ::std::ostream* os) {</div><div class="line"><a name="l08635"></a><span class="lineno"> 8635</span>  <a class="code" href="namespacetesting_1_1internal.html#ad609167d8d6792b0fb186539e0e159bd">PrintStringTo</a>(s, os);</div><div class="line"><a name="l08636"></a><span class="lineno"> 8636</span> }</div><div class="line"><a name="l08637"></a><span class="lineno"> 8637</span> <span class="preprocessor">#endif // GTEST_HAS_GLOBAL_STRING</span></div><div class="line"><a name="l08638"></a><span class="lineno"> 8638</span> </div><div class="line"><a name="l08639"></a><span class="lineno"> 8639</span> <a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> <span class="keywordtype">void</span> <a class="code" href="namespacetesting_1_1internal.html#ad609167d8d6792b0fb186539e0e159bd">PrintStringTo</a>(<a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">const ::std::string</a>&s, ::std::ostream* os);</div><div class="line"><a name="l08640"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#af59b4f5d83276cd807c45063b14bad44"> 8640</a></span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="namespacetesting_1_1internal.html#aa7e70a85d66f0c109e3e69629ef577f2">PrintTo</a>(<a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">const ::std::string</a>& s, ::std::ostream* os) {</div><div class="line"><a name="l08641"></a><span class="lineno"> 8641</span>  <a class="code" href="namespacetesting_1_1internal.html#ad609167d8d6792b0fb186539e0e159bd">PrintStringTo</a>(s, os);</div><div class="line"><a name="l08642"></a><span class="lineno"> 8642</span> }</div><div class="line"><a name="l08643"></a><span class="lineno"> 8643</span> </div><div class="line"><a name="l08644"></a><span class="lineno"> 8644</span> <span class="comment">// Overloads for ::wstring and ::std::wstring.</span></div><div class="line"><a name="l08645"></a><span class="lineno"> 8645</span> <span class="preprocessor">#if GTEST_HAS_GLOBAL_WSTRING</span></div><div class="line"><a name="l08646"></a><span class="lineno"> 8646</span> <a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> <span class="keywordtype">void</span> <a class="code" href="namespacetesting_1_1internal.html#ac46308aa3c0294ae446a40115aeb32c6">PrintWideStringTo</a>(<a class="code" href="namespacetesting_1_1internal.html#a3f543179329c353aee1d7b54a9a8e335">const ::wstring</a>&s, ::std::ostream* os);</div><div class="line"><a name="l08647"></a><span class="lineno"> 8647</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="namespacetesting_1_1internal.html#aa7e70a85d66f0c109e3e69629ef577f2">PrintTo</a>(<a class="code" href="namespacetesting_1_1internal.html#a3f543179329c353aee1d7b54a9a8e335">const ::wstring</a>& s, ::std::ostream* os) {</div><div class="line"><a name="l08648"></a><span class="lineno"> 8648</span>  <a class="code" href="namespacetesting_1_1internal.html#ac46308aa3c0294ae446a40115aeb32c6">PrintWideStringTo</a>(s, os);</div><div class="line"><a name="l08649"></a><span class="lineno"> 8649</span> }</div><div class="line"><a name="l08650"></a><span class="lineno"> 8650</span> <span class="preprocessor">#endif // GTEST_HAS_GLOBAL_WSTRING</span></div><div class="line"><a name="l08651"></a><span class="lineno"> 8651</span> </div><div class="line"><a name="l08652"></a><span class="lineno"> 8652</span> <span class="preprocessor">#if GTEST_HAS_STD_WSTRING</span></div><div class="line"><a name="l08653"></a><span class="lineno"> 8653</span> <a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> <span class="keywordtype">void</span> <a class="code" href="namespacetesting_1_1internal.html#ac46308aa3c0294ae446a40115aeb32c6">PrintWideStringTo</a>(<a class="code" href="namespacetesting_1_1internal.html#a3f543179329c353aee1d7b54a9a8e335">const ::std::wstring</a>&s, ::std::ostream* os);</div><div class="line"><a name="l08654"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#a8d5be499966aeff68d4690db7d57f38a"> 8654</a></span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="namespacetesting_1_1internal.html#aa7e70a85d66f0c109e3e69629ef577f2">PrintTo</a>(<a class="code" href="namespacetesting_1_1internal.html#a3f543179329c353aee1d7b54a9a8e335">const ::std::wstring</a>& s, ::std::ostream* os) {</div><div class="line"><a name="l08655"></a><span class="lineno"> 8655</span>  <a class="code" href="namespacetesting_1_1internal.html#ac46308aa3c0294ae446a40115aeb32c6">PrintWideStringTo</a>(s, os);</div><div class="line"><a name="l08656"></a><span class="lineno"> 8656</span> }</div><div class="line"><a name="l08657"></a><span class="lineno"> 8657</span> <span class="preprocessor">#endif // GTEST_HAS_STD_WSTRING</span></div><div class="line"><a name="l08658"></a><span class="lineno"> 8658</span> </div><div class="line"><a name="l08659"></a><span class="lineno"> 8659</span> <span class="preprocessor">#if GTEST_HAS_ABSL</span></div><div class="line"><a name="l08660"></a><span class="lineno"> 8660</span> <span class="comment">// Overload for absl::string_view.</span></div><div class="line"><a name="l08661"></a><span class="lineno"> 8661</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="namespacetesting_1_1internal.html#aa7e70a85d66f0c109e3e69629ef577f2">PrintTo</a>(absl::string_view sp, ::std::ostream* os) {</div><div class="line"><a name="l08662"></a><span class="lineno"> 8662</span>  <a class="code" href="namespacetesting_1_1internal.html#aa7e70a85d66f0c109e3e69629ef577f2">PrintTo</a>(::<a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a>(sp), os);</div><div class="line"><a name="l08663"></a><span class="lineno"> 8663</span> }</div><div class="line"><a name="l08664"></a><span class="lineno"> 8664</span> <span class="preprocessor">#endif // GTEST_HAS_ABSL</span></div><div class="line"><a name="l08665"></a><span class="lineno"> 8665</span> </div><div class="line"><a name="l08666"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#a76f564cf23190dbd5c9e088defdd092b"> 8666</a></span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="namespacetesting_1_1internal.html#aa7e70a85d66f0c109e3e69629ef577f2">PrintTo</a>(std::nullptr_t, ::std::ostream* os) { *os << <span class="stringliteral">"(nullptr)"</span>; }</div><div class="line"><a name="l08667"></a><span class="lineno"> 8667</span> </div><div class="line"><a name="l08668"></a><span class="lineno"> 8668</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l08669"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#a5587d09db034bc597870ae86bd8c01f8"> 8669</a></span> <span class="keywordtype">void</span> <a class="code" href="namespacetesting_1_1internal.html#aa7e70a85d66f0c109e3e69629ef577f2">PrintTo</a>(std::reference_wrapper<T> ref, ::std::ostream* os) {</div><div class="line"><a name="l08670"></a><span class="lineno"> 8670</span>  <span class="comment">// Delegate to wrapped value.</span></div><div class="line"><a name="l08671"></a><span class="lineno"> 8671</span>  <a class="code" href="namespacetesting_1_1internal.html#aa7e70a85d66f0c109e3e69629ef577f2">PrintTo</a>(ref.get(), os);</div><div class="line"><a name="l08672"></a><span class="lineno"> 8672</span> }</div><div class="line"><a name="l08673"></a><span class="lineno"> 8673</span> </div><div class="line"><a name="l08674"></a><span class="lineno"> 8674</span> <span class="comment">// Helper function for printing a tuple. T must be instantiated with</span></div><div class="line"><a name="l08675"></a><span class="lineno"> 8675</span> <span class="comment">// a tuple type.</span></div><div class="line"><a name="l08676"></a><span class="lineno"> 8676</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l08677"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#a7174fbf5d6ba458afae675022c9aae1e"> 8677</a></span> <span class="keywordtype">void</span> <a class="code" href="namespacetesting_1_1internal.html#a7174fbf5d6ba458afae675022c9aae1e">PrintTupleTo</a>(<span class="keyword">const</span> T&, std::integral_constant<size_t, 0>,</div><div class="line"><a name="l08678"></a><span class="lineno"> 8678</span>  ::std::ostream*) {}</div><div class="line"><a name="l08679"></a><span class="lineno"> 8679</span> </div><div class="line"><a name="l08680"></a><span class="lineno"> 8680</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T, <span class="keywordtype">size_t</span> I></div><div class="line"><a name="l08681"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#a3580971ab4571dc9a00f4ed0e17fd777"> 8681</a></span> <span class="keywordtype">void</span> <a class="code" href="namespacetesting_1_1internal.html#a7174fbf5d6ba458afae675022c9aae1e">PrintTupleTo</a>(<span class="keyword">const</span> T& t, std::integral_constant<size_t, I>,</div><div class="line"><a name="l08682"></a><span class="lineno"> 8682</span>  ::std::ostream* os) {</div><div class="line"><a name="l08683"></a><span class="lineno"> 8683</span>  <a class="code" href="namespacetesting_1_1internal.html#a7174fbf5d6ba458afae675022c9aae1e">PrintTupleTo</a>(t, std::integral_constant<size_t, I - 1>(), os);</div><div class="line"><a name="l08684"></a><span class="lineno"> 8684</span>  <a class="code" href="gtest_8h.html#a69b0cadb05bf2a1ef96151243c6b6241">GTEST_INTENTIONAL_CONST_COND_PUSH_</a>()</div><div class="line"><a name="l08685"></a><span class="lineno"> 8685</span>  <span class="keywordflow">if</span> (I > 1) {</div><div class="line"><a name="l08686"></a><span class="lineno"> 8686</span>  <a class="code" href="gtest_8h.html#ad115e2c466f7e8a32f1cf23ef2e5f220">GTEST_INTENTIONAL_CONST_COND_POP_</a>()</div><div class="line"><a name="l08687"></a><span class="lineno"> 8687</span>  *os << <span class="stringliteral">", "</span>;</div><div class="line"><a name="l08688"></a><span class="lineno"> 8688</span>  }</div><div class="line"><a name="l08689"></a><span class="lineno"> 8689</span>  <a class="code" href="classtesting_1_1internal_1_1_universal_printer.html">UniversalPrinter</a><<span class="keyword">typename</span> std::tuple_element<I - 1, T>::type>::Print(</div><div class="line"><a name="l08690"></a><span class="lineno"> 8690</span>  std::get<I - 1>(t), os);</div><div class="line"><a name="l08691"></a><span class="lineno"> 8691</span> }</div><div class="line"><a name="l08692"></a><span class="lineno"> 8692</span> </div><div class="line"><a name="l08693"></a><span class="lineno"> 8693</span> <span class="keyword">template</span> <<span class="keyword">typename</span>... Types></div><div class="line"><a name="l08694"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#a5628347cba9a345f56087fdb70930fc8"> 8694</a></span> <span class="keywordtype">void</span> <a class="code" href="namespacetesting_1_1internal.html#aa7e70a85d66f0c109e3e69629ef577f2">PrintTo</a>(const ::std::tuple<Types...>& t, ::std::ostream* os) {</div><div class="line"><a name="l08695"></a><span class="lineno"> 8695</span>  *os << <span class="stringliteral">"("</span>;</div><div class="line"><a name="l08696"></a><span class="lineno"> 8696</span>  <a class="code" href="namespacetesting_1_1internal.html#a7174fbf5d6ba458afae675022c9aae1e">PrintTupleTo</a>(t, std::integral_constant<<span class="keywordtype">size_t</span>, <span class="keyword">sizeof</span>...(Types)>(), os);</div><div class="line"><a name="l08697"></a><span class="lineno"> 8697</span>  *os << <span class="stringliteral">")"</span>;</div><div class="line"><a name="l08698"></a><span class="lineno"> 8698</span> }</div><div class="line"><a name="l08699"></a><span class="lineno"> 8699</span> </div><div class="line"><a name="l08700"></a><span class="lineno"> 8700</span> <span class="comment">// Overload for std::pair.</span></div><div class="line"><a name="l08701"></a><span class="lineno"> 8701</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2></div><div class="line"><a name="l08702"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#af2c33928facbf2edf7af564278724d98"> 8702</a></span> <span class="keywordtype">void</span> <a class="code" href="namespacetesting_1_1internal.html#aa7e70a85d66f0c109e3e69629ef577f2">PrintTo</a>(const ::std::pair<T1, T2>& value, ::std::ostream* os) {</div><div class="line"><a name="l08703"></a><span class="lineno"> 8703</span>  *os << <span class="charliteral">'('</span>;</div><div class="line"><a name="l08704"></a><span class="lineno"> 8704</span>  <span class="comment">// We cannot use UniversalPrint(value.first, os) here, as T1 may be</span></div><div class="line"><a name="l08705"></a><span class="lineno"> 8705</span>  <span class="comment">// a reference type. The same for printing value.second.</span></div><div class="line"><a name="l08706"></a><span class="lineno"> 8706</span>  <a class="code" href="classtesting_1_1internal_1_1_universal_printer.html#aecec021e1abbaa260b701e24e3fe33eb">UniversalPrinter<T1>::Print</a>(value.first, os);</div><div class="line"><a name="l08707"></a><span class="lineno"> 8707</span>  *os << <span class="stringliteral">", "</span>;</div><div class="line"><a name="l08708"></a><span class="lineno"> 8708</span>  <a class="code" href="classtesting_1_1internal_1_1_universal_printer.html#aecec021e1abbaa260b701e24e3fe33eb">UniversalPrinter<T2>::Print</a>(value.second, os);</div><div class="line"><a name="l08709"></a><span class="lineno"> 8709</span>  *os << <span class="charliteral">')'</span>;</div><div class="line"><a name="l08710"></a><span class="lineno"> 8710</span> }</div><div class="line"><a name="l08711"></a><span class="lineno"> 8711</span> </div><div class="line"><a name="l08712"></a><span class="lineno"> 8712</span> <span class="comment">// Implements printing a non-reference type T by letting the compiler</span></div><div class="line"><a name="l08713"></a><span class="lineno"> 8713</span> <span class="comment">// pick the right overload of PrintTo() for T.</span></div><div class="line"><a name="l08714"></a><span class="lineno"> 8714</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l08715"></a><span class="lineno"> 8715</span> <span class="keyword">class </span>UniversalPrinter {</div><div class="line"><a name="l08716"></a><span class="lineno"> 8716</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l08717"></a><span class="lineno"> 8717</span>  <span class="comment">// MSVC warns about adding const to a function type, so we want to</span></div><div class="line"><a name="l08718"></a><span class="lineno"> 8718</span>  <span class="comment">// disable the warning.</span></div><div class="line"><a name="l08719"></a><span class="lineno"> 8719</span>  <a class="code" href="gtest_8h.html#a86994cc68e844d8b82089c70408dfc61">GTEST_DISABLE_MSC_WARNINGS_PUSH_</a>(4180)</div><div class="line"><a name="l08720"></a><span class="lineno"> 8720</span> </div><div class="line"><a name="l08721"></a><span class="lineno"> 8721</span>  <span class="comment">// Note: we deliberately don't call this PrintTo(), as that name</span></div><div class="line"><a name="l08722"></a><span class="lineno"> 8722</span>  <span class="comment">// conflicts with ::testing::internal::PrintTo in the body of the</span></div><div class="line"><a name="l08723"></a><span class="lineno"> 8723</span>  <span class="comment">// function.</span></div><div class="line"><a name="l08724"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_universal_printer.html#aecec021e1abbaa260b701e24e3fe33eb"> 8724</a></span>  static <span class="keywordtype">void</span> <a class="code" href="classtesting_1_1internal_1_1_universal_printer.html#aecec021e1abbaa260b701e24e3fe33eb">Print</a>(const T& value, ::std::ostream* os) {</div><div class="line"><a name="l08725"></a><span class="lineno"> 8725</span>  <span class="comment">// By default, ::testing::internal::PrintTo() is used for printing</span></div><div class="line"><a name="l08726"></a><span class="lineno"> 8726</span>  <span class="comment">// the value.</span></div><div class="line"><a name="l08727"></a><span class="lineno"> 8727</span>  <span class="comment">//</span></div><div class="line"><a name="l08728"></a><span class="lineno"> 8728</span>  <span class="comment">// Thanks to Koenig look-up, if T is a class and has its own</span></div><div class="line"><a name="l08729"></a><span class="lineno"> 8729</span>  <span class="comment">// PrintTo() function defined in its namespace, that function will</span></div><div class="line"><a name="l08730"></a><span class="lineno"> 8730</span>  <span class="comment">// be visible here. Since it is more specific than the generic ones</span></div><div class="line"><a name="l08731"></a><span class="lineno"> 8731</span>  <span class="comment">// in ::testing::internal, it will be picked by the compiler in the</span></div><div class="line"><a name="l08732"></a><span class="lineno"> 8732</span>  <span class="comment">// following statement - exactly what we want.</span></div><div class="line"><a name="l08733"></a><span class="lineno"> 8733</span>  <a class="code" href="namespacetesting_1_1internal.html#aa7e70a85d66f0c109e3e69629ef577f2">PrintTo</a>(value, os);</div><div class="line"><a name="l08734"></a><span class="lineno"> 8734</span>  }</div><div class="line"><a name="l08735"></a><span class="lineno"> 8735</span> </div><div class="line"><a name="l08736"></a><span class="lineno"> 8736</span>  <a class="code" href="gtest_8h.html#aebf8277c9069c1e124f9a5bbe2948061">GTEST_DISABLE_MSC_WARNINGS_POP_</a>()</div><div class="line"><a name="l08737"></a><span class="lineno"> 8737</span> };</div><div class="line"><a name="l08738"></a><span class="lineno"> 8738</span> </div><div class="line"><a name="l08739"></a><span class="lineno"> 8739</span> <span class="preprocessor">#if GTEST_HAS_ABSL</span></div><div class="line"><a name="l08740"></a><span class="lineno"> 8740</span> </div><div class="line"><a name="l08741"></a><span class="lineno"> 8741</span> <span class="comment">// Printer for absl::optional</span></div><div class="line"><a name="l08742"></a><span class="lineno"> 8742</span> </div><div class="line"><a name="l08743"></a><span class="lineno"> 8743</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l08744"></a><span class="lineno"> 8744</span> <span class="keyword">class </span>UniversalPrinter<::absl::optional<T>> {</div><div class="line"><a name="l08745"></a><span class="lineno"> 8745</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l08746"></a><span class="lineno"> 8746</span>  <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classtesting_1_1internal_1_1_universal_printer.html#aecec021e1abbaa260b701e24e3fe33eb">Print</a>(const ::absl::optional<T>& value, ::std::ostream* os) {</div><div class="line"><a name="l08747"></a><span class="lineno"> 8747</span>  *os << <span class="charliteral">'('</span>;</div><div class="line"><a name="l08748"></a><span class="lineno"> 8748</span>  <span class="keywordflow">if</span> (!value) {</div><div class="line"><a name="l08749"></a><span class="lineno"> 8749</span>  *os << <span class="stringliteral">"nullopt"</span>;</div><div class="line"><a name="l08750"></a><span class="lineno"> 8750</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l08751"></a><span class="lineno"> 8751</span>  <a class="code" href="namespacetesting_1_1internal.html#a30708fa2bacf11895b03bdb21eb72309">UniversalPrint</a>(*value, os);</div><div class="line"><a name="l08752"></a><span class="lineno"> 8752</span>  }</div><div class="line"><a name="l08753"></a><span class="lineno"> 8753</span>  *os << <span class="charliteral">')'</span>;</div><div class="line"><a name="l08754"></a><span class="lineno"> 8754</span>  }</div><div class="line"><a name="l08755"></a><span class="lineno"> 8755</span> };</div><div class="line"><a name="l08756"></a><span class="lineno"> 8756</span> </div><div class="line"><a name="l08757"></a><span class="lineno"> 8757</span> <span class="comment">// Printer for absl::variant</span></div><div class="line"><a name="l08758"></a><span class="lineno"> 8758</span> </div><div class="line"><a name="l08759"></a><span class="lineno"> 8759</span> <span class="keyword">template</span> <<span class="keyword">typename</span>... T></div><div class="line"><a name="l08760"></a><span class="lineno"> 8760</span> <span class="keyword">class </span>UniversalPrinter<::absl::variant<T...>> {</div><div class="line"><a name="l08761"></a><span class="lineno"> 8761</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l08762"></a><span class="lineno"> 8762</span>  <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classtesting_1_1internal_1_1_universal_printer.html#aecec021e1abbaa260b701e24e3fe33eb">Print</a>(const ::absl::variant<T...>& value, ::std::ostream* os) {</div><div class="line"><a name="l08763"></a><span class="lineno"> 8763</span>  *os << <span class="charliteral">'('</span>;</div><div class="line"><a name="l08764"></a><span class="lineno"> 8764</span>  absl::visit(Visitor{os}, value);</div><div class="line"><a name="l08765"></a><span class="lineno"> 8765</span>  *os << <span class="charliteral">')'</span>;</div><div class="line"><a name="l08766"></a><span class="lineno"> 8766</span>  }</div><div class="line"><a name="l08767"></a><span class="lineno"> 8767</span> </div><div class="line"><a name="l08768"></a><span class="lineno"> 8768</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l08769"></a><span class="lineno"> 8769</span>  <span class="keyword">struct </span>Visitor {</div><div class="line"><a name="l08770"></a><span class="lineno"> 8770</span>  <span class="keyword">template</span> <<span class="keyword">typename</span> U></div><div class="line"><a name="l08771"></a><span class="lineno"> 8771</span>  <span class="keywordtype">void</span> operator()(<span class="keyword">const</span> U& u)<span class="keyword"> const </span>{</div><div class="line"><a name="l08772"></a><span class="lineno"> 8772</span>  *os << <span class="stringliteral">"'"</span> << GetTypeName<U>() << <span class="stringliteral">"' with value "</span>;</div><div class="line"><a name="l08773"></a><span class="lineno"> 8773</span>  <a class="code" href="namespacetesting_1_1internal.html#a30708fa2bacf11895b03bdb21eb72309">UniversalPrint</a>(u, os);</div><div class="line"><a name="l08774"></a><span class="lineno"> 8774</span>  }</div><div class="line"><a name="l08775"></a><span class="lineno"> 8775</span>  ::std::ostream* os;</div><div class="line"><a name="l08776"></a><span class="lineno"> 8776</span>  };</div><div class="line"><a name="l08777"></a><span class="lineno"> 8777</span> };</div><div class="line"><a name="l08778"></a><span class="lineno"> 8778</span> </div><div class="line"><a name="l08779"></a><span class="lineno"> 8779</span> <span class="preprocessor">#endif // GTEST_HAS_ABSL</span></div><div class="line"><a name="l08780"></a><span class="lineno"> 8780</span> </div><div class="line"><a name="l08781"></a><span class="lineno"> 8781</span> <span class="comment">// UniversalPrintArray(begin, len, os) prints an array of 'len'</span></div><div class="line"><a name="l08782"></a><span class="lineno"> 8782</span> <span class="comment">// elements, starting at address 'begin'.</span></div><div class="line"><a name="l08783"></a><span class="lineno"> 8783</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l08784"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#ad79d71c3110f8eb24ab352d68f29436a"> 8784</a></span> <span class="keywordtype">void</span> <a class="code" href="namespacetesting_1_1internal.html#a070107e7a8205ad6ec4d538d52b15b38">UniversalPrintArray</a>(<span class="keyword">const</span> T* begin, <span class="keywordtype">size_t</span> len, ::std::ostream* os) {</div><div class="line"><a name="l08785"></a><span class="lineno"> 8785</span>  <span class="keywordflow">if</span> (len == 0) {</div><div class="line"><a name="l08786"></a><span class="lineno"> 8786</span>  *os << <span class="stringliteral">"{}"</span>;</div><div class="line"><a name="l08787"></a><span class="lineno"> 8787</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l08788"></a><span class="lineno"> 8788</span>  *os << <span class="stringliteral">"{ "</span>;</div><div class="line"><a name="l08789"></a><span class="lineno"> 8789</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> kThreshold = 18;</div><div class="line"><a name="l08790"></a><span class="lineno"> 8790</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> kChunkSize = 8;</div><div class="line"><a name="l08791"></a><span class="lineno"> 8791</span>  <span class="comment">// If the array has more than kThreshold elements, we'll have to</span></div><div class="line"><a name="l08792"></a><span class="lineno"> 8792</span>  <span class="comment">// omit some details by printing only the first and the last</span></div><div class="line"><a name="l08793"></a><span class="lineno"> 8793</span>  <span class="comment">// kChunkSize elements.</span></div><div class="line"><a name="l08794"></a><span class="lineno"> 8794</span>  <span class="keywordflow">if</span> (len <= kThreshold) {</div><div class="line"><a name="l08795"></a><span class="lineno"> 8795</span>  <a class="code" href="namespacetesting_1_1internal.html#ad3013b6b4c825edee9fe18ff1d982faa">PrintRawArrayTo</a>(begin, len, os);</div><div class="line"><a name="l08796"></a><span class="lineno"> 8796</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l08797"></a><span class="lineno"> 8797</span>  <a class="code" href="namespacetesting_1_1internal.html#ad3013b6b4c825edee9fe18ff1d982faa">PrintRawArrayTo</a>(begin, kChunkSize, os);</div><div class="line"><a name="l08798"></a><span class="lineno"> 8798</span>  *os << <span class="stringliteral">", ..., "</span>;</div><div class="line"><a name="l08799"></a><span class="lineno"> 8799</span>  <a class="code" href="namespacetesting_1_1internal.html#ad3013b6b4c825edee9fe18ff1d982faa">PrintRawArrayTo</a>(begin + len - kChunkSize, kChunkSize, os);</div><div class="line"><a name="l08800"></a><span class="lineno"> 8800</span>  }</div><div class="line"><a name="l08801"></a><span class="lineno"> 8801</span>  *os << <span class="stringliteral">" }"</span>;</div><div class="line"><a name="l08802"></a><span class="lineno"> 8802</span>  }</div><div class="line"><a name="l08803"></a><span class="lineno"> 8803</span> }</div><div class="line"><a name="l08804"></a><span class="lineno"> 8804</span> <span class="comment">// This overload prints a (const) char array compactly.</span></div><div class="line"><a name="l08805"></a><span class="lineno"> 8805</span> <a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> <span class="keywordtype">void</span> <a class="code" href="namespacetesting_1_1internal.html#a070107e7a8205ad6ec4d538d52b15b38">UniversalPrintArray</a>(</div><div class="line"><a name="l08806"></a><span class="lineno"> 8806</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* begin, <span class="keywordtype">size_t</span> len, ::std::ostream* os);</div><div class="line"><a name="l08807"></a><span class="lineno"> 8807</span> </div><div class="line"><a name="l08808"></a><span class="lineno"> 8808</span> <span class="comment">// This overload prints a (const) wchar_t array compactly.</span></div><div class="line"><a name="l08809"></a><span class="lineno"> 8809</span> <a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> <span class="keywordtype">void</span> <a class="code" href="namespacetesting_1_1internal.html#a070107e7a8205ad6ec4d538d52b15b38">UniversalPrintArray</a>(</div><div class="line"><a name="l08810"></a><span class="lineno"> 8810</span>  <span class="keyword">const</span> <span class="keywordtype">wchar_t</span>* begin, <span class="keywordtype">size_t</span> len, ::std::ostream* os);</div><div class="line"><a name="l08811"></a><span class="lineno"> 8811</span> </div><div class="line"><a name="l08812"></a><span class="lineno"> 8812</span> <span class="comment">// Implements printing an array type T[N].</span></div><div class="line"><a name="l08813"></a><span class="lineno"> 8813</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T, <span class="keywordtype">size_t</span> N></div><div class="line"><a name="l08814"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_universal_printer_3_01_t[_n]_4.html"> 8814</a></span> <span class="keyword">class </span><a class="code" href="classtesting_1_1internal_1_1_universal_printer.html">UniversalPrinter</a><T[N]> {</div><div class="line"><a name="l08815"></a><span class="lineno"> 8815</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l08816"></a><span class="lineno"> 8816</span>  <span class="comment">// Prints the given array, omitting some elements when there are too</span></div><div class="line"><a name="l08817"></a><span class="lineno"> 8817</span>  <span class="comment">// many.</span></div><div class="line"><a name="l08818"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_universal_printer_3_01_t[_n]_4.html#a1cf0e7c8db59c090f769116c6421b212"> 8818</a></span>  <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classtesting_1_1internal_1_1_universal_printer_3_01_t[_n]_4.html#a1cf0e7c8db59c090f769116c6421b212">Print</a>(<span class="keyword">const</span> T (&a)[N], ::std::ostream* os) {</div><div class="line"><a name="l08819"></a><span class="lineno"> 8819</span>  <a class="code" href="namespacetesting_1_1internal.html#a070107e7a8205ad6ec4d538d52b15b38">UniversalPrintArray</a>(a, N, os);</div><div class="line"><a name="l08820"></a><span class="lineno"> 8820</span>  }</div><div class="line"><a name="l08821"></a><span class="lineno"> 8821</span> };</div><div class="line"><a name="l08822"></a><span class="lineno"> 8822</span> </div><div class="line"><a name="l08823"></a><span class="lineno"> 8823</span> <span class="comment">// Implements printing a reference type T&.</span></div><div class="line"><a name="l08824"></a><span class="lineno"> 8824</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l08825"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_universal_printer_3_01_t_01_6_01_4.html"> 8825</a></span> <span class="keyword">class </span><a class="code" href="classtesting_1_1internal_1_1_universal_printer.html">UniversalPrinter</a><T&> {</div><div class="line"><a name="l08826"></a><span class="lineno"> 8826</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l08827"></a><span class="lineno"> 8827</span>  <span class="comment">// MSVC warns about adding const to a function type, so we want to</span></div><div class="line"><a name="l08828"></a><span class="lineno"> 8828</span>  <span class="comment">// disable the warning.</span></div><div class="line"><a name="l08829"></a><span class="lineno"> 8829</span>  <a class="code" href="gtest_8h.html#a86994cc68e844d8b82089c70408dfc61">GTEST_DISABLE_MSC_WARNINGS_PUSH_</a>(4180)</div><div class="line"><a name="l08830"></a><span class="lineno"> 8830</span> </div><div class="line"><a name="l08831"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_universal_printer_3_01_t_01_6_01_4.html#a923a694be8aa66117848c1c5f57ede35"> 8831</a></span>  static <span class="keywordtype">void</span> Print(const T& value, ::std::ostream* os) {</div><div class="line"><a name="l08832"></a><span class="lineno"> 8832</span>  <span class="comment">// Prints the address of the value. We use reinterpret_cast here</span></div><div class="line"><a name="l08833"></a><span class="lineno"> 8833</span>  <span class="comment">// as static_cast doesn't compile when T is a function type.</span></div><div class="line"><a name="l08834"></a><span class="lineno"> 8834</span>  *os << <span class="stringliteral">"@"</span> << <span class="keyword">reinterpret_cast<</span><span class="keyword">const </span><span class="keywordtype">void</span>*<span class="keyword">></span>(&value) << <span class="stringliteral">" "</span>;</div><div class="line"><a name="l08835"></a><span class="lineno"> 8835</span> </div><div class="line"><a name="l08836"></a><span class="lineno"> 8836</span>  <span class="comment">// Then prints the value itself.</span></div><div class="line"><a name="l08837"></a><span class="lineno"> 8837</span>  <a class="code" href="namespacetesting_1_1internal.html#a30708fa2bacf11895b03bdb21eb72309">UniversalPrint</a>(value, os);</div><div class="line"><a name="l08838"></a><span class="lineno"> 8838</span>  }</div><div class="line"><a name="l08839"></a><span class="lineno"> 8839</span> </div><div class="line"><a name="l08840"></a><span class="lineno"> 8840</span>  <a class="code" href="gtest_8h.html#aebf8277c9069c1e124f9a5bbe2948061">GTEST_DISABLE_MSC_WARNINGS_POP_</a>()</div><div class="line"><a name="l08841"></a><span class="lineno"> 8841</span> };</div><div class="line"><a name="l08842"></a><span class="lineno"> 8842</span> </div><div class="line"><a name="l08843"></a><span class="lineno"> 8843</span> <span class="comment">// Prints a value tersely: for a reference type, the referenced value</span></div><div class="line"><a name="l08844"></a><span class="lineno"> 8844</span> <span class="comment">// (but not the address) is printed; for a (const) char pointer, the</span></div><div class="line"><a name="l08845"></a><span class="lineno"> 8845</span> <span class="comment">// NUL-terminated string (but not the pointer) is printed.</span></div><div class="line"><a name="l08846"></a><span class="lineno"> 8846</span> </div><div class="line"><a name="l08847"></a><span class="lineno"> 8847</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l08848"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_universal_terse_printer.html"> 8848</a></span> <span class="keyword">class </span><a class="code" href="classtesting_1_1internal_1_1_universal_terse_printer.html">UniversalTersePrinter</a> {</div><div class="line"><a name="l08849"></a><span class="lineno"> 8849</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l08850"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_universal_terse_printer.html#a042249cdb42fdb77588c9ad54ea7ed54"> 8850</a></span>  <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classtesting_1_1internal_1_1_universal_terse_printer.html#a042249cdb42fdb77588c9ad54ea7ed54">Print</a>(<span class="keyword">const</span> T& value, ::std::ostream* os) {</div><div class="line"><a name="l08851"></a><span class="lineno"> 8851</span>  <a class="code" href="namespacetesting_1_1internal.html#a30708fa2bacf11895b03bdb21eb72309">UniversalPrint</a>(value, os);</div><div class="line"><a name="l08852"></a><span class="lineno"> 8852</span>  }</div><div class="line"><a name="l08853"></a><span class="lineno"> 8853</span> };</div><div class="line"><a name="l08854"></a><span class="lineno"> 8854</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l08855"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_universal_terse_printer_3_01_t_01_6_01_4.html"> 8855</a></span> <span class="keyword">class </span><a class="code" href="classtesting_1_1internal_1_1_universal_terse_printer.html">UniversalTersePrinter</a><T&> {</div><div class="line"><a name="l08856"></a><span class="lineno"> 8856</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l08857"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_universal_terse_printer_3_01_t_01_6_01_4.html#a931f93cc52a3046706c87d0a90640483"> 8857</a></span>  <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classtesting_1_1internal_1_1_universal_terse_printer_3_01_t_01_6_01_4.html#a931f93cc52a3046706c87d0a90640483">Print</a>(<span class="keyword">const</span> T& value, ::std::ostream* os) {</div><div class="line"><a name="l08858"></a><span class="lineno"> 8858</span>  <a class="code" href="namespacetesting_1_1internal.html#a30708fa2bacf11895b03bdb21eb72309">UniversalPrint</a>(value, os);</div><div class="line"><a name="l08859"></a><span class="lineno"> 8859</span>  }</div><div class="line"><a name="l08860"></a><span class="lineno"> 8860</span> };</div><div class="line"><a name="l08861"></a><span class="lineno"> 8861</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T, <span class="keywordtype">size_t</span> N></div><div class="line"><a name="l08862"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_universal_terse_printer_3_01_t[_n]_4.html"> 8862</a></span> <span class="keyword">class </span><a class="code" href="classtesting_1_1internal_1_1_universal_terse_printer.html">UniversalTersePrinter</a><T[N]> {</div><div class="line"><a name="l08863"></a><span class="lineno"> 8863</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l08864"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_universal_terse_printer_3_01_t[_n]_4.html#a9e0ceb62fda7dc46ebcf5f911e459a49"> 8864</a></span>  <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classtesting_1_1internal_1_1_universal_terse_printer_3_01_t[_n]_4.html#a9e0ceb62fda7dc46ebcf5f911e459a49">Print</a>(<span class="keyword">const</span> T (&value)[N], ::std::ostream* os) {</div><div class="line"><a name="l08865"></a><span class="lineno"> 8865</span>  <a class="code" href="classtesting_1_1internal_1_1_universal_printer.html#aecec021e1abbaa260b701e24e3fe33eb">UniversalPrinter<T[N]>::Print</a>(value, os);</div><div class="line"><a name="l08866"></a><span class="lineno"> 8866</span>  }</div><div class="line"><a name="l08867"></a><span class="lineno"> 8867</span> };</div><div class="line"><a name="l08868"></a><span class="lineno"> 8868</span> <span class="keyword">template</span> <></div><div class="line"><a name="l08869"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_universal_terse_printer_3_01const_01char_01_5_01_4.html"> 8869</a></span> <span class="keyword">class </span><a class="code" href="classtesting_1_1internal_1_1_universal_terse_printer.html">UniversalTersePrinter</a><const char*> {</div><div class="line"><a name="l08870"></a><span class="lineno"> 8870</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l08871"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_universal_terse_printer_3_01const_01char_01_5_01_4.html#a37a3be2d26dc07b24d16c2b5eb88ecda"> 8871</a></span>  <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classtesting_1_1internal_1_1_universal_terse_printer_3_01const_01char_01_5_01_4.html#a37a3be2d26dc07b24d16c2b5eb88ecda">Print</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* str, ::std::ostream* os) {</div><div class="line"><a name="l08872"></a><span class="lineno"> 8872</span>  <span class="keywordflow">if</span> (str == <span class="keyword">nullptr</span>) {</div><div class="line"><a name="l08873"></a><span class="lineno"> 8873</span>  *os << <span class="stringliteral">"NULL"</span>;</div><div class="line"><a name="l08874"></a><span class="lineno"> 8874</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l08875"></a><span class="lineno"> 8875</span>  <a class="code" href="namespacetesting_1_1internal.html#a30708fa2bacf11895b03bdb21eb72309">UniversalPrint</a>(<a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a>(str), os);</div><div class="line"><a name="l08876"></a><span class="lineno"> 8876</span>  }</div><div class="line"><a name="l08877"></a><span class="lineno"> 8877</span>  }</div><div class="line"><a name="l08878"></a><span class="lineno"> 8878</span> };</div><div class="line"><a name="l08879"></a><span class="lineno"> 8879</span> <span class="keyword">template</span> <></div><div class="line"><a name="l08880"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_universal_terse_printer_3_01char_01_5_01_4.html"> 8880</a></span> <span class="keyword">class </span><a class="code" href="classtesting_1_1internal_1_1_universal_terse_printer.html">UniversalTersePrinter</a><char*> {</div><div class="line"><a name="l08881"></a><span class="lineno"> 8881</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l08882"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_universal_terse_printer_3_01char_01_5_01_4.html#aa9ef95587c1461fe33e254af52401a43"> 8882</a></span>  <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classtesting_1_1internal_1_1_universal_terse_printer_3_01char_01_5_01_4.html#aa9ef95587c1461fe33e254af52401a43">Print</a>(<span class="keywordtype">char</span>* str, ::std::ostream* os) {</div><div class="line"><a name="l08883"></a><span class="lineno"> 8883</span>  <a class="code" href="classtesting_1_1internal_1_1_universal_terse_printer.html#a042249cdb42fdb77588c9ad54ea7ed54">UniversalTersePrinter<const char*>::Print</a>(str, os);</div><div class="line"><a name="l08884"></a><span class="lineno"> 8884</span>  }</div><div class="line"><a name="l08885"></a><span class="lineno"> 8885</span> };</div><div class="line"><a name="l08886"></a><span class="lineno"> 8886</span> </div><div class="line"><a name="l08887"></a><span class="lineno"> 8887</span> <span class="preprocessor">#if GTEST_HAS_STD_WSTRING</span></div><div class="line"><a name="l08888"></a><span class="lineno"> 8888</span> <span class="keyword">template</span> <></div><div class="line"><a name="l08889"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_universal_terse_printer_3_01const_01wchar__t_01_5_01_4.html"> 8889</a></span> <span class="keyword">class </span><a class="code" href="classtesting_1_1internal_1_1_universal_terse_printer.html">UniversalTersePrinter</a><const wchar_t*> {</div><div class="line"><a name="l08890"></a><span class="lineno"> 8890</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l08891"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_universal_terse_printer_3_01const_01wchar__t_01_5_01_4.html#af0d3bb36d6defbc67c43e5785e939478"> 8891</a></span>  <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classtesting_1_1internal_1_1_universal_terse_printer_3_01const_01wchar__t_01_5_01_4.html#af0d3bb36d6defbc67c43e5785e939478">Print</a>(<span class="keyword">const</span> <span class="keywordtype">wchar_t</span>* str, ::std::ostream* os) {</div><div class="line"><a name="l08892"></a><span class="lineno"> 8892</span>  <span class="keywordflow">if</span> (str == <span class="keyword">nullptr</span>) {</div><div class="line"><a name="l08893"></a><span class="lineno"> 8893</span>  *os << <span class="stringliteral">"NULL"</span>;</div><div class="line"><a name="l08894"></a><span class="lineno"> 8894</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l08895"></a><span class="lineno"> 8895</span>  <a class="code" href="namespacetesting_1_1internal.html#a30708fa2bacf11895b03bdb21eb72309">UniversalPrint</a>(::<a class="code" href="namespacetesting_1_1internal.html#a3f543179329c353aee1d7b54a9a8e335">std::wstring</a>(str), os);</div><div class="line"><a name="l08896"></a><span class="lineno"> 8896</span>  }</div><div class="line"><a name="l08897"></a><span class="lineno"> 8897</span>  }</div><div class="line"><a name="l08898"></a><span class="lineno"> 8898</span> };</div><div class="line"><a name="l08899"></a><span class="lineno"> 8899</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l08900"></a><span class="lineno"> 8900</span> </div><div class="line"><a name="l08901"></a><span class="lineno"> 8901</span> <span class="keyword">template</span> <></div><div class="line"><a name="l08902"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_universal_terse_printer_3_01wchar__t_01_5_01_4.html"> 8902</a></span> <span class="keyword">class </span><a class="code" href="classtesting_1_1internal_1_1_universal_terse_printer.html">UniversalTersePrinter</a><wchar_t*> {</div><div class="line"><a name="l08903"></a><span class="lineno"> 8903</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l08904"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_universal_terse_printer_3_01wchar__t_01_5_01_4.html#a9cdf673b44d19e6879253f30f11cd740"> 8904</a></span>  <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classtesting_1_1internal_1_1_universal_terse_printer_3_01wchar__t_01_5_01_4.html#a9cdf673b44d19e6879253f30f11cd740">Print</a>(<span class="keywordtype">wchar_t</span>* str, ::std::ostream* os) {</div><div class="line"><a name="l08905"></a><span class="lineno"> 8905</span>  <a class="code" href="classtesting_1_1internal_1_1_universal_terse_printer.html#a042249cdb42fdb77588c9ad54ea7ed54">UniversalTersePrinter<const wchar_t*>::Print</a>(str, os);</div><div class="line"><a name="l08906"></a><span class="lineno"> 8906</span>  }</div><div class="line"><a name="l08907"></a><span class="lineno"> 8907</span> };</div><div class="line"><a name="l08908"></a><span class="lineno"> 8908</span> </div><div class="line"><a name="l08909"></a><span class="lineno"> 8909</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l08910"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#afa92f5a284929dc3723e654a25feb7b9"> 8910</a></span> <span class="keywordtype">void</span> <a class="code" href="namespacetesting_1_1internal.html#afa92f5a284929dc3723e654a25feb7b9">UniversalTersePrint</a>(<span class="keyword">const</span> T& value, ::std::ostream* os) {</div><div class="line"><a name="l08911"></a><span class="lineno"> 8911</span>  <a class="code" href="classtesting_1_1internal_1_1_universal_terse_printer.html#a042249cdb42fdb77588c9ad54ea7ed54">UniversalTersePrinter<T>::Print</a>(value, os);</div><div class="line"><a name="l08912"></a><span class="lineno"> 8912</span> }</div><div class="line"><a name="l08913"></a><span class="lineno"> 8913</span> </div><div class="line"><a name="l08914"></a><span class="lineno"> 8914</span> <span class="comment">// Prints a value using the type inferred by the compiler. The</span></div><div class="line"><a name="l08915"></a><span class="lineno"> 8915</span> <span class="comment">// difference between this and UniversalTersePrint() is that for a</span></div><div class="line"><a name="l08916"></a><span class="lineno"> 8916</span> <span class="comment">// (const) char pointer, this prints both the pointer and the</span></div><div class="line"><a name="l08917"></a><span class="lineno"> 8917</span> <span class="comment">// NUL-terminated string.</span></div><div class="line"><a name="l08918"></a><span class="lineno"> 8918</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l08919"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#a30708fa2bacf11895b03bdb21eb72309"> 8919</a></span> <span class="keywordtype">void</span> <a class="code" href="namespacetesting_1_1internal.html#a30708fa2bacf11895b03bdb21eb72309">UniversalPrint</a>(<span class="keyword">const</span> T& value, ::std::ostream* os) {</div><div class="line"><a name="l08920"></a><span class="lineno"> 8920</span>  <span class="comment">// A workarond for the bug in VC++ 7.1 that prevents us from instantiating</span></div><div class="line"><a name="l08921"></a><span class="lineno"> 8921</span>  <span class="comment">// UniversalPrinter with T directly.</span></div><div class="line"><a name="l08922"></a><span class="lineno"> 8922</span>  <span class="keyword">typedef</span> T T1;</div><div class="line"><a name="l08923"></a><span class="lineno"> 8923</span>  <a class="code" href="classtesting_1_1internal_1_1_universal_printer.html#aecec021e1abbaa260b701e24e3fe33eb">UniversalPrinter<T1>::Print</a>(value, os);</div><div class="line"><a name="l08924"></a><span class="lineno"> 8924</span> }</div><div class="line"><a name="l08925"></a><span class="lineno"> 8925</span> </div><div class="line"><a name="l08926"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#a50003bb76ec2934be1062be11efba8bf"> 8926</a></span> typedef ::std::vector< ::std::string> <a class="code" href="namespacetesting_1_1internal.html#a50003bb76ec2934be1062be11efba8bf">Strings</a>;</div><div class="line"><a name="l08927"></a><span class="lineno"> 8927</span> </div><div class="line"><a name="l08928"></a><span class="lineno"> 8928</span>  <span class="comment">// Tersely prints the first N fields of a tuple to a string vector,</span></div><div class="line"><a name="l08929"></a><span class="lineno"> 8929</span>  <span class="comment">// one element for each field.</span></div><div class="line"><a name="l08930"></a><span class="lineno"> 8930</span> <span class="keyword">template</span> <<span class="keyword">typename</span> Tuple></div><div class="line"><a name="l08931"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#a6300aa1440d0019cf08d9a1f6efd4382"> 8931</a></span> <span class="keywordtype">void</span> <a class="code" href="namespacetesting_1_1internal.html#a6300aa1440d0019cf08d9a1f6efd4382">TersePrintPrefixToStrings</a>(<span class="keyword">const</span> Tuple&, std::integral_constant<size_t, 0>,</div><div class="line"><a name="l08932"></a><span class="lineno"> 8932</span>  <a class="code" href="namespacetesting_1_1internal.html#a50003bb76ec2934be1062be11efba8bf">Strings</a>*) {}</div><div class="line"><a name="l08933"></a><span class="lineno"> 8933</span> <span class="keyword">template</span> <<span class="keyword">typename</span> Tuple, <span class="keywordtype">size_t</span> I></div><div class="line"><a name="l08934"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#ab244273c02742a3fac45cc241befc536"> 8934</a></span> <span class="keywordtype">void</span> <a class="code" href="namespacetesting_1_1internal.html#a6300aa1440d0019cf08d9a1f6efd4382">TersePrintPrefixToStrings</a>(<span class="keyword">const</span> Tuple& t,</div><div class="line"><a name="l08935"></a><span class="lineno"> 8935</span>  std::integral_constant<size_t, I>,</div><div class="line"><a name="l08936"></a><span class="lineno"> 8936</span>  <a class="code" href="namespacetesting_1_1internal.html#a50003bb76ec2934be1062be11efba8bf">Strings</a>* strings) {</div><div class="line"><a name="l08937"></a><span class="lineno"> 8937</span>  <a class="code" href="namespacetesting_1_1internal.html#a6300aa1440d0019cf08d9a1f6efd4382">TersePrintPrefixToStrings</a>(t, std::integral_constant<size_t, I - 1>(),</div><div class="line"><a name="l08938"></a><span class="lineno"> 8938</span>  strings);</div><div class="line"><a name="l08939"></a><span class="lineno"> 8939</span>  ::std::stringstream ss;</div><div class="line"><a name="l08940"></a><span class="lineno"> 8940</span>  <a class="code" href="namespacetesting_1_1internal.html#afa92f5a284929dc3723e654a25feb7b9">UniversalTersePrint</a>(std::get<I - 1>(t), &ss);</div><div class="line"><a name="l08941"></a><span class="lineno"> 8941</span>  strings->push_back(ss.str());</div><div class="line"><a name="l08942"></a><span class="lineno"> 8942</span> }</div><div class="line"><a name="l08943"></a><span class="lineno"> 8943</span> </div><div class="line"><a name="l08944"></a><span class="lineno"> 8944</span> <span class="comment">// Prints the fields of a tuple tersely to a string vector, one</span></div><div class="line"><a name="l08945"></a><span class="lineno"> 8945</span> <span class="comment">// element for each field. See the comment before</span></div><div class="line"><a name="l08946"></a><span class="lineno"> 8946</span> <span class="comment">// UniversalTersePrint() for how we define "tersely".</span></div><div class="line"><a name="l08947"></a><span class="lineno"> 8947</span> <span class="keyword">template</span> <<span class="keyword">typename</span> Tuple></div><div class="line"><a name="l08948"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#a7e60d1478b074801c766eeee9be6c772"> 8948</a></span> <a class="code" href="namespacetesting_1_1internal.html#a50003bb76ec2934be1062be11efba8bf">Strings</a> <a class="code" href="namespacetesting_1_1internal.html#a7e60d1478b074801c766eeee9be6c772">UniversalTersePrintTupleFieldsToStrings</a>(<span class="keyword">const</span> Tuple& value) {</div><div class="line"><a name="l08949"></a><span class="lineno"> 8949</span>  <a class="code" href="namespacetesting_1_1internal.html#a50003bb76ec2934be1062be11efba8bf">Strings</a> result;</div><div class="line"><a name="l08950"></a><span class="lineno"> 8950</span>  <a class="code" href="namespacetesting_1_1internal.html#a6300aa1440d0019cf08d9a1f6efd4382">TersePrintPrefixToStrings</a>(</div><div class="line"><a name="l08951"></a><span class="lineno"> 8951</span>  value, std::integral_constant<<span class="keywordtype">size_t</span>, std::tuple_size<Tuple>::value>(),</div><div class="line"><a name="l08952"></a><span class="lineno"> 8952</span>  &result);</div><div class="line"><a name="l08953"></a><span class="lineno"> 8953</span>  <span class="keywordflow">return</span> result;</div><div class="line"><a name="l08954"></a><span class="lineno"> 8954</span> }</div><div class="line"><a name="l08955"></a><span class="lineno"> 8955</span> </div><div class="line"><a name="l08956"></a><span class="lineno"> 8956</span> } <span class="comment">// namespace internal</span></div><div class="line"><a name="l08957"></a><span class="lineno"> 8957</span> </div><div class="line"><a name="l08958"></a><span class="lineno"> 8958</span> <span class="preprocessor">#if GTEST_HAS_ABSL</span></div><div class="line"><a name="l08959"></a><span class="lineno"> 8959</span> <span class="keyword">namespace </span>internal2 {</div><div class="line"><a name="l08960"></a><span class="lineno"> 8960</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l08961"></a><span class="lineno"> 8961</span> <span class="keywordtype">void</span> <a class="code" href="classtesting_1_1internal2_1_1_type_without_formatter.html#a6651f6f7be2c0f899729eeb6038f76d3">TypeWithoutFormatter<T, kConvertibleToStringView>::PrintValue</a>(</div><div class="line"><a name="l08962"></a><span class="lineno"> 8962</span>  <span class="keyword">const</span> T& value, ::std::ostream* os) {</div><div class="line"><a name="l08963"></a><span class="lineno"> 8963</span>  <a class="code" href="namespacetesting_1_1internal.html#aa7e70a85d66f0c109e3e69629ef577f2">internal::PrintTo</a>(absl::string_view(value), os);</div><div class="line"><a name="l08964"></a><span class="lineno"> 8964</span> }</div><div class="line"><a name="l08965"></a><span class="lineno"> 8965</span> } <span class="comment">// namespace internal2</span></div><div class="line"><a name="l08966"></a><span class="lineno"> 8966</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l08967"></a><span class="lineno"> 8967</span> </div><div class="line"><a name="l08968"></a><span class="lineno"> 8968</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l08969"></a><span class="lineno"><a class="line" href="namespacetesting.html#aa5717bb1144edd1d262d310ba70c82ed"> 8969</a></span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">::std::string</a> <a class="code" href="namespacetesting.html#aa5717bb1144edd1d262d310ba70c82ed">PrintToString</a>(<span class="keyword">const</span> T& value) {</div><div class="line"><a name="l08970"></a><span class="lineno"> 8970</span>  ::std::stringstream ss;</div><div class="line"><a name="l08971"></a><span class="lineno"> 8971</span>  <a class="code" href="classtesting_1_1internal_1_1_universal_terse_printer.html#a042249cdb42fdb77588c9ad54ea7ed54">internal::UniversalTersePrinter<T>::Print</a>(value, &ss);</div><div class="line"><a name="l08972"></a><span class="lineno"> 8972</span>  <span class="keywordflow">return</span> ss.str();</div><div class="line"><a name="l08973"></a><span class="lineno"> 8973</span> }</div><div class="line"><a name="l08974"></a><span class="lineno"> 8974</span> </div><div class="line"><a name="l08975"></a><span class="lineno"> 8975</span> } <span class="comment">// namespace testing</span></div><div class="line"><a name="l08976"></a><span class="lineno"> 8976</span> </div><div class="line"><a name="l08977"></a><span class="lineno"> 8977</span> <span class="comment">// Include any custom printer added by the local installation.</span></div><div class="line"><a name="l08978"></a><span class="lineno"> 8978</span> <span class="comment">// We must include this header at the end to make sure it can use the</span></div><div class="line"><a name="l08979"></a><span class="lineno"> 8979</span> <span class="comment">// declarations from this file.</span></div><div class="line"><a name="l08980"></a><span class="lineno"> 8980</span> <span class="comment">// Copyright 2015, Google Inc.</span></div><div class="line"><a name="l08981"></a><span class="lineno"> 8981</span> <span class="comment">// All rights reserved.</span></div><div class="line"><a name="l08982"></a><span class="lineno"> 8982</span> <span class="comment">//</span></div><div class="line"><a name="l08983"></a><span class="lineno"> 8983</span> <span class="comment">// Redistribution and use in source and binary forms, with or without</span></div><div class="line"><a name="l08984"></a><span class="lineno"> 8984</span> <span class="comment">// modification, are permitted provided that the following conditions are</span></div><div class="line"><a name="l08985"></a><span class="lineno"> 8985</span> <span class="comment">// met:</span></div><div class="line"><a name="l08986"></a><span class="lineno"> 8986</span> <span class="comment">//</span></div><div class="line"><a name="l08987"></a><span class="lineno"> 8987</span> <span class="comment">// * Redistributions of source code must retain the above copyright</span></div><div class="line"><a name="l08988"></a><span class="lineno"> 8988</span> <span class="comment">// notice, this list of conditions and the following disclaimer.</span></div><div class="line"><a name="l08989"></a><span class="lineno"> 8989</span> <span class="comment">// * Redistributions in binary form must reproduce the above</span></div><div class="line"><a name="l08990"></a><span class="lineno"> 8990</span> <span class="comment">// copyright notice, this list of conditions and the following disclaimer</span></div><div class="line"><a name="l08991"></a><span class="lineno"> 8991</span> <span class="comment">// in the documentation and/or other materials provided with the</span></div><div class="line"><a name="l08992"></a><span class="lineno"> 8992</span> <span class="comment">// distribution.</span></div><div class="line"><a name="l08993"></a><span class="lineno"> 8993</span> <span class="comment">// * Neither the name of Google Inc. nor the names of its</span></div><div class="line"><a name="l08994"></a><span class="lineno"> 8994</span> <span class="comment">// contributors may be used to endorse or promote products derived from</span></div><div class="line"><a name="l08995"></a><span class="lineno"> 8995</span> <span class="comment">// this software without specific prior written permission.</span></div><div class="line"><a name="l08996"></a><span class="lineno"> 8996</span> <span class="comment">//</span></div><div class="line"><a name="l08997"></a><span class="lineno"> 8997</span> <span class="comment">// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS</span></div><div class="line"><a name="l08998"></a><span class="lineno"> 8998</span> <span class="comment">// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT</span></div><div class="line"><a name="l08999"></a><span class="lineno"> 8999</span> <span class="comment">// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR</span></div><div class="line"><a name="l09000"></a><span class="lineno"> 9000</span> <span class="comment">// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT</span></div><div class="line"><a name="l09001"></a><span class="lineno"> 9001</span> <span class="comment">// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,</span></div><div class="line"><a name="l09002"></a><span class="lineno"> 9002</span> <span class="comment">// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT</span></div><div class="line"><a name="l09003"></a><span class="lineno"> 9003</span> <span class="comment">// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,</span></div><div class="line"><a name="l09004"></a><span class="lineno"> 9004</span> <span class="comment">// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY</span></div><div class="line"><a name="l09005"></a><span class="lineno"> 9005</span> <span class="comment">// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</span></div><div class="line"><a name="l09006"></a><span class="lineno"> 9006</span> <span class="comment">// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE</span></div><div class="line"><a name="l09007"></a><span class="lineno"> 9007</span> <span class="comment">// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span></div><div class="line"><a name="l09008"></a><span class="lineno"> 9008</span> <span class="comment">//</span></div><div class="line"><a name="l09009"></a><span class="lineno"> 9009</span> <span class="comment">// This file provides an injection point for custom printers in a local</span></div><div class="line"><a name="l09010"></a><span class="lineno"> 9010</span> <span class="comment">// installation of gTest.</span></div><div class="line"><a name="l09011"></a><span class="lineno"> 9011</span> <span class="comment">// It will be included from gtest-printers.h and the overrides in this file</span></div><div class="line"><a name="l09012"></a><span class="lineno"> 9012</span> <span class="comment">// will be visible to everyone.</span></div><div class="line"><a name="l09013"></a><span class="lineno"> 9013</span> <span class="comment">//</span></div><div class="line"><a name="l09014"></a><span class="lineno"> 9014</span> <span class="comment">// Injection point for custom user configurations. See README for details</span></div><div class="line"><a name="l09015"></a><span class="lineno"> 9015</span> <span class="comment">//</span></div><div class="line"><a name="l09016"></a><span class="lineno"> 9016</span> <span class="comment">// ** Custom implementation starts here **</span></div><div class="line"><a name="l09017"></a><span class="lineno"> 9017</span> </div><div class="line"><a name="l09018"></a><span class="lineno"> 9018</span> <span class="preprocessor">#ifndef GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PRINTERS_H_</span></div><div class="line"><a name="l09019"></a><span class="lineno"><a class="line" href="gtest_8h.html#a790dd922b87864bf5b8d93a22853933c"> 9019</a></span> <span class="preprocessor">#define GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PRINTERS_H_</span></div><div class="line"><a name="l09020"></a><span class="lineno"> 9020</span> </div><div class="line"><a name="l09021"></a><span class="lineno"> 9021</span> <span class="preprocessor">#endif // GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PRINTERS_H_</span></div><div class="line"><a name="l09022"></a><span class="lineno"> 9022</span> </div><div class="line"><a name="l09023"></a><span class="lineno"> 9023</span> <span class="preprocessor">#endif // GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_</span></div><div class="line"><a name="l09024"></a><span class="lineno"> 9024</span> </div><div class="line"><a name="l09025"></a><span class="lineno"> 9025</span> <a class="code" href="gtest_8h.html#a86994cc68e844d8b82089c70408dfc61">GTEST_DISABLE_MSC_WARNINGS_PUSH_</a>(</div><div class="line"><a name="l09026"></a><span class="lineno"> 9026</span>  4251 5046 <span class="comment">/* class A needs to have dll-interface to be used by clients of</span></div><div class="line"><a name="l09027"></a><span class="lineno"> 9027</span> <span class="comment"> class B */</span></div><div class="line"><a name="l09028"></a><span class="lineno"> 9028</span>  <span class="comment">/* Symbol involving type with internal linkage not defined */</span>)</div><div class="line"><a name="l09029"></a><span class="lineno"> 9029</span> </div><div class="line"><a name="l09030"></a><span class="lineno"> 9030</span> namespace <a class="code" href="namespacetesting.html">testing</a> {</div><div class="line"><a name="l09031"></a><span class="lineno"> 9031</span> </div><div class="line"><a name="l09032"></a><span class="lineno"> 9032</span> <span class="comment">// To implement a matcher Foo for type T, define:</span></div><div class="line"><a name="l09033"></a><span class="lineno"> 9033</span> <span class="comment">// 1. a class FooMatcherImpl that implements the</span></div><div class="line"><a name="l09034"></a><span class="lineno"> 9034</span> <span class="comment">// MatcherInterface<T> interface, and</span></div><div class="line"><a name="l09035"></a><span class="lineno"> 9035</span> <span class="comment">// 2. a factory function that creates a Matcher<T> object from a</span></div><div class="line"><a name="l09036"></a><span class="lineno"> 9036</span> <span class="comment">// FooMatcherImpl*.</span></div><div class="line"><a name="l09037"></a><span class="lineno"> 9037</span> <span class="comment">//</span></div><div class="line"><a name="l09038"></a><span class="lineno"> 9038</span> <span class="comment">// The two-level delegation design makes it possible to allow a user</span></div><div class="line"><a name="l09039"></a><span class="lineno"> 9039</span> <span class="comment">// to write "v" instead of "Eq(v)" where a Matcher is expected, which</span></div><div class="line"><a name="l09040"></a><span class="lineno"> 9040</span> <span class="comment">// is impossible if we pass matchers by pointers. It also eases</span></div><div class="line"><a name="l09041"></a><span class="lineno"> 9041</span> <span class="comment">// ownership management as Matcher objects can now be copied like</span></div><div class="line"><a name="l09042"></a><span class="lineno"> 9042</span> <span class="comment">// plain values.</span></div><div class="line"><a name="l09043"></a><span class="lineno"> 9043</span> </div><div class="line"><a name="l09044"></a><span class="lineno"> 9044</span> <span class="comment">// MatchResultListener is an abstract class. Its << operator can be</span></div><div class="line"><a name="l09045"></a><span class="lineno"> 9045</span> <span class="comment">// used by a matcher to explain why a value matches or doesn't match.</span></div><div class="line"><a name="l09046"></a><span class="lineno"> 9046</span> <span class="comment">//</span></div><div class="line"><a name="l09047"></a><span class="lineno"> 9047</span> <span class="keyword">class </span>MatchResultListener {</div><div class="line"><a name="l09048"></a><span class="lineno"> 9048</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l09049"></a><span class="lineno"> 9049</span>  <span class="comment">// Creates a listener object with the given underlying ostream. The</span></div><div class="line"><a name="l09050"></a><span class="lineno"> 9050</span>  <span class="comment">// listener does not own the ostream, and does not dereference it</span></div><div class="line"><a name="l09051"></a><span class="lineno"> 9051</span>  <span class="comment">// in the constructor or destructor.</span></div><div class="line"><a name="l09052"></a><span class="lineno"> 9052</span>  <span class="keyword">explicit</span> MatchResultListener(::std::ostream* os) : stream_(os) {}</div><div class="line"><a name="l09053"></a><span class="lineno"> 9053</span>  <span class="keyword">virtual</span> ~MatchResultListener() = 0; <span class="comment">// Makes this class abstract.</span></div><div class="line"><a name="l09054"></a><span class="lineno"> 9054</span> </div><div class="line"><a name="l09055"></a><span class="lineno"> 9055</span>  <span class="comment">// Streams x to the underlying ostream; does nothing if the ostream</span></div><div class="line"><a name="l09056"></a><span class="lineno"> 9056</span>  <span class="comment">// is NULL.</span></div><div class="line"><a name="l09057"></a><span class="lineno"> 9057</span>  <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l09058"></a><span class="lineno"> 9058</span>  MatchResultListener& <a class="code" href="namespacetesting_1_1internal2.html#a07dbe129beb8952074f04b599dfce39b">operator<<</a>(<span class="keyword">const</span> T& x) {</div><div class="line"><a name="l09059"></a><span class="lineno"> 9059</span>  <span class="keywordflow">if</span> (stream_ != <span class="keyword">nullptr</span>) *stream_ << x;</div><div class="line"><a name="l09060"></a><span class="lineno"> 9060</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l09061"></a><span class="lineno"> 9061</span>  }</div><div class="line"><a name="l09062"></a><span class="lineno"> 9062</span> </div><div class="line"><a name="l09063"></a><span class="lineno"> 9063</span>  <span class="comment">// Returns the underlying ostream.</span></div><div class="line"><a name="l09064"></a><span class="lineno"> 9064</span>  ::std::ostream* stream() { <span class="keywordflow">return</span> stream_; }</div><div class="line"><a name="l09065"></a><span class="lineno"> 9065</span> </div><div class="line"><a name="l09066"></a><span class="lineno"> 9066</span>  <span class="comment">// Returns true iff the listener is interested in an explanation of</span></div><div class="line"><a name="l09067"></a><span class="lineno"> 9067</span>  <span class="comment">// the match result. A matcher's MatchAndExplain() method can use</span></div><div class="line"><a name="l09068"></a><span class="lineno"> 9068</span>  <span class="comment">// this information to avoid generating the explanation when no one</span></div><div class="line"><a name="l09069"></a><span class="lineno"> 9069</span>  <span class="comment">// intends to hear it.</span></div><div class="line"><a name="l09070"></a><span class="lineno"> 9070</span>  <span class="keywordtype">bool</span> IsInterested()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> stream_ != <span class="keyword">nullptr</span>; }</div><div class="line"><a name="l09071"></a><span class="lineno"> 9071</span> </div><div class="line"><a name="l09072"></a><span class="lineno"> 9072</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l09073"></a><span class="lineno"> 9073</span>  ::std::ostream* <span class="keyword">const</span> stream_;</div><div class="line"><a name="l09074"></a><span class="lineno"> 9074</span> </div><div class="line"><a name="l09075"></a><span class="lineno"> 9075</span>  <a class="code" href="gtest_8h.html#aed8c1888c32b588b0681e88b95031e29">GTEST_DISALLOW_COPY_AND_ASSIGN_</a>(MatchResultListener);</div><div class="line"><a name="l09076"></a><span class="lineno"> 9076</span> };</div><div class="line"><a name="l09077"></a><span class="lineno"> 9077</span> </div><div class="line"><a name="l09078"></a><span class="lineno"> 9078</span> <span class="keyword">inline</span> MatchResultListener::~MatchResultListener() {</div><div class="line"><a name="l09079"></a><span class="lineno"> 9079</span> }</div><div class="line"><a name="l09080"></a><span class="lineno"> 9080</span> </div><div class="line"><a name="l09081"></a><span class="lineno"> 9081</span> <span class="comment">// An instance of a subclass of this knows how to describe itself as a</span></div><div class="line"><a name="l09082"></a><span class="lineno"> 9082</span> <span class="comment">// matcher.</span></div><div class="line"><a name="l09083"></a><span class="lineno"> 9083</span> <span class="keyword">class </span>MatcherDescriberInterface {</div><div class="line"><a name="l09084"></a><span class="lineno"> 9084</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l09085"></a><span class="lineno"> 9085</span>  <span class="keyword">virtual</span> ~MatcherDescriberInterface() {}</div><div class="line"><a name="l09086"></a><span class="lineno"> 9086</span> </div><div class="line"><a name="l09087"></a><span class="lineno"> 9087</span>  <span class="comment">// Describes this matcher to an ostream. The function should print</span></div><div class="line"><a name="l09088"></a><span class="lineno"> 9088</span>  <span class="comment">// a verb phrase that describes the property a value matching this</span></div><div class="line"><a name="l09089"></a><span class="lineno"> 9089</span>  <span class="comment">// matcher should have. The subject of the verb phrase is the value</span></div><div class="line"><a name="l09090"></a><span class="lineno"> 9090</span>  <span class="comment">// being matched. For example, the DescribeTo() method of the Gt(7)</span></div><div class="line"><a name="l09091"></a><span class="lineno"> 9091</span>  <span class="comment">// matcher prints "is greater than 7".</span></div><div class="line"><a name="l09092"></a><span class="lineno"> 9092</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> DescribeTo(::std::ostream* os) <span class="keyword">const</span> = 0;</div><div class="line"><a name="l09093"></a><span class="lineno"> 9093</span> </div><div class="line"><a name="l09094"></a><span class="lineno"> 9094</span>  <span class="comment">// Describes the negation of this matcher to an ostream. For</span></div><div class="line"><a name="l09095"></a><span class="lineno"> 9095</span>  <span class="comment">// example, if the description of this matcher is "is greater than</span></div><div class="line"><a name="l09096"></a><span class="lineno"> 9096</span>  <span class="comment">// 7", the negated description could be "is not greater than 7".</span></div><div class="line"><a name="l09097"></a><span class="lineno"> 9097</span>  <span class="comment">// You are not required to override this when implementing</span></div><div class="line"><a name="l09098"></a><span class="lineno"> 9098</span>  <span class="comment">// MatcherInterface, but it is highly advised so that your matcher</span></div><div class="line"><a name="l09099"></a><span class="lineno"> 9099</span>  <span class="comment">// can produce good error messages.</span></div><div class="line"><a name="l09100"></a><span class="lineno"> 9100</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> DescribeNegationTo(::std::ostream* os)<span class="keyword"> const </span>{</div><div class="line"><a name="l09101"></a><span class="lineno"> 9101</span>  *os << <span class="stringliteral">"not ("</span>;</div><div class="line"><a name="l09102"></a><span class="lineno"> 9102</span>  DescribeTo(os);</div><div class="line"><a name="l09103"></a><span class="lineno"> 9103</span>  *os << <span class="stringliteral">")"</span>;</div><div class="line"><a name="l09104"></a><span class="lineno"> 9104</span>  }</div><div class="line"><a name="l09105"></a><span class="lineno"> 9105</span> };</div><div class="line"><a name="l09106"></a><span class="lineno"> 9106</span> </div><div class="line"><a name="l09107"></a><span class="lineno"> 9107</span> <span class="comment">// The implementation of a matcher.</span></div><div class="line"><a name="l09108"></a><span class="lineno"> 9108</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l09109"></a><span class="lineno"> 9109</span> <span class="keyword">class </span>MatcherInterface : <span class="keyword">public</span> MatcherDescriberInterface {</div><div class="line"><a name="l09110"></a><span class="lineno"> 9110</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l09111"></a><span class="lineno"> 9111</span>  <span class="comment">// Returns true iff the matcher matches x; also explains the match</span></div><div class="line"><a name="l09112"></a><span class="lineno"> 9112</span>  <span class="comment">// result to 'listener' if necessary (see the next paragraph), in</span></div><div class="line"><a name="l09113"></a><span class="lineno"> 9113</span>  <span class="comment">// the form of a non-restrictive relative clause ("which ...",</span></div><div class="line"><a name="l09114"></a><span class="lineno"> 9114</span>  <span class="comment">// "whose ...", etc) that describes x. For example, the</span></div><div class="line"><a name="l09115"></a><span class="lineno"> 9115</span>  <span class="comment">// MatchAndExplain() method of the Pointee(...) matcher should</span></div><div class="line"><a name="l09116"></a><span class="lineno"> 9116</span>  <span class="comment">// generate an explanation like "which points to ...".</span></div><div class="line"><a name="l09117"></a><span class="lineno"> 9117</span>  <span class="comment">//</span></div><div class="line"><a name="l09118"></a><span class="lineno"> 9118</span>  <span class="comment">// Implementations of MatchAndExplain() should add an explanation of</span></div><div class="line"><a name="l09119"></a><span class="lineno"> 9119</span>  <span class="comment">// the match result *if and only if* they can provide additional</span></div><div class="line"><a name="l09120"></a><span class="lineno"> 9120</span>  <span class="comment">// information that's not already present (or not obvious) in the</span></div><div class="line"><a name="l09121"></a><span class="lineno"> 9121</span>  <span class="comment">// print-out of x and the matcher's description. Whether the match</span></div><div class="line"><a name="l09122"></a><span class="lineno"> 9122</span>  <span class="comment">// succeeds is not a factor in deciding whether an explanation is</span></div><div class="line"><a name="l09123"></a><span class="lineno"> 9123</span>  <span class="comment">// needed, as sometimes the caller needs to print a failure message</span></div><div class="line"><a name="l09124"></a><span class="lineno"> 9124</span>  <span class="comment">// when the match succeeds (e.g. when the matcher is used inside</span></div><div class="line"><a name="l09125"></a><span class="lineno"> 9125</span>  <span class="comment">// Not()).</span></div><div class="line"><a name="l09126"></a><span class="lineno"> 9126</span>  <span class="comment">//</span></div><div class="line"><a name="l09127"></a><span class="lineno"> 9127</span>  <span class="comment">// For example, a "has at least 10 elements" matcher should explain</span></div><div class="line"><a name="l09128"></a><span class="lineno"> 9128</span>  <span class="comment">// what the actual element count is, regardless of the match result,</span></div><div class="line"><a name="l09129"></a><span class="lineno"> 9129</span>  <span class="comment">// as it is useful information to the reader; on the other hand, an</span></div><div class="line"><a name="l09130"></a><span class="lineno"> 9130</span>  <span class="comment">// "is empty" matcher probably only needs to explain what the actual</span></div><div class="line"><a name="l09131"></a><span class="lineno"> 9131</span>  <span class="comment">// size is when the match fails, as it's redundant to say that the</span></div><div class="line"><a name="l09132"></a><span class="lineno"> 9132</span>  <span class="comment">// size is 0 when the value is already known to be empty.</span></div><div class="line"><a name="l09133"></a><span class="lineno"> 9133</span>  <span class="comment">//</span></div><div class="line"><a name="l09134"></a><span class="lineno"> 9134</span>  <span class="comment">// You should override this method when defining a new matcher.</span></div><div class="line"><a name="l09135"></a><span class="lineno"> 9135</span>  <span class="comment">//</span></div><div class="line"><a name="l09136"></a><span class="lineno"> 9136</span>  <span class="comment">// It's the responsibility of the caller (Google Test) to guarantee</span></div><div class="line"><a name="l09137"></a><span class="lineno"> 9137</span>  <span class="comment">// that 'listener' is not NULL. This helps to simplify a matcher's</span></div><div class="line"><a name="l09138"></a><span class="lineno"> 9138</span>  <span class="comment">// implementation when it doesn't care about the performance, as it</span></div><div class="line"><a name="l09139"></a><span class="lineno"> 9139</span>  <span class="comment">// can talk to 'listener' without checking its validity first.</span></div><div class="line"><a name="l09140"></a><span class="lineno"> 9140</span>  <span class="comment">// However, in order to implement dummy listeners efficiently,</span></div><div class="line"><a name="l09141"></a><span class="lineno"> 9141</span>  <span class="comment">// listener->stream() may be NULL.</span></div><div class="line"><a name="l09142"></a><span class="lineno"> 9142</span>  <span class="keyword">virtual</span> <span class="keywordtype">bool</span> MatchAndExplain(T x, MatchResultListener* listener) <span class="keyword">const</span> = 0;</div><div class="line"><a name="l09143"></a><span class="lineno"> 9143</span> </div><div class="line"><a name="l09144"></a><span class="lineno"> 9144</span>  <span class="comment">// Inherits these methods from MatcherDescriberInterface:</span></div><div class="line"><a name="l09145"></a><span class="lineno"> 9145</span>  <span class="comment">// virtual void DescribeTo(::std::ostream* os) const = 0;</span></div><div class="line"><a name="l09146"></a><span class="lineno"> 9146</span>  <span class="comment">// virtual void DescribeNegationTo(::std::ostream* os) const;</span></div><div class="line"><a name="l09147"></a><span class="lineno"> 9147</span> };</div><div class="line"><a name="l09148"></a><span class="lineno"> 9148</span> </div><div class="line"><a name="l09149"></a><span class="lineno"> 9149</span> <span class="keyword">namespace </span>internal {</div><div class="line"><a name="l09150"></a><span class="lineno"> 9150</span> </div><div class="line"><a name="l09151"></a><span class="lineno"> 9151</span> <span class="comment">// Converts a MatcherInterface<T> to a MatcherInterface<const T&>.</span></div><div class="line"><a name="l09152"></a><span class="lineno"> 9152</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l09153"></a><span class="lineno"> 9153</span> <span class="keyword">class </span>MatcherInterfaceAdapter : <span class="keyword">public</span> MatcherInterface<const T&> {</div><div class="line"><a name="l09154"></a><span class="lineno"> 9154</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l09155"></a><span class="lineno"> 9155</span>  <span class="keyword">explicit</span> MatcherInterfaceAdapter(<span class="keyword">const</span> MatcherInterface<T>* impl)</div><div class="line"><a name="l09156"></a><span class="lineno"> 9156</span>  : impl_(impl) {}</div><div class="line"><a name="l09157"></a><span class="lineno"> 9157</span>  ~MatcherInterfaceAdapter()<span class="keyword"> override </span>{ <span class="keyword">delete</span> impl_; }</div><div class="line"><a name="l09158"></a><span class="lineno"> 9158</span> </div><div class="line"><a name="l09159"></a><span class="lineno"> 9159</span>  <span class="keywordtype">void</span> DescribeTo(::std::ostream* os)<span class="keyword"> const override </span>{ impl_->DescribeTo(os); }</div><div class="line"><a name="l09160"></a><span class="lineno"> 9160</span> </div><div class="line"><a name="l09161"></a><span class="lineno"> 9161</span>  <span class="keywordtype">void</span> DescribeNegationTo(::std::ostream* os)<span class="keyword"> const override </span>{</div><div class="line"><a name="l09162"></a><span class="lineno"> 9162</span>  impl_->DescribeNegationTo(os);</div><div class="line"><a name="l09163"></a><span class="lineno"> 9163</span>  }</div><div class="line"><a name="l09164"></a><span class="lineno"> 9164</span> </div><div class="line"><a name="l09165"></a><span class="lineno"> 9165</span>  <span class="keywordtype">bool</span> MatchAndExplain(<span class="keyword">const</span> T& x,</div><div class="line"><a name="l09166"></a><span class="lineno"> 9166</span>  MatchResultListener* listener)<span class="keyword"> const override </span>{</div><div class="line"><a name="l09167"></a><span class="lineno"> 9167</span>  <span class="keywordflow">return</span> impl_->MatchAndExplain(x, listener);</div><div class="line"><a name="l09168"></a><span class="lineno"> 9168</span>  }</div><div class="line"><a name="l09169"></a><span class="lineno"> 9169</span> </div><div class="line"><a name="l09170"></a><span class="lineno"> 9170</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l09171"></a><span class="lineno"> 9171</span>  <span class="keyword">const</span> MatcherInterface<T>* <span class="keyword">const</span> impl_;</div><div class="line"><a name="l09172"></a><span class="lineno"> 9172</span> </div><div class="line"><a name="l09173"></a><span class="lineno"> 9173</span>  <a class="code" href="gtest_8h.html#aed8c1888c32b588b0681e88b95031e29">GTEST_DISALLOW_COPY_AND_ASSIGN_</a>(MatcherInterfaceAdapter);</div><div class="line"><a name="l09174"></a><span class="lineno"> 9174</span> };</div><div class="line"><a name="l09175"></a><span class="lineno"> 9175</span> </div><div class="line"><a name="l09176"></a><span class="lineno"> 9176</span> <span class="keyword">struct </span>AnyEq {</div><div class="line"><a name="l09177"></a><span class="lineno"> 9177</span>  <span class="keyword">template</span> <<span class="keyword">typename</span> A, <span class="keyword">typename</span> B></div><div class="line"><a name="l09178"></a><span class="lineno"> 9178</span>  <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> A& a, <span class="keyword">const</span> B& b)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> a == b; }</div><div class="line"><a name="l09179"></a><span class="lineno"> 9179</span> };</div><div class="line"><a name="l09180"></a><span class="lineno"> 9180</span> <span class="keyword">struct </span>AnyNe {</div><div class="line"><a name="l09181"></a><span class="lineno"> 9181</span>  <span class="keyword">template</span> <<span class="keyword">typename</span> A, <span class="keyword">typename</span> B></div><div class="line"><a name="l09182"></a><span class="lineno"> 9182</span>  <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> A& a, <span class="keyword">const</span> B& b)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> a != b; }</div><div class="line"><a name="l09183"></a><span class="lineno"> 9183</span> };</div><div class="line"><a name="l09184"></a><span class="lineno"> 9184</span> <span class="keyword">struct </span>AnyLt {</div><div class="line"><a name="l09185"></a><span class="lineno"> 9185</span>  <span class="keyword">template</span> <<span class="keyword">typename</span> A, <span class="keyword">typename</span> B></div><div class="line"><a name="l09186"></a><span class="lineno"> 9186</span>  <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> A& a, <span class="keyword">const</span> B& b)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> a < b; }</div><div class="line"><a name="l09187"></a><span class="lineno"> 9187</span> };</div><div class="line"><a name="l09188"></a><span class="lineno"> 9188</span> <span class="keyword">struct </span>AnyGt {</div><div class="line"><a name="l09189"></a><span class="lineno"> 9189</span>  <span class="keyword">template</span> <<span class="keyword">typename</span> A, <span class="keyword">typename</span> B></div><div class="line"><a name="l09190"></a><span class="lineno"> 9190</span>  <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> A& a, <span class="keyword">const</span> B& b)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> a > b; }</div><div class="line"><a name="l09191"></a><span class="lineno"> 9191</span> };</div><div class="line"><a name="l09192"></a><span class="lineno"> 9192</span> <span class="keyword">struct </span>AnyLe {</div><div class="line"><a name="l09193"></a><span class="lineno"> 9193</span>  <span class="keyword">template</span> <<span class="keyword">typename</span> A, <span class="keyword">typename</span> B></div><div class="line"><a name="l09194"></a><span class="lineno"> 9194</span>  <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> A& a, <span class="keyword">const</span> B& b)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> a <= b; }</div><div class="line"><a name="l09195"></a><span class="lineno"> 9195</span> };</div><div class="line"><a name="l09196"></a><span class="lineno"> 9196</span> <span class="keyword">struct </span>AnyGe {</div><div class="line"><a name="l09197"></a><span class="lineno"> 9197</span>  <span class="keyword">template</span> <<span class="keyword">typename</span> A, <span class="keyword">typename</span> B></div><div class="line"><a name="l09198"></a><span class="lineno"> 9198</span>  <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> A& a, <span class="keyword">const</span> B& b)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> a >= b; }</div><div class="line"><a name="l09199"></a><span class="lineno"> 9199</span> };</div><div class="line"><a name="l09200"></a><span class="lineno"> 9200</span> </div><div class="line"><a name="l09201"></a><span class="lineno"> 9201</span> <span class="comment">// A match result listener that ignores the explanation.</span></div><div class="line"><a name="l09202"></a><span class="lineno"> 9202</span> <span class="keyword">class </span>DummyMatchResultListener : <span class="keyword">public</span> MatchResultListener {</div><div class="line"><a name="l09203"></a><span class="lineno"> 9203</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l09204"></a><span class="lineno"> 9204</span>  DummyMatchResultListener() : MatchResultListener(<span class="keyword">nullptr</span>) {}</div><div class="line"><a name="l09205"></a><span class="lineno"> 9205</span> </div><div class="line"><a name="l09206"></a><span class="lineno"> 9206</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l09207"></a><span class="lineno"> 9207</span>  <a class="code" href="gtest_8h.html#aed8c1888c32b588b0681e88b95031e29">GTEST_DISALLOW_COPY_AND_ASSIGN_</a>(DummyMatchResultListener);</div><div class="line"><a name="l09208"></a><span class="lineno"> 9208</span> };</div><div class="line"><a name="l09209"></a><span class="lineno"> 9209</span> </div><div class="line"><a name="l09210"></a><span class="lineno"> 9210</span> <span class="comment">// A match result listener that forwards the explanation to a given</span></div><div class="line"><a name="l09211"></a><span class="lineno"> 9211</span> <span class="comment">// ostream. The difference between this and MatchResultListener is</span></div><div class="line"><a name="l09212"></a><span class="lineno"> 9212</span> <span class="comment">// that the former is concrete.</span></div><div class="line"><a name="l09213"></a><span class="lineno"> 9213</span> <span class="keyword">class </span>StreamMatchResultListener : <span class="keyword">public</span> MatchResultListener {</div><div class="line"><a name="l09214"></a><span class="lineno"> 9214</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l09215"></a><span class="lineno"> 9215</span>  <span class="keyword">explicit</span> StreamMatchResultListener(::std::ostream* os)</div><div class="line"><a name="l09216"></a><span class="lineno"> 9216</span>  : MatchResultListener(os) {}</div><div class="line"><a name="l09217"></a><span class="lineno"> 9217</span> </div><div class="line"><a name="l09218"></a><span class="lineno"> 9218</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l09219"></a><span class="lineno"> 9219</span>  <a class="code" href="gtest_8h.html#aed8c1888c32b588b0681e88b95031e29">GTEST_DISALLOW_COPY_AND_ASSIGN_</a>(StreamMatchResultListener);</div><div class="line"><a name="l09220"></a><span class="lineno"> 9220</span> };</div><div class="line"><a name="l09221"></a><span class="lineno"> 9221</span> </div><div class="line"><a name="l09222"></a><span class="lineno"> 9222</span> <span class="comment">// An internal class for implementing Matcher<T>, which will derive</span></div><div class="line"><a name="l09223"></a><span class="lineno"> 9223</span> <span class="comment">// from it. We put functionalities common to all Matcher<T></span></div><div class="line"><a name="l09224"></a><span class="lineno"> 9224</span> <span class="comment">// specializations here to avoid code duplication.</span></div><div class="line"><a name="l09225"></a><span class="lineno"> 9225</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l09226"></a><span class="lineno"> 9226</span> <span class="keyword">class </span>MatcherBase {</div><div class="line"><a name="l09227"></a><span class="lineno"> 9227</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l09228"></a><span class="lineno"> 9228</span>  <span class="comment">// Returns true iff the matcher matches x; also explains the match</span></div><div class="line"><a name="l09229"></a><span class="lineno"> 9229</span>  <span class="comment">// result to 'listener'.</span></div><div class="line"><a name="l09230"></a><span class="lineno"> 9230</span>  <span class="keywordtype">bool</span> MatchAndExplain(<span class="keyword">const</span> T& x, MatchResultListener* listener)<span class="keyword"> const </span>{</div><div class="line"><a name="l09231"></a><span class="lineno"> 9231</span>  <span class="keywordflow">return</span> impl_->MatchAndExplain(x, listener);</div><div class="line"><a name="l09232"></a><span class="lineno"> 9232</span>  }</div><div class="line"><a name="l09233"></a><span class="lineno"> 9233</span> </div><div class="line"><a name="l09234"></a><span class="lineno"> 9234</span>  <span class="comment">// Returns true iff this matcher matches x.</span></div><div class="line"><a name="l09235"></a><span class="lineno"> 9235</span>  <span class="keywordtype">bool</span> Matches(<span class="keyword">const</span> T& x)<span class="keyword"> const </span>{</div><div class="line"><a name="l09236"></a><span class="lineno"> 9236</span>  DummyMatchResultListener dummy;</div><div class="line"><a name="l09237"></a><span class="lineno"> 9237</span>  <span class="keywordflow">return</span> MatchAndExplain(x, &dummy);</div><div class="line"><a name="l09238"></a><span class="lineno"> 9238</span>  }</div><div class="line"><a name="l09239"></a><span class="lineno"> 9239</span> </div><div class="line"><a name="l09240"></a><span class="lineno"> 9240</span>  <span class="comment">// Describes this matcher to an ostream.</span></div><div class="line"><a name="l09241"></a><span class="lineno"> 9241</span>  <span class="keywordtype">void</span> DescribeTo(::std::ostream* os)<span class="keyword"> const </span>{ impl_->DescribeTo(os); }</div><div class="line"><a name="l09242"></a><span class="lineno"> 9242</span> </div><div class="line"><a name="l09243"></a><span class="lineno"> 9243</span>  <span class="comment">// Describes the negation of this matcher to an ostream.</span></div><div class="line"><a name="l09244"></a><span class="lineno"> 9244</span>  <span class="keywordtype">void</span> DescribeNegationTo(::std::ostream* os)<span class="keyword"> const </span>{</div><div class="line"><a name="l09245"></a><span class="lineno"> 9245</span>  impl_->DescribeNegationTo(os);</div><div class="line"><a name="l09246"></a><span class="lineno"> 9246</span>  }</div><div class="line"><a name="l09247"></a><span class="lineno"> 9247</span> </div><div class="line"><a name="l09248"></a><span class="lineno"> 9248</span>  <span class="comment">// Explains why x matches, or doesn't match, the matcher.</span></div><div class="line"><a name="l09249"></a><span class="lineno"> 9249</span>  <span class="keywordtype">void</span> ExplainMatchResultTo(<span class="keyword">const</span> T& x, ::std::ostream* os)<span class="keyword"> const </span>{</div><div class="line"><a name="l09250"></a><span class="lineno"> 9250</span>  StreamMatchResultListener listener(os);</div><div class="line"><a name="l09251"></a><span class="lineno"> 9251</span>  MatchAndExplain(x, &listener);</div><div class="line"><a name="l09252"></a><span class="lineno"> 9252</span>  }</div><div class="line"><a name="l09253"></a><span class="lineno"> 9253</span> </div><div class="line"><a name="l09254"></a><span class="lineno"> 9254</span>  <span class="comment">// Returns the describer for this matcher object; retains ownership</span></div><div class="line"><a name="l09255"></a><span class="lineno"> 9255</span>  <span class="comment">// of the describer, which is only guaranteed to be alive when</span></div><div class="line"><a name="l09256"></a><span class="lineno"> 9256</span>  <span class="comment">// this matcher object is alive.</span></div><div class="line"><a name="l09257"></a><span class="lineno"> 9257</span>  <span class="keyword">const</span> MatcherDescriberInterface* GetDescriber()<span class="keyword"> const </span>{</div><div class="line"><a name="l09258"></a><span class="lineno"> 9258</span>  <span class="keywordflow">return</span> impl_.get();</div><div class="line"><a name="l09259"></a><span class="lineno"> 9259</span>  }</div><div class="line"><a name="l09260"></a><span class="lineno"> 9260</span> </div><div class="line"><a name="l09261"></a><span class="lineno"> 9261</span>  <span class="keyword">protected</span>:</div><div class="line"><a name="l09262"></a><span class="lineno"> 9262</span>  MatcherBase() {}</div><div class="line"><a name="l09263"></a><span class="lineno"> 9263</span> </div><div class="line"><a name="l09264"></a><span class="lineno"> 9264</span>  <span class="comment">// Constructs a matcher from its implementation.</span></div><div class="line"><a name="l09265"></a><span class="lineno"> 9265</span>  <span class="keyword">explicit</span> MatcherBase(<span class="keyword">const</span> MatcherInterface<const T&>* impl) : impl_(impl) {}</div><div class="line"><a name="l09266"></a><span class="lineno"> 9266</span> </div><div class="line"><a name="l09267"></a><span class="lineno"> 9267</span>  <span class="keyword">template</span> <<span class="keyword">typename</span> U></div><div class="line"><a name="l09268"></a><span class="lineno"> 9268</span>  <span class="keyword">explicit</span> MatcherBase(</div><div class="line"><a name="l09269"></a><span class="lineno"> 9269</span>  <span class="keyword">const</span> MatcherInterface<U>* impl,</div><div class="line"><a name="l09270"></a><span class="lineno"> 9270</span>  <span class="keyword">typename</span> internal::EnableIf<</div><div class="line"><a name="l09271"></a><span class="lineno"> 9271</span>  !internal::IsSame<U, const U&>::value>::type* = <span class="keyword">nullptr</span>)</div><div class="line"><a name="l09272"></a><span class="lineno"> 9272</span>  : impl_(<span class="keyword">new</span> internal::MatcherInterfaceAdapter<U>(impl)) {}</div><div class="line"><a name="l09273"></a><span class="lineno"> 9273</span> </div><div class="line"><a name="l09274"></a><span class="lineno"> 9274</span>  <span class="keyword">virtual</span> ~MatcherBase() {}</div><div class="line"><a name="l09275"></a><span class="lineno"> 9275</span> </div><div class="line"><a name="l09276"></a><span class="lineno"> 9276</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l09277"></a><span class="lineno"> 9277</span>  std::shared_ptr<const MatcherInterface<const T&>> impl_;</div><div class="line"><a name="l09278"></a><span class="lineno"> 9278</span> };</div><div class="line"><a name="l09279"></a><span class="lineno"> 9279</span> </div><div class="line"><a name="l09280"></a><span class="lineno"> 9280</span> } <span class="comment">// namespace internal</span></div><div class="line"><a name="l09281"></a><span class="lineno"> 9281</span> </div><div class="line"><a name="l09282"></a><span class="lineno"> 9282</span> <span class="comment">// A Matcher<T> is a copyable and IMMUTABLE (except by assignment)</span></div><div class="line"><a name="l09283"></a><span class="lineno"> 9283</span> <span class="comment">// object that can check whether a value of type T matches. The</span></div><div class="line"><a name="l09284"></a><span class="lineno"> 9284</span> <span class="comment">// implementation of Matcher<T> is just a std::shared_ptr to const</span></div><div class="line"><a name="l09285"></a><span class="lineno"> 9285</span> <span class="comment">// MatcherInterface<T>. Don't inherit from Matcher!</span></div><div class="line"><a name="l09286"></a><span class="lineno"> 9286</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l09287"></a><span class="lineno"> 9287</span> <span class="keyword">class </span>Matcher : <span class="keyword">public</span> internal::MatcherBase<T> {</div><div class="line"><a name="l09288"></a><span class="lineno"> 9288</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l09289"></a><span class="lineno"> 9289</span>  <span class="comment">// Constructs a null matcher. Needed for storing Matcher objects in STL</span></div><div class="line"><a name="l09290"></a><span class="lineno"> 9290</span>  <span class="comment">// containers. A default-constructed matcher is not yet initialized. You</span></div><div class="line"><a name="l09291"></a><span class="lineno"> 9291</span>  <span class="comment">// cannot use it until a valid value has been assigned to it.</span></div><div class="line"><a name="l09292"></a><span class="lineno"> 9292</span>  <span class="keyword">explicit</span> Matcher() {} <span class="comment">// NOLINT</span></div><div class="line"><a name="l09293"></a><span class="lineno"> 9293</span> </div><div class="line"><a name="l09294"></a><span class="lineno"> 9294</span>  <span class="comment">// Constructs a matcher from its implementation.</span></div><div class="line"><a name="l09295"></a><span class="lineno"> 9295</span>  <span class="keyword">explicit</span> Matcher(<span class="keyword">const</span> MatcherInterface<const T&>* impl)</div><div class="line"><a name="l09296"></a><span class="lineno"> 9296</span>  : internal::MatcherBase<T>(impl) {}</div><div class="line"><a name="l09297"></a><span class="lineno"> 9297</span> </div><div class="line"><a name="l09298"></a><span class="lineno"> 9298</span>  <span class="keyword">template</span> <<span class="keyword">typename</span> U></div><div class="line"><a name="l09299"></a><span class="lineno"> 9299</span>  <span class="keyword">explicit</span> Matcher(<span class="keyword">const</span> MatcherInterface<U>* impl,</div><div class="line"><a name="l09300"></a><span class="lineno"> 9300</span>  <span class="keyword">typename</span> internal::EnableIf<</div><div class="line"><a name="l09301"></a><span class="lineno"> 9301</span>  !internal::IsSame<U, const U&>::value>::type* = <span class="keyword">nullptr</span>)</div><div class="line"><a name="l09302"></a><span class="lineno"> 9302</span>  : internal::MatcherBase<T>(impl) {}</div><div class="line"><a name="l09303"></a><span class="lineno"> 9303</span> </div><div class="line"><a name="l09304"></a><span class="lineno"> 9304</span>  <span class="comment">// Implicit constructor here allows people to write</span></div><div class="line"><a name="l09305"></a><span class="lineno"> 9305</span>  <span class="comment">// EXPECT_CALL(foo, Bar(5)) instead of EXPECT_CALL(foo, Bar(Eq(5))) sometimes</span></div><div class="line"><a name="l09306"></a><span class="lineno"> 9306</span>  Matcher(T value); <span class="comment">// NOLINT</span></div><div class="line"><a name="l09307"></a><span class="lineno"> 9307</span> };</div><div class="line"><a name="l09308"></a><span class="lineno"> 9308</span> </div><div class="line"><a name="l09309"></a><span class="lineno"> 9309</span> <span class="comment">// The following two specializations allow the user to write str</span></div><div class="line"><a name="l09310"></a><span class="lineno"> 9310</span> <span class="comment">// instead of Eq(str) and "foo" instead of Eq("foo") when a std::string</span></div><div class="line"><a name="l09311"></a><span class="lineno"> 9311</span> <span class="comment">// matcher is expected.</span></div><div class="line"><a name="l09312"></a><span class="lineno"> 9312</span> <span class="keyword">template</span> <></div><div class="line"><a name="l09313"></a><span class="lineno"> 9313</span> <span class="keyword">class </span><a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> Matcher<const std::<a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">string</a>&></div><div class="line"><a name="l09314"></a><span class="lineno"> 9314</span>  : <span class="keyword">public</span> internal::MatcherBase<const std::string&> {</div><div class="line"><a name="l09315"></a><span class="lineno"> 9315</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l09316"></a><span class="lineno"> 9316</span>  Matcher() {}</div><div class="line"><a name="l09317"></a><span class="lineno"> 9317</span> </div><div class="line"><a name="l09318"></a><span class="lineno"> 9318</span>  <span class="keyword">explicit</span> Matcher(<span class="keyword">const</span> MatcherInterface<const std::string&>* impl)</div><div class="line"><a name="l09319"></a><span class="lineno"> 9319</span>  : internal::MatcherBase<const std::string&>(impl) {}</div><div class="line"><a name="l09320"></a><span class="lineno"> 9320</span> </div><div class="line"><a name="l09321"></a><span class="lineno"> 9321</span>  <span class="comment">// Allows the user to write str instead of Eq(str) sometimes, where</span></div><div class="line"><a name="l09322"></a><span class="lineno"> 9322</span>  <span class="comment">// str is a std::string object.</span></div><div class="line"><a name="l09323"></a><span class="lineno"> 9323</span>  Matcher(<span class="keyword">const</span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a>& s); <span class="comment">// NOLINT</span></div><div class="line"><a name="l09324"></a><span class="lineno"> 9324</span> </div><div class="line"><a name="l09325"></a><span class="lineno"> 9325</span> <span class="preprocessor">#if GTEST_HAS_GLOBAL_STRING</span></div><div class="line"><a name="l09326"></a><span class="lineno"> 9326</span>  <span class="comment">// Allows the user to write str instead of Eq(str) sometimes, where</span></div><div class="line"><a name="l09327"></a><span class="lineno"> 9327</span>  <span class="comment">// str is a ::string object.</span></div><div class="line"><a name="l09328"></a><span class="lineno"> 9328</span>  Matcher(<a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">const ::string</a>& s); <span class="comment">// NOLINT</span></div><div class="line"><a name="l09329"></a><span class="lineno"> 9329</span> <span class="preprocessor">#endif // GTEST_HAS_GLOBAL_STRING</span></div><div class="line"><a name="l09330"></a><span class="lineno"> 9330</span> </div><div class="line"><a name="l09331"></a><span class="lineno"> 9331</span>  <span class="comment">// Allows the user to write "foo" instead of Eq("foo") sometimes.</span></div><div class="line"><a name="l09332"></a><span class="lineno"> 9332</span>  Matcher(<span class="keyword">const</span> <span class="keywordtype">char</span>* s); <span class="comment">// NOLINT</span></div><div class="line"><a name="l09333"></a><span class="lineno"> 9333</span> };</div><div class="line"><a name="l09334"></a><span class="lineno"> 9334</span> </div><div class="line"><a name="l09335"></a><span class="lineno"> 9335</span> <span class="keyword">template</span> <></div><div class="line"><a name="l09336"></a><span class="lineno"> 9336</span> <span class="keyword">class </span><a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> Matcher<std::<a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">string</a>></div><div class="line"><a name="l09337"></a><span class="lineno"> 9337</span>  : <span class="keyword">public</span> internal::MatcherBase<std::string> {</div><div class="line"><a name="l09338"></a><span class="lineno"> 9338</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l09339"></a><span class="lineno"> 9339</span>  Matcher() {}</div><div class="line"><a name="l09340"></a><span class="lineno"> 9340</span> </div><div class="line"><a name="l09341"></a><span class="lineno"> 9341</span>  <span class="keyword">explicit</span> Matcher(<span class="keyword">const</span> MatcherInterface<const std::string&>* impl)</div><div class="line"><a name="l09342"></a><span class="lineno"> 9342</span>  : internal::MatcherBase<std::string>(impl) {}</div><div class="line"><a name="l09343"></a><span class="lineno"> 9343</span>  <span class="keyword">explicit</span> Matcher(<span class="keyword">const</span> MatcherInterface<std::string>* impl)</div><div class="line"><a name="l09344"></a><span class="lineno"> 9344</span>  : internal::MatcherBase<std::string>(impl) {}</div><div class="line"><a name="l09345"></a><span class="lineno"> 9345</span> </div><div class="line"><a name="l09346"></a><span class="lineno"> 9346</span>  <span class="comment">// Allows the user to write str instead of Eq(str) sometimes, where</span></div><div class="line"><a name="l09347"></a><span class="lineno"> 9347</span>  <span class="comment">// str is a string object.</span></div><div class="line"><a name="l09348"></a><span class="lineno"> 9348</span>  Matcher(<span class="keyword">const</span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a>& s); <span class="comment">// NOLINT</span></div><div class="line"><a name="l09349"></a><span class="lineno"> 9349</span> </div><div class="line"><a name="l09350"></a><span class="lineno"> 9350</span> <span class="preprocessor">#if GTEST_HAS_GLOBAL_STRING</span></div><div class="line"><a name="l09351"></a><span class="lineno"> 9351</span>  <span class="comment">// Allows the user to write str instead of Eq(str) sometimes, where</span></div><div class="line"><a name="l09352"></a><span class="lineno"> 9352</span>  <span class="comment">// str is a ::string object.</span></div><div class="line"><a name="l09353"></a><span class="lineno"> 9353</span>  Matcher(<a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">const ::string</a>& s); <span class="comment">// NOLINT</span></div><div class="line"><a name="l09354"></a><span class="lineno"> 9354</span> <span class="preprocessor">#endif // GTEST_HAS_GLOBAL_STRING</span></div><div class="line"><a name="l09355"></a><span class="lineno"> 9355</span> </div><div class="line"><a name="l09356"></a><span class="lineno"> 9356</span>  <span class="comment">// Allows the user to write "foo" instead of Eq("foo") sometimes.</span></div><div class="line"><a name="l09357"></a><span class="lineno"> 9357</span>  Matcher(<span class="keyword">const</span> <span class="keywordtype">char</span>* s); <span class="comment">// NOLINT</span></div><div class="line"><a name="l09358"></a><span class="lineno"> 9358</span> };</div><div class="line"><a name="l09359"></a><span class="lineno"> 9359</span> </div><div class="line"><a name="l09360"></a><span class="lineno"> 9360</span> <span class="preprocessor">#if GTEST_HAS_GLOBAL_STRING</span></div><div class="line"><a name="l09361"></a><span class="lineno"> 9361</span> <span class="comment">// The following two specializations allow the user to write str</span></div><div class="line"><a name="l09362"></a><span class="lineno"> 9362</span> <span class="comment">// instead of Eq(str) and "foo" instead of Eq("foo") when a ::string</span></div><div class="line"><a name="l09363"></a><span class="lineno"> 9363</span> <span class="comment">// matcher is expected.</span></div><div class="line"><a name="l09364"></a><span class="lineno"> 9364</span> <span class="keyword">template</span> <></div><div class="line"><a name="l09365"></a><span class="lineno"> 9365</span> <span class="keyword">class </span><a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> Matcher<const ::<a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">string</a>&></div><div class="line"><a name="l09366"></a><span class="lineno"> 9366</span>  : <span class="keyword">public</span> internal::MatcherBase<const ::string&> {</div><div class="line"><a name="l09367"></a><span class="lineno"> 9367</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l09368"></a><span class="lineno"> 9368</span>  Matcher() {}</div><div class="line"><a name="l09369"></a><span class="lineno"> 9369</span> </div><div class="line"><a name="l09370"></a><span class="lineno"> 9370</span>  <span class="keyword">explicit</span> Matcher(<span class="keyword">const</span> MatcherInterface<const ::string&>* impl)</div><div class="line"><a name="l09371"></a><span class="lineno"> 9371</span>  : internal::MatcherBase<const ::string&>(impl) {}</div><div class="line"><a name="l09372"></a><span class="lineno"> 9372</span> </div><div class="line"><a name="l09373"></a><span class="lineno"> 9373</span>  <span class="comment">// Allows the user to write str instead of Eq(str) sometimes, where</span></div><div class="line"><a name="l09374"></a><span class="lineno"> 9374</span>  <span class="comment">// str is a std::string object.</span></div><div class="line"><a name="l09375"></a><span class="lineno"> 9375</span>  Matcher(<span class="keyword">const</span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a>& s); <span class="comment">// NOLINT</span></div><div class="line"><a name="l09376"></a><span class="lineno"> 9376</span> </div><div class="line"><a name="l09377"></a><span class="lineno"> 9377</span>  <span class="comment">// Allows the user to write str instead of Eq(str) sometimes, where</span></div><div class="line"><a name="l09378"></a><span class="lineno"> 9378</span>  <span class="comment">// str is a ::string object.</span></div><div class="line"><a name="l09379"></a><span class="lineno"> 9379</span>  Matcher(<a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">const ::string</a>& s); <span class="comment">// NOLINT</span></div><div class="line"><a name="l09380"></a><span class="lineno"> 9380</span> </div><div class="line"><a name="l09381"></a><span class="lineno"> 9381</span>  <span class="comment">// Allows the user to write "foo" instead of Eq("foo") sometimes.</span></div><div class="line"><a name="l09382"></a><span class="lineno"> 9382</span>  Matcher(<span class="keyword">const</span> <span class="keywordtype">char</span>* s); <span class="comment">// NOLINT</span></div><div class="line"><a name="l09383"></a><span class="lineno"> 9383</span> };</div><div class="line"><a name="l09384"></a><span class="lineno"> 9384</span> </div><div class="line"><a name="l09385"></a><span class="lineno"> 9385</span> <span class="keyword">template</span> <></div><div class="line"><a name="l09386"></a><span class="lineno"> 9386</span> <span class="keyword">class </span><a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> Matcher< ::<a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">string</a>></div><div class="line"><a name="l09387"></a><span class="lineno"> 9387</span>  : <span class="keyword">public</span> internal::MatcherBase< ::string> {</div><div class="line"><a name="l09388"></a><span class="lineno"> 9388</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l09389"></a><span class="lineno"> 9389</span>  Matcher() {}</div><div class="line"><a name="l09390"></a><span class="lineno"> 9390</span> </div><div class="line"><a name="l09391"></a><span class="lineno"> 9391</span>  <span class="keyword">explicit</span> Matcher(<span class="keyword">const</span> MatcherInterface<const ::string&>* impl)</div><div class="line"><a name="l09392"></a><span class="lineno"> 9392</span>  : internal::MatcherBase< ::string>(impl) {}</div><div class="line"><a name="l09393"></a><span class="lineno"> 9393</span>  <span class="keyword">explicit</span> Matcher(<span class="keyword">const</span> MatcherInterface< ::string>* impl)</div><div class="line"><a name="l09394"></a><span class="lineno"> 9394</span>  : internal::MatcherBase< ::string>(impl) {}</div><div class="line"><a name="l09395"></a><span class="lineno"> 9395</span> </div><div class="line"><a name="l09396"></a><span class="lineno"> 9396</span>  <span class="comment">// Allows the user to write str instead of Eq(str) sometimes, where</span></div><div class="line"><a name="l09397"></a><span class="lineno"> 9397</span>  <span class="comment">// str is a std::string object.</span></div><div class="line"><a name="l09398"></a><span class="lineno"> 9398</span>  Matcher(<span class="keyword">const</span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a>& s); <span class="comment">// NOLINT</span></div><div class="line"><a name="l09399"></a><span class="lineno"> 9399</span> </div><div class="line"><a name="l09400"></a><span class="lineno"> 9400</span>  <span class="comment">// Allows the user to write str instead of Eq(str) sometimes, where</span></div><div class="line"><a name="l09401"></a><span class="lineno"> 9401</span>  <span class="comment">// str is a ::string object.</span></div><div class="line"><a name="l09402"></a><span class="lineno"> 9402</span>  Matcher(<a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">const ::string</a>& s); <span class="comment">// NOLINT</span></div><div class="line"><a name="l09403"></a><span class="lineno"> 9403</span> </div><div class="line"><a name="l09404"></a><span class="lineno"> 9404</span>  <span class="comment">// Allows the user to write "foo" instead of Eq("foo") sometimes.</span></div><div class="line"><a name="l09405"></a><span class="lineno"> 9405</span>  Matcher(<span class="keyword">const</span> <span class="keywordtype">char</span>* s); <span class="comment">// NOLINT</span></div><div class="line"><a name="l09406"></a><span class="lineno"> 9406</span> };</div><div class="line"><a name="l09407"></a><span class="lineno"> 9407</span> <span class="preprocessor">#endif // GTEST_HAS_GLOBAL_STRING</span></div><div class="line"><a name="l09408"></a><span class="lineno"> 9408</span> </div><div class="line"><a name="l09409"></a><span class="lineno"> 9409</span> <span class="preprocessor">#if GTEST_HAS_ABSL</span></div><div class="line"><a name="l09410"></a><span class="lineno"> 9410</span> <span class="comment">// The following two specializations allow the user to write str</span></div><div class="line"><a name="l09411"></a><span class="lineno"> 9411</span> <span class="comment">// instead of Eq(str) and "foo" instead of Eq("foo") when a absl::string_view</span></div><div class="line"><a name="l09412"></a><span class="lineno"> 9412</span> <span class="comment">// matcher is expected.</span></div><div class="line"><a name="l09413"></a><span class="lineno"> 9413</span> <span class="keyword">template</span> <></div><div class="line"><a name="l09414"></a><span class="lineno"> 9414</span> <span class="keyword">class </span><a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> Matcher<const absl::string_view&></div><div class="line"><a name="l09415"></a><span class="lineno"> 9415</span>  : <span class="keyword">public</span> internal::MatcherBase<const absl::string_view&> {</div><div class="line"><a name="l09416"></a><span class="lineno"> 9416</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l09417"></a><span class="lineno"> 9417</span>  Matcher() {}</div><div class="line"><a name="l09418"></a><span class="lineno"> 9418</span> </div><div class="line"><a name="l09419"></a><span class="lineno"> 9419</span>  <span class="keyword">explicit</span> Matcher(<span class="keyword">const</span> MatcherInterface<const absl::string_view&>* impl)</div><div class="line"><a name="l09420"></a><span class="lineno"> 9420</span>  : internal::MatcherBase<const absl::string_view&>(impl) {}</div><div class="line"><a name="l09421"></a><span class="lineno"> 9421</span> </div><div class="line"><a name="l09422"></a><span class="lineno"> 9422</span>  <span class="comment">// Allows the user to write str instead of Eq(str) sometimes, where</span></div><div class="line"><a name="l09423"></a><span class="lineno"> 9423</span>  <span class="comment">// str is a std::string object.</span></div><div class="line"><a name="l09424"></a><span class="lineno"> 9424</span>  Matcher(<span class="keyword">const</span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a>& s); <span class="comment">// NOLINT</span></div><div class="line"><a name="l09425"></a><span class="lineno"> 9425</span> </div><div class="line"><a name="l09426"></a><span class="lineno"> 9426</span> <span class="preprocessor">#if GTEST_HAS_GLOBAL_STRING</span></div><div class="line"><a name="l09427"></a><span class="lineno"> 9427</span>  <span class="comment">// Allows the user to write str instead of Eq(str) sometimes, where</span></div><div class="line"><a name="l09428"></a><span class="lineno"> 9428</span>  <span class="comment">// str is a ::string object.</span></div><div class="line"><a name="l09429"></a><span class="lineno"> 9429</span>  Matcher(<a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">const ::string</a>& s); <span class="comment">// NOLINT</span></div><div class="line"><a name="l09430"></a><span class="lineno"> 9430</span> <span class="preprocessor">#endif // GTEST_HAS_GLOBAL_STRING</span></div><div class="line"><a name="l09431"></a><span class="lineno"> 9431</span> </div><div class="line"><a name="l09432"></a><span class="lineno"> 9432</span>  <span class="comment">// Allows the user to write "foo" instead of Eq("foo") sometimes.</span></div><div class="line"><a name="l09433"></a><span class="lineno"> 9433</span>  Matcher(<span class="keyword">const</span> <span class="keywordtype">char</span>* s); <span class="comment">// NOLINT</span></div><div class="line"><a name="l09434"></a><span class="lineno"> 9434</span> </div><div class="line"><a name="l09435"></a><span class="lineno"> 9435</span>  <span class="comment">// Allows the user to pass absl::string_views directly.</span></div><div class="line"><a name="l09436"></a><span class="lineno"> 9436</span>  Matcher(absl::string_view s); <span class="comment">// NOLINT</span></div><div class="line"><a name="l09437"></a><span class="lineno"> 9437</span> };</div><div class="line"><a name="l09438"></a><span class="lineno"> 9438</span> </div><div class="line"><a name="l09439"></a><span class="lineno"> 9439</span> <span class="keyword">template</span> <></div><div class="line"><a name="l09440"></a><span class="lineno"> 9440</span> <span class="keyword">class </span><a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> Matcher<absl::string_view></div><div class="line"><a name="l09441"></a><span class="lineno"> 9441</span>  : <span class="keyword">public</span> internal::MatcherBase<absl::string_view> {</div><div class="line"><a name="l09442"></a><span class="lineno"> 9442</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l09443"></a><span class="lineno"> 9443</span>  Matcher() {}</div><div class="line"><a name="l09444"></a><span class="lineno"> 9444</span> </div><div class="line"><a name="l09445"></a><span class="lineno"> 9445</span>  <span class="keyword">explicit</span> Matcher(<span class="keyword">const</span> MatcherInterface<const absl::string_view&>* impl)</div><div class="line"><a name="l09446"></a><span class="lineno"> 9446</span>  : internal::MatcherBase<absl::string_view>(impl) {}</div><div class="line"><a name="l09447"></a><span class="lineno"> 9447</span>  <span class="keyword">explicit</span> Matcher(<span class="keyword">const</span> MatcherInterface<absl::string_view>* impl)</div><div class="line"><a name="l09448"></a><span class="lineno"> 9448</span>  : internal::MatcherBase<absl::string_view>(impl) {}</div><div class="line"><a name="l09449"></a><span class="lineno"> 9449</span> </div><div class="line"><a name="l09450"></a><span class="lineno"> 9450</span>  <span class="comment">// Allows the user to write str instead of Eq(str) sometimes, where</span></div><div class="line"><a name="l09451"></a><span class="lineno"> 9451</span>  <span class="comment">// str is a std::string object.</span></div><div class="line"><a name="l09452"></a><span class="lineno"> 9452</span>  Matcher(<span class="keyword">const</span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a>& s); <span class="comment">// NOLINT</span></div><div class="line"><a name="l09453"></a><span class="lineno"> 9453</span> </div><div class="line"><a name="l09454"></a><span class="lineno"> 9454</span> <span class="preprocessor">#if GTEST_HAS_GLOBAL_STRING</span></div><div class="line"><a name="l09455"></a><span class="lineno"> 9455</span>  <span class="comment">// Allows the user to write str instead of Eq(str) sometimes, where</span></div><div class="line"><a name="l09456"></a><span class="lineno"> 9456</span>  <span class="comment">// str is a ::string object.</span></div><div class="line"><a name="l09457"></a><span class="lineno"> 9457</span>  Matcher(<a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">const ::string</a>& s); <span class="comment">// NOLINT</span></div><div class="line"><a name="l09458"></a><span class="lineno"> 9458</span> <span class="preprocessor">#endif // GTEST_HAS_GLOBAL_STRING</span></div><div class="line"><a name="l09459"></a><span class="lineno"> 9459</span> </div><div class="line"><a name="l09460"></a><span class="lineno"> 9460</span>  <span class="comment">// Allows the user to write "foo" instead of Eq("foo") sometimes.</span></div><div class="line"><a name="l09461"></a><span class="lineno"> 9461</span>  Matcher(<span class="keyword">const</span> <span class="keywordtype">char</span>* s); <span class="comment">// NOLINT</span></div><div class="line"><a name="l09462"></a><span class="lineno"> 9462</span> </div><div class="line"><a name="l09463"></a><span class="lineno"> 9463</span>  <span class="comment">// Allows the user to pass absl::string_views directly.</span></div><div class="line"><a name="l09464"></a><span class="lineno"> 9464</span>  Matcher(absl::string_view s); <span class="comment">// NOLINT</span></div><div class="line"><a name="l09465"></a><span class="lineno"> 9465</span> };</div><div class="line"><a name="l09466"></a><span class="lineno"> 9466</span> <span class="preprocessor">#endif // GTEST_HAS_ABSL</span></div><div class="line"><a name="l09467"></a><span class="lineno"> 9467</span> </div><div class="line"><a name="l09468"></a><span class="lineno"> 9468</span> <span class="comment">// Prints a matcher in a human-readable format.</span></div><div class="line"><a name="l09469"></a><span class="lineno"> 9469</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l09470"></a><span class="lineno"> 9470</span> std::ostream& operator<<(std::ostream& os, const Matcher<T>& matcher) {</div><div class="line"><a name="l09471"></a><span class="lineno"> 9471</span>  matcher.DescribeTo(&os);</div><div class="line"><a name="l09472"></a><span class="lineno"> 9472</span>  <span class="keywordflow">return</span> os;</div><div class="line"><a name="l09473"></a><span class="lineno"> 9473</span> }</div><div class="line"><a name="l09474"></a><span class="lineno"> 9474</span> </div><div class="line"><a name="l09475"></a><span class="lineno"> 9475</span> <span class="comment">// The PolymorphicMatcher class template makes it easy to implement a</span></div><div class="line"><a name="l09476"></a><span class="lineno"> 9476</span> <span class="comment">// polymorphic matcher (i.e. a matcher that can match values of more</span></div><div class="line"><a name="l09477"></a><span class="lineno"> 9477</span> <span class="comment">// than one type, e.g. Eq(n) and NotNull()).</span></div><div class="line"><a name="l09478"></a><span class="lineno"> 9478</span> <span class="comment">//</span></div><div class="line"><a name="l09479"></a><span class="lineno"> 9479</span> <span class="comment">// To define a polymorphic matcher, a user should provide an Impl</span></div><div class="line"><a name="l09480"></a><span class="lineno"> 9480</span> <span class="comment">// class that has a DescribeTo() method and a DescribeNegationTo()</span></div><div class="line"><a name="l09481"></a><span class="lineno"> 9481</span> <span class="comment">// method, and define a member function (or member function template)</span></div><div class="line"><a name="l09482"></a><span class="lineno"> 9482</span> <span class="comment">//</span></div><div class="line"><a name="l09483"></a><span class="lineno"> 9483</span> <span class="comment">// bool MatchAndExplain(const Value& value,</span></div><div class="line"><a name="l09484"></a><span class="lineno"> 9484</span> <span class="comment">// MatchResultListener* listener) const;</span></div><div class="line"><a name="l09485"></a><span class="lineno"> 9485</span> <span class="comment">//</span></div><div class="line"><a name="l09486"></a><span class="lineno"> 9486</span> <span class="comment">// See the definition of NotNull() for a complete example.</span></div><div class="line"><a name="l09487"></a><span class="lineno"> 9487</span> <span class="keyword">template</span> <<span class="keyword">class</span> Impl></div><div class="line"><a name="l09488"></a><span class="lineno"> 9488</span> <span class="keyword">class </span>PolymorphicMatcher {</div><div class="line"><a name="l09489"></a><span class="lineno"> 9489</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l09490"></a><span class="lineno"> 9490</span>  <span class="keyword">explicit</span> PolymorphicMatcher(<span class="keyword">const</span> Impl& an_impl) : impl_(an_impl) {}</div><div class="line"><a name="l09491"></a><span class="lineno"> 9491</span> </div><div class="line"><a name="l09492"></a><span class="lineno"> 9492</span>  <span class="comment">// Returns a mutable reference to the underlying matcher</span></div><div class="line"><a name="l09493"></a><span class="lineno"> 9493</span>  <span class="comment">// implementation object.</span></div><div class="line"><a name="l09494"></a><span class="lineno"> 9494</span>  Impl& mutable_impl() { <span class="keywordflow">return</span> impl_; }</div><div class="line"><a name="l09495"></a><span class="lineno"> 9495</span> </div><div class="line"><a name="l09496"></a><span class="lineno"> 9496</span>  <span class="comment">// Returns an immutable reference to the underlying matcher</span></div><div class="line"><a name="l09497"></a><span class="lineno"> 9497</span>  <span class="comment">// implementation object.</span></div><div class="line"><a name="l09498"></a><span class="lineno"> 9498</span>  <span class="keyword">const</span> Impl& impl()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> impl_; }</div><div class="line"><a name="l09499"></a><span class="lineno"> 9499</span> </div><div class="line"><a name="l09500"></a><span class="lineno"> 9500</span>  <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l09501"></a><span class="lineno"> 9501</span>  <span class="keyword">operator</span> Matcher<T>() <span class="keyword">const</span> {</div><div class="line"><a name="l09502"></a><span class="lineno"> 9502</span>  <span class="keywordflow">return</span> Matcher<T>(<span class="keyword">new</span> MonomorphicImpl<const T&>(impl_));</div><div class="line"><a name="l09503"></a><span class="lineno"> 9503</span>  }</div><div class="line"><a name="l09504"></a><span class="lineno"> 9504</span> </div><div class="line"><a name="l09505"></a><span class="lineno"> 9505</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l09506"></a><span class="lineno"> 9506</span>  <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l09507"></a><span class="lineno"> 9507</span>  <span class="keyword">class </span>MonomorphicImpl : <span class="keyword">public</span> MatcherInterface<T> {</div><div class="line"><a name="l09508"></a><span class="lineno"> 9508</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l09509"></a><span class="lineno"> 9509</span>  <span class="keyword">explicit</span> MonomorphicImpl(<span class="keyword">const</span> Impl& impl) : impl_(impl) {}</div><div class="line"><a name="l09510"></a><span class="lineno"> 9510</span> </div><div class="line"><a name="l09511"></a><span class="lineno"> 9511</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> DescribeTo(::std::ostream* os)<span class="keyword"> const </span>{ impl_.DescribeTo(os); }</div><div class="line"><a name="l09512"></a><span class="lineno"> 9512</span> </div><div class="line"><a name="l09513"></a><span class="lineno"> 9513</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> DescribeNegationTo(::std::ostream* os)<span class="keyword"> const </span>{</div><div class="line"><a name="l09514"></a><span class="lineno"> 9514</span>  impl_.DescribeNegationTo(os);</div><div class="line"><a name="l09515"></a><span class="lineno"> 9515</span>  }</div><div class="line"><a name="l09516"></a><span class="lineno"> 9516</span> </div><div class="line"><a name="l09517"></a><span class="lineno"> 9517</span>  <span class="keyword">virtual</span> <span class="keywordtype">bool</span> MatchAndExplain(T x, MatchResultListener* listener)<span class="keyword"> const </span>{</div><div class="line"><a name="l09518"></a><span class="lineno"> 9518</span>  <span class="keywordflow">return</span> impl_.MatchAndExplain(x, listener);</div><div class="line"><a name="l09519"></a><span class="lineno"> 9519</span>  }</div><div class="line"><a name="l09520"></a><span class="lineno"> 9520</span> </div><div class="line"><a name="l09521"></a><span class="lineno"> 9521</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l09522"></a><span class="lineno"> 9522</span>  <span class="keyword">const</span> Impl impl_;</div><div class="line"><a name="l09523"></a><span class="lineno"> 9523</span> </div><div class="line"><a name="l09524"></a><span class="lineno"> 9524</span>  <a class="code" href="gtest_8h.html#ac593b50ce24257d5b6aa84845c344c9e">GTEST_DISALLOW_ASSIGN_</a>(MonomorphicImpl);</div><div class="line"><a name="l09525"></a><span class="lineno"> 9525</span>  };</div><div class="line"><a name="l09526"></a><span class="lineno"> 9526</span> </div><div class="line"><a name="l09527"></a><span class="lineno"> 9527</span>  Impl impl_;</div><div class="line"><a name="l09528"></a><span class="lineno"> 9528</span> </div><div class="line"><a name="l09529"></a><span class="lineno"> 9529</span>  <a class="code" href="gtest_8h.html#ac593b50ce24257d5b6aa84845c344c9e">GTEST_DISALLOW_ASSIGN_</a>(PolymorphicMatcher);</div><div class="line"><a name="l09530"></a><span class="lineno"> 9530</span> };</div><div class="line"><a name="l09531"></a><span class="lineno"> 9531</span> </div><div class="line"><a name="l09532"></a><span class="lineno"> 9532</span> <span class="comment">// Creates a matcher from its implementation. This is easier to use</span></div><div class="line"><a name="l09533"></a><span class="lineno"> 9533</span> <span class="comment">// than the Matcher<T> constructor as it doesn't require you to</span></div><div class="line"><a name="l09534"></a><span class="lineno"> 9534</span> <span class="comment">// explicitly write the template argument, e.g.</span></div><div class="line"><a name="l09535"></a><span class="lineno"> 9535</span> <span class="comment">//</span></div><div class="line"><a name="l09536"></a><span class="lineno"> 9536</span> <span class="comment">// MakeMatcher(foo);</span></div><div class="line"><a name="l09537"></a><span class="lineno"> 9537</span> <span class="comment">// vs</span></div><div class="line"><a name="l09538"></a><span class="lineno"> 9538</span> <span class="comment">// Matcher<const string&>(foo);</span></div><div class="line"><a name="l09539"></a><span class="lineno"> 9539</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l09540"></a><span class="lineno"> 9540</span> <span class="keyword">inline</span> Matcher<T> MakeMatcher(<span class="keyword">const</span> MatcherInterface<T>* impl) {</div><div class="line"><a name="l09541"></a><span class="lineno"> 9541</span>  <span class="keywordflow">return</span> Matcher<T>(impl);</div><div class="line"><a name="l09542"></a><span class="lineno"> 9542</span> }</div><div class="line"><a name="l09543"></a><span class="lineno"> 9543</span> </div><div class="line"><a name="l09544"></a><span class="lineno"> 9544</span> <span class="comment">// Creates a polymorphic matcher from its implementation. This is</span></div><div class="line"><a name="l09545"></a><span class="lineno"> 9545</span> <span class="comment">// easier to use than the PolymorphicMatcher<Impl> constructor as it</span></div><div class="line"><a name="l09546"></a><span class="lineno"> 9546</span> <span class="comment">// doesn't require you to explicitly write the template argument, e.g.</span></div><div class="line"><a name="l09547"></a><span class="lineno"> 9547</span> <span class="comment">//</span></div><div class="line"><a name="l09548"></a><span class="lineno"> 9548</span> <span class="comment">// MakePolymorphicMatcher(foo);</span></div><div class="line"><a name="l09549"></a><span class="lineno"> 9549</span> <span class="comment">// vs</span></div><div class="line"><a name="l09550"></a><span class="lineno"> 9550</span> <span class="comment">// PolymorphicMatcher<TypeOfFoo>(foo);</span></div><div class="line"><a name="l09551"></a><span class="lineno"> 9551</span> <span class="keyword">template</span> <<span class="keyword">class</span> Impl></div><div class="line"><a name="l09552"></a><span class="lineno"> 9552</span> <span class="keyword">inline</span> PolymorphicMatcher<Impl> MakePolymorphicMatcher(<span class="keyword">const</span> Impl& impl) {</div><div class="line"><a name="l09553"></a><span class="lineno"> 9553</span>  <span class="keywordflow">return</span> PolymorphicMatcher<Impl>(impl);</div><div class="line"><a name="l09554"></a><span class="lineno"> 9554</span> }</div><div class="line"><a name="l09555"></a><span class="lineno"> 9555</span> </div><div class="line"><a name="l09556"></a><span class="lineno"> 9556</span> <span class="keyword">namespace </span>internal {</div><div class="line"><a name="l09557"></a><span class="lineno"> 9557</span> <span class="comment">// Implements a matcher that compares a given value with a</span></div><div class="line"><a name="l09558"></a><span class="lineno"> 9558</span> <span class="comment">// pre-supplied value using one of the ==, <=, <, etc, operators. The</span></div><div class="line"><a name="l09559"></a><span class="lineno"> 9559</span> <span class="comment">// two values being compared don't have to have the same type.</span></div><div class="line"><a name="l09560"></a><span class="lineno"> 9560</span> <span class="comment">//</span></div><div class="line"><a name="l09561"></a><span class="lineno"> 9561</span> <span class="comment">// The matcher defined here is polymorphic (for example, Eq(5) can be</span></div><div class="line"><a name="l09562"></a><span class="lineno"> 9562</span> <span class="comment">// used to match an int, a short, a double, etc). Therefore we use</span></div><div class="line"><a name="l09563"></a><span class="lineno"> 9563</span> <span class="comment">// a template type conversion operator in the implementation.</span></div><div class="line"><a name="l09564"></a><span class="lineno"> 9564</span> <span class="comment">//</span></div><div class="line"><a name="l09565"></a><span class="lineno"> 9565</span> <span class="comment">// The following template definition assumes that the Rhs parameter is</span></div><div class="line"><a name="l09566"></a><span class="lineno"> 9566</span> <span class="comment">// a "bare" type (i.e. neither 'const T' nor 'T&').</span></div><div class="line"><a name="l09567"></a><span class="lineno"> 9567</span> <span class="keyword">template</span> <<span class="keyword">typename</span> D, <span class="keyword">typename</span> Rhs, <span class="keyword">typename</span> Op></div><div class="line"><a name="l09568"></a><span class="lineno"> 9568</span> <span class="keyword">class </span>ComparisonBase {</div><div class="line"><a name="l09569"></a><span class="lineno"> 9569</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l09570"></a><span class="lineno"> 9570</span>  <span class="keyword">explicit</span> ComparisonBase(<span class="keyword">const</span> Rhs& rhs) : rhs_(rhs) {}</div><div class="line"><a name="l09571"></a><span class="lineno"> 9571</span>  <span class="keyword">template</span> <<span class="keyword">typename</span> Lhs></div><div class="line"><a name="l09572"></a><span class="lineno"> 9572</span>  <span class="keyword">operator</span> Matcher<Lhs>() <span class="keyword">const</span> {</div><div class="line"><a name="l09573"></a><span class="lineno"> 9573</span>  <span class="keywordflow">return</span> MakeMatcher(<span class="keyword">new</span> Impl<Lhs>(rhs_));</div><div class="line"><a name="l09574"></a><span class="lineno"> 9574</span>  }</div><div class="line"><a name="l09575"></a><span class="lineno"> 9575</span> </div><div class="line"><a name="l09576"></a><span class="lineno"> 9576</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l09577"></a><span class="lineno"> 9577</span>  <span class="keyword">template</span> <<span class="keyword">typename</span> Lhs></div><div class="line"><a name="l09578"></a><span class="lineno"> 9578</span>  <span class="keyword">class </span>Impl : <span class="keyword">public</span> MatcherInterface<Lhs> {</div><div class="line"><a name="l09579"></a><span class="lineno"> 9579</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l09580"></a><span class="lineno"> 9580</span>  <span class="keyword">explicit</span> Impl(<span class="keyword">const</span> Rhs& rhs) : rhs_(rhs) {}</div><div class="line"><a name="l09581"></a><span class="lineno"> 9581</span>  <span class="keywordtype">bool</span> MatchAndExplain(Lhs lhs,</div><div class="line"><a name="l09582"></a><span class="lineno"> 9582</span>  MatchResultListener* <span class="comment">/* listener */</span>)<span class="keyword"> const override </span>{</div><div class="line"><a name="l09583"></a><span class="lineno"> 9583</span>  <span class="keywordflow">return</span> Op()(lhs, rhs_);</div><div class="line"><a name="l09584"></a><span class="lineno"> 9584</span>  }</div><div class="line"><a name="l09585"></a><span class="lineno"> 9585</span>  <span class="keywordtype">void</span> DescribeTo(::std::ostream* os)<span class="keyword"> const override </span>{</div><div class="line"><a name="l09586"></a><span class="lineno"> 9586</span>  *os << D::Desc() << <span class="stringliteral">" "</span>;</div><div class="line"><a name="l09587"></a><span class="lineno"> 9587</span>  <a class="code" href="namespacetesting_1_1internal.html#a30708fa2bacf11895b03bdb21eb72309">UniversalPrint</a>(rhs_, os);</div><div class="line"><a name="l09588"></a><span class="lineno"> 9588</span>  }</div><div class="line"><a name="l09589"></a><span class="lineno"> 9589</span>  <span class="keywordtype">void</span> DescribeNegationTo(::std::ostream* os)<span class="keyword"> const override </span>{</div><div class="line"><a name="l09590"></a><span class="lineno"> 9590</span>  *os << D::NegatedDesc() << <span class="stringliteral">" "</span>;</div><div class="line"><a name="l09591"></a><span class="lineno"> 9591</span>  <a class="code" href="namespacetesting_1_1internal.html#a30708fa2bacf11895b03bdb21eb72309">UniversalPrint</a>(rhs_, os);</div><div class="line"><a name="l09592"></a><span class="lineno"> 9592</span>  }</div><div class="line"><a name="l09593"></a><span class="lineno"> 9593</span> </div><div class="line"><a name="l09594"></a><span class="lineno"> 9594</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l09595"></a><span class="lineno"> 9595</span>  Rhs rhs_;</div><div class="line"><a name="l09596"></a><span class="lineno"> 9596</span>  <a class="code" href="gtest_8h.html#ac593b50ce24257d5b6aa84845c344c9e">GTEST_DISALLOW_ASSIGN_</a>(Impl);</div><div class="line"><a name="l09597"></a><span class="lineno"> 9597</span>  };</div><div class="line"><a name="l09598"></a><span class="lineno"> 9598</span>  Rhs rhs_;</div><div class="line"><a name="l09599"></a><span class="lineno"> 9599</span>  <a class="code" href="gtest_8h.html#ac593b50ce24257d5b6aa84845c344c9e">GTEST_DISALLOW_ASSIGN_</a>(ComparisonBase);</div><div class="line"><a name="l09600"></a><span class="lineno"> 9600</span> };</div><div class="line"><a name="l09601"></a><span class="lineno"> 9601</span> </div><div class="line"><a name="l09602"></a><span class="lineno"> 9602</span> <span class="keyword">template</span> <<span class="keyword">typename</span> Rhs></div><div class="line"><a name="l09603"></a><span class="lineno"> 9603</span> <span class="keyword">class </span>EqMatcher : <span class="keyword">public</span> ComparisonBase<EqMatcher<Rhs>, Rhs, AnyEq> {</div><div class="line"><a name="l09604"></a><span class="lineno"> 9604</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l09605"></a><span class="lineno"> 9605</span>  <span class="keyword">explicit</span> EqMatcher(<span class="keyword">const</span> Rhs& rhs)</div><div class="line"><a name="l09606"></a><span class="lineno"> 9606</span>  : ComparisonBase<EqMatcher<Rhs>, Rhs, AnyEq>(rhs) { }</div><div class="line"><a name="l09607"></a><span class="lineno"> 9607</span>  <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* Desc() { <span class="keywordflow">return</span> <span class="stringliteral">"is equal to"</span>; }</div><div class="line"><a name="l09608"></a><span class="lineno"> 9608</span>  <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* NegatedDesc() { <span class="keywordflow">return</span> <span class="stringliteral">"isn't equal to"</span>; }</div><div class="line"><a name="l09609"></a><span class="lineno"> 9609</span> };</div><div class="line"><a name="l09610"></a><span class="lineno"> 9610</span> <span class="keyword">template</span> <<span class="keyword">typename</span> Rhs></div><div class="line"><a name="l09611"></a><span class="lineno"> 9611</span> <span class="keyword">class </span>NeMatcher : <span class="keyword">public</span> ComparisonBase<NeMatcher<Rhs>, Rhs, AnyNe> {</div><div class="line"><a name="l09612"></a><span class="lineno"> 9612</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l09613"></a><span class="lineno"> 9613</span>  <span class="keyword">explicit</span> NeMatcher(<span class="keyword">const</span> Rhs& rhs)</div><div class="line"><a name="l09614"></a><span class="lineno"> 9614</span>  : ComparisonBase<NeMatcher<Rhs>, Rhs, AnyNe>(rhs) { }</div><div class="line"><a name="l09615"></a><span class="lineno"> 9615</span>  <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* Desc() { <span class="keywordflow">return</span> <span class="stringliteral">"isn't equal to"</span>; }</div><div class="line"><a name="l09616"></a><span class="lineno"> 9616</span>  <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* NegatedDesc() { <span class="keywordflow">return</span> <span class="stringliteral">"is equal to"</span>; }</div><div class="line"><a name="l09617"></a><span class="lineno"> 9617</span> };</div><div class="line"><a name="l09618"></a><span class="lineno"> 9618</span> <span class="keyword">template</span> <<span class="keyword">typename</span> Rhs></div><div class="line"><a name="l09619"></a><span class="lineno"> 9619</span> <span class="keyword">class </span>LtMatcher : <span class="keyword">public</span> ComparisonBase<LtMatcher<Rhs>, Rhs, AnyLt> {</div><div class="line"><a name="l09620"></a><span class="lineno"> 9620</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l09621"></a><span class="lineno"> 9621</span>  <span class="keyword">explicit</span> LtMatcher(<span class="keyword">const</span> Rhs& rhs)</div><div class="line"><a name="l09622"></a><span class="lineno"> 9622</span>  : ComparisonBase<LtMatcher<Rhs>, Rhs, AnyLt>(rhs) { }</div><div class="line"><a name="l09623"></a><span class="lineno"> 9623</span>  <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* Desc() { <span class="keywordflow">return</span> <span class="stringliteral">"is <"</span>; }</div><div class="line"><a name="l09624"></a><span class="lineno"> 9624</span>  <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* NegatedDesc() { <span class="keywordflow">return</span> <span class="stringliteral">"isn't <"</span>; }</div><div class="line"><a name="l09625"></a><span class="lineno"> 9625</span> };</div><div class="line"><a name="l09626"></a><span class="lineno"> 9626</span> <span class="keyword">template</span> <<span class="keyword">typename</span> Rhs></div><div class="line"><a name="l09627"></a><span class="lineno"> 9627</span> <span class="keyword">class </span>GtMatcher : <span class="keyword">public</span> ComparisonBase<GtMatcher<Rhs>, Rhs, AnyGt> {</div><div class="line"><a name="l09628"></a><span class="lineno"> 9628</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l09629"></a><span class="lineno"> 9629</span>  <span class="keyword">explicit</span> GtMatcher(<span class="keyword">const</span> Rhs& rhs)</div><div class="line"><a name="l09630"></a><span class="lineno"> 9630</span>  : ComparisonBase<GtMatcher<Rhs>, Rhs, AnyGt>(rhs) { }</div><div class="line"><a name="l09631"></a><span class="lineno"> 9631</span>  <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* Desc() { <span class="keywordflow">return</span> <span class="stringliteral">"is >"</span>; }</div><div class="line"><a name="l09632"></a><span class="lineno"> 9632</span>  <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* NegatedDesc() { <span class="keywordflow">return</span> <span class="stringliteral">"isn't >"</span>; }</div><div class="line"><a name="l09633"></a><span class="lineno"> 9633</span> };</div><div class="line"><a name="l09634"></a><span class="lineno"> 9634</span> <span class="keyword">template</span> <<span class="keyword">typename</span> Rhs></div><div class="line"><a name="l09635"></a><span class="lineno"> 9635</span> <span class="keyword">class </span>LeMatcher : <span class="keyword">public</span> ComparisonBase<LeMatcher<Rhs>, Rhs, AnyLe> {</div><div class="line"><a name="l09636"></a><span class="lineno"> 9636</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l09637"></a><span class="lineno"> 9637</span>  <span class="keyword">explicit</span> LeMatcher(<span class="keyword">const</span> Rhs& rhs)</div><div class="line"><a name="l09638"></a><span class="lineno"> 9638</span>  : ComparisonBase<LeMatcher<Rhs>, Rhs, AnyLe>(rhs) { }</div><div class="line"><a name="l09639"></a><span class="lineno"> 9639</span>  <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* Desc() { <span class="keywordflow">return</span> <span class="stringliteral">"is <="</span>; }</div><div class="line"><a name="l09640"></a><span class="lineno"> 9640</span>  <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* NegatedDesc() { <span class="keywordflow">return</span> <span class="stringliteral">"isn't <="</span>; }</div><div class="line"><a name="l09641"></a><span class="lineno"> 9641</span> };</div><div class="line"><a name="l09642"></a><span class="lineno"> 9642</span> <span class="keyword">template</span> <<span class="keyword">typename</span> Rhs></div><div class="line"><a name="l09643"></a><span class="lineno"> 9643</span> <span class="keyword">class </span>GeMatcher : <span class="keyword">public</span> ComparisonBase<GeMatcher<Rhs>, Rhs, AnyGe> {</div><div class="line"><a name="l09644"></a><span class="lineno"> 9644</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l09645"></a><span class="lineno"> 9645</span>  <span class="keyword">explicit</span> GeMatcher(<span class="keyword">const</span> Rhs& rhs)</div><div class="line"><a name="l09646"></a><span class="lineno"> 9646</span>  : ComparisonBase<GeMatcher<Rhs>, Rhs, AnyGe>(rhs) { }</div><div class="line"><a name="l09647"></a><span class="lineno"> 9647</span>  <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* Desc() { <span class="keywordflow">return</span> <span class="stringliteral">"is >="</span>; }</div><div class="line"><a name="l09648"></a><span class="lineno"> 9648</span>  <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* NegatedDesc() { <span class="keywordflow">return</span> <span class="stringliteral">"isn't >="</span>; }</div><div class="line"><a name="l09649"></a><span class="lineno"> 9649</span> };</div><div class="line"><a name="l09650"></a><span class="lineno"> 9650</span> </div><div class="line"><a name="l09651"></a><span class="lineno"> 9651</span> <span class="comment">// Implements polymorphic matchers MatchesRegex(regex) and</span></div><div class="line"><a name="l09652"></a><span class="lineno"> 9652</span> <span class="comment">// ContainsRegex(regex), which can be used as a Matcher<T> as long as</span></div><div class="line"><a name="l09653"></a><span class="lineno"> 9653</span> <span class="comment">// T can be converted to a string.</span></div><div class="line"><a name="l09654"></a><span class="lineno"> 9654</span> <span class="keyword">class </span>MatchesRegexMatcher {</div><div class="line"><a name="l09655"></a><span class="lineno"> 9655</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l09656"></a><span class="lineno"> 9656</span>  MatchesRegexMatcher(<span class="keyword">const</span> RE* regex, <span class="keywordtype">bool</span> full_match)</div><div class="line"><a name="l09657"></a><span class="lineno"> 9657</span>  : regex_(regex), full_match_(full_match) {}</div><div class="line"><a name="l09658"></a><span class="lineno"> 9658</span> </div><div class="line"><a name="l09659"></a><span class="lineno"> 9659</span> <span class="preprocessor">#if GTEST_HAS_ABSL</span></div><div class="line"><a name="l09660"></a><span class="lineno"> 9660</span>  <span class="keywordtype">bool</span> MatchAndExplain(<span class="keyword">const</span> absl::string_view& s,</div><div class="line"><a name="l09661"></a><span class="lineno"> 9661</span>  MatchResultListener* listener)<span class="keyword"> const </span>{</div><div class="line"><a name="l09662"></a><span class="lineno"> 9662</span>  <span class="keywordflow">return</span> MatchAndExplain(<span class="keywordtype">string</span>(s), listener);</div><div class="line"><a name="l09663"></a><span class="lineno"> 9663</span>  }</div><div class="line"><a name="l09664"></a><span class="lineno"> 9664</span> <span class="preprocessor">#endif // GTEST_HAS_ABSL</span></div><div class="line"><a name="l09665"></a><span class="lineno"> 9665</span> </div><div class="line"><a name="l09666"></a><span class="lineno"> 9666</span>  <span class="comment">// Accepts pointer types, particularly:</span></div><div class="line"><a name="l09667"></a><span class="lineno"> 9667</span>  <span class="comment">// const char*</span></div><div class="line"><a name="l09668"></a><span class="lineno"> 9668</span>  <span class="comment">// char*</span></div><div class="line"><a name="l09669"></a><span class="lineno"> 9669</span>  <span class="comment">// const wchar_t*</span></div><div class="line"><a name="l09670"></a><span class="lineno"> 9670</span>  <span class="comment">// wchar_t*</span></div><div class="line"><a name="l09671"></a><span class="lineno"> 9671</span>  <span class="keyword">template</span> <<span class="keyword">typename</span> CharType></div><div class="line"><a name="l09672"></a><span class="lineno"> 9672</span>  <span class="keywordtype">bool</span> MatchAndExplain(CharType* s, MatchResultListener* listener)<span class="keyword"> const </span>{</div><div class="line"><a name="l09673"></a><span class="lineno"> 9673</span>  <span class="keywordflow">return</span> s != <span class="keyword">nullptr</span> && MatchAndExplain(<a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a>(s), listener);</div><div class="line"><a name="l09674"></a><span class="lineno"> 9674</span>  }</div><div class="line"><a name="l09675"></a><span class="lineno"> 9675</span> </div><div class="line"><a name="l09676"></a><span class="lineno"> 9676</span>  <span class="comment">// Matches anything that can convert to std::string.</span></div><div class="line"><a name="l09677"></a><span class="lineno"> 9677</span>  <span class="comment">//</span></div><div class="line"><a name="l09678"></a><span class="lineno"> 9678</span>  <span class="comment">// This is a template, not just a plain function with const std::string&,</span></div><div class="line"><a name="l09679"></a><span class="lineno"> 9679</span>  <span class="comment">// because absl::string_view has some interfering non-explicit constructors.</span></div><div class="line"><a name="l09680"></a><span class="lineno"> 9680</span>  <span class="keyword">template</span> <<span class="keyword">class</span> MatcheeStringType></div><div class="line"><a name="l09681"></a><span class="lineno"> 9681</span>  <span class="keywordtype">bool</span> MatchAndExplain(<span class="keyword">const</span> MatcheeStringType& s,</div><div class="line"><a name="l09682"></a><span class="lineno"> 9682</span>  MatchResultListener* <span class="comment">/* listener */</span>)<span class="keyword"> const </span>{</div><div class="line"><a name="l09683"></a><span class="lineno"> 9683</span>  <span class="keyword">const</span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a>& s2(s);</div><div class="line"><a name="l09684"></a><span class="lineno"> 9684</span>  <span class="keywordflow">return</span> full_match_ ? RE::FullMatch(s2, *regex_)</div><div class="line"><a name="l09685"></a><span class="lineno"> 9685</span>  : RE::PartialMatch(s2, *regex_);</div><div class="line"><a name="l09686"></a><span class="lineno"> 9686</span>  }</div><div class="line"><a name="l09687"></a><span class="lineno"> 9687</span> </div><div class="line"><a name="l09688"></a><span class="lineno"> 9688</span>  <span class="keywordtype">void</span> DescribeTo(::std::ostream* os)<span class="keyword"> const </span>{</div><div class="line"><a name="l09689"></a><span class="lineno"> 9689</span>  *os << (full_match_ ? <span class="stringliteral">"matches"</span> : <span class="stringliteral">"contains"</span>) << <span class="stringliteral">" regular expression "</span>;</div><div class="line"><a name="l09690"></a><span class="lineno"> 9690</span>  UniversalPrinter<std::string>::Print(regex_->pattern(), os);</div><div class="line"><a name="l09691"></a><span class="lineno"> 9691</span>  }</div><div class="line"><a name="l09692"></a><span class="lineno"> 9692</span> </div><div class="line"><a name="l09693"></a><span class="lineno"> 9693</span>  <span class="keywordtype">void</span> DescribeNegationTo(::std::ostream* os)<span class="keyword"> const </span>{</div><div class="line"><a name="l09694"></a><span class="lineno"> 9694</span>  *os << <span class="stringliteral">"doesn't "</span> << (full_match_ ? <span class="stringliteral">"match"</span> : <span class="stringliteral">"contain"</span>)</div><div class="line"><a name="l09695"></a><span class="lineno"> 9695</span>  << <span class="stringliteral">" regular expression "</span>;</div><div class="line"><a name="l09696"></a><span class="lineno"> 9696</span>  UniversalPrinter<std::string>::Print(regex_->pattern(), os);</div><div class="line"><a name="l09697"></a><span class="lineno"> 9697</span>  }</div><div class="line"><a name="l09698"></a><span class="lineno"> 9698</span> </div><div class="line"><a name="l09699"></a><span class="lineno"> 9699</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l09700"></a><span class="lineno"> 9700</span>  <span class="keyword">const</span> std::shared_ptr<const RE> regex_;</div><div class="line"><a name="l09701"></a><span class="lineno"> 9701</span>  <span class="keyword">const</span> <span class="keywordtype">bool</span> full_match_;</div><div class="line"><a name="l09702"></a><span class="lineno"> 9702</span> </div><div class="line"><a name="l09703"></a><span class="lineno"> 9703</span>  <a class="code" href="gtest_8h.html#ac593b50ce24257d5b6aa84845c344c9e">GTEST_DISALLOW_ASSIGN_</a>(MatchesRegexMatcher);</div><div class="line"><a name="l09704"></a><span class="lineno"> 9704</span> };</div><div class="line"><a name="l09705"></a><span class="lineno"> 9705</span> } <span class="comment">// namespace internal</span></div><div class="line"><a name="l09706"></a><span class="lineno"> 9706</span> </div><div class="line"><a name="l09707"></a><span class="lineno"> 9707</span> <span class="comment">// Matches a string that fully matches regular expression 'regex'.</span></div><div class="line"><a name="l09708"></a><span class="lineno"> 9708</span> <span class="comment">// The matcher takes ownership of 'regex'.</span></div><div class="line"><a name="l09709"></a><span class="lineno"> 9709</span> <span class="keyword">inline</span> PolymorphicMatcher<internal::MatchesRegexMatcher> MatchesRegex(</div><div class="line"><a name="l09710"></a><span class="lineno"> 9710</span>  <span class="keyword">const</span> internal::RE* regex) {</div><div class="line"><a name="l09711"></a><span class="lineno"> 9711</span>  <span class="keywordflow">return</span> MakePolymorphicMatcher(internal::MatchesRegexMatcher(regex, <span class="keyword">true</span>));</div><div class="line"><a name="l09712"></a><span class="lineno"> 9712</span> }</div><div class="line"><a name="l09713"></a><span class="lineno"> 9713</span> <span class="keyword">inline</span> PolymorphicMatcher<internal::MatchesRegexMatcher> MatchesRegex(</div><div class="line"><a name="l09714"></a><span class="lineno"> 9714</span>  <span class="keyword">const</span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a>& regex) {</div><div class="line"><a name="l09715"></a><span class="lineno"> 9715</span>  <span class="keywordflow">return</span> MatchesRegex(<span class="keyword">new</span> internal::RE(regex));</div><div class="line"><a name="l09716"></a><span class="lineno"> 9716</span> }</div><div class="line"><a name="l09717"></a><span class="lineno"> 9717</span> </div><div class="line"><a name="l09718"></a><span class="lineno"> 9718</span> <span class="comment">// Matches a string that contains regular expression 'regex'.</span></div><div class="line"><a name="l09719"></a><span class="lineno"> 9719</span> <span class="comment">// The matcher takes ownership of 'regex'.</span></div><div class="line"><a name="l09720"></a><span class="lineno"> 9720</span> <span class="keyword">inline</span> PolymorphicMatcher<internal::MatchesRegexMatcher> ContainsRegex(</div><div class="line"><a name="l09721"></a><span class="lineno"> 9721</span>  <span class="keyword">const</span> internal::RE* regex) {</div><div class="line"><a name="l09722"></a><span class="lineno"> 9722</span>  <span class="keywordflow">return</span> MakePolymorphicMatcher(internal::MatchesRegexMatcher(regex, <span class="keyword">false</span>));</div><div class="line"><a name="l09723"></a><span class="lineno"> 9723</span> }</div><div class="line"><a name="l09724"></a><span class="lineno"> 9724</span> <span class="keyword">inline</span> PolymorphicMatcher<internal::MatchesRegexMatcher> ContainsRegex(</div><div class="line"><a name="l09725"></a><span class="lineno"> 9725</span>  <span class="keyword">const</span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a>& regex) {</div><div class="line"><a name="l09726"></a><span class="lineno"> 9726</span>  <span class="keywordflow">return</span> ContainsRegex(<span class="keyword">new</span> internal::RE(regex));</div><div class="line"><a name="l09727"></a><span class="lineno"> 9727</span> }</div><div class="line"><a name="l09728"></a><span class="lineno"> 9728</span> </div><div class="line"><a name="l09729"></a><span class="lineno"> 9729</span> <span class="comment">// Creates a polymorphic matcher that matches anything equal to x.</span></div><div class="line"><a name="l09730"></a><span class="lineno"> 9730</span> <span class="comment">// Note: if the parameter of Eq() were declared as const T&, Eq("foo")</span></div><div class="line"><a name="l09731"></a><span class="lineno"> 9731</span> <span class="comment">// wouldn't compile.</span></div><div class="line"><a name="l09732"></a><span class="lineno"> 9732</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l09733"></a><span class="lineno"> 9733</span> <span class="keyword">inline</span> internal::EqMatcher<T> Eq(T x) { <span class="keywordflow">return</span> internal::EqMatcher<T>(x); }</div><div class="line"><a name="l09734"></a><span class="lineno"> 9734</span> </div><div class="line"><a name="l09735"></a><span class="lineno"> 9735</span> <span class="comment">// Constructs a Matcher<T> from a 'value' of type T. The constructed</span></div><div class="line"><a name="l09736"></a><span class="lineno"> 9736</span> <span class="comment">// matcher matches any value that's equal to 'value'.</span></div><div class="line"><a name="l09737"></a><span class="lineno"> 9737</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l09738"></a><span class="lineno"> 9738</span> Matcher<T>::Matcher(T value) { *<span class="keyword">this</span> = Eq(value); }</div><div class="line"><a name="l09739"></a><span class="lineno"> 9739</span> </div><div class="line"><a name="l09740"></a><span class="lineno"> 9740</span> <span class="comment">// Creates a monomorphic matcher that matches anything with type Lhs</span></div><div class="line"><a name="l09741"></a><span class="lineno"> 9741</span> <span class="comment">// and equal to rhs. A user may need to use this instead of Eq(...)</span></div><div class="line"><a name="l09742"></a><span class="lineno"> 9742</span> <span class="comment">// in order to resolve an overloading ambiguity.</span></div><div class="line"><a name="l09743"></a><span class="lineno"> 9743</span> <span class="comment">//</span></div><div class="line"><a name="l09744"></a><span class="lineno"> 9744</span> <span class="comment">// TypedEq<T>(x) is just a convenient short-hand for Matcher<T>(Eq(x))</span></div><div class="line"><a name="l09745"></a><span class="lineno"> 9745</span> <span class="comment">// or Matcher<T>(x), but more readable than the latter.</span></div><div class="line"><a name="l09746"></a><span class="lineno"> 9746</span> <span class="comment">//</span></div><div class="line"><a name="l09747"></a><span class="lineno"> 9747</span> <span class="comment">// We could define similar monomorphic matchers for other comparison</span></div><div class="line"><a name="l09748"></a><span class="lineno"> 9748</span> <span class="comment">// operations (e.g. TypedLt, TypedGe, and etc), but decided not to do</span></div><div class="line"><a name="l09749"></a><span class="lineno"> 9749</span> <span class="comment">// it yet as those are used much less than Eq() in practice. A user</span></div><div class="line"><a name="l09750"></a><span class="lineno"> 9750</span> <span class="comment">// can always write Matcher<T>(Lt(5)) to be explicit about the type,</span></div><div class="line"><a name="l09751"></a><span class="lineno"> 9751</span> <span class="comment">// for example.</span></div><div class="line"><a name="l09752"></a><span class="lineno"> 9752</span> <span class="keyword">template</span> <<span class="keyword">typename</span> Lhs, <span class="keyword">typename</span> Rhs></div><div class="line"><a name="l09753"></a><span class="lineno"> 9753</span> <span class="keyword">inline</span> Matcher<Lhs> TypedEq(<span class="keyword">const</span> Rhs& rhs) { <span class="keywordflow">return</span> Eq(rhs); }</div><div class="line"><a name="l09754"></a><span class="lineno"> 9754</span> </div><div class="line"><a name="l09755"></a><span class="lineno"> 9755</span> <span class="comment">// Creates a polymorphic matcher that matches anything >= x.</span></div><div class="line"><a name="l09756"></a><span class="lineno"> 9756</span> <span class="keyword">template</span> <<span class="keyword">typename</span> Rhs></div><div class="line"><a name="l09757"></a><span class="lineno"> 9757</span> <span class="keyword">inline</span> internal::GeMatcher<Rhs> Ge(Rhs x) {</div><div class="line"><a name="l09758"></a><span class="lineno"> 9758</span>  <span class="keywordflow">return</span> internal::GeMatcher<Rhs>(x);</div><div class="line"><a name="l09759"></a><span class="lineno"> 9759</span> }</div><div class="line"><a name="l09760"></a><span class="lineno"> 9760</span> </div><div class="line"><a name="l09761"></a><span class="lineno"> 9761</span> <span class="comment">// Creates a polymorphic matcher that matches anything > x.</span></div><div class="line"><a name="l09762"></a><span class="lineno"> 9762</span> <span class="keyword">template</span> <<span class="keyword">typename</span> Rhs></div><div class="line"><a name="l09763"></a><span class="lineno"> 9763</span> <span class="keyword">inline</span> internal::GtMatcher<Rhs> Gt(Rhs x) {</div><div class="line"><a name="l09764"></a><span class="lineno"> 9764</span>  <span class="keywordflow">return</span> internal::GtMatcher<Rhs>(x);</div><div class="line"><a name="l09765"></a><span class="lineno"> 9765</span> }</div><div class="line"><a name="l09766"></a><span class="lineno"> 9766</span> </div><div class="line"><a name="l09767"></a><span class="lineno"> 9767</span> <span class="comment">// Creates a polymorphic matcher that matches anything <= x.</span></div><div class="line"><a name="l09768"></a><span class="lineno"> 9768</span> <span class="keyword">template</span> <<span class="keyword">typename</span> Rhs></div><div class="line"><a name="l09769"></a><span class="lineno"> 9769</span> <span class="keyword">inline</span> internal::LeMatcher<Rhs> Le(Rhs x) {</div><div class="line"><a name="l09770"></a><span class="lineno"> 9770</span>  <span class="keywordflow">return</span> internal::LeMatcher<Rhs>(x);</div><div class="line"><a name="l09771"></a><span class="lineno"> 9771</span> }</div><div class="line"><a name="l09772"></a><span class="lineno"> 9772</span> </div><div class="line"><a name="l09773"></a><span class="lineno"> 9773</span> <span class="comment">// Creates a polymorphic matcher that matches anything < x.</span></div><div class="line"><a name="l09774"></a><span class="lineno"> 9774</span> <span class="keyword">template</span> <<span class="keyword">typename</span> Rhs></div><div class="line"><a name="l09775"></a><span class="lineno"> 9775</span> <span class="keyword">inline</span> internal::LtMatcher<Rhs> Lt(Rhs x) {</div><div class="line"><a name="l09776"></a><span class="lineno"> 9776</span>  <span class="keywordflow">return</span> internal::LtMatcher<Rhs>(x);</div><div class="line"><a name="l09777"></a><span class="lineno"> 9777</span> }</div><div class="line"><a name="l09778"></a><span class="lineno"> 9778</span> </div><div class="line"><a name="l09779"></a><span class="lineno"> 9779</span> <span class="comment">// Creates a polymorphic matcher that matches anything != x.</span></div><div class="line"><a name="l09780"></a><span class="lineno"> 9780</span> <span class="keyword">template</span> <<span class="keyword">typename</span> Rhs></div><div class="line"><a name="l09781"></a><span class="lineno"> 9781</span> <span class="keyword">inline</span> internal::NeMatcher<Rhs> Ne(Rhs x) {</div><div class="line"><a name="l09782"></a><span class="lineno"> 9782</span>  <span class="keywordflow">return</span> internal::NeMatcher<Rhs>(x);</div><div class="line"><a name="l09783"></a><span class="lineno"> 9783</span> }</div><div class="line"><a name="l09784"></a><span class="lineno"> 9784</span> } <span class="comment">// namespace testing</span></div><div class="line"><a name="l09785"></a><span class="lineno"> 9785</span> </div><div class="line"><a name="l09786"></a><span class="lineno"> 9786</span> <a class="code" href="gtest_8h.html#aebf8277c9069c1e124f9a5bbe2948061">GTEST_DISABLE_MSC_WARNINGS_POP_</a>() <span class="comment">// 4251 5046</span></div><div class="line"><a name="l09787"></a><span class="lineno"> 9787</span> </div><div class="line"><a name="l09788"></a><span class="lineno"> 9788</span> <span class="preprocessor">#endif // GTEST_INCLUDE_GTEST_GTEST_MATCHERS_H_</span></div><div class="line"><a name="l09789"></a><span class="lineno"> 9789</span> </div><div class="line"><a name="l09790"></a><span class="lineno"> 9790</span> <span class="preprocessor">#include <stdio.h></span></div><div class="line"><a name="l09791"></a><span class="lineno"> 9791</span> <span class="preprocessor">#include <memory></span></div><div class="line"><a name="l09792"></a><span class="lineno"> 9792</span> </div><div class="line"><a name="l09793"></a><span class="lineno"> 9793</span> <span class="keyword">namespace </span><a class="code" href="namespacetesting.html">testing</a> {</div><div class="line"><a name="l09794"></a><span class="lineno"> 9794</span> <span class="keyword">namespace </span>internal {</div><div class="line"><a name="l09795"></a><span class="lineno"> 9795</span> </div><div class="line"><a name="l09796"></a><span class="lineno"> 9796</span> <a class="code" href="namespacetesting.html#a37b7e87f0a5f502c6918f37d1768c1f3">GTEST_DECLARE_string_</a>(internal_run_death_test);</div><div class="line"><a name="l09797"></a><span class="lineno"> 9797</span> </div><div class="line"><a name="l09798"></a><span class="lineno"> 9798</span> <span class="comment">// Names of the flags (needed for parsing Google Test flags).</span></div><div class="line"><a name="l09799"></a><span class="lineno"> 9799</span> <span class="keyword">const</span> <span class="keywordtype">char</span> kDeathTestStyleFlag[] = <span class="stringliteral">"death_test_style"</span>;</div><div class="line"><a name="l09800"></a><span class="lineno"> 9800</span> <span class="keyword">const</span> <span class="keywordtype">char</span> kDeathTestUseFork[] = <span class="stringliteral">"death_test_use_fork"</span>;</div><div class="line"><a name="l09801"></a><span class="lineno"> 9801</span> <span class="keyword">const</span> <span class="keywordtype">char</span> kInternalRunDeathTestFlag[] = <span class="stringliteral">"internal_run_death_test"</span>;</div><div class="line"><a name="l09802"></a><span class="lineno"> 9802</span> </div><div class="line"><a name="l09803"></a><span class="lineno"> 9803</span> <span class="preprocessor">#if GTEST_HAS_DEATH_TEST</span></div><div class="line"><a name="l09804"></a><span class="lineno"> 9804</span> </div><div class="line"><a name="l09805"></a><span class="lineno"> 9805</span> <a class="code" href="gtest_8h.html#a86994cc68e844d8b82089c70408dfc61">GTEST_DISABLE_MSC_WARNINGS_PUSH_</a>(4251 \</div><div class="line"><a name="l09806"></a><span class="lineno"> 9806</span> <span class="comment">/* class A needs to have dll-interface to be used by clients of class B */</span>)</div><div class="line"><a name="l09807"></a><span class="lineno"> 9807</span> </div><div class="line"><a name="l09808"></a><span class="lineno"> 9808</span> <span class="comment">// DeathTest is a class that hides much of the complexity of the</span></div><div class="line"><a name="l09809"></a><span class="lineno"> 9809</span> <span class="comment">// GTEST_DEATH_TEST_ macro. It is abstract; its static Create method</span></div><div class="line"><a name="l09810"></a><span class="lineno"> 9810</span> <span class="comment">// returns a concrete class that depends on the prevailing death test</span></div><div class="line"><a name="l09811"></a><span class="lineno"> 9811</span> <span class="comment">// style, as defined by the --gtest_death_test_style and/or</span></div><div class="line"><a name="l09812"></a><span class="lineno"> 9812</span> <span class="comment">// --gtest_internal_run_death_test flags.</span></div><div class="line"><a name="l09813"></a><span class="lineno"> 9813</span> </div><div class="line"><a name="l09814"></a><span class="lineno"> 9814</span> <span class="comment">// In describing the results of death tests, these terms are used with</span></div><div class="line"><a name="l09815"></a><span class="lineno"> 9815</span> <span class="comment">// the corresponding definitions:</span></div><div class="line"><a name="l09816"></a><span class="lineno"> 9816</span> <span class="comment">//</span></div><div class="line"><a name="l09817"></a><span class="lineno"> 9817</span> <span class="comment">// exit status: The integer exit information in the format specified</span></div><div class="line"><a name="l09818"></a><span class="lineno"> 9818</span> <span class="comment">// by wait(2)</span></div><div class="line"><a name="l09819"></a><span class="lineno"> 9819</span> <span class="comment">// exit code: The integer code passed to exit(3), _exit(2), or</span></div><div class="line"><a name="l09820"></a><span class="lineno"> 9820</span> <span class="comment">// returned from main()</span></div><div class="line"><a name="l09821"></a><span class="lineno"> 9821</span> class <a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> DeathTest {</div><div class="line"><a name="l09822"></a><span class="lineno"> 9822</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l09823"></a><span class="lineno"> 9823</span>  <span class="comment">// Create returns false if there was an error determining the</span></div><div class="line"><a name="l09824"></a><span class="lineno"> 9824</span>  <span class="comment">// appropriate action to take for the current death test; for example,</span></div><div class="line"><a name="l09825"></a><span class="lineno"> 9825</span>  <span class="comment">// if the gtest_death_test_style flag is set to an invalid value.</span></div><div class="line"><a name="l09826"></a><span class="lineno"> 9826</span>  <span class="comment">// The LastMessage method will return a more detailed message in that</span></div><div class="line"><a name="l09827"></a><span class="lineno"> 9827</span>  <span class="comment">// case. Otherwise, the DeathTest pointer pointed to by the "test"</span></div><div class="line"><a name="l09828"></a><span class="lineno"> 9828</span>  <span class="comment">// argument is set. If the death test should be skipped, the pointer</span></div><div class="line"><a name="l09829"></a><span class="lineno"> 9829</span>  <span class="comment">// is set to NULL; otherwise, it is set to the address of a new concrete</span></div><div class="line"><a name="l09830"></a><span class="lineno"> 9830</span>  <span class="comment">// DeathTest object that controls the execution of the current test.</span></div><div class="line"><a name="l09831"></a><span class="lineno"> 9831</span>  <span class="keyword">static</span> <span class="keywordtype">bool</span> Create(<span class="keyword">const</span> <span class="keywordtype">char</span>* statement, Matcher<const std::string&> matcher,</div><div class="line"><a name="l09832"></a><span class="lineno"> 9832</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* file, <span class="keywordtype">int</span> line, DeathTest** test);</div><div class="line"><a name="l09833"></a><span class="lineno"> 9833</span>  DeathTest();</div><div class="line"><a name="l09834"></a><span class="lineno"> 9834</span>  <span class="keyword">virtual</span> ~DeathTest() { }</div><div class="line"><a name="l09835"></a><span class="lineno"> 9835</span> </div><div class="line"><a name="l09836"></a><span class="lineno"> 9836</span>  <span class="comment">// A helper class that aborts a death test when it's deleted.</span></div><div class="line"><a name="l09837"></a><span class="lineno"> 9837</span>  <span class="keyword">class </span>ReturnSentinel {</div><div class="line"><a name="l09838"></a><span class="lineno"> 9838</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l09839"></a><span class="lineno"> 9839</span>  <span class="keyword">explicit</span> ReturnSentinel(DeathTest* test) : test_(test) { }</div><div class="line"><a name="l09840"></a><span class="lineno"> 9840</span>  ~ReturnSentinel() { test_->Abort(TEST_ENCOUNTERED_RETURN_STATEMENT); }</div><div class="line"><a name="l09841"></a><span class="lineno"> 9841</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l09842"></a><span class="lineno"> 9842</span>  DeathTest* <span class="keyword">const</span> test_;</div><div class="line"><a name="l09843"></a><span class="lineno"> 9843</span>  <a class="code" href="gtest_8h.html#aed8c1888c32b588b0681e88b95031e29">GTEST_DISALLOW_COPY_AND_ASSIGN_</a>(ReturnSentinel);</div><div class="line"><a name="l09844"></a><span class="lineno"> 9844</span>  } <a class="code" href="namespacetesting.html#aa09221196f0a830d5bf1c63ffce69dc3">GTEST_ATTRIBUTE_UNUSED_</a>;</div><div class="line"><a name="l09845"></a><span class="lineno"> 9845</span> </div><div class="line"><a name="l09846"></a><span class="lineno"> 9846</span>  <span class="comment">// An enumeration of possible roles that may be taken when a death</span></div><div class="line"><a name="l09847"></a><span class="lineno"> 9847</span>  <span class="comment">// test is encountered. EXECUTE means that the death test logic should</span></div><div class="line"><a name="l09848"></a><span class="lineno"> 9848</span>  <span class="comment">// be executed immediately. OVERSEE means that the program should prepare</span></div><div class="line"><a name="l09849"></a><span class="lineno"> 9849</span>  <span class="comment">// the appropriate environment for a child process to execute the death</span></div><div class="line"><a name="l09850"></a><span class="lineno"> 9850</span>  <span class="comment">// test, then wait for it to complete.</span></div><div class="line"><a name="l09851"></a><span class="lineno"> 9851</span>  <span class="keyword">enum</span> TestRole { OVERSEE_TEST, EXECUTE_TEST };</div><div class="line"><a name="l09852"></a><span class="lineno"> 9852</span> </div><div class="line"><a name="l09853"></a><span class="lineno"> 9853</span>  <span class="comment">// An enumeration of the three reasons that a test might be aborted.</span></div><div class="line"><a name="l09854"></a><span class="lineno"> 9854</span>  <span class="keyword">enum</span> AbortReason {</div><div class="line"><a name="l09855"></a><span class="lineno"> 9855</span>  TEST_ENCOUNTERED_RETURN_STATEMENT,</div><div class="line"><a name="l09856"></a><span class="lineno"> 9856</span>  TEST_THREW_EXCEPTION,</div><div class="line"><a name="l09857"></a><span class="lineno"> 9857</span>  TEST_DID_NOT_DIE</div><div class="line"><a name="l09858"></a><span class="lineno"> 9858</span>  };</div><div class="line"><a name="l09859"></a><span class="lineno"> 9859</span> </div><div class="line"><a name="l09860"></a><span class="lineno"> 9860</span>  <span class="comment">// Assumes one of the above roles.</span></div><div class="line"><a name="l09861"></a><span class="lineno"> 9861</span>  <span class="keyword">virtual</span> TestRole AssumeRole() = 0;</div><div class="line"><a name="l09862"></a><span class="lineno"> 9862</span> </div><div class="line"><a name="l09863"></a><span class="lineno"> 9863</span>  <span class="comment">// Waits for the death test to finish and returns its status.</span></div><div class="line"><a name="l09864"></a><span class="lineno"> 9864</span>  <span class="keyword">virtual</span> <span class="keywordtype">int</span> Wait() = 0;</div><div class="line"><a name="l09865"></a><span class="lineno"> 9865</span> </div><div class="line"><a name="l09866"></a><span class="lineno"> 9866</span>  <span class="comment">// Returns true if the death test passed; that is, the test process</span></div><div class="line"><a name="l09867"></a><span class="lineno"> 9867</span>  <span class="comment">// exited during the test, its exit status matches a user-supplied</span></div><div class="line"><a name="l09868"></a><span class="lineno"> 9868</span>  <span class="comment">// predicate, and its stderr output matches a user-supplied regular</span></div><div class="line"><a name="l09869"></a><span class="lineno"> 9869</span>  <span class="comment">// expression.</span></div><div class="line"><a name="l09870"></a><span class="lineno"> 9870</span>  <span class="comment">// The user-supplied predicate may be a macro expression rather</span></div><div class="line"><a name="l09871"></a><span class="lineno"> 9871</span>  <span class="comment">// than a function pointer or functor, or else Wait and Passed could</span></div><div class="line"><a name="l09872"></a><span class="lineno"> 9872</span>  <span class="comment">// be combined.</span></div><div class="line"><a name="l09873"></a><span class="lineno"> 9873</span>  <span class="keyword">virtual</span> <span class="keywordtype">bool</span> Passed(<span class="keywordtype">bool</span> exit_status_ok) = 0;</div><div class="line"><a name="l09874"></a><span class="lineno"> 9874</span> </div><div class="line"><a name="l09875"></a><span class="lineno"> 9875</span>  <span class="comment">// Signals that the death test did not die as expected.</span></div><div class="line"><a name="l09876"></a><span class="lineno"> 9876</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="namespacetesting_1_1internal_1_1posix.html#a69b8278c59359dd6a6f941b4643db9fb">Abort</a>(AbortReason reason) = 0;</div><div class="line"><a name="l09877"></a><span class="lineno"> 9877</span> </div><div class="line"><a name="l09878"></a><span class="lineno"> 9878</span>  <span class="comment">// Returns a human-readable outcome message regarding the outcome of</span></div><div class="line"><a name="l09879"></a><span class="lineno"> 9879</span>  <span class="comment">// the last death test.</span></div><div class="line"><a name="l09880"></a><span class="lineno"> 9880</span>  <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* LastMessage();</div><div class="line"><a name="l09881"></a><span class="lineno"> 9881</span> </div><div class="line"><a name="l09882"></a><span class="lineno"> 9882</span>  <span class="keyword">static</span> <span class="keywordtype">void</span> set_last_death_test_message(<span class="keyword">const</span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a>& message);</div><div class="line"><a name="l09883"></a><span class="lineno"> 9883</span> </div><div class="line"><a name="l09884"></a><span class="lineno"> 9884</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l09885"></a><span class="lineno"> 9885</span>  <span class="comment">// A string containing a description of the outcome of the last death test.</span></div><div class="line"><a name="l09886"></a><span class="lineno"> 9886</span>  <span class="keyword">static</span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a> last_death_test_message_;</div><div class="line"><a name="l09887"></a><span class="lineno"> 9887</span> </div><div class="line"><a name="l09888"></a><span class="lineno"> 9888</span>  <a class="code" href="gtest_8h.html#aed8c1888c32b588b0681e88b95031e29">GTEST_DISALLOW_COPY_AND_ASSIGN_</a>(DeathTest);</div><div class="line"><a name="l09889"></a><span class="lineno"> 9889</span> };</div><div class="line"><a name="l09890"></a><span class="lineno"> 9890</span> </div><div class="line"><a name="l09891"></a><span class="lineno"> 9891</span> <a class="code" href="gtest_8h.html#aebf8277c9069c1e124f9a5bbe2948061">GTEST_DISABLE_MSC_WARNINGS_POP_</a>() <span class="comment">// 4251</span></div><div class="line"><a name="l09892"></a><span class="lineno"> 9892</span> </div><div class="line"><a name="l09893"></a><span class="lineno"> 9893</span> <span class="comment">// Factory interface for death tests. May be mocked out for testing.</span></div><div class="line"><a name="l09894"></a><span class="lineno"> 9894</span> class DeathTestFactory {</div><div class="line"><a name="l09895"></a><span class="lineno"> 9895</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l09896"></a><span class="lineno"> 9896</span>  <span class="keyword">virtual</span> ~DeathTestFactory() { }</div><div class="line"><a name="l09897"></a><span class="lineno"> 9897</span>  <span class="keyword">virtual</span> <span class="keywordtype">bool</span> Create(<span class="keyword">const</span> <span class="keywordtype">char</span>* statement,</div><div class="line"><a name="l09898"></a><span class="lineno"> 9898</span>  Matcher<const std::string&> matcher, <span class="keyword">const</span> <span class="keywordtype">char</span>* file,</div><div class="line"><a name="l09899"></a><span class="lineno"> 9899</span>  <span class="keywordtype">int</span> line, DeathTest** test) = 0;</div><div class="line"><a name="l09900"></a><span class="lineno"> 9900</span> };</div><div class="line"><a name="l09901"></a><span class="lineno"> 9901</span> </div><div class="line"><a name="l09902"></a><span class="lineno"> 9902</span> <span class="comment">// A concrete DeathTestFactory implementation for normal use.</span></div><div class="line"><a name="l09903"></a><span class="lineno"> 9903</span> <span class="keyword">class </span>DefaultDeathTestFactory : <span class="keyword">public</span> DeathTestFactory {</div><div class="line"><a name="l09904"></a><span class="lineno"> 9904</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l09905"></a><span class="lineno"> 9905</span>  <span class="keywordtype">bool</span> Create(<span class="keyword">const</span> <span class="keywordtype">char</span>* statement, Matcher<const std::string&> matcher,</div><div class="line"><a name="l09906"></a><span class="lineno"> 9906</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* file, <span class="keywordtype">int</span> line, DeathTest** test) <span class="keyword">override</span>;</div><div class="line"><a name="l09907"></a><span class="lineno"> 9907</span> };</div><div class="line"><a name="l09908"></a><span class="lineno"> 9908</span> </div><div class="line"><a name="l09909"></a><span class="lineno"> 9909</span> <span class="comment">// Returns true if exit_status describes a process that was terminated</span></div><div class="line"><a name="l09910"></a><span class="lineno"> 9910</span> <span class="comment">// by a signal, or exited normally with a nonzero exit code.</span></div><div class="line"><a name="l09911"></a><span class="lineno"> 9911</span> <a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> <span class="keywordtype">bool</span> ExitedUnsuccessfully(<span class="keywordtype">int</span> exit_status);</div><div class="line"><a name="l09912"></a><span class="lineno"> 9912</span> </div><div class="line"><a name="l09913"></a><span class="lineno"> 9913</span> <span class="comment">// A string passed to EXPECT_DEATH (etc.) is caught by one of these overloads</span></div><div class="line"><a name="l09914"></a><span class="lineno"> 9914</span> <span class="comment">// and interpreted as a regex (rather than an Eq matcher) for legacy</span></div><div class="line"><a name="l09915"></a><span class="lineno"> 9915</span> <span class="comment">// compatibility.</span></div><div class="line"><a name="l09916"></a><span class="lineno"> 9916</span> <span class="keyword">inline</span> Matcher<const ::std::string&> MakeDeathTestMatcher(</div><div class="line"><a name="l09917"></a><span class="lineno"> 9917</span>  ::<a class="code" href="classtesting_1_1internal_1_1_r_e.html">testing::internal::RE</a> regex) {</div><div class="line"><a name="l09918"></a><span class="lineno"> 9918</span>  <span class="keywordflow">return</span> ContainsRegex(regex.<a class="code" href="classtesting_1_1internal_1_1_r_e.html#a24236aab3a6b0183a145a6f4c0bb9848">pattern</a>());</div><div class="line"><a name="l09919"></a><span class="lineno"> 9919</span> }</div><div class="line"><a name="l09920"></a><span class="lineno"> 9920</span> <span class="keyword">inline</span> Matcher<const ::std::string&> MakeDeathTestMatcher(<span class="keyword">const</span> <span class="keywordtype">char</span>* regex) {</div><div class="line"><a name="l09921"></a><span class="lineno"> 9921</span>  <span class="keywordflow">return</span> ContainsRegex(regex);</div><div class="line"><a name="l09922"></a><span class="lineno"> 9922</span> }</div><div class="line"><a name="l09923"></a><span class="lineno"> 9923</span> <span class="keyword">inline</span> Matcher<const ::std::string&> MakeDeathTestMatcher(</div><div class="line"><a name="l09924"></a><span class="lineno"> 9924</span>  <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">const ::std::string</a>& regex) {</div><div class="line"><a name="l09925"></a><span class="lineno"> 9925</span>  <span class="keywordflow">return</span> ContainsRegex(regex);</div><div class="line"><a name="l09926"></a><span class="lineno"> 9926</span> }</div><div class="line"><a name="l09927"></a><span class="lineno"> 9927</span> <span class="preprocessor">#if GTEST_HAS_GLOBAL_STRING</span></div><div class="line"><a name="l09928"></a><span class="lineno"> 9928</span> <span class="keyword">inline</span> Matcher<const ::std::string&> MakeDeathTestMatcher(</div><div class="line"><a name="l09929"></a><span class="lineno"> 9929</span>  <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">const ::string</a>& regex) {</div><div class="line"><a name="l09930"></a><span class="lineno"> 9930</span>  <span class="keywordflow">return</span> ContainsRegex(regex);</div><div class="line"><a name="l09931"></a><span class="lineno"> 9931</span> }</div><div class="line"><a name="l09932"></a><span class="lineno"> 9932</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l09933"></a><span class="lineno"> 9933</span> </div><div class="line"><a name="l09934"></a><span class="lineno"> 9934</span> <span class="comment">// If a Matcher<const ::std::string&> is passed to EXPECT_DEATH (etc.), it's</span></div><div class="line"><a name="l09935"></a><span class="lineno"> 9935</span> <span class="comment">// used directly.</span></div><div class="line"><a name="l09936"></a><span class="lineno"> 9936</span> <span class="keyword">inline</span> Matcher<const ::std::string&> MakeDeathTestMatcher(</div><div class="line"><a name="l09937"></a><span class="lineno"> 9937</span>  Matcher<const ::std::string&> matcher) {</div><div class="line"><a name="l09938"></a><span class="lineno"> 9938</span>  <span class="keywordflow">return</span> matcher;</div><div class="line"><a name="l09939"></a><span class="lineno"> 9939</span> }</div><div class="line"><a name="l09940"></a><span class="lineno"> 9940</span> </div><div class="line"><a name="l09941"></a><span class="lineno"> 9941</span> <span class="comment">// Traps C++ exceptions escaping statement and reports them as test</span></div><div class="line"><a name="l09942"></a><span class="lineno"> 9942</span> <span class="comment">// failures. Note that trapping SEH exceptions is not implemented here.</span></div><div class="line"><a name="l09943"></a><span class="lineno"> 9943</span> <span class="preprocessor"># if GTEST_HAS_EXCEPTIONS</span></div><div class="line"><a name="l09944"></a><span class="lineno"> 9944</span> <span class="preprocessor"># define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \</span></div><div class="line"><a name="l09945"></a><span class="lineno"> 9945</span> <span class="preprocessor"> try { \</span></div><div class="line"><a name="l09946"></a><span class="lineno"> 9946</span> <span class="preprocessor"> GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \</span></div><div class="line"><a name="l09947"></a><span class="lineno"> 9947</span> <span class="preprocessor"> } catch (const ::std::exception& gtest_exception) { \</span></div><div class="line"><a name="l09948"></a><span class="lineno"> 9948</span> <span class="preprocessor"> fprintf(\</span></div><div class="line"><a name="l09949"></a><span class="lineno"> 9949</span> <span class="preprocessor"> stderr, \</span></div><div class="line"><a name="l09950"></a><span class="lineno"> 9950</span> <span class="preprocessor"> "\n%s: Caught std::exception-derived exception escaping the " \</span></div><div class="line"><a name="l09951"></a><span class="lineno"> 9951</span> <span class="preprocessor"> "death test statement. Exception message: %s\n", \</span></div><div class="line"><a name="l09952"></a><span class="lineno"> 9952</span> <span class="preprocessor"> ::testing::internal::FormatFileLocation(__FILE__, __LINE__).c_str(), \</span></div><div class="line"><a name="l09953"></a><span class="lineno"> 9953</span> <span class="preprocessor"> gtest_exception.what()); \</span></div><div class="line"><a name="l09954"></a><span class="lineno"> 9954</span> <span class="preprocessor"> fflush(stderr); \</span></div><div class="line"><a name="l09955"></a><span class="lineno"> 9955</span> <span class="preprocessor"> death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \</span></div><div class="line"><a name="l09956"></a><span class="lineno"> 9956</span> <span class="preprocessor"> } catch (...) { \</span></div><div class="line"><a name="l09957"></a><span class="lineno"> 9957</span> <span class="preprocessor"> death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \</span></div><div class="line"><a name="l09958"></a><span class="lineno"> 9958</span> <span class="preprocessor"> }</span></div><div class="line"><a name="l09959"></a><span class="lineno"> 9959</span> </div><div class="line"><a name="l09960"></a><span class="lineno"> 9960</span> <span class="preprocessor"># else</span></div><div class="line"><a name="l09961"></a><span class="lineno"> 9961</span> <span class="preprocessor"># define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \</span></div><div class="line"><a name="l09962"></a><span class="lineno"> 9962</span> <span class="preprocessor"> GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement)</span></div><div class="line"><a name="l09963"></a><span class="lineno"> 9963</span> </div><div class="line"><a name="l09964"></a><span class="lineno"> 9964</span> <span class="preprocessor"># endif</span></div><div class="line"><a name="l09965"></a><span class="lineno"> 9965</span> </div><div class="line"><a name="l09966"></a><span class="lineno"> 9966</span> <span class="comment">// This macro is for implementing ASSERT_DEATH*, EXPECT_DEATH*,</span></div><div class="line"><a name="l09967"></a><span class="lineno"> 9967</span> <span class="comment">// ASSERT_EXIT*, and EXPECT_EXIT*.</span></div><div class="line"><a name="l09968"></a><span class="lineno"> 9968</span> <span class="preprocessor">#define GTEST_DEATH_TEST_(statement, predicate, regex_or_matcher, fail) \</span></div><div class="line"><a name="l09969"></a><span class="lineno"> 9969</span> <span class="preprocessor"> GTEST_AMBIGUOUS_ELSE_BLOCKER_ \</span></div><div class="line"><a name="l09970"></a><span class="lineno"> 9970</span> <span class="preprocessor"> if (::testing::internal::AlwaysTrue()) { \</span></div><div class="line"><a name="l09971"></a><span class="lineno"> 9971</span> <span class="preprocessor"> ::testing::internal::DeathTest* gtest_dt; \</span></div><div class="line"><a name="l09972"></a><span class="lineno"> 9972</span> <span class="preprocessor"> if (!::testing::internal::DeathTest::Create( \</span></div><div class="line"><a name="l09973"></a><span class="lineno"> 9973</span> <span class="preprocessor"> #statement, \</span></div><div class="line"><a name="l09974"></a><span class="lineno"> 9974</span> <span class="preprocessor"> ::testing::internal::MakeDeathTestMatcher(regex_or_matcher), \</span></div><div class="line"><a name="l09975"></a><span class="lineno"> 9975</span> <span class="preprocessor"> __FILE__, __LINE__, &gtest_dt)) { \</span></div><div class="line"><a name="l09976"></a><span class="lineno"> 9976</span> <span class="preprocessor"> goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \</span></div><div class="line"><a name="l09977"></a><span class="lineno"> 9977</span> <span class="preprocessor"> } \</span></div><div class="line"><a name="l09978"></a><span class="lineno"> 9978</span> <span class="preprocessor"> if (gtest_dt != nullptr) { \</span></div><div class="line"><a name="l09979"></a><span class="lineno"> 9979</span> <span class="preprocessor"> std::unique_ptr< ::testing::internal::DeathTest> gtest_dt_ptr(gtest_dt); \</span></div><div class="line"><a name="l09980"></a><span class="lineno"> 9980</span> <span class="preprocessor"> switch (gtest_dt->AssumeRole()) { \</span></div><div class="line"><a name="l09981"></a><span class="lineno"> 9981</span> <span class="preprocessor"> case ::testing::internal::DeathTest::OVERSEE_TEST: \</span></div><div class="line"><a name="l09982"></a><span class="lineno"> 9982</span> <span class="preprocessor"> if (!gtest_dt->Passed(predicate(gtest_dt->Wait()))) { \</span></div><div class="line"><a name="l09983"></a><span class="lineno"> 9983</span> <span class="preprocessor"> goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \</span></div><div class="line"><a name="l09984"></a><span class="lineno"> 9984</span> <span class="preprocessor"> } \</span></div><div class="line"><a name="l09985"></a><span class="lineno"> 9985</span> <span class="preprocessor"> break; \</span></div><div class="line"><a name="l09986"></a><span class="lineno"> 9986</span> <span class="preprocessor"> case ::testing::internal::DeathTest::EXECUTE_TEST: { \</span></div><div class="line"><a name="l09987"></a><span class="lineno"> 9987</span> <span class="preprocessor"> ::testing::internal::DeathTest::ReturnSentinel gtest_sentinel( \</span></div><div class="line"><a name="l09988"></a><span class="lineno"> 9988</span> <span class="preprocessor"> gtest_dt); \</span></div><div class="line"><a name="l09989"></a><span class="lineno"> 9989</span> <span class="preprocessor"> GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, gtest_dt); \</span></div><div class="line"><a name="l09990"></a><span class="lineno"> 9990</span> <span class="preprocessor"> gtest_dt->Abort(::testing::internal::DeathTest::TEST_DID_NOT_DIE); \</span></div><div class="line"><a name="l09991"></a><span class="lineno"> 9991</span> <span class="preprocessor"> break; \</span></div><div class="line"><a name="l09992"></a><span class="lineno"> 9992</span> <span class="preprocessor"> } \</span></div><div class="line"><a name="l09993"></a><span class="lineno"> 9993</span> <span class="preprocessor"> default: \</span></div><div class="line"><a name="l09994"></a><span class="lineno"> 9994</span> <span class="preprocessor"> break; \</span></div><div class="line"><a name="l09995"></a><span class="lineno"> 9995</span> <span class="preprocessor"> } \</span></div><div class="line"><a name="l09996"></a><span class="lineno"> 9996</span> <span class="preprocessor"> } \</span></div><div class="line"><a name="l09997"></a><span class="lineno"> 9997</span> <span class="preprocessor"> } else \</span></div><div class="line"><a name="l09998"></a><span class="lineno"> 9998</span> <span class="preprocessor"> GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__) \</span></div><div class="line"><a name="l09999"></a><span class="lineno"> 9999</span> <span class="preprocessor"> : fail(::testing::internal::DeathTest::LastMessage())</span></div><div class="line"><a name="l10000"></a><span class="lineno">10000</span> <span class="comment">// The symbol "fail" here expands to something into which a message</span></div><div class="line"><a name="l10001"></a><span class="lineno">10001</span> <span class="comment">// can be streamed.</span></div><div class="line"><a name="l10002"></a><span class="lineno">10002</span> </div><div class="line"><a name="l10003"></a><span class="lineno">10003</span> <span class="comment">// This macro is for implementing ASSERT/EXPECT_DEBUG_DEATH when compiled in</span></div><div class="line"><a name="l10004"></a><span class="lineno">10004</span> <span class="comment">// NDEBUG mode. In this case we need the statements to be executed and the macro</span></div><div class="line"><a name="l10005"></a><span class="lineno">10005</span> <span class="comment">// must accept a streamed message even though the message is never printed.</span></div><div class="line"><a name="l10006"></a><span class="lineno">10006</span> <span class="comment">// The regex object is not evaluated, but it is used to prevent "unused"</span></div><div class="line"><a name="l10007"></a><span class="lineno">10007</span> <span class="comment">// warnings and to avoid an expression that doesn't compile in debug mode.</span></div><div class="line"><a name="l10008"></a><span class="lineno">10008</span> <span class="preprocessor">#define GTEST_EXECUTE_STATEMENT_(statement, regex_or_matcher) \</span></div><div class="line"><a name="l10009"></a><span class="lineno">10009</span> <span class="preprocessor"> GTEST_AMBIGUOUS_ELSE_BLOCKER_ \</span></div><div class="line"><a name="l10010"></a><span class="lineno">10010</span> <span class="preprocessor"> if (::testing::internal::AlwaysTrue()) { \</span></div><div class="line"><a name="l10011"></a><span class="lineno">10011</span> <span class="preprocessor"> GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \</span></div><div class="line"><a name="l10012"></a><span class="lineno">10012</span> <span class="preprocessor"> } else if (!::testing::internal::AlwaysTrue()) { \</span></div><div class="line"><a name="l10013"></a><span class="lineno">10013</span> <span class="preprocessor"> ::testing::internal::MakeDeathTestMatcher(regex_or_matcher); \</span></div><div class="line"><a name="l10014"></a><span class="lineno">10014</span> <span class="preprocessor"> } else \</span></div><div class="line"><a name="l10015"></a><span class="lineno">10015</span> <span class="preprocessor"> ::testing::Message()</span></div><div class="line"><a name="l10016"></a><span class="lineno">10016</span> </div><div class="line"><a name="l10017"></a><span class="lineno">10017</span> <span class="comment">// A class representing the parsed contents of the</span></div><div class="line"><a name="l10018"></a><span class="lineno">10018</span> <span class="comment">// --gtest_internal_run_death_test flag, as it existed when</span></div><div class="line"><a name="l10019"></a><span class="lineno">10019</span> <span class="comment">// RUN_ALL_TESTS was called.</span></div><div class="line"><a name="l10020"></a><span class="lineno">10020</span> <span class="keyword">class </span>InternalRunDeathTestFlag {</div><div class="line"><a name="l10021"></a><span class="lineno">10021</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l10022"></a><span class="lineno">10022</span>  InternalRunDeathTestFlag(<span class="keyword">const</span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a>& a_file,</div><div class="line"><a name="l10023"></a><span class="lineno">10023</span>  <span class="keywordtype">int</span> a_line,</div><div class="line"><a name="l10024"></a><span class="lineno">10024</span>  <span class="keywordtype">int</span> an_index,</div><div class="line"><a name="l10025"></a><span class="lineno">10025</span>  <span class="keywordtype">int</span> a_write_fd)</div><div class="line"><a name="l10026"></a><span class="lineno">10026</span>  : file_(a_file), line_(a_line), <a class="code" href="namespaceutl_1_1meta.html#a5b7d36b9e568b81f2df897d56dc23b64">index_</a>(an_index),</div><div class="line"><a name="l10027"></a><span class="lineno">10027</span>  write_fd_(a_write_fd) {}</div><div class="line"><a name="l10028"></a><span class="lineno">10028</span> </div><div class="line"><a name="l10029"></a><span class="lineno">10029</span>  ~InternalRunDeathTestFlag() {</div><div class="line"><a name="l10030"></a><span class="lineno">10030</span>  <span class="keywordflow">if</span> (write_fd_ >= 0)</div><div class="line"><a name="l10031"></a><span class="lineno">10031</span>  <a class="code" href="namespacetesting_1_1internal_1_1posix.html#a15e5b8f2a535ef1b2529b85b861e4846">posix::Close</a>(write_fd_);</div><div class="line"><a name="l10032"></a><span class="lineno">10032</span>  }</div><div class="line"><a name="l10033"></a><span class="lineno">10033</span> </div><div class="line"><a name="l10034"></a><span class="lineno">10034</span>  <span class="keyword">const</span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a>& file()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> file_; }</div><div class="line"><a name="l10035"></a><span class="lineno">10035</span>  <span class="keywordtype">int</span> line()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> line_; }</div><div class="line"><a name="l10036"></a><span class="lineno">10036</span>  <span class="keywordtype">int</span> index()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="namespaceutl_1_1meta.html#a5b7d36b9e568b81f2df897d56dc23b64">index_</a>; }</div><div class="line"><a name="l10037"></a><span class="lineno">10037</span>  <span class="keywordtype">int</span> write_fd()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> write_fd_; }</div><div class="line"><a name="l10038"></a><span class="lineno">10038</span> </div><div class="line"><a name="l10039"></a><span class="lineno">10039</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l10040"></a><span class="lineno">10040</span>  <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a> file_;</div><div class="line"><a name="l10041"></a><span class="lineno">10041</span>  <span class="keywordtype">int</span> line_;</div><div class="line"><a name="l10042"></a><span class="lineno">10042</span>  <span class="keywordtype">int</span> <a class="code" href="namespaceutl_1_1meta.html#a5b7d36b9e568b81f2df897d56dc23b64">index_</a>;</div><div class="line"><a name="l10043"></a><span class="lineno">10043</span>  <span class="keywordtype">int</span> write_fd_;</div><div class="line"><a name="l10044"></a><span class="lineno">10044</span> </div><div class="line"><a name="l10045"></a><span class="lineno">10045</span>  <a class="code" href="gtest_8h.html#aed8c1888c32b588b0681e88b95031e29">GTEST_DISALLOW_COPY_AND_ASSIGN_</a>(InternalRunDeathTestFlag);</div><div class="line"><a name="l10046"></a><span class="lineno">10046</span> };</div><div class="line"><a name="l10047"></a><span class="lineno">10047</span> </div><div class="line"><a name="l10048"></a><span class="lineno">10048</span> <span class="comment">// Returns a newly created InternalRunDeathTestFlag object with fields</span></div><div class="line"><a name="l10049"></a><span class="lineno">10049</span> <span class="comment">// initialized from the GTEST_FLAG(internal_run_death_test) flag if</span></div><div class="line"><a name="l10050"></a><span class="lineno">10050</span> <span class="comment">// the flag is specified; otherwise returns NULL.</span></div><div class="line"><a name="l10051"></a><span class="lineno">10051</span> InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag();</div><div class="line"><a name="l10052"></a><span class="lineno">10052</span> </div><div class="line"><a name="l10053"></a><span class="lineno">10053</span> <span class="preprocessor">#endif // GTEST_HAS_DEATH_TEST</span></div><div class="line"><a name="l10054"></a><span class="lineno">10054</span> </div><div class="line"><a name="l10055"></a><span class="lineno">10055</span> } <span class="comment">// namespace internal</span></div><div class="line"><a name="l10056"></a><span class="lineno">10056</span> } <span class="comment">// namespace testing</span></div><div class="line"><a name="l10057"></a><span class="lineno">10057</span> </div><div class="line"><a name="l10058"></a><span class="lineno">10058</span> <span class="preprocessor">#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_</span></div><div class="line"><a name="l10059"></a><span class="lineno">10059</span> </div><div class="line"><a name="l10060"></a><span class="lineno">10060</span> <span class="keyword">namespace </span><a class="code" href="namespacetesting.html">testing</a> {</div><div class="line"><a name="l10061"></a><span class="lineno">10061</span> </div><div class="line"><a name="l10062"></a><span class="lineno">10062</span> <span class="comment">// This flag controls the style of death tests. Valid values are "threadsafe",</span></div><div class="line"><a name="l10063"></a><span class="lineno">10063</span> <span class="comment">// meaning that the death test child process will re-execute the test binary</span></div><div class="line"><a name="l10064"></a><span class="lineno">10064</span> <span class="comment">// from the start, running only a single death test, or "fast",</span></div><div class="line"><a name="l10065"></a><span class="lineno">10065</span> <span class="comment">// meaning that the child process will execute the test logic immediately</span></div><div class="line"><a name="l10066"></a><span class="lineno">10066</span> <span class="comment">// after forking.</span></div><div class="line"><a name="l10067"></a><span class="lineno">10067</span> <a class="code" href="namespacetesting.html#a37b7e87f0a5f502c6918f37d1768c1f3">GTEST_DECLARE_string_</a>(death_test_style);</div><div class="line"><a name="l10068"></a><span class="lineno">10068</span> </div><div class="line"><a name="l10069"></a><span class="lineno">10069</span> <span class="preprocessor">#if GTEST_HAS_DEATH_TEST</span></div><div class="line"><a name="l10070"></a><span class="lineno">10070</span> </div><div class="line"><a name="l10071"></a><span class="lineno">10071</span> <span class="keyword">namespace </span>internal {</div><div class="line"><a name="l10072"></a><span class="lineno">10072</span> </div><div class="line"><a name="l10073"></a><span class="lineno">10073</span> <span class="comment">// Returns a Boolean value indicating whether the caller is currently</span></div><div class="line"><a name="l10074"></a><span class="lineno">10074</span> <span class="comment">// executing in the context of the death test child process. Tools such as</span></div><div class="line"><a name="l10075"></a><span class="lineno">10075</span> <span class="comment">// Valgrind heap checkers may need this to modify their behavior in death</span></div><div class="line"><a name="l10076"></a><span class="lineno">10076</span> <span class="comment">// tests. IMPORTANT: This is an internal utility. Using it may break the</span></div><div class="line"><a name="l10077"></a><span class="lineno">10077</span> <span class="comment">// implementation of death tests. User code MUST NOT use it.</span></div><div class="line"><a name="l10078"></a><span class="lineno">10078</span> <a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> <span class="keywordtype">bool</span> InDeathTestChild();</div><div class="line"><a name="l10079"></a><span class="lineno">10079</span> </div><div class="line"><a name="l10080"></a><span class="lineno">10080</span> } <span class="comment">// namespace internal</span></div><div class="line"><a name="l10081"></a><span class="lineno">10081</span> </div><div class="line"><a name="l10082"></a><span class="lineno">10082</span> <span class="comment">// The following macros are useful for writing death tests.</span></div><div class="line"><a name="l10083"></a><span class="lineno">10083</span> </div><div class="line"><a name="l10084"></a><span class="lineno">10084</span> <span class="comment">// Here's what happens when an ASSERT_DEATH* or EXPECT_DEATH* is</span></div><div class="line"><a name="l10085"></a><span class="lineno">10085</span> <span class="comment">// executed:</span></div><div class="line"><a name="l10086"></a><span class="lineno">10086</span> <span class="comment">//</span></div><div class="line"><a name="l10087"></a><span class="lineno">10087</span> <span class="comment">// 1. It generates a warning if there is more than one active</span></div><div class="line"><a name="l10088"></a><span class="lineno">10088</span> <span class="comment">// thread. This is because it's safe to fork() or clone() only</span></div><div class="line"><a name="l10089"></a><span class="lineno">10089</span> <span class="comment">// when there is a single thread.</span></div><div class="line"><a name="l10090"></a><span class="lineno">10090</span> <span class="comment">//</span></div><div class="line"><a name="l10091"></a><span class="lineno">10091</span> <span class="comment">// 2. The parent process clone()s a sub-process and runs the death</span></div><div class="line"><a name="l10092"></a><span class="lineno">10092</span> <span class="comment">// test in it; the sub-process exits with code 0 at the end of the</span></div><div class="line"><a name="l10093"></a><span class="lineno">10093</span> <span class="comment">// death test, if it hasn't exited already.</span></div><div class="line"><a name="l10094"></a><span class="lineno">10094</span> <span class="comment">//</span></div><div class="line"><a name="l10095"></a><span class="lineno">10095</span> <span class="comment">// 3. The parent process waits for the sub-process to terminate.</span></div><div class="line"><a name="l10096"></a><span class="lineno">10096</span> <span class="comment">//</span></div><div class="line"><a name="l10097"></a><span class="lineno">10097</span> <span class="comment">// 4. The parent process checks the exit code and error message of</span></div><div class="line"><a name="l10098"></a><span class="lineno">10098</span> <span class="comment">// the sub-process.</span></div><div class="line"><a name="l10099"></a><span class="lineno">10099</span> <span class="comment">//</span></div><div class="line"><a name="l10100"></a><span class="lineno">10100</span> <span class="comment">// Examples:</span></div><div class="line"><a name="l10101"></a><span class="lineno">10101</span> <span class="comment">//</span></div><div class="line"><a name="l10102"></a><span class="lineno">10102</span> <span class="comment">// ASSERT_DEATH(server.SendMessage(56, "Hello"), "Invalid port number");</span></div><div class="line"><a name="l10103"></a><span class="lineno">10103</span> <span class="comment">// for (int i = 0; i < 5; i++) {</span></div><div class="line"><a name="l10104"></a><span class="lineno">10104</span> <span class="comment">// EXPECT_DEATH(server.ProcessRequest(i),</span></div><div class="line"><a name="l10105"></a><span class="lineno">10105</span> <span class="comment">// "Invalid request .* in ProcessRequest()")</span></div><div class="line"><a name="l10106"></a><span class="lineno">10106</span> <span class="comment">// << "Failed to die on request " << i;</span></div><div class="line"><a name="l10107"></a><span class="lineno">10107</span> <span class="comment">// }</span></div><div class="line"><a name="l10108"></a><span class="lineno">10108</span> <span class="comment">//</span></div><div class="line"><a name="l10109"></a><span class="lineno">10109</span> <span class="comment">// ASSERT_EXIT(server.ExitNow(), ::testing::ExitedWithCode(0), "Exiting");</span></div><div class="line"><a name="l10110"></a><span class="lineno">10110</span> <span class="comment">//</span></div><div class="line"><a name="l10111"></a><span class="lineno">10111</span> <span class="comment">// bool KilledBySIGHUP(int exit_code) {</span></div><div class="line"><a name="l10112"></a><span class="lineno">10112</span> <span class="comment">// return WIFSIGNALED(exit_code) && WTERMSIG(exit_code) == SIGHUP;</span></div><div class="line"><a name="l10113"></a><span class="lineno">10113</span> <span class="comment">// }</span></div><div class="line"><a name="l10114"></a><span class="lineno">10114</span> <span class="comment">//</span></div><div class="line"><a name="l10115"></a><span class="lineno">10115</span> <span class="comment">// ASSERT_EXIT(client.HangUpServer(), KilledBySIGHUP, "Hanging up!");</span></div><div class="line"><a name="l10116"></a><span class="lineno">10116</span> <span class="comment">//</span></div><div class="line"><a name="l10117"></a><span class="lineno">10117</span> <span class="comment">// On the regular expressions used in death tests:</span></div><div class="line"><a name="l10118"></a><span class="lineno">10118</span> <span class="comment">//</span></div><div class="line"><a name="l10119"></a><span class="lineno">10119</span> <span class="comment">// GOOGLETEST_CM0005 DO NOT DELETE</span></div><div class="line"><a name="l10120"></a><span class="lineno">10120</span> <span class="comment">// On POSIX-compliant systems (*nix), we use the <regex.h> library,</span></div><div class="line"><a name="l10121"></a><span class="lineno">10121</span> <span class="comment">// which uses the POSIX extended regex syntax.</span></div><div class="line"><a name="l10122"></a><span class="lineno">10122</span> <span class="comment">//</span></div><div class="line"><a name="l10123"></a><span class="lineno">10123</span> <span class="comment">// On other platforms (e.g. Windows or Mac), we only support a simple regex</span></div><div class="line"><a name="l10124"></a><span class="lineno">10124</span> <span class="comment">// syntax implemented as part of Google Test. This limited</span></div><div class="line"><a name="l10125"></a><span class="lineno">10125</span> <span class="comment">// implementation should be enough most of the time when writing</span></div><div class="line"><a name="l10126"></a><span class="lineno">10126</span> <span class="comment">// death tests; though it lacks many features you can find in PCRE</span></div><div class="line"><a name="l10127"></a><span class="lineno">10127</span> <span class="comment">// or POSIX extended regex syntax. For example, we don't support</span></div><div class="line"><a name="l10128"></a><span class="lineno">10128</span> <span class="comment">// union ("x|y"), grouping ("(xy)"), brackets ("[xy]"), and</span></div><div class="line"><a name="l10129"></a><span class="lineno">10129</span> <span class="comment">// repetition count ("x{5,7}"), among others.</span></div><div class="line"><a name="l10130"></a><span class="lineno">10130</span> <span class="comment">//</span></div><div class="line"><a name="l10131"></a><span class="lineno">10131</span> <span class="comment">// Below is the syntax that we do support. We chose it to be a</span></div><div class="line"><a name="l10132"></a><span class="lineno">10132</span> <span class="comment">// subset of both PCRE and POSIX extended regex, so it's easy to</span></div><div class="line"><a name="l10133"></a><span class="lineno">10133</span> <span class="comment">// learn wherever you come from. In the following: 'A' denotes a</span></div><div class="line"><a name="l10134"></a><span class="lineno">10134</span> <span class="comment">// literal character, period (.), or a single \\ escape sequence;</span></div><div class="line"><a name="l10135"></a><span class="lineno">10135</span> <span class="comment">// 'x' and 'y' denote regular expressions; 'm' and 'n' are for</span></div><div class="line"><a name="l10136"></a><span class="lineno">10136</span> <span class="comment">// natural numbers.</span></div><div class="line"><a name="l10137"></a><span class="lineno">10137</span> <span class="comment">//</span></div><div class="line"><a name="l10138"></a><span class="lineno">10138</span> <span class="comment">// c matches any literal character c</span></div><div class="line"><a name="l10139"></a><span class="lineno">10139</span> <span class="comment">// \\d matches any decimal digit</span></div><div class="line"><a name="l10140"></a><span class="lineno">10140</span> <span class="comment">// \\D matches any character that's not a decimal digit</span></div><div class="line"><a name="l10141"></a><span class="lineno">10141</span> <span class="comment">// \\f matches \f</span></div><div class="line"><a name="l10142"></a><span class="lineno">10142</span> <span class="comment">// \\n matches \n</span></div><div class="line"><a name="l10143"></a><span class="lineno">10143</span> <span class="comment">// \\r matches \r</span></div><div class="line"><a name="l10144"></a><span class="lineno">10144</span> <span class="comment">// \\s matches any ASCII whitespace, including \n</span></div><div class="line"><a name="l10145"></a><span class="lineno">10145</span> <span class="comment">// \\S matches any character that's not a whitespace</span></div><div class="line"><a name="l10146"></a><span class="lineno">10146</span> <span class="comment">// \\t matches \t</span></div><div class="line"><a name="l10147"></a><span class="lineno">10147</span> <span class="comment">// \\v matches \v</span></div><div class="line"><a name="l10148"></a><span class="lineno">10148</span> <span class="comment">// \\w matches any letter, _, or decimal digit</span></div><div class="line"><a name="l10149"></a><span class="lineno">10149</span> <span class="comment">// \\W matches any character that \\w doesn't match</span></div><div class="line"><a name="l10150"></a><span class="lineno">10150</span> <span class="comment">// \\c matches any literal character c, which must be a punctuation</span></div><div class="line"><a name="l10151"></a><span class="lineno">10151</span> <span class="comment">// . matches any single character except \n</span></div><div class="line"><a name="l10152"></a><span class="lineno">10152</span> <span class="comment">// A? matches 0 or 1 occurrences of A</span></div><div class="line"><a name="l10153"></a><span class="lineno">10153</span> <span class="comment">// A* matches 0 or many occurrences of A</span></div><div class="line"><a name="l10154"></a><span class="lineno">10154</span> <span class="comment">// A+ matches 1 or many occurrences of A</span></div><div class="line"><a name="l10155"></a><span class="lineno">10155</span> <span class="comment">// ^ matches the beginning of a string (not that of each line)</span></div><div class="line"><a name="l10156"></a><span class="lineno">10156</span> <span class="comment">// $ matches the end of a string (not that of each line)</span></div><div class="line"><a name="l10157"></a><span class="lineno">10157</span> <span class="comment">// xy matches x followed by y</span></div><div class="line"><a name="l10158"></a><span class="lineno">10158</span> <span class="comment">//</span></div><div class="line"><a name="l10159"></a><span class="lineno">10159</span> <span class="comment">// If you accidentally use PCRE or POSIX extended regex features</span></div><div class="line"><a name="l10160"></a><span class="lineno">10160</span> <span class="comment">// not implemented by us, you will get a run-time failure. In that</span></div><div class="line"><a name="l10161"></a><span class="lineno">10161</span> <span class="comment">// case, please try to rewrite your regular expression within the</span></div><div class="line"><a name="l10162"></a><span class="lineno">10162</span> <span class="comment">// above syntax.</span></div><div class="line"><a name="l10163"></a><span class="lineno">10163</span> <span class="comment">//</span></div><div class="line"><a name="l10164"></a><span class="lineno">10164</span> <span class="comment">// This implementation is *not* meant to be as highly tuned or robust</span></div><div class="line"><a name="l10165"></a><span class="lineno">10165</span> <span class="comment">// as a compiled regex library, but should perform well enough for a</span></div><div class="line"><a name="l10166"></a><span class="lineno">10166</span> <span class="comment">// death test, which already incurs significant overhead by launching</span></div><div class="line"><a name="l10167"></a><span class="lineno">10167</span> <span class="comment">// a child process.</span></div><div class="line"><a name="l10168"></a><span class="lineno">10168</span> <span class="comment">//</span></div><div class="line"><a name="l10169"></a><span class="lineno">10169</span> <span class="comment">// Known caveats:</span></div><div class="line"><a name="l10170"></a><span class="lineno">10170</span> <span class="comment">//</span></div><div class="line"><a name="l10171"></a><span class="lineno">10171</span> <span class="comment">// A "threadsafe" style death test obtains the path to the test</span></div><div class="line"><a name="l10172"></a><span class="lineno">10172</span> <span class="comment">// program from argv[0] and re-executes it in the sub-process. For</span></div><div class="line"><a name="l10173"></a><span class="lineno">10173</span> <span class="comment">// simplicity, the current implementation doesn't search the PATH</span></div><div class="line"><a name="l10174"></a><span class="lineno">10174</span> <span class="comment">// when launching the sub-process. This means that the user must</span></div><div class="line"><a name="l10175"></a><span class="lineno">10175</span> <span class="comment">// invoke the test program via a path that contains at least one</span></div><div class="line"><a name="l10176"></a><span class="lineno">10176</span> <span class="comment">// path separator (e.g. path/to/foo_test and</span></div><div class="line"><a name="l10177"></a><span class="lineno">10177</span> <span class="comment">// /absolute/path/to/bar_test are fine, but foo_test is not). This</span></div><div class="line"><a name="l10178"></a><span class="lineno">10178</span> <span class="comment">// is rarely a problem as people usually don't put the test binary</span></div><div class="line"><a name="l10179"></a><span class="lineno">10179</span> <span class="comment">// directory in PATH.</span></div><div class="line"><a name="l10180"></a><span class="lineno">10180</span> <span class="comment">//</span></div><div class="line"><a name="l10181"></a><span class="lineno">10181</span> </div><div class="line"><a name="l10182"></a><span class="lineno">10182</span> <span class="comment">// Asserts that a given statement causes the program to exit, with an</span></div><div class="line"><a name="l10183"></a><span class="lineno">10183</span> <span class="comment">// integer exit status that satisfies predicate, and emitting error output</span></div><div class="line"><a name="l10184"></a><span class="lineno">10184</span> <span class="comment">// that matches regex.</span></div><div class="line"><a name="l10185"></a><span class="lineno">10185</span> <span class="preprocessor"># define ASSERT_EXIT(statement, predicate, regex) \</span></div><div class="line"><a name="l10186"></a><span class="lineno">10186</span> <span class="preprocessor"> GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_FATAL_FAILURE_)</span></div><div class="line"><a name="l10187"></a><span class="lineno">10187</span> </div><div class="line"><a name="l10188"></a><span class="lineno">10188</span> <span class="comment">// Like ASSERT_EXIT, but continues on to successive tests in the</span></div><div class="line"><a name="l10189"></a><span class="lineno">10189</span> <span class="comment">// test suite, if any:</span></div><div class="line"><a name="l10190"></a><span class="lineno">10190</span> <span class="preprocessor"># define EXPECT_EXIT(statement, predicate, regex) \</span></div><div class="line"><a name="l10191"></a><span class="lineno">10191</span> <span class="preprocessor"> GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_NONFATAL_FAILURE_)</span></div><div class="line"><a name="l10192"></a><span class="lineno">10192</span> </div><div class="line"><a name="l10193"></a><span class="lineno">10193</span> <span class="comment">// Asserts that a given statement causes the program to exit, either by</span></div><div class="line"><a name="l10194"></a><span class="lineno">10194</span> <span class="comment">// explicitly exiting with a nonzero exit code or being killed by a</span></div><div class="line"><a name="l10195"></a><span class="lineno">10195</span> <span class="comment">// signal, and emitting error output that matches regex.</span></div><div class="line"><a name="l10196"></a><span class="lineno">10196</span> <span class="preprocessor"># define ASSERT_DEATH(statement, regex) \</span></div><div class="line"><a name="l10197"></a><span class="lineno">10197</span> <span class="preprocessor"> ASSERT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex)</span></div><div class="line"><a name="l10198"></a><span class="lineno">10198</span> </div><div class="line"><a name="l10199"></a><span class="lineno">10199</span> <span class="comment">// Like ASSERT_DEATH, but continues on to successive tests in the</span></div><div class="line"><a name="l10200"></a><span class="lineno">10200</span> <span class="comment">// test suite, if any:</span></div><div class="line"><a name="l10201"></a><span class="lineno">10201</span> <span class="preprocessor"># define EXPECT_DEATH(statement, regex) \</span></div><div class="line"><a name="l10202"></a><span class="lineno">10202</span> <span class="preprocessor"> EXPECT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex)</span></div><div class="line"><a name="l10203"></a><span class="lineno">10203</span> </div><div class="line"><a name="l10204"></a><span class="lineno">10204</span> <span class="comment">// Two predicate classes that can be used in {ASSERT,EXPECT}_EXIT*:</span></div><div class="line"><a name="l10205"></a><span class="lineno">10205</span> </div><div class="line"><a name="l10206"></a><span class="lineno">10206</span> <span class="comment">// Tests that an exit code describes a normal exit with a given exit code.</span></div><div class="line"><a name="l10207"></a><span class="lineno">10207</span> <span class="keyword">class </span><a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> ExitedWithCode {</div><div class="line"><a name="l10208"></a><span class="lineno">10208</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l10209"></a><span class="lineno">10209</span>  <span class="keyword">explicit</span> ExitedWithCode(<span class="keywordtype">int</span> exit_code);</div><div class="line"><a name="l10210"></a><span class="lineno">10210</span>  <span class="keywordtype">bool</span> operator()(<span class="keywordtype">int</span> exit_status) <span class="keyword">const</span>;</div><div class="line"><a name="l10211"></a><span class="lineno">10211</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l10212"></a><span class="lineno">10212</span>  <span class="comment">// No implementation - assignment is unsupported.</span></div><div class="line"><a name="l10213"></a><span class="lineno">10213</span>  <span class="keywordtype">void</span> operator=(<span class="keyword">const</span> ExitedWithCode& other);</div><div class="line"><a name="l10214"></a><span class="lineno">10214</span> </div><div class="line"><a name="l10215"></a><span class="lineno">10215</span>  <span class="keyword">const</span> <span class="keywordtype">int</span> exit_code_;</div><div class="line"><a name="l10216"></a><span class="lineno">10216</span> };</div><div class="line"><a name="l10217"></a><span class="lineno">10217</span> </div><div class="line"><a name="l10218"></a><span class="lineno">10218</span> <span class="preprocessor"># if !GTEST_OS_WINDOWS && !GTEST_OS_FUCHSIA</span></div><div class="line"><a name="l10219"></a><span class="lineno">10219</span> <span class="comment">// Tests that an exit code describes an exit due to termination by a</span></div><div class="line"><a name="l10220"></a><span class="lineno">10220</span> <span class="comment">// given signal.</span></div><div class="line"><a name="l10221"></a><span class="lineno">10221</span> <span class="comment">// GOOGLETEST_CM0006 DO NOT DELETE</span></div><div class="line"><a name="l10222"></a><span class="lineno">10222</span> <span class="keyword">class </span><a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> KilledBySignal {</div><div class="line"><a name="l10223"></a><span class="lineno">10223</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l10224"></a><span class="lineno">10224</span>  <span class="keyword">explicit</span> KilledBySignal(<span class="keywordtype">int</span> signum);</div><div class="line"><a name="l10225"></a><span class="lineno">10225</span>  <span class="keywordtype">bool</span> operator()(<span class="keywordtype">int</span> exit_status) <span class="keyword">const</span>;</div><div class="line"><a name="l10226"></a><span class="lineno">10226</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l10227"></a><span class="lineno">10227</span>  <span class="keyword">const</span> <span class="keywordtype">int</span> signum_;</div><div class="line"><a name="l10228"></a><span class="lineno">10228</span> };</div><div class="line"><a name="l10229"></a><span class="lineno">10229</span> <span class="preprocessor"># endif // !GTEST_OS_WINDOWS</span></div><div class="line"><a name="l10230"></a><span class="lineno">10230</span> </div><div class="line"><a name="l10231"></a><span class="lineno">10231</span> <span class="comment">// EXPECT_DEBUG_DEATH asserts that the given statements die in debug mode.</span></div><div class="line"><a name="l10232"></a><span class="lineno">10232</span> <span class="comment">// The death testing framework causes this to have interesting semantics,</span></div><div class="line"><a name="l10233"></a><span class="lineno">10233</span> <span class="comment">// since the sideeffects of the call are only visible in opt mode, and not</span></div><div class="line"><a name="l10234"></a><span class="lineno">10234</span> <span class="comment">// in debug mode.</span></div><div class="line"><a name="l10235"></a><span class="lineno">10235</span> <span class="comment">//</span></div><div class="line"><a name="l10236"></a><span class="lineno">10236</span> <span class="comment">// In practice, this can be used to test functions that utilize the</span></div><div class="line"><a name="l10237"></a><span class="lineno">10237</span> <span class="comment">// LOG(DFATAL) macro using the following style:</span></div><div class="line"><a name="l10238"></a><span class="lineno">10238</span> <span class="comment">//</span></div><div class="line"><a name="l10239"></a><span class="lineno">10239</span> <span class="comment">// int DieInDebugOr12(int* sideeffect) {</span></div><div class="line"><a name="l10240"></a><span class="lineno">10240</span> <span class="comment">// if (sideeffect) {</span></div><div class="line"><a name="l10241"></a><span class="lineno">10241</span> <span class="comment">// *sideeffect = 12;</span></div><div class="line"><a name="l10242"></a><span class="lineno">10242</span> <span class="comment">// }</span></div><div class="line"><a name="l10243"></a><span class="lineno">10243</span> <span class="comment">// LOG(DFATAL) << "death";</span></div><div class="line"><a name="l10244"></a><span class="lineno">10244</span> <span class="comment">// return 12;</span></div><div class="line"><a name="l10245"></a><span class="lineno">10245</span> <span class="comment">// }</span></div><div class="line"><a name="l10246"></a><span class="lineno">10246</span> <span class="comment">//</span></div><div class="line"><a name="l10247"></a><span class="lineno">10247</span> <span class="comment">// TEST(TestSuite, TestDieOr12WorksInDgbAndOpt) {</span></div><div class="line"><a name="l10248"></a><span class="lineno">10248</span> <span class="comment">// int sideeffect = 0;</span></div><div class="line"><a name="l10249"></a><span class="lineno">10249</span> <span class="comment">// // Only asserts in dbg.</span></div><div class="line"><a name="l10250"></a><span class="lineno">10250</span> <span class="comment">// EXPECT_DEBUG_DEATH(DieInDebugOr12(&sideeffect), "death");</span></div><div class="line"><a name="l10251"></a><span class="lineno">10251</span> <span class="comment">//</span></div><div class="line"><a name="l10252"></a><span class="lineno">10252</span> <span class="comment">// #ifdef NDEBUG</span></div><div class="line"><a name="l10253"></a><span class="lineno">10253</span> <span class="comment">// // opt-mode has sideeffect visible.</span></div><div class="line"><a name="l10254"></a><span class="lineno">10254</span> <span class="comment">// EXPECT_EQ(12, sideeffect);</span></div><div class="line"><a name="l10255"></a><span class="lineno">10255</span> <span class="comment">// #else</span></div><div class="line"><a name="l10256"></a><span class="lineno">10256</span> <span class="comment">// // dbg-mode no visible sideeffect.</span></div><div class="line"><a name="l10257"></a><span class="lineno">10257</span> <span class="comment">// EXPECT_EQ(0, sideeffect);</span></div><div class="line"><a name="l10258"></a><span class="lineno">10258</span> <span class="comment">// #endif</span></div><div class="line"><a name="l10259"></a><span class="lineno">10259</span> <span class="comment">// }</span></div><div class="line"><a name="l10260"></a><span class="lineno">10260</span> <span class="comment">//</span></div><div class="line"><a name="l10261"></a><span class="lineno">10261</span> <span class="comment">// This will assert that DieInDebugReturn12InOpt() crashes in debug</span></div><div class="line"><a name="l10262"></a><span class="lineno">10262</span> <span class="comment">// mode, usually due to a DCHECK or LOG(DFATAL), but returns the</span></div><div class="line"><a name="l10263"></a><span class="lineno">10263</span> <span class="comment">// appropriate fallback value (12 in this case) in opt mode. If you</span></div><div class="line"><a name="l10264"></a><span class="lineno">10264</span> <span class="comment">// need to test that a function has appropriate side-effects in opt</span></div><div class="line"><a name="l10265"></a><span class="lineno">10265</span> <span class="comment">// mode, include assertions against the side-effects. A general</span></div><div class="line"><a name="l10266"></a><span class="lineno">10266</span> <span class="comment">// pattern for this is:</span></div><div class="line"><a name="l10267"></a><span class="lineno">10267</span> <span class="comment">//</span></div><div class="line"><a name="l10268"></a><span class="lineno">10268</span> <span class="comment">// EXPECT_DEBUG_DEATH({</span></div><div class="line"><a name="l10269"></a><span class="lineno">10269</span> <span class="comment">// // Side-effects here will have an effect after this statement in</span></div><div class="line"><a name="l10270"></a><span class="lineno">10270</span> <span class="comment">// // opt mode, but none in debug mode.</span></div><div class="line"><a name="l10271"></a><span class="lineno">10271</span> <span class="comment">// EXPECT_EQ(12, DieInDebugOr12(&sideeffect));</span></div><div class="line"><a name="l10272"></a><span class="lineno">10272</span> <span class="comment">// }, "death");</span></div><div class="line"><a name="l10273"></a><span class="lineno">10273</span> <span class="comment">//</span></div><div class="line"><a name="l10274"></a><span class="lineno">10274</span> <span class="preprocessor"># ifdef NDEBUG</span></div><div class="line"><a name="l10275"></a><span class="lineno">10275</span> </div><div class="line"><a name="l10276"></a><span class="lineno">10276</span> <span class="preprocessor"># define EXPECT_DEBUG_DEATH(statement, regex) \</span></div><div class="line"><a name="l10277"></a><span class="lineno">10277</span> <span class="preprocessor"> GTEST_EXECUTE_STATEMENT_(statement, regex)</span></div><div class="line"><a name="l10278"></a><span class="lineno">10278</span> </div><div class="line"><a name="l10279"></a><span class="lineno">10279</span> <span class="preprocessor"># define ASSERT_DEBUG_DEATH(statement, regex) \</span></div><div class="line"><a name="l10280"></a><span class="lineno">10280</span> <span class="preprocessor"> GTEST_EXECUTE_STATEMENT_(statement, regex)</span></div><div class="line"><a name="l10281"></a><span class="lineno">10281</span> </div><div class="line"><a name="l10282"></a><span class="lineno">10282</span> <span class="preprocessor"># else</span></div><div class="line"><a name="l10283"></a><span class="lineno">10283</span> </div><div class="line"><a name="l10284"></a><span class="lineno">10284</span> <span class="preprocessor"># define EXPECT_DEBUG_DEATH(statement, regex) \</span></div><div class="line"><a name="l10285"></a><span class="lineno">10285</span> <span class="preprocessor"> EXPECT_DEATH(statement, regex)</span></div><div class="line"><a name="l10286"></a><span class="lineno">10286</span> </div><div class="line"><a name="l10287"></a><span class="lineno">10287</span> <span class="preprocessor"># define ASSERT_DEBUG_DEATH(statement, regex) \</span></div><div class="line"><a name="l10288"></a><span class="lineno">10288</span> <span class="preprocessor"> ASSERT_DEATH(statement, regex)</span></div><div class="line"><a name="l10289"></a><span class="lineno">10289</span> </div><div class="line"><a name="l10290"></a><span class="lineno">10290</span> <span class="preprocessor"># endif // NDEBUG for EXPECT_DEBUG_DEATH</span></div><div class="line"><a name="l10291"></a><span class="lineno">10291</span> <span class="preprocessor">#endif // GTEST_HAS_DEATH_TEST</span></div><div class="line"><a name="l10292"></a><span class="lineno">10292</span> </div><div class="line"><a name="l10293"></a><span class="lineno">10293</span> <span class="comment">// This macro is used for implementing macros such as</span></div><div class="line"><a name="l10294"></a><span class="lineno">10294</span> <span class="comment">// EXPECT_DEATH_IF_SUPPORTED and ASSERT_DEATH_IF_SUPPORTED on systems where</span></div><div class="line"><a name="l10295"></a><span class="lineno">10295</span> <span class="comment">// death tests are not supported. Those macros must compile on such systems</span></div><div class="line"><a name="l10296"></a><span class="lineno">10296</span> <span class="comment">// iff EXPECT_DEATH and ASSERT_DEATH compile with the same parameters on</span></div><div class="line"><a name="l10297"></a><span class="lineno">10297</span> <span class="comment">// systems that support death tests. This allows one to write such a macro</span></div><div class="line"><a name="l10298"></a><span class="lineno">10298</span> <span class="comment">// on a system that does not support death tests and be sure that it will</span></div><div class="line"><a name="l10299"></a><span class="lineno">10299</span> <span class="comment">// compile on a death-test supporting system. It is exposed publicly so that</span></div><div class="line"><a name="l10300"></a><span class="lineno">10300</span> <span class="comment">// systems that have death-tests with stricter requirements than</span></div><div class="line"><a name="l10301"></a><span class="lineno">10301</span> <span class="comment">// GTEST_HAS_DEATH_TEST can write their own equivalent of</span></div><div class="line"><a name="l10302"></a><span class="lineno">10302</span> <span class="comment">// EXPECT_DEATH_IF_SUPPORTED and ASSERT_DEATH_IF_SUPPORTED.</span></div><div class="line"><a name="l10303"></a><span class="lineno">10303</span> <span class="comment">//</span></div><div class="line"><a name="l10304"></a><span class="lineno">10304</span> <span class="comment">// Parameters:</span></div><div class="line"><a name="l10305"></a><span class="lineno">10305</span> <span class="comment">// statement - A statement that a macro such as EXPECT_DEATH would test</span></div><div class="line"><a name="l10306"></a><span class="lineno">10306</span> <span class="comment">// for program termination. This macro has to make sure this</span></div><div class="line"><a name="l10307"></a><span class="lineno">10307</span> <span class="comment">// statement is compiled but not executed, to ensure that</span></div><div class="line"><a name="l10308"></a><span class="lineno">10308</span> <span class="comment">// EXPECT_DEATH_IF_SUPPORTED compiles with a certain</span></div><div class="line"><a name="l10309"></a><span class="lineno">10309</span> <span class="comment">// parameter iff EXPECT_DEATH compiles with it.</span></div><div class="line"><a name="l10310"></a><span class="lineno">10310</span> <span class="comment">// regex - A regex that a macro such as EXPECT_DEATH would use to test</span></div><div class="line"><a name="l10311"></a><span class="lineno">10311</span> <span class="comment">// the output of statement. This parameter has to be</span></div><div class="line"><a name="l10312"></a><span class="lineno">10312</span> <span class="comment">// compiled but not evaluated by this macro, to ensure that</span></div><div class="line"><a name="l10313"></a><span class="lineno">10313</span> <span class="comment">// this macro only accepts expressions that a macro such as</span></div><div class="line"><a name="l10314"></a><span class="lineno">10314</span> <span class="comment">// EXPECT_DEATH would accept.</span></div><div class="line"><a name="l10315"></a><span class="lineno">10315</span> <span class="comment">// terminator - Must be an empty statement for EXPECT_DEATH_IF_SUPPORTED</span></div><div class="line"><a name="l10316"></a><span class="lineno">10316</span> <span class="comment">// and a return statement for ASSERT_DEATH_IF_SUPPORTED.</span></div><div class="line"><a name="l10317"></a><span class="lineno">10317</span> <span class="comment">// This ensures that ASSERT_DEATH_IF_SUPPORTED will not</span></div><div class="line"><a name="l10318"></a><span class="lineno">10318</span> <span class="comment">// compile inside functions where ASSERT_DEATH doesn't</span></div><div class="line"><a name="l10319"></a><span class="lineno">10319</span> <span class="comment">// compile.</span></div><div class="line"><a name="l10320"></a><span class="lineno">10320</span> <span class="comment">//</span></div><div class="line"><a name="l10321"></a><span class="lineno">10321</span> <span class="comment">// The branch that has an always false condition is used to ensure that</span></div><div class="line"><a name="l10322"></a><span class="lineno">10322</span> <span class="comment">// statement and regex are compiled (and thus syntactically correct) but</span></div><div class="line"><a name="l10323"></a><span class="lineno">10323</span> <span class="comment">// never executed. The unreachable code macro protects the terminator</span></div><div class="line"><a name="l10324"></a><span class="lineno">10324</span> <span class="comment">// statement from generating an 'unreachable code' warning in case</span></div><div class="line"><a name="l10325"></a><span class="lineno">10325</span> <span class="comment">// statement unconditionally returns or throws. The Message constructor at</span></div><div class="line"><a name="l10326"></a><span class="lineno">10326</span> <span class="comment">// the end allows the syntax of streaming additional messages into the</span></div><div class="line"><a name="l10327"></a><span class="lineno">10327</span> <span class="comment">// macro, for compilational compatibility with EXPECT_DEATH/ASSERT_DEATH.</span></div><div class="line"><a name="l10328"></a><span class="lineno"><a class="line" href="gtest_8h.html#aa5f42ab29859b7f49a901770d2e66855">10328</a></span> <span class="preprocessor"># define GTEST_UNSUPPORTED_DEATH_TEST(statement, regex, terminator) \</span></div><div class="line"><a name="l10329"></a><span class="lineno">10329</span> <span class="preprocessor"> GTEST_AMBIGUOUS_ELSE_BLOCKER_ \</span></div><div class="line"><a name="l10330"></a><span class="lineno">10330</span> <span class="preprocessor"> if (::testing::internal::AlwaysTrue()) { \</span></div><div class="line"><a name="l10331"></a><span class="lineno">10331</span> <span class="preprocessor"> GTEST_LOG_(WARNING) \</span></div><div class="line"><a name="l10332"></a><span class="lineno">10332</span> <span class="preprocessor"> << "Death tests are not supported on this platform.\n" \</span></div><div class="line"><a name="l10333"></a><span class="lineno">10333</span> <span class="preprocessor"> << "Statement '" #statement "' cannot be verified."; \</span></div><div class="line"><a name="l10334"></a><span class="lineno">10334</span> <span class="preprocessor"> } else if (::testing::internal::AlwaysFalse()) { \</span></div><div class="line"><a name="l10335"></a><span class="lineno">10335</span> <span class="preprocessor"> ::testing::internal::RE::PartialMatch(".*", (regex)); \</span></div><div class="line"><a name="l10336"></a><span class="lineno">10336</span> <span class="preprocessor"> GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \</span></div><div class="line"><a name="l10337"></a><span class="lineno">10337</span> <span class="preprocessor"> terminator; \</span></div><div class="line"><a name="l10338"></a><span class="lineno">10338</span> <span class="preprocessor"> } else \</span></div><div class="line"><a name="l10339"></a><span class="lineno">10339</span> <span class="preprocessor"> ::testing::Message()</span></div><div class="line"><a name="l10340"></a><span class="lineno">10340</span> </div><div class="line"><a name="l10341"></a><span class="lineno">10341</span> <span class="comment">// EXPECT_DEATH_IF_SUPPORTED(statement, regex) and</span></div><div class="line"><a name="l10342"></a><span class="lineno">10342</span> <span class="comment">// ASSERT_DEATH_IF_SUPPORTED(statement, regex) expand to real death tests if</span></div><div class="line"><a name="l10343"></a><span class="lineno">10343</span> <span class="comment">// death tests are supported; otherwise they just issue a warning. This is</span></div><div class="line"><a name="l10344"></a><span class="lineno">10344</span> <span class="comment">// useful when you are combining death test assertions with normal test</span></div><div class="line"><a name="l10345"></a><span class="lineno">10345</span> <span class="comment">// assertions in one test.</span></div><div class="line"><a name="l10346"></a><span class="lineno">10346</span> <span class="preprocessor">#if GTEST_HAS_DEATH_TEST</span></div><div class="line"><a name="l10347"></a><span class="lineno">10347</span> <span class="preprocessor"># define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \</span></div><div class="line"><a name="l10348"></a><span class="lineno">10348</span> <span class="preprocessor"> EXPECT_DEATH(statement, regex)</span></div><div class="line"><a name="l10349"></a><span class="lineno">10349</span> <span class="preprocessor"># define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \</span></div><div class="line"><a name="l10350"></a><span class="lineno">10350</span> <span class="preprocessor"> ASSERT_DEATH(statement, regex)</span></div><div class="line"><a name="l10351"></a><span class="lineno">10351</span> <span class="preprocessor">#else</span></div><div class="line"><a name="l10352"></a><span class="lineno"><a class="line" href="gtest_8h.html#a8564de0e012dd0898949c513d1571f8b">10352</a></span> <span class="preprocessor"># define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \</span></div><div class="line"><a name="l10353"></a><span class="lineno">10353</span> <span class="preprocessor"> GTEST_UNSUPPORTED_DEATH_TEST(statement, regex, )</span></div><div class="line"><a name="l10354"></a><span class="lineno"><a class="line" href="gtest_8h.html#ab2f0f25b46353767179a49ebd15b7345">10354</a></span> <span class="preprocessor"># define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \</span></div><div class="line"><a name="l10355"></a><span class="lineno">10355</span> <span class="preprocessor"> GTEST_UNSUPPORTED_DEATH_TEST(statement, regex, return)</span></div><div class="line"><a name="l10356"></a><span class="lineno">10356</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l10357"></a><span class="lineno">10357</span> </div><div class="line"><a name="l10358"></a><span class="lineno">10358</span> } <span class="comment">// namespace testing</span></div><div class="line"><a name="l10359"></a><span class="lineno">10359</span> </div><div class="line"><a name="l10360"></a><span class="lineno">10360</span> <span class="preprocessor">#endif // GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_</span></div><div class="line"><a name="l10361"></a><span class="lineno">10361</span> <span class="comment">// This file was GENERATED by command:</span></div><div class="line"><a name="l10362"></a><span class="lineno">10362</span> <span class="comment">// pump.py gtest-param-test.h.pump</span></div><div class="line"><a name="l10363"></a><span class="lineno">10363</span> <span class="comment">// DO NOT EDIT BY HAND!!!</span></div><div class="line"><a name="l10364"></a><span class="lineno">10364</span> </div><div class="line"><a name="l10365"></a><span class="lineno">10365</span> <span class="comment">// Copyright 2008, Google Inc.</span></div><div class="line"><a name="l10366"></a><span class="lineno">10366</span> <span class="comment">// All rights reserved.</span></div><div class="line"><a name="l10367"></a><span class="lineno">10367</span> <span class="comment">//</span></div><div class="line"><a name="l10368"></a><span class="lineno">10368</span> <span class="comment">// Redistribution and use in source and binary forms, with or without</span></div><div class="line"><a name="l10369"></a><span class="lineno">10369</span> <span class="comment">// modification, are permitted provided that the following conditions are</span></div><div class="line"><a name="l10370"></a><span class="lineno">10370</span> <span class="comment">// met:</span></div><div class="line"><a name="l10371"></a><span class="lineno">10371</span> <span class="comment">//</span></div><div class="line"><a name="l10372"></a><span class="lineno">10372</span> <span class="comment">// * Redistributions of source code must retain the above copyright</span></div><div class="line"><a name="l10373"></a><span class="lineno">10373</span> <span class="comment">// notice, this list of conditions and the following disclaimer.</span></div><div class="line"><a name="l10374"></a><span class="lineno">10374</span> <span class="comment">// * Redistributions in binary form must reproduce the above</span></div><div class="line"><a name="l10375"></a><span class="lineno">10375</span> <span class="comment">// copyright notice, this list of conditions and the following disclaimer</span></div><div class="line"><a name="l10376"></a><span class="lineno">10376</span> <span class="comment">// in the documentation and/or other materials provided with the</span></div><div class="line"><a name="l10377"></a><span class="lineno">10377</span> <span class="comment">// distribution.</span></div><div class="line"><a name="l10378"></a><span class="lineno">10378</span> <span class="comment">// * Neither the name of Google Inc. nor the names of its</span></div><div class="line"><a name="l10379"></a><span class="lineno">10379</span> <span class="comment">// contributors may be used to endorse or promote products derived from</span></div><div class="line"><a name="l10380"></a><span class="lineno">10380</span> <span class="comment">// this software without specific prior written permission.</span></div><div class="line"><a name="l10381"></a><span class="lineno">10381</span> <span class="comment">//</span></div><div class="line"><a name="l10382"></a><span class="lineno">10382</span> <span class="comment">// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS</span></div><div class="line"><a name="l10383"></a><span class="lineno">10383</span> <span class="comment">// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT</span></div><div class="line"><a name="l10384"></a><span class="lineno">10384</span> <span class="comment">// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR</span></div><div class="line"><a name="l10385"></a><span class="lineno">10385</span> <span class="comment">// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT</span></div><div class="line"><a name="l10386"></a><span class="lineno">10386</span> <span class="comment">// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,</span></div><div class="line"><a name="l10387"></a><span class="lineno">10387</span> <span class="comment">// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT</span></div><div class="line"><a name="l10388"></a><span class="lineno">10388</span> <span class="comment">// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,</span></div><div class="line"><a name="l10389"></a><span class="lineno">10389</span> <span class="comment">// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY</span></div><div class="line"><a name="l10390"></a><span class="lineno">10390</span> <span class="comment">// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</span></div><div class="line"><a name="l10391"></a><span class="lineno">10391</span> <span class="comment">// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE</span></div><div class="line"><a name="l10392"></a><span class="lineno">10392</span> <span class="comment">// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span></div><div class="line"><a name="l10393"></a><span class="lineno">10393</span> <span class="comment">//</span></div><div class="line"><a name="l10394"></a><span class="lineno">10394</span> <span class="comment">// Macros and functions for implementing parameterized tests</span></div><div class="line"><a name="l10395"></a><span class="lineno">10395</span> <span class="comment">// in Google C++ Testing and Mocking Framework (Google Test)</span></div><div class="line"><a name="l10396"></a><span class="lineno">10396</span> <span class="comment">//</span></div><div class="line"><a name="l10397"></a><span class="lineno">10397</span> <span class="comment">// This file is generated by a SCRIPT. DO NOT EDIT BY HAND!</span></div><div class="line"><a name="l10398"></a><span class="lineno">10398</span> <span class="comment">//</span></div><div class="line"><a name="l10399"></a><span class="lineno">10399</span> <span class="comment">// GOOGLETEST_CM0001 DO NOT DELETE</span></div><div class="line"><a name="l10400"></a><span class="lineno">10400</span> <span class="preprocessor">#ifndef GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_</span></div><div class="line"><a name="l10401"></a><span class="lineno"><a class="line" href="gtest_8h.html#a15b9e83e56cafef0ddd12e2444772908">10401</a></span> <span class="preprocessor">#define GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_</span></div><div class="line"><a name="l10402"></a><span class="lineno">10402</span> </div><div class="line"><a name="l10403"></a><span class="lineno">10403</span> </div><div class="line"><a name="l10404"></a><span class="lineno">10404</span> <span class="comment">// Value-parameterized tests allow you to test your code with different</span></div><div class="line"><a name="l10405"></a><span class="lineno">10405</span> <span class="comment">// parameters without writing multiple copies of the same test.</span></div><div class="line"><a name="l10406"></a><span class="lineno">10406</span> <span class="comment">//</span></div><div class="line"><a name="l10407"></a><span class="lineno">10407</span> <span class="comment">// Here is how you use value-parameterized tests:</span></div><div class="line"><a name="l10408"></a><span class="lineno">10408</span> </div><div class="line"><a name="l10409"></a><span class="lineno">10409</span> <span class="preprocessor">#if 0</span></div><div class="line"><a name="l10410"></a><span class="lineno">10410</span> </div><div class="line"><a name="l10411"></a><span class="lineno">10411</span> <span class="comment">// To write value-parameterized tests, first you should define a fixture</span></div><div class="line"><a name="l10412"></a><span class="lineno">10412</span> <span class="comment">// class. It is usually derived from testing::TestWithParam<T> (see below for</span></div><div class="line"><a name="l10413"></a><span class="lineno">10413</span> <span class="comment">// another inheritance scheme that's sometimes useful in more complicated</span></div><div class="line"><a name="l10414"></a><span class="lineno">10414</span> <span class="comment">// class hierarchies), where the type of your parameter values.</span></div><div class="line"><a name="l10415"></a><span class="lineno">10415</span> <span class="comment">// TestWithParam<T> is itself derived from testing::Test. T can be any</span></div><div class="line"><a name="l10416"></a><span class="lineno">10416</span> <span class="comment">// copyable type. If it's a raw pointer, you are responsible for managing the</span></div><div class="line"><a name="l10417"></a><span class="lineno">10417</span> <span class="comment">// lifespan of the pointed values.</span></div><div class="line"><a name="l10418"></a><span class="lineno">10418</span> </div><div class="line"><a name="l10419"></a><span class="lineno">10419</span> <span class="keyword">class </span>FooTest : <span class="keyword">public</span> <a class="code" href="classtesting_1_1_test_with_param.html">::testing::TestWithParam</a><const char*> {</div><div class="line"><a name="l10420"></a><span class="lineno">10420</span>  <span class="comment">// You can implement all the usual class fixture members here.</span></div><div class="line"><a name="l10421"></a><span class="lineno">10421</span> };</div><div class="line"><a name="l10422"></a><span class="lineno">10422</span> </div><div class="line"><a name="l10423"></a><span class="lineno">10423</span> <span class="comment">// Then, use the TEST_P macro to define as many parameterized tests</span></div><div class="line"><a name="l10424"></a><span class="lineno">10424</span> <span class="comment">// for this fixture as you want. The _P suffix is for "parameterized"</span></div><div class="line"><a name="l10425"></a><span class="lineno">10425</span> <span class="comment">// or "pattern", whichever you prefer to think.</span></div><div class="line"><a name="l10426"></a><span class="lineno">10426</span> </div><div class="line"><a name="l10427"></a><span class="lineno">10427</span> <a class="code" href="gtest_8h.html#a1adc861b311e3fbd97bcc72e0b0f5962">TEST_P</a>(FooTest, DoesBlah) {</div><div class="line"><a name="l10428"></a><span class="lineno">10428</span>  <span class="comment">// Inside a test, access the test parameter with the GetParam() method</span></div><div class="line"><a name="l10429"></a><span class="lineno">10429</span>  <span class="comment">// of the TestWithParam<T> class:</span></div><div class="line"><a name="l10430"></a><span class="lineno">10430</span>  <a class="code" href="gtest_8h.html#ac33e7cdfb5d44a7a0f0ab552eb5c3c6a">EXPECT_TRUE</a>(foo.Blah(GetParam()));</div><div class="line"><a name="l10431"></a><span class="lineno">10431</span>  ...</div><div class="line"><a name="l10432"></a><span class="lineno">10432</span> }</div><div class="line"><a name="l10433"></a><span class="lineno">10433</span> </div><div class="line"><a name="l10434"></a><span class="lineno">10434</span> <a class="code" href="gtest_8h.html#a1adc861b311e3fbd97bcc72e0b0f5962">TEST_P</a>(FooTest, HasBlahBlah) {</div><div class="line"><a name="l10435"></a><span class="lineno">10435</span>  ...</div><div class="line"><a name="l10436"></a><span class="lineno">10436</span> }</div><div class="line"><a name="l10437"></a><span class="lineno">10437</span> </div><div class="line"><a name="l10438"></a><span class="lineno">10438</span> <span class="comment">// Finally, you can use INSTANTIATE_TEST_SUITE_P to instantiate the test</span></div><div class="line"><a name="l10439"></a><span class="lineno">10439</span> <span class="comment">// case with any set of parameters you want. Google Test defines a number</span></div><div class="line"><a name="l10440"></a><span class="lineno">10440</span> <span class="comment">// of functions for generating test parameters. They return what we call</span></div><div class="line"><a name="l10441"></a><span class="lineno">10441</span> <span class="comment">// (surprise!) parameter generators. Here is a summary of them, which</span></div><div class="line"><a name="l10442"></a><span class="lineno">10442</span> <span class="comment">// are all in the testing namespace:</span></div><div class="line"><a name="l10443"></a><span class="lineno">10443</span> <span class="comment">//</span></div><div class="line"><a name="l10444"></a><span class="lineno">10444</span> <span class="comment">//</span></div><div class="line"><a name="l10445"></a><span class="lineno">10445</span> <span class="comment">// Range(begin, end [, step]) - Yields values {begin, begin+step,</span></div><div class="line"><a name="l10446"></a><span class="lineno">10446</span> <span class="comment">// begin+step+step, ...}. The values do not</span></div><div class="line"><a name="l10447"></a><span class="lineno">10447</span> <span class="comment">// include end. step defaults to 1.</span></div><div class="line"><a name="l10448"></a><span class="lineno">10448</span> <span class="comment">// Values(v1, v2, ..., vN) - Yields values {v1, v2, ..., vN}.</span></div><div class="line"><a name="l10449"></a><span class="lineno">10449</span> <span class="comment">// ValuesIn(container) - Yields values from a C-style array, an STL</span></div><div class="line"><a name="l10450"></a><span class="lineno">10450</span> <span class="comment">// ValuesIn(begin,end) container, or an iterator range [begin, end).</span></div><div class="line"><a name="l10451"></a><span class="lineno">10451</span> <span class="comment">// Bool() - Yields sequence {false, true}.</span></div><div class="line"><a name="l10452"></a><span class="lineno">10452</span> <span class="comment">// Combine(g1, g2, ..., gN) - Yields all combinations (the Cartesian product</span></div><div class="line"><a name="l10453"></a><span class="lineno">10453</span> <span class="comment">// for the math savvy) of the values generated</span></div><div class="line"><a name="l10454"></a><span class="lineno">10454</span> <span class="comment">// by the N generators.</span></div><div class="line"><a name="l10455"></a><span class="lineno">10455</span> <span class="comment">//</span></div><div class="line"><a name="l10456"></a><span class="lineno">10456</span> <span class="comment">// For more details, see comments at the definitions of these functions below</span></div><div class="line"><a name="l10457"></a><span class="lineno">10457</span> <span class="comment">// in this file.</span></div><div class="line"><a name="l10458"></a><span class="lineno">10458</span> <span class="comment">//</span></div><div class="line"><a name="l10459"></a><span class="lineno">10459</span> <span class="comment">// The following statement will instantiate tests from the FooTest test suite</span></div><div class="line"><a name="l10460"></a><span class="lineno">10460</span> <span class="comment">// each with parameter values "meeny", "miny", and "moe".</span></div><div class="line"><a name="l10461"></a><span class="lineno">10461</span> </div><div class="line"><a name="l10462"></a><span class="lineno">10462</span> <a class="code" href="gtest_8h.html#a016124361c862c0db315e4c9dc4d911a">INSTANTIATE_TEST_SUITE_P</a>(InstantiationName,</div><div class="line"><a name="l10463"></a><span class="lineno">10463</span>  FooTest,</div><div class="line"><a name="l10464"></a><span class="lineno">10464</span>  <a class="code" href="namespacetesting.html#a374d4e5fbb4c938058fbe81d4c7ff6a6">Values</a>(<span class="stringliteral">"meeny"</span>, <span class="stringliteral">"miny"</span>, <span class="stringliteral">"moe"</span>));</div><div class="line"><a name="l10465"></a><span class="lineno">10465</span> </div><div class="line"><a name="l10466"></a><span class="lineno">10466</span> <span class="comment">// To distinguish different instances of the pattern, (yes, you</span></div><div class="line"><a name="l10467"></a><span class="lineno">10467</span> <span class="comment">// can instantiate it more then once) the first argument to the</span></div><div class="line"><a name="l10468"></a><span class="lineno">10468</span> <span class="comment">// INSTANTIATE_TEST_SUITE_P macro is a prefix that will be added to the</span></div><div class="line"><a name="l10469"></a><span class="lineno">10469</span> <span class="comment">// actual test suite name. Remember to pick unique prefixes for different</span></div><div class="line"><a name="l10470"></a><span class="lineno">10470</span> <span class="comment">// instantiations. The tests from the instantiation above will have</span></div><div class="line"><a name="l10471"></a><span class="lineno">10471</span> <span class="comment">// these names:</span></div><div class="line"><a name="l10472"></a><span class="lineno">10472</span> <span class="comment">//</span></div><div class="line"><a name="l10473"></a><span class="lineno">10473</span> <span class="comment">// * InstantiationName/FooTest.DoesBlah/0 for "meeny"</span></div><div class="line"><a name="l10474"></a><span class="lineno">10474</span> <span class="comment">// * InstantiationName/FooTest.DoesBlah/1 for "miny"</span></div><div class="line"><a name="l10475"></a><span class="lineno">10475</span> <span class="comment">// * InstantiationName/FooTest.DoesBlah/2 for "moe"</span></div><div class="line"><a name="l10476"></a><span class="lineno">10476</span> <span class="comment">// * InstantiationName/FooTest.HasBlahBlah/0 for "meeny"</span></div><div class="line"><a name="l10477"></a><span class="lineno">10477</span> <span class="comment">// * InstantiationName/FooTest.HasBlahBlah/1 for "miny"</span></div><div class="line"><a name="l10478"></a><span class="lineno">10478</span> <span class="comment">// * InstantiationName/FooTest.HasBlahBlah/2 for "moe"</span></div><div class="line"><a name="l10479"></a><span class="lineno">10479</span> <span class="comment">//</span></div><div class="line"><a name="l10480"></a><span class="lineno">10480</span> <span class="comment">// You can use these names in --gtest_filter.</span></div><div class="line"><a name="l10481"></a><span class="lineno">10481</span> <span class="comment">//</span></div><div class="line"><a name="l10482"></a><span class="lineno">10482</span> <span class="comment">// This statement will instantiate all tests from FooTest again, each</span></div><div class="line"><a name="l10483"></a><span class="lineno">10483</span> <span class="comment">// with parameter values "cat" and "dog":</span></div><div class="line"><a name="l10484"></a><span class="lineno">10484</span> </div><div class="line"><a name="l10485"></a><span class="lineno">10485</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* pets[] = {<span class="stringliteral">"cat"</span>, <span class="stringliteral">"dog"</span>};</div><div class="line"><a name="l10486"></a><span class="lineno">10486</span> <a class="code" href="gtest_8h.html#a016124361c862c0db315e4c9dc4d911a">INSTANTIATE_TEST_SUITE_P</a>(AnotherInstantiationName, FooTest, <a class="code" href="namespacetesting.html#a0b9ea6594ac06ad5d9eba2511ffa0fb7">ValuesIn</a>(pets));</div><div class="line"><a name="l10487"></a><span class="lineno">10487</span> </div><div class="line"><a name="l10488"></a><span class="lineno">10488</span> <span class="comment">// The tests from the instantiation above will have these names:</span></div><div class="line"><a name="l10489"></a><span class="lineno">10489</span> <span class="comment">//</span></div><div class="line"><a name="l10490"></a><span class="lineno">10490</span> <span class="comment">// * AnotherInstantiationName/FooTest.DoesBlah/0 for "cat"</span></div><div class="line"><a name="l10491"></a><span class="lineno">10491</span> <span class="comment">// * AnotherInstantiationName/FooTest.DoesBlah/1 for "dog"</span></div><div class="line"><a name="l10492"></a><span class="lineno">10492</span> <span class="comment">// * AnotherInstantiationName/FooTest.HasBlahBlah/0 for "cat"</span></div><div class="line"><a name="l10493"></a><span class="lineno">10493</span> <span class="comment">// * AnotherInstantiationName/FooTest.HasBlahBlah/1 for "dog"</span></div><div class="line"><a name="l10494"></a><span class="lineno">10494</span> <span class="comment">//</span></div><div class="line"><a name="l10495"></a><span class="lineno">10495</span> <span class="comment">// Please note that INSTANTIATE_TEST_SUITE_P will instantiate all tests</span></div><div class="line"><a name="l10496"></a><span class="lineno">10496</span> <span class="comment">// in the given test suite, whether their definitions come before or</span></div><div class="line"><a name="l10497"></a><span class="lineno">10497</span> <span class="comment">// AFTER the INSTANTIATE_TEST_SUITE_P statement.</span></div><div class="line"><a name="l10498"></a><span class="lineno">10498</span> <span class="comment">//</span></div><div class="line"><a name="l10499"></a><span class="lineno">10499</span> <span class="comment">// Please also note that generator expressions (including parameters to the</span></div><div class="line"><a name="l10500"></a><span class="lineno">10500</span> <span class="comment">// generators) are evaluated in InitGoogleTest(), after main() has started.</span></div><div class="line"><a name="l10501"></a><span class="lineno">10501</span> <span class="comment">// This allows the user on one hand, to adjust generator parameters in order</span></div><div class="line"><a name="l10502"></a><span class="lineno">10502</span> <span class="comment">// to dynamically determine a set of tests to run and on the other hand,</span></div><div class="line"><a name="l10503"></a><span class="lineno">10503</span> <span class="comment">// give the user a chance to inspect the generated tests with Google Test</span></div><div class="line"><a name="l10504"></a><span class="lineno">10504</span> <span class="comment">// reflection API before RUN_ALL_TESTS() is executed.</span></div><div class="line"><a name="l10505"></a><span class="lineno">10505</span> <span class="comment">//</span></div><div class="line"><a name="l10506"></a><span class="lineno">10506</span> <span class="comment">// You can see samples/sample7_unittest.cc and samples/sample8_unittest.cc</span></div><div class="line"><a name="l10507"></a><span class="lineno">10507</span> <span class="comment">// for more examples.</span></div><div class="line"><a name="l10508"></a><span class="lineno">10508</span> <span class="comment">//</span></div><div class="line"><a name="l10509"></a><span class="lineno">10509</span> <span class="comment">// In the future, we plan to publish the API for defining new parameter</span></div><div class="line"><a name="l10510"></a><span class="lineno">10510</span> <span class="comment">// generators. But for now this interface remains part of the internal</span></div><div class="line"><a name="l10511"></a><span class="lineno">10511</span> <span class="comment">// implementation and is subject to change.</span></div><div class="line"><a name="l10512"></a><span class="lineno">10512</span> <span class="comment">//</span></div><div class="line"><a name="l10513"></a><span class="lineno">10513</span> <span class="comment">//</span></div><div class="line"><a name="l10514"></a><span class="lineno">10514</span> <span class="comment">// A parameterized test fixture must be derived from testing::Test and from</span></div><div class="line"><a name="l10515"></a><span class="lineno">10515</span> <span class="comment">// testing::WithParamInterface<T>, where T is the type of the parameter</span></div><div class="line"><a name="l10516"></a><span class="lineno">10516</span> <span class="comment">// values. Inheriting from TestWithParam<T> satisfies that requirement because</span></div><div class="line"><a name="l10517"></a><span class="lineno">10517</span> <span class="comment">// TestWithParam<T> inherits from both Test and WithParamInterface. In more</span></div><div class="line"><a name="l10518"></a><span class="lineno">10518</span> <span class="comment">// complicated hierarchies, however, it is occasionally useful to inherit</span></div><div class="line"><a name="l10519"></a><span class="lineno">10519</span> <span class="comment">// separately from Test and WithParamInterface. For example:</span></div><div class="line"><a name="l10520"></a><span class="lineno">10520</span> </div><div class="line"><a name="l10521"></a><span class="lineno">10521</span> <span class="keyword">class </span>BaseTest : <span class="keyword">public</span> <a class="code" href="classtesting_1_1_test.html">::testing::Test</a> {</div><div class="line"><a name="l10522"></a><span class="lineno">10522</span>  <span class="comment">// You can inherit all the usual members for a non-parameterized test</span></div><div class="line"><a name="l10523"></a><span class="lineno">10523</span>  <span class="comment">// fixture here.</span></div><div class="line"><a name="l10524"></a><span class="lineno">10524</span> };</div><div class="line"><a name="l10525"></a><span class="lineno">10525</span> </div><div class="line"><a name="l10526"></a><span class="lineno">10526</span> <span class="keyword">class </span>DerivedTest : <span class="keyword">public</span> BaseTest, <span class="keyword">public</span> <a class="code" href="classtesting_1_1_with_param_interface.html">::testing::WithParamInterface</a><int> {</div><div class="line"><a name="l10527"></a><span class="lineno">10527</span>  <span class="comment">// The usual test fixture members go here too.</span></div><div class="line"><a name="l10528"></a><span class="lineno">10528</span> };</div><div class="line"><a name="l10529"></a><span class="lineno">10529</span> </div><div class="line"><a name="l10530"></a><span class="lineno">10530</span> <a class="code" href="gtest_8h.html#a0ee66d464d1a06c20c1929cae09d8758">TEST_F</a>(BaseTest, HasFoo) {</div><div class="line"><a name="l10531"></a><span class="lineno">10531</span>  <span class="comment">// This is an ordinary non-parameterized test.</span></div><div class="line"><a name="l10532"></a><span class="lineno">10532</span> }</div><div class="line"><a name="l10533"></a><span class="lineno">10533</span> </div><div class="line"><a name="l10534"></a><span class="lineno">10534</span> <a class="code" href="gtest_8h.html#a1adc861b311e3fbd97bcc72e0b0f5962">TEST_P</a>(DerivedTest, DoesBlah) {</div><div class="line"><a name="l10535"></a><span class="lineno">10535</span>  <span class="comment">// GetParam works just the same here as if you inherit from TestWithParam.</span></div><div class="line"><a name="l10536"></a><span class="lineno">10536</span>  <a class="code" href="gtest_8h.html#ac33e7cdfb5d44a7a0f0ab552eb5c3c6a">EXPECT_TRUE</a>(foo.Blah(GetParam()));</div><div class="line"><a name="l10537"></a><span class="lineno">10537</span> }</div><div class="line"><a name="l10538"></a><span class="lineno">10538</span> </div><div class="line"><a name="l10539"></a><span class="lineno">10539</span> <span class="preprocessor">#endif // 0</span></div><div class="line"><a name="l10540"></a><span class="lineno">10540</span> </div><div class="line"><a name="l10541"></a><span class="lineno">10541</span> <span class="preprocessor">#include <utility></span></div><div class="line"><a name="l10542"></a><span class="lineno">10542</span> </div><div class="line"><a name="l10543"></a><span class="lineno">10543</span> <span class="comment">// Copyright 2008 Google Inc.</span></div><div class="line"><a name="l10544"></a><span class="lineno">10544</span> <span class="comment">// All Rights Reserved.</span></div><div class="line"><a name="l10545"></a><span class="lineno">10545</span> <span class="comment">//</span></div><div class="line"><a name="l10546"></a><span class="lineno">10546</span> <span class="comment">// Redistribution and use in source and binary forms, with or without</span></div><div class="line"><a name="l10547"></a><span class="lineno">10547</span> <span class="comment">// modification, are permitted provided that the following conditions are</span></div><div class="line"><a name="l10548"></a><span class="lineno">10548</span> <span class="comment">// met:</span></div><div class="line"><a name="l10549"></a><span class="lineno">10549</span> <span class="comment">//</span></div><div class="line"><a name="l10550"></a><span class="lineno">10550</span> <span class="comment">// * Redistributions of source code must retain the above copyright</span></div><div class="line"><a name="l10551"></a><span class="lineno">10551</span> <span class="comment">// notice, this list of conditions and the following disclaimer.</span></div><div class="line"><a name="l10552"></a><span class="lineno">10552</span> <span class="comment">// * Redistributions in binary form must reproduce the above</span></div><div class="line"><a name="l10553"></a><span class="lineno">10553</span> <span class="comment">// copyright notice, this list of conditions and the following disclaimer</span></div><div class="line"><a name="l10554"></a><span class="lineno">10554</span> <span class="comment">// in the documentation and/or other materials provided with the</span></div><div class="line"><a name="l10555"></a><span class="lineno">10555</span> <span class="comment">// distribution.</span></div><div class="line"><a name="l10556"></a><span class="lineno">10556</span> <span class="comment">// * Neither the name of Google Inc. nor the names of its</span></div><div class="line"><a name="l10557"></a><span class="lineno">10557</span> <span class="comment">// contributors may be used to endorse or promote products derived from</span></div><div class="line"><a name="l10558"></a><span class="lineno">10558</span> <span class="comment">// this software without specific prior written permission.</span></div><div class="line"><a name="l10559"></a><span class="lineno">10559</span> <span class="comment">//</span></div><div class="line"><a name="l10560"></a><span class="lineno">10560</span> <span class="comment">// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS</span></div><div class="line"><a name="l10561"></a><span class="lineno">10561</span> <span class="comment">// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT</span></div><div class="line"><a name="l10562"></a><span class="lineno">10562</span> <span class="comment">// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR</span></div><div class="line"><a name="l10563"></a><span class="lineno">10563</span> <span class="comment">// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT</span></div><div class="line"><a name="l10564"></a><span class="lineno">10564</span> <span class="comment">// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,</span></div><div class="line"><a name="l10565"></a><span class="lineno">10565</span> <span class="comment">// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT</span></div><div class="line"><a name="l10566"></a><span class="lineno">10566</span> <span class="comment">// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,</span></div><div class="line"><a name="l10567"></a><span class="lineno">10567</span> <span class="comment">// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY</span></div><div class="line"><a name="l10568"></a><span class="lineno">10568</span> <span class="comment">// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</span></div><div class="line"><a name="l10569"></a><span class="lineno">10569</span> <span class="comment">// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE</span></div><div class="line"><a name="l10570"></a><span class="lineno">10570</span> <span class="comment">// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span></div><div class="line"><a name="l10571"></a><span class="lineno">10571</span> </div><div class="line"><a name="l10572"></a><span class="lineno">10572</span> </div><div class="line"><a name="l10573"></a><span class="lineno">10573</span> <span class="comment">// Type and function utilities for implementing parameterized tests.</span></div><div class="line"><a name="l10574"></a><span class="lineno">10574</span> </div><div class="line"><a name="l10575"></a><span class="lineno">10575</span> <span class="comment">// GOOGLETEST_CM0001 DO NOT DELETE</span></div><div class="line"><a name="l10576"></a><span class="lineno">10576</span> </div><div class="line"><a name="l10577"></a><span class="lineno">10577</span> <span class="preprocessor">#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_</span></div><div class="line"><a name="l10578"></a><span class="lineno"><a class="line" href="gtest_8h.html#a83cf5c299fc04d9f8e555cb42a97aa47">10578</a></span> <span class="preprocessor">#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_</span></div><div class="line"><a name="l10579"></a><span class="lineno">10579</span> </div><div class="line"><a name="l10580"></a><span class="lineno">10580</span> <span class="preprocessor">#include <ctype.h></span></div><div class="line"><a name="l10581"></a><span class="lineno">10581</span> </div><div class="line"><a name="l10582"></a><span class="lineno">10582</span> <span class="preprocessor">#include <iterator></span></div><div class="line"><a name="l10583"></a><span class="lineno">10583</span> <span class="preprocessor">#include <memory></span></div><div class="line"><a name="l10584"></a><span class="lineno">10584</span> <span class="preprocessor">#include <set></span></div><div class="line"><a name="l10585"></a><span class="lineno">10585</span> <span class="preprocessor">#include <tuple></span></div><div class="line"><a name="l10586"></a><span class="lineno">10586</span> <span class="preprocessor">#include <utility></span></div><div class="line"><a name="l10587"></a><span class="lineno">10587</span> <span class="preprocessor">#include <vector></span></div><div class="line"><a name="l10588"></a><span class="lineno">10588</span> </div><div class="line"><a name="l10589"></a><span class="lineno">10589</span> </div><div class="line"><a name="l10590"></a><span class="lineno">10590</span> <span class="keyword">namespace </span><a class="code" href="namespacetesting.html">testing</a> {</div><div class="line"><a name="l10591"></a><span class="lineno">10591</span> <span class="comment">// Input to a parameterized test name generator, describing a test parameter.</span></div><div class="line"><a name="l10592"></a><span class="lineno">10592</span> <span class="comment">// Consists of the parameter value and the integer parameter index.</span></div><div class="line"><a name="l10593"></a><span class="lineno">10593</span> <span class="keyword">template</span> <<span class="keyword">class</span> ParamType></div><div class="line"><a name="l10594"></a><span class="lineno"><a class="line" href="structtesting_1_1_test_param_info.html">10594</a></span> <span class="keyword">struct </span><a class="code" href="structtesting_1_1_test_param_info.html">TestParamInfo</a> {</div><div class="line"><a name="l10595"></a><span class="lineno"><a class="line" href="structtesting_1_1_test_param_info.html#aa54199319bcad5a33c8538ecaecb6de5">10595</a></span>  <a class="code" href="structtesting_1_1_test_param_info.html#aa54199319bcad5a33c8538ecaecb6de5">TestParamInfo</a>(<span class="keyword">const</span> ParamType& a_param, <span class="keywordtype">size_t</span> an_index) :</div><div class="line"><a name="l10596"></a><span class="lineno">10596</span>  <a class="code" href="structtesting_1_1_test_param_info.html#a146d921039f9da8b1336f7cc6e8436c2">param</a>(a_param),</div><div class="line"><a name="l10597"></a><span class="lineno">10597</span>  <a class="code" href="structtesting_1_1_test_param_info.html#ad4d7bc02cbcc571eb3c1d2ec3ba5bb53">index</a>(an_index) {}</div><div class="line"><a name="l10598"></a><span class="lineno"><a class="line" href="structtesting_1_1_test_param_info.html#a146d921039f9da8b1336f7cc6e8436c2">10598</a></span>  ParamType <a class="code" href="structtesting_1_1_test_param_info.html#a146d921039f9da8b1336f7cc6e8436c2">param</a>;</div><div class="line"><a name="l10599"></a><span class="lineno"><a class="line" href="structtesting_1_1_test_param_info.html#ad4d7bc02cbcc571eb3c1d2ec3ba5bb53">10599</a></span>  <span class="keywordtype">size_t</span> <a class="code" href="structtesting_1_1_test_param_info.html#ad4d7bc02cbcc571eb3c1d2ec3ba5bb53">index</a>;</div><div class="line"><a name="l10600"></a><span class="lineno">10600</span> };</div><div class="line"><a name="l10601"></a><span class="lineno">10601</span> </div><div class="line"><a name="l10602"></a><span class="lineno">10602</span> <span class="comment">// A builtin parameterized test name generator which returns the result of</span></div><div class="line"><a name="l10603"></a><span class="lineno">10603</span> <span class="comment">// testing::PrintToString.</span></div><div class="line"><a name="l10604"></a><span class="lineno"><a class="line" href="structtesting_1_1_print_to_string_param_name.html">10604</a></span> <span class="keyword">struct </span><a class="code" href="structtesting_1_1_print_to_string_param_name.html">PrintToStringParamName</a> {</div><div class="line"><a name="l10605"></a><span class="lineno">10605</span>  <span class="keyword">template</span> <<span class="keyword">class</span> ParamType></div><div class="line"><a name="l10606"></a><span class="lineno"><a class="line" href="structtesting_1_1_print_to_string_param_name.html#a05b411cfb75dadb2c3c0355aee1dcf21">10606</a></span>  <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a> <a class="code" href="structtesting_1_1_print_to_string_param_name.html#a05b411cfb75dadb2c3c0355aee1dcf21">operator()</a>(<span class="keyword">const</span> <a class="code" href="structtesting_1_1_test_param_info.html">TestParamInfo<ParamType></a>& info)<span class="keyword"> const </span>{</div><div class="line"><a name="l10607"></a><span class="lineno">10607</span>  <span class="keywordflow">return</span> <a class="code" href="namespacetesting.html#aa5717bb1144edd1d262d310ba70c82ed">PrintToString</a>(info.<a class="code" href="structtesting_1_1_test_param_info.html#a146d921039f9da8b1336f7cc6e8436c2">param</a>);</div><div class="line"><a name="l10608"></a><span class="lineno">10608</span>  }</div><div class="line"><a name="l10609"></a><span class="lineno">10609</span> };</div><div class="line"><a name="l10610"></a><span class="lineno">10610</span> </div><div class="line"><a name="l10611"></a><span class="lineno">10611</span> <span class="keyword">namespace </span>internal {</div><div class="line"><a name="l10612"></a><span class="lineno">10612</span> </div><div class="line"><a name="l10613"></a><span class="lineno">10613</span> <span class="comment">// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.</span></div><div class="line"><a name="l10614"></a><span class="lineno">10614</span> <span class="comment">// Utility Functions</span></div><div class="line"><a name="l10615"></a><span class="lineno">10615</span> </div><div class="line"><a name="l10616"></a><span class="lineno">10616</span> <span class="comment">// Outputs a message explaining invalid registration of different</span></div><div class="line"><a name="l10617"></a><span class="lineno">10617</span> <span class="comment">// fixture class for the same test suite. This may happen when</span></div><div class="line"><a name="l10618"></a><span class="lineno">10618</span> <span class="comment">// TEST_P macro is used to define two tests with the same name</span></div><div class="line"><a name="l10619"></a><span class="lineno">10619</span> <span class="comment">// but in different namespaces.</span></div><div class="line"><a name="l10620"></a><span class="lineno">10620</span> <a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> <span class="keywordtype">void</span> <a class="code" href="namespacetesting_1_1internal.html#a5d3e97443d23bf1824f87feb172efd39">ReportInvalidTestSuiteType</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* test_suite_name,</div><div class="line"><a name="l10621"></a><span class="lineno">10621</span>  CodeLocation code_location);</div><div class="line"><a name="l10622"></a><span class="lineno">10622</span> </div><div class="line"><a name="l10623"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_param_generator_interface.html">10623</a></span> <span class="keyword">template</span> <<span class="keyword">typename</span>> <span class="keyword">class </span><a class="code" href="classtesting_1_1internal_1_1_param_generator_interface.html">ParamGeneratorInterface</a>;</div><div class="line"><a name="l10624"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_param_generator.html">10624</a></span> <span class="keyword">template</span> <<span class="keyword">typename</span>> <span class="keyword">class </span><a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator</a>;</div><div class="line"><a name="l10625"></a><span class="lineno">10625</span> </div><div class="line"><a name="l10626"></a><span class="lineno">10626</span> <span class="comment">// Interface for iterating over elements provided by an implementation</span></div><div class="line"><a name="l10627"></a><span class="lineno">10627</span> <span class="comment">// of ParamGeneratorInterface<T>.</span></div><div class="line"><a name="l10628"></a><span class="lineno">10628</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l10629"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_param_iterator_interface.html">10629</a></span> <span class="keyword">class </span><a class="code" href="classtesting_1_1internal_1_1_param_iterator_interface.html">ParamIteratorInterface</a> {</div><div class="line"><a name="l10630"></a><span class="lineno">10630</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l10631"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_param_iterator_interface.html#adf6ba49e6b54a6e3b15dbd5733988bef">10631</a></span>  <span class="keyword">virtual</span> <a class="code" href="classtesting_1_1internal_1_1_param_iterator_interface.html#adf6ba49e6b54a6e3b15dbd5733988bef">~ParamIteratorInterface</a>() {}</div><div class="line"><a name="l10632"></a><span class="lineno">10632</span>  <span class="comment">// A pointer to the base generator instance.</span></div><div class="line"><a name="l10633"></a><span class="lineno">10633</span>  <span class="comment">// Used only for the purposes of iterator comparison</span></div><div class="line"><a name="l10634"></a><span class="lineno">10634</span>  <span class="comment">// to make sure that two iterators belong to the same generator.</span></div><div class="line"><a name="l10635"></a><span class="lineno">10635</span>  <span class="keyword">virtual</span> <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator_interface.html">ParamGeneratorInterface<T></a>* <a class="code" href="classtesting_1_1internal_1_1_param_iterator_interface.html#a17500953df75ecda1ace46c08ff731e9">BaseGenerator</a>() <span class="keyword">const</span> = 0;</div><div class="line"><a name="l10636"></a><span class="lineno">10636</span>  <span class="comment">// Advances iterator to point to the next element</span></div><div class="line"><a name="l10637"></a><span class="lineno">10637</span>  <span class="comment">// provided by the generator. The caller is responsible</span></div><div class="line"><a name="l10638"></a><span class="lineno">10638</span>  <span class="comment">// for not calling Advance() on an iterator equal to</span></div><div class="line"><a name="l10639"></a><span class="lineno">10639</span>  <span class="comment">// BaseGenerator()->End().</span></div><div class="line"><a name="l10640"></a><span class="lineno">10640</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classtesting_1_1internal_1_1_param_iterator_interface.html#a600dbd35fcb551463e379516a1abea48">Advance</a>() = 0;</div><div class="line"><a name="l10641"></a><span class="lineno">10641</span>  <span class="comment">// Clones the iterator object. Used for implementing copy semantics</span></div><div class="line"><a name="l10642"></a><span class="lineno">10642</span>  <span class="comment">// of ParamIterator<T>.</span></div><div class="line"><a name="l10643"></a><span class="lineno">10643</span>  <span class="keyword">virtual</span> <a class="code" href="classtesting_1_1internal_1_1_param_iterator_interface.html">ParamIteratorInterface</a>* <a class="code" href="classtesting_1_1internal_1_1_param_iterator_interface.html#a4998c23e27e2943d97546011aa35db80">Clone</a>() <span class="keyword">const</span> = 0;</div><div class="line"><a name="l10644"></a><span class="lineno">10644</span>  <span class="comment">// Dereferences the current iterator and provides (read-only) access</span></div><div class="line"><a name="l10645"></a><span class="lineno">10645</span>  <span class="comment">// to the pointed value. It is the caller's responsibility not to call</span></div><div class="line"><a name="l10646"></a><span class="lineno">10646</span>  <span class="comment">// Current() on an iterator equal to BaseGenerator()->End().</span></div><div class="line"><a name="l10647"></a><span class="lineno">10647</span>  <span class="comment">// Used for implementing ParamGenerator<T>::operator*().</span></div><div class="line"><a name="l10648"></a><span class="lineno">10648</span>  <span class="keyword">virtual</span> <span class="keyword">const</span> T* <a class="code" href="classtesting_1_1internal_1_1_param_iterator_interface.html#adfff808576d929085679c315b255af7e">Current</a>() <span class="keyword">const</span> = 0;</div><div class="line"><a name="l10649"></a><span class="lineno">10649</span>  <span class="comment">// Determines whether the given iterator and other point to the same</span></div><div class="line"><a name="l10650"></a><span class="lineno">10650</span>  <span class="comment">// element in the sequence generated by the generator.</span></div><div class="line"><a name="l10651"></a><span class="lineno">10651</span>  <span class="comment">// Used for implementing ParamGenerator<T>::operator==().</span></div><div class="line"><a name="l10652"></a><span class="lineno">10652</span>  <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classtesting_1_1internal_1_1_param_iterator_interface.html#a9d811697a752d46f7bd6a0082f9040a3">Equals</a>(<span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_iterator_interface.html">ParamIteratorInterface</a>& other) <span class="keyword">const</span> = 0;</div><div class="line"><a name="l10653"></a><span class="lineno">10653</span> };</div><div class="line"><a name="l10654"></a><span class="lineno">10654</span> </div><div class="line"><a name="l10655"></a><span class="lineno">10655</span> <span class="comment">// Class iterating over elements provided by an implementation of</span></div><div class="line"><a name="l10656"></a><span class="lineno">10656</span> <span class="comment">// ParamGeneratorInterface<T>. It wraps ParamIteratorInterface<T></span></div><div class="line"><a name="l10657"></a><span class="lineno">10657</span> <span class="comment">// and implements the const forward iterator concept.</span></div><div class="line"><a name="l10658"></a><span class="lineno">10658</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l10659"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_param_iterator.html">10659</a></span> <span class="keyword">class </span><a class="code" href="classtesting_1_1internal_1_1_param_iterator.html">ParamIterator</a> {</div><div class="line"><a name="l10660"></a><span class="lineno">10660</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l10661"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_param_iterator.html#a4afe3a68db0d0744753c8afe262e35df">10661</a></span>  <span class="keyword">typedef</span> T <a class="code" href="classtesting_1_1internal_1_1_param_iterator.html#a4afe3a68db0d0744753c8afe262e35df">value_type</a>;</div><div class="line"><a name="l10662"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_param_iterator.html#ac96f133ffa06fc0f9faff5a1c7954382">10662</a></span>  <span class="keyword">typedef</span> <span class="keyword">const</span> T& <a class="code" href="classtesting_1_1internal_1_1_param_iterator.html#ac96f133ffa06fc0f9faff5a1c7954382">reference</a>;</div><div class="line"><a name="l10663"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_param_iterator.html#a6c37240a04ba3fc4c56f6c413cf4771d">10663</a></span>  <span class="keyword">typedef</span> <a class="code" href="namespaceutl.html#a1b83655ba00b548af9b51f169c6c567a">ptrdiff_t</a> <a class="code" href="classtesting_1_1internal_1_1_param_iterator.html#a6c37240a04ba3fc4c56f6c413cf4771d">difference_type</a>;</div><div class="line"><a name="l10664"></a><span class="lineno">10664</span> </div><div class="line"><a name="l10665"></a><span class="lineno">10665</span>  <span class="comment">// ParamIterator assumes ownership of the impl_ pointer.</span></div><div class="line"><a name="l10666"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_param_iterator.html#aa10585055ee055e304703a3004f24f33">10666</a></span>  <a class="code" href="classtesting_1_1internal_1_1_param_iterator.html#aa10585055ee055e304703a3004f24f33">ParamIterator</a>(<span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_iterator.html">ParamIterator</a>& other) : impl_(other.impl_->Clone()) {}</div><div class="line"><a name="l10667"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_param_iterator.html#a8019f54ea1c66ca39ffdec47acfabfe6">10667</a></span>  <a class="code" href="classtesting_1_1internal_1_1_param_iterator.html">ParamIterator</a>& <a class="code" href="classtesting_1_1internal_1_1_param_iterator.html#a8019f54ea1c66ca39ffdec47acfabfe6">operator=</a>(<span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_iterator.html">ParamIterator</a>& other) {</div><div class="line"><a name="l10668"></a><span class="lineno">10668</span>  <span class="keywordflow">if</span> (<span class="keyword">this</span> != &other)</div><div class="line"><a name="l10669"></a><span class="lineno">10669</span>  impl_.reset(other.impl_->Clone());</div><div class="line"><a name="l10670"></a><span class="lineno">10670</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l10671"></a><span class="lineno">10671</span>  }</div><div class="line"><a name="l10672"></a><span class="lineno">10672</span> </div><div class="line"><a name="l10673"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_param_iterator.html#a52e5fdca7d497a0ed358051e36b8b491">10673</a></span>  <span class="keyword">const</span> T& <a class="code" href="classtesting_1_1internal_1_1_param_iterator.html#a52e5fdca7d497a0ed358051e36b8b491">operator*</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> *impl_->Current(); }</div><div class="line"><a name="l10674"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_param_iterator.html#aad035d35e8f0c1412854959a94d4887e">10674</a></span>  <span class="keyword">const</span> T* <a class="code" href="classtesting_1_1internal_1_1_param_iterator.html#aad035d35e8f0c1412854959a94d4887e">operator-></a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> impl_->Current(); }</div><div class="line"><a name="l10675"></a><span class="lineno">10675</span>  <span class="comment">// Prefix version of operator++.</span></div><div class="line"><a name="l10676"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_param_iterator.html#ab0922f2f554fb3beaf13c442da605e8d">10676</a></span>  <a class="code" href="classtesting_1_1internal_1_1_param_iterator.html">ParamIterator</a>& <a class="code" href="classtesting_1_1internal_1_1_param_iterator.html#ab0922f2f554fb3beaf13c442da605e8d">operator++</a>() {</div><div class="line"><a name="l10677"></a><span class="lineno">10677</span>  impl_->Advance();</div><div class="line"><a name="l10678"></a><span class="lineno">10678</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l10679"></a><span class="lineno">10679</span>  }</div><div class="line"><a name="l10680"></a><span class="lineno">10680</span>  <span class="comment">// Postfix version of operator++.</span></div><div class="line"><a name="l10681"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_param_iterator.html#af51e17827dd54977165937550c0fb030">10681</a></span>  <a class="code" href="classtesting_1_1internal_1_1_param_iterator.html">ParamIterator</a> <a class="code" href="classtesting_1_1internal_1_1_param_iterator.html#af51e17827dd54977165937550c0fb030">operator++</a>(<span class="keywordtype">int</span> <span class="comment">/*unused*/</span>) {</div><div class="line"><a name="l10682"></a><span class="lineno">10682</span>  <a class="code" href="classtesting_1_1internal_1_1_param_iterator_interface.html">ParamIteratorInterface<T></a>* clone = impl_->Clone();</div><div class="line"><a name="l10683"></a><span class="lineno">10683</span>  impl_->Advance();</div><div class="line"><a name="l10684"></a><span class="lineno">10684</span>  <span class="keywordflow">return</span> <a class="code" href="classtesting_1_1internal_1_1_param_iterator.html#aa10585055ee055e304703a3004f24f33">ParamIterator</a>(clone);</div><div class="line"><a name="l10685"></a><span class="lineno">10685</span>  }</div><div class="line"><a name="l10686"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_param_iterator.html#adc356b4789eb0c2a1b5b033c7874e5a6">10686</a></span>  <span class="keywordtype">bool</span> <a class="code" href="classtesting_1_1internal_1_1_param_iterator.html#adc356b4789eb0c2a1b5b033c7874e5a6">operator==</a>(<span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_iterator.html">ParamIterator</a>& other)<span class="keyword"> const </span>{</div><div class="line"><a name="l10687"></a><span class="lineno">10687</span>  <span class="keywordflow">return</span> impl_.get() == other.impl_.get() || impl_->Equals(*other.impl_);</div><div class="line"><a name="l10688"></a><span class="lineno">10688</span>  }</div><div class="line"><a name="l10689"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_param_iterator.html#a7a6aee04e8e44b5c8294929951cfac2b">10689</a></span>  <span class="keywordtype">bool</span> <a class="code" href="classtesting_1_1internal_1_1_param_iterator.html#a7a6aee04e8e44b5c8294929951cfac2b">operator!=</a>(<span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_iterator.html">ParamIterator</a>& other)<span class="keyword"> const </span>{</div><div class="line"><a name="l10690"></a><span class="lineno">10690</span>  <span class="keywordflow">return</span> !(*<span class="keyword">this</span> == other);</div><div class="line"><a name="l10691"></a><span class="lineno">10691</span>  }</div><div class="line"><a name="l10692"></a><span class="lineno">10692</span> </div><div class="line"><a name="l10693"></a><span class="lineno">10693</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l10694"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_param_iterator.html#ab73a355ae191f2f7eab54b65ca557714">10694</a></span>  <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator</a><T>;</div><div class="line"><a name="l10695"></a><span class="lineno">10695</span>  <span class="keyword">explicit</span> <a class="code" href="classtesting_1_1internal_1_1_param_iterator.html#aa10585055ee055e304703a3004f24f33">ParamIterator</a>(<a class="code" href="classtesting_1_1internal_1_1_param_iterator_interface.html">ParamIteratorInterface<T></a>* impl) : impl_(impl) {}</div><div class="line"><a name="l10696"></a><span class="lineno">10696</span>  std::unique_ptr<ParamIteratorInterface<T> > impl_;</div><div class="line"><a name="l10697"></a><span class="lineno">10697</span> };</div><div class="line"><a name="l10698"></a><span class="lineno">10698</span> </div><div class="line"><a name="l10699"></a><span class="lineno">10699</span> <span class="comment">// ParamGeneratorInterface<T> is the binary interface to access generators</span></div><div class="line"><a name="l10700"></a><span class="lineno">10700</span> <span class="comment">// defined in other translation units.</span></div><div class="line"><a name="l10701"></a><span class="lineno">10701</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l10702"></a><span class="lineno">10702</span> <span class="keyword">class </span>ParamGeneratorInterface {</div><div class="line"><a name="l10703"></a><span class="lineno">10703</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l10704"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_param_generator_interface.html#ab33d2ea424c50beaf503cb125b3cd003">10704</a></span>  <span class="keyword">typedef</span> T <a class="code" href="classtesting_1_1internal_1_1_param_generator_interface.html#ab33d2ea424c50beaf503cb125b3cd003">ParamType</a>;</div><div class="line"><a name="l10705"></a><span class="lineno">10705</span> </div><div class="line"><a name="l10706"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_param_generator_interface.html#ac2767cb9ad2e292e291c4903323c6eff">10706</a></span>  <span class="keyword">virtual</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator_interface.html#ac2767cb9ad2e292e291c4903323c6eff">~ParamGeneratorInterface</a>() {}</div><div class="line"><a name="l10707"></a><span class="lineno">10707</span> </div><div class="line"><a name="l10708"></a><span class="lineno">10708</span>  <span class="comment">// Generator interface definition</span></div><div class="line"><a name="l10709"></a><span class="lineno">10709</span>  <span class="keyword">virtual</span> <a class="code" href="classtesting_1_1internal_1_1_param_iterator_interface.html">ParamIteratorInterface<T></a>* <a class="code" href="classtesting_1_1internal_1_1_param_generator_interface.html#ae1de83b16fe9a53c67778a026c6a9569">Begin</a>() <span class="keyword">const</span> = 0;</div><div class="line"><a name="l10710"></a><span class="lineno">10710</span>  <span class="keyword">virtual</span> <a class="code" href="classtesting_1_1internal_1_1_param_iterator_interface.html">ParamIteratorInterface<T></a>* <a class="code" href="classtesting_1_1internal_1_1_param_generator_interface.html#afa7211b74990e11d3fc7ad4e7113da4f">End</a>() <span class="keyword">const</span> = 0;</div><div class="line"><a name="l10711"></a><span class="lineno">10711</span> };</div><div class="line"><a name="l10712"></a><span class="lineno">10712</span> </div><div class="line"><a name="l10713"></a><span class="lineno">10713</span> <span class="comment">// Wraps ParamGeneratorInterface<T> and provides general generator syntax</span></div><div class="line"><a name="l10714"></a><span class="lineno">10714</span> <span class="comment">// compatible with the STL Container concept.</span></div><div class="line"><a name="l10715"></a><span class="lineno">10715</span> <span class="comment">// This class implements copy initialization semantics and the contained</span></div><div class="line"><a name="l10716"></a><span class="lineno">10716</span> <span class="comment">// ParamGeneratorInterface<T> instance is shared among all copies</span></div><div class="line"><a name="l10717"></a><span class="lineno">10717</span> <span class="comment">// of the original object. This is possible because that instance is immutable.</span></div><div class="line"><a name="l10718"></a><span class="lineno">10718</span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div><div class="line"><a name="l10719"></a><span class="lineno">10719</span> <span class="keyword">class </span>ParamGenerator {</div><div class="line"><a name="l10720"></a><span class="lineno">10720</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l10721"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">10721</a></span>  <span class="keyword">typedef</span> <a class="code" href="classtesting_1_1internal_1_1_param_iterator.html">ParamIterator<T></a> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">iterator</a>;</div><div class="line"><a name="l10722"></a><span class="lineno">10722</span> </div><div class="line"><a name="l10723"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_param_generator.html#a6b017d4d030927714d495ee95ae92fbc">10723</a></span>  <span class="keyword">explicit</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a6b017d4d030927714d495ee95ae92fbc">ParamGenerator</a>(<a class="code" href="classtesting_1_1internal_1_1_param_generator_interface.html">ParamGeneratorInterface<T></a>* impl) : impl_(impl) {}</div><div class="line"><a name="l10724"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_param_generator.html#a5891d25c31919b3099489f8bbcd58b5e">10724</a></span>  <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a5891d25c31919b3099489f8bbcd58b5e">ParamGenerator</a>(<span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator</a>& other) : impl_(other.impl_) {}</div><div class="line"><a name="l10725"></a><span class="lineno">10725</span> </div><div class="line"><a name="l10726"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_param_generator.html#a590a03c6e0a3a3ac6279943ad1f01dc8">10726</a></span>  <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator</a>& <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a590a03c6e0a3a3ac6279943ad1f01dc8">operator=</a>(<span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator</a>& other) {</div><div class="line"><a name="l10727"></a><span class="lineno">10727</span>  impl_ = other.impl_;</div><div class="line"><a name="l10728"></a><span class="lineno">10728</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l10729"></a><span class="lineno">10729</span>  }</div><div class="line"><a name="l10730"></a><span class="lineno">10730</span> </div><div class="line"><a name="l10731"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_param_generator.html#a14e735c8bd113556ae905a560cd2d607">10731</a></span>  <a class="code" href="classtesting_1_1internal_1_1_param_iterator.html">iterator</a> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a14e735c8bd113556ae905a560cd2d607">begin</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">iterator</a>(impl_->Begin()); }</div><div class="line"><a name="l10732"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_param_generator.html#aaf8f75df1099a07ff771a550b48f9fbe">10732</a></span>  <a class="code" href="classtesting_1_1internal_1_1_param_iterator.html">iterator</a> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#aaf8f75df1099a07ff771a550b48f9fbe">end</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">iterator</a>(impl_->End()); }</div><div class="line"><a name="l10733"></a><span class="lineno">10733</span> </div><div class="line"><a name="l10734"></a><span class="lineno">10734</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l10735"></a><span class="lineno">10735</span>  std::shared_ptr<const ParamGeneratorInterface<T> > impl_;</div><div class="line"><a name="l10736"></a><span class="lineno">10736</span> };</div><div class="line"><a name="l10737"></a><span class="lineno">10737</span> </div><div class="line"><a name="l10738"></a><span class="lineno">10738</span> <span class="comment">// Generates values from a range of two comparable values. Can be used to</span></div><div class="line"><a name="l10739"></a><span class="lineno">10739</span> <span class="comment">// generate sequences of user-defined types that implement operator+() and</span></div><div class="line"><a name="l10740"></a><span class="lineno">10740</span> <span class="comment">// operator<().</span></div><div class="line"><a name="l10741"></a><span class="lineno">10741</span> <span class="comment">// This class is used in the Range() function.</span></div><div class="line"><a name="l10742"></a><span class="lineno">10742</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T, <span class="keyword">typename</span> IncrementT></div><div class="line"><a name="l10743"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_range_generator.html">10743</a></span> <span class="keyword">class </span><a class="code" href="classtesting_1_1internal_1_1_range_generator.html">RangeGenerator</a> : <span class="keyword">public</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator_interface.html">ParamGeneratorInterface</a><T> {</div><div class="line"><a name="l10744"></a><span class="lineno">10744</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l10745"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_range_generator.html#a5b3b83223b9cada3569bcee729e0fdf3">10745</a></span>  <a class="code" href="classtesting_1_1internal_1_1_range_generator.html#a5b3b83223b9cada3569bcee729e0fdf3">RangeGenerator</a>(T begin, T end, IncrementT step)</div><div class="line"><a name="l10746"></a><span class="lineno">10746</span>  : begin_(begin), end_(end),</div><div class="line"><a name="l10747"></a><span class="lineno">10747</span>  step_(step), end_index_(CalculateEndIndex(begin, end, step)) {}</div><div class="line"><a name="l10748"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_range_generator.html#a72f6e6f65f1dd3f86672f6ed47df74ef">10748</a></span>  <a class="code" href="classtesting_1_1internal_1_1_range_generator.html#a72f6e6f65f1dd3f86672f6ed47df74ef">~RangeGenerator</a>()<span class="keyword"> override </span>{}</div><div class="line"><a name="l10749"></a><span class="lineno">10749</span> </div><div class="line"><a name="l10750"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_range_generator.html#a502913fbcf14e89d5765dfb44f3c1295">10750</a></span>  <a class="code" href="classtesting_1_1internal_1_1_param_iterator_interface.html">ParamIteratorInterface<T></a>* <a class="code" href="classtesting_1_1internal_1_1_range_generator.html#a502913fbcf14e89d5765dfb44f3c1295">Begin</a>()<span class="keyword"> const override </span>{</div><div class="line"><a name="l10751"></a><span class="lineno">10751</span>  <span class="keywordflow">return</span> <span class="keyword">new</span> Iterator(<span class="keyword">this</span>, begin_, 0, step_);</div><div class="line"><a name="l10752"></a><span class="lineno">10752</span>  }</div><div class="line"><a name="l10753"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_range_generator.html#ac112ca69567b9c47bf14554e0473e1e2">10753</a></span>  <a class="code" href="classtesting_1_1internal_1_1_param_iterator_interface.html">ParamIteratorInterface<T></a>* <a class="code" href="classtesting_1_1internal_1_1_range_generator.html#ac112ca69567b9c47bf14554e0473e1e2">End</a>()<span class="keyword"> const override </span>{</div><div class="line"><a name="l10754"></a><span class="lineno">10754</span>  <span class="keywordflow">return</span> <span class="keyword">new</span> Iterator(<span class="keyword">this</span>, end_, end_index_, step_);</div><div class="line"><a name="l10755"></a><span class="lineno">10755</span>  }</div><div class="line"><a name="l10756"></a><span class="lineno">10756</span> </div><div class="line"><a name="l10757"></a><span class="lineno">10757</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l10758"></a><span class="lineno">10758</span>  <span class="keyword">class </span>Iterator : <span class="keyword">public</span> <a class="code" href="classtesting_1_1internal_1_1_param_iterator_interface.html">ParamIteratorInterface</a><T> {</div><div class="line"><a name="l10759"></a><span class="lineno">10759</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l10760"></a><span class="lineno">10760</span>  Iterator(<span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator_interface.html">ParamGeneratorInterface<T></a>* base, T value, <span class="keywordtype">int</span> index,</div><div class="line"><a name="l10761"></a><span class="lineno">10761</span>  IncrementT step)</div><div class="line"><a name="l10762"></a><span class="lineno">10762</span>  : base_(base), value_(value), <a class="code" href="namespaceutl_1_1meta.html#a5b7d36b9e568b81f2df897d56dc23b64">index_</a>(index), step_(step) {}</div><div class="line"><a name="l10763"></a><span class="lineno">10763</span>  ~Iterator()<span class="keyword"> override </span>{}</div><div class="line"><a name="l10764"></a><span class="lineno">10764</span> </div><div class="line"><a name="l10765"></a><span class="lineno">10765</span>  <span class="keyword">const</span> ParamGeneratorInterface<T>* BaseGenerator()<span class="keyword"> const override </span>{</div><div class="line"><a name="l10766"></a><span class="lineno">10766</span>  <span class="keywordflow">return</span> base_;</div><div class="line"><a name="l10767"></a><span class="lineno">10767</span>  }</div><div class="line"><a name="l10768"></a><span class="lineno">10768</span>  <span class="keywordtype">void</span> Advance()<span class="keyword"> override </span>{</div><div class="line"><a name="l10769"></a><span class="lineno">10769</span>  value_ = <span class="keyword">static_cast<</span>T<span class="keyword">></span>(value_ + step_);</div><div class="line"><a name="l10770"></a><span class="lineno">10770</span>  <a class="code" href="namespaceutl_1_1meta.html#a5b7d36b9e568b81f2df897d56dc23b64">index_</a>++;</div><div class="line"><a name="l10771"></a><span class="lineno">10771</span>  }</div><div class="line"><a name="l10772"></a><span class="lineno">10772</span>  ParamIteratorInterface<T>* Clone()<span class="keyword"> const override </span>{</div><div class="line"><a name="l10773"></a><span class="lineno">10773</span>  <span class="keywordflow">return</span> <span class="keyword">new</span> Iterator(*<span class="keyword">this</span>);</div><div class="line"><a name="l10774"></a><span class="lineno">10774</span>  }</div><div class="line"><a name="l10775"></a><span class="lineno">10775</span>  <span class="keyword">const</span> T* Current()<span class="keyword"> const override </span>{ <span class="keywordflow">return</span> &value_; }</div><div class="line"><a name="l10776"></a><span class="lineno">10776</span>  <span class="keywordtype">bool</span> Equals(<span class="keyword">const</span> ParamIteratorInterface<T>& other)<span class="keyword"> const override </span>{</div><div class="line"><a name="l10777"></a><span class="lineno">10777</span>  <span class="comment">// Having the same base generator guarantees that the other</span></div><div class="line"><a name="l10778"></a><span class="lineno">10778</span>  <span class="comment">// iterator is of the same type and we can downcast.</span></div><div class="line"><a name="l10779"></a><span class="lineno">10779</span>  <a class="code" href="gtest_8h.html#ab54343f0a36dc4cb0ce8a478dd7847b8">GTEST_CHECK_</a>(BaseGenerator() == other.BaseGenerator())</div><div class="line"><a name="l10780"></a><span class="lineno">10780</span>  << <span class="stringliteral">"The program attempted to compare iterators "</span></div><div class="line"><a name="l10781"></a><span class="lineno">10781</span>  << <span class="stringliteral">"from different generators."</span> << std::endl;</div><div class="line"><a name="l10782"></a><span class="lineno">10782</span>  <span class="keyword">const</span> <span class="keywordtype">int</span> other_index =</div><div class="line"><a name="l10783"></a><span class="lineno">10783</span>  CheckedDowncastToActualType<const Iterator>(&other)-><a class="code" href="namespaceutl_1_1meta.html#a5b7d36b9e568b81f2df897d56dc23b64">index_</a>;</div><div class="line"><a name="l10784"></a><span class="lineno">10784</span>  <span class="keywordflow">return</span> <a class="code" href="namespaceutl_1_1meta.html#a5b7d36b9e568b81f2df897d56dc23b64">index_</a> == other_index;</div><div class="line"><a name="l10785"></a><span class="lineno">10785</span>  }</div><div class="line"><a name="l10786"></a><span class="lineno">10786</span> </div><div class="line"><a name="l10787"></a><span class="lineno">10787</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l10788"></a><span class="lineno">10788</span>  Iterator(<span class="keyword">const</span> Iterator& other)</div><div class="line"><a name="l10789"></a><span class="lineno">10789</span>  : ParamIteratorInterface<T>(),</div><div class="line"><a name="l10790"></a><span class="lineno">10790</span>  base_(other.base_), value_(other.value_), <a class="code" href="namespaceutl_1_1meta.html#a5b7d36b9e568b81f2df897d56dc23b64">index_</a>(other.<a class="code" href="namespaceutl_1_1meta.html#a5b7d36b9e568b81f2df897d56dc23b64">index_</a>),</div><div class="line"><a name="l10791"></a><span class="lineno">10791</span>  step_(other.step_) {}</div><div class="line"><a name="l10792"></a><span class="lineno">10792</span> </div><div class="line"><a name="l10793"></a><span class="lineno">10793</span>  <span class="comment">// No implementation - assignment is unsupported.</span></div><div class="line"><a name="l10794"></a><span class="lineno">10794</span>  <span class="keywordtype">void</span> operator=(<span class="keyword">const</span> Iterator& other);</div><div class="line"><a name="l10795"></a><span class="lineno">10795</span> </div><div class="line"><a name="l10796"></a><span class="lineno">10796</span>  <span class="keyword">const</span> ParamGeneratorInterface<T>* <span class="keyword">const</span> base_;</div><div class="line"><a name="l10797"></a><span class="lineno">10797</span>  T value_;</div><div class="line"><a name="l10798"></a><span class="lineno">10798</span>  <span class="keywordtype">int</span> <a class="code" href="namespaceutl_1_1meta.html#a5b7d36b9e568b81f2df897d56dc23b64">index_</a>;</div><div class="line"><a name="l10799"></a><span class="lineno">10799</span>  <span class="keyword">const</span> IncrementT step_;</div><div class="line"><a name="l10800"></a><span class="lineno">10800</span>  }; <span class="comment">// class RangeGenerator::Iterator</span></div><div class="line"><a name="l10801"></a><span class="lineno">10801</span> </div><div class="line"><a name="l10802"></a><span class="lineno">10802</span>  <span class="keyword">static</span> <span class="keywordtype">int</span> CalculateEndIndex(<span class="keyword">const</span> T& begin,</div><div class="line"><a name="l10803"></a><span class="lineno">10803</span>  <span class="keyword">const</span> T& end,</div><div class="line"><a name="l10804"></a><span class="lineno">10804</span>  <span class="keyword">const</span> IncrementT& step) {</div><div class="line"><a name="l10805"></a><span class="lineno">10805</span>  <span class="keywordtype">int</span> end_index = 0;</div><div class="line"><a name="l10806"></a><span class="lineno">10806</span>  <span class="keywordflow">for</span> (T i = begin; i < end; i = static_cast<T>(i + step))</div><div class="line"><a name="l10807"></a><span class="lineno">10807</span>  end_index++;</div><div class="line"><a name="l10808"></a><span class="lineno">10808</span>  <span class="keywordflow">return</span> end_index;</div><div class="line"><a name="l10809"></a><span class="lineno">10809</span>  }</div><div class="line"><a name="l10810"></a><span class="lineno">10810</span> </div><div class="line"><a name="l10811"></a><span class="lineno">10811</span>  <span class="comment">// No implementation - assignment is unsupported.</span></div><div class="line"><a name="l10812"></a><span class="lineno">10812</span>  <span class="keywordtype">void</span> operator=(<span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_range_generator.html#a5b3b83223b9cada3569bcee729e0fdf3">RangeGenerator</a>& other);</div><div class="line"><a name="l10813"></a><span class="lineno">10813</span> </div><div class="line"><a name="l10814"></a><span class="lineno">10814</span>  <span class="keyword">const</span> T begin_;</div><div class="line"><a name="l10815"></a><span class="lineno">10815</span>  <span class="keyword">const</span> T end_;</div><div class="line"><a name="l10816"></a><span class="lineno">10816</span>  <span class="keyword">const</span> IncrementT step_;</div><div class="line"><a name="l10817"></a><span class="lineno">10817</span>  <span class="comment">// The index for the end() iterator. All the elements in the generated</span></div><div class="line"><a name="l10818"></a><span class="lineno">10818</span>  <span class="comment">// sequence are indexed (0-based) to aid iterator comparison.</span></div><div class="line"><a name="l10819"></a><span class="lineno">10819</span>  <span class="keyword">const</span> <span class="keywordtype">int</span> end_index_;</div><div class="line"><a name="l10820"></a><span class="lineno">10820</span> }; <span class="comment">// class RangeGenerator</span></div><div class="line"><a name="l10821"></a><span class="lineno">10821</span> </div><div class="line"><a name="l10822"></a><span class="lineno">10822</span> </div><div class="line"><a name="l10823"></a><span class="lineno">10823</span> <span class="comment">// Generates values from a pair of STL-style iterators. Used in the</span></div><div class="line"><a name="l10824"></a><span class="lineno">10824</span> <span class="comment">// ValuesIn() function. The elements are copied from the source range</span></div><div class="line"><a name="l10825"></a><span class="lineno">10825</span> <span class="comment">// since the source can be located on the stack, and the generator</span></div><div class="line"><a name="l10826"></a><span class="lineno">10826</span> <span class="comment">// is likely to persist beyond that stack frame.</span></div><div class="line"><a name="l10827"></a><span class="lineno">10827</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l10828"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_values_in_iterator_range_generator.html">10828</a></span> <span class="keyword">class </span><a class="code" href="classtesting_1_1internal_1_1_values_in_iterator_range_generator.html">ValuesInIteratorRangeGenerator</a> : <span class="keyword">public</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator_interface.html">ParamGeneratorInterface</a><T> {</div><div class="line"><a name="l10829"></a><span class="lineno">10829</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l10830"></a><span class="lineno">10830</span>  <span class="keyword">template</span> <<span class="keyword">typename</span> ForwardIterator></div><div class="line"><a name="l10831"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_values_in_iterator_range_generator.html#a8b30f6028bc5739bbd7c24b0f0e409f7">10831</a></span>  <a class="code" href="classtesting_1_1internal_1_1_values_in_iterator_range_generator.html#a8b30f6028bc5739bbd7c24b0f0e409f7">ValuesInIteratorRangeGenerator</a>(ForwardIterator begin, ForwardIterator end)</div><div class="line"><a name="l10832"></a><span class="lineno">10832</span>  : container_(begin, end) {}</div><div class="line"><a name="l10833"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_values_in_iterator_range_generator.html#a9070d5b79803164625d3aa77a1659e9f">10833</a></span>  <a class="code" href="classtesting_1_1internal_1_1_values_in_iterator_range_generator.html#a9070d5b79803164625d3aa77a1659e9f">~ValuesInIteratorRangeGenerator</a>()<span class="keyword"> override </span>{}</div><div class="line"><a name="l10834"></a><span class="lineno">10834</span> </div><div class="line"><a name="l10835"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_values_in_iterator_range_generator.html#a71ffed6f1deba05f11c9d45f6ab5b85d">10835</a></span>  <a class="code" href="classtesting_1_1internal_1_1_param_iterator_interface.html">ParamIteratorInterface<T></a>* <a class="code" href="classtesting_1_1internal_1_1_values_in_iterator_range_generator.html#a71ffed6f1deba05f11c9d45f6ab5b85d">Begin</a>()<span class="keyword"> const override </span>{</div><div class="line"><a name="l10836"></a><span class="lineno">10836</span>  <span class="keywordflow">return</span> <span class="keyword">new</span> Iterator(<span class="keyword">this</span>, container_.begin());</div><div class="line"><a name="l10837"></a><span class="lineno">10837</span>  }</div><div class="line"><a name="l10838"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_values_in_iterator_range_generator.html#a298cfb66a90b1a39c0cea3ca7ae1ece1">10838</a></span>  <a class="code" href="classtesting_1_1internal_1_1_param_iterator_interface.html">ParamIteratorInterface<T></a>* <a class="code" href="classtesting_1_1internal_1_1_values_in_iterator_range_generator.html#a298cfb66a90b1a39c0cea3ca7ae1ece1">End</a>()<span class="keyword"> const override </span>{</div><div class="line"><a name="l10839"></a><span class="lineno">10839</span>  <span class="keywordflow">return</span> <span class="keyword">new</span> Iterator(<span class="keyword">this</span>, container_.end());</div><div class="line"><a name="l10840"></a><span class="lineno">10840</span>  }</div><div class="line"><a name="l10841"></a><span class="lineno">10841</span> </div><div class="line"><a name="l10842"></a><span class="lineno">10842</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l10843"></a><span class="lineno">10843</span>  <span class="keyword">typedef</span> typename ::std::vector<T> ContainerType;</div><div class="line"><a name="l10844"></a><span class="lineno">10844</span> </div><div class="line"><a name="l10845"></a><span class="lineno">10845</span>  <span class="keyword">class </span>Iterator : <span class="keyword">public</span> <a class="code" href="classtesting_1_1internal_1_1_param_iterator_interface.html">ParamIteratorInterface</a><T> {</div><div class="line"><a name="l10846"></a><span class="lineno">10846</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l10847"></a><span class="lineno">10847</span>  Iterator(<span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator_interface.html">ParamGeneratorInterface<T></a>* base,</div><div class="line"><a name="l10848"></a><span class="lineno">10848</span>  <span class="keyword">typename</span> ContainerType::const_iterator iterator)</div><div class="line"><a name="l10849"></a><span class="lineno">10849</span>  : base_(base), iterator_(iterator) {}</div><div class="line"><a name="l10850"></a><span class="lineno">10850</span>  ~Iterator()<span class="keyword"> override </span>{}</div><div class="line"><a name="l10851"></a><span class="lineno">10851</span> </div><div class="line"><a name="l10852"></a><span class="lineno">10852</span>  <span class="keyword">const</span> ParamGeneratorInterface<T>* BaseGenerator()<span class="keyword"> const override </span>{</div><div class="line"><a name="l10853"></a><span class="lineno">10853</span>  <span class="keywordflow">return</span> base_;</div><div class="line"><a name="l10854"></a><span class="lineno">10854</span>  }</div><div class="line"><a name="l10855"></a><span class="lineno">10855</span>  <span class="keywordtype">void</span> Advance()<span class="keyword"> override </span>{</div><div class="line"><a name="l10856"></a><span class="lineno">10856</span>  ++iterator_;</div><div class="line"><a name="l10857"></a><span class="lineno">10857</span>  value_.reset();</div><div class="line"><a name="l10858"></a><span class="lineno">10858</span>  }</div><div class="line"><a name="l10859"></a><span class="lineno">10859</span>  ParamIteratorInterface<T>* Clone()<span class="keyword"> const override </span>{</div><div class="line"><a name="l10860"></a><span class="lineno">10860</span>  <span class="keywordflow">return</span> <span class="keyword">new</span> Iterator(*<span class="keyword">this</span>);</div><div class="line"><a name="l10861"></a><span class="lineno">10861</span>  }</div><div class="line"><a name="l10862"></a><span class="lineno">10862</span>  <span class="comment">// We need to use cached value referenced by iterator_ because *iterator_</span></div><div class="line"><a name="l10863"></a><span class="lineno">10863</span>  <span class="comment">// can return a temporary object (and of type other then T), so just</span></div><div class="line"><a name="l10864"></a><span class="lineno">10864</span>  <span class="comment">// having "return &*iterator_;" doesn't work.</span></div><div class="line"><a name="l10865"></a><span class="lineno">10865</span>  <span class="comment">// value_ is updated here and not in Advance() because Advance()</span></div><div class="line"><a name="l10866"></a><span class="lineno">10866</span>  <span class="comment">// can advance iterator_ beyond the end of the range, and we cannot</span></div><div class="line"><a name="l10867"></a><span class="lineno">10867</span>  <span class="comment">// detect that fact. The client code, on the other hand, is</span></div><div class="line"><a name="l10868"></a><span class="lineno">10868</span>  <span class="comment">// responsible for not calling Current() on an out-of-range iterator.</span></div><div class="line"><a name="l10869"></a><span class="lineno">10869</span>  <span class="keyword">const</span> T* Current()<span class="keyword"> const override </span>{</div><div class="line"><a name="l10870"></a><span class="lineno">10870</span>  <span class="keywordflow">if</span> (value_.get() == <span class="keyword">nullptr</span>) value_.reset(<span class="keyword">new</span> T(*iterator_));</div><div class="line"><a name="l10871"></a><span class="lineno">10871</span>  <span class="keywordflow">return</span> value_.get();</div><div class="line"><a name="l10872"></a><span class="lineno">10872</span>  }</div><div class="line"><a name="l10873"></a><span class="lineno">10873</span>  <span class="keywordtype">bool</span> Equals(<span class="keyword">const</span> ParamIteratorInterface<T>& other)<span class="keyword"> const override </span>{</div><div class="line"><a name="l10874"></a><span class="lineno">10874</span>  <span class="comment">// Having the same base generator guarantees that the other</span></div><div class="line"><a name="l10875"></a><span class="lineno">10875</span>  <span class="comment">// iterator is of the same type and we can downcast.</span></div><div class="line"><a name="l10876"></a><span class="lineno">10876</span>  <a class="code" href="gtest_8h.html#ab54343f0a36dc4cb0ce8a478dd7847b8">GTEST_CHECK_</a>(BaseGenerator() == other.BaseGenerator())</div><div class="line"><a name="l10877"></a><span class="lineno">10877</span>  << <span class="stringliteral">"The program attempted to compare iterators "</span></div><div class="line"><a name="l10878"></a><span class="lineno">10878</span>  << <span class="stringliteral">"from different generators."</span> << std::endl;</div><div class="line"><a name="l10879"></a><span class="lineno">10879</span>  <span class="keywordflow">return</span> iterator_ ==</div><div class="line"><a name="l10880"></a><span class="lineno">10880</span>  CheckedDowncastToActualType<const Iterator>(&other)->iterator_;</div><div class="line"><a name="l10881"></a><span class="lineno">10881</span>  }</div><div class="line"><a name="l10882"></a><span class="lineno">10882</span> </div><div class="line"><a name="l10883"></a><span class="lineno">10883</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l10884"></a><span class="lineno">10884</span>  Iterator(<span class="keyword">const</span> Iterator& other)</div><div class="line"><a name="l10885"></a><span class="lineno">10885</span>  <span class="comment">// The explicit constructor call suppresses a false warning</span></div><div class="line"><a name="l10886"></a><span class="lineno">10886</span>  <span class="comment">// emitted by gcc when supplied with the -Wextra option.</span></div><div class="line"><a name="l10887"></a><span class="lineno">10887</span>  : ParamIteratorInterface<T>(),</div><div class="line"><a name="l10888"></a><span class="lineno">10888</span>  base_(other.base_),</div><div class="line"><a name="l10889"></a><span class="lineno">10889</span>  iterator_(other.iterator_) {}</div><div class="line"><a name="l10890"></a><span class="lineno">10890</span> </div><div class="line"><a name="l10891"></a><span class="lineno">10891</span>  <span class="keyword">const</span> ParamGeneratorInterface<T>* <span class="keyword">const</span> base_;</div><div class="line"><a name="l10892"></a><span class="lineno">10892</span>  <span class="keyword">typename</span> ContainerType::const_iterator iterator_;</div><div class="line"><a name="l10893"></a><span class="lineno">10893</span>  <span class="comment">// A cached value of *iterator_. We keep it here to allow access by</span></div><div class="line"><a name="l10894"></a><span class="lineno">10894</span>  <span class="comment">// pointer in the wrapping iterator's operator->().</span></div><div class="line"><a name="l10895"></a><span class="lineno">10895</span>  <span class="comment">// value_ needs to be mutable to be accessed in Current().</span></div><div class="line"><a name="l10896"></a><span class="lineno">10896</span>  <span class="comment">// Use of std::unique_ptr helps manage cached value's lifetime,</span></div><div class="line"><a name="l10897"></a><span class="lineno">10897</span>  <span class="comment">// which is bound by the lifespan of the iterator itself.</span></div><div class="line"><a name="l10898"></a><span class="lineno">10898</span>  <span class="keyword">mutable</span> std::unique_ptr<const T> value_;</div><div class="line"><a name="l10899"></a><span class="lineno">10899</span>  }; <span class="comment">// class ValuesInIteratorRangeGenerator::Iterator</span></div><div class="line"><a name="l10900"></a><span class="lineno">10900</span> </div><div class="line"><a name="l10901"></a><span class="lineno">10901</span>  <span class="comment">// No implementation - assignment is unsupported.</span></div><div class="line"><a name="l10902"></a><span class="lineno">10902</span>  <span class="keywordtype">void</span> operator=(<span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_values_in_iterator_range_generator.html#a8b30f6028bc5739bbd7c24b0f0e409f7">ValuesInIteratorRangeGenerator</a>& other);</div><div class="line"><a name="l10903"></a><span class="lineno">10903</span> </div><div class="line"><a name="l10904"></a><span class="lineno">10904</span>  <span class="keyword">const</span> ContainerType container_;</div><div class="line"><a name="l10905"></a><span class="lineno">10905</span> }; <span class="comment">// class ValuesInIteratorRangeGenerator</span></div><div class="line"><a name="l10906"></a><span class="lineno">10906</span> </div><div class="line"><a name="l10907"></a><span class="lineno">10907</span> <span class="comment">// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.</span></div><div class="line"><a name="l10908"></a><span class="lineno">10908</span> <span class="comment">//</span></div><div class="line"><a name="l10909"></a><span class="lineno">10909</span> <span class="comment">// Default parameterized test name generator, returns a string containing the</span></div><div class="line"><a name="l10910"></a><span class="lineno">10910</span> <span class="comment">// integer test parameter index.</span></div><div class="line"><a name="l10911"></a><span class="lineno">10911</span> <span class="keyword">template</span> <<span class="keyword">class</span> ParamType></div><div class="line"><a name="l10912"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#a954ec4a8a932dac7743e77e459ffefdc">10912</a></span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a> <a class="code" href="namespacetesting_1_1internal.html#a954ec4a8a932dac7743e77e459ffefdc">DefaultParamName</a>(<span class="keyword">const</span> <a class="code" href="structtesting_1_1_test_param_info.html">TestParamInfo<ParamType></a>& info) {</div><div class="line"><a name="l10913"></a><span class="lineno">10913</span>  <a class="code" href="classtesting_1_1_message.html">Message</a> name_stream;</div><div class="line"><a name="l10914"></a><span class="lineno">10914</span>  name_stream << info.<a class="code" href="structtesting_1_1_test_param_info.html#ad4d7bc02cbcc571eb3c1d2ec3ba5bb53">index</a>;</div><div class="line"><a name="l10915"></a><span class="lineno">10915</span>  <span class="keywordflow">return</span> name_stream.<a class="code" href="classtesting_1_1_message.html#a2cdc4df62bdcc9df37651a1cf527704e">GetString</a>();</div><div class="line"><a name="l10916"></a><span class="lineno">10916</span> }</div><div class="line"><a name="l10917"></a><span class="lineno">10917</span> </div><div class="line"><a name="l10918"></a><span class="lineno">10918</span> <span class="comment">// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.</span></div><div class="line"><a name="l10919"></a><span class="lineno">10919</span> <span class="comment">//</span></div><div class="line"><a name="l10920"></a><span class="lineno">10920</span> <span class="comment">// Parameterized test name overload helpers, which help the</span></div><div class="line"><a name="l10921"></a><span class="lineno">10921</span> <span class="comment">// INSTANTIATE_TEST_SUITE_P macro choose between the default parameterized</span></div><div class="line"><a name="l10922"></a><span class="lineno">10922</span> <span class="comment">// test name generator and user param name generator.</span></div><div class="line"><a name="l10923"></a><span class="lineno">10923</span> <span class="keyword">template</span> <<span class="keyword">class</span> ParamType, <span class="keyword">class</span> ParamNameGenFunctor></div><div class="line"><a name="l10924"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#abc0f0626877188afba6ad122d502f088">10924</a></span> ParamNameGenFunctor <a class="code" href="namespacetesting_1_1internal.html#abc0f0626877188afba6ad122d502f088">GetParamNameGen</a>(ParamNameGenFunctor func) {</div><div class="line"><a name="l10925"></a><span class="lineno">10925</span>  <span class="keywordflow">return</span> func;</div><div class="line"><a name="l10926"></a><span class="lineno">10926</span> }</div><div class="line"><a name="l10927"></a><span class="lineno">10927</span> </div><div class="line"><a name="l10928"></a><span class="lineno">10928</span> <span class="keyword">template</span> <<span class="keyword">class</span> ParamType></div><div class="line"><a name="l10929"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_param_name_gen_func.html">10929</a></span> <span class="keyword">struct </span><a class="code" href="structtesting_1_1internal_1_1_param_name_gen_func.html">ParamNameGenFunc</a> {</div><div class="line"><a name="l10930"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1_param_name_gen_func.html#adf1ce5df22a930ae715082862d72590f">10930</a></span>  <span class="keyword">typedef</span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a> <a class="code" href="structtesting_1_1internal_1_1_param_name_gen_func.html#adf1ce5df22a930ae715082862d72590f">Type</a>(<span class="keyword">const</span> <a class="code" href="structtesting_1_1_test_param_info.html">TestParamInfo<ParamType></a>&);</div><div class="line"><a name="l10931"></a><span class="lineno">10931</span> };</div><div class="line"><a name="l10932"></a><span class="lineno">10932</span> </div><div class="line"><a name="l10933"></a><span class="lineno">10933</span> <span class="keyword">template</span> <<span class="keyword">class</span> ParamType></div><div class="line"><a name="l10934"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#a27d6ea7d401e877cb0fbddf4206ebbe4">10934</a></span> <span class="keyword">typename</span> <a class="code" href="structtesting_1_1internal_1_1_param_name_gen_func.html">ParamNameGenFunc<ParamType>::Type</a> *<a class="code" href="namespacetesting_1_1internal.html#abc0f0626877188afba6ad122d502f088">GetParamNameGen</a>() {</div><div class="line"><a name="l10935"></a><span class="lineno">10935</span>  <span class="keywordflow">return</span> &<a class="code" href="namespacetesting_1_1internal.html#a954ec4a8a932dac7743e77e459ffefdc">DefaultParamName</a>;</div><div class="line"><a name="l10936"></a><span class="lineno">10936</span> }</div><div class="line"><a name="l10937"></a><span class="lineno">10937</span> </div><div class="line"><a name="l10938"></a><span class="lineno">10938</span> <span class="comment">// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.</span></div><div class="line"><a name="l10939"></a><span class="lineno">10939</span> <span class="comment">//</span></div><div class="line"><a name="l10940"></a><span class="lineno">10940</span> <span class="comment">// Stores a parameter value and later creates tests parameterized with that</span></div><div class="line"><a name="l10941"></a><span class="lineno">10941</span> <span class="comment">// value.</span></div><div class="line"><a name="l10942"></a><span class="lineno">10942</span> <span class="keyword">template</span> <<span class="keyword">class</span> TestClass></div><div class="line"><a name="l10943"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_parameterized_test_factory.html">10943</a></span> <span class="keyword">class </span><a class="code" href="classtesting_1_1internal_1_1_parameterized_test_factory.html">ParameterizedTestFactory</a> : <span class="keyword">public</span> <a class="code" href="classtesting_1_1internal_1_1_test_factory_base.html">TestFactoryBase</a> {</div><div class="line"><a name="l10944"></a><span class="lineno">10944</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l10945"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_parameterized_test_factory.html#ad9a27b8e1a83de2f1687625bccff460d">10945</a></span>  <span class="keyword">typedef</span> <span class="keyword">typename</span> TestClass::ParamType <a class="code" href="classtesting_1_1internal_1_1_parameterized_test_factory.html#ad9a27b8e1a83de2f1687625bccff460d">ParamType</a>;</div><div class="line"><a name="l10946"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_parameterized_test_factory.html#a82d78356cd402224255edec760a048fb">10946</a></span>  <span class="keyword">explicit</span> <a class="code" href="classtesting_1_1internal_1_1_parameterized_test_factory.html#a82d78356cd402224255edec760a048fb">ParameterizedTestFactory</a>(<a class="code" href="classtesting_1_1internal_1_1_parameterized_test_factory.html#ad9a27b8e1a83de2f1687625bccff460d">ParamType</a> parameter) :</div><div class="line"><a name="l10947"></a><span class="lineno">10947</span>  parameter_(parameter) {}</div><div class="line"><a name="l10948"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_parameterized_test_factory.html#a36d962674d7bf845398637338b9f75cb">10948</a></span>  <a class="code" href="classtesting_1_1_test.html">Test</a>* <a class="code" href="classtesting_1_1internal_1_1_parameterized_test_factory.html#a36d962674d7bf845398637338b9f75cb">CreateTest</a>()<span class="keyword"> override </span>{</div><div class="line"><a name="l10949"></a><span class="lineno">10949</span>  TestClass::SetParam(&parameter_);</div><div class="line"><a name="l10950"></a><span class="lineno">10950</span>  <span class="keywordflow">return</span> <span class="keyword">new</span> TestClass();</div><div class="line"><a name="l10951"></a><span class="lineno">10951</span>  }</div><div class="line"><a name="l10952"></a><span class="lineno">10952</span> </div><div class="line"><a name="l10953"></a><span class="lineno">10953</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l10954"></a><span class="lineno">10954</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_parameterized_test_factory.html#ad9a27b8e1a83de2f1687625bccff460d">ParamType</a> parameter_;</div><div class="line"><a name="l10955"></a><span class="lineno">10955</span> </div><div class="line"><a name="l10956"></a><span class="lineno">10956</span>  GTEST_DISALLOW_COPY_AND_ASSIGN_(<a class="code" href="classtesting_1_1internal_1_1_parameterized_test_factory.html">ParameterizedTestFactory</a>);</div><div class="line"><a name="l10957"></a><span class="lineno">10957</span> };</div><div class="line"><a name="l10958"></a><span class="lineno">10958</span> </div><div class="line"><a name="l10959"></a><span class="lineno">10959</span> <span class="comment">// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.</span></div><div class="line"><a name="l10960"></a><span class="lineno">10960</span> <span class="comment">//</span></div><div class="line"><a name="l10961"></a><span class="lineno">10961</span> <span class="comment">// TestMetaFactoryBase is a base class for meta-factories that create</span></div><div class="line"><a name="l10962"></a><span class="lineno">10962</span> <span class="comment">// test factories for passing into MakeAndRegisterTestInfo function.</span></div><div class="line"><a name="l10963"></a><span class="lineno">10963</span> <span class="keyword">template</span> <<span class="keyword">class</span> ParamType></div><div class="line"><a name="l10964"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_test_meta_factory_base.html">10964</a></span> <span class="keyword">class </span><a class="code" href="classtesting_1_1internal_1_1_test_meta_factory_base.html">TestMetaFactoryBase</a> {</div><div class="line"><a name="l10965"></a><span class="lineno">10965</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l10966"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_test_meta_factory_base.html#aad80adf04686f7dfcf952e44afc02767">10966</a></span>  <span class="keyword">virtual</span> <a class="code" href="classtesting_1_1internal_1_1_test_meta_factory_base.html#aad80adf04686f7dfcf952e44afc02767">~TestMetaFactoryBase</a>() {}</div><div class="line"><a name="l10967"></a><span class="lineno">10967</span> </div><div class="line"><a name="l10968"></a><span class="lineno">10968</span>  <span class="keyword">virtual</span> <a class="code" href="classtesting_1_1internal_1_1_test_factory_base.html">TestFactoryBase</a>* <a class="code" href="classtesting_1_1internal_1_1_test_meta_factory_base.html#a853daab362740bcac55e180128d564ef">CreateTestFactory</a>(ParamType parameter) = 0;</div><div class="line"><a name="l10969"></a><span class="lineno">10969</span> };</div><div class="line"><a name="l10970"></a><span class="lineno">10970</span> </div><div class="line"><a name="l10971"></a><span class="lineno">10971</span> <span class="comment">// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.</span></div><div class="line"><a name="l10972"></a><span class="lineno">10972</span> <span class="comment">//</span></div><div class="line"><a name="l10973"></a><span class="lineno">10973</span> <span class="comment">// TestMetaFactory creates test factories for passing into</span></div><div class="line"><a name="l10974"></a><span class="lineno">10974</span> <span class="comment">// MakeAndRegisterTestInfo function. Since MakeAndRegisterTestInfo receives</span></div><div class="line"><a name="l10975"></a><span class="lineno">10975</span> <span class="comment">// ownership of test factory pointer, same factory object cannot be passed</span></div><div class="line"><a name="l10976"></a><span class="lineno">10976</span> <span class="comment">// into that method twice. But ParameterizedTestSuiteInfo is going to call</span></div><div class="line"><a name="l10977"></a><span class="lineno">10977</span> <span class="comment">// it for each Test/Parameter value combination. Thus it needs meta factory</span></div><div class="line"><a name="l10978"></a><span class="lineno">10978</span> <span class="comment">// creator class.</span></div><div class="line"><a name="l10979"></a><span class="lineno">10979</span> <span class="keyword">template</span> <<span class="keyword">class</span> TestSuite></div><div class="line"><a name="l10980"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_test_meta_factory.html">10980</a></span> <span class="keyword">class </span><a class="code" href="classtesting_1_1internal_1_1_test_meta_factory.html">TestMetaFactory</a></div><div class="line"><a name="l10981"></a><span class="lineno">10981</span>  : <span class="keyword">public</span> <a class="code" href="classtesting_1_1internal_1_1_test_meta_factory_base.html">TestMetaFactoryBase</a><typename TestSuite::ParamType> {</div><div class="line"><a name="l10982"></a><span class="lineno">10982</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l10983"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_test_meta_factory.html#a392ebab15dfdcfa1b54bbe15878aa9cd">10983</a></span>  <span class="keyword">using</span> <a class="code" href="classtesting_1_1internal_1_1_test_meta_factory.html#a392ebab15dfdcfa1b54bbe15878aa9cd">ParamType</a> = <span class="keyword">typename</span> TestSuite::ParamType;</div><div class="line"><a name="l10984"></a><span class="lineno">10984</span> </div><div class="line"><a name="l10985"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_test_meta_factory.html#a1a48d63fbff650741c8f718af5c373d2">10985</a></span>  <a class="code" href="classtesting_1_1internal_1_1_test_meta_factory.html#a1a48d63fbff650741c8f718af5c373d2">TestMetaFactory</a>() {}</div><div class="line"><a name="l10986"></a><span class="lineno">10986</span> </div><div class="line"><a name="l10987"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_test_meta_factory.html#abd5d30fab71229deb5e63f5bb5ea3fd8">10987</a></span>  <a class="code" href="classtesting_1_1internal_1_1_test_factory_base.html">TestFactoryBase</a>* <a class="code" href="classtesting_1_1internal_1_1_test_meta_factory.html#abd5d30fab71229deb5e63f5bb5ea3fd8">CreateTestFactory</a>(<a class="code" href="classtesting_1_1internal_1_1_test_meta_factory.html#a392ebab15dfdcfa1b54bbe15878aa9cd">ParamType</a> parameter)<span class="keyword"> override </span>{</div><div class="line"><a name="l10988"></a><span class="lineno">10988</span>  <span class="keywordflow">return</span> <span class="keyword">new</span> <a class="code" href="classtesting_1_1internal_1_1_parameterized_test_factory.html">ParameterizedTestFactory<TestSuite></a>(parameter);</div><div class="line"><a name="l10989"></a><span class="lineno">10989</span>  }</div><div class="line"><a name="l10990"></a><span class="lineno">10990</span> </div><div class="line"><a name="l10991"></a><span class="lineno">10991</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l10992"></a><span class="lineno">10992</span>  GTEST_DISALLOW_COPY_AND_ASSIGN_(<a class="code" href="classtesting_1_1internal_1_1_test_meta_factory.html">TestMetaFactory</a>);</div><div class="line"><a name="l10993"></a><span class="lineno">10993</span> };</div><div class="line"><a name="l10994"></a><span class="lineno">10994</span> </div><div class="line"><a name="l10995"></a><span class="lineno">10995</span> <span class="comment">// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.</span></div><div class="line"><a name="l10996"></a><span class="lineno">10996</span> <span class="comment">//</span></div><div class="line"><a name="l10997"></a><span class="lineno">10997</span> <span class="comment">// ParameterizedTestSuiteInfoBase is a generic interface</span></div><div class="line"><a name="l10998"></a><span class="lineno">10998</span> <span class="comment">// to ParameterizedTestSuiteInfo classes. ParameterizedTestSuiteInfoBase</span></div><div class="line"><a name="l10999"></a><span class="lineno">10999</span> <span class="comment">// accumulates test information provided by TEST_P macro invocations</span></div><div class="line"><a name="l11000"></a><span class="lineno">11000</span> <span class="comment">// and generators provided by INSTANTIATE_TEST_SUITE_P macro invocations</span></div><div class="line"><a name="l11001"></a><span class="lineno">11001</span> <span class="comment">// and uses that information to register all resulting test instances</span></div><div class="line"><a name="l11002"></a><span class="lineno">11002</span> <span class="comment">// in RegisterTests method. The ParameterizeTestSuiteRegistry class holds</span></div><div class="line"><a name="l11003"></a><span class="lineno">11003</span> <span class="comment">// a collection of pointers to the ParameterizedTestSuiteInfo objects</span></div><div class="line"><a name="l11004"></a><span class="lineno">11004</span> <span class="comment">// and calls RegisterTests() on each of them when asked.</span></div><div class="line"><a name="l11005"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_parameterized_test_suite_info_base.html">11005</a></span> <span class="keyword">class </span><a class="code" href="classtesting_1_1internal_1_1_parameterized_test_suite_info_base.html">ParameterizedTestSuiteInfoBase</a> {</div><div class="line"><a name="l11006"></a><span class="lineno">11006</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l11007"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_parameterized_test_suite_info_base.html#ac2aa0664f56e84cacab823d345c7d67b">11007</a></span>  <span class="keyword">virtual</span> <a class="code" href="classtesting_1_1internal_1_1_parameterized_test_suite_info_base.html#ac2aa0664f56e84cacab823d345c7d67b">~ParameterizedTestSuiteInfoBase</a>() {}</div><div class="line"><a name="l11008"></a><span class="lineno">11008</span> </div><div class="line"><a name="l11009"></a><span class="lineno">11009</span>  <span class="comment">// Base part of test suite name for display purposes.</span></div><div class="line"><a name="l11010"></a><span class="lineno">11010</span>  <span class="keyword">virtual</span> <span class="keyword">const</span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a>& <a class="code" href="classtesting_1_1internal_1_1_parameterized_test_suite_info_base.html#aa6e36241431dc72c251ecee9b637b4d3">GetTestSuiteName</a>() <span class="keyword">const</span> = 0;</div><div class="line"><a name="l11011"></a><span class="lineno">11011</span>  <span class="comment">// Test case id to verify identity.</span></div><div class="line"><a name="l11012"></a><span class="lineno">11012</span>  <span class="keyword">virtual</span> <a class="code" href="namespacetesting_1_1internal.html#ab1114197d3c657d8b7f8e0c5caa12d00">TypeId</a> <a class="code" href="classtesting_1_1internal_1_1_parameterized_test_suite_info_base.html#ac5bcbf8c50a44472d697e0c80b54387d">GetTestSuiteTypeId</a>() <span class="keyword">const</span> = 0;</div><div class="line"><a name="l11013"></a><span class="lineno">11013</span>  <span class="comment">// UnitTest class invokes this method to register tests in this</span></div><div class="line"><a name="l11014"></a><span class="lineno">11014</span>  <span class="comment">// test suite right before running them in RUN_ALL_TESTS macro.</span></div><div class="line"><a name="l11015"></a><span class="lineno">11015</span>  <span class="comment">// This method should not be called more then once on any single</span></div><div class="line"><a name="l11016"></a><span class="lineno">11016</span>  <span class="comment">// instance of a ParameterizedTestSuiteInfoBase derived class.</span></div><div class="line"><a name="l11017"></a><span class="lineno">11017</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classtesting_1_1internal_1_1_parameterized_test_suite_info_base.html#a41d7d663014af0c1e614c5a61293cb5a">RegisterTests</a>() = 0;</div><div class="line"><a name="l11018"></a><span class="lineno">11018</span> </div><div class="line"><a name="l11019"></a><span class="lineno">11019</span>  <span class="keyword">protected</span>:</div><div class="line"><a name="l11020"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_parameterized_test_suite_info_base.html#a3b50ae419b0de858f3ad9b8dd49989de">11020</a></span>  <a class="code" href="classtesting_1_1internal_1_1_parameterized_test_suite_info_base.html#a3b50ae419b0de858f3ad9b8dd49989de">ParameterizedTestSuiteInfoBase</a>() {}</div><div class="line"><a name="l11021"></a><span class="lineno">11021</span> </div><div class="line"><a name="l11022"></a><span class="lineno">11022</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l11023"></a><span class="lineno">11023</span>  GTEST_DISALLOW_COPY_AND_ASSIGN_(<a class="code" href="classtesting_1_1internal_1_1_parameterized_test_suite_info_base.html">ParameterizedTestSuiteInfoBase</a>);</div><div class="line"><a name="l11024"></a><span class="lineno">11024</span> };</div><div class="line"><a name="l11025"></a><span class="lineno">11025</span> </div><div class="line"><a name="l11026"></a><span class="lineno">11026</span> <span class="comment">// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.</span></div><div class="line"><a name="l11027"></a><span class="lineno">11027</span> <span class="comment">//</span></div><div class="line"><a name="l11028"></a><span class="lineno">11028</span> <span class="comment">// ParameterizedTestSuiteInfo accumulates tests obtained from TEST_P</span></div><div class="line"><a name="l11029"></a><span class="lineno">11029</span> <span class="comment">// macro invocations for a particular test suite and generators</span></div><div class="line"><a name="l11030"></a><span class="lineno">11030</span> <span class="comment">// obtained from INSTANTIATE_TEST_SUITE_P macro invocations for that</span></div><div class="line"><a name="l11031"></a><span class="lineno">11031</span> <span class="comment">// test suite. It registers tests with all values generated by all</span></div><div class="line"><a name="l11032"></a><span class="lineno">11032</span> <span class="comment">// generators when asked.</span></div><div class="line"><a name="l11033"></a><span class="lineno">11033</span> <span class="keyword">template</span> <<span class="keyword">class</span> TestSuite></div><div class="line"><a name="l11034"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_parameterized_test_suite_info.html">11034</a></span> <span class="keyword">class </span><a class="code" href="classtesting_1_1internal_1_1_parameterized_test_suite_info.html">ParameterizedTestSuiteInfo</a> : <span class="keyword">public</span> <a class="code" href="classtesting_1_1internal_1_1_parameterized_test_suite_info_base.html">ParameterizedTestSuiteInfoBase</a> {</div><div class="line"><a name="l11035"></a><span class="lineno">11035</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l11036"></a><span class="lineno">11036</span>  <span class="comment">// ParamType and GeneratorCreationFunc are private types but are required</span></div><div class="line"><a name="l11037"></a><span class="lineno">11037</span>  <span class="comment">// for declarations of public methods AddTestPattern() and</span></div><div class="line"><a name="l11038"></a><span class="lineno">11038</span>  <span class="comment">// AddTestSuiteInstantiation().</span></div><div class="line"><a name="l11039"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_parameterized_test_suite_info.html#a10761bd750a6820a8d8d2c654b10fe54">11039</a></span>  <span class="keyword">using</span> <a class="code" href="classtesting_1_1internal_1_1_parameterized_test_suite_info.html#a10761bd750a6820a8d8d2c654b10fe54">ParamType</a> = <span class="keyword">typename</span> TestSuite::ParamType;</div><div class="line"><a name="l11040"></a><span class="lineno">11040</span>  <span class="comment">// A function that returns an instance of appropriate generator type.</span></div><div class="line"><a name="l11041"></a><span class="lineno">11041</span>  <span class="keyword">typedef</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<ParamType></a>(GeneratorCreationFunc)();</div><div class="line"><a name="l11042"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_parameterized_test_suite_info.html#a35e630877b1d9589a4bbc0439b35bbda">11042</a></span>  <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="structtesting_1_1internal_1_1_param_name_gen_func.html">ParamNameGenFunc<ParamType>::Type</a> <a class="code" href="classtesting_1_1internal_1_1_parameterized_test_suite_info.html#a35e630877b1d9589a4bbc0439b35bbda">ParamNameGeneratorFunc</a>;</div><div class="line"><a name="l11043"></a><span class="lineno">11043</span> </div><div class="line"><a name="l11044"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_parameterized_test_suite_info.html#a56fc02ddec2cf2101332d1125e4c75a9">11044</a></span>  <span class="keyword">explicit</span> <a class="code" href="classtesting_1_1internal_1_1_parameterized_test_suite_info.html#a56fc02ddec2cf2101332d1125e4c75a9">ParameterizedTestSuiteInfo</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* name,</div><div class="line"><a name="l11045"></a><span class="lineno">11045</span>  <a class="code" href="structtesting_1_1internal_1_1_code_location.html">CodeLocation</a> code_location)</div><div class="line"><a name="l11046"></a><span class="lineno">11046</span>  : test_suite_name_(name), code_location_(code_location) {}</div><div class="line"><a name="l11047"></a><span class="lineno">11047</span> </div><div class="line"><a name="l11048"></a><span class="lineno">11048</span>  <span class="comment">// Test case base name for display purposes.</span></div><div class="line"><a name="l11049"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_parameterized_test_suite_info.html#a4a5ddc2cd0404438c2b4d405cd0e706c">11049</a></span>  <span class="keyword">const</span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a>& <a class="code" href="classtesting_1_1internal_1_1_parameterized_test_suite_info.html#a4a5ddc2cd0404438c2b4d405cd0e706c">GetTestSuiteName</a>()<span class="keyword"> const override </span>{</div><div class="line"><a name="l11050"></a><span class="lineno">11050</span>  <span class="keywordflow">return</span> test_suite_name_;</div><div class="line"><a name="l11051"></a><span class="lineno">11051</span>  }</div><div class="line"><a name="l11052"></a><span class="lineno">11052</span>  <span class="comment">// Test case id to verify identity.</span></div><div class="line"><a name="l11053"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_parameterized_test_suite_info.html#af488d1d7c1889a250acff2ea6eba4c84">11053</a></span>  <a class="code" href="namespacetesting_1_1internal.html#ab1114197d3c657d8b7f8e0c5caa12d00">TypeId</a> <a class="code" href="classtesting_1_1internal_1_1_parameterized_test_suite_info.html#af488d1d7c1889a250acff2ea6eba4c84">GetTestSuiteTypeId</a>()<span class="keyword"> const override </span>{ <span class="keywordflow">return</span> GetTypeId<TestSuite>(); }</div><div class="line"><a name="l11054"></a><span class="lineno">11054</span>  <span class="comment">// TEST_P macro uses AddTestPattern() to record information</span></div><div class="line"><a name="l11055"></a><span class="lineno">11055</span>  <span class="comment">// about a single test in a LocalTestInfo structure.</span></div><div class="line"><a name="l11056"></a><span class="lineno">11056</span>  <span class="comment">// test_suite_name is the base name of the test suite (without invocation</span></div><div class="line"><a name="l11057"></a><span class="lineno">11057</span>  <span class="comment">// prefix). test_base_name is the name of an individual test without</span></div><div class="line"><a name="l11058"></a><span class="lineno">11058</span>  <span class="comment">// parameter index. For the test SequenceA/FooTest.DoBar/1 FooTest is</span></div><div class="line"><a name="l11059"></a><span class="lineno">11059</span>  <span class="comment">// test suite base name and DoBar is test base name.</span></div><div class="line"><a name="l11060"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_parameterized_test_suite_info.html#a07445ac68713383f38747e1c56c6a04a">11060</a></span>  <span class="keywordtype">void</span> <a class="code" href="classtesting_1_1internal_1_1_parameterized_test_suite_info.html#a07445ac68713383f38747e1c56c6a04a">AddTestPattern</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* test_suite_name, <span class="keyword">const</span> <span class="keywordtype">char</span>* test_base_name,</div><div class="line"><a name="l11061"></a><span class="lineno">11061</span>  <a class="code" href="classtesting_1_1internal_1_1_test_meta_factory_base.html">TestMetaFactoryBase<ParamType></a>* meta_factory) {</div><div class="line"><a name="l11062"></a><span class="lineno">11062</span>  tests_.push_back(std::shared_ptr<TestInfo>(</div><div class="line"><a name="l11063"></a><span class="lineno">11063</span>  <span class="keyword">new</span> TestInfo(test_suite_name, test_base_name, meta_factory)));</div><div class="line"><a name="l11064"></a><span class="lineno">11064</span>  }</div><div class="line"><a name="l11065"></a><span class="lineno">11065</span>  <span class="comment">// INSTANTIATE_TEST_SUITE_P macro uses AddGenerator() to record information</span></div><div class="line"><a name="l11066"></a><span class="lineno">11066</span>  <span class="comment">// about a generator.</span></div><div class="line"><a name="l11067"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_parameterized_test_suite_info.html#a174f164f38e522a3935da911a9c1e450">11067</a></span>  <span class="keywordtype">int</span> <a class="code" href="classtesting_1_1internal_1_1_parameterized_test_suite_info.html#a174f164f38e522a3935da911a9c1e450">AddTestSuiteInstantiation</a>(<span class="keyword">const</span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a>& instantiation_name,</div><div class="line"><a name="l11068"></a><span class="lineno">11068</span>  GeneratorCreationFunc* func,</div><div class="line"><a name="l11069"></a><span class="lineno">11069</span>  <a class="code" href="classtesting_1_1internal_1_1_parameterized_test_suite_info.html#a35e630877b1d9589a4bbc0439b35bbda">ParamNameGeneratorFunc</a>* name_func,</div><div class="line"><a name="l11070"></a><span class="lineno">11070</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* file, <span class="keywordtype">int</span> line) {</div><div class="line"><a name="l11071"></a><span class="lineno">11071</span>  instantiations_.push_back(</div><div class="line"><a name="l11072"></a><span class="lineno">11072</span>  InstantiationInfo(instantiation_name, func, name_func, file, line));</div><div class="line"><a name="l11073"></a><span class="lineno">11073</span>  <span class="keywordflow">return</span> 0; <span class="comment">// Return value used only to run this method in namespace scope.</span></div><div class="line"><a name="l11074"></a><span class="lineno">11074</span>  }</div><div class="line"><a name="l11075"></a><span class="lineno">11075</span>  <span class="comment">// UnitTest class invokes this method to register tests in this test suite</span></div><div class="line"><a name="l11076"></a><span class="lineno">11076</span>  <span class="comment">// test suites right before running tests in RUN_ALL_TESTS macro.</span></div><div class="line"><a name="l11077"></a><span class="lineno">11077</span>  <span class="comment">// This method should not be called more then once on any single</span></div><div class="line"><a name="l11078"></a><span class="lineno">11078</span>  <span class="comment">// instance of a ParameterizedTestSuiteInfoBase derived class.</span></div><div class="line"><a name="l11079"></a><span class="lineno">11079</span>  <span class="comment">// UnitTest has a guard to prevent from calling this method more then once.</span></div><div class="line"><a name="l11080"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_parameterized_test_suite_info.html#a8c0af866d3c291a63d3f4581ccd452d1">11080</a></span>  <span class="keywordtype">void</span> <a class="code" href="classtesting_1_1internal_1_1_parameterized_test_suite_info.html#a8c0af866d3c291a63d3f4581ccd452d1">RegisterTests</a>()<span class="keyword"> override </span>{</div><div class="line"><a name="l11081"></a><span class="lineno">11081</span>  <span class="keywordflow">for</span> (<span class="keyword">typename</span> TestInfoContainer::iterator test_it = tests_.begin();</div><div class="line"><a name="l11082"></a><span class="lineno">11082</span>  test_it != tests_.end(); ++test_it) {</div><div class="line"><a name="l11083"></a><span class="lineno">11083</span>  std::shared_ptr<TestInfo> test_info = *test_it;</div><div class="line"><a name="l11084"></a><span class="lineno">11084</span>  <span class="keywordflow">for</span> (<span class="keyword">typename</span> InstantiationContainer::iterator gen_it =</div><div class="line"><a name="l11085"></a><span class="lineno">11085</span>  instantiations_.begin(); gen_it != instantiations_.end();</div><div class="line"><a name="l11086"></a><span class="lineno">11086</span>  ++gen_it) {</div><div class="line"><a name="l11087"></a><span class="lineno">11087</span>  <span class="keyword">const</span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a>& instantiation_name = gen_it->name;</div><div class="line"><a name="l11088"></a><span class="lineno">11088</span>  <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<ParamType></a> generator((*gen_it->generator)());</div><div class="line"><a name="l11089"></a><span class="lineno">11089</span>  <a class="code" href="classtesting_1_1internal_1_1_parameterized_test_suite_info.html#a35e630877b1d9589a4bbc0439b35bbda">ParamNameGeneratorFunc</a>* name_func = gen_it->name_func;</div><div class="line"><a name="l11090"></a><span class="lineno">11090</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* file = gen_it->file;</div><div class="line"><a name="l11091"></a><span class="lineno">11091</span>  <span class="keywordtype">int</span> line = gen_it->line;</div><div class="line"><a name="l11092"></a><span class="lineno">11092</span> </div><div class="line"><a name="l11093"></a><span class="lineno">11093</span>  <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a> test_suite_name;</div><div class="line"><a name="l11094"></a><span class="lineno">11094</span>  <span class="keywordflow">if</span> ( !instantiation_name.empty() )</div><div class="line"><a name="l11095"></a><span class="lineno">11095</span>  test_suite_name = instantiation_name + <span class="stringliteral">"/"</span>;</div><div class="line"><a name="l11096"></a><span class="lineno">11096</span>  test_suite_name += test_info->test_suite_base_name;</div><div class="line"><a name="l11097"></a><span class="lineno">11097</span> </div><div class="line"><a name="l11098"></a><span class="lineno">11098</span>  <span class="keywordtype">size_t</span> i = 0;</div><div class="line"><a name="l11099"></a><span class="lineno">11099</span>  std::set<std::string> test_param_names;</div><div class="line"><a name="l11100"></a><span class="lineno">11100</span>  <span class="keywordflow">for</span> (<span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_iterator.html">ParamGenerator<ParamType>::iterator</a> param_it =</div><div class="line"><a name="l11101"></a><span class="lineno">11101</span>  generator.begin();</div><div class="line"><a name="l11102"></a><span class="lineno">11102</span>  param_it != generator.end(); ++param_it, ++i) {</div><div class="line"><a name="l11103"></a><span class="lineno">11103</span>  <a class="code" href="classtesting_1_1_message.html">Message</a> test_name_stream;</div><div class="line"><a name="l11104"></a><span class="lineno">11104</span> </div><div class="line"><a name="l11105"></a><span class="lineno">11105</span>  <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a> param_name = name_func(</div><div class="line"><a name="l11106"></a><span class="lineno">11106</span>  <a class="code" href="structtesting_1_1_test_param_info.html">TestParamInfo<ParamType></a>(*param_it, i));</div><div class="line"><a name="l11107"></a><span class="lineno">11107</span> </div><div class="line"><a name="l11108"></a><span class="lineno">11108</span>  <a class="code" href="gtest_8h.html#ab54343f0a36dc4cb0ce8a478dd7847b8">GTEST_CHECK_</a>(IsValidParamName(param_name))</div><div class="line"><a name="l11109"></a><span class="lineno">11109</span>  << <span class="stringliteral">"Parameterized test name '"</span> << param_name</div><div class="line"><a name="l11110"></a><span class="lineno">11110</span>  << <span class="stringliteral">"' is invalid, in "</span> << file</div><div class="line"><a name="l11111"></a><span class="lineno">11111</span>  << <span class="stringliteral">" line "</span> << line << std::endl;</div><div class="line"><a name="l11112"></a><span class="lineno">11112</span> </div><div class="line"><a name="l11113"></a><span class="lineno">11113</span>  <a class="code" href="gtest_8h.html#ab54343f0a36dc4cb0ce8a478dd7847b8">GTEST_CHECK_</a>(test_param_names.count(param_name) == 0)</div><div class="line"><a name="l11114"></a><span class="lineno">11114</span>  << <span class="stringliteral">"Duplicate parameterized test name '"</span> << param_name</div><div class="line"><a name="l11115"></a><span class="lineno">11115</span>  << <span class="stringliteral">"', in "</span> << file << <span class="stringliteral">" line "</span> << line << std::endl;</div><div class="line"><a name="l11116"></a><span class="lineno">11116</span> </div><div class="line"><a name="l11117"></a><span class="lineno">11117</span>  test_param_names.insert(param_name);</div><div class="line"><a name="l11118"></a><span class="lineno">11118</span> </div><div class="line"><a name="l11119"></a><span class="lineno">11119</span>  test_name_stream << test_info->test_base_name << <span class="stringliteral">"/"</span> << param_name;</div><div class="line"><a name="l11120"></a><span class="lineno">11120</span>  <a class="code" href="namespacetesting_1_1internal.html#a7ab4072540184e26119ad853f45059f7">MakeAndRegisterTestInfo</a>(</div><div class="line"><a name="l11121"></a><span class="lineno">11121</span>  test_suite_name.c_str(), test_name_stream.<a class="code" href="classtesting_1_1_message.html#a2cdc4df62bdcc9df37651a1cf527704e">GetString</a>().c_str(),</div><div class="line"><a name="l11122"></a><span class="lineno">11122</span>  <span class="keyword">nullptr</span>, <span class="comment">// No type parameter.</span></div><div class="line"><a name="l11123"></a><span class="lineno">11123</span>  <a class="code" href="namespacetesting.html#aa5717bb1144edd1d262d310ba70c82ed">PrintToString</a>(*param_it).c_str(), code_location_,</div><div class="line"><a name="l11124"></a><span class="lineno">11124</span>  <a class="code" href="classtesting_1_1internal_1_1_parameterized_test_suite_info.html#af488d1d7c1889a250acff2ea6eba4c84">GetTestSuiteTypeId</a>(),</div><div class="line"><a name="l11125"></a><span class="lineno">11125</span>  <a class="code" href="structtesting_1_1internal_1_1_suite_api_resolver.html#a460c8a0039577824e9170e6c332b530f">SuiteApiResolver<TestSuite>::GetSetUpCaseOrSuite</a>(),</div><div class="line"><a name="l11126"></a><span class="lineno">11126</span>  <a class="code" href="structtesting_1_1internal_1_1_suite_api_resolver.html#a8495afe4e71c81842119035a71db7e18">SuiteApiResolver<TestSuite>::GetTearDownCaseOrSuite</a>(),</div><div class="line"><a name="l11127"></a><span class="lineno">11127</span>  test_info->test_meta_factory->CreateTestFactory(*param_it));</div><div class="line"><a name="l11128"></a><span class="lineno">11128</span>  } <span class="comment">// for param_it</span></div><div class="line"><a name="l11129"></a><span class="lineno">11129</span>  } <span class="comment">// for gen_it</span></div><div class="line"><a name="l11130"></a><span class="lineno">11130</span>  } <span class="comment">// for test_it</span></div><div class="line"><a name="l11131"></a><span class="lineno">11131</span>  } <span class="comment">// RegisterTests</span></div><div class="line"><a name="l11132"></a><span class="lineno">11132</span> </div><div class="line"><a name="l11133"></a><span class="lineno">11133</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l11134"></a><span class="lineno">11134</span>  <span class="comment">// LocalTestInfo structure keeps information about a single test registered</span></div><div class="line"><a name="l11135"></a><span class="lineno">11135</span>  <span class="comment">// with TEST_P macro.</span></div><div class="line"><a name="l11136"></a><span class="lineno">11136</span>  <span class="keyword">struct </span><a class="code" href="classtesting_1_1_test_info.html">TestInfo</a> {</div><div class="line"><a name="l11137"></a><span class="lineno">11137</span>  <a class="code" href="classtesting_1_1_test_info.html">TestInfo</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* a_test_suite_base_name, <span class="keyword">const</span> <span class="keywordtype">char</span>* a_test_base_name,</div><div class="line"><a name="l11138"></a><span class="lineno">11138</span>  <a class="code" href="classtesting_1_1internal_1_1_test_meta_factory_base.html">TestMetaFactoryBase<ParamType></a>* a_test_meta_factory)</div><div class="line"><a name="l11139"></a><span class="lineno">11139</span>  : test_suite_base_name(a_test_suite_base_name),</div><div class="line"><a name="l11140"></a><span class="lineno">11140</span>  test_base_name(a_test_base_name),</div><div class="line"><a name="l11141"></a><span class="lineno">11141</span>  test_meta_factory(a_test_meta_factory) {}</div><div class="line"><a name="l11142"></a><span class="lineno">11142</span> </div><div class="line"><a name="l11143"></a><span class="lineno">11143</span>  <span class="keyword">const</span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a> test_suite_base_name;</div><div class="line"><a name="l11144"></a><span class="lineno">11144</span>  <span class="keyword">const</span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a> test_base_name;</div><div class="line"><a name="l11145"></a><span class="lineno">11145</span>  <span class="keyword">const</span> std::unique_ptr<TestMetaFactoryBase<ParamType> > test_meta_factory;</div><div class="line"><a name="l11146"></a><span class="lineno">11146</span>  };</div><div class="line"><a name="l11147"></a><span class="lineno">11147</span>  <span class="keyword">using</span> TestInfoContainer = ::std::vector<std::shared_ptr<TestInfo> >;</div><div class="line"><a name="l11148"></a><span class="lineno">11148</span>  <span class="comment">// Records data received from INSTANTIATE_TEST_SUITE_P macros:</span></div><div class="line"><a name="l11149"></a><span class="lineno">11149</span>  <span class="comment">// <Instantiation name, Sequence generator creation function,</span></div><div class="line"><a name="l11150"></a><span class="lineno">11150</span>  <span class="comment">// Name generator function, Source file, Source line></span></div><div class="line"><a name="l11151"></a><span class="lineno">11151</span>  <span class="keyword">struct </span>InstantiationInfo {</div><div class="line"><a name="l11152"></a><span class="lineno">11152</span>  InstantiationInfo(<span class="keyword">const</span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a> &name_in,</div><div class="line"><a name="l11153"></a><span class="lineno">11153</span>  GeneratorCreationFunc* generator_in,</div><div class="line"><a name="l11154"></a><span class="lineno">11154</span>  <a class="code" href="classtesting_1_1internal_1_1_parameterized_test_suite_info.html#a35e630877b1d9589a4bbc0439b35bbda">ParamNameGeneratorFunc</a>* name_func_in,</div><div class="line"><a name="l11155"></a><span class="lineno">11155</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* file_in,</div><div class="line"><a name="l11156"></a><span class="lineno">11156</span>  <span class="keywordtype">int</span> line_in)</div><div class="line"><a name="l11157"></a><span class="lineno">11157</span>  : name(name_in),</div><div class="line"><a name="l11158"></a><span class="lineno">11158</span>  generator(generator_in),</div><div class="line"><a name="l11159"></a><span class="lineno">11159</span>  name_func(name_func_in),</div><div class="line"><a name="l11160"></a><span class="lineno">11160</span>  file(file_in),</div><div class="line"><a name="l11161"></a><span class="lineno">11161</span>  line(line_in) {}</div><div class="line"><a name="l11162"></a><span class="lineno">11162</span> </div><div class="line"><a name="l11163"></a><span class="lineno">11163</span>  <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a> name;</div><div class="line"><a name="l11164"></a><span class="lineno">11164</span>  GeneratorCreationFunc* generator;</div><div class="line"><a name="l11165"></a><span class="lineno">11165</span>  <a class="code" href="classtesting_1_1internal_1_1_parameterized_test_suite_info.html#a35e630877b1d9589a4bbc0439b35bbda">ParamNameGeneratorFunc</a>* name_func;</div><div class="line"><a name="l11166"></a><span class="lineno">11166</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* file;</div><div class="line"><a name="l11167"></a><span class="lineno">11167</span>  <span class="keywordtype">int</span> line;</div><div class="line"><a name="l11168"></a><span class="lineno">11168</span>  };</div><div class="line"><a name="l11169"></a><span class="lineno">11169</span>  typedef ::std::vector<InstantiationInfo> InstantiationContainer;</div><div class="line"><a name="l11170"></a><span class="lineno">11170</span> </div><div class="line"><a name="l11171"></a><span class="lineno">11171</span>  <span class="keyword">static</span> <span class="keywordtype">bool</span> IsValidParamName(<span class="keyword">const</span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a>& name) {</div><div class="line"><a name="l11172"></a><span class="lineno">11172</span>  <span class="comment">// Check for empty string</span></div><div class="line"><a name="l11173"></a><span class="lineno">11173</span>  <span class="keywordflow">if</span> (name.empty())</div><div class="line"><a name="l11174"></a><span class="lineno">11174</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l11175"></a><span class="lineno">11175</span> </div><div class="line"><a name="l11176"></a><span class="lineno">11176</span>  <span class="comment">// Check for invalid characters</span></div><div class="line"><a name="l11177"></a><span class="lineno">11177</span>  <span class="keywordflow">for</span> (std::string::size_type index = 0; index < name.size(); ++index) {</div><div class="line"><a name="l11178"></a><span class="lineno">11178</span>  <span class="keywordflow">if</span> (!isalnum(name[index]) && name[index] != <span class="charliteral">'_'</span>)</div><div class="line"><a name="l11179"></a><span class="lineno">11179</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l11180"></a><span class="lineno">11180</span>  }</div><div class="line"><a name="l11181"></a><span class="lineno">11181</span> </div><div class="line"><a name="l11182"></a><span class="lineno">11182</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l11183"></a><span class="lineno">11183</span>  }</div><div class="line"><a name="l11184"></a><span class="lineno">11184</span> </div><div class="line"><a name="l11185"></a><span class="lineno">11185</span>  <span class="keyword">const</span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a> test_suite_name_;</div><div class="line"><a name="l11186"></a><span class="lineno">11186</span>  CodeLocation code_location_;</div><div class="line"><a name="l11187"></a><span class="lineno">11187</span>  TestInfoContainer tests_;</div><div class="line"><a name="l11188"></a><span class="lineno">11188</span>  InstantiationContainer instantiations_;</div><div class="line"><a name="l11189"></a><span class="lineno">11189</span> </div><div class="line"><a name="l11190"></a><span class="lineno">11190</span>  GTEST_DISALLOW_COPY_AND_ASSIGN_(<a class="code" href="classtesting_1_1internal_1_1_parameterized_test_suite_info.html#a56fc02ddec2cf2101332d1125e4c75a9">ParameterizedTestSuiteInfo</a>);</div><div class="line"><a name="l11191"></a><span class="lineno">11191</span> }; <span class="comment">// class ParameterizedTestSuiteInfo</span></div><div class="line"><a name="l11192"></a><span class="lineno">11192</span> </div><div class="line"><a name="l11193"></a><span class="lineno">11193</span> <span class="comment">// Legacy API is deprecated but still available</span></div><div class="line"><a name="l11194"></a><span class="lineno">11194</span> <span class="preprocessor">#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_</span></div><div class="line"><a name="l11195"></a><span class="lineno">11195</span> <span class="keyword">template</span> <<span class="keyword">class</span> TestCase></div><div class="line"><a name="l11196"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#aac31682b6b41997d6cc610a5787dc8bc">11196</a></span> <span class="keyword">using</span> <a class="code" href="classtesting_1_1internal_1_1_parameterized_test_suite_info.html">ParameterizedTestCaseInfo</a> = <a class="code" href="classtesting_1_1internal_1_1_parameterized_test_suite_info.html">ParameterizedTestSuiteInfo<TestCase></a>;</div><div class="line"><a name="l11197"></a><span class="lineno">11197</span> <span class="preprocessor">#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_</span></div><div class="line"><a name="l11198"></a><span class="lineno">11198</span> </div><div class="line"><a name="l11199"></a><span class="lineno">11199</span> <span class="comment">// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.</span></div><div class="line"><a name="l11200"></a><span class="lineno">11200</span> <span class="comment">//</span></div><div class="line"><a name="l11201"></a><span class="lineno">11201</span> <span class="comment">// ParameterizedTestSuiteRegistry contains a map of</span></div><div class="line"><a name="l11202"></a><span class="lineno">11202</span> <span class="comment">// ParameterizedTestSuiteInfoBase classes accessed by test suite names. TEST_P</span></div><div class="line"><a name="l11203"></a><span class="lineno">11203</span> <span class="comment">// and INSTANTIATE_TEST_SUITE_P macros use it to locate their corresponding</span></div><div class="line"><a name="l11204"></a><span class="lineno">11204</span> <span class="comment">// ParameterizedTestSuiteInfo descriptors.</span></div><div class="line"><a name="l11205"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_parameterized_test_suite_registry.html">11205</a></span> <span class="keyword">class </span><a class="code" href="classtesting_1_1internal_1_1_parameterized_test_suite_registry.html">ParameterizedTestSuiteRegistry</a> {</div><div class="line"><a name="l11206"></a><span class="lineno">11206</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l11207"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_parameterized_test_suite_registry.html#ae3827c085ed16faaa9197486513292c0">11207</a></span>  <a class="code" href="classtesting_1_1internal_1_1_parameterized_test_suite_registry.html#ae3827c085ed16faaa9197486513292c0">ParameterizedTestSuiteRegistry</a>() {}</div><div class="line"><a name="l11208"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_parameterized_test_suite_registry.html#ab29f7a321883945d7f86f3292c100eb5">11208</a></span>  <a class="code" href="classtesting_1_1internal_1_1_parameterized_test_suite_registry.html#ab29f7a321883945d7f86f3292c100eb5">~ParameterizedTestSuiteRegistry</a>() {</div><div class="line"><a name="l11209"></a><span class="lineno">11209</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span>& test_suite_info : test_suite_infos_) {</div><div class="line"><a name="l11210"></a><span class="lineno">11210</span>  <span class="keyword">delete</span> test_suite_info;</div><div class="line"><a name="l11211"></a><span class="lineno">11211</span>  }</div><div class="line"><a name="l11212"></a><span class="lineno">11212</span>  }</div><div class="line"><a name="l11213"></a><span class="lineno">11213</span> </div><div class="line"><a name="l11214"></a><span class="lineno">11214</span>  <span class="comment">// Looks up or creates and returns a structure containing information about</span></div><div class="line"><a name="l11215"></a><span class="lineno">11215</span>  <span class="comment">// tests and instantiations of a particular test suite.</span></div><div class="line"><a name="l11216"></a><span class="lineno">11216</span>  <span class="keyword">template</span> <<span class="keyword">class</span> TestSuite></div><div class="line"><a name="l11217"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_parameterized_test_suite_registry.html#a89ef6dd228f4188e1928513e860580d0">11217</a></span>  <a class="code" href="classtesting_1_1internal_1_1_parameterized_test_suite_info.html">ParameterizedTestSuiteInfo<TestSuite></a>* <a class="code" href="classtesting_1_1internal_1_1_parameterized_test_suite_registry.html#a89ef6dd228f4188e1928513e860580d0">GetTestSuitePatternHolder</a>(</div><div class="line"><a name="l11218"></a><span class="lineno">11218</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* test_suite_name, <a class="code" href="structtesting_1_1internal_1_1_code_location.html">CodeLocation</a> code_location) {</div><div class="line"><a name="l11219"></a><span class="lineno">11219</span>  <a class="code" href="classtesting_1_1internal_1_1_parameterized_test_suite_info.html">ParameterizedTestSuiteInfo<TestSuite></a>* typed_test_info = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l11220"></a><span class="lineno">11220</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span>& test_suite_info : test_suite_infos_) {</div><div class="line"><a name="l11221"></a><span class="lineno">11221</span>  <span class="keywordflow">if</span> (test_suite_info->GetTestSuiteName() == test_suite_name) {</div><div class="line"><a name="l11222"></a><span class="lineno">11222</span>  <span class="keywordflow">if</span> (test_suite_info->GetTestSuiteTypeId() != GetTypeId<TestSuite>()) {</div><div class="line"><a name="l11223"></a><span class="lineno">11223</span>  <span class="comment">// Complain about incorrect usage of Google Test facilities</span></div><div class="line"><a name="l11224"></a><span class="lineno">11224</span>  <span class="comment">// and terminate the program since we cannot guaranty correct</span></div><div class="line"><a name="l11225"></a><span class="lineno">11225</span>  <span class="comment">// test suite setup and tear-down in this case.</span></div><div class="line"><a name="l11226"></a><span class="lineno">11226</span>  <a class="code" href="namespacetesting_1_1internal.html#a5d3e97443d23bf1824f87feb172efd39">ReportInvalidTestSuiteType</a>(test_suite_name, code_location);</div><div class="line"><a name="l11227"></a><span class="lineno">11227</span>  <a class="code" href="namespacetesting_1_1internal_1_1posix.html#a69b8278c59359dd6a6f941b4643db9fb">posix::Abort</a>();</div><div class="line"><a name="l11228"></a><span class="lineno">11228</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l11229"></a><span class="lineno">11229</span>  <span class="comment">// At this point we are sure that the object we found is of the same</span></div><div class="line"><a name="l11230"></a><span class="lineno">11230</span>  <span class="comment">// type we are looking for, so we downcast it to that type</span></div><div class="line"><a name="l11231"></a><span class="lineno">11231</span>  <span class="comment">// without further checks.</span></div><div class="line"><a name="l11232"></a><span class="lineno">11232</span>  typed_test_info = <a class="code" href="namespacetesting_1_1internal.html#abfe9bfb020d38aa4e0e12c001911b22b">CheckedDowncastToActualType</a><</div><div class="line"><a name="l11233"></a><span class="lineno">11233</span>  <a class="code" href="classtesting_1_1internal_1_1_parameterized_test_suite_info.html">ParameterizedTestSuiteInfo<TestSuite></a> >(test_suite_info);</div><div class="line"><a name="l11234"></a><span class="lineno">11234</span>  }</div><div class="line"><a name="l11235"></a><span class="lineno">11235</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l11236"></a><span class="lineno">11236</span>  }</div><div class="line"><a name="l11237"></a><span class="lineno">11237</span>  }</div><div class="line"><a name="l11238"></a><span class="lineno">11238</span>  <span class="keywordflow">if</span> (typed_test_info == <span class="keyword">nullptr</span>) {</div><div class="line"><a name="l11239"></a><span class="lineno">11239</span>  typed_test_info = <span class="keyword">new</span> <a class="code" href="classtesting_1_1internal_1_1_parameterized_test_suite_info.html">ParameterizedTestSuiteInfo<TestSuite></a>(</div><div class="line"><a name="l11240"></a><span class="lineno">11240</span>  test_suite_name, code_location);</div><div class="line"><a name="l11241"></a><span class="lineno">11241</span>  test_suite_infos_.push_back(typed_test_info);</div><div class="line"><a name="l11242"></a><span class="lineno">11242</span>  }</div><div class="line"><a name="l11243"></a><span class="lineno">11243</span>  <span class="keywordflow">return</span> typed_test_info;</div><div class="line"><a name="l11244"></a><span class="lineno">11244</span>  }</div><div class="line"><a name="l11245"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_parameterized_test_suite_registry.html#a44c2ee0296de42dc6ca7abbf48d00495">11245</a></span>  <span class="keywordtype">void</span> <a class="code" href="classtesting_1_1internal_1_1_parameterized_test_suite_registry.html#a44c2ee0296de42dc6ca7abbf48d00495">RegisterTests</a>() {</div><div class="line"><a name="l11246"></a><span class="lineno">11246</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span>& test_suite_info : test_suite_infos_) {</div><div class="line"><a name="l11247"></a><span class="lineno">11247</span>  test_suite_info->RegisterTests();</div><div class="line"><a name="l11248"></a><span class="lineno">11248</span>  }</div><div class="line"><a name="l11249"></a><span class="lineno">11249</span>  }</div><div class="line"><a name="l11250"></a><span class="lineno">11250</span> <span class="comment">// Legacy API is deprecated but still available</span></div><div class="line"><a name="l11251"></a><span class="lineno">11251</span> <span class="preprocessor">#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_</span></div><div class="line"><a name="l11252"></a><span class="lineno">11252</span>  <span class="keyword">template</span> <<span class="keyword">class</span> TestCase></div><div class="line"><a name="l11253"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_parameterized_test_suite_registry.html#a3fe06fb4e1b4194dae1fbcdf3560fbd3">11253</a></span>  <a class="code" href="classtesting_1_1internal_1_1_parameterized_test_suite_info.html">ParameterizedTestCaseInfo<TestCase></a>* <a class="code" href="classtesting_1_1internal_1_1_parameterized_test_suite_registry.html#a3fe06fb4e1b4194dae1fbcdf3560fbd3">GetTestCasePatternHolder</a>(</div><div class="line"><a name="l11254"></a><span class="lineno">11254</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* test_case_name, <a class="code" href="structtesting_1_1internal_1_1_code_location.html">CodeLocation</a> code_location) {</div><div class="line"><a name="l11255"></a><span class="lineno">11255</span>  <span class="keywordflow">return</span> GetTestSuitePatternHolder<TestCase>(test_case_name, code_location);</div><div class="line"><a name="l11256"></a><span class="lineno">11256</span>  }</div><div class="line"><a name="l11257"></a><span class="lineno">11257</span> </div><div class="line"><a name="l11258"></a><span class="lineno">11258</span> <span class="preprocessor">#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_</span></div><div class="line"><a name="l11259"></a><span class="lineno">11259</span> </div><div class="line"><a name="l11260"></a><span class="lineno">11260</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l11261"></a><span class="lineno">11261</span>  <span class="keyword">using</span> TestSuiteInfoContainer = ::std::vector<ParameterizedTestSuiteInfoBase*>;</div><div class="line"><a name="l11262"></a><span class="lineno">11262</span> </div><div class="line"><a name="l11263"></a><span class="lineno">11263</span>  TestSuiteInfoContainer test_suite_infos_;</div><div class="line"><a name="l11264"></a><span class="lineno">11264</span> </div><div class="line"><a name="l11265"></a><span class="lineno">11265</span>  GTEST_DISALLOW_COPY_AND_ASSIGN_(<a class="code" href="classtesting_1_1internal_1_1_parameterized_test_suite_registry.html">ParameterizedTestSuiteRegistry</a>);</div><div class="line"><a name="l11266"></a><span class="lineno">11266</span> };</div><div class="line"><a name="l11267"></a><span class="lineno">11267</span> </div><div class="line"><a name="l11268"></a><span class="lineno">11268</span> } <span class="comment">// namespace internal</span></div><div class="line"><a name="l11269"></a><span class="lineno">11269</span> </div><div class="line"><a name="l11270"></a><span class="lineno">11270</span> <span class="comment">// Forward declarations of ValuesIn(), which is implemented in</span></div><div class="line"><a name="l11271"></a><span class="lineno">11271</span> <span class="comment">// include/gtest/gtest-param-test.h.</span></div><div class="line"><a name="l11272"></a><span class="lineno">11272</span> <span class="keyword">template</span> <<span class="keyword">class</span> Container></div><div class="line"><a name="l11273"></a><span class="lineno">11273</span> internal::ParamGenerator<typename Container::value_type> <a class="code" href="namespacetesting.html#aa67d0c8470c5f69fcfcacc9e775fa982">ValuesIn</a>(</div><div class="line"><a name="l11274"></a><span class="lineno">11274</span>  <span class="keyword">const</span> Container& container);</div><div class="line"><a name="l11275"></a><span class="lineno">11275</span> </div><div class="line"><a name="l11276"></a><span class="lineno">11276</span> <span class="keyword">namespace </span>internal {</div><div class="line"><a name="l11277"></a><span class="lineno">11277</span> <span class="comment">// Used in the Values() function to provide polymorphic capabilities.</span></div><div class="line"><a name="l11278"></a><span class="lineno">11278</span> </div><div class="line"><a name="l11279"></a><span class="lineno">11279</span> <span class="keyword">template</span> <<span class="keyword">typename</span>... Ts></div><div class="line"><a name="l11280"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_value_array.html">11280</a></span> <span class="keyword">class </span><a class="code" href="classtesting_1_1internal_1_1_value_array.html">ValueArray</a> {</div><div class="line"><a name="l11281"></a><span class="lineno">11281</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l11282"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_value_array.html#acd7cd6a969a7e95152eac1787c42c9ed">11282</a></span>  <a class="code" href="classtesting_1_1internal_1_1_value_array.html#acd7cd6a969a7e95152eac1787c42c9ed">ValueArray</a>(Ts... v) : v_{std::move(v)...} {}</div><div class="line"><a name="l11283"></a><span class="lineno">11283</span> </div><div class="line"><a name="l11284"></a><span class="lineno">11284</span>  <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l11285"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_value_array.html#a019560f10debdce5f47bb18c0e5261b5">11285</a></span>  <span class="keyword">operator</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T></a>() <span class="keyword">const</span> { <span class="comment">// NOLINT</span></div><div class="line"><a name="l11286"></a><span class="lineno">11286</span>  <span class="keywordflow">return</span> <a class="code" href="namespacetesting.html#aa67d0c8470c5f69fcfcacc9e775fa982">ValuesIn</a>(MakeVector<T>(<a class="code" href="structtesting_1_1internal_1_1_make_index_sequence.html">MakeIndexSequence</a><<span class="keyword">sizeof</span>...(Ts)>()));</div><div class="line"><a name="l11287"></a><span class="lineno">11287</span>  }</div><div class="line"><a name="l11288"></a><span class="lineno">11288</span> </div><div class="line"><a name="l11289"></a><span class="lineno">11289</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l11290"></a><span class="lineno">11290</span>  <span class="keyword">template</span> <<span class="keyword">typename</span> T, <span class="keywordtype">size_t</span>... I></div><div class="line"><a name="l11291"></a><span class="lineno">11291</span>  std::vector<T> MakeVector(<a class="code" href="structtesting_1_1internal_1_1_index_sequence.html">IndexSequence<I...></a>)<span class="keyword"> const </span>{</div><div class="line"><a name="l11292"></a><span class="lineno">11292</span>  <span class="keywordflow">return</span> std::vector<T>{<span class="keyword">static_cast<</span>T<span class="keyword">></span>(v_.template Get<I>())...};</div><div class="line"><a name="l11293"></a><span class="lineno">11293</span>  }</div><div class="line"><a name="l11294"></a><span class="lineno">11294</span> </div><div class="line"><a name="l11295"></a><span class="lineno">11295</span>  FlatTuple<Ts...> v_;</div><div class="line"><a name="l11296"></a><span class="lineno">11296</span> };</div><div class="line"><a name="l11297"></a><span class="lineno">11297</span> </div><div class="line"><a name="l11298"></a><span class="lineno">11298</span> } <span class="comment">// namespace internal</span></div><div class="line"><a name="l11299"></a><span class="lineno">11299</span> } <span class="comment">// namespace testing</span></div><div class="line"><a name="l11300"></a><span class="lineno">11300</span> </div><div class="line"><a name="l11301"></a><span class="lineno">11301</span> <span class="preprocessor">#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_</span></div><div class="line"><a name="l11302"></a><span class="lineno">11302</span> <span class="comment">// This file was GENERATED by command:</span></div><div class="line"><a name="l11303"></a><span class="lineno">11303</span> <span class="comment">// pump.py gtest-param-util-generated.h.pump</span></div><div class="line"><a name="l11304"></a><span class="lineno">11304</span> <span class="comment">// DO NOT EDIT BY HAND!!!</span></div><div class="line"><a name="l11305"></a><span class="lineno">11305</span> </div><div class="line"><a name="l11306"></a><span class="lineno">11306</span> <span class="comment">// Copyright 2008 Google Inc.</span></div><div class="line"><a name="l11307"></a><span class="lineno">11307</span> <span class="comment">// All Rights Reserved.</span></div><div class="line"><a name="l11308"></a><span class="lineno">11308</span> <span class="comment">//</span></div><div class="line"><a name="l11309"></a><span class="lineno">11309</span> <span class="comment">// Redistribution and use in source and binary forms, with or without</span></div><div class="line"><a name="l11310"></a><span class="lineno">11310</span> <span class="comment">// modification, are permitted provided that the following conditions are</span></div><div class="line"><a name="l11311"></a><span class="lineno">11311</span> <span class="comment">// met:</span></div><div class="line"><a name="l11312"></a><span class="lineno">11312</span> <span class="comment">//</span></div><div class="line"><a name="l11313"></a><span class="lineno">11313</span> <span class="comment">// * Redistributions of source code must retain the above copyright</span></div><div class="line"><a name="l11314"></a><span class="lineno">11314</span> <span class="comment">// notice, this list of conditions and the following disclaimer.</span></div><div class="line"><a name="l11315"></a><span class="lineno">11315</span> <span class="comment">// * Redistributions in binary form must reproduce the above</span></div><div class="line"><a name="l11316"></a><span class="lineno">11316</span> <span class="comment">// copyright notice, this list of conditions and the following disclaimer</span></div><div class="line"><a name="l11317"></a><span class="lineno">11317</span> <span class="comment">// in the documentation and/or other materials provided with the</span></div><div class="line"><a name="l11318"></a><span class="lineno">11318</span> <span class="comment">// distribution.</span></div><div class="line"><a name="l11319"></a><span class="lineno">11319</span> <span class="comment">// * Neither the name of Google Inc. nor the names of its</span></div><div class="line"><a name="l11320"></a><span class="lineno">11320</span> <span class="comment">// contributors may be used to endorse or promote products derived from</span></div><div class="line"><a name="l11321"></a><span class="lineno">11321</span> <span class="comment">// this software without specific prior written permission.</span></div><div class="line"><a name="l11322"></a><span class="lineno">11322</span> <span class="comment">//</span></div><div class="line"><a name="l11323"></a><span class="lineno">11323</span> <span class="comment">// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS</span></div><div class="line"><a name="l11324"></a><span class="lineno">11324</span> <span class="comment">// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT</span></div><div class="line"><a name="l11325"></a><span class="lineno">11325</span> <span class="comment">// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR</span></div><div class="line"><a name="l11326"></a><span class="lineno">11326</span> <span class="comment">// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT</span></div><div class="line"><a name="l11327"></a><span class="lineno">11327</span> <span class="comment">// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,</span></div><div class="line"><a name="l11328"></a><span class="lineno">11328</span> <span class="comment">// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT</span></div><div class="line"><a name="l11329"></a><span class="lineno">11329</span> <span class="comment">// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,</span></div><div class="line"><a name="l11330"></a><span class="lineno">11330</span> <span class="comment">// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY</span></div><div class="line"><a name="l11331"></a><span class="lineno">11331</span> <span class="comment">// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</span></div><div class="line"><a name="l11332"></a><span class="lineno">11332</span> <span class="comment">// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE</span></div><div class="line"><a name="l11333"></a><span class="lineno">11333</span> <span class="comment">// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span></div><div class="line"><a name="l11334"></a><span class="lineno">11334</span> </div><div class="line"><a name="l11335"></a><span class="lineno">11335</span> </div><div class="line"><a name="l11336"></a><span class="lineno">11336</span> <span class="comment">// Type and function utilities for implementing parameterized tests.</span></div><div class="line"><a name="l11337"></a><span class="lineno">11337</span> <span class="comment">// This file is generated by a SCRIPT. DO NOT EDIT BY HAND!</span></div><div class="line"><a name="l11338"></a><span class="lineno">11338</span> <span class="comment">//</span></div><div class="line"><a name="l11339"></a><span class="lineno">11339</span> <span class="comment">// Currently Google Test supports at most 50 arguments in Values,</span></div><div class="line"><a name="l11340"></a><span class="lineno">11340</span> <span class="comment">// and at most 10 arguments in Combine. Please contact</span></div><div class="line"><a name="l11341"></a><span class="lineno">11341</span> <span class="comment">// googletestframework@googlegroups.com if you need more.</span></div><div class="line"><a name="l11342"></a><span class="lineno">11342</span> <span class="comment">// Please note that the number of arguments to Combine is limited</span></div><div class="line"><a name="l11343"></a><span class="lineno">11343</span> <span class="comment">// by the maximum arity of the implementation of tuple which is</span></div><div class="line"><a name="l11344"></a><span class="lineno">11344</span> <span class="comment">// currently set at 10.</span></div><div class="line"><a name="l11345"></a><span class="lineno">11345</span> </div><div class="line"><a name="l11346"></a><span class="lineno">11346</span> <span class="comment">// GOOGLETEST_CM0001 DO NOT DELETE</span></div><div class="line"><a name="l11347"></a><span class="lineno">11347</span> </div><div class="line"><a name="l11348"></a><span class="lineno">11348</span> <span class="preprocessor">#include <assert.h></span></div><div class="line"><a name="l11349"></a><span class="lineno">11349</span> </div><div class="line"><a name="l11350"></a><span class="lineno">11350</span> <span class="preprocessor">#include <memory></span></div><div class="line"><a name="l11351"></a><span class="lineno">11351</span> </div><div class="line"><a name="l11352"></a><span class="lineno">11352</span> <span class="preprocessor">#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_</span></div><div class="line"><a name="l11353"></a><span class="lineno"><a class="line" href="gtest_8h.html#a34b82ce6255f2f5666647d35498f4c65">11353</a></span> <span class="preprocessor">#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_</span></div><div class="line"><a name="l11354"></a><span class="lineno">11354</span> </div><div class="line"><a name="l11355"></a><span class="lineno">11355</span> </div><div class="line"><a name="l11356"></a><span class="lineno">11356</span> <span class="keyword">namespace </span><a class="code" href="namespacetesting.html">testing</a> {</div><div class="line"><a name="l11357"></a><span class="lineno">11357</span> </div><div class="line"><a name="l11358"></a><span class="lineno">11358</span> <span class="keyword">namespace </span>internal {</div><div class="line"><a name="l11359"></a><span class="lineno">11359</span> <span class="comment">// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.</span></div><div class="line"><a name="l11360"></a><span class="lineno">11360</span> <span class="comment">//</span></div><div class="line"><a name="l11361"></a><span class="lineno">11361</span> <span class="comment">// Generates values from the Cartesian product of values produced</span></div><div class="line"><a name="l11362"></a><span class="lineno">11362</span> <span class="comment">// by the argument generators.</span></div><div class="line"><a name="l11363"></a><span class="lineno">11363</span> <span class="comment">//</span></div><div class="line"><a name="l11364"></a><span class="lineno">11364</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2></div><div class="line"><a name="l11365"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_generator2.html">11365</a></span> <span class="keyword">class </span><a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator2.html">CartesianProductGenerator2</a></div><div class="line"><a name="l11366"></a><span class="lineno">11366</span>  : <span class="keyword">public</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator_interface.html">ParamGeneratorInterface</a>< ::std::tuple<T1, T2> > {</div><div class="line"><a name="l11367"></a><span class="lineno">11367</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l11368"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_generator2.html#a4dd5db877d076b52d44fb631e34cd47f">11368</a></span>  typedef ::std::tuple<T1, T2> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator2.html#a4dd5db877d076b52d44fb631e34cd47f">ParamType</a>;</div><div class="line"><a name="l11369"></a><span class="lineno">11369</span> </div><div class="line"><a name="l11370"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_generator2.html#a971ef5a45783db277f5fae84eaef41a3">11370</a></span>  <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator2.html#a971ef5a45783db277f5fae84eaef41a3">CartesianProductGenerator2</a>(<span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T1></a>& g1,</div><div class="line"><a name="l11371"></a><span class="lineno">11371</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T2></a>& g2)</div><div class="line"><a name="l11372"></a><span class="lineno">11372</span>  : g1_(g1), g2_(g2) {}</div><div class="line"><a name="l11373"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_generator2.html#a4359f80cc1888d4a18d2e0a6865b920d">11373</a></span>  <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator2.html#a4359f80cc1888d4a18d2e0a6865b920d">~CartesianProductGenerator2</a>()<span class="keyword"> override </span>{}</div><div class="line"><a name="l11374"></a><span class="lineno">11374</span> </div><div class="line"><a name="l11375"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_generator2.html#aa68e7d9334ba6318bc17ccb0669767fe">11375</a></span>  <a class="code" href="classtesting_1_1internal_1_1_param_iterator_interface.html">ParamIteratorInterface<ParamType></a>* <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator2.html#aa68e7d9334ba6318bc17ccb0669767fe">Begin</a>()<span class="keyword"> const override </span>{</div><div class="line"><a name="l11376"></a><span class="lineno">11376</span>  <span class="keywordflow">return</span> <span class="keyword">new</span> Iterator(<span class="keyword">this</span>, g1_, g1_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a14e735c8bd113556ae905a560cd2d607">begin</a>(), g2_, g2_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a14e735c8bd113556ae905a560cd2d607">begin</a>());</div><div class="line"><a name="l11377"></a><span class="lineno">11377</span>  }</div><div class="line"><a name="l11378"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_generator2.html#afb1a5fe2810721040689e2e8c85b8a42">11378</a></span>  <a class="code" href="classtesting_1_1internal_1_1_param_iterator_interface.html">ParamIteratorInterface<ParamType></a>* <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator2.html#afb1a5fe2810721040689e2e8c85b8a42">End</a>()<span class="keyword"> const override </span>{</div><div class="line"><a name="l11379"></a><span class="lineno">11379</span>  <span class="keywordflow">return</span> <span class="keyword">new</span> Iterator(<span class="keyword">this</span>, g1_, g1_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#aaf8f75df1099a07ff771a550b48f9fbe">end</a>(), g2_, g2_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#aaf8f75df1099a07ff771a550b48f9fbe">end</a>());</div><div class="line"><a name="l11380"></a><span class="lineno">11380</span>  }</div><div class="line"><a name="l11381"></a><span class="lineno">11381</span> </div><div class="line"><a name="l11382"></a><span class="lineno">11382</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l11383"></a><span class="lineno">11383</span>  <span class="keyword">class </span>Iterator : <span class="keyword">public</span> <a class="code" href="classtesting_1_1internal_1_1_param_iterator_interface.html">ParamIteratorInterface</a><ParamType> {</div><div class="line"><a name="l11384"></a><span class="lineno">11384</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l11385"></a><span class="lineno">11385</span>  Iterator(<span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator_interface.html">ParamGeneratorInterface<ParamType></a>* base,</div><div class="line"><a name="l11386"></a><span class="lineno">11386</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T1></a>& g1,</div><div class="line"><a name="l11387"></a><span class="lineno">11387</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T1>::iterator</a>& current1,</div><div class="line"><a name="l11388"></a><span class="lineno">11388</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T2></a>& g2,</div><div class="line"><a name="l11389"></a><span class="lineno">11389</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T2>::iterator</a>& current2)</div><div class="line"><a name="l11390"></a><span class="lineno">11390</span>  : base_(base),</div><div class="line"><a name="l11391"></a><span class="lineno">11391</span>  begin1_(g1.begin()), end1_(g1.end()), current1_(current1),</div><div class="line"><a name="l11392"></a><span class="lineno">11392</span>  begin2_(g2.begin()), end2_(g2.end()), current2_(current2) {</div><div class="line"><a name="l11393"></a><span class="lineno">11393</span>  ComputeCurrentValue();</div><div class="line"><a name="l11394"></a><span class="lineno">11394</span>  }</div><div class="line"><a name="l11395"></a><span class="lineno">11395</span>  ~Iterator()<span class="keyword"> override </span>{}</div><div class="line"><a name="l11396"></a><span class="lineno">11396</span> </div><div class="line"><a name="l11397"></a><span class="lineno">11397</span>  <span class="keyword">const</span> ParamGeneratorInterface<ParamType>* BaseGenerator()<span class="keyword"> const override </span>{</div><div class="line"><a name="l11398"></a><span class="lineno">11398</span>  <span class="keywordflow">return</span> base_;</div><div class="line"><a name="l11399"></a><span class="lineno">11399</span>  }</div><div class="line"><a name="l11400"></a><span class="lineno">11400</span>  <span class="comment">// Advance should not be called on beyond-of-range iterators</span></div><div class="line"><a name="l11401"></a><span class="lineno">11401</span>  <span class="comment">// so no component iterators must be beyond end of range, either.</span></div><div class="line"><a name="l11402"></a><span class="lineno">11402</span>  <span class="keywordtype">void</span> Advance()<span class="keyword"> override </span>{</div><div class="line"><a name="l11403"></a><span class="lineno">11403</span>  assert(!AtEnd());</div><div class="line"><a name="l11404"></a><span class="lineno">11404</span>  ++current2_;</div><div class="line"><a name="l11405"></a><span class="lineno">11405</span>  <span class="keywordflow">if</span> (current2_ == end2_) {</div><div class="line"><a name="l11406"></a><span class="lineno">11406</span>  current2_ = begin2_;</div><div class="line"><a name="l11407"></a><span class="lineno">11407</span>  ++current1_;</div><div class="line"><a name="l11408"></a><span class="lineno">11408</span>  }</div><div class="line"><a name="l11409"></a><span class="lineno">11409</span>  ComputeCurrentValue();</div><div class="line"><a name="l11410"></a><span class="lineno">11410</span>  }</div><div class="line"><a name="l11411"></a><span class="lineno">11411</span>  ParamIteratorInterface<ParamType>* Clone()<span class="keyword"> const override </span>{</div><div class="line"><a name="l11412"></a><span class="lineno">11412</span>  <span class="keywordflow">return</span> <span class="keyword">new</span> Iterator(*<span class="keyword">this</span>);</div><div class="line"><a name="l11413"></a><span class="lineno">11413</span>  }</div><div class="line"><a name="l11414"></a><span class="lineno">11414</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator2.html#a4dd5db877d076b52d44fb631e34cd47f">ParamType</a>* Current()<span class="keyword"> const override </span>{ <span class="keywordflow">return</span> current_value_.get(); }</div><div class="line"><a name="l11415"></a><span class="lineno">11415</span>  <span class="keywordtype">bool</span> <a class="code" href="classtesting_1_1internal_1_1_param_iterator_interface.html#a9d811697a752d46f7bd6a0082f9040a3">Equals</a>(<span class="keyword">const</span> ParamIteratorInterface<ParamType>& other)<span class="keyword"> const override </span>{</div><div class="line"><a name="l11416"></a><span class="lineno">11416</span>  <span class="comment">// Having the same base generator guarantees that the other</span></div><div class="line"><a name="l11417"></a><span class="lineno">11417</span>  <span class="comment">// iterator is of the same type and we can downcast.</span></div><div class="line"><a name="l11418"></a><span class="lineno">11418</span>  <a class="code" href="gtest_8h.html#ab54343f0a36dc4cb0ce8a478dd7847b8">GTEST_CHECK_</a>(BaseGenerator() == other.BaseGenerator())</div><div class="line"><a name="l11419"></a><span class="lineno">11419</span>  << <span class="stringliteral">"The program attempted to compare iterators "</span></div><div class="line"><a name="l11420"></a><span class="lineno">11420</span>  << <span class="stringliteral">"from different generators."</span> << std::endl;</div><div class="line"><a name="l11421"></a><span class="lineno">11421</span>  <span class="keyword">const</span> Iterator* typed_other =</div><div class="line"><a name="l11422"></a><span class="lineno">11422</span>  CheckedDowncastToActualType<const Iterator>(&other);</div><div class="line"><a name="l11423"></a><span class="lineno">11423</span>  <span class="comment">// We must report iterators equal if they both point beyond their</span></div><div class="line"><a name="l11424"></a><span class="lineno">11424</span>  <span class="comment">// respective ranges. That can happen in a variety of fashions,</span></div><div class="line"><a name="l11425"></a><span class="lineno">11425</span>  <span class="comment">// so we have to consult AtEnd().</span></div><div class="line"><a name="l11426"></a><span class="lineno">11426</span>  <span class="keywordflow">return</span> (AtEnd() && typed_other->AtEnd()) ||</div><div class="line"><a name="l11427"></a><span class="lineno">11427</span>  (</div><div class="line"><a name="l11428"></a><span class="lineno">11428</span>  current1_ == typed_other->current1_ &&</div><div class="line"><a name="l11429"></a><span class="lineno">11429</span>  current2_ == typed_other->current2_);</div><div class="line"><a name="l11430"></a><span class="lineno">11430</span>  }</div><div class="line"><a name="l11431"></a><span class="lineno">11431</span> </div><div class="line"><a name="l11432"></a><span class="lineno">11432</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l11433"></a><span class="lineno">11433</span>  Iterator(<span class="keyword">const</span> Iterator& other)</div><div class="line"><a name="l11434"></a><span class="lineno">11434</span>  : base_(other.base_),</div><div class="line"><a name="l11435"></a><span class="lineno">11435</span>  begin1_(other.begin1_),</div><div class="line"><a name="l11436"></a><span class="lineno">11436</span>  end1_(other.end1_),</div><div class="line"><a name="l11437"></a><span class="lineno">11437</span>  current1_(other.current1_),</div><div class="line"><a name="l11438"></a><span class="lineno">11438</span>  begin2_(other.begin2_),</div><div class="line"><a name="l11439"></a><span class="lineno">11439</span>  end2_(other.end2_),</div><div class="line"><a name="l11440"></a><span class="lineno">11440</span>  current2_(other.current2_) {</div><div class="line"><a name="l11441"></a><span class="lineno">11441</span>  ComputeCurrentValue();</div><div class="line"><a name="l11442"></a><span class="lineno">11442</span>  }</div><div class="line"><a name="l11443"></a><span class="lineno">11443</span> </div><div class="line"><a name="l11444"></a><span class="lineno">11444</span>  <span class="keywordtype">void</span> ComputeCurrentValue() {</div><div class="line"><a name="l11445"></a><span class="lineno">11445</span>  <span class="keywordflow">if</span> (!AtEnd())</div><div class="line"><a name="l11446"></a><span class="lineno">11446</span>  current_value_.reset(<span class="keyword">new</span> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator2.html#a4dd5db877d076b52d44fb631e34cd47f">ParamType</a>(*current1_, *current2_));</div><div class="line"><a name="l11447"></a><span class="lineno">11447</span>  }</div><div class="line"><a name="l11448"></a><span class="lineno">11448</span>  <span class="keywordtype">bool</span> AtEnd()<span class="keyword"> const </span>{</div><div class="line"><a name="l11449"></a><span class="lineno">11449</span>  <span class="comment">// We must report iterator past the end of the range when either of the</span></div><div class="line"><a name="l11450"></a><span class="lineno">11450</span>  <span class="comment">// component iterators has reached the end of its range.</span></div><div class="line"><a name="l11451"></a><span class="lineno">11451</span>  <span class="keywordflow">return</span></div><div class="line"><a name="l11452"></a><span class="lineno">11452</span>  current1_ == end1_ ||</div><div class="line"><a name="l11453"></a><span class="lineno">11453</span>  current2_ == end2_;</div><div class="line"><a name="l11454"></a><span class="lineno">11454</span>  }</div><div class="line"><a name="l11455"></a><span class="lineno">11455</span> </div><div class="line"><a name="l11456"></a><span class="lineno">11456</span>  <span class="comment">// No implementation - assignment is unsupported.</span></div><div class="line"><a name="l11457"></a><span class="lineno">11457</span>  <span class="keywordtype">void</span> operator=(<span class="keyword">const</span> Iterator& other);</div><div class="line"><a name="l11458"></a><span class="lineno">11458</span> </div><div class="line"><a name="l11459"></a><span class="lineno">11459</span>  <span class="keyword">const</span> ParamGeneratorInterface<ParamType>* <span class="keyword">const</span> base_;</div><div class="line"><a name="l11460"></a><span class="lineno">11460</span>  <span class="comment">// begin[i]_ and end[i]_ define the i-th range that Iterator traverses.</span></div><div class="line"><a name="l11461"></a><span class="lineno">11461</span>  <span class="comment">// current[i]_ is the actual traversing iterator.</span></div><div class="line"><a name="l11462"></a><span class="lineno">11462</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T1>::iterator</a> begin1_;</div><div class="line"><a name="l11463"></a><span class="lineno">11463</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T1>::iterator</a> end1_;</div><div class="line"><a name="l11464"></a><span class="lineno">11464</span>  <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T1>::iterator</a> current1_;</div><div class="line"><a name="l11465"></a><span class="lineno">11465</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T2>::iterator</a> begin2_;</div><div class="line"><a name="l11466"></a><span class="lineno">11466</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T2>::iterator</a> end2_;</div><div class="line"><a name="l11467"></a><span class="lineno">11467</span>  <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T2>::iterator</a> current2_;</div><div class="line"><a name="l11468"></a><span class="lineno">11468</span>  std::shared_ptr<ParamType> current_value_;</div><div class="line"><a name="l11469"></a><span class="lineno">11469</span>  }; <span class="comment">// class CartesianProductGenerator2::Iterator</span></div><div class="line"><a name="l11470"></a><span class="lineno">11470</span> </div><div class="line"><a name="l11471"></a><span class="lineno">11471</span>  <span class="comment">// No implementation - assignment is unsupported.</span></div><div class="line"><a name="l11472"></a><span class="lineno">11472</span>  <span class="keywordtype">void</span> operator=(<span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator2.html#a971ef5a45783db277f5fae84eaef41a3">CartesianProductGenerator2</a>& other);</div><div class="line"><a name="l11473"></a><span class="lineno">11473</span> </div><div class="line"><a name="l11474"></a><span class="lineno">11474</span>  <span class="keyword">const</span> ParamGenerator<T1> g1_;</div><div class="line"><a name="l11475"></a><span class="lineno">11475</span>  <span class="keyword">const</span> ParamGenerator<T2> g2_;</div><div class="line"><a name="l11476"></a><span class="lineno">11476</span> }; <span class="comment">// class CartesianProductGenerator2</span></div><div class="line"><a name="l11477"></a><span class="lineno">11477</span> </div><div class="line"><a name="l11478"></a><span class="lineno">11478</span> </div><div class="line"><a name="l11479"></a><span class="lineno">11479</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3></div><div class="line"><a name="l11480"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_generator3.html">11480</a></span> <span class="keyword">class </span><a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator3.html">CartesianProductGenerator3</a></div><div class="line"><a name="l11481"></a><span class="lineno">11481</span>  : <span class="keyword">public</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator_interface.html">ParamGeneratorInterface</a>< ::std::tuple<T1, T2, T3> > {</div><div class="line"><a name="l11482"></a><span class="lineno">11482</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l11483"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_generator3.html#a8ef3e248a6d5ba1ea4ae17a8d045e98a">11483</a></span>  typedef ::std::tuple<T1, T2, T3> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator3.html#a8ef3e248a6d5ba1ea4ae17a8d045e98a">ParamType</a>;</div><div class="line"><a name="l11484"></a><span class="lineno">11484</span> </div><div class="line"><a name="l11485"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_generator3.html#afdca1e94b01f654564b9cbe66fb5ca94">11485</a></span>  <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator3.html#afdca1e94b01f654564b9cbe66fb5ca94">CartesianProductGenerator3</a>(<span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T1></a>& g1,</div><div class="line"><a name="l11486"></a><span class="lineno">11486</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T2></a>& g2, <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T3></a>& g3)</div><div class="line"><a name="l11487"></a><span class="lineno">11487</span>  : g1_(g1), g2_(g2), g3_(g3) {}</div><div class="line"><a name="l11488"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_generator3.html#a230b2ec353e917e1afeb6aae5668e19e">11488</a></span>  <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator3.html#a230b2ec353e917e1afeb6aae5668e19e">~CartesianProductGenerator3</a>()<span class="keyword"> override </span>{}</div><div class="line"><a name="l11489"></a><span class="lineno">11489</span> </div><div class="line"><a name="l11490"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_generator3.html#a2a1d5af705de6cc340291294fa38437e">11490</a></span>  <a class="code" href="classtesting_1_1internal_1_1_param_iterator_interface.html">ParamIteratorInterface<ParamType></a>* <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator3.html#a2a1d5af705de6cc340291294fa38437e">Begin</a>()<span class="keyword"> const override </span>{</div><div class="line"><a name="l11491"></a><span class="lineno">11491</span>  <span class="keywordflow">return</span> <span class="keyword">new</span> Iterator(<span class="keyword">this</span>, g1_, g1_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a14e735c8bd113556ae905a560cd2d607">begin</a>(), g2_, g2_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a14e735c8bd113556ae905a560cd2d607">begin</a>(), g3_,</div><div class="line"><a name="l11492"></a><span class="lineno">11492</span>  g3_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a14e735c8bd113556ae905a560cd2d607">begin</a>());</div><div class="line"><a name="l11493"></a><span class="lineno">11493</span>  }</div><div class="line"><a name="l11494"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_generator3.html#a474d70e577e76b7f84b0d83e90a6ec89">11494</a></span>  <a class="code" href="classtesting_1_1internal_1_1_param_iterator_interface.html">ParamIteratorInterface<ParamType></a>* <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator3.html#a474d70e577e76b7f84b0d83e90a6ec89">End</a>()<span class="keyword"> const override </span>{</div><div class="line"><a name="l11495"></a><span class="lineno">11495</span>  <span class="keywordflow">return</span> <span class="keyword">new</span> Iterator(<span class="keyword">this</span>, g1_, g1_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#aaf8f75df1099a07ff771a550b48f9fbe">end</a>(), g2_, g2_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#aaf8f75df1099a07ff771a550b48f9fbe">end</a>(), g3_, g3_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#aaf8f75df1099a07ff771a550b48f9fbe">end</a>());</div><div class="line"><a name="l11496"></a><span class="lineno">11496</span>  }</div><div class="line"><a name="l11497"></a><span class="lineno">11497</span> </div><div class="line"><a name="l11498"></a><span class="lineno">11498</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l11499"></a><span class="lineno">11499</span>  <span class="keyword">class </span>Iterator : <span class="keyword">public</span> <a class="code" href="classtesting_1_1internal_1_1_param_iterator_interface.html">ParamIteratorInterface</a><ParamType> {</div><div class="line"><a name="l11500"></a><span class="lineno">11500</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l11501"></a><span class="lineno">11501</span>  Iterator(<span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator_interface.html">ParamGeneratorInterface<ParamType></a>* base,</div><div class="line"><a name="l11502"></a><span class="lineno">11502</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T1></a>& g1,</div><div class="line"><a name="l11503"></a><span class="lineno">11503</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T1>::iterator</a>& current1,</div><div class="line"><a name="l11504"></a><span class="lineno">11504</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T2></a>& g2,</div><div class="line"><a name="l11505"></a><span class="lineno">11505</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T2>::iterator</a>& current2,</div><div class="line"><a name="l11506"></a><span class="lineno">11506</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T3></a>& g3,</div><div class="line"><a name="l11507"></a><span class="lineno">11507</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T3>::iterator</a>& current3)</div><div class="line"><a name="l11508"></a><span class="lineno">11508</span>  : base_(base),</div><div class="line"><a name="l11509"></a><span class="lineno">11509</span>  begin1_(g1.begin()), end1_(g1.end()), current1_(current1),</div><div class="line"><a name="l11510"></a><span class="lineno">11510</span>  begin2_(g2.begin()), end2_(g2.end()), current2_(current2),</div><div class="line"><a name="l11511"></a><span class="lineno">11511</span>  begin3_(g3.begin()), end3_(g3.end()), current3_(current3) {</div><div class="line"><a name="l11512"></a><span class="lineno">11512</span>  ComputeCurrentValue();</div><div class="line"><a name="l11513"></a><span class="lineno">11513</span>  }</div><div class="line"><a name="l11514"></a><span class="lineno">11514</span>  ~Iterator()<span class="keyword"> override </span>{}</div><div class="line"><a name="l11515"></a><span class="lineno">11515</span> </div><div class="line"><a name="l11516"></a><span class="lineno">11516</span>  <span class="keyword">const</span> ParamGeneratorInterface<ParamType>* BaseGenerator()<span class="keyword"> const override </span>{</div><div class="line"><a name="l11517"></a><span class="lineno">11517</span>  <span class="keywordflow">return</span> base_;</div><div class="line"><a name="l11518"></a><span class="lineno">11518</span>  }</div><div class="line"><a name="l11519"></a><span class="lineno">11519</span>  <span class="comment">// Advance should not be called on beyond-of-range iterators</span></div><div class="line"><a name="l11520"></a><span class="lineno">11520</span>  <span class="comment">// so no component iterators must be beyond end of range, either.</span></div><div class="line"><a name="l11521"></a><span class="lineno">11521</span>  <span class="keywordtype">void</span> Advance()<span class="keyword"> override </span>{</div><div class="line"><a name="l11522"></a><span class="lineno">11522</span>  assert(!AtEnd());</div><div class="line"><a name="l11523"></a><span class="lineno">11523</span>  ++current3_;</div><div class="line"><a name="l11524"></a><span class="lineno">11524</span>  <span class="keywordflow">if</span> (current3_ == end3_) {</div><div class="line"><a name="l11525"></a><span class="lineno">11525</span>  current3_ = begin3_;</div><div class="line"><a name="l11526"></a><span class="lineno">11526</span>  ++current2_;</div><div class="line"><a name="l11527"></a><span class="lineno">11527</span>  }</div><div class="line"><a name="l11528"></a><span class="lineno">11528</span>  <span class="keywordflow">if</span> (current2_ == end2_) {</div><div class="line"><a name="l11529"></a><span class="lineno">11529</span>  current2_ = begin2_;</div><div class="line"><a name="l11530"></a><span class="lineno">11530</span>  ++current1_;</div><div class="line"><a name="l11531"></a><span class="lineno">11531</span>  }</div><div class="line"><a name="l11532"></a><span class="lineno">11532</span>  ComputeCurrentValue();</div><div class="line"><a name="l11533"></a><span class="lineno">11533</span>  }</div><div class="line"><a name="l11534"></a><span class="lineno">11534</span>  ParamIteratorInterface<ParamType>* Clone()<span class="keyword"> const override </span>{</div><div class="line"><a name="l11535"></a><span class="lineno">11535</span>  <span class="keywordflow">return</span> <span class="keyword">new</span> Iterator(*<span class="keyword">this</span>);</div><div class="line"><a name="l11536"></a><span class="lineno">11536</span>  }</div><div class="line"><a name="l11537"></a><span class="lineno">11537</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator3.html#a8ef3e248a6d5ba1ea4ae17a8d045e98a">ParamType</a>* Current()<span class="keyword"> const override </span>{ <span class="keywordflow">return</span> current_value_.get(); }</div><div class="line"><a name="l11538"></a><span class="lineno">11538</span>  <span class="keywordtype">bool</span> <a class="code" href="classtesting_1_1internal_1_1_param_iterator_interface.html#a9d811697a752d46f7bd6a0082f9040a3">Equals</a>(<span class="keyword">const</span> ParamIteratorInterface<ParamType>& other)<span class="keyword"> const override </span>{</div><div class="line"><a name="l11539"></a><span class="lineno">11539</span>  <span class="comment">// Having the same base generator guarantees that the other</span></div><div class="line"><a name="l11540"></a><span class="lineno">11540</span>  <span class="comment">// iterator is of the same type and we can downcast.</span></div><div class="line"><a name="l11541"></a><span class="lineno">11541</span>  <a class="code" href="gtest_8h.html#ab54343f0a36dc4cb0ce8a478dd7847b8">GTEST_CHECK_</a>(BaseGenerator() == other.BaseGenerator())</div><div class="line"><a name="l11542"></a><span class="lineno">11542</span>  << <span class="stringliteral">"The program attempted to compare iterators "</span></div><div class="line"><a name="l11543"></a><span class="lineno">11543</span>  << <span class="stringliteral">"from different generators."</span> << std::endl;</div><div class="line"><a name="l11544"></a><span class="lineno">11544</span>  <span class="keyword">const</span> Iterator* typed_other =</div><div class="line"><a name="l11545"></a><span class="lineno">11545</span>  CheckedDowncastToActualType<const Iterator>(&other);</div><div class="line"><a name="l11546"></a><span class="lineno">11546</span>  <span class="comment">// We must report iterators equal if they both point beyond their</span></div><div class="line"><a name="l11547"></a><span class="lineno">11547</span>  <span class="comment">// respective ranges. That can happen in a variety of fashions,</span></div><div class="line"><a name="l11548"></a><span class="lineno">11548</span>  <span class="comment">// so we have to consult AtEnd().</span></div><div class="line"><a name="l11549"></a><span class="lineno">11549</span>  <span class="keywordflow">return</span> (AtEnd() && typed_other->AtEnd()) ||</div><div class="line"><a name="l11550"></a><span class="lineno">11550</span>  (</div><div class="line"><a name="l11551"></a><span class="lineno">11551</span>  current1_ == typed_other->current1_ &&</div><div class="line"><a name="l11552"></a><span class="lineno">11552</span>  current2_ == typed_other->current2_ &&</div><div class="line"><a name="l11553"></a><span class="lineno">11553</span>  current3_ == typed_other->current3_);</div><div class="line"><a name="l11554"></a><span class="lineno">11554</span>  }</div><div class="line"><a name="l11555"></a><span class="lineno">11555</span> </div><div class="line"><a name="l11556"></a><span class="lineno">11556</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l11557"></a><span class="lineno">11557</span>  Iterator(<span class="keyword">const</span> Iterator& other)</div><div class="line"><a name="l11558"></a><span class="lineno">11558</span>  : base_(other.base_),</div><div class="line"><a name="l11559"></a><span class="lineno">11559</span>  begin1_(other.begin1_),</div><div class="line"><a name="l11560"></a><span class="lineno">11560</span>  end1_(other.end1_),</div><div class="line"><a name="l11561"></a><span class="lineno">11561</span>  current1_(other.current1_),</div><div class="line"><a name="l11562"></a><span class="lineno">11562</span>  begin2_(other.begin2_),</div><div class="line"><a name="l11563"></a><span class="lineno">11563</span>  end2_(other.end2_),</div><div class="line"><a name="l11564"></a><span class="lineno">11564</span>  current2_(other.current2_),</div><div class="line"><a name="l11565"></a><span class="lineno">11565</span>  begin3_(other.begin3_),</div><div class="line"><a name="l11566"></a><span class="lineno">11566</span>  end3_(other.end3_),</div><div class="line"><a name="l11567"></a><span class="lineno">11567</span>  current3_(other.current3_) {</div><div class="line"><a name="l11568"></a><span class="lineno">11568</span>  ComputeCurrentValue();</div><div class="line"><a name="l11569"></a><span class="lineno">11569</span>  }</div><div class="line"><a name="l11570"></a><span class="lineno">11570</span> </div><div class="line"><a name="l11571"></a><span class="lineno">11571</span>  <span class="keywordtype">void</span> ComputeCurrentValue() {</div><div class="line"><a name="l11572"></a><span class="lineno">11572</span>  <span class="keywordflow">if</span> (!AtEnd())</div><div class="line"><a name="l11573"></a><span class="lineno">11573</span>  current_value_.reset(<span class="keyword">new</span> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator3.html#a8ef3e248a6d5ba1ea4ae17a8d045e98a">ParamType</a>(*current1_, *current2_, *current3_));</div><div class="line"><a name="l11574"></a><span class="lineno">11574</span>  }</div><div class="line"><a name="l11575"></a><span class="lineno">11575</span>  <span class="keywordtype">bool</span> AtEnd()<span class="keyword"> const </span>{</div><div class="line"><a name="l11576"></a><span class="lineno">11576</span>  <span class="comment">// We must report iterator past the end of the range when either of the</span></div><div class="line"><a name="l11577"></a><span class="lineno">11577</span>  <span class="comment">// component iterators has reached the end of its range.</span></div><div class="line"><a name="l11578"></a><span class="lineno">11578</span>  <span class="keywordflow">return</span></div><div class="line"><a name="l11579"></a><span class="lineno">11579</span>  current1_ == end1_ ||</div><div class="line"><a name="l11580"></a><span class="lineno">11580</span>  current2_ == end2_ ||</div><div class="line"><a name="l11581"></a><span class="lineno">11581</span>  current3_ == end3_;</div><div class="line"><a name="l11582"></a><span class="lineno">11582</span>  }</div><div class="line"><a name="l11583"></a><span class="lineno">11583</span> </div><div class="line"><a name="l11584"></a><span class="lineno">11584</span>  <span class="comment">// No implementation - assignment is unsupported.</span></div><div class="line"><a name="l11585"></a><span class="lineno">11585</span>  <span class="keywordtype">void</span> operator=(<span class="keyword">const</span> Iterator& other);</div><div class="line"><a name="l11586"></a><span class="lineno">11586</span> </div><div class="line"><a name="l11587"></a><span class="lineno">11587</span>  <span class="keyword">const</span> ParamGeneratorInterface<ParamType>* <span class="keyword">const</span> base_;</div><div class="line"><a name="l11588"></a><span class="lineno">11588</span>  <span class="comment">// begin[i]_ and end[i]_ define the i-th range that Iterator traverses.</span></div><div class="line"><a name="l11589"></a><span class="lineno">11589</span>  <span class="comment">// current[i]_ is the actual traversing iterator.</span></div><div class="line"><a name="l11590"></a><span class="lineno">11590</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T1>::iterator</a> begin1_;</div><div class="line"><a name="l11591"></a><span class="lineno">11591</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T1>::iterator</a> end1_;</div><div class="line"><a name="l11592"></a><span class="lineno">11592</span>  <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T1>::iterator</a> current1_;</div><div class="line"><a name="l11593"></a><span class="lineno">11593</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T2>::iterator</a> begin2_;</div><div class="line"><a name="l11594"></a><span class="lineno">11594</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T2>::iterator</a> end2_;</div><div class="line"><a name="l11595"></a><span class="lineno">11595</span>  <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T2>::iterator</a> current2_;</div><div class="line"><a name="l11596"></a><span class="lineno">11596</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T3>::iterator</a> begin3_;</div><div class="line"><a name="l11597"></a><span class="lineno">11597</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T3>::iterator</a> end3_;</div><div class="line"><a name="l11598"></a><span class="lineno">11598</span>  <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T3>::iterator</a> current3_;</div><div class="line"><a name="l11599"></a><span class="lineno">11599</span>  std::shared_ptr<ParamType> current_value_;</div><div class="line"><a name="l11600"></a><span class="lineno">11600</span>  }; <span class="comment">// class CartesianProductGenerator3::Iterator</span></div><div class="line"><a name="l11601"></a><span class="lineno">11601</span> </div><div class="line"><a name="l11602"></a><span class="lineno">11602</span>  <span class="comment">// No implementation - assignment is unsupported.</span></div><div class="line"><a name="l11603"></a><span class="lineno">11603</span>  <span class="keywordtype">void</span> operator=(<span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator3.html#afdca1e94b01f654564b9cbe66fb5ca94">CartesianProductGenerator3</a>& other);</div><div class="line"><a name="l11604"></a><span class="lineno">11604</span> </div><div class="line"><a name="l11605"></a><span class="lineno">11605</span>  <span class="keyword">const</span> ParamGenerator<T1> g1_;</div><div class="line"><a name="l11606"></a><span class="lineno">11606</span>  <span class="keyword">const</span> ParamGenerator<T2> g2_;</div><div class="line"><a name="l11607"></a><span class="lineno">11607</span>  <span class="keyword">const</span> ParamGenerator<T3> g3_;</div><div class="line"><a name="l11608"></a><span class="lineno">11608</span> }; <span class="comment">// class CartesianProductGenerator3</span></div><div class="line"><a name="l11609"></a><span class="lineno">11609</span> </div><div class="line"><a name="l11610"></a><span class="lineno">11610</span> </div><div class="line"><a name="l11611"></a><span class="lineno">11611</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4></div><div class="line"><a name="l11612"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_generator4.html">11612</a></span> <span class="keyword">class </span><a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator4.html">CartesianProductGenerator4</a></div><div class="line"><a name="l11613"></a><span class="lineno">11613</span>  : <span class="keyword">public</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator_interface.html">ParamGeneratorInterface</a>< ::std::tuple<T1, T2, T3, T4> > {</div><div class="line"><a name="l11614"></a><span class="lineno">11614</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l11615"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_generator4.html#ab5e2480f7abacb80850de470c3225412">11615</a></span>  typedef ::std::tuple<T1, T2, T3, T4> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator4.html#ab5e2480f7abacb80850de470c3225412">ParamType</a>;</div><div class="line"><a name="l11616"></a><span class="lineno">11616</span> </div><div class="line"><a name="l11617"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_generator4.html#a4e4512b35f0d71f7a718ded6fe829296">11617</a></span>  <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator4.html#a4e4512b35f0d71f7a718ded6fe829296">CartesianProductGenerator4</a>(<span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T1></a>& g1,</div><div class="line"><a name="l11618"></a><span class="lineno">11618</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T2></a>& g2, <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T3></a>& g3,</div><div class="line"><a name="l11619"></a><span class="lineno">11619</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T4></a>& g4)</div><div class="line"><a name="l11620"></a><span class="lineno">11620</span>  : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {}</div><div class="line"><a name="l11621"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_generator4.html#a75d7d9ee7bae873295df5d4dbec6a165">11621</a></span>  <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator4.html#a75d7d9ee7bae873295df5d4dbec6a165">~CartesianProductGenerator4</a>()<span class="keyword"> override </span>{}</div><div class="line"><a name="l11622"></a><span class="lineno">11622</span> </div><div class="line"><a name="l11623"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_generator4.html#ae04bf9d551c6dc3996d18e90e88f4bfd">11623</a></span>  <a class="code" href="classtesting_1_1internal_1_1_param_iterator_interface.html">ParamIteratorInterface<ParamType></a>* <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator4.html#ae04bf9d551c6dc3996d18e90e88f4bfd">Begin</a>()<span class="keyword"> const override </span>{</div><div class="line"><a name="l11624"></a><span class="lineno">11624</span>  <span class="keywordflow">return</span> <span class="keyword">new</span> Iterator(<span class="keyword">this</span>, g1_, g1_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a14e735c8bd113556ae905a560cd2d607">begin</a>(), g2_, g2_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a14e735c8bd113556ae905a560cd2d607">begin</a>(), g3_,</div><div class="line"><a name="l11625"></a><span class="lineno">11625</span>  g3_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a14e735c8bd113556ae905a560cd2d607">begin</a>(), g4_, g4_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a14e735c8bd113556ae905a560cd2d607">begin</a>());</div><div class="line"><a name="l11626"></a><span class="lineno">11626</span>  }</div><div class="line"><a name="l11627"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_generator4.html#ae25a27430e476014a2f07c0be4f030f7">11627</a></span>  <a class="code" href="classtesting_1_1internal_1_1_param_iterator_interface.html">ParamIteratorInterface<ParamType></a>* <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator4.html#ae25a27430e476014a2f07c0be4f030f7">End</a>()<span class="keyword"> const override </span>{</div><div class="line"><a name="l11628"></a><span class="lineno">11628</span>  <span class="keywordflow">return</span> <span class="keyword">new</span> Iterator(<span class="keyword">this</span>, g1_, g1_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#aaf8f75df1099a07ff771a550b48f9fbe">end</a>(), g2_, g2_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#aaf8f75df1099a07ff771a550b48f9fbe">end</a>(), g3_, g3_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#aaf8f75df1099a07ff771a550b48f9fbe">end</a>(),</div><div class="line"><a name="l11629"></a><span class="lineno">11629</span>  g4_, g4_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#aaf8f75df1099a07ff771a550b48f9fbe">end</a>());</div><div class="line"><a name="l11630"></a><span class="lineno">11630</span>  }</div><div class="line"><a name="l11631"></a><span class="lineno">11631</span> </div><div class="line"><a name="l11632"></a><span class="lineno">11632</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l11633"></a><span class="lineno">11633</span>  <span class="keyword">class </span>Iterator : <span class="keyword">public</span> <a class="code" href="classtesting_1_1internal_1_1_param_iterator_interface.html">ParamIteratorInterface</a><ParamType> {</div><div class="line"><a name="l11634"></a><span class="lineno">11634</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l11635"></a><span class="lineno">11635</span>  Iterator(<span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator_interface.html">ParamGeneratorInterface<ParamType></a>* base,</div><div class="line"><a name="l11636"></a><span class="lineno">11636</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T1></a>& g1,</div><div class="line"><a name="l11637"></a><span class="lineno">11637</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T1>::iterator</a>& current1,</div><div class="line"><a name="l11638"></a><span class="lineno">11638</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T2></a>& g2,</div><div class="line"><a name="l11639"></a><span class="lineno">11639</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T2>::iterator</a>& current2,</div><div class="line"><a name="l11640"></a><span class="lineno">11640</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T3></a>& g3,</div><div class="line"><a name="l11641"></a><span class="lineno">11641</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T3>::iterator</a>& current3,</div><div class="line"><a name="l11642"></a><span class="lineno">11642</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T4></a>& g4,</div><div class="line"><a name="l11643"></a><span class="lineno">11643</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T4>::iterator</a>& current4)</div><div class="line"><a name="l11644"></a><span class="lineno">11644</span>  : base_(base),</div><div class="line"><a name="l11645"></a><span class="lineno">11645</span>  begin1_(g1.begin()), end1_(g1.end()), current1_(current1),</div><div class="line"><a name="l11646"></a><span class="lineno">11646</span>  begin2_(g2.begin()), end2_(g2.end()), current2_(current2),</div><div class="line"><a name="l11647"></a><span class="lineno">11647</span>  begin3_(g3.begin()), end3_(g3.end()), current3_(current3),</div><div class="line"><a name="l11648"></a><span class="lineno">11648</span>  begin4_(g4.begin()), end4_(g4.end()), current4_(current4) {</div><div class="line"><a name="l11649"></a><span class="lineno">11649</span>  ComputeCurrentValue();</div><div class="line"><a name="l11650"></a><span class="lineno">11650</span>  }</div><div class="line"><a name="l11651"></a><span class="lineno">11651</span>  ~Iterator()<span class="keyword"> override </span>{}</div><div class="line"><a name="l11652"></a><span class="lineno">11652</span> </div><div class="line"><a name="l11653"></a><span class="lineno">11653</span>  <span class="keyword">const</span> ParamGeneratorInterface<ParamType>* BaseGenerator()<span class="keyword"> const override </span>{</div><div class="line"><a name="l11654"></a><span class="lineno">11654</span>  <span class="keywordflow">return</span> base_;</div><div class="line"><a name="l11655"></a><span class="lineno">11655</span>  }</div><div class="line"><a name="l11656"></a><span class="lineno">11656</span>  <span class="comment">// Advance should not be called on beyond-of-range iterators</span></div><div class="line"><a name="l11657"></a><span class="lineno">11657</span>  <span class="comment">// so no component iterators must be beyond end of range, either.</span></div><div class="line"><a name="l11658"></a><span class="lineno">11658</span>  <span class="keywordtype">void</span> Advance()<span class="keyword"> override </span>{</div><div class="line"><a name="l11659"></a><span class="lineno">11659</span>  assert(!AtEnd());</div><div class="line"><a name="l11660"></a><span class="lineno">11660</span>  ++current4_;</div><div class="line"><a name="l11661"></a><span class="lineno">11661</span>  <span class="keywordflow">if</span> (current4_ == end4_) {</div><div class="line"><a name="l11662"></a><span class="lineno">11662</span>  current4_ = begin4_;</div><div class="line"><a name="l11663"></a><span class="lineno">11663</span>  ++current3_;</div><div class="line"><a name="l11664"></a><span class="lineno">11664</span>  }</div><div class="line"><a name="l11665"></a><span class="lineno">11665</span>  <span class="keywordflow">if</span> (current3_ == end3_) {</div><div class="line"><a name="l11666"></a><span class="lineno">11666</span>  current3_ = begin3_;</div><div class="line"><a name="l11667"></a><span class="lineno">11667</span>  ++current2_;</div><div class="line"><a name="l11668"></a><span class="lineno">11668</span>  }</div><div class="line"><a name="l11669"></a><span class="lineno">11669</span>  <span class="keywordflow">if</span> (current2_ == end2_) {</div><div class="line"><a name="l11670"></a><span class="lineno">11670</span>  current2_ = begin2_;</div><div class="line"><a name="l11671"></a><span class="lineno">11671</span>  ++current1_;</div><div class="line"><a name="l11672"></a><span class="lineno">11672</span>  }</div><div class="line"><a name="l11673"></a><span class="lineno">11673</span>  ComputeCurrentValue();</div><div class="line"><a name="l11674"></a><span class="lineno">11674</span>  }</div><div class="line"><a name="l11675"></a><span class="lineno">11675</span>  ParamIteratorInterface<ParamType>* Clone()<span class="keyword"> const override </span>{</div><div class="line"><a name="l11676"></a><span class="lineno">11676</span>  <span class="keywordflow">return</span> <span class="keyword">new</span> Iterator(*<span class="keyword">this</span>);</div><div class="line"><a name="l11677"></a><span class="lineno">11677</span>  }</div><div class="line"><a name="l11678"></a><span class="lineno">11678</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator4.html#ab5e2480f7abacb80850de470c3225412">ParamType</a>* Current()<span class="keyword"> const override </span>{ <span class="keywordflow">return</span> current_value_.get(); }</div><div class="line"><a name="l11679"></a><span class="lineno">11679</span>  <span class="keywordtype">bool</span> <a class="code" href="classtesting_1_1internal_1_1_param_iterator_interface.html#a9d811697a752d46f7bd6a0082f9040a3">Equals</a>(<span class="keyword">const</span> ParamIteratorInterface<ParamType>& other)<span class="keyword"> const override </span>{</div><div class="line"><a name="l11680"></a><span class="lineno">11680</span>  <span class="comment">// Having the same base generator guarantees that the other</span></div><div class="line"><a name="l11681"></a><span class="lineno">11681</span>  <span class="comment">// iterator is of the same type and we can downcast.</span></div><div class="line"><a name="l11682"></a><span class="lineno">11682</span>  <a class="code" href="gtest_8h.html#ab54343f0a36dc4cb0ce8a478dd7847b8">GTEST_CHECK_</a>(BaseGenerator() == other.BaseGenerator())</div><div class="line"><a name="l11683"></a><span class="lineno">11683</span>  << <span class="stringliteral">"The program attempted to compare iterators "</span></div><div class="line"><a name="l11684"></a><span class="lineno">11684</span>  << <span class="stringliteral">"from different generators."</span> << std::endl;</div><div class="line"><a name="l11685"></a><span class="lineno">11685</span>  <span class="keyword">const</span> Iterator* typed_other =</div><div class="line"><a name="l11686"></a><span class="lineno">11686</span>  CheckedDowncastToActualType<const Iterator>(&other);</div><div class="line"><a name="l11687"></a><span class="lineno">11687</span>  <span class="comment">// We must report iterators equal if they both point beyond their</span></div><div class="line"><a name="l11688"></a><span class="lineno">11688</span>  <span class="comment">// respective ranges. That can happen in a variety of fashions,</span></div><div class="line"><a name="l11689"></a><span class="lineno">11689</span>  <span class="comment">// so we have to consult AtEnd().</span></div><div class="line"><a name="l11690"></a><span class="lineno">11690</span>  <span class="keywordflow">return</span> (AtEnd() && typed_other->AtEnd()) ||</div><div class="line"><a name="l11691"></a><span class="lineno">11691</span>  (</div><div class="line"><a name="l11692"></a><span class="lineno">11692</span>  current1_ == typed_other->current1_ &&</div><div class="line"><a name="l11693"></a><span class="lineno">11693</span>  current2_ == typed_other->current2_ &&</div><div class="line"><a name="l11694"></a><span class="lineno">11694</span>  current3_ == typed_other->current3_ &&</div><div class="line"><a name="l11695"></a><span class="lineno">11695</span>  current4_ == typed_other->current4_);</div><div class="line"><a name="l11696"></a><span class="lineno">11696</span>  }</div><div class="line"><a name="l11697"></a><span class="lineno">11697</span> </div><div class="line"><a name="l11698"></a><span class="lineno">11698</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l11699"></a><span class="lineno">11699</span>  Iterator(<span class="keyword">const</span> Iterator& other)</div><div class="line"><a name="l11700"></a><span class="lineno">11700</span>  : base_(other.base_),</div><div class="line"><a name="l11701"></a><span class="lineno">11701</span>  begin1_(other.begin1_),</div><div class="line"><a name="l11702"></a><span class="lineno">11702</span>  end1_(other.end1_),</div><div class="line"><a name="l11703"></a><span class="lineno">11703</span>  current1_(other.current1_),</div><div class="line"><a name="l11704"></a><span class="lineno">11704</span>  begin2_(other.begin2_),</div><div class="line"><a name="l11705"></a><span class="lineno">11705</span>  end2_(other.end2_),</div><div class="line"><a name="l11706"></a><span class="lineno">11706</span>  current2_(other.current2_),</div><div class="line"><a name="l11707"></a><span class="lineno">11707</span>  begin3_(other.begin3_),</div><div class="line"><a name="l11708"></a><span class="lineno">11708</span>  end3_(other.end3_),</div><div class="line"><a name="l11709"></a><span class="lineno">11709</span>  current3_(other.current3_),</div><div class="line"><a name="l11710"></a><span class="lineno">11710</span>  begin4_(other.begin4_),</div><div class="line"><a name="l11711"></a><span class="lineno">11711</span>  end4_(other.end4_),</div><div class="line"><a name="l11712"></a><span class="lineno">11712</span>  current4_(other.current4_) {</div><div class="line"><a name="l11713"></a><span class="lineno">11713</span>  ComputeCurrentValue();</div><div class="line"><a name="l11714"></a><span class="lineno">11714</span>  }</div><div class="line"><a name="l11715"></a><span class="lineno">11715</span> </div><div class="line"><a name="l11716"></a><span class="lineno">11716</span>  <span class="keywordtype">void</span> ComputeCurrentValue() {</div><div class="line"><a name="l11717"></a><span class="lineno">11717</span>  <span class="keywordflow">if</span> (!AtEnd())</div><div class="line"><a name="l11718"></a><span class="lineno">11718</span>  current_value_.reset(<span class="keyword">new</span> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator4.html#ab5e2480f7abacb80850de470c3225412">ParamType</a>(*current1_, *current2_, *current3_,</div><div class="line"><a name="l11719"></a><span class="lineno">11719</span>  *current4_));</div><div class="line"><a name="l11720"></a><span class="lineno">11720</span>  }</div><div class="line"><a name="l11721"></a><span class="lineno">11721</span>  <span class="keywordtype">bool</span> AtEnd()<span class="keyword"> const </span>{</div><div class="line"><a name="l11722"></a><span class="lineno">11722</span>  <span class="comment">// We must report iterator past the end of the range when either of the</span></div><div class="line"><a name="l11723"></a><span class="lineno">11723</span>  <span class="comment">// component iterators has reached the end of its range.</span></div><div class="line"><a name="l11724"></a><span class="lineno">11724</span>  <span class="keywordflow">return</span></div><div class="line"><a name="l11725"></a><span class="lineno">11725</span>  current1_ == end1_ ||</div><div class="line"><a name="l11726"></a><span class="lineno">11726</span>  current2_ == end2_ ||</div><div class="line"><a name="l11727"></a><span class="lineno">11727</span>  current3_ == end3_ ||</div><div class="line"><a name="l11728"></a><span class="lineno">11728</span>  current4_ == end4_;</div><div class="line"><a name="l11729"></a><span class="lineno">11729</span>  }</div><div class="line"><a name="l11730"></a><span class="lineno">11730</span> </div><div class="line"><a name="l11731"></a><span class="lineno">11731</span>  <span class="comment">// No implementation - assignment is unsupported.</span></div><div class="line"><a name="l11732"></a><span class="lineno">11732</span>  <span class="keywordtype">void</span> operator=(<span class="keyword">const</span> Iterator& other);</div><div class="line"><a name="l11733"></a><span class="lineno">11733</span> </div><div class="line"><a name="l11734"></a><span class="lineno">11734</span>  <span class="keyword">const</span> ParamGeneratorInterface<ParamType>* <span class="keyword">const</span> base_;</div><div class="line"><a name="l11735"></a><span class="lineno">11735</span>  <span class="comment">// begin[i]_ and end[i]_ define the i-th range that Iterator traverses.</span></div><div class="line"><a name="l11736"></a><span class="lineno">11736</span>  <span class="comment">// current[i]_ is the actual traversing iterator.</span></div><div class="line"><a name="l11737"></a><span class="lineno">11737</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T1>::iterator</a> begin1_;</div><div class="line"><a name="l11738"></a><span class="lineno">11738</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T1>::iterator</a> end1_;</div><div class="line"><a name="l11739"></a><span class="lineno">11739</span>  <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T1>::iterator</a> current1_;</div><div class="line"><a name="l11740"></a><span class="lineno">11740</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T2>::iterator</a> begin2_;</div><div class="line"><a name="l11741"></a><span class="lineno">11741</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T2>::iterator</a> end2_;</div><div class="line"><a name="l11742"></a><span class="lineno">11742</span>  <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T2>::iterator</a> current2_;</div><div class="line"><a name="l11743"></a><span class="lineno">11743</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T3>::iterator</a> begin3_;</div><div class="line"><a name="l11744"></a><span class="lineno">11744</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T3>::iterator</a> end3_;</div><div class="line"><a name="l11745"></a><span class="lineno">11745</span>  <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T3>::iterator</a> current3_;</div><div class="line"><a name="l11746"></a><span class="lineno">11746</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T4>::iterator</a> begin4_;</div><div class="line"><a name="l11747"></a><span class="lineno">11747</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T4>::iterator</a> end4_;</div><div class="line"><a name="l11748"></a><span class="lineno">11748</span>  <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T4>::iterator</a> current4_;</div><div class="line"><a name="l11749"></a><span class="lineno">11749</span>  std::shared_ptr<ParamType> current_value_;</div><div class="line"><a name="l11750"></a><span class="lineno">11750</span>  }; <span class="comment">// class CartesianProductGenerator4::Iterator</span></div><div class="line"><a name="l11751"></a><span class="lineno">11751</span> </div><div class="line"><a name="l11752"></a><span class="lineno">11752</span>  <span class="comment">// No implementation - assignment is unsupported.</span></div><div class="line"><a name="l11753"></a><span class="lineno">11753</span>  <span class="keywordtype">void</span> operator=(<span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator4.html#a4e4512b35f0d71f7a718ded6fe829296">CartesianProductGenerator4</a>& other);</div><div class="line"><a name="l11754"></a><span class="lineno">11754</span> </div><div class="line"><a name="l11755"></a><span class="lineno">11755</span>  <span class="keyword">const</span> ParamGenerator<T1> g1_;</div><div class="line"><a name="l11756"></a><span class="lineno">11756</span>  <span class="keyword">const</span> ParamGenerator<T2> g2_;</div><div class="line"><a name="l11757"></a><span class="lineno">11757</span>  <span class="keyword">const</span> ParamGenerator<T3> g3_;</div><div class="line"><a name="l11758"></a><span class="lineno">11758</span>  <span class="keyword">const</span> ParamGenerator<T4> g4_;</div><div class="line"><a name="l11759"></a><span class="lineno">11759</span> }; <span class="comment">// class CartesianProductGenerator4</span></div><div class="line"><a name="l11760"></a><span class="lineno">11760</span> </div><div class="line"><a name="l11761"></a><span class="lineno">11761</span> </div><div class="line"><a name="l11762"></a><span class="lineno">11762</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5></div><div class="line"><a name="l11763"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_generator5.html">11763</a></span> <span class="keyword">class </span><a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator5.html">CartesianProductGenerator5</a></div><div class="line"><a name="l11764"></a><span class="lineno">11764</span>  : <span class="keyword">public</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator_interface.html">ParamGeneratorInterface</a>< ::std::tuple<T1, T2, T3, T4, T5> > {</div><div class="line"><a name="l11765"></a><span class="lineno">11765</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l11766"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_generator5.html#a381a9c3c18106872251acffe59453a95">11766</a></span>  typedef ::std::tuple<T1, T2, T3, T4, T5> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator5.html#a381a9c3c18106872251acffe59453a95">ParamType</a>;</div><div class="line"><a name="l11767"></a><span class="lineno">11767</span> </div><div class="line"><a name="l11768"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_generator5.html#ab25fd0df9d6325f10f218c3b7553820d">11768</a></span>  <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator5.html#ab25fd0df9d6325f10f218c3b7553820d">CartesianProductGenerator5</a>(<span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T1></a>& g1,</div><div class="line"><a name="l11769"></a><span class="lineno">11769</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T2></a>& g2, <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T3></a>& g3,</div><div class="line"><a name="l11770"></a><span class="lineno">11770</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T4></a>& g4, <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T5></a>& g5)</div><div class="line"><a name="l11771"></a><span class="lineno">11771</span>  : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {}</div><div class="line"><a name="l11772"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_generator5.html#a13453a5614cda6c4d4b09011daa37800">11772</a></span>  <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator5.html#a13453a5614cda6c4d4b09011daa37800">~CartesianProductGenerator5</a>()<span class="keyword"> override </span>{}</div><div class="line"><a name="l11773"></a><span class="lineno">11773</span> </div><div class="line"><a name="l11774"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_generator5.html#aadf6e9a6638c07af046c489b78aed214">11774</a></span>  <a class="code" href="classtesting_1_1internal_1_1_param_iterator_interface.html">ParamIteratorInterface<ParamType></a>* <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator5.html#aadf6e9a6638c07af046c489b78aed214">Begin</a>()<span class="keyword"> const override </span>{</div><div class="line"><a name="l11775"></a><span class="lineno">11775</span>  <span class="keywordflow">return</span> <span class="keyword">new</span> Iterator(<span class="keyword">this</span>, g1_, g1_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a14e735c8bd113556ae905a560cd2d607">begin</a>(), g2_, g2_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a14e735c8bd113556ae905a560cd2d607">begin</a>(), g3_,</div><div class="line"><a name="l11776"></a><span class="lineno">11776</span>  g3_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a14e735c8bd113556ae905a560cd2d607">begin</a>(), g4_, g4_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a14e735c8bd113556ae905a560cd2d607">begin</a>(), g5_, g5_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a14e735c8bd113556ae905a560cd2d607">begin</a>());</div><div class="line"><a name="l11777"></a><span class="lineno">11777</span>  }</div><div class="line"><a name="l11778"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_generator5.html#af1829ba003b0e7c3a463f87dacd4c3b2">11778</a></span>  <a class="code" href="classtesting_1_1internal_1_1_param_iterator_interface.html">ParamIteratorInterface<ParamType></a>* <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator5.html#af1829ba003b0e7c3a463f87dacd4c3b2">End</a>()<span class="keyword"> const override </span>{</div><div class="line"><a name="l11779"></a><span class="lineno">11779</span>  <span class="keywordflow">return</span> <span class="keyword">new</span> Iterator(<span class="keyword">this</span>, g1_, g1_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#aaf8f75df1099a07ff771a550b48f9fbe">end</a>(), g2_, g2_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#aaf8f75df1099a07ff771a550b48f9fbe">end</a>(), g3_, g3_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#aaf8f75df1099a07ff771a550b48f9fbe">end</a>(),</div><div class="line"><a name="l11780"></a><span class="lineno">11780</span>  g4_, g4_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#aaf8f75df1099a07ff771a550b48f9fbe">end</a>(), g5_, g5_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#aaf8f75df1099a07ff771a550b48f9fbe">end</a>());</div><div class="line"><a name="l11781"></a><span class="lineno">11781</span>  }</div><div class="line"><a name="l11782"></a><span class="lineno">11782</span> </div><div class="line"><a name="l11783"></a><span class="lineno">11783</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l11784"></a><span class="lineno">11784</span>  <span class="keyword">class </span>Iterator : <span class="keyword">public</span> <a class="code" href="classtesting_1_1internal_1_1_param_iterator_interface.html">ParamIteratorInterface</a><ParamType> {</div><div class="line"><a name="l11785"></a><span class="lineno">11785</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l11786"></a><span class="lineno">11786</span>  Iterator(<span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator_interface.html">ParamGeneratorInterface<ParamType></a>* base,</div><div class="line"><a name="l11787"></a><span class="lineno">11787</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T1></a>& g1,</div><div class="line"><a name="l11788"></a><span class="lineno">11788</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T1>::iterator</a>& current1,</div><div class="line"><a name="l11789"></a><span class="lineno">11789</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T2></a>& g2,</div><div class="line"><a name="l11790"></a><span class="lineno">11790</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T2>::iterator</a>& current2,</div><div class="line"><a name="l11791"></a><span class="lineno">11791</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T3></a>& g3,</div><div class="line"><a name="l11792"></a><span class="lineno">11792</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T3>::iterator</a>& current3,</div><div class="line"><a name="l11793"></a><span class="lineno">11793</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T4></a>& g4,</div><div class="line"><a name="l11794"></a><span class="lineno">11794</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T4>::iterator</a>& current4,</div><div class="line"><a name="l11795"></a><span class="lineno">11795</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T5></a>& g5,</div><div class="line"><a name="l11796"></a><span class="lineno">11796</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T5>::iterator</a>& current5)</div><div class="line"><a name="l11797"></a><span class="lineno">11797</span>  : base_(base),</div><div class="line"><a name="l11798"></a><span class="lineno">11798</span>  begin1_(g1.begin()), end1_(g1.end()), current1_(current1),</div><div class="line"><a name="l11799"></a><span class="lineno">11799</span>  begin2_(g2.begin()), end2_(g2.end()), current2_(current2),</div><div class="line"><a name="l11800"></a><span class="lineno">11800</span>  begin3_(g3.begin()), end3_(g3.end()), current3_(current3),</div><div class="line"><a name="l11801"></a><span class="lineno">11801</span>  begin4_(g4.begin()), end4_(g4.end()), current4_(current4),</div><div class="line"><a name="l11802"></a><span class="lineno">11802</span>  begin5_(g5.begin()), end5_(g5.end()), current5_(current5) {</div><div class="line"><a name="l11803"></a><span class="lineno">11803</span>  ComputeCurrentValue();</div><div class="line"><a name="l11804"></a><span class="lineno">11804</span>  }</div><div class="line"><a name="l11805"></a><span class="lineno">11805</span>  ~Iterator()<span class="keyword"> override </span>{}</div><div class="line"><a name="l11806"></a><span class="lineno">11806</span> </div><div class="line"><a name="l11807"></a><span class="lineno">11807</span>  <span class="keyword">const</span> ParamGeneratorInterface<ParamType>* BaseGenerator()<span class="keyword"> const override </span>{</div><div class="line"><a name="l11808"></a><span class="lineno">11808</span>  <span class="keywordflow">return</span> base_;</div><div class="line"><a name="l11809"></a><span class="lineno">11809</span>  }</div><div class="line"><a name="l11810"></a><span class="lineno">11810</span>  <span class="comment">// Advance should not be called on beyond-of-range iterators</span></div><div class="line"><a name="l11811"></a><span class="lineno">11811</span>  <span class="comment">// so no component iterators must be beyond end of range, either.</span></div><div class="line"><a name="l11812"></a><span class="lineno">11812</span>  <span class="keywordtype">void</span> Advance()<span class="keyword"> override </span>{</div><div class="line"><a name="l11813"></a><span class="lineno">11813</span>  assert(!AtEnd());</div><div class="line"><a name="l11814"></a><span class="lineno">11814</span>  ++current5_;</div><div class="line"><a name="l11815"></a><span class="lineno">11815</span>  <span class="keywordflow">if</span> (current5_ == end5_) {</div><div class="line"><a name="l11816"></a><span class="lineno">11816</span>  current5_ = begin5_;</div><div class="line"><a name="l11817"></a><span class="lineno">11817</span>  ++current4_;</div><div class="line"><a name="l11818"></a><span class="lineno">11818</span>  }</div><div class="line"><a name="l11819"></a><span class="lineno">11819</span>  <span class="keywordflow">if</span> (current4_ == end4_) {</div><div class="line"><a name="l11820"></a><span class="lineno">11820</span>  current4_ = begin4_;</div><div class="line"><a name="l11821"></a><span class="lineno">11821</span>  ++current3_;</div><div class="line"><a name="l11822"></a><span class="lineno">11822</span>  }</div><div class="line"><a name="l11823"></a><span class="lineno">11823</span>  <span class="keywordflow">if</span> (current3_ == end3_) {</div><div class="line"><a name="l11824"></a><span class="lineno">11824</span>  current3_ = begin3_;</div><div class="line"><a name="l11825"></a><span class="lineno">11825</span>  ++current2_;</div><div class="line"><a name="l11826"></a><span class="lineno">11826</span>  }</div><div class="line"><a name="l11827"></a><span class="lineno">11827</span>  <span class="keywordflow">if</span> (current2_ == end2_) {</div><div class="line"><a name="l11828"></a><span class="lineno">11828</span>  current2_ = begin2_;</div><div class="line"><a name="l11829"></a><span class="lineno">11829</span>  ++current1_;</div><div class="line"><a name="l11830"></a><span class="lineno">11830</span>  }</div><div class="line"><a name="l11831"></a><span class="lineno">11831</span>  ComputeCurrentValue();</div><div class="line"><a name="l11832"></a><span class="lineno">11832</span>  }</div><div class="line"><a name="l11833"></a><span class="lineno">11833</span>  ParamIteratorInterface<ParamType>* Clone()<span class="keyword"> const override </span>{</div><div class="line"><a name="l11834"></a><span class="lineno">11834</span>  <span class="keywordflow">return</span> <span class="keyword">new</span> Iterator(*<span class="keyword">this</span>);</div><div class="line"><a name="l11835"></a><span class="lineno">11835</span>  }</div><div class="line"><a name="l11836"></a><span class="lineno">11836</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator5.html#a381a9c3c18106872251acffe59453a95">ParamType</a>* Current()<span class="keyword"> const override </span>{ <span class="keywordflow">return</span> current_value_.get(); }</div><div class="line"><a name="l11837"></a><span class="lineno">11837</span>  <span class="keywordtype">bool</span> <a class="code" href="classtesting_1_1internal_1_1_param_iterator_interface.html#a9d811697a752d46f7bd6a0082f9040a3">Equals</a>(<span class="keyword">const</span> ParamIteratorInterface<ParamType>& other)<span class="keyword"> const override </span>{</div><div class="line"><a name="l11838"></a><span class="lineno">11838</span>  <span class="comment">// Having the same base generator guarantees that the other</span></div><div class="line"><a name="l11839"></a><span class="lineno">11839</span>  <span class="comment">// iterator is of the same type and we can downcast.</span></div><div class="line"><a name="l11840"></a><span class="lineno">11840</span>  <a class="code" href="gtest_8h.html#ab54343f0a36dc4cb0ce8a478dd7847b8">GTEST_CHECK_</a>(BaseGenerator() == other.BaseGenerator())</div><div class="line"><a name="l11841"></a><span class="lineno">11841</span>  << <span class="stringliteral">"The program attempted to compare iterators "</span></div><div class="line"><a name="l11842"></a><span class="lineno">11842</span>  << <span class="stringliteral">"from different generators."</span> << std::endl;</div><div class="line"><a name="l11843"></a><span class="lineno">11843</span>  <span class="keyword">const</span> Iterator* typed_other =</div><div class="line"><a name="l11844"></a><span class="lineno">11844</span>  CheckedDowncastToActualType<const Iterator>(&other);</div><div class="line"><a name="l11845"></a><span class="lineno">11845</span>  <span class="comment">// We must report iterators equal if they both point beyond their</span></div><div class="line"><a name="l11846"></a><span class="lineno">11846</span>  <span class="comment">// respective ranges. That can happen in a variety of fashions,</span></div><div class="line"><a name="l11847"></a><span class="lineno">11847</span>  <span class="comment">// so we have to consult AtEnd().</span></div><div class="line"><a name="l11848"></a><span class="lineno">11848</span>  <span class="keywordflow">return</span> (AtEnd() && typed_other->AtEnd()) ||</div><div class="line"><a name="l11849"></a><span class="lineno">11849</span>  (</div><div class="line"><a name="l11850"></a><span class="lineno">11850</span>  current1_ == typed_other->current1_ &&</div><div class="line"><a name="l11851"></a><span class="lineno">11851</span>  current2_ == typed_other->current2_ &&</div><div class="line"><a name="l11852"></a><span class="lineno">11852</span>  current3_ == typed_other->current3_ &&</div><div class="line"><a name="l11853"></a><span class="lineno">11853</span>  current4_ == typed_other->current4_ &&</div><div class="line"><a name="l11854"></a><span class="lineno">11854</span>  current5_ == typed_other->current5_);</div><div class="line"><a name="l11855"></a><span class="lineno">11855</span>  }</div><div class="line"><a name="l11856"></a><span class="lineno">11856</span> </div><div class="line"><a name="l11857"></a><span class="lineno">11857</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l11858"></a><span class="lineno">11858</span>  Iterator(<span class="keyword">const</span> Iterator& other)</div><div class="line"><a name="l11859"></a><span class="lineno">11859</span>  : base_(other.base_),</div><div class="line"><a name="l11860"></a><span class="lineno">11860</span>  begin1_(other.begin1_),</div><div class="line"><a name="l11861"></a><span class="lineno">11861</span>  end1_(other.end1_),</div><div class="line"><a name="l11862"></a><span class="lineno">11862</span>  current1_(other.current1_),</div><div class="line"><a name="l11863"></a><span class="lineno">11863</span>  begin2_(other.begin2_),</div><div class="line"><a name="l11864"></a><span class="lineno">11864</span>  end2_(other.end2_),</div><div class="line"><a name="l11865"></a><span class="lineno">11865</span>  current2_(other.current2_),</div><div class="line"><a name="l11866"></a><span class="lineno">11866</span>  begin3_(other.begin3_),</div><div class="line"><a name="l11867"></a><span class="lineno">11867</span>  end3_(other.end3_),</div><div class="line"><a name="l11868"></a><span class="lineno">11868</span>  current3_(other.current3_),</div><div class="line"><a name="l11869"></a><span class="lineno">11869</span>  begin4_(other.begin4_),</div><div class="line"><a name="l11870"></a><span class="lineno">11870</span>  end4_(other.end4_),</div><div class="line"><a name="l11871"></a><span class="lineno">11871</span>  current4_(other.current4_),</div><div class="line"><a name="l11872"></a><span class="lineno">11872</span>  begin5_(other.begin5_),</div><div class="line"><a name="l11873"></a><span class="lineno">11873</span>  end5_(other.end5_),</div><div class="line"><a name="l11874"></a><span class="lineno">11874</span>  current5_(other.current5_) {</div><div class="line"><a name="l11875"></a><span class="lineno">11875</span>  ComputeCurrentValue();</div><div class="line"><a name="l11876"></a><span class="lineno">11876</span>  }</div><div class="line"><a name="l11877"></a><span class="lineno">11877</span> </div><div class="line"><a name="l11878"></a><span class="lineno">11878</span>  <span class="keywordtype">void</span> ComputeCurrentValue() {</div><div class="line"><a name="l11879"></a><span class="lineno">11879</span>  <span class="keywordflow">if</span> (!AtEnd())</div><div class="line"><a name="l11880"></a><span class="lineno">11880</span>  current_value_.reset(<span class="keyword">new</span> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator5.html#a381a9c3c18106872251acffe59453a95">ParamType</a>(*current1_, *current2_, *current3_,</div><div class="line"><a name="l11881"></a><span class="lineno">11881</span>  *current4_, *current5_));</div><div class="line"><a name="l11882"></a><span class="lineno">11882</span>  }</div><div class="line"><a name="l11883"></a><span class="lineno">11883</span>  <span class="keywordtype">bool</span> AtEnd()<span class="keyword"> const </span>{</div><div class="line"><a name="l11884"></a><span class="lineno">11884</span>  <span class="comment">// We must report iterator past the end of the range when either of the</span></div><div class="line"><a name="l11885"></a><span class="lineno">11885</span>  <span class="comment">// component iterators has reached the end of its range.</span></div><div class="line"><a name="l11886"></a><span class="lineno">11886</span>  <span class="keywordflow">return</span></div><div class="line"><a name="l11887"></a><span class="lineno">11887</span>  current1_ == end1_ ||</div><div class="line"><a name="l11888"></a><span class="lineno">11888</span>  current2_ == end2_ ||</div><div class="line"><a name="l11889"></a><span class="lineno">11889</span>  current3_ == end3_ ||</div><div class="line"><a name="l11890"></a><span class="lineno">11890</span>  current4_ == end4_ ||</div><div class="line"><a name="l11891"></a><span class="lineno">11891</span>  current5_ == end5_;</div><div class="line"><a name="l11892"></a><span class="lineno">11892</span>  }</div><div class="line"><a name="l11893"></a><span class="lineno">11893</span> </div><div class="line"><a name="l11894"></a><span class="lineno">11894</span>  <span class="comment">// No implementation - assignment is unsupported.</span></div><div class="line"><a name="l11895"></a><span class="lineno">11895</span>  <span class="keywordtype">void</span> operator=(<span class="keyword">const</span> Iterator& other);</div><div class="line"><a name="l11896"></a><span class="lineno">11896</span> </div><div class="line"><a name="l11897"></a><span class="lineno">11897</span>  <span class="keyword">const</span> ParamGeneratorInterface<ParamType>* <span class="keyword">const</span> base_;</div><div class="line"><a name="l11898"></a><span class="lineno">11898</span>  <span class="comment">// begin[i]_ and end[i]_ define the i-th range that Iterator traverses.</span></div><div class="line"><a name="l11899"></a><span class="lineno">11899</span>  <span class="comment">// current[i]_ is the actual traversing iterator.</span></div><div class="line"><a name="l11900"></a><span class="lineno">11900</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T1>::iterator</a> begin1_;</div><div class="line"><a name="l11901"></a><span class="lineno">11901</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T1>::iterator</a> end1_;</div><div class="line"><a name="l11902"></a><span class="lineno">11902</span>  <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T1>::iterator</a> current1_;</div><div class="line"><a name="l11903"></a><span class="lineno">11903</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T2>::iterator</a> begin2_;</div><div class="line"><a name="l11904"></a><span class="lineno">11904</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T2>::iterator</a> end2_;</div><div class="line"><a name="l11905"></a><span class="lineno">11905</span>  <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T2>::iterator</a> current2_;</div><div class="line"><a name="l11906"></a><span class="lineno">11906</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T3>::iterator</a> begin3_;</div><div class="line"><a name="l11907"></a><span class="lineno">11907</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T3>::iterator</a> end3_;</div><div class="line"><a name="l11908"></a><span class="lineno">11908</span>  <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T3>::iterator</a> current3_;</div><div class="line"><a name="l11909"></a><span class="lineno">11909</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T4>::iterator</a> begin4_;</div><div class="line"><a name="l11910"></a><span class="lineno">11910</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T4>::iterator</a> end4_;</div><div class="line"><a name="l11911"></a><span class="lineno">11911</span>  <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T4>::iterator</a> current4_;</div><div class="line"><a name="l11912"></a><span class="lineno">11912</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T5>::iterator</a> begin5_;</div><div class="line"><a name="l11913"></a><span class="lineno">11913</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T5>::iterator</a> end5_;</div><div class="line"><a name="l11914"></a><span class="lineno">11914</span>  <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T5>::iterator</a> current5_;</div><div class="line"><a name="l11915"></a><span class="lineno">11915</span>  std::shared_ptr<ParamType> current_value_;</div><div class="line"><a name="l11916"></a><span class="lineno">11916</span>  }; <span class="comment">// class CartesianProductGenerator5::Iterator</span></div><div class="line"><a name="l11917"></a><span class="lineno">11917</span> </div><div class="line"><a name="l11918"></a><span class="lineno">11918</span>  <span class="comment">// No implementation - assignment is unsupported.</span></div><div class="line"><a name="l11919"></a><span class="lineno">11919</span>  <span class="keywordtype">void</span> operator=(<span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator5.html#ab25fd0df9d6325f10f218c3b7553820d">CartesianProductGenerator5</a>& other);</div><div class="line"><a name="l11920"></a><span class="lineno">11920</span> </div><div class="line"><a name="l11921"></a><span class="lineno">11921</span>  <span class="keyword">const</span> ParamGenerator<T1> g1_;</div><div class="line"><a name="l11922"></a><span class="lineno">11922</span>  <span class="keyword">const</span> ParamGenerator<T2> g2_;</div><div class="line"><a name="l11923"></a><span class="lineno">11923</span>  <span class="keyword">const</span> ParamGenerator<T3> g3_;</div><div class="line"><a name="l11924"></a><span class="lineno">11924</span>  <span class="keyword">const</span> ParamGenerator<T4> g4_;</div><div class="line"><a name="l11925"></a><span class="lineno">11925</span>  <span class="keyword">const</span> ParamGenerator<T5> g5_;</div><div class="line"><a name="l11926"></a><span class="lineno">11926</span> }; <span class="comment">// class CartesianProductGenerator5</span></div><div class="line"><a name="l11927"></a><span class="lineno">11927</span> </div><div class="line"><a name="l11928"></a><span class="lineno">11928</span> </div><div class="line"><a name="l11929"></a><span class="lineno">11929</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l11930"></a><span class="lineno">11930</span>  <span class="keyword">typename</span> T6></div><div class="line"><a name="l11931"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_generator6.html">11931</a></span> <span class="keyword">class </span><a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator6.html">CartesianProductGenerator6</a></div><div class="line"><a name="l11932"></a><span class="lineno">11932</span>  : <span class="keyword">public</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator_interface.html">ParamGeneratorInterface</a>< ::std::tuple<T1, T2, T3, T4, T5, T6> > {</div><div class="line"><a name="l11933"></a><span class="lineno">11933</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l11934"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_generator6.html#aa9d67ce7d77623ebb27053bb2f704c62">11934</a></span>  typedef ::std::tuple<T1, T2, T3, T4, T5, T6> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator6.html#aa9d67ce7d77623ebb27053bb2f704c62">ParamType</a>;</div><div class="line"><a name="l11935"></a><span class="lineno">11935</span> </div><div class="line"><a name="l11936"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_generator6.html#a6ff15d46e4ff7f8f24215b8244a6a094">11936</a></span>  <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator6.html#a6ff15d46e4ff7f8f24215b8244a6a094">CartesianProductGenerator6</a>(<span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T1></a>& g1,</div><div class="line"><a name="l11937"></a><span class="lineno">11937</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T2></a>& g2, <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T3></a>& g3,</div><div class="line"><a name="l11938"></a><span class="lineno">11938</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T4></a>& g4, <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T5></a>& g5,</div><div class="line"><a name="l11939"></a><span class="lineno">11939</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T6></a>& g6)</div><div class="line"><a name="l11940"></a><span class="lineno">11940</span>  : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {}</div><div class="line"><a name="l11941"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_generator6.html#a6d59c2e75fd2a0a042ee102e08956f7f">11941</a></span>  <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator6.html#a6d59c2e75fd2a0a042ee102e08956f7f">~CartesianProductGenerator6</a>()<span class="keyword"> override </span>{}</div><div class="line"><a name="l11942"></a><span class="lineno">11942</span> </div><div class="line"><a name="l11943"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_generator6.html#ae9a8a36d7d4a5270a21ffd38744bbfce">11943</a></span>  <a class="code" href="classtesting_1_1internal_1_1_param_iterator_interface.html">ParamIteratorInterface<ParamType></a>* <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator6.html#ae9a8a36d7d4a5270a21ffd38744bbfce">Begin</a>()<span class="keyword"> const override </span>{</div><div class="line"><a name="l11944"></a><span class="lineno">11944</span>  <span class="keywordflow">return</span> <span class="keyword">new</span> Iterator(<span class="keyword">this</span>, g1_, g1_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a14e735c8bd113556ae905a560cd2d607">begin</a>(), g2_, g2_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a14e735c8bd113556ae905a560cd2d607">begin</a>(), g3_,</div><div class="line"><a name="l11945"></a><span class="lineno">11945</span>  g3_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a14e735c8bd113556ae905a560cd2d607">begin</a>(), g4_, g4_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a14e735c8bd113556ae905a560cd2d607">begin</a>(), g5_, g5_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a14e735c8bd113556ae905a560cd2d607">begin</a>(), g6_, g6_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a14e735c8bd113556ae905a560cd2d607">begin</a>());</div><div class="line"><a name="l11946"></a><span class="lineno">11946</span>  }</div><div class="line"><a name="l11947"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_generator6.html#a952895ad20d5a89b913f80ad2f54391b">11947</a></span>  <a class="code" href="classtesting_1_1internal_1_1_param_iterator_interface.html">ParamIteratorInterface<ParamType></a>* <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator6.html#a952895ad20d5a89b913f80ad2f54391b">End</a>()<span class="keyword"> const override </span>{</div><div class="line"><a name="l11948"></a><span class="lineno">11948</span>  <span class="keywordflow">return</span> <span class="keyword">new</span> Iterator(<span class="keyword">this</span>, g1_, g1_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#aaf8f75df1099a07ff771a550b48f9fbe">end</a>(), g2_, g2_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#aaf8f75df1099a07ff771a550b48f9fbe">end</a>(), g3_, g3_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#aaf8f75df1099a07ff771a550b48f9fbe">end</a>(),</div><div class="line"><a name="l11949"></a><span class="lineno">11949</span>  g4_, g4_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#aaf8f75df1099a07ff771a550b48f9fbe">end</a>(), g5_, g5_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#aaf8f75df1099a07ff771a550b48f9fbe">end</a>(), g6_, g6_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#aaf8f75df1099a07ff771a550b48f9fbe">end</a>());</div><div class="line"><a name="l11950"></a><span class="lineno">11950</span>  }</div><div class="line"><a name="l11951"></a><span class="lineno">11951</span> </div><div class="line"><a name="l11952"></a><span class="lineno">11952</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l11953"></a><span class="lineno">11953</span>  <span class="keyword">class </span>Iterator : <span class="keyword">public</span> <a class="code" href="classtesting_1_1internal_1_1_param_iterator_interface.html">ParamIteratorInterface</a><ParamType> {</div><div class="line"><a name="l11954"></a><span class="lineno">11954</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l11955"></a><span class="lineno">11955</span>  Iterator(<span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator_interface.html">ParamGeneratorInterface<ParamType></a>* base,</div><div class="line"><a name="l11956"></a><span class="lineno">11956</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T1></a>& g1,</div><div class="line"><a name="l11957"></a><span class="lineno">11957</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T1>::iterator</a>& current1,</div><div class="line"><a name="l11958"></a><span class="lineno">11958</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T2></a>& g2,</div><div class="line"><a name="l11959"></a><span class="lineno">11959</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T2>::iterator</a>& current2,</div><div class="line"><a name="l11960"></a><span class="lineno">11960</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T3></a>& g3,</div><div class="line"><a name="l11961"></a><span class="lineno">11961</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T3>::iterator</a>& current3,</div><div class="line"><a name="l11962"></a><span class="lineno">11962</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T4></a>& g4,</div><div class="line"><a name="l11963"></a><span class="lineno">11963</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T4>::iterator</a>& current4,</div><div class="line"><a name="l11964"></a><span class="lineno">11964</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T5></a>& g5,</div><div class="line"><a name="l11965"></a><span class="lineno">11965</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T5>::iterator</a>& current5,</div><div class="line"><a name="l11966"></a><span class="lineno">11966</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T6></a>& g6,</div><div class="line"><a name="l11967"></a><span class="lineno">11967</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T6>::iterator</a>& current6)</div><div class="line"><a name="l11968"></a><span class="lineno">11968</span>  : base_(base),</div><div class="line"><a name="l11969"></a><span class="lineno">11969</span>  begin1_(g1.begin()), end1_(g1.end()), current1_(current1),</div><div class="line"><a name="l11970"></a><span class="lineno">11970</span>  begin2_(g2.begin()), end2_(g2.end()), current2_(current2),</div><div class="line"><a name="l11971"></a><span class="lineno">11971</span>  begin3_(g3.begin()), end3_(g3.end()), current3_(current3),</div><div class="line"><a name="l11972"></a><span class="lineno">11972</span>  begin4_(g4.begin()), end4_(g4.end()), current4_(current4),</div><div class="line"><a name="l11973"></a><span class="lineno">11973</span>  begin5_(g5.begin()), end5_(g5.end()), current5_(current5),</div><div class="line"><a name="l11974"></a><span class="lineno">11974</span>  begin6_(g6.begin()), end6_(g6.end()), current6_(current6) {</div><div class="line"><a name="l11975"></a><span class="lineno">11975</span>  ComputeCurrentValue();</div><div class="line"><a name="l11976"></a><span class="lineno">11976</span>  }</div><div class="line"><a name="l11977"></a><span class="lineno">11977</span>  ~Iterator()<span class="keyword"> override </span>{}</div><div class="line"><a name="l11978"></a><span class="lineno">11978</span> </div><div class="line"><a name="l11979"></a><span class="lineno">11979</span>  <span class="keyword">const</span> ParamGeneratorInterface<ParamType>* BaseGenerator()<span class="keyword"> const override </span>{</div><div class="line"><a name="l11980"></a><span class="lineno">11980</span>  <span class="keywordflow">return</span> base_;</div><div class="line"><a name="l11981"></a><span class="lineno">11981</span>  }</div><div class="line"><a name="l11982"></a><span class="lineno">11982</span>  <span class="comment">// Advance should not be called on beyond-of-range iterators</span></div><div class="line"><a name="l11983"></a><span class="lineno">11983</span>  <span class="comment">// so no component iterators must be beyond end of range, either.</span></div><div class="line"><a name="l11984"></a><span class="lineno">11984</span>  <span class="keywordtype">void</span> Advance()<span class="keyword"> override </span>{</div><div class="line"><a name="l11985"></a><span class="lineno">11985</span>  assert(!AtEnd());</div><div class="line"><a name="l11986"></a><span class="lineno">11986</span>  ++current6_;</div><div class="line"><a name="l11987"></a><span class="lineno">11987</span>  <span class="keywordflow">if</span> (current6_ == end6_) {</div><div class="line"><a name="l11988"></a><span class="lineno">11988</span>  current6_ = begin6_;</div><div class="line"><a name="l11989"></a><span class="lineno">11989</span>  ++current5_;</div><div class="line"><a name="l11990"></a><span class="lineno">11990</span>  }</div><div class="line"><a name="l11991"></a><span class="lineno">11991</span>  <span class="keywordflow">if</span> (current5_ == end5_) {</div><div class="line"><a name="l11992"></a><span class="lineno">11992</span>  current5_ = begin5_;</div><div class="line"><a name="l11993"></a><span class="lineno">11993</span>  ++current4_;</div><div class="line"><a name="l11994"></a><span class="lineno">11994</span>  }</div><div class="line"><a name="l11995"></a><span class="lineno">11995</span>  <span class="keywordflow">if</span> (current4_ == end4_) {</div><div class="line"><a name="l11996"></a><span class="lineno">11996</span>  current4_ = begin4_;</div><div class="line"><a name="l11997"></a><span class="lineno">11997</span>  ++current3_;</div><div class="line"><a name="l11998"></a><span class="lineno">11998</span>  }</div><div class="line"><a name="l11999"></a><span class="lineno">11999</span>  <span class="keywordflow">if</span> (current3_ == end3_) {</div><div class="line"><a name="l12000"></a><span class="lineno">12000</span>  current3_ = begin3_;</div><div class="line"><a name="l12001"></a><span class="lineno">12001</span>  ++current2_;</div><div class="line"><a name="l12002"></a><span class="lineno">12002</span>  }</div><div class="line"><a name="l12003"></a><span class="lineno">12003</span>  <span class="keywordflow">if</span> (current2_ == end2_) {</div><div class="line"><a name="l12004"></a><span class="lineno">12004</span>  current2_ = begin2_;</div><div class="line"><a name="l12005"></a><span class="lineno">12005</span>  ++current1_;</div><div class="line"><a name="l12006"></a><span class="lineno">12006</span>  }</div><div class="line"><a name="l12007"></a><span class="lineno">12007</span>  ComputeCurrentValue();</div><div class="line"><a name="l12008"></a><span class="lineno">12008</span>  }</div><div class="line"><a name="l12009"></a><span class="lineno">12009</span>  ParamIteratorInterface<ParamType>* Clone()<span class="keyword"> const override </span>{</div><div class="line"><a name="l12010"></a><span class="lineno">12010</span>  <span class="keywordflow">return</span> <span class="keyword">new</span> Iterator(*<span class="keyword">this</span>);</div><div class="line"><a name="l12011"></a><span class="lineno">12011</span>  }</div><div class="line"><a name="l12012"></a><span class="lineno">12012</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator6.html#aa9d67ce7d77623ebb27053bb2f704c62">ParamType</a>* Current()<span class="keyword"> const override </span>{ <span class="keywordflow">return</span> current_value_.get(); }</div><div class="line"><a name="l12013"></a><span class="lineno">12013</span>  <span class="keywordtype">bool</span> <a class="code" href="classtesting_1_1internal_1_1_param_iterator_interface.html#a9d811697a752d46f7bd6a0082f9040a3">Equals</a>(<span class="keyword">const</span> ParamIteratorInterface<ParamType>& other)<span class="keyword"> const override </span>{</div><div class="line"><a name="l12014"></a><span class="lineno">12014</span>  <span class="comment">// Having the same base generator guarantees that the other</span></div><div class="line"><a name="l12015"></a><span class="lineno">12015</span>  <span class="comment">// iterator is of the same type and we can downcast.</span></div><div class="line"><a name="l12016"></a><span class="lineno">12016</span>  <a class="code" href="gtest_8h.html#ab54343f0a36dc4cb0ce8a478dd7847b8">GTEST_CHECK_</a>(BaseGenerator() == other.BaseGenerator())</div><div class="line"><a name="l12017"></a><span class="lineno">12017</span>  << <span class="stringliteral">"The program attempted to compare iterators "</span></div><div class="line"><a name="l12018"></a><span class="lineno">12018</span>  << <span class="stringliteral">"from different generators."</span> << std::endl;</div><div class="line"><a name="l12019"></a><span class="lineno">12019</span>  <span class="keyword">const</span> Iterator* typed_other =</div><div class="line"><a name="l12020"></a><span class="lineno">12020</span>  CheckedDowncastToActualType<const Iterator>(&other);</div><div class="line"><a name="l12021"></a><span class="lineno">12021</span>  <span class="comment">// We must report iterators equal if they both point beyond their</span></div><div class="line"><a name="l12022"></a><span class="lineno">12022</span>  <span class="comment">// respective ranges. That can happen in a variety of fashions,</span></div><div class="line"><a name="l12023"></a><span class="lineno">12023</span>  <span class="comment">// so we have to consult AtEnd().</span></div><div class="line"><a name="l12024"></a><span class="lineno">12024</span>  <span class="keywordflow">return</span> (AtEnd() && typed_other->AtEnd()) ||</div><div class="line"><a name="l12025"></a><span class="lineno">12025</span>  (</div><div class="line"><a name="l12026"></a><span class="lineno">12026</span>  current1_ == typed_other->current1_ &&</div><div class="line"><a name="l12027"></a><span class="lineno">12027</span>  current2_ == typed_other->current2_ &&</div><div class="line"><a name="l12028"></a><span class="lineno">12028</span>  current3_ == typed_other->current3_ &&</div><div class="line"><a name="l12029"></a><span class="lineno">12029</span>  current4_ == typed_other->current4_ &&</div><div class="line"><a name="l12030"></a><span class="lineno">12030</span>  current5_ == typed_other->current5_ &&</div><div class="line"><a name="l12031"></a><span class="lineno">12031</span>  current6_ == typed_other->current6_);</div><div class="line"><a name="l12032"></a><span class="lineno">12032</span>  }</div><div class="line"><a name="l12033"></a><span class="lineno">12033</span> </div><div class="line"><a name="l12034"></a><span class="lineno">12034</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l12035"></a><span class="lineno">12035</span>  Iterator(<span class="keyword">const</span> Iterator& other)</div><div class="line"><a name="l12036"></a><span class="lineno">12036</span>  : base_(other.base_),</div><div class="line"><a name="l12037"></a><span class="lineno">12037</span>  begin1_(other.begin1_),</div><div class="line"><a name="l12038"></a><span class="lineno">12038</span>  end1_(other.end1_),</div><div class="line"><a name="l12039"></a><span class="lineno">12039</span>  current1_(other.current1_),</div><div class="line"><a name="l12040"></a><span class="lineno">12040</span>  begin2_(other.begin2_),</div><div class="line"><a name="l12041"></a><span class="lineno">12041</span>  end2_(other.end2_),</div><div class="line"><a name="l12042"></a><span class="lineno">12042</span>  current2_(other.current2_),</div><div class="line"><a name="l12043"></a><span class="lineno">12043</span>  begin3_(other.begin3_),</div><div class="line"><a name="l12044"></a><span class="lineno">12044</span>  end3_(other.end3_),</div><div class="line"><a name="l12045"></a><span class="lineno">12045</span>  current3_(other.current3_),</div><div class="line"><a name="l12046"></a><span class="lineno">12046</span>  begin4_(other.begin4_),</div><div class="line"><a name="l12047"></a><span class="lineno">12047</span>  end4_(other.end4_),</div><div class="line"><a name="l12048"></a><span class="lineno">12048</span>  current4_(other.current4_),</div><div class="line"><a name="l12049"></a><span class="lineno">12049</span>  begin5_(other.begin5_),</div><div class="line"><a name="l12050"></a><span class="lineno">12050</span>  end5_(other.end5_),</div><div class="line"><a name="l12051"></a><span class="lineno">12051</span>  current5_(other.current5_),</div><div class="line"><a name="l12052"></a><span class="lineno">12052</span>  begin6_(other.begin6_),</div><div class="line"><a name="l12053"></a><span class="lineno">12053</span>  end6_(other.end6_),</div><div class="line"><a name="l12054"></a><span class="lineno">12054</span>  current6_(other.current6_) {</div><div class="line"><a name="l12055"></a><span class="lineno">12055</span>  ComputeCurrentValue();</div><div class="line"><a name="l12056"></a><span class="lineno">12056</span>  }</div><div class="line"><a name="l12057"></a><span class="lineno">12057</span> </div><div class="line"><a name="l12058"></a><span class="lineno">12058</span>  <span class="keywordtype">void</span> ComputeCurrentValue() {</div><div class="line"><a name="l12059"></a><span class="lineno">12059</span>  <span class="keywordflow">if</span> (!AtEnd())</div><div class="line"><a name="l12060"></a><span class="lineno">12060</span>  current_value_.reset(<span class="keyword">new</span> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator6.html#aa9d67ce7d77623ebb27053bb2f704c62">ParamType</a>(*current1_, *current2_, *current3_,</div><div class="line"><a name="l12061"></a><span class="lineno">12061</span>  *current4_, *current5_, *current6_));</div><div class="line"><a name="l12062"></a><span class="lineno">12062</span>  }</div><div class="line"><a name="l12063"></a><span class="lineno">12063</span>  <span class="keywordtype">bool</span> AtEnd()<span class="keyword"> const </span>{</div><div class="line"><a name="l12064"></a><span class="lineno">12064</span>  <span class="comment">// We must report iterator past the end of the range when either of the</span></div><div class="line"><a name="l12065"></a><span class="lineno">12065</span>  <span class="comment">// component iterators has reached the end of its range.</span></div><div class="line"><a name="l12066"></a><span class="lineno">12066</span>  <span class="keywordflow">return</span></div><div class="line"><a name="l12067"></a><span class="lineno">12067</span>  current1_ == end1_ ||</div><div class="line"><a name="l12068"></a><span class="lineno">12068</span>  current2_ == end2_ ||</div><div class="line"><a name="l12069"></a><span class="lineno">12069</span>  current3_ == end3_ ||</div><div class="line"><a name="l12070"></a><span class="lineno">12070</span>  current4_ == end4_ ||</div><div class="line"><a name="l12071"></a><span class="lineno">12071</span>  current5_ == end5_ ||</div><div class="line"><a name="l12072"></a><span class="lineno">12072</span>  current6_ == end6_;</div><div class="line"><a name="l12073"></a><span class="lineno">12073</span>  }</div><div class="line"><a name="l12074"></a><span class="lineno">12074</span> </div><div class="line"><a name="l12075"></a><span class="lineno">12075</span>  <span class="comment">// No implementation - assignment is unsupported.</span></div><div class="line"><a name="l12076"></a><span class="lineno">12076</span>  <span class="keywordtype">void</span> operator=(<span class="keyword">const</span> Iterator& other);</div><div class="line"><a name="l12077"></a><span class="lineno">12077</span> </div><div class="line"><a name="l12078"></a><span class="lineno">12078</span>  <span class="keyword">const</span> ParamGeneratorInterface<ParamType>* <span class="keyword">const</span> base_;</div><div class="line"><a name="l12079"></a><span class="lineno">12079</span>  <span class="comment">// begin[i]_ and end[i]_ define the i-th range that Iterator traverses.</span></div><div class="line"><a name="l12080"></a><span class="lineno">12080</span>  <span class="comment">// current[i]_ is the actual traversing iterator.</span></div><div class="line"><a name="l12081"></a><span class="lineno">12081</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T1>::iterator</a> begin1_;</div><div class="line"><a name="l12082"></a><span class="lineno">12082</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T1>::iterator</a> end1_;</div><div class="line"><a name="l12083"></a><span class="lineno">12083</span>  <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T1>::iterator</a> current1_;</div><div class="line"><a name="l12084"></a><span class="lineno">12084</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T2>::iterator</a> begin2_;</div><div class="line"><a name="l12085"></a><span class="lineno">12085</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T2>::iterator</a> end2_;</div><div class="line"><a name="l12086"></a><span class="lineno">12086</span>  <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T2>::iterator</a> current2_;</div><div class="line"><a name="l12087"></a><span class="lineno">12087</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T3>::iterator</a> begin3_;</div><div class="line"><a name="l12088"></a><span class="lineno">12088</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T3>::iterator</a> end3_;</div><div class="line"><a name="l12089"></a><span class="lineno">12089</span>  <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T3>::iterator</a> current3_;</div><div class="line"><a name="l12090"></a><span class="lineno">12090</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T4>::iterator</a> begin4_;</div><div class="line"><a name="l12091"></a><span class="lineno">12091</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T4>::iterator</a> end4_;</div><div class="line"><a name="l12092"></a><span class="lineno">12092</span>  <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T4>::iterator</a> current4_;</div><div class="line"><a name="l12093"></a><span class="lineno">12093</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T5>::iterator</a> begin5_;</div><div class="line"><a name="l12094"></a><span class="lineno">12094</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T5>::iterator</a> end5_;</div><div class="line"><a name="l12095"></a><span class="lineno">12095</span>  <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T5>::iterator</a> current5_;</div><div class="line"><a name="l12096"></a><span class="lineno">12096</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T6>::iterator</a> begin6_;</div><div class="line"><a name="l12097"></a><span class="lineno">12097</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T6>::iterator</a> end6_;</div><div class="line"><a name="l12098"></a><span class="lineno">12098</span>  <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T6>::iterator</a> current6_;</div><div class="line"><a name="l12099"></a><span class="lineno">12099</span>  std::shared_ptr<ParamType> current_value_;</div><div class="line"><a name="l12100"></a><span class="lineno">12100</span>  }; <span class="comment">// class CartesianProductGenerator6::Iterator</span></div><div class="line"><a name="l12101"></a><span class="lineno">12101</span> </div><div class="line"><a name="l12102"></a><span class="lineno">12102</span>  <span class="comment">// No implementation - assignment is unsupported.</span></div><div class="line"><a name="l12103"></a><span class="lineno">12103</span>  <span class="keywordtype">void</span> operator=(<span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator6.html#a6ff15d46e4ff7f8f24215b8244a6a094">CartesianProductGenerator6</a>& other);</div><div class="line"><a name="l12104"></a><span class="lineno">12104</span> </div><div class="line"><a name="l12105"></a><span class="lineno">12105</span>  <span class="keyword">const</span> ParamGenerator<T1> g1_;</div><div class="line"><a name="l12106"></a><span class="lineno">12106</span>  <span class="keyword">const</span> ParamGenerator<T2> g2_;</div><div class="line"><a name="l12107"></a><span class="lineno">12107</span>  <span class="keyword">const</span> ParamGenerator<T3> g3_;</div><div class="line"><a name="l12108"></a><span class="lineno">12108</span>  <span class="keyword">const</span> ParamGenerator<T4> g4_;</div><div class="line"><a name="l12109"></a><span class="lineno">12109</span>  <span class="keyword">const</span> ParamGenerator<T5> g5_;</div><div class="line"><a name="l12110"></a><span class="lineno">12110</span>  <span class="keyword">const</span> ParamGenerator<T6> g6_;</div><div class="line"><a name="l12111"></a><span class="lineno">12111</span> }; <span class="comment">// class CartesianProductGenerator6</span></div><div class="line"><a name="l12112"></a><span class="lineno">12112</span> </div><div class="line"><a name="l12113"></a><span class="lineno">12113</span> </div><div class="line"><a name="l12114"></a><span class="lineno">12114</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l12115"></a><span class="lineno">12115</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7></div><div class="line"><a name="l12116"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_generator7.html">12116</a></span> <span class="keyword">class </span><a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator7.html">CartesianProductGenerator7</a></div><div class="line"><a name="l12117"></a><span class="lineno">12117</span>  : <span class="keyword">public</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator_interface.html">ParamGeneratorInterface</a>< ::std::tuple<T1, T2, T3, T4, T5, T6,</div><div class="line"><a name="l12118"></a><span class="lineno">12118</span>  T7> > {</div><div class="line"><a name="l12119"></a><span class="lineno">12119</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l12120"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_generator7.html#a1481728b2ece0109ac7897074d42a1f4">12120</a></span>  typedef ::std::tuple<T1, T2, T3, T4, T5, T6, T7> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator7.html#a1481728b2ece0109ac7897074d42a1f4">ParamType</a>;</div><div class="line"><a name="l12121"></a><span class="lineno">12121</span> </div><div class="line"><a name="l12122"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_generator7.html#aafc9c559223d3a685028ec98aa727818">12122</a></span>  <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator7.html#aafc9c559223d3a685028ec98aa727818">CartesianProductGenerator7</a>(<span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T1></a>& g1,</div><div class="line"><a name="l12123"></a><span class="lineno">12123</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T2></a>& g2, <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T3></a>& g3,</div><div class="line"><a name="l12124"></a><span class="lineno">12124</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T4></a>& g4, <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T5></a>& g5,</div><div class="line"><a name="l12125"></a><span class="lineno">12125</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T6></a>& g6, <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T7></a>& g7)</div><div class="line"><a name="l12126"></a><span class="lineno">12126</span>  : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {}</div><div class="line"><a name="l12127"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_generator7.html#a242bc369feb56ff096b906c833403077">12127</a></span>  <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator7.html#a242bc369feb56ff096b906c833403077">~CartesianProductGenerator7</a>()<span class="keyword"> override </span>{}</div><div class="line"><a name="l12128"></a><span class="lineno">12128</span> </div><div class="line"><a name="l12129"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_generator7.html#ac8b315cd7dbe5566d5ff98b04921b815">12129</a></span>  <a class="code" href="classtesting_1_1internal_1_1_param_iterator_interface.html">ParamIteratorInterface<ParamType></a>* <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator7.html#ac8b315cd7dbe5566d5ff98b04921b815">Begin</a>()<span class="keyword"> const override </span>{</div><div class="line"><a name="l12130"></a><span class="lineno">12130</span>  <span class="keywordflow">return</span> <span class="keyword">new</span> Iterator(<span class="keyword">this</span>, g1_, g1_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a14e735c8bd113556ae905a560cd2d607">begin</a>(), g2_, g2_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a14e735c8bd113556ae905a560cd2d607">begin</a>(), g3_,</div><div class="line"><a name="l12131"></a><span class="lineno">12131</span>  g3_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a14e735c8bd113556ae905a560cd2d607">begin</a>(), g4_, g4_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a14e735c8bd113556ae905a560cd2d607">begin</a>(), g5_, g5_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a14e735c8bd113556ae905a560cd2d607">begin</a>(), g6_, g6_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a14e735c8bd113556ae905a560cd2d607">begin</a>(), g7_,</div><div class="line"><a name="l12132"></a><span class="lineno">12132</span>  g7_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a14e735c8bd113556ae905a560cd2d607">begin</a>());</div><div class="line"><a name="l12133"></a><span class="lineno">12133</span>  }</div><div class="line"><a name="l12134"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_generator7.html#a452dadb9cedbc18f539cfc98eb6e5b88">12134</a></span>  <a class="code" href="classtesting_1_1internal_1_1_param_iterator_interface.html">ParamIteratorInterface<ParamType></a>* <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator7.html#a452dadb9cedbc18f539cfc98eb6e5b88">End</a>()<span class="keyword"> const override </span>{</div><div class="line"><a name="l12135"></a><span class="lineno">12135</span>  <span class="keywordflow">return</span> <span class="keyword">new</span> Iterator(<span class="keyword">this</span>, g1_, g1_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#aaf8f75df1099a07ff771a550b48f9fbe">end</a>(), g2_, g2_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#aaf8f75df1099a07ff771a550b48f9fbe">end</a>(), g3_, g3_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#aaf8f75df1099a07ff771a550b48f9fbe">end</a>(),</div><div class="line"><a name="l12136"></a><span class="lineno">12136</span>  g4_, g4_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#aaf8f75df1099a07ff771a550b48f9fbe">end</a>(), g5_, g5_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#aaf8f75df1099a07ff771a550b48f9fbe">end</a>(), g6_, g6_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#aaf8f75df1099a07ff771a550b48f9fbe">end</a>(), g7_, g7_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#aaf8f75df1099a07ff771a550b48f9fbe">end</a>());</div><div class="line"><a name="l12137"></a><span class="lineno">12137</span>  }</div><div class="line"><a name="l12138"></a><span class="lineno">12138</span> </div><div class="line"><a name="l12139"></a><span class="lineno">12139</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l12140"></a><span class="lineno">12140</span>  <span class="keyword">class </span>Iterator : <span class="keyword">public</span> <a class="code" href="classtesting_1_1internal_1_1_param_iterator_interface.html">ParamIteratorInterface</a><ParamType> {</div><div class="line"><a name="l12141"></a><span class="lineno">12141</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l12142"></a><span class="lineno">12142</span>  Iterator(<span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator_interface.html">ParamGeneratorInterface<ParamType></a>* base,</div><div class="line"><a name="l12143"></a><span class="lineno">12143</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T1></a>& g1,</div><div class="line"><a name="l12144"></a><span class="lineno">12144</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T1>::iterator</a>& current1,</div><div class="line"><a name="l12145"></a><span class="lineno">12145</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T2></a>& g2,</div><div class="line"><a name="l12146"></a><span class="lineno">12146</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T2>::iterator</a>& current2,</div><div class="line"><a name="l12147"></a><span class="lineno">12147</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T3></a>& g3,</div><div class="line"><a name="l12148"></a><span class="lineno">12148</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T3>::iterator</a>& current3,</div><div class="line"><a name="l12149"></a><span class="lineno">12149</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T4></a>& g4,</div><div class="line"><a name="l12150"></a><span class="lineno">12150</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T4>::iterator</a>& current4,</div><div class="line"><a name="l12151"></a><span class="lineno">12151</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T5></a>& g5,</div><div class="line"><a name="l12152"></a><span class="lineno">12152</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T5>::iterator</a>& current5,</div><div class="line"><a name="l12153"></a><span class="lineno">12153</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T6></a>& g6,</div><div class="line"><a name="l12154"></a><span class="lineno">12154</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T6>::iterator</a>& current6,</div><div class="line"><a name="l12155"></a><span class="lineno">12155</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T7></a>& g7,</div><div class="line"><a name="l12156"></a><span class="lineno">12156</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T7>::iterator</a>& current7)</div><div class="line"><a name="l12157"></a><span class="lineno">12157</span>  : base_(base),</div><div class="line"><a name="l12158"></a><span class="lineno">12158</span>  begin1_(g1.begin()), end1_(g1.end()), current1_(current1),</div><div class="line"><a name="l12159"></a><span class="lineno">12159</span>  begin2_(g2.begin()), end2_(g2.end()), current2_(current2),</div><div class="line"><a name="l12160"></a><span class="lineno">12160</span>  begin3_(g3.begin()), end3_(g3.end()), current3_(current3),</div><div class="line"><a name="l12161"></a><span class="lineno">12161</span>  begin4_(g4.begin()), end4_(g4.end()), current4_(current4),</div><div class="line"><a name="l12162"></a><span class="lineno">12162</span>  begin5_(g5.begin()), end5_(g5.end()), current5_(current5),</div><div class="line"><a name="l12163"></a><span class="lineno">12163</span>  begin6_(g6.begin()), end6_(g6.end()), current6_(current6),</div><div class="line"><a name="l12164"></a><span class="lineno">12164</span>  begin7_(g7.begin()), end7_(g7.end()), current7_(current7) {</div><div class="line"><a name="l12165"></a><span class="lineno">12165</span>  ComputeCurrentValue();</div><div class="line"><a name="l12166"></a><span class="lineno">12166</span>  }</div><div class="line"><a name="l12167"></a><span class="lineno">12167</span>  ~Iterator()<span class="keyword"> override </span>{}</div><div class="line"><a name="l12168"></a><span class="lineno">12168</span> </div><div class="line"><a name="l12169"></a><span class="lineno">12169</span>  <span class="keyword">const</span> ParamGeneratorInterface<ParamType>* BaseGenerator()<span class="keyword"> const override </span>{</div><div class="line"><a name="l12170"></a><span class="lineno">12170</span>  <span class="keywordflow">return</span> base_;</div><div class="line"><a name="l12171"></a><span class="lineno">12171</span>  }</div><div class="line"><a name="l12172"></a><span class="lineno">12172</span>  <span class="comment">// Advance should not be called on beyond-of-range iterators</span></div><div class="line"><a name="l12173"></a><span class="lineno">12173</span>  <span class="comment">// so no component iterators must be beyond end of range, either.</span></div><div class="line"><a name="l12174"></a><span class="lineno">12174</span>  <span class="keywordtype">void</span> Advance()<span class="keyword"> override </span>{</div><div class="line"><a name="l12175"></a><span class="lineno">12175</span>  assert(!AtEnd());</div><div class="line"><a name="l12176"></a><span class="lineno">12176</span>  ++current7_;</div><div class="line"><a name="l12177"></a><span class="lineno">12177</span>  <span class="keywordflow">if</span> (current7_ == end7_) {</div><div class="line"><a name="l12178"></a><span class="lineno">12178</span>  current7_ = begin7_;</div><div class="line"><a name="l12179"></a><span class="lineno">12179</span>  ++current6_;</div><div class="line"><a name="l12180"></a><span class="lineno">12180</span>  }</div><div class="line"><a name="l12181"></a><span class="lineno">12181</span>  <span class="keywordflow">if</span> (current6_ == end6_) {</div><div class="line"><a name="l12182"></a><span class="lineno">12182</span>  current6_ = begin6_;</div><div class="line"><a name="l12183"></a><span class="lineno">12183</span>  ++current5_;</div><div class="line"><a name="l12184"></a><span class="lineno">12184</span>  }</div><div class="line"><a name="l12185"></a><span class="lineno">12185</span>  <span class="keywordflow">if</span> (current5_ == end5_) {</div><div class="line"><a name="l12186"></a><span class="lineno">12186</span>  current5_ = begin5_;</div><div class="line"><a name="l12187"></a><span class="lineno">12187</span>  ++current4_;</div><div class="line"><a name="l12188"></a><span class="lineno">12188</span>  }</div><div class="line"><a name="l12189"></a><span class="lineno">12189</span>  <span class="keywordflow">if</span> (current4_ == end4_) {</div><div class="line"><a name="l12190"></a><span class="lineno">12190</span>  current4_ = begin4_;</div><div class="line"><a name="l12191"></a><span class="lineno">12191</span>  ++current3_;</div><div class="line"><a name="l12192"></a><span class="lineno">12192</span>  }</div><div class="line"><a name="l12193"></a><span class="lineno">12193</span>  <span class="keywordflow">if</span> (current3_ == end3_) {</div><div class="line"><a name="l12194"></a><span class="lineno">12194</span>  current3_ = begin3_;</div><div class="line"><a name="l12195"></a><span class="lineno">12195</span>  ++current2_;</div><div class="line"><a name="l12196"></a><span class="lineno">12196</span>  }</div><div class="line"><a name="l12197"></a><span class="lineno">12197</span>  <span class="keywordflow">if</span> (current2_ == end2_) {</div><div class="line"><a name="l12198"></a><span class="lineno">12198</span>  current2_ = begin2_;</div><div class="line"><a name="l12199"></a><span class="lineno">12199</span>  ++current1_;</div><div class="line"><a name="l12200"></a><span class="lineno">12200</span>  }</div><div class="line"><a name="l12201"></a><span class="lineno">12201</span>  ComputeCurrentValue();</div><div class="line"><a name="l12202"></a><span class="lineno">12202</span>  }</div><div class="line"><a name="l12203"></a><span class="lineno">12203</span>  ParamIteratorInterface<ParamType>* Clone()<span class="keyword"> const override </span>{</div><div class="line"><a name="l12204"></a><span class="lineno">12204</span>  <span class="keywordflow">return</span> <span class="keyword">new</span> Iterator(*<span class="keyword">this</span>);</div><div class="line"><a name="l12205"></a><span class="lineno">12205</span>  }</div><div class="line"><a name="l12206"></a><span class="lineno">12206</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator7.html#a1481728b2ece0109ac7897074d42a1f4">ParamType</a>* Current()<span class="keyword"> const override </span>{ <span class="keywordflow">return</span> current_value_.get(); }</div><div class="line"><a name="l12207"></a><span class="lineno">12207</span>  <span class="keywordtype">bool</span> <a class="code" href="classtesting_1_1internal_1_1_param_iterator_interface.html#a9d811697a752d46f7bd6a0082f9040a3">Equals</a>(<span class="keyword">const</span> ParamIteratorInterface<ParamType>& other)<span class="keyword"> const override </span>{</div><div class="line"><a name="l12208"></a><span class="lineno">12208</span>  <span class="comment">// Having the same base generator guarantees that the other</span></div><div class="line"><a name="l12209"></a><span class="lineno">12209</span>  <span class="comment">// iterator is of the same type and we can downcast.</span></div><div class="line"><a name="l12210"></a><span class="lineno">12210</span>  <a class="code" href="gtest_8h.html#ab54343f0a36dc4cb0ce8a478dd7847b8">GTEST_CHECK_</a>(BaseGenerator() == other.BaseGenerator())</div><div class="line"><a name="l12211"></a><span class="lineno">12211</span>  << <span class="stringliteral">"The program attempted to compare iterators "</span></div><div class="line"><a name="l12212"></a><span class="lineno">12212</span>  << <span class="stringliteral">"from different generators."</span> << std::endl;</div><div class="line"><a name="l12213"></a><span class="lineno">12213</span>  <span class="keyword">const</span> Iterator* typed_other =</div><div class="line"><a name="l12214"></a><span class="lineno">12214</span>  CheckedDowncastToActualType<const Iterator>(&other);</div><div class="line"><a name="l12215"></a><span class="lineno">12215</span>  <span class="comment">// We must report iterators equal if they both point beyond their</span></div><div class="line"><a name="l12216"></a><span class="lineno">12216</span>  <span class="comment">// respective ranges. That can happen in a variety of fashions,</span></div><div class="line"><a name="l12217"></a><span class="lineno">12217</span>  <span class="comment">// so we have to consult AtEnd().</span></div><div class="line"><a name="l12218"></a><span class="lineno">12218</span>  <span class="keywordflow">return</span> (AtEnd() && typed_other->AtEnd()) ||</div><div class="line"><a name="l12219"></a><span class="lineno">12219</span>  (</div><div class="line"><a name="l12220"></a><span class="lineno">12220</span>  current1_ == typed_other->current1_ &&</div><div class="line"><a name="l12221"></a><span class="lineno">12221</span>  current2_ == typed_other->current2_ &&</div><div class="line"><a name="l12222"></a><span class="lineno">12222</span>  current3_ == typed_other->current3_ &&</div><div class="line"><a name="l12223"></a><span class="lineno">12223</span>  current4_ == typed_other->current4_ &&</div><div class="line"><a name="l12224"></a><span class="lineno">12224</span>  current5_ == typed_other->current5_ &&</div><div class="line"><a name="l12225"></a><span class="lineno">12225</span>  current6_ == typed_other->current6_ &&</div><div class="line"><a name="l12226"></a><span class="lineno">12226</span>  current7_ == typed_other->current7_);</div><div class="line"><a name="l12227"></a><span class="lineno">12227</span>  }</div><div class="line"><a name="l12228"></a><span class="lineno">12228</span> </div><div class="line"><a name="l12229"></a><span class="lineno">12229</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l12230"></a><span class="lineno">12230</span>  Iterator(<span class="keyword">const</span> Iterator& other)</div><div class="line"><a name="l12231"></a><span class="lineno">12231</span>  : base_(other.base_),</div><div class="line"><a name="l12232"></a><span class="lineno">12232</span>  begin1_(other.begin1_),</div><div class="line"><a name="l12233"></a><span class="lineno">12233</span>  end1_(other.end1_),</div><div class="line"><a name="l12234"></a><span class="lineno">12234</span>  current1_(other.current1_),</div><div class="line"><a name="l12235"></a><span class="lineno">12235</span>  begin2_(other.begin2_),</div><div class="line"><a name="l12236"></a><span class="lineno">12236</span>  end2_(other.end2_),</div><div class="line"><a name="l12237"></a><span class="lineno">12237</span>  current2_(other.current2_),</div><div class="line"><a name="l12238"></a><span class="lineno">12238</span>  begin3_(other.begin3_),</div><div class="line"><a name="l12239"></a><span class="lineno">12239</span>  end3_(other.end3_),</div><div class="line"><a name="l12240"></a><span class="lineno">12240</span>  current3_(other.current3_),</div><div class="line"><a name="l12241"></a><span class="lineno">12241</span>  begin4_(other.begin4_),</div><div class="line"><a name="l12242"></a><span class="lineno">12242</span>  end4_(other.end4_),</div><div class="line"><a name="l12243"></a><span class="lineno">12243</span>  current4_(other.current4_),</div><div class="line"><a name="l12244"></a><span class="lineno">12244</span>  begin5_(other.begin5_),</div><div class="line"><a name="l12245"></a><span class="lineno">12245</span>  end5_(other.end5_),</div><div class="line"><a name="l12246"></a><span class="lineno">12246</span>  current5_(other.current5_),</div><div class="line"><a name="l12247"></a><span class="lineno">12247</span>  begin6_(other.begin6_),</div><div class="line"><a name="l12248"></a><span class="lineno">12248</span>  end6_(other.end6_),</div><div class="line"><a name="l12249"></a><span class="lineno">12249</span>  current6_(other.current6_),</div><div class="line"><a name="l12250"></a><span class="lineno">12250</span>  begin7_(other.begin7_),</div><div class="line"><a name="l12251"></a><span class="lineno">12251</span>  end7_(other.end7_),</div><div class="line"><a name="l12252"></a><span class="lineno">12252</span>  current7_(other.current7_) {</div><div class="line"><a name="l12253"></a><span class="lineno">12253</span>  ComputeCurrentValue();</div><div class="line"><a name="l12254"></a><span class="lineno">12254</span>  }</div><div class="line"><a name="l12255"></a><span class="lineno">12255</span> </div><div class="line"><a name="l12256"></a><span class="lineno">12256</span>  <span class="keywordtype">void</span> ComputeCurrentValue() {</div><div class="line"><a name="l12257"></a><span class="lineno">12257</span>  <span class="keywordflow">if</span> (!AtEnd())</div><div class="line"><a name="l12258"></a><span class="lineno">12258</span>  current_value_.reset(<span class="keyword">new</span> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator7.html#a1481728b2ece0109ac7897074d42a1f4">ParamType</a>(*current1_, *current2_, *current3_,</div><div class="line"><a name="l12259"></a><span class="lineno">12259</span>  *current4_, *current5_, *current6_, *current7_));</div><div class="line"><a name="l12260"></a><span class="lineno">12260</span>  }</div><div class="line"><a name="l12261"></a><span class="lineno">12261</span>  <span class="keywordtype">bool</span> AtEnd()<span class="keyword"> const </span>{</div><div class="line"><a name="l12262"></a><span class="lineno">12262</span>  <span class="comment">// We must report iterator past the end of the range when either of the</span></div><div class="line"><a name="l12263"></a><span class="lineno">12263</span>  <span class="comment">// component iterators has reached the end of its range.</span></div><div class="line"><a name="l12264"></a><span class="lineno">12264</span>  <span class="keywordflow">return</span></div><div class="line"><a name="l12265"></a><span class="lineno">12265</span>  current1_ == end1_ ||</div><div class="line"><a name="l12266"></a><span class="lineno">12266</span>  current2_ == end2_ ||</div><div class="line"><a name="l12267"></a><span class="lineno">12267</span>  current3_ == end3_ ||</div><div class="line"><a name="l12268"></a><span class="lineno">12268</span>  current4_ == end4_ ||</div><div class="line"><a name="l12269"></a><span class="lineno">12269</span>  current5_ == end5_ ||</div><div class="line"><a name="l12270"></a><span class="lineno">12270</span>  current6_ == end6_ ||</div><div class="line"><a name="l12271"></a><span class="lineno">12271</span>  current7_ == end7_;</div><div class="line"><a name="l12272"></a><span class="lineno">12272</span>  }</div><div class="line"><a name="l12273"></a><span class="lineno">12273</span> </div><div class="line"><a name="l12274"></a><span class="lineno">12274</span>  <span class="comment">// No implementation - assignment is unsupported.</span></div><div class="line"><a name="l12275"></a><span class="lineno">12275</span>  <span class="keywordtype">void</span> operator=(<span class="keyword">const</span> Iterator& other);</div><div class="line"><a name="l12276"></a><span class="lineno">12276</span> </div><div class="line"><a name="l12277"></a><span class="lineno">12277</span>  <span class="keyword">const</span> ParamGeneratorInterface<ParamType>* <span class="keyword">const</span> base_;</div><div class="line"><a name="l12278"></a><span class="lineno">12278</span>  <span class="comment">// begin[i]_ and end[i]_ define the i-th range that Iterator traverses.</span></div><div class="line"><a name="l12279"></a><span class="lineno">12279</span>  <span class="comment">// current[i]_ is the actual traversing iterator.</span></div><div class="line"><a name="l12280"></a><span class="lineno">12280</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T1>::iterator</a> begin1_;</div><div class="line"><a name="l12281"></a><span class="lineno">12281</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T1>::iterator</a> end1_;</div><div class="line"><a name="l12282"></a><span class="lineno">12282</span>  <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T1>::iterator</a> current1_;</div><div class="line"><a name="l12283"></a><span class="lineno">12283</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T2>::iterator</a> begin2_;</div><div class="line"><a name="l12284"></a><span class="lineno">12284</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T2>::iterator</a> end2_;</div><div class="line"><a name="l12285"></a><span class="lineno">12285</span>  <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T2>::iterator</a> current2_;</div><div class="line"><a name="l12286"></a><span class="lineno">12286</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T3>::iterator</a> begin3_;</div><div class="line"><a name="l12287"></a><span class="lineno">12287</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T3>::iterator</a> end3_;</div><div class="line"><a name="l12288"></a><span class="lineno">12288</span>  <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T3>::iterator</a> current3_;</div><div class="line"><a name="l12289"></a><span class="lineno">12289</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T4>::iterator</a> begin4_;</div><div class="line"><a name="l12290"></a><span class="lineno">12290</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T4>::iterator</a> end4_;</div><div class="line"><a name="l12291"></a><span class="lineno">12291</span>  <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T4>::iterator</a> current4_;</div><div class="line"><a name="l12292"></a><span class="lineno">12292</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T5>::iterator</a> begin5_;</div><div class="line"><a name="l12293"></a><span class="lineno">12293</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T5>::iterator</a> end5_;</div><div class="line"><a name="l12294"></a><span class="lineno">12294</span>  <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T5>::iterator</a> current5_;</div><div class="line"><a name="l12295"></a><span class="lineno">12295</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T6>::iterator</a> begin6_;</div><div class="line"><a name="l12296"></a><span class="lineno">12296</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T6>::iterator</a> end6_;</div><div class="line"><a name="l12297"></a><span class="lineno">12297</span>  <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T6>::iterator</a> current6_;</div><div class="line"><a name="l12298"></a><span class="lineno">12298</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T7>::iterator</a> begin7_;</div><div class="line"><a name="l12299"></a><span class="lineno">12299</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T7>::iterator</a> end7_;</div><div class="line"><a name="l12300"></a><span class="lineno">12300</span>  <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T7>::iterator</a> current7_;</div><div class="line"><a name="l12301"></a><span class="lineno">12301</span>  std::shared_ptr<ParamType> current_value_;</div><div class="line"><a name="l12302"></a><span class="lineno">12302</span>  }; <span class="comment">// class CartesianProductGenerator7::Iterator</span></div><div class="line"><a name="l12303"></a><span class="lineno">12303</span> </div><div class="line"><a name="l12304"></a><span class="lineno">12304</span>  <span class="comment">// No implementation - assignment is unsupported.</span></div><div class="line"><a name="l12305"></a><span class="lineno">12305</span>  <span class="keywordtype">void</span> operator=(<span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator7.html#aafc9c559223d3a685028ec98aa727818">CartesianProductGenerator7</a>& other);</div><div class="line"><a name="l12306"></a><span class="lineno">12306</span> </div><div class="line"><a name="l12307"></a><span class="lineno">12307</span>  <span class="keyword">const</span> ParamGenerator<T1> g1_;</div><div class="line"><a name="l12308"></a><span class="lineno">12308</span>  <span class="keyword">const</span> ParamGenerator<T2> g2_;</div><div class="line"><a name="l12309"></a><span class="lineno">12309</span>  <span class="keyword">const</span> ParamGenerator<T3> g3_;</div><div class="line"><a name="l12310"></a><span class="lineno">12310</span>  <span class="keyword">const</span> ParamGenerator<T4> g4_;</div><div class="line"><a name="l12311"></a><span class="lineno">12311</span>  <span class="keyword">const</span> ParamGenerator<T5> g5_;</div><div class="line"><a name="l12312"></a><span class="lineno">12312</span>  <span class="keyword">const</span> ParamGenerator<T6> g6_;</div><div class="line"><a name="l12313"></a><span class="lineno">12313</span>  <span class="keyword">const</span> ParamGenerator<T7> g7_;</div><div class="line"><a name="l12314"></a><span class="lineno">12314</span> }; <span class="comment">// class CartesianProductGenerator7</span></div><div class="line"><a name="l12315"></a><span class="lineno">12315</span> </div><div class="line"><a name="l12316"></a><span class="lineno">12316</span> </div><div class="line"><a name="l12317"></a><span class="lineno">12317</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l12318"></a><span class="lineno">12318</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8></div><div class="line"><a name="l12319"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_generator8.html">12319</a></span> <span class="keyword">class </span><a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator8.html">CartesianProductGenerator8</a></div><div class="line"><a name="l12320"></a><span class="lineno">12320</span>  : <span class="keyword">public</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator_interface.html">ParamGeneratorInterface</a>< ::std::tuple<T1, T2, T3, T4, T5, T6, T7,</div><div class="line"><a name="l12321"></a><span class="lineno">12321</span>  T8> > {</div><div class="line"><a name="l12322"></a><span class="lineno">12322</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l12323"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_generator8.html#a75fc8856e032710e9efe753ad788dcf1">12323</a></span>  typedef ::std::tuple<T1, T2, T3, T4, T5, T6, T7, T8> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator8.html#a75fc8856e032710e9efe753ad788dcf1">ParamType</a>;</div><div class="line"><a name="l12324"></a><span class="lineno">12324</span> </div><div class="line"><a name="l12325"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_generator8.html#a07f33a7263f933d4fbabdb9e930d7f86">12325</a></span>  <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator8.html#a07f33a7263f933d4fbabdb9e930d7f86">CartesianProductGenerator8</a>(<span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T1></a>& g1,</div><div class="line"><a name="l12326"></a><span class="lineno">12326</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T2></a>& g2, <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T3></a>& g3,</div><div class="line"><a name="l12327"></a><span class="lineno">12327</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T4></a>& g4, <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T5></a>& g5,</div><div class="line"><a name="l12328"></a><span class="lineno">12328</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T6></a>& g6, <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T7></a>& g7,</div><div class="line"><a name="l12329"></a><span class="lineno">12329</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T8></a>& g8)</div><div class="line"><a name="l12330"></a><span class="lineno">12330</span>  : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7),</div><div class="line"><a name="l12331"></a><span class="lineno">12331</span>  g8_(g8) {}</div><div class="line"><a name="l12332"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_generator8.html#ab5e728b287d0d520e7281799a67189c7">12332</a></span>  <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator8.html#ab5e728b287d0d520e7281799a67189c7">~CartesianProductGenerator8</a>()<span class="keyword"> override </span>{}</div><div class="line"><a name="l12333"></a><span class="lineno">12333</span> </div><div class="line"><a name="l12334"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_generator8.html#a707b5a6f598da1f6b997e3b1ad771aca">12334</a></span>  <a class="code" href="classtesting_1_1internal_1_1_param_iterator_interface.html">ParamIteratorInterface<ParamType></a>* <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator8.html#a707b5a6f598da1f6b997e3b1ad771aca">Begin</a>()<span class="keyword"> const override </span>{</div><div class="line"><a name="l12335"></a><span class="lineno">12335</span>  <span class="keywordflow">return</span> <span class="keyword">new</span> Iterator(<span class="keyword">this</span>, g1_, g1_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a14e735c8bd113556ae905a560cd2d607">begin</a>(), g2_, g2_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a14e735c8bd113556ae905a560cd2d607">begin</a>(), g3_,</div><div class="line"><a name="l12336"></a><span class="lineno">12336</span>  g3_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a14e735c8bd113556ae905a560cd2d607">begin</a>(), g4_, g4_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a14e735c8bd113556ae905a560cd2d607">begin</a>(), g5_, g5_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a14e735c8bd113556ae905a560cd2d607">begin</a>(), g6_, g6_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a14e735c8bd113556ae905a560cd2d607">begin</a>(), g7_,</div><div class="line"><a name="l12337"></a><span class="lineno">12337</span>  g7_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a14e735c8bd113556ae905a560cd2d607">begin</a>(), g8_, g8_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a14e735c8bd113556ae905a560cd2d607">begin</a>());</div><div class="line"><a name="l12338"></a><span class="lineno">12338</span>  }</div><div class="line"><a name="l12339"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_generator8.html#a1893e189b87ba1a7cc664dcd4d87a1fd">12339</a></span>  <a class="code" href="classtesting_1_1internal_1_1_param_iterator_interface.html">ParamIteratorInterface<ParamType></a>* <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator8.html#a1893e189b87ba1a7cc664dcd4d87a1fd">End</a>()<span class="keyword"> const override </span>{</div><div class="line"><a name="l12340"></a><span class="lineno">12340</span>  <span class="keywordflow">return</span> <span class="keyword">new</span> Iterator(<span class="keyword">this</span>, g1_, g1_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#aaf8f75df1099a07ff771a550b48f9fbe">end</a>(), g2_, g2_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#aaf8f75df1099a07ff771a550b48f9fbe">end</a>(), g3_, g3_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#aaf8f75df1099a07ff771a550b48f9fbe">end</a>(),</div><div class="line"><a name="l12341"></a><span class="lineno">12341</span>  g4_, g4_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#aaf8f75df1099a07ff771a550b48f9fbe">end</a>(), g5_, g5_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#aaf8f75df1099a07ff771a550b48f9fbe">end</a>(), g6_, g6_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#aaf8f75df1099a07ff771a550b48f9fbe">end</a>(), g7_, g7_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#aaf8f75df1099a07ff771a550b48f9fbe">end</a>(), g8_,</div><div class="line"><a name="l12342"></a><span class="lineno">12342</span>  g8_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#aaf8f75df1099a07ff771a550b48f9fbe">end</a>());</div><div class="line"><a name="l12343"></a><span class="lineno">12343</span>  }</div><div class="line"><a name="l12344"></a><span class="lineno">12344</span> </div><div class="line"><a name="l12345"></a><span class="lineno">12345</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l12346"></a><span class="lineno">12346</span>  <span class="keyword">class </span>Iterator : <span class="keyword">public</span> <a class="code" href="classtesting_1_1internal_1_1_param_iterator_interface.html">ParamIteratorInterface</a><ParamType> {</div><div class="line"><a name="l12347"></a><span class="lineno">12347</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l12348"></a><span class="lineno">12348</span>  Iterator(<span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator_interface.html">ParamGeneratorInterface<ParamType></a>* base,</div><div class="line"><a name="l12349"></a><span class="lineno">12349</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T1></a>& g1,</div><div class="line"><a name="l12350"></a><span class="lineno">12350</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T1>::iterator</a>& current1,</div><div class="line"><a name="l12351"></a><span class="lineno">12351</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T2></a>& g2,</div><div class="line"><a name="l12352"></a><span class="lineno">12352</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T2>::iterator</a>& current2,</div><div class="line"><a name="l12353"></a><span class="lineno">12353</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T3></a>& g3,</div><div class="line"><a name="l12354"></a><span class="lineno">12354</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T3>::iterator</a>& current3,</div><div class="line"><a name="l12355"></a><span class="lineno">12355</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T4></a>& g4,</div><div class="line"><a name="l12356"></a><span class="lineno">12356</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T4>::iterator</a>& current4,</div><div class="line"><a name="l12357"></a><span class="lineno">12357</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T5></a>& g5,</div><div class="line"><a name="l12358"></a><span class="lineno">12358</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T5>::iterator</a>& current5,</div><div class="line"><a name="l12359"></a><span class="lineno">12359</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T6></a>& g6,</div><div class="line"><a name="l12360"></a><span class="lineno">12360</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T6>::iterator</a>& current6,</div><div class="line"><a name="l12361"></a><span class="lineno">12361</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T7></a>& g7,</div><div class="line"><a name="l12362"></a><span class="lineno">12362</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T7>::iterator</a>& current7,</div><div class="line"><a name="l12363"></a><span class="lineno">12363</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T8></a>& g8,</div><div class="line"><a name="l12364"></a><span class="lineno">12364</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T8>::iterator</a>& current8)</div><div class="line"><a name="l12365"></a><span class="lineno">12365</span>  : base_(base),</div><div class="line"><a name="l12366"></a><span class="lineno">12366</span>  begin1_(g1.begin()), end1_(g1.end()), current1_(current1),</div><div class="line"><a name="l12367"></a><span class="lineno">12367</span>  begin2_(g2.begin()), end2_(g2.end()), current2_(current2),</div><div class="line"><a name="l12368"></a><span class="lineno">12368</span>  begin3_(g3.begin()), end3_(g3.end()), current3_(current3),</div><div class="line"><a name="l12369"></a><span class="lineno">12369</span>  begin4_(g4.begin()), end4_(g4.end()), current4_(current4),</div><div class="line"><a name="l12370"></a><span class="lineno">12370</span>  begin5_(g5.begin()), end5_(g5.end()), current5_(current5),</div><div class="line"><a name="l12371"></a><span class="lineno">12371</span>  begin6_(g6.begin()), end6_(g6.end()), current6_(current6),</div><div class="line"><a name="l12372"></a><span class="lineno">12372</span>  begin7_(g7.begin()), end7_(g7.end()), current7_(current7),</div><div class="line"><a name="l12373"></a><span class="lineno">12373</span>  begin8_(g8.begin()), end8_(g8.end()), current8_(current8) {</div><div class="line"><a name="l12374"></a><span class="lineno">12374</span>  ComputeCurrentValue();</div><div class="line"><a name="l12375"></a><span class="lineno">12375</span>  }</div><div class="line"><a name="l12376"></a><span class="lineno">12376</span>  ~Iterator()<span class="keyword"> override </span>{}</div><div class="line"><a name="l12377"></a><span class="lineno">12377</span> </div><div class="line"><a name="l12378"></a><span class="lineno">12378</span>  <span class="keyword">const</span> ParamGeneratorInterface<ParamType>* BaseGenerator()<span class="keyword"> const override </span>{</div><div class="line"><a name="l12379"></a><span class="lineno">12379</span>  <span class="keywordflow">return</span> base_;</div><div class="line"><a name="l12380"></a><span class="lineno">12380</span>  }</div><div class="line"><a name="l12381"></a><span class="lineno">12381</span>  <span class="comment">// Advance should not be called on beyond-of-range iterators</span></div><div class="line"><a name="l12382"></a><span class="lineno">12382</span>  <span class="comment">// so no component iterators must be beyond end of range, either.</span></div><div class="line"><a name="l12383"></a><span class="lineno">12383</span>  <span class="keywordtype">void</span> Advance()<span class="keyword"> override </span>{</div><div class="line"><a name="l12384"></a><span class="lineno">12384</span>  assert(!AtEnd());</div><div class="line"><a name="l12385"></a><span class="lineno">12385</span>  ++current8_;</div><div class="line"><a name="l12386"></a><span class="lineno">12386</span>  <span class="keywordflow">if</span> (current8_ == end8_) {</div><div class="line"><a name="l12387"></a><span class="lineno">12387</span>  current8_ = begin8_;</div><div class="line"><a name="l12388"></a><span class="lineno">12388</span>  ++current7_;</div><div class="line"><a name="l12389"></a><span class="lineno">12389</span>  }</div><div class="line"><a name="l12390"></a><span class="lineno">12390</span>  <span class="keywordflow">if</span> (current7_ == end7_) {</div><div class="line"><a name="l12391"></a><span class="lineno">12391</span>  current7_ = begin7_;</div><div class="line"><a name="l12392"></a><span class="lineno">12392</span>  ++current6_;</div><div class="line"><a name="l12393"></a><span class="lineno">12393</span>  }</div><div class="line"><a name="l12394"></a><span class="lineno">12394</span>  <span class="keywordflow">if</span> (current6_ == end6_) {</div><div class="line"><a name="l12395"></a><span class="lineno">12395</span>  current6_ = begin6_;</div><div class="line"><a name="l12396"></a><span class="lineno">12396</span>  ++current5_;</div><div class="line"><a name="l12397"></a><span class="lineno">12397</span>  }</div><div class="line"><a name="l12398"></a><span class="lineno">12398</span>  <span class="keywordflow">if</span> (current5_ == end5_) {</div><div class="line"><a name="l12399"></a><span class="lineno">12399</span>  current5_ = begin5_;</div><div class="line"><a name="l12400"></a><span class="lineno">12400</span>  ++current4_;</div><div class="line"><a name="l12401"></a><span class="lineno">12401</span>  }</div><div class="line"><a name="l12402"></a><span class="lineno">12402</span>  <span class="keywordflow">if</span> (current4_ == end4_) {</div><div class="line"><a name="l12403"></a><span class="lineno">12403</span>  current4_ = begin4_;</div><div class="line"><a name="l12404"></a><span class="lineno">12404</span>  ++current3_;</div><div class="line"><a name="l12405"></a><span class="lineno">12405</span>  }</div><div class="line"><a name="l12406"></a><span class="lineno">12406</span>  <span class="keywordflow">if</span> (current3_ == end3_) {</div><div class="line"><a name="l12407"></a><span class="lineno">12407</span>  current3_ = begin3_;</div><div class="line"><a name="l12408"></a><span class="lineno">12408</span>  ++current2_;</div><div class="line"><a name="l12409"></a><span class="lineno">12409</span>  }</div><div class="line"><a name="l12410"></a><span class="lineno">12410</span>  <span class="keywordflow">if</span> (current2_ == end2_) {</div><div class="line"><a name="l12411"></a><span class="lineno">12411</span>  current2_ = begin2_;</div><div class="line"><a name="l12412"></a><span class="lineno">12412</span>  ++current1_;</div><div class="line"><a name="l12413"></a><span class="lineno">12413</span>  }</div><div class="line"><a name="l12414"></a><span class="lineno">12414</span>  ComputeCurrentValue();</div><div class="line"><a name="l12415"></a><span class="lineno">12415</span>  }</div><div class="line"><a name="l12416"></a><span class="lineno">12416</span>  ParamIteratorInterface<ParamType>* Clone()<span class="keyword"> const override </span>{</div><div class="line"><a name="l12417"></a><span class="lineno">12417</span>  <span class="keywordflow">return</span> <span class="keyword">new</span> Iterator(*<span class="keyword">this</span>);</div><div class="line"><a name="l12418"></a><span class="lineno">12418</span>  }</div><div class="line"><a name="l12419"></a><span class="lineno">12419</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator8.html#a75fc8856e032710e9efe753ad788dcf1">ParamType</a>* Current()<span class="keyword"> const override </span>{ <span class="keywordflow">return</span> current_value_.get(); }</div><div class="line"><a name="l12420"></a><span class="lineno">12420</span>  <span class="keywordtype">bool</span> <a class="code" href="classtesting_1_1internal_1_1_param_iterator_interface.html#a9d811697a752d46f7bd6a0082f9040a3">Equals</a>(<span class="keyword">const</span> ParamIteratorInterface<ParamType>& other)<span class="keyword"> const override </span>{</div><div class="line"><a name="l12421"></a><span class="lineno">12421</span>  <span class="comment">// Having the same base generator guarantees that the other</span></div><div class="line"><a name="l12422"></a><span class="lineno">12422</span>  <span class="comment">// iterator is of the same type and we can downcast.</span></div><div class="line"><a name="l12423"></a><span class="lineno">12423</span>  <a class="code" href="gtest_8h.html#ab54343f0a36dc4cb0ce8a478dd7847b8">GTEST_CHECK_</a>(BaseGenerator() == other.BaseGenerator())</div><div class="line"><a name="l12424"></a><span class="lineno">12424</span>  << <span class="stringliteral">"The program attempted to compare iterators "</span></div><div class="line"><a name="l12425"></a><span class="lineno">12425</span>  << <span class="stringliteral">"from different generators."</span> << std::endl;</div><div class="line"><a name="l12426"></a><span class="lineno">12426</span>  <span class="keyword">const</span> Iterator* typed_other =</div><div class="line"><a name="l12427"></a><span class="lineno">12427</span>  CheckedDowncastToActualType<const Iterator>(&other);</div><div class="line"><a name="l12428"></a><span class="lineno">12428</span>  <span class="comment">// We must report iterators equal if they both point beyond their</span></div><div class="line"><a name="l12429"></a><span class="lineno">12429</span>  <span class="comment">// respective ranges. That can happen in a variety of fashions,</span></div><div class="line"><a name="l12430"></a><span class="lineno">12430</span>  <span class="comment">// so we have to consult AtEnd().</span></div><div class="line"><a name="l12431"></a><span class="lineno">12431</span>  <span class="keywordflow">return</span> (AtEnd() && typed_other->AtEnd()) ||</div><div class="line"><a name="l12432"></a><span class="lineno">12432</span>  (</div><div class="line"><a name="l12433"></a><span class="lineno">12433</span>  current1_ == typed_other->current1_ &&</div><div class="line"><a name="l12434"></a><span class="lineno">12434</span>  current2_ == typed_other->current2_ &&</div><div class="line"><a name="l12435"></a><span class="lineno">12435</span>  current3_ == typed_other->current3_ &&</div><div class="line"><a name="l12436"></a><span class="lineno">12436</span>  current4_ == typed_other->current4_ &&</div><div class="line"><a name="l12437"></a><span class="lineno">12437</span>  current5_ == typed_other->current5_ &&</div><div class="line"><a name="l12438"></a><span class="lineno">12438</span>  current6_ == typed_other->current6_ &&</div><div class="line"><a name="l12439"></a><span class="lineno">12439</span>  current7_ == typed_other->current7_ &&</div><div class="line"><a name="l12440"></a><span class="lineno">12440</span>  current8_ == typed_other->current8_);</div><div class="line"><a name="l12441"></a><span class="lineno">12441</span>  }</div><div class="line"><a name="l12442"></a><span class="lineno">12442</span> </div><div class="line"><a name="l12443"></a><span class="lineno">12443</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l12444"></a><span class="lineno">12444</span>  Iterator(<span class="keyword">const</span> Iterator& other)</div><div class="line"><a name="l12445"></a><span class="lineno">12445</span>  : base_(other.base_),</div><div class="line"><a name="l12446"></a><span class="lineno">12446</span>  begin1_(other.begin1_),</div><div class="line"><a name="l12447"></a><span class="lineno">12447</span>  end1_(other.end1_),</div><div class="line"><a name="l12448"></a><span class="lineno">12448</span>  current1_(other.current1_),</div><div class="line"><a name="l12449"></a><span class="lineno">12449</span>  begin2_(other.begin2_),</div><div class="line"><a name="l12450"></a><span class="lineno">12450</span>  end2_(other.end2_),</div><div class="line"><a name="l12451"></a><span class="lineno">12451</span>  current2_(other.current2_),</div><div class="line"><a name="l12452"></a><span class="lineno">12452</span>  begin3_(other.begin3_),</div><div class="line"><a name="l12453"></a><span class="lineno">12453</span>  end3_(other.end3_),</div><div class="line"><a name="l12454"></a><span class="lineno">12454</span>  current3_(other.current3_),</div><div class="line"><a name="l12455"></a><span class="lineno">12455</span>  begin4_(other.begin4_),</div><div class="line"><a name="l12456"></a><span class="lineno">12456</span>  end4_(other.end4_),</div><div class="line"><a name="l12457"></a><span class="lineno">12457</span>  current4_(other.current4_),</div><div class="line"><a name="l12458"></a><span class="lineno">12458</span>  begin5_(other.begin5_),</div><div class="line"><a name="l12459"></a><span class="lineno">12459</span>  end5_(other.end5_),</div><div class="line"><a name="l12460"></a><span class="lineno">12460</span>  current5_(other.current5_),</div><div class="line"><a name="l12461"></a><span class="lineno">12461</span>  begin6_(other.begin6_),</div><div class="line"><a name="l12462"></a><span class="lineno">12462</span>  end6_(other.end6_),</div><div class="line"><a name="l12463"></a><span class="lineno">12463</span>  current6_(other.current6_),</div><div class="line"><a name="l12464"></a><span class="lineno">12464</span>  begin7_(other.begin7_),</div><div class="line"><a name="l12465"></a><span class="lineno">12465</span>  end7_(other.end7_),</div><div class="line"><a name="l12466"></a><span class="lineno">12466</span>  current7_(other.current7_),</div><div class="line"><a name="l12467"></a><span class="lineno">12467</span>  begin8_(other.begin8_),</div><div class="line"><a name="l12468"></a><span class="lineno">12468</span>  end8_(other.end8_),</div><div class="line"><a name="l12469"></a><span class="lineno">12469</span>  current8_(other.current8_) {</div><div class="line"><a name="l12470"></a><span class="lineno">12470</span>  ComputeCurrentValue();</div><div class="line"><a name="l12471"></a><span class="lineno">12471</span>  }</div><div class="line"><a name="l12472"></a><span class="lineno">12472</span> </div><div class="line"><a name="l12473"></a><span class="lineno">12473</span>  <span class="keywordtype">void</span> ComputeCurrentValue() {</div><div class="line"><a name="l12474"></a><span class="lineno">12474</span>  <span class="keywordflow">if</span> (!AtEnd())</div><div class="line"><a name="l12475"></a><span class="lineno">12475</span>  current_value_.reset(<span class="keyword">new</span> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator8.html#a75fc8856e032710e9efe753ad788dcf1">ParamType</a>(*current1_, *current2_, *current3_,</div><div class="line"><a name="l12476"></a><span class="lineno">12476</span>  *current4_, *current5_, *current6_, *current7_, *current8_));</div><div class="line"><a name="l12477"></a><span class="lineno">12477</span>  }</div><div class="line"><a name="l12478"></a><span class="lineno">12478</span>  <span class="keywordtype">bool</span> AtEnd()<span class="keyword"> const </span>{</div><div class="line"><a name="l12479"></a><span class="lineno">12479</span>  <span class="comment">// We must report iterator past the end of the range when either of the</span></div><div class="line"><a name="l12480"></a><span class="lineno">12480</span>  <span class="comment">// component iterators has reached the end of its range.</span></div><div class="line"><a name="l12481"></a><span class="lineno">12481</span>  <span class="keywordflow">return</span></div><div class="line"><a name="l12482"></a><span class="lineno">12482</span>  current1_ == end1_ ||</div><div class="line"><a name="l12483"></a><span class="lineno">12483</span>  current2_ == end2_ ||</div><div class="line"><a name="l12484"></a><span class="lineno">12484</span>  current3_ == end3_ ||</div><div class="line"><a name="l12485"></a><span class="lineno">12485</span>  current4_ == end4_ ||</div><div class="line"><a name="l12486"></a><span class="lineno">12486</span>  current5_ == end5_ ||</div><div class="line"><a name="l12487"></a><span class="lineno">12487</span>  current6_ == end6_ ||</div><div class="line"><a name="l12488"></a><span class="lineno">12488</span>  current7_ == end7_ ||</div><div class="line"><a name="l12489"></a><span class="lineno">12489</span>  current8_ == end8_;</div><div class="line"><a name="l12490"></a><span class="lineno">12490</span>  }</div><div class="line"><a name="l12491"></a><span class="lineno">12491</span> </div><div class="line"><a name="l12492"></a><span class="lineno">12492</span>  <span class="comment">// No implementation - assignment is unsupported.</span></div><div class="line"><a name="l12493"></a><span class="lineno">12493</span>  <span class="keywordtype">void</span> operator=(<span class="keyword">const</span> Iterator& other);</div><div class="line"><a name="l12494"></a><span class="lineno">12494</span> </div><div class="line"><a name="l12495"></a><span class="lineno">12495</span>  <span class="keyword">const</span> ParamGeneratorInterface<ParamType>* <span class="keyword">const</span> base_;</div><div class="line"><a name="l12496"></a><span class="lineno">12496</span>  <span class="comment">// begin[i]_ and end[i]_ define the i-th range that Iterator traverses.</span></div><div class="line"><a name="l12497"></a><span class="lineno">12497</span>  <span class="comment">// current[i]_ is the actual traversing iterator.</span></div><div class="line"><a name="l12498"></a><span class="lineno">12498</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T1>::iterator</a> begin1_;</div><div class="line"><a name="l12499"></a><span class="lineno">12499</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T1>::iterator</a> end1_;</div><div class="line"><a name="l12500"></a><span class="lineno">12500</span>  <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T1>::iterator</a> current1_;</div><div class="line"><a name="l12501"></a><span class="lineno">12501</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T2>::iterator</a> begin2_;</div><div class="line"><a name="l12502"></a><span class="lineno">12502</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T2>::iterator</a> end2_;</div><div class="line"><a name="l12503"></a><span class="lineno">12503</span>  <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T2>::iterator</a> current2_;</div><div class="line"><a name="l12504"></a><span class="lineno">12504</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T3>::iterator</a> begin3_;</div><div class="line"><a name="l12505"></a><span class="lineno">12505</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T3>::iterator</a> end3_;</div><div class="line"><a name="l12506"></a><span class="lineno">12506</span>  <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T3>::iterator</a> current3_;</div><div class="line"><a name="l12507"></a><span class="lineno">12507</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T4>::iterator</a> begin4_;</div><div class="line"><a name="l12508"></a><span class="lineno">12508</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T4>::iterator</a> end4_;</div><div class="line"><a name="l12509"></a><span class="lineno">12509</span>  <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T4>::iterator</a> current4_;</div><div class="line"><a name="l12510"></a><span class="lineno">12510</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T5>::iterator</a> begin5_;</div><div class="line"><a name="l12511"></a><span class="lineno">12511</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T5>::iterator</a> end5_;</div><div class="line"><a name="l12512"></a><span class="lineno">12512</span>  <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T5>::iterator</a> current5_;</div><div class="line"><a name="l12513"></a><span class="lineno">12513</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T6>::iterator</a> begin6_;</div><div class="line"><a name="l12514"></a><span class="lineno">12514</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T6>::iterator</a> end6_;</div><div class="line"><a name="l12515"></a><span class="lineno">12515</span>  <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T6>::iterator</a> current6_;</div><div class="line"><a name="l12516"></a><span class="lineno">12516</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T7>::iterator</a> begin7_;</div><div class="line"><a name="l12517"></a><span class="lineno">12517</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T7>::iterator</a> end7_;</div><div class="line"><a name="l12518"></a><span class="lineno">12518</span>  <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T7>::iterator</a> current7_;</div><div class="line"><a name="l12519"></a><span class="lineno">12519</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T8>::iterator</a> begin8_;</div><div class="line"><a name="l12520"></a><span class="lineno">12520</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T8>::iterator</a> end8_;</div><div class="line"><a name="l12521"></a><span class="lineno">12521</span>  <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T8>::iterator</a> current8_;</div><div class="line"><a name="l12522"></a><span class="lineno">12522</span>  std::shared_ptr<ParamType> current_value_;</div><div class="line"><a name="l12523"></a><span class="lineno">12523</span>  }; <span class="comment">// class CartesianProductGenerator8::Iterator</span></div><div class="line"><a name="l12524"></a><span class="lineno">12524</span> </div><div class="line"><a name="l12525"></a><span class="lineno">12525</span>  <span class="comment">// No implementation - assignment is unsupported.</span></div><div class="line"><a name="l12526"></a><span class="lineno">12526</span>  <span class="keywordtype">void</span> operator=(<span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator8.html#a07f33a7263f933d4fbabdb9e930d7f86">CartesianProductGenerator8</a>& other);</div><div class="line"><a name="l12527"></a><span class="lineno">12527</span> </div><div class="line"><a name="l12528"></a><span class="lineno">12528</span>  <span class="keyword">const</span> ParamGenerator<T1> g1_;</div><div class="line"><a name="l12529"></a><span class="lineno">12529</span>  <span class="keyword">const</span> ParamGenerator<T2> g2_;</div><div class="line"><a name="l12530"></a><span class="lineno">12530</span>  <span class="keyword">const</span> ParamGenerator<T3> g3_;</div><div class="line"><a name="l12531"></a><span class="lineno">12531</span>  <span class="keyword">const</span> ParamGenerator<T4> g4_;</div><div class="line"><a name="l12532"></a><span class="lineno">12532</span>  <span class="keyword">const</span> ParamGenerator<T5> g5_;</div><div class="line"><a name="l12533"></a><span class="lineno">12533</span>  <span class="keyword">const</span> ParamGenerator<T6> g6_;</div><div class="line"><a name="l12534"></a><span class="lineno">12534</span>  <span class="keyword">const</span> ParamGenerator<T7> g7_;</div><div class="line"><a name="l12535"></a><span class="lineno">12535</span>  <span class="keyword">const</span> ParamGenerator<T8> g8_;</div><div class="line"><a name="l12536"></a><span class="lineno">12536</span> }; <span class="comment">// class CartesianProductGenerator8</span></div><div class="line"><a name="l12537"></a><span class="lineno">12537</span> </div><div class="line"><a name="l12538"></a><span class="lineno">12538</span> </div><div class="line"><a name="l12539"></a><span class="lineno">12539</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l12540"></a><span class="lineno">12540</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9></div><div class="line"><a name="l12541"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_generator9.html">12541</a></span> <span class="keyword">class </span><a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator9.html">CartesianProductGenerator9</a></div><div class="line"><a name="l12542"></a><span class="lineno">12542</span>  : <span class="keyword">public</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator_interface.html">ParamGeneratorInterface</a>< ::std::tuple<T1, T2, T3, T4, T5, T6, T7,</div><div class="line"><a name="l12543"></a><span class="lineno">12543</span>  T8, T9> > {</div><div class="line"><a name="l12544"></a><span class="lineno">12544</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l12545"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_generator9.html#a86742cdf8f015ff11f7a40f0b66179c7">12545</a></span>  typedef ::std::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator9.html#a86742cdf8f015ff11f7a40f0b66179c7">ParamType</a>;</div><div class="line"><a name="l12546"></a><span class="lineno">12546</span> </div><div class="line"><a name="l12547"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_generator9.html#aff06c7992c06297c6bf5ad5eb56534e9">12547</a></span>  <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator9.html#aff06c7992c06297c6bf5ad5eb56534e9">CartesianProductGenerator9</a>(<span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T1></a>& g1,</div><div class="line"><a name="l12548"></a><span class="lineno">12548</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T2></a>& g2, <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T3></a>& g3,</div><div class="line"><a name="l12549"></a><span class="lineno">12549</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T4></a>& g4, <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T5></a>& g5,</div><div class="line"><a name="l12550"></a><span class="lineno">12550</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T6></a>& g6, <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T7></a>& g7,</div><div class="line"><a name="l12551"></a><span class="lineno">12551</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T8></a>& g8, <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T9></a>& g9)</div><div class="line"><a name="l12552"></a><span class="lineno">12552</span>  : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),</div><div class="line"><a name="l12553"></a><span class="lineno">12553</span>  g9_(g9) {}</div><div class="line"><a name="l12554"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_generator9.html#ab1b886bfb8c9c2c575ee4f9da61e3180">12554</a></span>  <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator9.html#ab1b886bfb8c9c2c575ee4f9da61e3180">~CartesianProductGenerator9</a>()<span class="keyword"> override </span>{}</div><div class="line"><a name="l12555"></a><span class="lineno">12555</span> </div><div class="line"><a name="l12556"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_generator9.html#a8fc8d5664560c3a788fe51903f896429">12556</a></span>  <a class="code" href="classtesting_1_1internal_1_1_param_iterator_interface.html">ParamIteratorInterface<ParamType></a>* <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator9.html#a8fc8d5664560c3a788fe51903f896429">Begin</a>()<span class="keyword"> const override </span>{</div><div class="line"><a name="l12557"></a><span class="lineno">12557</span>  <span class="keywordflow">return</span> <span class="keyword">new</span> Iterator(<span class="keyword">this</span>, g1_, g1_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a14e735c8bd113556ae905a560cd2d607">begin</a>(), g2_, g2_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a14e735c8bd113556ae905a560cd2d607">begin</a>(), g3_,</div><div class="line"><a name="l12558"></a><span class="lineno">12558</span>  g3_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a14e735c8bd113556ae905a560cd2d607">begin</a>(), g4_, g4_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a14e735c8bd113556ae905a560cd2d607">begin</a>(), g5_, g5_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a14e735c8bd113556ae905a560cd2d607">begin</a>(), g6_, g6_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a14e735c8bd113556ae905a560cd2d607">begin</a>(), g7_,</div><div class="line"><a name="l12559"></a><span class="lineno">12559</span>  g7_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a14e735c8bd113556ae905a560cd2d607">begin</a>(), g8_, g8_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a14e735c8bd113556ae905a560cd2d607">begin</a>(), g9_, g9_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a14e735c8bd113556ae905a560cd2d607">begin</a>());</div><div class="line"><a name="l12560"></a><span class="lineno">12560</span>  }</div><div class="line"><a name="l12561"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_generator9.html#a60476505c616957d1a04a31d1635df6d">12561</a></span>  <a class="code" href="classtesting_1_1internal_1_1_param_iterator_interface.html">ParamIteratorInterface<ParamType></a>* <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator9.html#a60476505c616957d1a04a31d1635df6d">End</a>()<span class="keyword"> const override </span>{</div><div class="line"><a name="l12562"></a><span class="lineno">12562</span>  <span class="keywordflow">return</span> <span class="keyword">new</span> Iterator(<span class="keyword">this</span>, g1_, g1_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#aaf8f75df1099a07ff771a550b48f9fbe">end</a>(), g2_, g2_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#aaf8f75df1099a07ff771a550b48f9fbe">end</a>(), g3_, g3_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#aaf8f75df1099a07ff771a550b48f9fbe">end</a>(),</div><div class="line"><a name="l12563"></a><span class="lineno">12563</span>  g4_, g4_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#aaf8f75df1099a07ff771a550b48f9fbe">end</a>(), g5_, g5_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#aaf8f75df1099a07ff771a550b48f9fbe">end</a>(), g6_, g6_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#aaf8f75df1099a07ff771a550b48f9fbe">end</a>(), g7_, g7_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#aaf8f75df1099a07ff771a550b48f9fbe">end</a>(), g8_,</div><div class="line"><a name="l12564"></a><span class="lineno">12564</span>  g8_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#aaf8f75df1099a07ff771a550b48f9fbe">end</a>(), g9_, g9_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#aaf8f75df1099a07ff771a550b48f9fbe">end</a>());</div><div class="line"><a name="l12565"></a><span class="lineno">12565</span>  }</div><div class="line"><a name="l12566"></a><span class="lineno">12566</span> </div><div class="line"><a name="l12567"></a><span class="lineno">12567</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l12568"></a><span class="lineno">12568</span>  <span class="keyword">class </span>Iterator : <span class="keyword">public</span> <a class="code" href="classtesting_1_1internal_1_1_param_iterator_interface.html">ParamIteratorInterface</a><ParamType> {</div><div class="line"><a name="l12569"></a><span class="lineno">12569</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l12570"></a><span class="lineno">12570</span>  Iterator(<span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator_interface.html">ParamGeneratorInterface<ParamType></a>* base,</div><div class="line"><a name="l12571"></a><span class="lineno">12571</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T1></a>& g1,</div><div class="line"><a name="l12572"></a><span class="lineno">12572</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T1>::iterator</a>& current1,</div><div class="line"><a name="l12573"></a><span class="lineno">12573</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T2></a>& g2,</div><div class="line"><a name="l12574"></a><span class="lineno">12574</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T2>::iterator</a>& current2,</div><div class="line"><a name="l12575"></a><span class="lineno">12575</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T3></a>& g3,</div><div class="line"><a name="l12576"></a><span class="lineno">12576</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T3>::iterator</a>& current3,</div><div class="line"><a name="l12577"></a><span class="lineno">12577</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T4></a>& g4,</div><div class="line"><a name="l12578"></a><span class="lineno">12578</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T4>::iterator</a>& current4,</div><div class="line"><a name="l12579"></a><span class="lineno">12579</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T5></a>& g5,</div><div class="line"><a name="l12580"></a><span class="lineno">12580</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T5>::iterator</a>& current5,</div><div class="line"><a name="l12581"></a><span class="lineno">12581</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T6></a>& g6,</div><div class="line"><a name="l12582"></a><span class="lineno">12582</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T6>::iterator</a>& current6,</div><div class="line"><a name="l12583"></a><span class="lineno">12583</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T7></a>& g7,</div><div class="line"><a name="l12584"></a><span class="lineno">12584</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T7>::iterator</a>& current7,</div><div class="line"><a name="l12585"></a><span class="lineno">12585</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T8></a>& g8,</div><div class="line"><a name="l12586"></a><span class="lineno">12586</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T8>::iterator</a>& current8,</div><div class="line"><a name="l12587"></a><span class="lineno">12587</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T9></a>& g9,</div><div class="line"><a name="l12588"></a><span class="lineno">12588</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T9>::iterator</a>& current9)</div><div class="line"><a name="l12589"></a><span class="lineno">12589</span>  : base_(base),</div><div class="line"><a name="l12590"></a><span class="lineno">12590</span>  begin1_(g1.begin()), end1_(g1.end()), current1_(current1),</div><div class="line"><a name="l12591"></a><span class="lineno">12591</span>  begin2_(g2.begin()), end2_(g2.end()), current2_(current2),</div><div class="line"><a name="l12592"></a><span class="lineno">12592</span>  begin3_(g3.begin()), end3_(g3.end()), current3_(current3),</div><div class="line"><a name="l12593"></a><span class="lineno">12593</span>  begin4_(g4.begin()), end4_(g4.end()), current4_(current4),</div><div class="line"><a name="l12594"></a><span class="lineno">12594</span>  begin5_(g5.begin()), end5_(g5.end()), current5_(current5),</div><div class="line"><a name="l12595"></a><span class="lineno">12595</span>  begin6_(g6.begin()), end6_(g6.end()), current6_(current6),</div><div class="line"><a name="l12596"></a><span class="lineno">12596</span>  begin7_(g7.begin()), end7_(g7.end()), current7_(current7),</div><div class="line"><a name="l12597"></a><span class="lineno">12597</span>  begin8_(g8.begin()), end8_(g8.end()), current8_(current8),</div><div class="line"><a name="l12598"></a><span class="lineno">12598</span>  begin9_(g9.begin()), end9_(g9.end()), current9_(current9) {</div><div class="line"><a name="l12599"></a><span class="lineno">12599</span>  ComputeCurrentValue();</div><div class="line"><a name="l12600"></a><span class="lineno">12600</span>  }</div><div class="line"><a name="l12601"></a><span class="lineno">12601</span>  ~Iterator()<span class="keyword"> override </span>{}</div><div class="line"><a name="l12602"></a><span class="lineno">12602</span> </div><div class="line"><a name="l12603"></a><span class="lineno">12603</span>  <span class="keyword">const</span> ParamGeneratorInterface<ParamType>* BaseGenerator()<span class="keyword"> const override </span>{</div><div class="line"><a name="l12604"></a><span class="lineno">12604</span>  <span class="keywordflow">return</span> base_;</div><div class="line"><a name="l12605"></a><span class="lineno">12605</span>  }</div><div class="line"><a name="l12606"></a><span class="lineno">12606</span>  <span class="comment">// Advance should not be called on beyond-of-range iterators</span></div><div class="line"><a name="l12607"></a><span class="lineno">12607</span>  <span class="comment">// so no component iterators must be beyond end of range, either.</span></div><div class="line"><a name="l12608"></a><span class="lineno">12608</span>  <span class="keywordtype">void</span> Advance()<span class="keyword"> override </span>{</div><div class="line"><a name="l12609"></a><span class="lineno">12609</span>  assert(!AtEnd());</div><div class="line"><a name="l12610"></a><span class="lineno">12610</span>  ++current9_;</div><div class="line"><a name="l12611"></a><span class="lineno">12611</span>  <span class="keywordflow">if</span> (current9_ == end9_) {</div><div class="line"><a name="l12612"></a><span class="lineno">12612</span>  current9_ = begin9_;</div><div class="line"><a name="l12613"></a><span class="lineno">12613</span>  ++current8_;</div><div class="line"><a name="l12614"></a><span class="lineno">12614</span>  }</div><div class="line"><a name="l12615"></a><span class="lineno">12615</span>  <span class="keywordflow">if</span> (current8_ == end8_) {</div><div class="line"><a name="l12616"></a><span class="lineno">12616</span>  current8_ = begin8_;</div><div class="line"><a name="l12617"></a><span class="lineno">12617</span>  ++current7_;</div><div class="line"><a name="l12618"></a><span class="lineno">12618</span>  }</div><div class="line"><a name="l12619"></a><span class="lineno">12619</span>  <span class="keywordflow">if</span> (current7_ == end7_) {</div><div class="line"><a name="l12620"></a><span class="lineno">12620</span>  current7_ = begin7_;</div><div class="line"><a name="l12621"></a><span class="lineno">12621</span>  ++current6_;</div><div class="line"><a name="l12622"></a><span class="lineno">12622</span>  }</div><div class="line"><a name="l12623"></a><span class="lineno">12623</span>  <span class="keywordflow">if</span> (current6_ == end6_) {</div><div class="line"><a name="l12624"></a><span class="lineno">12624</span>  current6_ = begin6_;</div><div class="line"><a name="l12625"></a><span class="lineno">12625</span>  ++current5_;</div><div class="line"><a name="l12626"></a><span class="lineno">12626</span>  }</div><div class="line"><a name="l12627"></a><span class="lineno">12627</span>  <span class="keywordflow">if</span> (current5_ == end5_) {</div><div class="line"><a name="l12628"></a><span class="lineno">12628</span>  current5_ = begin5_;</div><div class="line"><a name="l12629"></a><span class="lineno">12629</span>  ++current4_;</div><div class="line"><a name="l12630"></a><span class="lineno">12630</span>  }</div><div class="line"><a name="l12631"></a><span class="lineno">12631</span>  <span class="keywordflow">if</span> (current4_ == end4_) {</div><div class="line"><a name="l12632"></a><span class="lineno">12632</span>  current4_ = begin4_;</div><div class="line"><a name="l12633"></a><span class="lineno">12633</span>  ++current3_;</div><div class="line"><a name="l12634"></a><span class="lineno">12634</span>  }</div><div class="line"><a name="l12635"></a><span class="lineno">12635</span>  <span class="keywordflow">if</span> (current3_ == end3_) {</div><div class="line"><a name="l12636"></a><span class="lineno">12636</span>  current3_ = begin3_;</div><div class="line"><a name="l12637"></a><span class="lineno">12637</span>  ++current2_;</div><div class="line"><a name="l12638"></a><span class="lineno">12638</span>  }</div><div class="line"><a name="l12639"></a><span class="lineno">12639</span>  <span class="keywordflow">if</span> (current2_ == end2_) {</div><div class="line"><a name="l12640"></a><span class="lineno">12640</span>  current2_ = begin2_;</div><div class="line"><a name="l12641"></a><span class="lineno">12641</span>  ++current1_;</div><div class="line"><a name="l12642"></a><span class="lineno">12642</span>  }</div><div class="line"><a name="l12643"></a><span class="lineno">12643</span>  ComputeCurrentValue();</div><div class="line"><a name="l12644"></a><span class="lineno">12644</span>  }</div><div class="line"><a name="l12645"></a><span class="lineno">12645</span>  ParamIteratorInterface<ParamType>* Clone()<span class="keyword"> const override </span>{</div><div class="line"><a name="l12646"></a><span class="lineno">12646</span>  <span class="keywordflow">return</span> <span class="keyword">new</span> Iterator(*<span class="keyword">this</span>);</div><div class="line"><a name="l12647"></a><span class="lineno">12647</span>  }</div><div class="line"><a name="l12648"></a><span class="lineno">12648</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator9.html#a86742cdf8f015ff11f7a40f0b66179c7">ParamType</a>* Current()<span class="keyword"> const override </span>{ <span class="keywordflow">return</span> current_value_.get(); }</div><div class="line"><a name="l12649"></a><span class="lineno">12649</span>  <span class="keywordtype">bool</span> <a class="code" href="classtesting_1_1internal_1_1_param_iterator_interface.html#a9d811697a752d46f7bd6a0082f9040a3">Equals</a>(<span class="keyword">const</span> ParamIteratorInterface<ParamType>& other)<span class="keyword"> const override </span>{</div><div class="line"><a name="l12650"></a><span class="lineno">12650</span>  <span class="comment">// Having the same base generator guarantees that the other</span></div><div class="line"><a name="l12651"></a><span class="lineno">12651</span>  <span class="comment">// iterator is of the same type and we can downcast.</span></div><div class="line"><a name="l12652"></a><span class="lineno">12652</span>  <a class="code" href="gtest_8h.html#ab54343f0a36dc4cb0ce8a478dd7847b8">GTEST_CHECK_</a>(BaseGenerator() == other.BaseGenerator())</div><div class="line"><a name="l12653"></a><span class="lineno">12653</span>  << <span class="stringliteral">"The program attempted to compare iterators "</span></div><div class="line"><a name="l12654"></a><span class="lineno">12654</span>  << <span class="stringliteral">"from different generators."</span> << std::endl;</div><div class="line"><a name="l12655"></a><span class="lineno">12655</span>  <span class="keyword">const</span> Iterator* typed_other =</div><div class="line"><a name="l12656"></a><span class="lineno">12656</span>  CheckedDowncastToActualType<const Iterator>(&other);</div><div class="line"><a name="l12657"></a><span class="lineno">12657</span>  <span class="comment">// We must report iterators equal if they both point beyond their</span></div><div class="line"><a name="l12658"></a><span class="lineno">12658</span>  <span class="comment">// respective ranges. That can happen in a variety of fashions,</span></div><div class="line"><a name="l12659"></a><span class="lineno">12659</span>  <span class="comment">// so we have to consult AtEnd().</span></div><div class="line"><a name="l12660"></a><span class="lineno">12660</span>  <span class="keywordflow">return</span> (AtEnd() && typed_other->AtEnd()) ||</div><div class="line"><a name="l12661"></a><span class="lineno">12661</span>  (</div><div class="line"><a name="l12662"></a><span class="lineno">12662</span>  current1_ == typed_other->current1_ &&</div><div class="line"><a name="l12663"></a><span class="lineno">12663</span>  current2_ == typed_other->current2_ &&</div><div class="line"><a name="l12664"></a><span class="lineno">12664</span>  current3_ == typed_other->current3_ &&</div><div class="line"><a name="l12665"></a><span class="lineno">12665</span>  current4_ == typed_other->current4_ &&</div><div class="line"><a name="l12666"></a><span class="lineno">12666</span>  current5_ == typed_other->current5_ &&</div><div class="line"><a name="l12667"></a><span class="lineno">12667</span>  current6_ == typed_other->current6_ &&</div><div class="line"><a name="l12668"></a><span class="lineno">12668</span>  current7_ == typed_other->current7_ &&</div><div class="line"><a name="l12669"></a><span class="lineno">12669</span>  current8_ == typed_other->current8_ &&</div><div class="line"><a name="l12670"></a><span class="lineno">12670</span>  current9_ == typed_other->current9_);</div><div class="line"><a name="l12671"></a><span class="lineno">12671</span>  }</div><div class="line"><a name="l12672"></a><span class="lineno">12672</span> </div><div class="line"><a name="l12673"></a><span class="lineno">12673</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l12674"></a><span class="lineno">12674</span>  Iterator(<span class="keyword">const</span> Iterator& other)</div><div class="line"><a name="l12675"></a><span class="lineno">12675</span>  : base_(other.base_),</div><div class="line"><a name="l12676"></a><span class="lineno">12676</span>  begin1_(other.begin1_),</div><div class="line"><a name="l12677"></a><span class="lineno">12677</span>  end1_(other.end1_),</div><div class="line"><a name="l12678"></a><span class="lineno">12678</span>  current1_(other.current1_),</div><div class="line"><a name="l12679"></a><span class="lineno">12679</span>  begin2_(other.begin2_),</div><div class="line"><a name="l12680"></a><span class="lineno">12680</span>  end2_(other.end2_),</div><div class="line"><a name="l12681"></a><span class="lineno">12681</span>  current2_(other.current2_),</div><div class="line"><a name="l12682"></a><span class="lineno">12682</span>  begin3_(other.begin3_),</div><div class="line"><a name="l12683"></a><span class="lineno">12683</span>  end3_(other.end3_),</div><div class="line"><a name="l12684"></a><span class="lineno">12684</span>  current3_(other.current3_),</div><div class="line"><a name="l12685"></a><span class="lineno">12685</span>  begin4_(other.begin4_),</div><div class="line"><a name="l12686"></a><span class="lineno">12686</span>  end4_(other.end4_),</div><div class="line"><a name="l12687"></a><span class="lineno">12687</span>  current4_(other.current4_),</div><div class="line"><a name="l12688"></a><span class="lineno">12688</span>  begin5_(other.begin5_),</div><div class="line"><a name="l12689"></a><span class="lineno">12689</span>  end5_(other.end5_),</div><div class="line"><a name="l12690"></a><span class="lineno">12690</span>  current5_(other.current5_),</div><div class="line"><a name="l12691"></a><span class="lineno">12691</span>  begin6_(other.begin6_),</div><div class="line"><a name="l12692"></a><span class="lineno">12692</span>  end6_(other.end6_),</div><div class="line"><a name="l12693"></a><span class="lineno">12693</span>  current6_(other.current6_),</div><div class="line"><a name="l12694"></a><span class="lineno">12694</span>  begin7_(other.begin7_),</div><div class="line"><a name="l12695"></a><span class="lineno">12695</span>  end7_(other.end7_),</div><div class="line"><a name="l12696"></a><span class="lineno">12696</span>  current7_(other.current7_),</div><div class="line"><a name="l12697"></a><span class="lineno">12697</span>  begin8_(other.begin8_),</div><div class="line"><a name="l12698"></a><span class="lineno">12698</span>  end8_(other.end8_),</div><div class="line"><a name="l12699"></a><span class="lineno">12699</span>  current8_(other.current8_),</div><div class="line"><a name="l12700"></a><span class="lineno">12700</span>  begin9_(other.begin9_),</div><div class="line"><a name="l12701"></a><span class="lineno">12701</span>  end9_(other.end9_),</div><div class="line"><a name="l12702"></a><span class="lineno">12702</span>  current9_(other.current9_) {</div><div class="line"><a name="l12703"></a><span class="lineno">12703</span>  ComputeCurrentValue();</div><div class="line"><a name="l12704"></a><span class="lineno">12704</span>  }</div><div class="line"><a name="l12705"></a><span class="lineno">12705</span> </div><div class="line"><a name="l12706"></a><span class="lineno">12706</span>  <span class="keywordtype">void</span> ComputeCurrentValue() {</div><div class="line"><a name="l12707"></a><span class="lineno">12707</span>  <span class="keywordflow">if</span> (!AtEnd())</div><div class="line"><a name="l12708"></a><span class="lineno">12708</span>  current_value_.reset(<span class="keyword">new</span> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator9.html#a86742cdf8f015ff11f7a40f0b66179c7">ParamType</a>(*current1_, *current2_, *current3_,</div><div class="line"><a name="l12709"></a><span class="lineno">12709</span>  *current4_, *current5_, *current6_, *current7_, *current8_,</div><div class="line"><a name="l12710"></a><span class="lineno">12710</span>  *current9_));</div><div class="line"><a name="l12711"></a><span class="lineno">12711</span>  }</div><div class="line"><a name="l12712"></a><span class="lineno">12712</span>  <span class="keywordtype">bool</span> AtEnd()<span class="keyword"> const </span>{</div><div class="line"><a name="l12713"></a><span class="lineno">12713</span>  <span class="comment">// We must report iterator past the end of the range when either of the</span></div><div class="line"><a name="l12714"></a><span class="lineno">12714</span>  <span class="comment">// component iterators has reached the end of its range.</span></div><div class="line"><a name="l12715"></a><span class="lineno">12715</span>  <span class="keywordflow">return</span></div><div class="line"><a name="l12716"></a><span class="lineno">12716</span>  current1_ == end1_ ||</div><div class="line"><a name="l12717"></a><span class="lineno">12717</span>  current2_ == end2_ ||</div><div class="line"><a name="l12718"></a><span class="lineno">12718</span>  current3_ == end3_ ||</div><div class="line"><a name="l12719"></a><span class="lineno">12719</span>  current4_ == end4_ ||</div><div class="line"><a name="l12720"></a><span class="lineno">12720</span>  current5_ == end5_ ||</div><div class="line"><a name="l12721"></a><span class="lineno">12721</span>  current6_ == end6_ ||</div><div class="line"><a name="l12722"></a><span class="lineno">12722</span>  current7_ == end7_ ||</div><div class="line"><a name="l12723"></a><span class="lineno">12723</span>  current8_ == end8_ ||</div><div class="line"><a name="l12724"></a><span class="lineno">12724</span>  current9_ == end9_;</div><div class="line"><a name="l12725"></a><span class="lineno">12725</span>  }</div><div class="line"><a name="l12726"></a><span class="lineno">12726</span> </div><div class="line"><a name="l12727"></a><span class="lineno">12727</span>  <span class="comment">// No implementation - assignment is unsupported.</span></div><div class="line"><a name="l12728"></a><span class="lineno">12728</span>  <span class="keywordtype">void</span> operator=(<span class="keyword">const</span> Iterator& other);</div><div class="line"><a name="l12729"></a><span class="lineno">12729</span> </div><div class="line"><a name="l12730"></a><span class="lineno">12730</span>  <span class="keyword">const</span> ParamGeneratorInterface<ParamType>* <span class="keyword">const</span> base_;</div><div class="line"><a name="l12731"></a><span class="lineno">12731</span>  <span class="comment">// begin[i]_ and end[i]_ define the i-th range that Iterator traverses.</span></div><div class="line"><a name="l12732"></a><span class="lineno">12732</span>  <span class="comment">// current[i]_ is the actual traversing iterator.</span></div><div class="line"><a name="l12733"></a><span class="lineno">12733</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T1>::iterator</a> begin1_;</div><div class="line"><a name="l12734"></a><span class="lineno">12734</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T1>::iterator</a> end1_;</div><div class="line"><a name="l12735"></a><span class="lineno">12735</span>  <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T1>::iterator</a> current1_;</div><div class="line"><a name="l12736"></a><span class="lineno">12736</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T2>::iterator</a> begin2_;</div><div class="line"><a name="l12737"></a><span class="lineno">12737</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T2>::iterator</a> end2_;</div><div class="line"><a name="l12738"></a><span class="lineno">12738</span>  <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T2>::iterator</a> current2_;</div><div class="line"><a name="l12739"></a><span class="lineno">12739</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T3>::iterator</a> begin3_;</div><div class="line"><a name="l12740"></a><span class="lineno">12740</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T3>::iterator</a> end3_;</div><div class="line"><a name="l12741"></a><span class="lineno">12741</span>  <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T3>::iterator</a> current3_;</div><div class="line"><a name="l12742"></a><span class="lineno">12742</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T4>::iterator</a> begin4_;</div><div class="line"><a name="l12743"></a><span class="lineno">12743</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T4>::iterator</a> end4_;</div><div class="line"><a name="l12744"></a><span class="lineno">12744</span>  <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T4>::iterator</a> current4_;</div><div class="line"><a name="l12745"></a><span class="lineno">12745</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T5>::iterator</a> begin5_;</div><div class="line"><a name="l12746"></a><span class="lineno">12746</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T5>::iterator</a> end5_;</div><div class="line"><a name="l12747"></a><span class="lineno">12747</span>  <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T5>::iterator</a> current5_;</div><div class="line"><a name="l12748"></a><span class="lineno">12748</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T6>::iterator</a> begin6_;</div><div class="line"><a name="l12749"></a><span class="lineno">12749</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T6>::iterator</a> end6_;</div><div class="line"><a name="l12750"></a><span class="lineno">12750</span>  <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T6>::iterator</a> current6_;</div><div class="line"><a name="l12751"></a><span class="lineno">12751</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T7>::iterator</a> begin7_;</div><div class="line"><a name="l12752"></a><span class="lineno">12752</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T7>::iterator</a> end7_;</div><div class="line"><a name="l12753"></a><span class="lineno">12753</span>  <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T7>::iterator</a> current7_;</div><div class="line"><a name="l12754"></a><span class="lineno">12754</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T8>::iterator</a> begin8_;</div><div class="line"><a name="l12755"></a><span class="lineno">12755</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T8>::iterator</a> end8_;</div><div class="line"><a name="l12756"></a><span class="lineno">12756</span>  <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T8>::iterator</a> current8_;</div><div class="line"><a name="l12757"></a><span class="lineno">12757</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T9>::iterator</a> begin9_;</div><div class="line"><a name="l12758"></a><span class="lineno">12758</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T9>::iterator</a> end9_;</div><div class="line"><a name="l12759"></a><span class="lineno">12759</span>  <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T9>::iterator</a> current9_;</div><div class="line"><a name="l12760"></a><span class="lineno">12760</span>  std::shared_ptr<ParamType> current_value_;</div><div class="line"><a name="l12761"></a><span class="lineno">12761</span>  }; <span class="comment">// class CartesianProductGenerator9::Iterator</span></div><div class="line"><a name="l12762"></a><span class="lineno">12762</span> </div><div class="line"><a name="l12763"></a><span class="lineno">12763</span>  <span class="comment">// No implementation - assignment is unsupported.</span></div><div class="line"><a name="l12764"></a><span class="lineno">12764</span>  <span class="keywordtype">void</span> operator=(<span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator9.html#aff06c7992c06297c6bf5ad5eb56534e9">CartesianProductGenerator9</a>& other);</div><div class="line"><a name="l12765"></a><span class="lineno">12765</span> </div><div class="line"><a name="l12766"></a><span class="lineno">12766</span>  <span class="keyword">const</span> ParamGenerator<T1> g1_;</div><div class="line"><a name="l12767"></a><span class="lineno">12767</span>  <span class="keyword">const</span> ParamGenerator<T2> g2_;</div><div class="line"><a name="l12768"></a><span class="lineno">12768</span>  <span class="keyword">const</span> ParamGenerator<T3> g3_;</div><div class="line"><a name="l12769"></a><span class="lineno">12769</span>  <span class="keyword">const</span> ParamGenerator<T4> g4_;</div><div class="line"><a name="l12770"></a><span class="lineno">12770</span>  <span class="keyword">const</span> ParamGenerator<T5> g5_;</div><div class="line"><a name="l12771"></a><span class="lineno">12771</span>  <span class="keyword">const</span> ParamGenerator<T6> g6_;</div><div class="line"><a name="l12772"></a><span class="lineno">12772</span>  <span class="keyword">const</span> ParamGenerator<T7> g7_;</div><div class="line"><a name="l12773"></a><span class="lineno">12773</span>  <span class="keyword">const</span> ParamGenerator<T8> g8_;</div><div class="line"><a name="l12774"></a><span class="lineno">12774</span>  <span class="keyword">const</span> ParamGenerator<T9> g9_;</div><div class="line"><a name="l12775"></a><span class="lineno">12775</span> }; <span class="comment">// class CartesianProductGenerator9</span></div><div class="line"><a name="l12776"></a><span class="lineno">12776</span> </div><div class="line"><a name="l12777"></a><span class="lineno">12777</span> </div><div class="line"><a name="l12778"></a><span class="lineno">12778</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l12779"></a><span class="lineno">12779</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10></div><div class="line"><a name="l12780"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_generator10.html">12780</a></span> <span class="keyword">class </span><a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator10.html">CartesianProductGenerator10</a></div><div class="line"><a name="l12781"></a><span class="lineno">12781</span>  : <span class="keyword">public</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator_interface.html">ParamGeneratorInterface</a>< ::std::tuple<T1, T2, T3, T4, T5, T6, T7,</div><div class="line"><a name="l12782"></a><span class="lineno">12782</span>  T8, T9, T10> > {</div><div class="line"><a name="l12783"></a><span class="lineno">12783</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l12784"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_generator10.html#ac9f50e9b6fff8dad968c5b98989752f9">12784</a></span>  typedef ::std::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator10.html#ac9f50e9b6fff8dad968c5b98989752f9">ParamType</a>;</div><div class="line"><a name="l12785"></a><span class="lineno">12785</span> </div><div class="line"><a name="l12786"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_generator10.html#a53d945670e910c0baaf14f3d25f1bbb6">12786</a></span>  <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator10.html#a53d945670e910c0baaf14f3d25f1bbb6">CartesianProductGenerator10</a>(<span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T1></a>& g1,</div><div class="line"><a name="l12787"></a><span class="lineno">12787</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T2></a>& g2, <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T3></a>& g3,</div><div class="line"><a name="l12788"></a><span class="lineno">12788</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T4></a>& g4, <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T5></a>& g5,</div><div class="line"><a name="l12789"></a><span class="lineno">12789</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T6></a>& g6, <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T7></a>& g7,</div><div class="line"><a name="l12790"></a><span class="lineno">12790</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T8></a>& g8, <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T9></a>& g9,</div><div class="line"><a name="l12791"></a><span class="lineno">12791</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T10></a>& g10)</div><div class="line"><a name="l12792"></a><span class="lineno">12792</span>  : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),</div><div class="line"><a name="l12793"></a><span class="lineno">12793</span>  g9_(g9), g10_(g10) {}</div><div class="line"><a name="l12794"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_generator10.html#a2bee6d271df046f7660c85e2b2d305a5">12794</a></span>  <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator10.html#a2bee6d271df046f7660c85e2b2d305a5">~CartesianProductGenerator10</a>()<span class="keyword"> override </span>{}</div><div class="line"><a name="l12795"></a><span class="lineno">12795</span> </div><div class="line"><a name="l12796"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_generator10.html#a23b2a79fc2fd0224fd31c519520cb945">12796</a></span>  <a class="code" href="classtesting_1_1internal_1_1_param_iterator_interface.html">ParamIteratorInterface<ParamType></a>* <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator10.html#a23b2a79fc2fd0224fd31c519520cb945">Begin</a>()<span class="keyword"> const override </span>{</div><div class="line"><a name="l12797"></a><span class="lineno">12797</span>  <span class="keywordflow">return</span> <span class="keyword">new</span> Iterator(<span class="keyword">this</span>, g1_, g1_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a14e735c8bd113556ae905a560cd2d607">begin</a>(), g2_, g2_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a14e735c8bd113556ae905a560cd2d607">begin</a>(), g3_,</div><div class="line"><a name="l12798"></a><span class="lineno">12798</span>  g3_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a14e735c8bd113556ae905a560cd2d607">begin</a>(), g4_, g4_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a14e735c8bd113556ae905a560cd2d607">begin</a>(), g5_, g5_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a14e735c8bd113556ae905a560cd2d607">begin</a>(), g6_, g6_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a14e735c8bd113556ae905a560cd2d607">begin</a>(), g7_,</div><div class="line"><a name="l12799"></a><span class="lineno">12799</span>  g7_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a14e735c8bd113556ae905a560cd2d607">begin</a>(), g8_, g8_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a14e735c8bd113556ae905a560cd2d607">begin</a>(), g9_, g9_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a14e735c8bd113556ae905a560cd2d607">begin</a>(), g10_, g10_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a14e735c8bd113556ae905a560cd2d607">begin</a>());</div><div class="line"><a name="l12800"></a><span class="lineno">12800</span>  }</div><div class="line"><a name="l12801"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_generator10.html#a373c054dc7b60a9ab6236c327cac4e23">12801</a></span>  <a class="code" href="classtesting_1_1internal_1_1_param_iterator_interface.html">ParamIteratorInterface<ParamType></a>* <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator10.html#a373c054dc7b60a9ab6236c327cac4e23">End</a>()<span class="keyword"> const override </span>{</div><div class="line"><a name="l12802"></a><span class="lineno">12802</span>  <span class="keywordflow">return</span> <span class="keyword">new</span> Iterator(<span class="keyword">this</span>, g1_, g1_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#aaf8f75df1099a07ff771a550b48f9fbe">end</a>(), g2_, g2_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#aaf8f75df1099a07ff771a550b48f9fbe">end</a>(), g3_, g3_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#aaf8f75df1099a07ff771a550b48f9fbe">end</a>(),</div><div class="line"><a name="l12803"></a><span class="lineno">12803</span>  g4_, g4_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#aaf8f75df1099a07ff771a550b48f9fbe">end</a>(), g5_, g5_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#aaf8f75df1099a07ff771a550b48f9fbe">end</a>(), g6_, g6_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#aaf8f75df1099a07ff771a550b48f9fbe">end</a>(), g7_, g7_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#aaf8f75df1099a07ff771a550b48f9fbe">end</a>(), g8_,</div><div class="line"><a name="l12804"></a><span class="lineno">12804</span>  g8_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#aaf8f75df1099a07ff771a550b48f9fbe">end</a>(), g9_, g9_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#aaf8f75df1099a07ff771a550b48f9fbe">end</a>(), g10_, g10_.<a class="code" href="classtesting_1_1internal_1_1_param_generator.html#aaf8f75df1099a07ff771a550b48f9fbe">end</a>());</div><div class="line"><a name="l12805"></a><span class="lineno">12805</span>  }</div><div class="line"><a name="l12806"></a><span class="lineno">12806</span> </div><div class="line"><a name="l12807"></a><span class="lineno">12807</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l12808"></a><span class="lineno">12808</span>  <span class="keyword">class </span>Iterator : <span class="keyword">public</span> <a class="code" href="classtesting_1_1internal_1_1_param_iterator_interface.html">ParamIteratorInterface</a><ParamType> {</div><div class="line"><a name="l12809"></a><span class="lineno">12809</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l12810"></a><span class="lineno">12810</span>  Iterator(<span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator_interface.html">ParamGeneratorInterface<ParamType></a>* base,</div><div class="line"><a name="l12811"></a><span class="lineno">12811</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T1></a>& g1,</div><div class="line"><a name="l12812"></a><span class="lineno">12812</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T1>::iterator</a>& current1,</div><div class="line"><a name="l12813"></a><span class="lineno">12813</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T2></a>& g2,</div><div class="line"><a name="l12814"></a><span class="lineno">12814</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T2>::iterator</a>& current2,</div><div class="line"><a name="l12815"></a><span class="lineno">12815</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T3></a>& g3,</div><div class="line"><a name="l12816"></a><span class="lineno">12816</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T3>::iterator</a>& current3,</div><div class="line"><a name="l12817"></a><span class="lineno">12817</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T4></a>& g4,</div><div class="line"><a name="l12818"></a><span class="lineno">12818</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T4>::iterator</a>& current4,</div><div class="line"><a name="l12819"></a><span class="lineno">12819</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T5></a>& g5,</div><div class="line"><a name="l12820"></a><span class="lineno">12820</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T5>::iterator</a>& current5,</div><div class="line"><a name="l12821"></a><span class="lineno">12821</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T6></a>& g6,</div><div class="line"><a name="l12822"></a><span class="lineno">12822</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T6>::iterator</a>& current6,</div><div class="line"><a name="l12823"></a><span class="lineno">12823</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T7></a>& g7,</div><div class="line"><a name="l12824"></a><span class="lineno">12824</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T7>::iterator</a>& current7,</div><div class="line"><a name="l12825"></a><span class="lineno">12825</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T8></a>& g8,</div><div class="line"><a name="l12826"></a><span class="lineno">12826</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T8>::iterator</a>& current8,</div><div class="line"><a name="l12827"></a><span class="lineno">12827</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T9></a>& g9,</div><div class="line"><a name="l12828"></a><span class="lineno">12828</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T9>::iterator</a>& current9,</div><div class="line"><a name="l12829"></a><span class="lineno">12829</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T10></a>& g10,</div><div class="line"><a name="l12830"></a><span class="lineno">12830</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T10>::iterator</a>& current10)</div><div class="line"><a name="l12831"></a><span class="lineno">12831</span>  : base_(base),</div><div class="line"><a name="l12832"></a><span class="lineno">12832</span>  begin1_(g1.begin()), end1_(g1.end()), current1_(current1),</div><div class="line"><a name="l12833"></a><span class="lineno">12833</span>  begin2_(g2.begin()), end2_(g2.end()), current2_(current2),</div><div class="line"><a name="l12834"></a><span class="lineno">12834</span>  begin3_(g3.begin()), end3_(g3.end()), current3_(current3),</div><div class="line"><a name="l12835"></a><span class="lineno">12835</span>  begin4_(g4.begin()), end4_(g4.end()), current4_(current4),</div><div class="line"><a name="l12836"></a><span class="lineno">12836</span>  begin5_(g5.begin()), end5_(g5.end()), current5_(current5),</div><div class="line"><a name="l12837"></a><span class="lineno">12837</span>  begin6_(g6.begin()), end6_(g6.end()), current6_(current6),</div><div class="line"><a name="l12838"></a><span class="lineno">12838</span>  begin7_(g7.begin()), end7_(g7.end()), current7_(current7),</div><div class="line"><a name="l12839"></a><span class="lineno">12839</span>  begin8_(g8.begin()), end8_(g8.end()), current8_(current8),</div><div class="line"><a name="l12840"></a><span class="lineno">12840</span>  begin9_(g9.begin()), end9_(g9.end()), current9_(current9),</div><div class="line"><a name="l12841"></a><span class="lineno">12841</span>  begin10_(g10.begin()), end10_(g10.end()), current10_(current10) {</div><div class="line"><a name="l12842"></a><span class="lineno">12842</span>  ComputeCurrentValue();</div><div class="line"><a name="l12843"></a><span class="lineno">12843</span>  }</div><div class="line"><a name="l12844"></a><span class="lineno">12844</span>  ~Iterator()<span class="keyword"> override </span>{}</div><div class="line"><a name="l12845"></a><span class="lineno">12845</span> </div><div class="line"><a name="l12846"></a><span class="lineno">12846</span>  <span class="keyword">const</span> ParamGeneratorInterface<ParamType>* BaseGenerator()<span class="keyword"> const override </span>{</div><div class="line"><a name="l12847"></a><span class="lineno">12847</span>  <span class="keywordflow">return</span> base_;</div><div class="line"><a name="l12848"></a><span class="lineno">12848</span>  }</div><div class="line"><a name="l12849"></a><span class="lineno">12849</span>  <span class="comment">// Advance should not be called on beyond-of-range iterators</span></div><div class="line"><a name="l12850"></a><span class="lineno">12850</span>  <span class="comment">// so no component iterators must be beyond end of range, either.</span></div><div class="line"><a name="l12851"></a><span class="lineno">12851</span>  <span class="keywordtype">void</span> Advance()<span class="keyword"> override </span>{</div><div class="line"><a name="l12852"></a><span class="lineno">12852</span>  assert(!AtEnd());</div><div class="line"><a name="l12853"></a><span class="lineno">12853</span>  ++current10_;</div><div class="line"><a name="l12854"></a><span class="lineno">12854</span>  <span class="keywordflow">if</span> (current10_ == end10_) {</div><div class="line"><a name="l12855"></a><span class="lineno">12855</span>  current10_ = begin10_;</div><div class="line"><a name="l12856"></a><span class="lineno">12856</span>  ++current9_;</div><div class="line"><a name="l12857"></a><span class="lineno">12857</span>  }</div><div class="line"><a name="l12858"></a><span class="lineno">12858</span>  <span class="keywordflow">if</span> (current9_ == end9_) {</div><div class="line"><a name="l12859"></a><span class="lineno">12859</span>  current9_ = begin9_;</div><div class="line"><a name="l12860"></a><span class="lineno">12860</span>  ++current8_;</div><div class="line"><a name="l12861"></a><span class="lineno">12861</span>  }</div><div class="line"><a name="l12862"></a><span class="lineno">12862</span>  <span class="keywordflow">if</span> (current8_ == end8_) {</div><div class="line"><a name="l12863"></a><span class="lineno">12863</span>  current8_ = begin8_;</div><div class="line"><a name="l12864"></a><span class="lineno">12864</span>  ++current7_;</div><div class="line"><a name="l12865"></a><span class="lineno">12865</span>  }</div><div class="line"><a name="l12866"></a><span class="lineno">12866</span>  <span class="keywordflow">if</span> (current7_ == end7_) {</div><div class="line"><a name="l12867"></a><span class="lineno">12867</span>  current7_ = begin7_;</div><div class="line"><a name="l12868"></a><span class="lineno">12868</span>  ++current6_;</div><div class="line"><a name="l12869"></a><span class="lineno">12869</span>  }</div><div class="line"><a name="l12870"></a><span class="lineno">12870</span>  <span class="keywordflow">if</span> (current6_ == end6_) {</div><div class="line"><a name="l12871"></a><span class="lineno">12871</span>  current6_ = begin6_;</div><div class="line"><a name="l12872"></a><span class="lineno">12872</span>  ++current5_;</div><div class="line"><a name="l12873"></a><span class="lineno">12873</span>  }</div><div class="line"><a name="l12874"></a><span class="lineno">12874</span>  <span class="keywordflow">if</span> (current5_ == end5_) {</div><div class="line"><a name="l12875"></a><span class="lineno">12875</span>  current5_ = begin5_;</div><div class="line"><a name="l12876"></a><span class="lineno">12876</span>  ++current4_;</div><div class="line"><a name="l12877"></a><span class="lineno">12877</span>  }</div><div class="line"><a name="l12878"></a><span class="lineno">12878</span>  <span class="keywordflow">if</span> (current4_ == end4_) {</div><div class="line"><a name="l12879"></a><span class="lineno">12879</span>  current4_ = begin4_;</div><div class="line"><a name="l12880"></a><span class="lineno">12880</span>  ++current3_;</div><div class="line"><a name="l12881"></a><span class="lineno">12881</span>  }</div><div class="line"><a name="l12882"></a><span class="lineno">12882</span>  <span class="keywordflow">if</span> (current3_ == end3_) {</div><div class="line"><a name="l12883"></a><span class="lineno">12883</span>  current3_ = begin3_;</div><div class="line"><a name="l12884"></a><span class="lineno">12884</span>  ++current2_;</div><div class="line"><a name="l12885"></a><span class="lineno">12885</span>  }</div><div class="line"><a name="l12886"></a><span class="lineno">12886</span>  <span class="keywordflow">if</span> (current2_ == end2_) {</div><div class="line"><a name="l12887"></a><span class="lineno">12887</span>  current2_ = begin2_;</div><div class="line"><a name="l12888"></a><span class="lineno">12888</span>  ++current1_;</div><div class="line"><a name="l12889"></a><span class="lineno">12889</span>  }</div><div class="line"><a name="l12890"></a><span class="lineno">12890</span>  ComputeCurrentValue();</div><div class="line"><a name="l12891"></a><span class="lineno">12891</span>  }</div><div class="line"><a name="l12892"></a><span class="lineno">12892</span>  ParamIteratorInterface<ParamType>* Clone()<span class="keyword"> const override </span>{</div><div class="line"><a name="l12893"></a><span class="lineno">12893</span>  <span class="keywordflow">return</span> <span class="keyword">new</span> Iterator(*<span class="keyword">this</span>);</div><div class="line"><a name="l12894"></a><span class="lineno">12894</span>  }</div><div class="line"><a name="l12895"></a><span class="lineno">12895</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator10.html#ac9f50e9b6fff8dad968c5b98989752f9">ParamType</a>* Current()<span class="keyword"> const override </span>{ <span class="keywordflow">return</span> current_value_.get(); }</div><div class="line"><a name="l12896"></a><span class="lineno">12896</span>  <span class="keywordtype">bool</span> <a class="code" href="classtesting_1_1internal_1_1_param_iterator_interface.html#a9d811697a752d46f7bd6a0082f9040a3">Equals</a>(<span class="keyword">const</span> ParamIteratorInterface<ParamType>& other)<span class="keyword"> const override </span>{</div><div class="line"><a name="l12897"></a><span class="lineno">12897</span>  <span class="comment">// Having the same base generator guarantees that the other</span></div><div class="line"><a name="l12898"></a><span class="lineno">12898</span>  <span class="comment">// iterator is of the same type and we can downcast.</span></div><div class="line"><a name="l12899"></a><span class="lineno">12899</span>  <a class="code" href="gtest_8h.html#ab54343f0a36dc4cb0ce8a478dd7847b8">GTEST_CHECK_</a>(BaseGenerator() == other.BaseGenerator())</div><div class="line"><a name="l12900"></a><span class="lineno">12900</span>  << <span class="stringliteral">"The program attempted to compare iterators "</span></div><div class="line"><a name="l12901"></a><span class="lineno">12901</span>  << <span class="stringliteral">"from different generators."</span> << std::endl;</div><div class="line"><a name="l12902"></a><span class="lineno">12902</span>  <span class="keyword">const</span> Iterator* typed_other =</div><div class="line"><a name="l12903"></a><span class="lineno">12903</span>  CheckedDowncastToActualType<const Iterator>(&other);</div><div class="line"><a name="l12904"></a><span class="lineno">12904</span>  <span class="comment">// We must report iterators equal if they both point beyond their</span></div><div class="line"><a name="l12905"></a><span class="lineno">12905</span>  <span class="comment">// respective ranges. That can happen in a variety of fashions,</span></div><div class="line"><a name="l12906"></a><span class="lineno">12906</span>  <span class="comment">// so we have to consult AtEnd().</span></div><div class="line"><a name="l12907"></a><span class="lineno">12907</span>  <span class="keywordflow">return</span> (AtEnd() && typed_other->AtEnd()) ||</div><div class="line"><a name="l12908"></a><span class="lineno">12908</span>  (</div><div class="line"><a name="l12909"></a><span class="lineno">12909</span>  current1_ == typed_other->current1_ &&</div><div class="line"><a name="l12910"></a><span class="lineno">12910</span>  current2_ == typed_other->current2_ &&</div><div class="line"><a name="l12911"></a><span class="lineno">12911</span>  current3_ == typed_other->current3_ &&</div><div class="line"><a name="l12912"></a><span class="lineno">12912</span>  current4_ == typed_other->current4_ &&</div><div class="line"><a name="l12913"></a><span class="lineno">12913</span>  current5_ == typed_other->current5_ &&</div><div class="line"><a name="l12914"></a><span class="lineno">12914</span>  current6_ == typed_other->current6_ &&</div><div class="line"><a name="l12915"></a><span class="lineno">12915</span>  current7_ == typed_other->current7_ &&</div><div class="line"><a name="l12916"></a><span class="lineno">12916</span>  current8_ == typed_other->current8_ &&</div><div class="line"><a name="l12917"></a><span class="lineno">12917</span>  current9_ == typed_other->current9_ &&</div><div class="line"><a name="l12918"></a><span class="lineno">12918</span>  current10_ == typed_other->current10_);</div><div class="line"><a name="l12919"></a><span class="lineno">12919</span>  }</div><div class="line"><a name="l12920"></a><span class="lineno">12920</span> </div><div class="line"><a name="l12921"></a><span class="lineno">12921</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l12922"></a><span class="lineno">12922</span>  Iterator(<span class="keyword">const</span> Iterator& other)</div><div class="line"><a name="l12923"></a><span class="lineno">12923</span>  : base_(other.base_),</div><div class="line"><a name="l12924"></a><span class="lineno">12924</span>  begin1_(other.begin1_),</div><div class="line"><a name="l12925"></a><span class="lineno">12925</span>  end1_(other.end1_),</div><div class="line"><a name="l12926"></a><span class="lineno">12926</span>  current1_(other.current1_),</div><div class="line"><a name="l12927"></a><span class="lineno">12927</span>  begin2_(other.begin2_),</div><div class="line"><a name="l12928"></a><span class="lineno">12928</span>  end2_(other.end2_),</div><div class="line"><a name="l12929"></a><span class="lineno">12929</span>  current2_(other.current2_),</div><div class="line"><a name="l12930"></a><span class="lineno">12930</span>  begin3_(other.begin3_),</div><div class="line"><a name="l12931"></a><span class="lineno">12931</span>  end3_(other.end3_),</div><div class="line"><a name="l12932"></a><span class="lineno">12932</span>  current3_(other.current3_),</div><div class="line"><a name="l12933"></a><span class="lineno">12933</span>  begin4_(other.begin4_),</div><div class="line"><a name="l12934"></a><span class="lineno">12934</span>  end4_(other.end4_),</div><div class="line"><a name="l12935"></a><span class="lineno">12935</span>  current4_(other.current4_),</div><div class="line"><a name="l12936"></a><span class="lineno">12936</span>  begin5_(other.begin5_),</div><div class="line"><a name="l12937"></a><span class="lineno">12937</span>  end5_(other.end5_),</div><div class="line"><a name="l12938"></a><span class="lineno">12938</span>  current5_(other.current5_),</div><div class="line"><a name="l12939"></a><span class="lineno">12939</span>  begin6_(other.begin6_),</div><div class="line"><a name="l12940"></a><span class="lineno">12940</span>  end6_(other.end6_),</div><div class="line"><a name="l12941"></a><span class="lineno">12941</span>  current6_(other.current6_),</div><div class="line"><a name="l12942"></a><span class="lineno">12942</span>  begin7_(other.begin7_),</div><div class="line"><a name="l12943"></a><span class="lineno">12943</span>  end7_(other.end7_),</div><div class="line"><a name="l12944"></a><span class="lineno">12944</span>  current7_(other.current7_),</div><div class="line"><a name="l12945"></a><span class="lineno">12945</span>  begin8_(other.begin8_),</div><div class="line"><a name="l12946"></a><span class="lineno">12946</span>  end8_(other.end8_),</div><div class="line"><a name="l12947"></a><span class="lineno">12947</span>  current8_(other.current8_),</div><div class="line"><a name="l12948"></a><span class="lineno">12948</span>  begin9_(other.begin9_),</div><div class="line"><a name="l12949"></a><span class="lineno">12949</span>  end9_(other.end9_),</div><div class="line"><a name="l12950"></a><span class="lineno">12950</span>  current9_(other.current9_),</div><div class="line"><a name="l12951"></a><span class="lineno">12951</span>  begin10_(other.begin10_),</div><div class="line"><a name="l12952"></a><span class="lineno">12952</span>  end10_(other.end10_),</div><div class="line"><a name="l12953"></a><span class="lineno">12953</span>  current10_(other.current10_) {</div><div class="line"><a name="l12954"></a><span class="lineno">12954</span>  ComputeCurrentValue();</div><div class="line"><a name="l12955"></a><span class="lineno">12955</span>  }</div><div class="line"><a name="l12956"></a><span class="lineno">12956</span> </div><div class="line"><a name="l12957"></a><span class="lineno">12957</span>  <span class="keywordtype">void</span> ComputeCurrentValue() {</div><div class="line"><a name="l12958"></a><span class="lineno">12958</span>  <span class="keywordflow">if</span> (!AtEnd())</div><div class="line"><a name="l12959"></a><span class="lineno">12959</span>  current_value_.reset(<span class="keyword">new</span> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator10.html#ac9f50e9b6fff8dad968c5b98989752f9">ParamType</a>(*current1_, *current2_, *current3_,</div><div class="line"><a name="l12960"></a><span class="lineno">12960</span>  *current4_, *current5_, *current6_, *current7_, *current8_,</div><div class="line"><a name="l12961"></a><span class="lineno">12961</span>  *current9_, *current10_));</div><div class="line"><a name="l12962"></a><span class="lineno">12962</span>  }</div><div class="line"><a name="l12963"></a><span class="lineno">12963</span>  <span class="keywordtype">bool</span> AtEnd()<span class="keyword"> const </span>{</div><div class="line"><a name="l12964"></a><span class="lineno">12964</span>  <span class="comment">// We must report iterator past the end of the range when either of the</span></div><div class="line"><a name="l12965"></a><span class="lineno">12965</span>  <span class="comment">// component iterators has reached the end of its range.</span></div><div class="line"><a name="l12966"></a><span class="lineno">12966</span>  <span class="keywordflow">return</span></div><div class="line"><a name="l12967"></a><span class="lineno">12967</span>  current1_ == end1_ ||</div><div class="line"><a name="l12968"></a><span class="lineno">12968</span>  current2_ == end2_ ||</div><div class="line"><a name="l12969"></a><span class="lineno">12969</span>  current3_ == end3_ ||</div><div class="line"><a name="l12970"></a><span class="lineno">12970</span>  current4_ == end4_ ||</div><div class="line"><a name="l12971"></a><span class="lineno">12971</span>  current5_ == end5_ ||</div><div class="line"><a name="l12972"></a><span class="lineno">12972</span>  current6_ == end6_ ||</div><div class="line"><a name="l12973"></a><span class="lineno">12973</span>  current7_ == end7_ ||</div><div class="line"><a name="l12974"></a><span class="lineno">12974</span>  current8_ == end8_ ||</div><div class="line"><a name="l12975"></a><span class="lineno">12975</span>  current9_ == end9_ ||</div><div class="line"><a name="l12976"></a><span class="lineno">12976</span>  current10_ == end10_;</div><div class="line"><a name="l12977"></a><span class="lineno">12977</span>  }</div><div class="line"><a name="l12978"></a><span class="lineno">12978</span> </div><div class="line"><a name="l12979"></a><span class="lineno">12979</span>  <span class="comment">// No implementation - assignment is unsupported.</span></div><div class="line"><a name="l12980"></a><span class="lineno">12980</span>  <span class="keywordtype">void</span> operator=(<span class="keyword">const</span> Iterator& other);</div><div class="line"><a name="l12981"></a><span class="lineno">12981</span> </div><div class="line"><a name="l12982"></a><span class="lineno">12982</span>  <span class="keyword">const</span> ParamGeneratorInterface<ParamType>* <span class="keyword">const</span> base_;</div><div class="line"><a name="l12983"></a><span class="lineno">12983</span>  <span class="comment">// begin[i]_ and end[i]_ define the i-th range that Iterator traverses.</span></div><div class="line"><a name="l12984"></a><span class="lineno">12984</span>  <span class="comment">// current[i]_ is the actual traversing iterator.</span></div><div class="line"><a name="l12985"></a><span class="lineno">12985</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T1>::iterator</a> begin1_;</div><div class="line"><a name="l12986"></a><span class="lineno">12986</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T1>::iterator</a> end1_;</div><div class="line"><a name="l12987"></a><span class="lineno">12987</span>  <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T1>::iterator</a> current1_;</div><div class="line"><a name="l12988"></a><span class="lineno">12988</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T2>::iterator</a> begin2_;</div><div class="line"><a name="l12989"></a><span class="lineno">12989</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T2>::iterator</a> end2_;</div><div class="line"><a name="l12990"></a><span class="lineno">12990</span>  <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T2>::iterator</a> current2_;</div><div class="line"><a name="l12991"></a><span class="lineno">12991</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T3>::iterator</a> begin3_;</div><div class="line"><a name="l12992"></a><span class="lineno">12992</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T3>::iterator</a> end3_;</div><div class="line"><a name="l12993"></a><span class="lineno">12993</span>  <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T3>::iterator</a> current3_;</div><div class="line"><a name="l12994"></a><span class="lineno">12994</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T4>::iterator</a> begin4_;</div><div class="line"><a name="l12995"></a><span class="lineno">12995</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T4>::iterator</a> end4_;</div><div class="line"><a name="l12996"></a><span class="lineno">12996</span>  <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T4>::iterator</a> current4_;</div><div class="line"><a name="l12997"></a><span class="lineno">12997</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T5>::iterator</a> begin5_;</div><div class="line"><a name="l12998"></a><span class="lineno">12998</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T5>::iterator</a> end5_;</div><div class="line"><a name="l12999"></a><span class="lineno">12999</span>  <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T5>::iterator</a> current5_;</div><div class="line"><a name="l13000"></a><span class="lineno">13000</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T6>::iterator</a> begin6_;</div><div class="line"><a name="l13001"></a><span class="lineno">13001</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T6>::iterator</a> end6_;</div><div class="line"><a name="l13002"></a><span class="lineno">13002</span>  <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T6>::iterator</a> current6_;</div><div class="line"><a name="l13003"></a><span class="lineno">13003</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T7>::iterator</a> begin7_;</div><div class="line"><a name="l13004"></a><span class="lineno">13004</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T7>::iterator</a> end7_;</div><div class="line"><a name="l13005"></a><span class="lineno">13005</span>  <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T7>::iterator</a> current7_;</div><div class="line"><a name="l13006"></a><span class="lineno">13006</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T8>::iterator</a> begin8_;</div><div class="line"><a name="l13007"></a><span class="lineno">13007</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T8>::iterator</a> end8_;</div><div class="line"><a name="l13008"></a><span class="lineno">13008</span>  <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T8>::iterator</a> current8_;</div><div class="line"><a name="l13009"></a><span class="lineno">13009</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T9>::iterator</a> begin9_;</div><div class="line"><a name="l13010"></a><span class="lineno">13010</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T9>::iterator</a> end9_;</div><div class="line"><a name="l13011"></a><span class="lineno">13011</span>  <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T9>::iterator</a> current9_;</div><div class="line"><a name="l13012"></a><span class="lineno">13012</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T10>::iterator</a> begin10_;</div><div class="line"><a name="l13013"></a><span class="lineno">13013</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T10>::iterator</a> end10_;</div><div class="line"><a name="l13014"></a><span class="lineno">13014</span>  <span class="keyword">typename</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">ParamGenerator<T10>::iterator</a> current10_;</div><div class="line"><a name="l13015"></a><span class="lineno">13015</span>  std::shared_ptr<ParamType> current_value_;</div><div class="line"><a name="l13016"></a><span class="lineno">13016</span>  }; <span class="comment">// class CartesianProductGenerator10::Iterator</span></div><div class="line"><a name="l13017"></a><span class="lineno">13017</span> </div><div class="line"><a name="l13018"></a><span class="lineno">13018</span>  <span class="comment">// No implementation - assignment is unsupported.</span></div><div class="line"><a name="l13019"></a><span class="lineno">13019</span>  <span class="keywordtype">void</span> operator=(<span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator10.html#a53d945670e910c0baaf14f3d25f1bbb6">CartesianProductGenerator10</a>& other);</div><div class="line"><a name="l13020"></a><span class="lineno">13020</span> </div><div class="line"><a name="l13021"></a><span class="lineno">13021</span>  <span class="keyword">const</span> ParamGenerator<T1> g1_;</div><div class="line"><a name="l13022"></a><span class="lineno">13022</span>  <span class="keyword">const</span> ParamGenerator<T2> g2_;</div><div class="line"><a name="l13023"></a><span class="lineno">13023</span>  <span class="keyword">const</span> ParamGenerator<T3> g3_;</div><div class="line"><a name="l13024"></a><span class="lineno">13024</span>  <span class="keyword">const</span> ParamGenerator<T4> g4_;</div><div class="line"><a name="l13025"></a><span class="lineno">13025</span>  <span class="keyword">const</span> ParamGenerator<T5> g5_;</div><div class="line"><a name="l13026"></a><span class="lineno">13026</span>  <span class="keyword">const</span> ParamGenerator<T6> g6_;</div><div class="line"><a name="l13027"></a><span class="lineno">13027</span>  <span class="keyword">const</span> ParamGenerator<T7> g7_;</div><div class="line"><a name="l13028"></a><span class="lineno">13028</span>  <span class="keyword">const</span> ParamGenerator<T8> g8_;</div><div class="line"><a name="l13029"></a><span class="lineno">13029</span>  <span class="keyword">const</span> ParamGenerator<T9> g9_;</div><div class="line"><a name="l13030"></a><span class="lineno">13030</span>  <span class="keyword">const</span> ParamGenerator<T10> g10_;</div><div class="line"><a name="l13031"></a><span class="lineno">13031</span> }; <span class="comment">// class CartesianProductGenerator10</span></div><div class="line"><a name="l13032"></a><span class="lineno">13032</span> </div><div class="line"><a name="l13033"></a><span class="lineno">13033</span> </div><div class="line"><a name="l13034"></a><span class="lineno">13034</span> <span class="comment">// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.</span></div><div class="line"><a name="l13035"></a><span class="lineno">13035</span> <span class="comment">//</span></div><div class="line"><a name="l13036"></a><span class="lineno">13036</span> <span class="comment">// Helper classes providing Combine() with polymorphic features. They allow</span></div><div class="line"><a name="l13037"></a><span class="lineno">13037</span> <span class="comment">// casting CartesianProductGeneratorN<T> to ParamGenerator<U> if T is</span></div><div class="line"><a name="l13038"></a><span class="lineno">13038</span> <span class="comment">// convertible to U.</span></div><div class="line"><a name="l13039"></a><span class="lineno">13039</span> <span class="comment">//</span></div><div class="line"><a name="l13040"></a><span class="lineno">13040</span> <span class="keyword">template</span> <<span class="keyword">class</span> Generator1, <span class="keyword">class</span> Generator2></div><div class="line"><a name="l13041"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_holder2.html">13041</a></span> <span class="keyword">class </span><a class="code" href="classtesting_1_1internal_1_1_cartesian_product_holder2.html">CartesianProductHolder2</a> {</div><div class="line"><a name="l13042"></a><span class="lineno">13042</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l13043"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_holder2.html#a504471500c3171f7efee84b830004ff9">13043</a></span> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_holder2.html#a504471500c3171f7efee84b830004ff9">CartesianProductHolder2</a>(<span class="keyword">const</span> Generator1& g1, <span class="keyword">const</span> Generator2& g2)</div><div class="line"><a name="l13044"></a><span class="lineno">13044</span>  : g1_(g1), g2_(g2) {}</div><div class="line"><a name="l13045"></a><span class="lineno">13045</span>  <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2></div><div class="line"><a name="l13046"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_holder2.html#afa0052d44ded139ca23a270375d28e6a">13046</a></span>  <span class="keyword">operator</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator< ::std::tuple<T1, T2></a> >() <span class="keyword">const</span> {</div><div class="line"><a name="l13047"></a><span class="lineno">13047</span>  <span class="keywordflow">return</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator< ::std::tuple<T1, T2></a> >(</div><div class="line"><a name="l13048"></a><span class="lineno">13048</span>  <span class="keyword">new</span> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator2.html">CartesianProductGenerator2<T1, T2></a>(</div><div class="line"><a name="l13049"></a><span class="lineno">13049</span>  <span class="keyword">static_cast<</span><a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T1></a> <span class="keyword">></span>(g1_),</div><div class="line"><a name="l13050"></a><span class="lineno">13050</span>  <span class="keyword">static_cast<</span><a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T2></a> <span class="keyword">></span>(g2_)));</div><div class="line"><a name="l13051"></a><span class="lineno">13051</span>  }</div><div class="line"><a name="l13052"></a><span class="lineno">13052</span> </div><div class="line"><a name="l13053"></a><span class="lineno">13053</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l13054"></a><span class="lineno">13054</span>  <span class="comment">// No implementation - assignment is unsupported.</span></div><div class="line"><a name="l13055"></a><span class="lineno">13055</span>  <span class="keywordtype">void</span> operator=(<span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_holder2.html">CartesianProductHolder2</a>& other);</div><div class="line"><a name="l13056"></a><span class="lineno">13056</span> </div><div class="line"><a name="l13057"></a><span class="lineno">13057</span>  <span class="keyword">const</span> Generator1 g1_;</div><div class="line"><a name="l13058"></a><span class="lineno">13058</span>  <span class="keyword">const</span> Generator2 g2_;</div><div class="line"><a name="l13059"></a><span class="lineno">13059</span> }; <span class="comment">// class CartesianProductHolder2</span></div><div class="line"><a name="l13060"></a><span class="lineno">13060</span> </div><div class="line"><a name="l13061"></a><span class="lineno">13061</span> <span class="keyword">template</span> <<span class="keyword">class</span> Generator1, <span class="keyword">class</span> Generator2, <span class="keyword">class</span> Generator3></div><div class="line"><a name="l13062"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_holder3.html">13062</a></span> <span class="keyword">class </span><a class="code" href="classtesting_1_1internal_1_1_cartesian_product_holder3.html">CartesianProductHolder3</a> {</div><div class="line"><a name="l13063"></a><span class="lineno">13063</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l13064"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_holder3.html#ad74b6d31441c7f3f7f8514a563c8277e">13064</a></span> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_holder3.html#ad74b6d31441c7f3f7f8514a563c8277e">CartesianProductHolder3</a>(<span class="keyword">const</span> Generator1& g1, <span class="keyword">const</span> Generator2& g2,</div><div class="line"><a name="l13065"></a><span class="lineno">13065</span>  <span class="keyword">const</span> Generator3& g3)</div><div class="line"><a name="l13066"></a><span class="lineno">13066</span>  : g1_(g1), g2_(g2), g3_(g3) {}</div><div class="line"><a name="l13067"></a><span class="lineno">13067</span>  <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3></div><div class="line"><a name="l13068"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_holder3.html#a10074f00be0b5069dbc67ef5c66fbf0c">13068</a></span>  <span class="keyword">operator</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator< ::std::tuple<T1, T2, T3></a> >() <span class="keyword">const</span> {</div><div class="line"><a name="l13069"></a><span class="lineno">13069</span>  <span class="keywordflow">return</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator< ::std::tuple<T1, T2, T3></a> >(</div><div class="line"><a name="l13070"></a><span class="lineno">13070</span>  <span class="keyword">new</span> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator3.html">CartesianProductGenerator3<T1, T2, T3></a>(</div><div class="line"><a name="l13071"></a><span class="lineno">13071</span>  <span class="keyword">static_cast<</span><a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T1></a> <span class="keyword">></span>(g1_),</div><div class="line"><a name="l13072"></a><span class="lineno">13072</span>  <span class="keyword">static_cast<</span><a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T2></a> <span class="keyword">></span>(g2_),</div><div class="line"><a name="l13073"></a><span class="lineno">13073</span>  <span class="keyword">static_cast<</span><a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T3></a> <span class="keyword">></span>(g3_)));</div><div class="line"><a name="l13074"></a><span class="lineno">13074</span>  }</div><div class="line"><a name="l13075"></a><span class="lineno">13075</span> </div><div class="line"><a name="l13076"></a><span class="lineno">13076</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l13077"></a><span class="lineno">13077</span>  <span class="comment">// No implementation - assignment is unsupported.</span></div><div class="line"><a name="l13078"></a><span class="lineno">13078</span>  <span class="keywordtype">void</span> operator=(<span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_holder3.html">CartesianProductHolder3</a>& other);</div><div class="line"><a name="l13079"></a><span class="lineno">13079</span> </div><div class="line"><a name="l13080"></a><span class="lineno">13080</span>  <span class="keyword">const</span> Generator1 g1_;</div><div class="line"><a name="l13081"></a><span class="lineno">13081</span>  <span class="keyword">const</span> Generator2 g2_;</div><div class="line"><a name="l13082"></a><span class="lineno">13082</span>  <span class="keyword">const</span> Generator3 g3_;</div><div class="line"><a name="l13083"></a><span class="lineno">13083</span> }; <span class="comment">// class CartesianProductHolder3</span></div><div class="line"><a name="l13084"></a><span class="lineno">13084</span> </div><div class="line"><a name="l13085"></a><span class="lineno">13085</span> <span class="keyword">template</span> <<span class="keyword">class </span>Generator1, <span class="keyword">class </span>Generator2, <span class="keyword">class </span>Generator3,</div><div class="line"><a name="l13086"></a><span class="lineno">13086</span>  <span class="keyword">class </span>Generator4></div><div class="line"><a name="l13087"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_holder4.html">13087</a></span> <span class="keyword">class </span><a class="code" href="classtesting_1_1internal_1_1_cartesian_product_holder4.html">CartesianProductHolder4</a> {</div><div class="line"><a name="l13088"></a><span class="lineno">13088</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l13089"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_holder4.html#a07fe92a091d7717a159d7ba5f2fe3c75">13089</a></span> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_holder4.html#a07fe92a091d7717a159d7ba5f2fe3c75">CartesianProductHolder4</a>(<span class="keyword">const</span> Generator1& g1, <span class="keyword">const</span> Generator2& g2,</div><div class="line"><a name="l13090"></a><span class="lineno">13090</span>  <span class="keyword">const</span> Generator3& g3, <span class="keyword">const</span> Generator4& g4)</div><div class="line"><a name="l13091"></a><span class="lineno">13091</span>  : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {}</div><div class="line"><a name="l13092"></a><span class="lineno">13092</span>  <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4></div><div class="line"><a name="l13093"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_holder4.html#a6138a6d2767e2381266fe8676adbdd0b">13093</a></span>  <span class="keyword">operator</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator< ::std::tuple<T1, T2, T3, T4></a> >() <span class="keyword">const</span> {</div><div class="line"><a name="l13094"></a><span class="lineno">13094</span>  <span class="keywordflow">return</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator< ::std::tuple<T1, T2, T3, T4></a> >(</div><div class="line"><a name="l13095"></a><span class="lineno">13095</span>  <span class="keyword">new</span> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator4.html">CartesianProductGenerator4<T1, T2, T3, T4></a>(</div><div class="line"><a name="l13096"></a><span class="lineno">13096</span>  <span class="keyword">static_cast<</span><a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T1></a> <span class="keyword">></span>(g1_),</div><div class="line"><a name="l13097"></a><span class="lineno">13097</span>  <span class="keyword">static_cast<</span><a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T2></a> <span class="keyword">></span>(g2_),</div><div class="line"><a name="l13098"></a><span class="lineno">13098</span>  <span class="keyword">static_cast<</span><a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T3></a> <span class="keyword">></span>(g3_),</div><div class="line"><a name="l13099"></a><span class="lineno">13099</span>  <span class="keyword">static_cast<</span><a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T4></a> <span class="keyword">></span>(g4_)));</div><div class="line"><a name="l13100"></a><span class="lineno">13100</span>  }</div><div class="line"><a name="l13101"></a><span class="lineno">13101</span> </div><div class="line"><a name="l13102"></a><span class="lineno">13102</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l13103"></a><span class="lineno">13103</span>  <span class="comment">// No implementation - assignment is unsupported.</span></div><div class="line"><a name="l13104"></a><span class="lineno">13104</span>  <span class="keywordtype">void</span> operator=(<span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_holder4.html">CartesianProductHolder4</a>& other);</div><div class="line"><a name="l13105"></a><span class="lineno">13105</span> </div><div class="line"><a name="l13106"></a><span class="lineno">13106</span>  <span class="keyword">const</span> Generator1 g1_;</div><div class="line"><a name="l13107"></a><span class="lineno">13107</span>  <span class="keyword">const</span> Generator2 g2_;</div><div class="line"><a name="l13108"></a><span class="lineno">13108</span>  <span class="keyword">const</span> Generator3 g3_;</div><div class="line"><a name="l13109"></a><span class="lineno">13109</span>  <span class="keyword">const</span> Generator4 g4_;</div><div class="line"><a name="l13110"></a><span class="lineno">13110</span> }; <span class="comment">// class CartesianProductHolder4</span></div><div class="line"><a name="l13111"></a><span class="lineno">13111</span> </div><div class="line"><a name="l13112"></a><span class="lineno">13112</span> <span class="keyword">template</span> <<span class="keyword">class </span>Generator1, <span class="keyword">class </span>Generator2, <span class="keyword">class </span>Generator3,</div><div class="line"><a name="l13113"></a><span class="lineno">13113</span>  <span class="keyword">class </span>Generator4, <span class="keyword">class </span>Generator5></div><div class="line"><a name="l13114"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_holder5.html">13114</a></span> <span class="keyword">class </span><a class="code" href="classtesting_1_1internal_1_1_cartesian_product_holder5.html">CartesianProductHolder5</a> {</div><div class="line"><a name="l13115"></a><span class="lineno">13115</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l13116"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_holder5.html#afb3a413ff0e59f31e621937f968d0923">13116</a></span> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_holder5.html#afb3a413ff0e59f31e621937f968d0923">CartesianProductHolder5</a>(<span class="keyword">const</span> Generator1& g1, <span class="keyword">const</span> Generator2& g2,</div><div class="line"><a name="l13117"></a><span class="lineno">13117</span>  <span class="keyword">const</span> Generator3& g3, <span class="keyword">const</span> Generator4& g4, <span class="keyword">const</span> Generator5& g5)</div><div class="line"><a name="l13118"></a><span class="lineno">13118</span>  : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {}</div><div class="line"><a name="l13119"></a><span class="lineno">13119</span>  <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5></div><div class="line"><a name="l13120"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_holder5.html#aff2bd642fe8c52a2b9235e7c9c08cf26">13120</a></span>  <span class="keyword">operator</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator< ::std::tuple<T1, T2, T3, T4, T5></a> >() <span class="keyword">const</span> {</div><div class="line"><a name="l13121"></a><span class="lineno">13121</span>  <span class="keywordflow">return</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator< ::std::tuple<T1, T2, T3, T4, T5></a> >(</div><div class="line"><a name="l13122"></a><span class="lineno">13122</span>  <span class="keyword">new</span> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator5.html">CartesianProductGenerator5<T1, T2, T3, T4, T5></a>(</div><div class="line"><a name="l13123"></a><span class="lineno">13123</span>  <span class="keyword">static_cast<</span><a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T1></a> <span class="keyword">></span>(g1_),</div><div class="line"><a name="l13124"></a><span class="lineno">13124</span>  <span class="keyword">static_cast<</span><a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T2></a> <span class="keyword">></span>(g2_),</div><div class="line"><a name="l13125"></a><span class="lineno">13125</span>  <span class="keyword">static_cast<</span><a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T3></a> <span class="keyword">></span>(g3_),</div><div class="line"><a name="l13126"></a><span class="lineno">13126</span>  <span class="keyword">static_cast<</span><a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T4></a> <span class="keyword">></span>(g4_),</div><div class="line"><a name="l13127"></a><span class="lineno">13127</span>  <span class="keyword">static_cast<</span><a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T5></a> <span class="keyword">></span>(g5_)));</div><div class="line"><a name="l13128"></a><span class="lineno">13128</span>  }</div><div class="line"><a name="l13129"></a><span class="lineno">13129</span> </div><div class="line"><a name="l13130"></a><span class="lineno">13130</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l13131"></a><span class="lineno">13131</span>  <span class="comment">// No implementation - assignment is unsupported.</span></div><div class="line"><a name="l13132"></a><span class="lineno">13132</span>  <span class="keywordtype">void</span> operator=(<span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_holder5.html">CartesianProductHolder5</a>& other);</div><div class="line"><a name="l13133"></a><span class="lineno">13133</span> </div><div class="line"><a name="l13134"></a><span class="lineno">13134</span>  <span class="keyword">const</span> Generator1 g1_;</div><div class="line"><a name="l13135"></a><span class="lineno">13135</span>  <span class="keyword">const</span> Generator2 g2_;</div><div class="line"><a name="l13136"></a><span class="lineno">13136</span>  <span class="keyword">const</span> Generator3 g3_;</div><div class="line"><a name="l13137"></a><span class="lineno">13137</span>  <span class="keyword">const</span> Generator4 g4_;</div><div class="line"><a name="l13138"></a><span class="lineno">13138</span>  <span class="keyword">const</span> Generator5 g5_;</div><div class="line"><a name="l13139"></a><span class="lineno">13139</span> }; <span class="comment">// class CartesianProductHolder5</span></div><div class="line"><a name="l13140"></a><span class="lineno">13140</span> </div><div class="line"><a name="l13141"></a><span class="lineno">13141</span> <span class="keyword">template</span> <<span class="keyword">class </span>Generator1, <span class="keyword">class </span>Generator2, <span class="keyword">class </span>Generator3,</div><div class="line"><a name="l13142"></a><span class="lineno">13142</span>  <span class="keyword">class </span>Generator4, <span class="keyword">class </span>Generator5, <span class="keyword">class </span>Generator6></div><div class="line"><a name="l13143"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_holder6.html">13143</a></span> <span class="keyword">class </span><a class="code" href="classtesting_1_1internal_1_1_cartesian_product_holder6.html">CartesianProductHolder6</a> {</div><div class="line"><a name="l13144"></a><span class="lineno">13144</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l13145"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_holder6.html#a7bb6f9224a1a6766e3634eb392e1b5f6">13145</a></span> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_holder6.html#a7bb6f9224a1a6766e3634eb392e1b5f6">CartesianProductHolder6</a>(<span class="keyword">const</span> Generator1& g1, <span class="keyword">const</span> Generator2& g2,</div><div class="line"><a name="l13146"></a><span class="lineno">13146</span>  <span class="keyword">const</span> Generator3& g3, <span class="keyword">const</span> Generator4& g4, <span class="keyword">const</span> Generator5& g5,</div><div class="line"><a name="l13147"></a><span class="lineno">13147</span>  <span class="keyword">const</span> Generator6& g6)</div><div class="line"><a name="l13148"></a><span class="lineno">13148</span>  : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {}</div><div class="line"><a name="l13149"></a><span class="lineno">13149</span>  <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l13150"></a><span class="lineno">13150</span>  <span class="keyword">typename</span> T6></div><div class="line"><a name="l13151"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_holder6.html#aa913929b072ce064ba7d00f030e6e3ed">13151</a></span>  <span class="keyword">operator</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator< ::std::tuple<T1, T2, T3, T4, T5, T6></a> >() <span class="keyword">const</span> {</div><div class="line"><a name="l13152"></a><span class="lineno">13152</span>  <span class="keywordflow">return</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator< ::std::tuple<T1, T2, T3, T4, T5, T6></a> >(</div><div class="line"><a name="l13153"></a><span class="lineno">13153</span>  <span class="keyword">new</span> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator6.html">CartesianProductGenerator6<T1, T2, T3, T4, T5, T6></a>(</div><div class="line"><a name="l13154"></a><span class="lineno">13154</span>  <span class="keyword">static_cast<</span><a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T1></a> <span class="keyword">></span>(g1_),</div><div class="line"><a name="l13155"></a><span class="lineno">13155</span>  <span class="keyword">static_cast<</span><a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T2></a> <span class="keyword">></span>(g2_),</div><div class="line"><a name="l13156"></a><span class="lineno">13156</span>  <span class="keyword">static_cast<</span><a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T3></a> <span class="keyword">></span>(g3_),</div><div class="line"><a name="l13157"></a><span class="lineno">13157</span>  <span class="keyword">static_cast<</span><a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T4></a> <span class="keyword">></span>(g4_),</div><div class="line"><a name="l13158"></a><span class="lineno">13158</span>  <span class="keyword">static_cast<</span><a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T5></a> <span class="keyword">></span>(g5_),</div><div class="line"><a name="l13159"></a><span class="lineno">13159</span>  <span class="keyword">static_cast<</span><a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T6></a> <span class="keyword">></span>(g6_)));</div><div class="line"><a name="l13160"></a><span class="lineno">13160</span>  }</div><div class="line"><a name="l13161"></a><span class="lineno">13161</span> </div><div class="line"><a name="l13162"></a><span class="lineno">13162</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l13163"></a><span class="lineno">13163</span>  <span class="comment">// No implementation - assignment is unsupported.</span></div><div class="line"><a name="l13164"></a><span class="lineno">13164</span>  <span class="keywordtype">void</span> operator=(<span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_holder6.html">CartesianProductHolder6</a>& other);</div><div class="line"><a name="l13165"></a><span class="lineno">13165</span> </div><div class="line"><a name="l13166"></a><span class="lineno">13166</span>  <span class="keyword">const</span> Generator1 g1_;</div><div class="line"><a name="l13167"></a><span class="lineno">13167</span>  <span class="keyword">const</span> Generator2 g2_;</div><div class="line"><a name="l13168"></a><span class="lineno">13168</span>  <span class="keyword">const</span> Generator3 g3_;</div><div class="line"><a name="l13169"></a><span class="lineno">13169</span>  <span class="keyword">const</span> Generator4 g4_;</div><div class="line"><a name="l13170"></a><span class="lineno">13170</span>  <span class="keyword">const</span> Generator5 g5_;</div><div class="line"><a name="l13171"></a><span class="lineno">13171</span>  <span class="keyword">const</span> Generator6 g6_;</div><div class="line"><a name="l13172"></a><span class="lineno">13172</span> }; <span class="comment">// class CartesianProductHolder6</span></div><div class="line"><a name="l13173"></a><span class="lineno">13173</span> </div><div class="line"><a name="l13174"></a><span class="lineno">13174</span> <span class="keyword">template</span> <<span class="keyword">class </span>Generator1, <span class="keyword">class </span>Generator2, <span class="keyword">class </span>Generator3,</div><div class="line"><a name="l13175"></a><span class="lineno">13175</span>  <span class="keyword">class </span>Generator4, <span class="keyword">class </span>Generator5, <span class="keyword">class </span>Generator6, <span class="keyword">class </span>Generator7></div><div class="line"><a name="l13176"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_holder7.html">13176</a></span> <span class="keyword">class </span><a class="code" href="classtesting_1_1internal_1_1_cartesian_product_holder7.html">CartesianProductHolder7</a> {</div><div class="line"><a name="l13177"></a><span class="lineno">13177</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l13178"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_holder7.html#a289e661f9252bac3570700410eb041b3">13178</a></span> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_holder7.html#a289e661f9252bac3570700410eb041b3">CartesianProductHolder7</a>(<span class="keyword">const</span> Generator1& g1, <span class="keyword">const</span> Generator2& g2,</div><div class="line"><a name="l13179"></a><span class="lineno">13179</span>  <span class="keyword">const</span> Generator3& g3, <span class="keyword">const</span> Generator4& g4, <span class="keyword">const</span> Generator5& g5,</div><div class="line"><a name="l13180"></a><span class="lineno">13180</span>  <span class="keyword">const</span> Generator6& g6, <span class="keyword">const</span> Generator7& g7)</div><div class="line"><a name="l13181"></a><span class="lineno">13181</span>  : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {}</div><div class="line"><a name="l13182"></a><span class="lineno">13182</span>  <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l13183"></a><span class="lineno">13183</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7></div><div class="line"><a name="l13184"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_holder7.html#aef46f61ddac11f5daaf7ba59b0616c36">13184</a></span>  <span class="keyword">operator</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator< ::std::tuple<T1, T2, T3, T4, T5, T6, T7></a> >() <span class="keyword">const</span> {</div><div class="line"><a name="l13185"></a><span class="lineno">13185</span>  <span class="keywordflow">return</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator< ::std::tuple<T1, T2, T3, T4, T5, T6, T7></a> >(</div><div class="line"><a name="l13186"></a><span class="lineno">13186</span>  <span class="keyword">new</span> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator7.html">CartesianProductGenerator7<T1, T2, T3, T4, T5, T6, T7></a>(</div><div class="line"><a name="l13187"></a><span class="lineno">13187</span>  <span class="keyword">static_cast<</span><a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T1></a> <span class="keyword">></span>(g1_),</div><div class="line"><a name="l13188"></a><span class="lineno">13188</span>  <span class="keyword">static_cast<</span><a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T2></a> <span class="keyword">></span>(g2_),</div><div class="line"><a name="l13189"></a><span class="lineno">13189</span>  <span class="keyword">static_cast<</span><a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T3></a> <span class="keyword">></span>(g3_),</div><div class="line"><a name="l13190"></a><span class="lineno">13190</span>  <span class="keyword">static_cast<</span><a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T4></a> <span class="keyword">></span>(g4_),</div><div class="line"><a name="l13191"></a><span class="lineno">13191</span>  <span class="keyword">static_cast<</span><a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T5></a> <span class="keyword">></span>(g5_),</div><div class="line"><a name="l13192"></a><span class="lineno">13192</span>  <span class="keyword">static_cast<</span><a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T6></a> <span class="keyword">></span>(g6_),</div><div class="line"><a name="l13193"></a><span class="lineno">13193</span>  <span class="keyword">static_cast<</span><a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T7></a> <span class="keyword">></span>(g7_)));</div><div class="line"><a name="l13194"></a><span class="lineno">13194</span>  }</div><div class="line"><a name="l13195"></a><span class="lineno">13195</span> </div><div class="line"><a name="l13196"></a><span class="lineno">13196</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l13197"></a><span class="lineno">13197</span>  <span class="comment">// No implementation - assignment is unsupported.</span></div><div class="line"><a name="l13198"></a><span class="lineno">13198</span>  <span class="keywordtype">void</span> operator=(<span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_holder7.html">CartesianProductHolder7</a>& other);</div><div class="line"><a name="l13199"></a><span class="lineno">13199</span> </div><div class="line"><a name="l13200"></a><span class="lineno">13200</span>  <span class="keyword">const</span> Generator1 g1_;</div><div class="line"><a name="l13201"></a><span class="lineno">13201</span>  <span class="keyword">const</span> Generator2 g2_;</div><div class="line"><a name="l13202"></a><span class="lineno">13202</span>  <span class="keyword">const</span> Generator3 g3_;</div><div class="line"><a name="l13203"></a><span class="lineno">13203</span>  <span class="keyword">const</span> Generator4 g4_;</div><div class="line"><a name="l13204"></a><span class="lineno">13204</span>  <span class="keyword">const</span> Generator5 g5_;</div><div class="line"><a name="l13205"></a><span class="lineno">13205</span>  <span class="keyword">const</span> Generator6 g6_;</div><div class="line"><a name="l13206"></a><span class="lineno">13206</span>  <span class="keyword">const</span> Generator7 g7_;</div><div class="line"><a name="l13207"></a><span class="lineno">13207</span> }; <span class="comment">// class CartesianProductHolder7</span></div><div class="line"><a name="l13208"></a><span class="lineno">13208</span> </div><div class="line"><a name="l13209"></a><span class="lineno">13209</span> <span class="keyword">template</span> <<span class="keyword">class </span>Generator1, <span class="keyword">class </span>Generator2, <span class="keyword">class </span>Generator3,</div><div class="line"><a name="l13210"></a><span class="lineno">13210</span>  <span class="keyword">class </span>Generator4, <span class="keyword">class </span>Generator5, <span class="keyword">class </span>Generator6, <span class="keyword">class </span>Generator7,</div><div class="line"><a name="l13211"></a><span class="lineno">13211</span>  <span class="keyword">class </span>Generator8></div><div class="line"><a name="l13212"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_holder8.html">13212</a></span> <span class="keyword">class </span><a class="code" href="classtesting_1_1internal_1_1_cartesian_product_holder8.html">CartesianProductHolder8</a> {</div><div class="line"><a name="l13213"></a><span class="lineno">13213</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l13214"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_holder8.html#adacdd7a2e15963d1b2f559d65f6b2aac">13214</a></span> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_holder8.html#adacdd7a2e15963d1b2f559d65f6b2aac">CartesianProductHolder8</a>(<span class="keyword">const</span> Generator1& g1, <span class="keyword">const</span> Generator2& g2,</div><div class="line"><a name="l13215"></a><span class="lineno">13215</span>  <span class="keyword">const</span> Generator3& g3, <span class="keyword">const</span> Generator4& g4, <span class="keyword">const</span> Generator5& g5,</div><div class="line"><a name="l13216"></a><span class="lineno">13216</span>  <span class="keyword">const</span> Generator6& g6, <span class="keyword">const</span> Generator7& g7, <span class="keyword">const</span> Generator8& g8)</div><div class="line"><a name="l13217"></a><span class="lineno">13217</span>  : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7),</div><div class="line"><a name="l13218"></a><span class="lineno">13218</span>  g8_(g8) {}</div><div class="line"><a name="l13219"></a><span class="lineno">13219</span>  <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l13220"></a><span class="lineno">13220</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8></div><div class="line"><a name="l13221"></a><span class="lineno">13221</span>  <span class="keyword">operator</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator</a>< ::std::tuple<T1, T2, T3, T4, T5, T6, T7,</div><div class="line"><a name="l13222"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_holder8.html#a19baa0d0ec826f2e10ffaafffcfdee3f">13222</a></span>  T8> >() <span class="keyword">const</span> {</div><div class="line"><a name="l13223"></a><span class="lineno">13223</span>  <span class="keywordflow">return</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator< ::std::tuple<T1, T2, T3, T4, T5, T6, T7, T8></a> >(</div><div class="line"><a name="l13224"></a><span class="lineno">13224</span>  <span class="keyword">new</span> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator8.html">CartesianProductGenerator8<T1, T2, T3, T4, T5, T6, T7, T8></a>(</div><div class="line"><a name="l13225"></a><span class="lineno">13225</span>  <span class="keyword">static_cast<</span><a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T1></a> <span class="keyword">></span>(g1_),</div><div class="line"><a name="l13226"></a><span class="lineno">13226</span>  <span class="keyword">static_cast<</span><a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T2></a> <span class="keyword">></span>(g2_),</div><div class="line"><a name="l13227"></a><span class="lineno">13227</span>  <span class="keyword">static_cast<</span><a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T3></a> <span class="keyword">></span>(g3_),</div><div class="line"><a name="l13228"></a><span class="lineno">13228</span>  <span class="keyword">static_cast<</span><a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T4></a> <span class="keyword">></span>(g4_),</div><div class="line"><a name="l13229"></a><span class="lineno">13229</span>  <span class="keyword">static_cast<</span><a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T5></a> <span class="keyword">></span>(g5_),</div><div class="line"><a name="l13230"></a><span class="lineno">13230</span>  <span class="keyword">static_cast<</span><a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T6></a> <span class="keyword">></span>(g6_),</div><div class="line"><a name="l13231"></a><span class="lineno">13231</span>  <span class="keyword">static_cast<</span><a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T7></a> <span class="keyword">></span>(g7_),</div><div class="line"><a name="l13232"></a><span class="lineno">13232</span>  <span class="keyword">static_cast<</span><a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T8></a> <span class="keyword">></span>(g8_)));</div><div class="line"><a name="l13233"></a><span class="lineno">13233</span>  }</div><div class="line"><a name="l13234"></a><span class="lineno">13234</span> </div><div class="line"><a name="l13235"></a><span class="lineno">13235</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l13236"></a><span class="lineno">13236</span>  <span class="comment">// No implementation - assignment is unsupported.</span></div><div class="line"><a name="l13237"></a><span class="lineno">13237</span>  <span class="keywordtype">void</span> operator=(<span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_holder8.html">CartesianProductHolder8</a>& other);</div><div class="line"><a name="l13238"></a><span class="lineno">13238</span> </div><div class="line"><a name="l13239"></a><span class="lineno">13239</span>  <span class="keyword">const</span> Generator1 g1_;</div><div class="line"><a name="l13240"></a><span class="lineno">13240</span>  <span class="keyword">const</span> Generator2 g2_;</div><div class="line"><a name="l13241"></a><span class="lineno">13241</span>  <span class="keyword">const</span> Generator3 g3_;</div><div class="line"><a name="l13242"></a><span class="lineno">13242</span>  <span class="keyword">const</span> Generator4 g4_;</div><div class="line"><a name="l13243"></a><span class="lineno">13243</span>  <span class="keyword">const</span> Generator5 g5_;</div><div class="line"><a name="l13244"></a><span class="lineno">13244</span>  <span class="keyword">const</span> Generator6 g6_;</div><div class="line"><a name="l13245"></a><span class="lineno">13245</span>  <span class="keyword">const</span> Generator7 g7_;</div><div class="line"><a name="l13246"></a><span class="lineno">13246</span>  <span class="keyword">const</span> Generator8 g8_;</div><div class="line"><a name="l13247"></a><span class="lineno">13247</span> }; <span class="comment">// class CartesianProductHolder8</span></div><div class="line"><a name="l13248"></a><span class="lineno">13248</span> </div><div class="line"><a name="l13249"></a><span class="lineno">13249</span> <span class="keyword">template</span> <<span class="keyword">class </span>Generator1, <span class="keyword">class </span>Generator2, <span class="keyword">class </span>Generator3,</div><div class="line"><a name="l13250"></a><span class="lineno">13250</span>  <span class="keyword">class </span>Generator4, <span class="keyword">class </span>Generator5, <span class="keyword">class </span>Generator6, <span class="keyword">class </span>Generator7,</div><div class="line"><a name="l13251"></a><span class="lineno">13251</span>  <span class="keyword">class </span>Generator8, <span class="keyword">class </span>Generator9></div><div class="line"><a name="l13252"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_holder9.html">13252</a></span> <span class="keyword">class </span><a class="code" href="classtesting_1_1internal_1_1_cartesian_product_holder9.html">CartesianProductHolder9</a> {</div><div class="line"><a name="l13253"></a><span class="lineno">13253</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l13254"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_holder9.html#a692a537863ab6adfc4001564887a3bc7">13254</a></span> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_holder9.html#a692a537863ab6adfc4001564887a3bc7">CartesianProductHolder9</a>(<span class="keyword">const</span> Generator1& g1, <span class="keyword">const</span> Generator2& g2,</div><div class="line"><a name="l13255"></a><span class="lineno">13255</span>  <span class="keyword">const</span> Generator3& g3, <span class="keyword">const</span> Generator4& g4, <span class="keyword">const</span> Generator5& g5,</div><div class="line"><a name="l13256"></a><span class="lineno">13256</span>  <span class="keyword">const</span> Generator6& g6, <span class="keyword">const</span> Generator7& g7, <span class="keyword">const</span> Generator8& g8,</div><div class="line"><a name="l13257"></a><span class="lineno">13257</span>  <span class="keyword">const</span> Generator9& g9)</div><div class="line"><a name="l13258"></a><span class="lineno">13258</span>  : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),</div><div class="line"><a name="l13259"></a><span class="lineno">13259</span>  g9_(g9) {}</div><div class="line"><a name="l13260"></a><span class="lineno">13260</span>  <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l13261"></a><span class="lineno">13261</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9></div><div class="line"><a name="l13262"></a><span class="lineno">13262</span>  <span class="keyword">operator</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator</a>< ::std::tuple<T1, T2, T3, T4, T5, T6, T7, T8,</div><div class="line"><a name="l13263"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_holder9.html#aafc7ce193dd88fc179d5a0c58eede7da">13263</a></span>  T9> >() <span class="keyword">const</span> {</div><div class="line"><a name="l13264"></a><span class="lineno">13264</span>  <span class="keywordflow">return</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator< ::std::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9></a> >(</div><div class="line"><a name="l13265"></a><span class="lineno">13265</span>  <span class="keyword">new</span> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator9.html">CartesianProductGenerator9<T1, T2, T3, T4, T5, T6, T7, T8, T9></a>(</div><div class="line"><a name="l13266"></a><span class="lineno">13266</span>  <span class="keyword">static_cast<</span><a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T1></a> <span class="keyword">></span>(g1_),</div><div class="line"><a name="l13267"></a><span class="lineno">13267</span>  <span class="keyword">static_cast<</span><a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T2></a> <span class="keyword">></span>(g2_),</div><div class="line"><a name="l13268"></a><span class="lineno">13268</span>  <span class="keyword">static_cast<</span><a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T3></a> <span class="keyword">></span>(g3_),</div><div class="line"><a name="l13269"></a><span class="lineno">13269</span>  <span class="keyword">static_cast<</span><a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T4></a> <span class="keyword">></span>(g4_),</div><div class="line"><a name="l13270"></a><span class="lineno">13270</span>  <span class="keyword">static_cast<</span><a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T5></a> <span class="keyword">></span>(g5_),</div><div class="line"><a name="l13271"></a><span class="lineno">13271</span>  <span class="keyword">static_cast<</span><a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T6></a> <span class="keyword">></span>(g6_),</div><div class="line"><a name="l13272"></a><span class="lineno">13272</span>  <span class="keyword">static_cast<</span><a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T7></a> <span class="keyword">></span>(g7_),</div><div class="line"><a name="l13273"></a><span class="lineno">13273</span>  <span class="keyword">static_cast<</span><a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T8></a> <span class="keyword">></span>(g8_),</div><div class="line"><a name="l13274"></a><span class="lineno">13274</span>  <span class="keyword">static_cast<</span><a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T9></a> <span class="keyword">></span>(g9_)));</div><div class="line"><a name="l13275"></a><span class="lineno">13275</span>  }</div><div class="line"><a name="l13276"></a><span class="lineno">13276</span> </div><div class="line"><a name="l13277"></a><span class="lineno">13277</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l13278"></a><span class="lineno">13278</span>  <span class="comment">// No implementation - assignment is unsupported.</span></div><div class="line"><a name="l13279"></a><span class="lineno">13279</span>  <span class="keywordtype">void</span> operator=(<span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_holder9.html">CartesianProductHolder9</a>& other);</div><div class="line"><a name="l13280"></a><span class="lineno">13280</span> </div><div class="line"><a name="l13281"></a><span class="lineno">13281</span>  <span class="keyword">const</span> Generator1 g1_;</div><div class="line"><a name="l13282"></a><span class="lineno">13282</span>  <span class="keyword">const</span> Generator2 g2_;</div><div class="line"><a name="l13283"></a><span class="lineno">13283</span>  <span class="keyword">const</span> Generator3 g3_;</div><div class="line"><a name="l13284"></a><span class="lineno">13284</span>  <span class="keyword">const</span> Generator4 g4_;</div><div class="line"><a name="l13285"></a><span class="lineno">13285</span>  <span class="keyword">const</span> Generator5 g5_;</div><div class="line"><a name="l13286"></a><span class="lineno">13286</span>  <span class="keyword">const</span> Generator6 g6_;</div><div class="line"><a name="l13287"></a><span class="lineno">13287</span>  <span class="keyword">const</span> Generator7 g7_;</div><div class="line"><a name="l13288"></a><span class="lineno">13288</span>  <span class="keyword">const</span> Generator8 g8_;</div><div class="line"><a name="l13289"></a><span class="lineno">13289</span>  <span class="keyword">const</span> Generator9 g9_;</div><div class="line"><a name="l13290"></a><span class="lineno">13290</span> }; <span class="comment">// class CartesianProductHolder9</span></div><div class="line"><a name="l13291"></a><span class="lineno">13291</span> </div><div class="line"><a name="l13292"></a><span class="lineno">13292</span> <span class="keyword">template</span> <<span class="keyword">class </span>Generator1, <span class="keyword">class </span>Generator2, <span class="keyword">class </span>Generator3,</div><div class="line"><a name="l13293"></a><span class="lineno">13293</span>  <span class="keyword">class </span>Generator4, <span class="keyword">class </span>Generator5, <span class="keyword">class </span>Generator6, <span class="keyword">class </span>Generator7,</div><div class="line"><a name="l13294"></a><span class="lineno">13294</span>  <span class="keyword">class </span>Generator8, <span class="keyword">class </span>Generator9, <span class="keyword">class </span>Generator10></div><div class="line"><a name="l13295"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_holder10.html">13295</a></span> <span class="keyword">class </span><a class="code" href="classtesting_1_1internal_1_1_cartesian_product_holder10.html">CartesianProductHolder10</a> {</div><div class="line"><a name="l13296"></a><span class="lineno">13296</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l13297"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_holder10.html#a3255f824dd20e02b8bb718bb7d3d3634">13297</a></span> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_holder10.html#a3255f824dd20e02b8bb718bb7d3d3634">CartesianProductHolder10</a>(<span class="keyword">const</span> Generator1& g1, <span class="keyword">const</span> Generator2& g2,</div><div class="line"><a name="l13298"></a><span class="lineno">13298</span>  <span class="keyword">const</span> Generator3& g3, <span class="keyword">const</span> Generator4& g4, <span class="keyword">const</span> Generator5& g5,</div><div class="line"><a name="l13299"></a><span class="lineno">13299</span>  <span class="keyword">const</span> Generator6& g6, <span class="keyword">const</span> Generator7& g7, <span class="keyword">const</span> Generator8& g8,</div><div class="line"><a name="l13300"></a><span class="lineno">13300</span>  <span class="keyword">const</span> Generator9& g9, <span class="keyword">const</span> Generator10& g10)</div><div class="line"><a name="l13301"></a><span class="lineno">13301</span>  : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),</div><div class="line"><a name="l13302"></a><span class="lineno">13302</span>  g9_(g9), g10_(g10) {}</div><div class="line"><a name="l13303"></a><span class="lineno">13303</span>  <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2, <span class="keyword">typename</span> T3, <span class="keyword">typename</span> T4, <span class="keyword">typename</span> T5,</div><div class="line"><a name="l13304"></a><span class="lineno">13304</span>  <span class="keyword">typename</span> T6, <span class="keyword">typename</span> T7, <span class="keyword">typename</span> T8, <span class="keyword">typename</span> T9, <span class="keyword">typename</span> T10></div><div class="line"><a name="l13305"></a><span class="lineno">13305</span>  <span class="keyword">operator</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator</a>< ::std::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9,</div><div class="line"><a name="l13306"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_cartesian_product_holder10.html#a1c9f9e026696dd2618bb7e9e19daf239">13306</a></span>  T10> >() <span class="keyword">const</span> {</div><div class="line"><a name="l13307"></a><span class="lineno">13307</span>  <span class="keywordflow">return</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator</a>< ::std::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9,</div><div class="line"><a name="l13308"></a><span class="lineno">13308</span>  T10> >(</div><div class="line"><a name="l13309"></a><span class="lineno">13309</span>  <span class="keyword">new</span> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_generator10.html">CartesianProductGenerator10</a><T1, T2, T3, T4, T5, T6, T7, T8, T9,</div><div class="line"><a name="l13310"></a><span class="lineno">13310</span>  T10>(</div><div class="line"><a name="l13311"></a><span class="lineno">13311</span>  <span class="keyword">static_cast<</span><a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T1></a> <span class="keyword">></span>(g1_),</div><div class="line"><a name="l13312"></a><span class="lineno">13312</span>  <span class="keyword">static_cast<</span><a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T2></a> <span class="keyword">></span>(g2_),</div><div class="line"><a name="l13313"></a><span class="lineno">13313</span>  <span class="keyword">static_cast<</span><a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T3></a> <span class="keyword">></span>(g3_),</div><div class="line"><a name="l13314"></a><span class="lineno">13314</span>  <span class="keyword">static_cast<</span><a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T4></a> <span class="keyword">></span>(g4_),</div><div class="line"><a name="l13315"></a><span class="lineno">13315</span>  <span class="keyword">static_cast<</span><a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T5></a> <span class="keyword">></span>(g5_),</div><div class="line"><a name="l13316"></a><span class="lineno">13316</span>  <span class="keyword">static_cast<</span><a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T6></a> <span class="keyword">></span>(g6_),</div><div class="line"><a name="l13317"></a><span class="lineno">13317</span>  <span class="keyword">static_cast<</span><a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T7></a> <span class="keyword">></span>(g7_),</div><div class="line"><a name="l13318"></a><span class="lineno">13318</span>  <span class="keyword">static_cast<</span><a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T8></a> <span class="keyword">></span>(g8_),</div><div class="line"><a name="l13319"></a><span class="lineno">13319</span>  <span class="keyword">static_cast<</span><a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T9></a> <span class="keyword">></span>(g9_),</div><div class="line"><a name="l13320"></a><span class="lineno">13320</span>  <span class="keyword">static_cast<</span><a class="code" href="classtesting_1_1internal_1_1_param_generator.html">ParamGenerator<T10></a> <span class="keyword">></span>(g10_)));</div><div class="line"><a name="l13321"></a><span class="lineno">13321</span>  }</div><div class="line"><a name="l13322"></a><span class="lineno">13322</span> </div><div class="line"><a name="l13323"></a><span class="lineno">13323</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l13324"></a><span class="lineno">13324</span>  <span class="comment">// No implementation - assignment is unsupported.</span></div><div class="line"><a name="l13325"></a><span class="lineno">13325</span>  <span class="keywordtype">void</span> operator=(<span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_holder10.html">CartesianProductHolder10</a>& other);</div><div class="line"><a name="l13326"></a><span class="lineno">13326</span> </div><div class="line"><a name="l13327"></a><span class="lineno">13327</span>  <span class="keyword">const</span> Generator1 g1_;</div><div class="line"><a name="l13328"></a><span class="lineno">13328</span>  <span class="keyword">const</span> Generator2 g2_;</div><div class="line"><a name="l13329"></a><span class="lineno">13329</span>  <span class="keyword">const</span> Generator3 g3_;</div><div class="line"><a name="l13330"></a><span class="lineno">13330</span>  <span class="keyword">const</span> Generator4 g4_;</div><div class="line"><a name="l13331"></a><span class="lineno">13331</span>  <span class="keyword">const</span> Generator5 g5_;</div><div class="line"><a name="l13332"></a><span class="lineno">13332</span>  <span class="keyword">const</span> Generator6 g6_;</div><div class="line"><a name="l13333"></a><span class="lineno">13333</span>  <span class="keyword">const</span> Generator7 g7_;</div><div class="line"><a name="l13334"></a><span class="lineno">13334</span>  <span class="keyword">const</span> Generator8 g8_;</div><div class="line"><a name="l13335"></a><span class="lineno">13335</span>  <span class="keyword">const</span> Generator9 g9_;</div><div class="line"><a name="l13336"></a><span class="lineno">13336</span>  <span class="keyword">const</span> Generator10 g10_;</div><div class="line"><a name="l13337"></a><span class="lineno">13337</span> }; <span class="comment">// class CartesianProductHolder10</span></div><div class="line"><a name="l13338"></a><span class="lineno">13338</span> </div><div class="line"><a name="l13339"></a><span class="lineno">13339</span> } <span class="comment">// namespace internal</span></div><div class="line"><a name="l13340"></a><span class="lineno">13340</span> } <span class="comment">// namespace testing</span></div><div class="line"><a name="l13341"></a><span class="lineno">13341</span> </div><div class="line"><a name="l13342"></a><span class="lineno">13342</span> <span class="preprocessor">#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_</span></div><div class="line"><a name="l13343"></a><span class="lineno">13343</span> </div><div class="line"><a name="l13344"></a><span class="lineno">13344</span> <span class="keyword">namespace </span><a class="code" href="namespacetesting.html">testing</a> {</div><div class="line"><a name="l13345"></a><span class="lineno">13345</span> </div><div class="line"><a name="l13346"></a><span class="lineno">13346</span> <span class="comment">// Functions producing parameter generators.</span></div><div class="line"><a name="l13347"></a><span class="lineno">13347</span> <span class="comment">//</span></div><div class="line"><a name="l13348"></a><span class="lineno">13348</span> <span class="comment">// Google Test uses these generators to produce parameters for value-</span></div><div class="line"><a name="l13349"></a><span class="lineno">13349</span> <span class="comment">// parameterized tests. When a parameterized test suite is instantiated</span></div><div class="line"><a name="l13350"></a><span class="lineno">13350</span> <span class="comment">// with a particular generator, Google Test creates and runs tests</span></div><div class="line"><a name="l13351"></a><span class="lineno">13351</span> <span class="comment">// for each element in the sequence produced by the generator.</span></div><div class="line"><a name="l13352"></a><span class="lineno">13352</span> <span class="comment">//</span></div><div class="line"><a name="l13353"></a><span class="lineno">13353</span> <span class="comment">// In the following sample, tests from test suite FooTest are instantiated</span></div><div class="line"><a name="l13354"></a><span class="lineno">13354</span> <span class="comment">// each three times with parameter values 3, 5, and 8:</span></div><div class="line"><a name="l13355"></a><span class="lineno">13355</span> <span class="comment">//</span></div><div class="line"><a name="l13356"></a><span class="lineno">13356</span> <span class="comment">// class FooTest : public TestWithParam<int> { ... };</span></div><div class="line"><a name="l13357"></a><span class="lineno">13357</span> <span class="comment">//</span></div><div class="line"><a name="l13358"></a><span class="lineno">13358</span> <span class="comment">// TEST_P(FooTest, TestThis) {</span></div><div class="line"><a name="l13359"></a><span class="lineno">13359</span> <span class="comment">// }</span></div><div class="line"><a name="l13360"></a><span class="lineno">13360</span> <span class="comment">// TEST_P(FooTest, TestThat) {</span></div><div class="line"><a name="l13361"></a><span class="lineno">13361</span> <span class="comment">// }</span></div><div class="line"><a name="l13362"></a><span class="lineno">13362</span> <span class="comment">// INSTANTIATE_TEST_SUITE_P(TestSequence, FooTest, Values(3, 5, 8));</span></div><div class="line"><a name="l13363"></a><span class="lineno">13363</span> <span class="comment">//</span></div><div class="line"><a name="l13364"></a><span class="lineno">13364</span> </div><div class="line"><a name="l13365"></a><span class="lineno">13365</span> <span class="comment">// Range() returns generators providing sequences of values in a range.</span></div><div class="line"><a name="l13366"></a><span class="lineno">13366</span> <span class="comment">//</span></div><div class="line"><a name="l13367"></a><span class="lineno">13367</span> <span class="comment">// Synopsis:</span></div><div class="line"><a name="l13368"></a><span class="lineno">13368</span> <span class="comment">// Range(start, end)</span></div><div class="line"><a name="l13369"></a><span class="lineno">13369</span> <span class="comment">// - returns a generator producing a sequence of values {start, start+1,</span></div><div class="line"><a name="l13370"></a><span class="lineno">13370</span> <span class="comment">// start+2, ..., }.</span></div><div class="line"><a name="l13371"></a><span class="lineno">13371</span> <span class="comment">// Range(start, end, step)</span></div><div class="line"><a name="l13372"></a><span class="lineno">13372</span> <span class="comment">// - returns a generator producing a sequence of values {start, start+step,</span></div><div class="line"><a name="l13373"></a><span class="lineno">13373</span> <span class="comment">// start+step+step, ..., }.</span></div><div class="line"><a name="l13374"></a><span class="lineno">13374</span> <span class="comment">// Notes:</span></div><div class="line"><a name="l13375"></a><span class="lineno">13375</span> <span class="comment">// * The generated sequences never include end. For example, Range(1, 5)</span></div><div class="line"><a name="l13376"></a><span class="lineno">13376</span> <span class="comment">// returns a generator producing a sequence {1, 2, 3, 4}. Range(1, 9, 2)</span></div><div class="line"><a name="l13377"></a><span class="lineno">13377</span> <span class="comment">// returns a generator producing {1, 3, 5, 7}.</span></div><div class="line"><a name="l13378"></a><span class="lineno">13378</span> <span class="comment">// * start and end must have the same type. That type may be any integral or</span></div><div class="line"><a name="l13379"></a><span class="lineno">13379</span> <span class="comment">// floating-point type or a user defined type satisfying these conditions:</span></div><div class="line"><a name="l13380"></a><span class="lineno">13380</span> <span class="comment">// * It must be assignable (have operator=() defined).</span></div><div class="line"><a name="l13381"></a><span class="lineno">13381</span> <span class="comment">// * It must have operator+() (operator+(int-compatible type) for</span></div><div class="line"><a name="l13382"></a><span class="lineno">13382</span> <span class="comment">// two-operand version).</span></div><div class="line"><a name="l13383"></a><span class="lineno">13383</span> <span class="comment">// * It must have operator<() defined.</span></div><div class="line"><a name="l13384"></a><span class="lineno">13384</span> <span class="comment">// Elements in the resulting sequences will also have that type.</span></div><div class="line"><a name="l13385"></a><span class="lineno">13385</span> <span class="comment">// * Condition start < end must be satisfied in order for resulting sequences</span></div><div class="line"><a name="l13386"></a><span class="lineno">13386</span> <span class="comment">// to contain any elements.</span></div><div class="line"><a name="l13387"></a><span class="lineno">13387</span> <span class="comment">//</span></div><div class="line"><a name="l13388"></a><span class="lineno">13388</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T, <span class="keyword">typename</span> IncrementT></div><div class="line"><a name="l13389"></a><span class="lineno"><a class="line" href="namespacetesting.html#a265ed70a86cf2d6641582c45ad9529e2">13389</a></span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">internal::ParamGenerator<T></a> <a class="code" href="namespacetesting.html#a265ed70a86cf2d6641582c45ad9529e2">Range</a>(T start, T end, IncrementT step) {</div><div class="line"><a name="l13390"></a><span class="lineno">13390</span>  <span class="keywordflow">return</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">internal::ParamGenerator<T></a>(</div><div class="line"><a name="l13391"></a><span class="lineno">13391</span>  <span class="keyword">new</span> <a class="code" href="classtesting_1_1internal_1_1_range_generator.html">internal::RangeGenerator<T, IncrementT></a>(start, end, step));</div><div class="line"><a name="l13392"></a><span class="lineno">13392</span> }</div><div class="line"><a name="l13393"></a><span class="lineno">13393</span> </div><div class="line"><a name="l13394"></a><span class="lineno">13394</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l13395"></a><span class="lineno"><a class="line" href="namespacetesting.html#a56a45f85a1238dfc92e6fca03eb3a2e4">13395</a></span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">internal::ParamGenerator<T></a> <a class="code" href="namespacetesting.html#a265ed70a86cf2d6641582c45ad9529e2">Range</a>(T start, T end) {</div><div class="line"><a name="l13396"></a><span class="lineno">13396</span>  <span class="keywordflow">return</span> <a class="code" href="namespacetesting.html#a265ed70a86cf2d6641582c45ad9529e2">Range</a>(start, end, 1);</div><div class="line"><a name="l13397"></a><span class="lineno">13397</span> }</div><div class="line"><a name="l13398"></a><span class="lineno">13398</span> </div><div class="line"><a name="l13399"></a><span class="lineno">13399</span> <span class="comment">// ValuesIn() function allows generation of tests with parameters coming from</span></div><div class="line"><a name="l13400"></a><span class="lineno">13400</span> <span class="comment">// a container.</span></div><div class="line"><a name="l13401"></a><span class="lineno">13401</span> <span class="comment">//</span></div><div class="line"><a name="l13402"></a><span class="lineno">13402</span> <span class="comment">// Synopsis:</span></div><div class="line"><a name="l13403"></a><span class="lineno">13403</span> <span class="comment">// ValuesIn(const T (&array)[N])</span></div><div class="line"><a name="l13404"></a><span class="lineno">13404</span> <span class="comment">// - returns a generator producing sequences with elements from</span></div><div class="line"><a name="l13405"></a><span class="lineno">13405</span> <span class="comment">// a C-style array.</span></div><div class="line"><a name="l13406"></a><span class="lineno">13406</span> <span class="comment">// ValuesIn(const Container& container)</span></div><div class="line"><a name="l13407"></a><span class="lineno">13407</span> <span class="comment">// - returns a generator producing sequences with elements from</span></div><div class="line"><a name="l13408"></a><span class="lineno">13408</span> <span class="comment">// an STL-style container.</span></div><div class="line"><a name="l13409"></a><span class="lineno">13409</span> <span class="comment">// ValuesIn(Iterator begin, Iterator end)</span></div><div class="line"><a name="l13410"></a><span class="lineno">13410</span> <span class="comment">// - returns a generator producing sequences with elements from</span></div><div class="line"><a name="l13411"></a><span class="lineno">13411</span> <span class="comment">// a range [begin, end) defined by a pair of STL-style iterators. These</span></div><div class="line"><a name="l13412"></a><span class="lineno">13412</span> <span class="comment">// iterators can also be plain C pointers.</span></div><div class="line"><a name="l13413"></a><span class="lineno">13413</span> <span class="comment">//</span></div><div class="line"><a name="l13414"></a><span class="lineno">13414</span> <span class="comment">// Please note that ValuesIn copies the values from the containers</span></div><div class="line"><a name="l13415"></a><span class="lineno">13415</span> <span class="comment">// passed in and keeps them to generate tests in RUN_ALL_TESTS().</span></div><div class="line"><a name="l13416"></a><span class="lineno">13416</span> <span class="comment">//</span></div><div class="line"><a name="l13417"></a><span class="lineno">13417</span> <span class="comment">// Examples:</span></div><div class="line"><a name="l13418"></a><span class="lineno">13418</span> <span class="comment">//</span></div><div class="line"><a name="l13419"></a><span class="lineno">13419</span> <span class="comment">// This instantiates tests from test suite StringTest</span></div><div class="line"><a name="l13420"></a><span class="lineno">13420</span> <span class="comment">// each with C-string values of "foo", "bar", and "baz":</span></div><div class="line"><a name="l13421"></a><span class="lineno">13421</span> <span class="comment">//</span></div><div class="line"><a name="l13422"></a><span class="lineno">13422</span> <span class="comment">// const char* strings[] = {"foo", "bar", "baz"};</span></div><div class="line"><a name="l13423"></a><span class="lineno">13423</span> <span class="comment">// INSTANTIATE_TEST_SUITE_P(StringSequence, StringTest, ValuesIn(strings));</span></div><div class="line"><a name="l13424"></a><span class="lineno">13424</span> <span class="comment">//</span></div><div class="line"><a name="l13425"></a><span class="lineno">13425</span> <span class="comment">// This instantiates tests from test suite StlStringTest</span></div><div class="line"><a name="l13426"></a><span class="lineno">13426</span> <span class="comment">// each with STL strings with values "a" and "b":</span></div><div class="line"><a name="l13427"></a><span class="lineno">13427</span> <span class="comment">//</span></div><div class="line"><a name="l13428"></a><span class="lineno">13428</span> <span class="comment">// ::std::vector< ::std::string> GetParameterStrings() {</span></div><div class="line"><a name="l13429"></a><span class="lineno">13429</span> <span class="comment">// ::std::vector< ::std::string> v;</span></div><div class="line"><a name="l13430"></a><span class="lineno">13430</span> <span class="comment">// v.push_back("a");</span></div><div class="line"><a name="l13431"></a><span class="lineno">13431</span> <span class="comment">// v.push_back("b");</span></div><div class="line"><a name="l13432"></a><span class="lineno">13432</span> <span class="comment">// return v;</span></div><div class="line"><a name="l13433"></a><span class="lineno">13433</span> <span class="comment">// }</span></div><div class="line"><a name="l13434"></a><span class="lineno">13434</span> <span class="comment">//</span></div><div class="line"><a name="l13435"></a><span class="lineno">13435</span> <span class="comment">// INSTANTIATE_TEST_SUITE_P(CharSequence,</span></div><div class="line"><a name="l13436"></a><span class="lineno">13436</span> <span class="comment">// StlStringTest,</span></div><div class="line"><a name="l13437"></a><span class="lineno">13437</span> <span class="comment">// ValuesIn(GetParameterStrings()));</span></div><div class="line"><a name="l13438"></a><span class="lineno">13438</span> <span class="comment">//</span></div><div class="line"><a name="l13439"></a><span class="lineno">13439</span> <span class="comment">//</span></div><div class="line"><a name="l13440"></a><span class="lineno">13440</span> <span class="comment">// This will also instantiate tests from CharTest</span></div><div class="line"><a name="l13441"></a><span class="lineno">13441</span> <span class="comment">// each with parameter values 'a' and 'b':</span></div><div class="line"><a name="l13442"></a><span class="lineno">13442</span> <span class="comment">//</span></div><div class="line"><a name="l13443"></a><span class="lineno">13443</span> <span class="comment">// ::std::list<char> GetParameterChars() {</span></div><div class="line"><a name="l13444"></a><span class="lineno">13444</span> <span class="comment">// ::std::list<char> list;</span></div><div class="line"><a name="l13445"></a><span class="lineno">13445</span> <span class="comment">// list.push_back('a');</span></div><div class="line"><a name="l13446"></a><span class="lineno">13446</span> <span class="comment">// list.push_back('b');</span></div><div class="line"><a name="l13447"></a><span class="lineno">13447</span> <span class="comment">// return list;</span></div><div class="line"><a name="l13448"></a><span class="lineno">13448</span> <span class="comment">// }</span></div><div class="line"><a name="l13449"></a><span class="lineno">13449</span> <span class="comment">// ::std::list<char> l = GetParameterChars();</span></div><div class="line"><a name="l13450"></a><span class="lineno">13450</span> <span class="comment">// INSTANTIATE_TEST_SUITE_P(CharSequence2,</span></div><div class="line"><a name="l13451"></a><span class="lineno">13451</span> <span class="comment">// CharTest,</span></div><div class="line"><a name="l13452"></a><span class="lineno">13452</span> <span class="comment">// ValuesIn(l.begin(), l.end()));</span></div><div class="line"><a name="l13453"></a><span class="lineno">13453</span> <span class="comment">//</span></div><div class="line"><a name="l13454"></a><span class="lineno">13454</span> <span class="keyword">template</span> <<span class="keyword">typename</span> ForwardIterator></div><div class="line"><a name="l13455"></a><span class="lineno">13455</span> internal::ParamGenerator<</div><div class="line"><a name="l13456"></a><span class="lineno">13456</span>  typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type></div><div class="line"><a name="l13457"></a><span class="lineno"><a class="line" href="namespacetesting.html#a96240380ae4d3b4855d07de3b84fb336">13457</a></span> <a class="code" href="namespacetesting.html#aa67d0c8470c5f69fcfcacc9e775fa982">ValuesIn</a>(ForwardIterator begin, ForwardIterator end) {</div><div class="line"><a name="l13458"></a><span class="lineno">13458</span>  <span class="keyword">typedef</span> typename ::testing::internal::IteratorTraits<ForwardIterator></div><div class="line"><a name="l13459"></a><span class="lineno">13459</span>  ::value_type ParamType;</div><div class="line"><a name="l13460"></a><span class="lineno">13460</span>  <span class="keywordflow">return</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">internal::ParamGenerator<ParamType></a>(</div><div class="line"><a name="l13461"></a><span class="lineno">13461</span>  <span class="keyword">new</span> <a class="code" href="classtesting_1_1internal_1_1_values_in_iterator_range_generator.html">internal::ValuesInIteratorRangeGenerator<ParamType></a>(begin, end));</div><div class="line"><a name="l13462"></a><span class="lineno">13462</span> }</div><div class="line"><a name="l13463"></a><span class="lineno">13463</span> </div><div class="line"><a name="l13464"></a><span class="lineno">13464</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T, <span class="keywordtype">size_t</span> N></div><div class="line"><a name="l13465"></a><span class="lineno"><a class="line" href="namespacetesting.html#a0b9ea6594ac06ad5d9eba2511ffa0fb7">13465</a></span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">internal::ParamGenerator<T></a> <a class="code" href="namespacetesting.html#aa67d0c8470c5f69fcfcacc9e775fa982">ValuesIn</a>(<span class="keyword">const</span> T (&array)[N]) {</div><div class="line"><a name="l13466"></a><span class="lineno">13466</span>  <span class="keywordflow">return</span> <a class="code" href="namespacetesting.html#aa67d0c8470c5f69fcfcacc9e775fa982">ValuesIn</a>(array, array + N);</div><div class="line"><a name="l13467"></a><span class="lineno">13467</span> }</div><div class="line"><a name="l13468"></a><span class="lineno">13468</span> </div><div class="line"><a name="l13469"></a><span class="lineno">13469</span> <span class="keyword">template</span> <<span class="keyword">class</span> Container></div><div class="line"><a name="l13470"></a><span class="lineno"><a class="line" href="namespacetesting.html#aa67d0c8470c5f69fcfcacc9e775fa982">13470</a></span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">internal::ParamGenerator<typename Container::value_type></a> <a class="code" href="namespacetesting.html#aa67d0c8470c5f69fcfcacc9e775fa982">ValuesIn</a>(</div><div class="line"><a name="l13471"></a><span class="lineno">13471</span>  <span class="keyword">const</span> Container& container) {</div><div class="line"><a name="l13472"></a><span class="lineno">13472</span>  <span class="keywordflow">return</span> <a class="code" href="namespacetesting.html#aa67d0c8470c5f69fcfcacc9e775fa982">ValuesIn</a>(container.begin(), container.end());</div><div class="line"><a name="l13473"></a><span class="lineno">13473</span> }</div><div class="line"><a name="l13474"></a><span class="lineno">13474</span> </div><div class="line"><a name="l13475"></a><span class="lineno">13475</span> <span class="comment">// Values() allows generating tests from explicitly specified list of</span></div><div class="line"><a name="l13476"></a><span class="lineno">13476</span> <span class="comment">// parameters.</span></div><div class="line"><a name="l13477"></a><span class="lineno">13477</span> <span class="comment">//</span></div><div class="line"><a name="l13478"></a><span class="lineno">13478</span> <span class="comment">// Synopsis:</span></div><div class="line"><a name="l13479"></a><span class="lineno">13479</span> <span class="comment">// Values(T v1, T v2, ..., T vN)</span></div><div class="line"><a name="l13480"></a><span class="lineno">13480</span> <span class="comment">// - returns a generator producing sequences with elements v1, v2, ..., vN.</span></div><div class="line"><a name="l13481"></a><span class="lineno">13481</span> <span class="comment">//</span></div><div class="line"><a name="l13482"></a><span class="lineno">13482</span> <span class="comment">// For example, this instantiates tests from test suite BarTest each</span></div><div class="line"><a name="l13483"></a><span class="lineno">13483</span> <span class="comment">// with values "one", "two", and "three":</span></div><div class="line"><a name="l13484"></a><span class="lineno">13484</span> <span class="comment">//</span></div><div class="line"><a name="l13485"></a><span class="lineno">13485</span> <span class="comment">// INSTANTIATE_TEST_SUITE_P(NumSequence,</span></div><div class="line"><a name="l13486"></a><span class="lineno">13486</span> <span class="comment">// BarTest,</span></div><div class="line"><a name="l13487"></a><span class="lineno">13487</span> <span class="comment">// Values("one", "two", "three"));</span></div><div class="line"><a name="l13488"></a><span class="lineno">13488</span> <span class="comment">//</span></div><div class="line"><a name="l13489"></a><span class="lineno">13489</span> <span class="comment">// This instantiates tests from test suite BazTest each with values 1, 2, 3.5.</span></div><div class="line"><a name="l13490"></a><span class="lineno">13490</span> <span class="comment">// The exact type of values will depend on the type of parameter in BazTest.</span></div><div class="line"><a name="l13491"></a><span class="lineno">13491</span> <span class="comment">//</span></div><div class="line"><a name="l13492"></a><span class="lineno">13492</span> <span class="comment">// INSTANTIATE_TEST_SUITE_P(FloatingNumbers, BazTest, Values(1, 2, 3.5));</span></div><div class="line"><a name="l13493"></a><span class="lineno">13493</span> <span class="comment">//</span></div><div class="line"><a name="l13494"></a><span class="lineno">13494</span> <span class="comment">//</span></div><div class="line"><a name="l13495"></a><span class="lineno">13495</span> <span class="keyword">template</span> <<span class="keyword">typename</span>... T></div><div class="line"><a name="l13496"></a><span class="lineno"><a class="line" href="namespacetesting.html#a374d4e5fbb4c938058fbe81d4c7ff6a6">13496</a></span> <a class="code" href="classtesting_1_1internal_1_1_value_array.html">internal::ValueArray</a><T...> <a class="code" href="namespacetesting.html#a374d4e5fbb4c938058fbe81d4c7ff6a6">Values</a>(T... v) {</div><div class="line"><a name="l13497"></a><span class="lineno">13497</span>  <span class="keywordflow">return</span> <a class="code" href="classtesting_1_1internal_1_1_value_array.html">internal::ValueArray</a><T...>(std::move(v)...);</div><div class="line"><a name="l13498"></a><span class="lineno">13498</span> }</div><div class="line"><a name="l13499"></a><span class="lineno">13499</span> </div><div class="line"><a name="l13500"></a><span class="lineno">13500</span> <span class="comment">// Bool() allows generating tests with parameters in a set of (false, true).</span></div><div class="line"><a name="l13501"></a><span class="lineno">13501</span> <span class="comment">//</span></div><div class="line"><a name="l13502"></a><span class="lineno">13502</span> <span class="comment">// Synopsis:</span></div><div class="line"><a name="l13503"></a><span class="lineno">13503</span> <span class="comment">// Bool()</span></div><div class="line"><a name="l13504"></a><span class="lineno">13504</span> <span class="comment">// - returns a generator producing sequences with elements {false, true}.</span></div><div class="line"><a name="l13505"></a><span class="lineno">13505</span> <span class="comment">//</span></div><div class="line"><a name="l13506"></a><span class="lineno">13506</span> <span class="comment">// It is useful when testing code that depends on Boolean flags. Combinations</span></div><div class="line"><a name="l13507"></a><span class="lineno">13507</span> <span class="comment">// of multiple flags can be tested when several Bool()'s are combined using</span></div><div class="line"><a name="l13508"></a><span class="lineno">13508</span> <span class="comment">// Combine() function.</span></div><div class="line"><a name="l13509"></a><span class="lineno">13509</span> <span class="comment">//</span></div><div class="line"><a name="l13510"></a><span class="lineno">13510</span> <span class="comment">// In the following example all tests in the test suite FlagDependentTest</span></div><div class="line"><a name="l13511"></a><span class="lineno">13511</span> <span class="comment">// will be instantiated twice with parameters false and true.</span></div><div class="line"><a name="l13512"></a><span class="lineno">13512</span> <span class="comment">//</span></div><div class="line"><a name="l13513"></a><span class="lineno">13513</span> <span class="comment">// class FlagDependentTest : public testing::TestWithParam<bool> {</span></div><div class="line"><a name="l13514"></a><span class="lineno">13514</span> <span class="comment">// virtual void SetUp() {</span></div><div class="line"><a name="l13515"></a><span class="lineno">13515</span> <span class="comment">// external_flag = GetParam();</span></div><div class="line"><a name="l13516"></a><span class="lineno">13516</span> <span class="comment">// }</span></div><div class="line"><a name="l13517"></a><span class="lineno">13517</span> <span class="comment">// }</span></div><div class="line"><a name="l13518"></a><span class="lineno">13518</span> <span class="comment">// INSTANTIATE_TEST_SUITE_P(BoolSequence, FlagDependentTest, Bool());</span></div><div class="line"><a name="l13519"></a><span class="lineno">13519</span> <span class="comment">//</span></div><div class="line"><a name="l13520"></a><span class="lineno"><a class="line" href="namespacetesting.html#aa9f9150ed43f949c8a6bacf3f04c03ce">13520</a></span> <span class="keyword">inline</span> <a class="code" href="classtesting_1_1internal_1_1_param_generator.html">internal::ParamGenerator<bool></a> <a class="code" href="namespacetesting.html#aa9f9150ed43f949c8a6bacf3f04c03ce">Bool</a>() {</div><div class="line"><a name="l13521"></a><span class="lineno">13521</span>  <span class="keywordflow">return</span> <a class="code" href="namespacetesting.html#a374d4e5fbb4c938058fbe81d4c7ff6a6">Values</a>(<span class="keyword">false</span>, <span class="keyword">true</span>);</div><div class="line"><a name="l13522"></a><span class="lineno">13522</span> }</div><div class="line"><a name="l13523"></a><span class="lineno">13523</span> </div><div class="line"><a name="l13524"></a><span class="lineno">13524</span> <span class="comment">// Combine() allows the user to combine two or more sequences to produce</span></div><div class="line"><a name="l13525"></a><span class="lineno">13525</span> <span class="comment">// values of a Cartesian product of those sequences' elements.</span></div><div class="line"><a name="l13526"></a><span class="lineno">13526</span> <span class="comment">//</span></div><div class="line"><a name="l13527"></a><span class="lineno">13527</span> <span class="comment">// Synopsis:</span></div><div class="line"><a name="l13528"></a><span class="lineno">13528</span> <span class="comment">// Combine(gen1, gen2, ..., genN)</span></div><div class="line"><a name="l13529"></a><span class="lineno">13529</span> <span class="comment">// - returns a generator producing sequences with elements coming from</span></div><div class="line"><a name="l13530"></a><span class="lineno">13530</span> <span class="comment">// the Cartesian product of elements from the sequences generated by</span></div><div class="line"><a name="l13531"></a><span class="lineno">13531</span> <span class="comment">// gen1, gen2, ..., genN. The sequence elements will have a type of</span></div><div class="line"><a name="l13532"></a><span class="lineno">13532</span> <span class="comment">// std::tuple<T1, T2, ..., TN> where T1, T2, ..., TN are the types</span></div><div class="line"><a name="l13533"></a><span class="lineno">13533</span> <span class="comment">// of elements from sequences produces by gen1, gen2, ..., genN.</span></div><div class="line"><a name="l13534"></a><span class="lineno">13534</span> <span class="comment">//</span></div><div class="line"><a name="l13535"></a><span class="lineno">13535</span> <span class="comment">// Combine can have up to 10 arguments.</span></div><div class="line"><a name="l13536"></a><span class="lineno">13536</span> <span class="comment">//</span></div><div class="line"><a name="l13537"></a><span class="lineno">13537</span> <span class="comment">// Example:</span></div><div class="line"><a name="l13538"></a><span class="lineno">13538</span> <span class="comment">//</span></div><div class="line"><a name="l13539"></a><span class="lineno">13539</span> <span class="comment">// This will instantiate tests in test suite AnimalTest each one with</span></div><div class="line"><a name="l13540"></a><span class="lineno">13540</span> <span class="comment">// the parameter values tuple("cat", BLACK), tuple("cat", WHITE),</span></div><div class="line"><a name="l13541"></a><span class="lineno">13541</span> <span class="comment">// tuple("dog", BLACK), and tuple("dog", WHITE):</span></div><div class="line"><a name="l13542"></a><span class="lineno">13542</span> <span class="comment">//</span></div><div class="line"><a name="l13543"></a><span class="lineno">13543</span> <span class="comment">// enum Color { BLACK, GRAY, WHITE };</span></div><div class="line"><a name="l13544"></a><span class="lineno">13544</span> <span class="comment">// class AnimalTest</span></div><div class="line"><a name="l13545"></a><span class="lineno">13545</span> <span class="comment">// : public testing::TestWithParam<std::tuple<const char*, Color> > {...};</span></div><div class="line"><a name="l13546"></a><span class="lineno">13546</span> <span class="comment">//</span></div><div class="line"><a name="l13547"></a><span class="lineno">13547</span> <span class="comment">// TEST_P(AnimalTest, AnimalLooksNice) {...}</span></div><div class="line"><a name="l13548"></a><span class="lineno">13548</span> <span class="comment">//</span></div><div class="line"><a name="l13549"></a><span class="lineno">13549</span> <span class="comment">// INSTANTIATE_TEST_SUITE_P(AnimalVariations, AnimalTest,</span></div><div class="line"><a name="l13550"></a><span class="lineno">13550</span> <span class="comment">// Combine(Values("cat", "dog"),</span></div><div class="line"><a name="l13551"></a><span class="lineno">13551</span> <span class="comment">// Values(BLACK, WHITE)));</span></div><div class="line"><a name="l13552"></a><span class="lineno">13552</span> <span class="comment">//</span></div><div class="line"><a name="l13553"></a><span class="lineno">13553</span> <span class="comment">// This will instantiate tests in FlagDependentTest with all variations of two</span></div><div class="line"><a name="l13554"></a><span class="lineno">13554</span> <span class="comment">// Boolean flags:</span></div><div class="line"><a name="l13555"></a><span class="lineno">13555</span> <span class="comment">//</span></div><div class="line"><a name="l13556"></a><span class="lineno">13556</span> <span class="comment">// class FlagDependentTest</span></div><div class="line"><a name="l13557"></a><span class="lineno">13557</span> <span class="comment">// : public testing::TestWithParam<std::tuple<bool, bool> > {</span></div><div class="line"><a name="l13558"></a><span class="lineno">13558</span> <span class="comment">// virtual void SetUp() {</span></div><div class="line"><a name="l13559"></a><span class="lineno">13559</span> <span class="comment">// // Assigns external_flag_1 and external_flag_2 values from the tuple.</span></div><div class="line"><a name="l13560"></a><span class="lineno">13560</span> <span class="comment">// std::tie(external_flag_1, external_flag_2) = GetParam();</span></div><div class="line"><a name="l13561"></a><span class="lineno">13561</span> <span class="comment">// }</span></div><div class="line"><a name="l13562"></a><span class="lineno">13562</span> <span class="comment">// };</span></div><div class="line"><a name="l13563"></a><span class="lineno">13563</span> <span class="comment">//</span></div><div class="line"><a name="l13564"></a><span class="lineno">13564</span> <span class="comment">// TEST_P(FlagDependentTest, TestFeature1) {</span></div><div class="line"><a name="l13565"></a><span class="lineno">13565</span> <span class="comment">// // Test your code using external_flag_1 and external_flag_2 here.</span></div><div class="line"><a name="l13566"></a><span class="lineno">13566</span> <span class="comment">// }</span></div><div class="line"><a name="l13567"></a><span class="lineno">13567</span> <span class="comment">// INSTANTIATE_TEST_SUITE_P(TwoBoolSequence, FlagDependentTest,</span></div><div class="line"><a name="l13568"></a><span class="lineno">13568</span> <span class="comment">// Combine(Bool(), Bool()));</span></div><div class="line"><a name="l13569"></a><span class="lineno">13569</span> <span class="comment">//</span></div><div class="line"><a name="l13570"></a><span class="lineno">13570</span> <span class="keyword">template</span> <<span class="keyword">typename</span> Generator1, <span class="keyword">typename</span> Generator2></div><div class="line"><a name="l13571"></a><span class="lineno"><a class="line" href="namespacetesting.html#a4917922963bacef3e301e67366c41df3">13571</a></span> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_holder2.html">internal::CartesianProductHolder2<Generator1, Generator2></a> <a class="code" href="namespacetesting.html#a4917922963bacef3e301e67366c41df3">Combine</a>(</div><div class="line"><a name="l13572"></a><span class="lineno">13572</span>  <span class="keyword">const</span> Generator1& g1, <span class="keyword">const</span> Generator2& g2) {</div><div class="line"><a name="l13573"></a><span class="lineno">13573</span>  <span class="keywordflow">return</span> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_holder2.html">internal::CartesianProductHolder2<Generator1, Generator2></a>(</div><div class="line"><a name="l13574"></a><span class="lineno">13574</span>  g1, g2);</div><div class="line"><a name="l13575"></a><span class="lineno">13575</span> }</div><div class="line"><a name="l13576"></a><span class="lineno">13576</span> </div><div class="line"><a name="l13577"></a><span class="lineno">13577</span> <span class="keyword">template</span> <<span class="keyword">typename</span> Generator1, <span class="keyword">typename</span> Generator2, <span class="keyword">typename</span> Generator3></div><div class="line"><a name="l13578"></a><span class="lineno"><a class="line" href="namespacetesting.html#a77b89180fd846e275236409d9704eda2">13578</a></span> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_holder3.html">internal::CartesianProductHolder3<Generator1, Generator2, Generator3></a> <a class="code" href="namespacetesting.html#a4917922963bacef3e301e67366c41df3">Combine</a>(</div><div class="line"><a name="l13579"></a><span class="lineno">13579</span>  <span class="keyword">const</span> Generator1& g1, <span class="keyword">const</span> Generator2& g2, <span class="keyword">const</span> Generator3& g3) {</div><div class="line"><a name="l13580"></a><span class="lineno">13580</span>  <span class="keywordflow">return</span> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_holder3.html">internal::CartesianProductHolder3<Generator1, Generator2, Generator3></a>(</div><div class="line"><a name="l13581"></a><span class="lineno">13581</span>  g1, g2, g3);</div><div class="line"><a name="l13582"></a><span class="lineno">13582</span> }</div><div class="line"><a name="l13583"></a><span class="lineno">13583</span> </div><div class="line"><a name="l13584"></a><span class="lineno">13584</span> <span class="keyword">template</span> <<span class="keyword">typename</span> Generator1, <span class="keyword">typename</span> Generator2, <span class="keyword">typename</span> Generator3,</div><div class="line"><a name="l13585"></a><span class="lineno">13585</span>  <span class="keyword">typename</span> Generator4></div><div class="line"><a name="l13586"></a><span class="lineno">13586</span> internal::CartesianProductHolder4<Generator1, Generator2, Generator3,</div><div class="line"><a name="l13587"></a><span class="lineno"><a class="line" href="namespacetesting.html#abf420810fcd8190a98c2927862805a3f">13587</a></span>  Generator4> <a class="code" href="namespacetesting.html#a4917922963bacef3e301e67366c41df3">Combine</a>(</div><div class="line"><a name="l13588"></a><span class="lineno">13588</span>  <span class="keyword">const</span> Generator1& g1, <span class="keyword">const</span> Generator2& g2, <span class="keyword">const</span> Generator3& g3,</div><div class="line"><a name="l13589"></a><span class="lineno">13589</span>  <span class="keyword">const</span> Generator4& g4) {</div><div class="line"><a name="l13590"></a><span class="lineno">13590</span>  <span class="keywordflow">return</span> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_holder4.html">internal::CartesianProductHolder4</a><Generator1, Generator2, Generator3,</div><div class="line"><a name="l13591"></a><span class="lineno">13591</span>  Generator4>(</div><div class="line"><a name="l13592"></a><span class="lineno">13592</span>  g1, g2, g3, g4);</div><div class="line"><a name="l13593"></a><span class="lineno">13593</span> }</div><div class="line"><a name="l13594"></a><span class="lineno">13594</span> </div><div class="line"><a name="l13595"></a><span class="lineno">13595</span> <span class="keyword">template</span> <<span class="keyword">typename</span> Generator1, <span class="keyword">typename</span> Generator2, <span class="keyword">typename</span> Generator3,</div><div class="line"><a name="l13596"></a><span class="lineno">13596</span>  <span class="keyword">typename</span> Generator4, <span class="keyword">typename</span> Generator5></div><div class="line"><a name="l13597"></a><span class="lineno">13597</span> internal::CartesianProductHolder5<Generator1, Generator2, Generator3,</div><div class="line"><a name="l13598"></a><span class="lineno"><a class="line" href="namespacetesting.html#a81505186d64f5b5763a0e268bc2e5650">13598</a></span>  Generator4, Generator5> <a class="code" href="namespacetesting.html#a4917922963bacef3e301e67366c41df3">Combine</a>(</div><div class="line"><a name="l13599"></a><span class="lineno">13599</span>  <span class="keyword">const</span> Generator1& g1, <span class="keyword">const</span> Generator2& g2, <span class="keyword">const</span> Generator3& g3,</div><div class="line"><a name="l13600"></a><span class="lineno">13600</span>  <span class="keyword">const</span> Generator4& g4, <span class="keyword">const</span> Generator5& g5) {</div><div class="line"><a name="l13601"></a><span class="lineno">13601</span>  <span class="keywordflow">return</span> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_holder5.html">internal::CartesianProductHolder5</a><Generator1, Generator2, Generator3,</div><div class="line"><a name="l13602"></a><span class="lineno">13602</span>  Generator4, Generator5>(</div><div class="line"><a name="l13603"></a><span class="lineno">13603</span>  g1, g2, g3, g4, g5);</div><div class="line"><a name="l13604"></a><span class="lineno">13604</span> }</div><div class="line"><a name="l13605"></a><span class="lineno">13605</span> </div><div class="line"><a name="l13606"></a><span class="lineno">13606</span> <span class="keyword">template</span> <<span class="keyword">typename</span> Generator1, <span class="keyword">typename</span> Generator2, <span class="keyword">typename</span> Generator3,</div><div class="line"><a name="l13607"></a><span class="lineno">13607</span>  <span class="keyword">typename</span> Generator4, <span class="keyword">typename</span> Generator5, <span class="keyword">typename</span> Generator6></div><div class="line"><a name="l13608"></a><span class="lineno">13608</span> internal::CartesianProductHolder6<Generator1, Generator2, Generator3,</div><div class="line"><a name="l13609"></a><span class="lineno"><a class="line" href="namespacetesting.html#adccda33f9b3ad18896cb341979fe12b4">13609</a></span>  Generator4, Generator5, Generator6> <a class="code" href="namespacetesting.html#a4917922963bacef3e301e67366c41df3">Combine</a>(</div><div class="line"><a name="l13610"></a><span class="lineno">13610</span>  <span class="keyword">const</span> Generator1& g1, <span class="keyword">const</span> Generator2& g2, <span class="keyword">const</span> Generator3& g3,</div><div class="line"><a name="l13611"></a><span class="lineno">13611</span>  <span class="keyword">const</span> Generator4& g4, <span class="keyword">const</span> Generator5& g5, <span class="keyword">const</span> Generator6& g6) {</div><div class="line"><a name="l13612"></a><span class="lineno">13612</span>  <span class="keywordflow">return</span> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_holder6.html">internal::CartesianProductHolder6</a><Generator1, Generator2, Generator3,</div><div class="line"><a name="l13613"></a><span class="lineno">13613</span>  Generator4, Generator5, Generator6>(</div><div class="line"><a name="l13614"></a><span class="lineno">13614</span>  g1, g2, g3, g4, g5, g6);</div><div class="line"><a name="l13615"></a><span class="lineno">13615</span> }</div><div class="line"><a name="l13616"></a><span class="lineno">13616</span> </div><div class="line"><a name="l13617"></a><span class="lineno">13617</span> <span class="keyword">template</span> <<span class="keyword">typename</span> Generator1, <span class="keyword">typename</span> Generator2, <span class="keyword">typename</span> Generator3,</div><div class="line"><a name="l13618"></a><span class="lineno">13618</span>  <span class="keyword">typename</span> Generator4, <span class="keyword">typename</span> Generator5, <span class="keyword">typename</span> Generator6,</div><div class="line"><a name="l13619"></a><span class="lineno">13619</span>  <span class="keyword">typename</span> Generator7></div><div class="line"><a name="l13620"></a><span class="lineno">13620</span> internal::CartesianProductHolder7<Generator1, Generator2, Generator3,</div><div class="line"><a name="l13621"></a><span class="lineno"><a class="line" href="namespacetesting.html#a314759a93c251ca78b75c7f3ae8eda80">13621</a></span>  Generator4, Generator5, Generator6, Generator7> <a class="code" href="namespacetesting.html#a4917922963bacef3e301e67366c41df3">Combine</a>(</div><div class="line"><a name="l13622"></a><span class="lineno">13622</span>  <span class="keyword">const</span> Generator1& g1, <span class="keyword">const</span> Generator2& g2, <span class="keyword">const</span> Generator3& g3,</div><div class="line"><a name="l13623"></a><span class="lineno">13623</span>  <span class="keyword">const</span> Generator4& g4, <span class="keyword">const</span> Generator5& g5, <span class="keyword">const</span> Generator6& g6,</div><div class="line"><a name="l13624"></a><span class="lineno">13624</span>  <span class="keyword">const</span> Generator7& g7) {</div><div class="line"><a name="l13625"></a><span class="lineno">13625</span>  <span class="keywordflow">return</span> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_holder7.html">internal::CartesianProductHolder7</a><Generator1, Generator2, Generator3,</div><div class="line"><a name="l13626"></a><span class="lineno">13626</span>  Generator4, Generator5, Generator6, Generator7>(</div><div class="line"><a name="l13627"></a><span class="lineno">13627</span>  g1, g2, g3, g4, g5, g6, g7);</div><div class="line"><a name="l13628"></a><span class="lineno">13628</span> }</div><div class="line"><a name="l13629"></a><span class="lineno">13629</span> </div><div class="line"><a name="l13630"></a><span class="lineno">13630</span> <span class="keyword">template</span> <<span class="keyword">typename</span> Generator1, <span class="keyword">typename</span> Generator2, <span class="keyword">typename</span> Generator3,</div><div class="line"><a name="l13631"></a><span class="lineno">13631</span>  <span class="keyword">typename</span> Generator4, <span class="keyword">typename</span> Generator5, <span class="keyword">typename</span> Generator6,</div><div class="line"><a name="l13632"></a><span class="lineno">13632</span>  <span class="keyword">typename</span> Generator7, <span class="keyword">typename</span> Generator8></div><div class="line"><a name="l13633"></a><span class="lineno">13633</span> internal::CartesianProductHolder8<Generator1, Generator2, Generator3,</div><div class="line"><a name="l13634"></a><span class="lineno"><a class="line" href="namespacetesting.html#ac5508abb9d05e22332c792d101c13b2b">13634</a></span>  Generator4, Generator5, Generator6, Generator7, Generator8> <a class="code" href="namespacetesting.html#a4917922963bacef3e301e67366c41df3">Combine</a>(</div><div class="line"><a name="l13635"></a><span class="lineno">13635</span>  <span class="keyword">const</span> Generator1& g1, <span class="keyword">const</span> Generator2& g2, <span class="keyword">const</span> Generator3& g3,</div><div class="line"><a name="l13636"></a><span class="lineno">13636</span>  <span class="keyword">const</span> Generator4& g4, <span class="keyword">const</span> Generator5& g5, <span class="keyword">const</span> Generator6& g6,</div><div class="line"><a name="l13637"></a><span class="lineno">13637</span>  <span class="keyword">const</span> Generator7& g7, <span class="keyword">const</span> Generator8& g8) {</div><div class="line"><a name="l13638"></a><span class="lineno">13638</span>  <span class="keywordflow">return</span> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_holder8.html">internal::CartesianProductHolder8</a><Generator1, Generator2, Generator3,</div><div class="line"><a name="l13639"></a><span class="lineno">13639</span>  Generator4, Generator5, Generator6, Generator7, Generator8>(</div><div class="line"><a name="l13640"></a><span class="lineno">13640</span>  g1, g2, g3, g4, g5, g6, g7, g8);</div><div class="line"><a name="l13641"></a><span class="lineno">13641</span> }</div><div class="line"><a name="l13642"></a><span class="lineno">13642</span> </div><div class="line"><a name="l13643"></a><span class="lineno">13643</span> <span class="keyword">template</span> <<span class="keyword">typename</span> Generator1, <span class="keyword">typename</span> Generator2, <span class="keyword">typename</span> Generator3,</div><div class="line"><a name="l13644"></a><span class="lineno">13644</span>  <span class="keyword">typename</span> Generator4, <span class="keyword">typename</span> Generator5, <span class="keyword">typename</span> Generator6,</div><div class="line"><a name="l13645"></a><span class="lineno">13645</span>  <span class="keyword">typename</span> Generator7, <span class="keyword">typename</span> Generator8, <span class="keyword">typename</span> Generator9></div><div class="line"><a name="l13646"></a><span class="lineno">13646</span> internal::CartesianProductHolder9<Generator1, Generator2, Generator3,</div><div class="line"><a name="l13647"></a><span class="lineno">13647</span>  Generator4, Generator5, Generator6, Generator7, Generator8,</div><div class="line"><a name="l13648"></a><span class="lineno"><a class="line" href="namespacetesting.html#a928ed7d1e8dd1dde0da5d7d3838384d2">13648</a></span>  Generator9> <a class="code" href="namespacetesting.html#a4917922963bacef3e301e67366c41df3">Combine</a>(</div><div class="line"><a name="l13649"></a><span class="lineno">13649</span>  <span class="keyword">const</span> Generator1& g1, <span class="keyword">const</span> Generator2& g2, <span class="keyword">const</span> Generator3& g3,</div><div class="line"><a name="l13650"></a><span class="lineno">13650</span>  <span class="keyword">const</span> Generator4& g4, <span class="keyword">const</span> Generator5& g5, <span class="keyword">const</span> Generator6& g6,</div><div class="line"><a name="l13651"></a><span class="lineno">13651</span>  <span class="keyword">const</span> Generator7& g7, <span class="keyword">const</span> Generator8& g8, <span class="keyword">const</span> Generator9& g9) {</div><div class="line"><a name="l13652"></a><span class="lineno">13652</span>  <span class="keywordflow">return</span> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_holder9.html">internal::CartesianProductHolder9</a><Generator1, Generator2, Generator3,</div><div class="line"><a name="l13653"></a><span class="lineno">13653</span>  Generator4, Generator5, Generator6, Generator7, Generator8, Generator9>(</div><div class="line"><a name="l13654"></a><span class="lineno">13654</span>  g1, g2, g3, g4, g5, g6, g7, g8, g9);</div><div class="line"><a name="l13655"></a><span class="lineno">13655</span> }</div><div class="line"><a name="l13656"></a><span class="lineno">13656</span> </div><div class="line"><a name="l13657"></a><span class="lineno">13657</span> <span class="keyword">template</span> <<span class="keyword">typename</span> Generator1, <span class="keyword">typename</span> Generator2, <span class="keyword">typename</span> Generator3,</div><div class="line"><a name="l13658"></a><span class="lineno">13658</span>  <span class="keyword">typename</span> Generator4, <span class="keyword">typename</span> Generator5, <span class="keyword">typename</span> Generator6,</div><div class="line"><a name="l13659"></a><span class="lineno">13659</span>  <span class="keyword">typename</span> Generator7, <span class="keyword">typename</span> Generator8, <span class="keyword">typename</span> Generator9,</div><div class="line"><a name="l13660"></a><span class="lineno">13660</span>  <span class="keyword">typename</span> Generator10></div><div class="line"><a name="l13661"></a><span class="lineno">13661</span> internal::CartesianProductHolder10<Generator1, Generator2, Generator3,</div><div class="line"><a name="l13662"></a><span class="lineno">13662</span>  Generator4, Generator5, Generator6, Generator7, Generator8, Generator9,</div><div class="line"><a name="l13663"></a><span class="lineno"><a class="line" href="namespacetesting.html#a0590cd15c5bafaea9f5d2b1061e0a28b">13663</a></span>  Generator10> <a class="code" href="namespacetesting.html#a4917922963bacef3e301e67366c41df3">Combine</a>(</div><div class="line"><a name="l13664"></a><span class="lineno">13664</span>  <span class="keyword">const</span> Generator1& g1, <span class="keyword">const</span> Generator2& g2, <span class="keyword">const</span> Generator3& g3,</div><div class="line"><a name="l13665"></a><span class="lineno">13665</span>  <span class="keyword">const</span> Generator4& g4, <span class="keyword">const</span> Generator5& g5, <span class="keyword">const</span> Generator6& g6,</div><div class="line"><a name="l13666"></a><span class="lineno">13666</span>  <span class="keyword">const</span> Generator7& g7, <span class="keyword">const</span> Generator8& g8, <span class="keyword">const</span> Generator9& g9,</div><div class="line"><a name="l13667"></a><span class="lineno">13667</span>  <span class="keyword">const</span> Generator10& g10) {</div><div class="line"><a name="l13668"></a><span class="lineno">13668</span>  <span class="keywordflow">return</span> <a class="code" href="classtesting_1_1internal_1_1_cartesian_product_holder10.html">internal::CartesianProductHolder10</a><Generator1, Generator2, Generator3,</div><div class="line"><a name="l13669"></a><span class="lineno">13669</span>  Generator4, Generator5, Generator6, Generator7, Generator8, Generator9,</div><div class="line"><a name="l13670"></a><span class="lineno">13670</span>  Generator10>(</div><div class="line"><a name="l13671"></a><span class="lineno">13671</span>  g1, g2, g3, g4, g5, g6, g7, g8, g9, g10);</div><div class="line"><a name="l13672"></a><span class="lineno">13672</span> }</div><div class="line"><a name="l13673"></a><span class="lineno">13673</span> </div><div class="line"><a name="l13674"></a><span class="lineno"><a class="line" href="gtest_8h.html#a1adc861b311e3fbd97bcc72e0b0f5962">13674</a></span> <span class="preprocessor">#define TEST_P(test_suite_name, test_name) \</span></div><div class="line"><a name="l13675"></a><span class="lineno">13675</span> <span class="preprocessor"> class GTEST_TEST_CLASS_NAME_(test_suite_name, test_name) \</span></div><div class="line"><a name="l13676"></a><span class="lineno">13676</span> <span class="preprocessor"> : public test_suite_name { \</span></div><div class="line"><a name="l13677"></a><span class="lineno">13677</span> <span class="preprocessor"> public: \</span></div><div class="line"><a name="l13678"></a><span class="lineno">13678</span> <span class="preprocessor"> GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)() {} \</span></div><div class="line"><a name="l13679"></a><span class="lineno">13679</span> <span class="preprocessor"> virtual void TestBody(); \</span></div><div class="line"><a name="l13680"></a><span class="lineno">13680</span> <span class="preprocessor"> \</span></div><div class="line"><a name="l13681"></a><span class="lineno">13681</span> <span class="preprocessor"> private: \</span></div><div class="line"><a name="l13682"></a><span class="lineno">13682</span> <span class="preprocessor"> static int AddToRegistry() { \</span></div><div class="line"><a name="l13683"></a><span class="lineno">13683</span> <span class="preprocessor"> ::testing::UnitTest::GetInstance() \</span></div><div class="line"><a name="l13684"></a><span class="lineno">13684</span> <span class="preprocessor"> ->parameterized_test_registry() \</span></div><div class="line"><a name="l13685"></a><span class="lineno">13685</span> <span class="preprocessor"> .GetTestSuitePatternHolder<test_suite_name>( \</span></div><div class="line"><a name="l13686"></a><span class="lineno">13686</span> <span class="preprocessor"> #test_suite_name, \</span></div><div class="line"><a name="l13687"></a><span class="lineno">13687</span> <span class="preprocessor"> ::testing::internal::CodeLocation(__FILE__, __LINE__)) \</span></div><div class="line"><a name="l13688"></a><span class="lineno">13688</span> <span class="preprocessor"> ->AddTestPattern( \</span></div><div class="line"><a name="l13689"></a><span class="lineno">13689</span> <span class="preprocessor"> GTEST_STRINGIFY_(test_suite_name), GTEST_STRINGIFY_(test_name), \</span></div><div class="line"><a name="l13690"></a><span class="lineno">13690</span> <span class="preprocessor"> new ::testing::internal::TestMetaFactory<GTEST_TEST_CLASS_NAME_( \</span></div><div class="line"><a name="l13691"></a><span class="lineno">13691</span> <span class="preprocessor"> test_suite_name, test_name)>()); \</span></div><div class="line"><a name="l13692"></a><span class="lineno">13692</span> <span class="preprocessor"> return 0; \</span></div><div class="line"><a name="l13693"></a><span class="lineno">13693</span> <span class="preprocessor"> } \</span></div><div class="line"><a name="l13694"></a><span class="lineno">13694</span> <span class="preprocessor"> static int gtest_registering_dummy_ GTEST_ATTRIBUTE_UNUSED_; \</span></div><div class="line"><a name="l13695"></a><span class="lineno">13695</span> <span class="preprocessor"> GTEST_DISALLOW_COPY_AND_ASSIGN_(GTEST_TEST_CLASS_NAME_(test_suite_name, \</span></div><div class="line"><a name="l13696"></a><span class="lineno">13696</span> <span class="preprocessor"> test_name)); \</span></div><div class="line"><a name="l13697"></a><span class="lineno">13697</span> <span class="preprocessor"> }; \</span></div><div class="line"><a name="l13698"></a><span class="lineno">13698</span> <span class="preprocessor"> int GTEST_TEST_CLASS_NAME_(test_suite_name, \</span></div><div class="line"><a name="l13699"></a><span class="lineno">13699</span> <span class="preprocessor"> test_name)::gtest_registering_dummy_ = \</span></div><div class="line"><a name="l13700"></a><span class="lineno">13700</span> <span class="preprocessor"> GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)::AddToRegistry(); \</span></div><div class="line"><a name="l13701"></a><span class="lineno">13701</span> <span class="preprocessor"> void GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)::TestBody()</span></div><div class="line"><a name="l13702"></a><span class="lineno">13702</span> </div><div class="line"><a name="l13703"></a><span class="lineno">13703</span> <span class="comment">// The optional last argument to INSTANTIATE_TEST_SUITE_P allows the user</span></div><div class="line"><a name="l13704"></a><span class="lineno">13704</span> <span class="comment">// to specify a function or functor that generates custom test name suffixes</span></div><div class="line"><a name="l13705"></a><span class="lineno">13705</span> <span class="comment">// based on the test parameters. The function should accept one argument of</span></div><div class="line"><a name="l13706"></a><span class="lineno">13706</span> <span class="comment">// type testing::TestParamInfo<class ParamType>, and return std::string.</span></div><div class="line"><a name="l13707"></a><span class="lineno">13707</span> <span class="comment">//</span></div><div class="line"><a name="l13708"></a><span class="lineno">13708</span> <span class="comment">// testing::PrintToStringParamName is a builtin test suffix generator that</span></div><div class="line"><a name="l13709"></a><span class="lineno">13709</span> <span class="comment">// returns the value of testing::PrintToString(GetParam()).</span></div><div class="line"><a name="l13710"></a><span class="lineno">13710</span> <span class="comment">//</span></div><div class="line"><a name="l13711"></a><span class="lineno">13711</span> <span class="comment">// Note: test names must be non-empty, unique, and may only contain ASCII</span></div><div class="line"><a name="l13712"></a><span class="lineno">13712</span> <span class="comment">// alphanumeric characters or underscore. Because PrintToString adds quotes</span></div><div class="line"><a name="l13713"></a><span class="lineno">13713</span> <span class="comment">// to std::string and C strings, it won't work for these types.</span></div><div class="line"><a name="l13714"></a><span class="lineno">13714</span> </div><div class="line"><a name="l13715"></a><span class="lineno"><a class="line" href="gtest_8h.html#a016124361c862c0db315e4c9dc4d911a">13715</a></span> <span class="preprocessor">#define INSTANTIATE_TEST_SUITE_P(prefix, test_suite_name, generator, ...) \</span></div><div class="line"><a name="l13716"></a><span class="lineno">13716</span> <span class="preprocessor"> static ::testing::internal::ParamGenerator<test_suite_name::ParamType> \</span></div><div class="line"><a name="l13717"></a><span class="lineno">13717</span> <span class="preprocessor"> gtest_##prefix##test_suite_name##_EvalGenerator_() { \</span></div><div class="line"><a name="l13718"></a><span class="lineno">13718</span> <span class="preprocessor"> return generator; \</span></div><div class="line"><a name="l13719"></a><span class="lineno">13719</span> <span class="preprocessor"> } \</span></div><div class="line"><a name="l13720"></a><span class="lineno">13720</span> <span class="preprocessor"> static ::std::string gtest_##prefix##test_suite_name##_EvalGenerateName_( \</span></div><div class="line"><a name="l13721"></a><span class="lineno">13721</span> <span class="preprocessor"> const ::testing::TestParamInfo<test_suite_name::ParamType>& info) { \</span></div><div class="line"><a name="l13722"></a><span class="lineno">13722</span> <span class="preprocessor"> return ::testing::internal::GetParamNameGen<test_suite_name::ParamType>( \</span></div><div class="line"><a name="l13723"></a><span class="lineno">13723</span> <span class="preprocessor"> __VA_ARGS__)(info); \</span></div><div class="line"><a name="l13724"></a><span class="lineno">13724</span> <span class="preprocessor"> } \</span></div><div class="line"><a name="l13725"></a><span class="lineno">13725</span> <span class="preprocessor"> static int gtest_##prefix##test_suite_name##_dummy_ \</span></div><div class="line"><a name="l13726"></a><span class="lineno">13726</span> <span class="preprocessor"> GTEST_ATTRIBUTE_UNUSED_ = \</span></div><div class="line"><a name="l13727"></a><span class="lineno">13727</span> <span class="preprocessor"> ::testing::UnitTest::GetInstance() \</span></div><div class="line"><a name="l13728"></a><span class="lineno">13728</span> <span class="preprocessor"> ->parameterized_test_registry() \</span></div><div class="line"><a name="l13729"></a><span class="lineno">13729</span> <span class="preprocessor"> .GetTestSuitePatternHolder<test_suite_name>( \</span></div><div class="line"><a name="l13730"></a><span class="lineno">13730</span> <span class="preprocessor"> #test_suite_name, \</span></div><div class="line"><a name="l13731"></a><span class="lineno">13731</span> <span class="preprocessor"> ::testing::internal::CodeLocation(__FILE__, __LINE__)) \</span></div><div class="line"><a name="l13732"></a><span class="lineno">13732</span> <span class="preprocessor"> ->AddTestSuiteInstantiation( \</span></div><div class="line"><a name="l13733"></a><span class="lineno">13733</span> <span class="preprocessor"> #prefix, &gtest_##prefix##test_suite_name##_EvalGenerator_, \</span></div><div class="line"><a name="l13734"></a><span class="lineno">13734</span> <span class="preprocessor"> &gtest_##prefix##test_suite_name##_EvalGenerateName_, \</span></div><div class="line"><a name="l13735"></a><span class="lineno">13735</span> <span class="preprocessor"> __FILE__, __LINE__)</span></div><div class="line"><a name="l13736"></a><span class="lineno">13736</span> </div><div class="line"><a name="l13737"></a><span class="lineno">13737</span> <span class="comment">// Legacy API is deprecated but still available</span></div><div class="line"><a name="l13738"></a><span class="lineno">13738</span> <span class="preprocessor">#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_</span></div><div class="line"><a name="l13739"></a><span class="lineno"><a class="line" href="gtest_8h.html#acc356fe00725fe8bf8b95791c0ffacbd">13739</a></span> <span class="preprocessor">#define INSTANTIATE_TEST_CASE_P INSTANTIATE_TEST_SUITE_P</span></div><div class="line"><a name="l13740"></a><span class="lineno">13740</span> <span class="preprocessor">#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_</span></div><div class="line"><a name="l13741"></a><span class="lineno">13741</span> </div><div class="line"><a name="l13742"></a><span class="lineno">13742</span> } <span class="comment">// namespace testing</span></div><div class="line"><a name="l13743"></a><span class="lineno">13743</span> </div><div class="line"><a name="l13744"></a><span class="lineno">13744</span> <span class="preprocessor">#endif // GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_</span></div><div class="line"><a name="l13745"></a><span class="lineno">13745</span> <span class="comment">// Copyright 2006, Google Inc.</span></div><div class="line"><a name="l13746"></a><span class="lineno">13746</span> <span class="comment">// All rights reserved.</span></div><div class="line"><a name="l13747"></a><span class="lineno">13747</span> <span class="comment">//</span></div><div class="line"><a name="l13748"></a><span class="lineno">13748</span> <span class="comment">// Redistribution and use in source and binary forms, with or without</span></div><div class="line"><a name="l13749"></a><span class="lineno">13749</span> <span class="comment">// modification, are permitted provided that the following conditions are</span></div><div class="line"><a name="l13750"></a><span class="lineno">13750</span> <span class="comment">// met:</span></div><div class="line"><a name="l13751"></a><span class="lineno">13751</span> <span class="comment">//</span></div><div class="line"><a name="l13752"></a><span class="lineno">13752</span> <span class="comment">// * Redistributions of source code must retain the above copyright</span></div><div class="line"><a name="l13753"></a><span class="lineno">13753</span> <span class="comment">// notice, this list of conditions and the following disclaimer.</span></div><div class="line"><a name="l13754"></a><span class="lineno">13754</span> <span class="comment">// * Redistributions in binary form must reproduce the above</span></div><div class="line"><a name="l13755"></a><span class="lineno">13755</span> <span class="comment">// copyright notice, this list of conditions and the following disclaimer</span></div><div class="line"><a name="l13756"></a><span class="lineno">13756</span> <span class="comment">// in the documentation and/or other materials provided with the</span></div><div class="line"><a name="l13757"></a><span class="lineno">13757</span> <span class="comment">// distribution.</span></div><div class="line"><a name="l13758"></a><span class="lineno">13758</span> <span class="comment">// * Neither the name of Google Inc. nor the names of its</span></div><div class="line"><a name="l13759"></a><span class="lineno">13759</span> <span class="comment">// contributors may be used to endorse or promote products derived from</span></div><div class="line"><a name="l13760"></a><span class="lineno">13760</span> <span class="comment">// this software without specific prior written permission.</span></div><div class="line"><a name="l13761"></a><span class="lineno">13761</span> <span class="comment">//</span></div><div class="line"><a name="l13762"></a><span class="lineno">13762</span> <span class="comment">// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS</span></div><div class="line"><a name="l13763"></a><span class="lineno">13763</span> <span class="comment">// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT</span></div><div class="line"><a name="l13764"></a><span class="lineno">13764</span> <span class="comment">// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR</span></div><div class="line"><a name="l13765"></a><span class="lineno">13765</span> <span class="comment">// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT</span></div><div class="line"><a name="l13766"></a><span class="lineno">13766</span> <span class="comment">// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,</span></div><div class="line"><a name="l13767"></a><span class="lineno">13767</span> <span class="comment">// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT</span></div><div class="line"><a name="l13768"></a><span class="lineno">13768</span> <span class="comment">// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,</span></div><div class="line"><a name="l13769"></a><span class="lineno">13769</span> <span class="comment">// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY</span></div><div class="line"><a name="l13770"></a><span class="lineno">13770</span> <span class="comment">// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</span></div><div class="line"><a name="l13771"></a><span class="lineno">13771</span> <span class="comment">// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE</span></div><div class="line"><a name="l13772"></a><span class="lineno">13772</span> <span class="comment">// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span></div><div class="line"><a name="l13773"></a><span class="lineno">13773</span> </div><div class="line"><a name="l13774"></a><span class="lineno">13774</span> <span class="comment">//</span></div><div class="line"><a name="l13775"></a><span class="lineno">13775</span> <span class="comment">// Google C++ Testing and Mocking Framework definitions useful in production code.</span></div><div class="line"><a name="l13776"></a><span class="lineno">13776</span> <span class="comment">// GOOGLETEST_CM0003 DO NOT DELETE</span></div><div class="line"><a name="l13777"></a><span class="lineno">13777</span> </div><div class="line"><a name="l13778"></a><span class="lineno">13778</span> <span class="preprocessor">#ifndef GTEST_INCLUDE_GTEST_GTEST_PROD_H_</span></div><div class="line"><a name="l13779"></a><span class="lineno"><a class="line" href="gtest_8h.html#a61e419ca2f3cc78bbae47d074c5d4400">13779</a></span> <span class="preprocessor">#define GTEST_INCLUDE_GTEST_GTEST_PROD_H_</span></div><div class="line"><a name="l13780"></a><span class="lineno">13780</span> </div><div class="line"><a name="l13781"></a><span class="lineno">13781</span> <span class="comment">// When you need to test the private or protected members of a class,</span></div><div class="line"><a name="l13782"></a><span class="lineno">13782</span> <span class="comment">// use the FRIEND_TEST macro to declare your tests as friends of the</span></div><div class="line"><a name="l13783"></a><span class="lineno">13783</span> <span class="comment">// class. For example:</span></div><div class="line"><a name="l13784"></a><span class="lineno">13784</span> <span class="comment">//</span></div><div class="line"><a name="l13785"></a><span class="lineno">13785</span> <span class="comment">// class MyClass {</span></div><div class="line"><a name="l13786"></a><span class="lineno">13786</span> <span class="comment">// private:</span></div><div class="line"><a name="l13787"></a><span class="lineno">13787</span> <span class="comment">// void PrivateMethod();</span></div><div class="line"><a name="l13788"></a><span class="lineno">13788</span> <span class="comment">// FRIEND_TEST(MyClassTest, PrivateMethodWorks);</span></div><div class="line"><a name="l13789"></a><span class="lineno">13789</span> <span class="comment">// };</span></div><div class="line"><a name="l13790"></a><span class="lineno">13790</span> <span class="comment">//</span></div><div class="line"><a name="l13791"></a><span class="lineno">13791</span> <span class="comment">// class MyClassTest : public testing::Test {</span></div><div class="line"><a name="l13792"></a><span class="lineno">13792</span> <span class="comment">// // ...</span></div><div class="line"><a name="l13793"></a><span class="lineno">13793</span> <span class="comment">// };</span></div><div class="line"><a name="l13794"></a><span class="lineno">13794</span> <span class="comment">//</span></div><div class="line"><a name="l13795"></a><span class="lineno">13795</span> <span class="comment">// TEST_F(MyClassTest, PrivateMethodWorks) {</span></div><div class="line"><a name="l13796"></a><span class="lineno">13796</span> <span class="comment">// // Can call MyClass::PrivateMethod() here.</span></div><div class="line"><a name="l13797"></a><span class="lineno">13797</span> <span class="comment">// }</span></div><div class="line"><a name="l13798"></a><span class="lineno">13798</span> <span class="comment">//</span></div><div class="line"><a name="l13799"></a><span class="lineno">13799</span> <span class="comment">// Note: The test class must be in the same namespace as the class being tested.</span></div><div class="line"><a name="l13800"></a><span class="lineno">13800</span> <span class="comment">// For example, putting MyClassTest in an anonymous namespace will not work.</span></div><div class="line"><a name="l13801"></a><span class="lineno">13801</span> </div><div class="line"><a name="l13802"></a><span class="lineno"><a class="line" href="gtest_8h.html#a8d443b4cc1d87a7a17943b8fbdbf3910">13802</a></span> <span class="preprocessor">#define FRIEND_TEST(test_case_name, test_name)\</span></div><div class="line"><a name="l13803"></a><span class="lineno">13803</span> <span class="preprocessor">friend class test_case_name##_##test_name##_Test</span></div><div class="line"><a name="l13804"></a><span class="lineno">13804</span> </div><div class="line"><a name="l13805"></a><span class="lineno">13805</span> <span class="preprocessor">#endif // GTEST_INCLUDE_GTEST_GTEST_PROD_H_</span></div><div class="line"><a name="l13806"></a><span class="lineno">13806</span> <span class="comment">// Copyright 2008, Google Inc.</span></div><div class="line"><a name="l13807"></a><span class="lineno">13807</span> <span class="comment">// All rights reserved.</span></div><div class="line"><a name="l13808"></a><span class="lineno">13808</span> <span class="comment">//</span></div><div class="line"><a name="l13809"></a><span class="lineno">13809</span> <span class="comment">// Redistribution and use in source and binary forms, with or without</span></div><div class="line"><a name="l13810"></a><span class="lineno">13810</span> <span class="comment">// modification, are permitted provided that the following conditions are</span></div><div class="line"><a name="l13811"></a><span class="lineno">13811</span> <span class="comment">// met:</span></div><div class="line"><a name="l13812"></a><span class="lineno">13812</span> <span class="comment">//</span></div><div class="line"><a name="l13813"></a><span class="lineno">13813</span> <span class="comment">// * Redistributions of source code must retain the above copyright</span></div><div class="line"><a name="l13814"></a><span class="lineno">13814</span> <span class="comment">// notice, this list of conditions and the following disclaimer.</span></div><div class="line"><a name="l13815"></a><span class="lineno">13815</span> <span class="comment">// * Redistributions in binary form must reproduce the above</span></div><div class="line"><a name="l13816"></a><span class="lineno">13816</span> <span class="comment">// copyright notice, this list of conditions and the following disclaimer</span></div><div class="line"><a name="l13817"></a><span class="lineno">13817</span> <span class="comment">// in the documentation and/or other materials provided with the</span></div><div class="line"><a name="l13818"></a><span class="lineno">13818</span> <span class="comment">// distribution.</span></div><div class="line"><a name="l13819"></a><span class="lineno">13819</span> <span class="comment">// * Neither the name of Google Inc. nor the names of its</span></div><div class="line"><a name="l13820"></a><span class="lineno">13820</span> <span class="comment">// contributors may be used to endorse or promote products derived from</span></div><div class="line"><a name="l13821"></a><span class="lineno">13821</span> <span class="comment">// this software without specific prior written permission.</span></div><div class="line"><a name="l13822"></a><span class="lineno">13822</span> <span class="comment">//</span></div><div class="line"><a name="l13823"></a><span class="lineno">13823</span> <span class="comment">// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS</span></div><div class="line"><a name="l13824"></a><span class="lineno">13824</span> <span class="comment">// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT</span></div><div class="line"><a name="l13825"></a><span class="lineno">13825</span> <span class="comment">// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR</span></div><div class="line"><a name="l13826"></a><span class="lineno">13826</span> <span class="comment">// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT</span></div><div class="line"><a name="l13827"></a><span class="lineno">13827</span> <span class="comment">// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,</span></div><div class="line"><a name="l13828"></a><span class="lineno">13828</span> <span class="comment">// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT</span></div><div class="line"><a name="l13829"></a><span class="lineno">13829</span> <span class="comment">// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,</span></div><div class="line"><a name="l13830"></a><span class="lineno">13830</span> <span class="comment">// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY</span></div><div class="line"><a name="l13831"></a><span class="lineno">13831</span> <span class="comment">// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</span></div><div class="line"><a name="l13832"></a><span class="lineno">13832</span> <span class="comment">// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE</span></div><div class="line"><a name="l13833"></a><span class="lineno">13833</span> <span class="comment">// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span></div><div class="line"><a name="l13834"></a><span class="lineno">13834</span> <span class="comment">//</span></div><div class="line"><a name="l13835"></a><span class="lineno">13835</span> <span class="comment">// GOOGLETEST_CM0001 DO NOT DELETE</span></div><div class="line"><a name="l13836"></a><span class="lineno">13836</span> </div><div class="line"><a name="l13837"></a><span class="lineno">13837</span> <span class="preprocessor">#ifndef GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_</span></div><div class="line"><a name="l13838"></a><span class="lineno"><a class="line" href="gtest_8h.html#a6454a5e01489b59f55be53c206ca929b">13838</a></span> <span class="preprocessor">#define GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_</span></div><div class="line"><a name="l13839"></a><span class="lineno">13839</span> </div><div class="line"><a name="l13840"></a><span class="lineno">13840</span> <span class="preprocessor">#include <iosfwd></span></div><div class="line"><a name="l13841"></a><span class="lineno">13841</span> <span class="preprocessor">#include <vector></span></div><div class="line"><a name="l13842"></a><span class="lineno">13842</span> </div><div class="line"><a name="l13843"></a><span class="lineno">13843</span> <a class="code" href="gtest_8h.html#a86994cc68e844d8b82089c70408dfc61">GTEST_DISABLE_MSC_WARNINGS_PUSH_</a>(4251 \</div><div class="line"><a name="l13844"></a><span class="lineno">13844</span> <span class="comment">/* class A needs to have dll-interface to be used by clients of class B */</span>)</div><div class="line"><a name="l13845"></a><span class="lineno">13845</span> </div><div class="line"><a name="l13846"></a><span class="lineno">13846</span> namespace <a class="code" href="namespacetesting.html">testing</a> {</div><div class="line"><a name="l13847"></a><span class="lineno">13847</span> </div><div class="line"><a name="l13848"></a><span class="lineno">13848</span> <span class="comment">// A copyable object representing the result of a test part (i.e. an</span></div><div class="line"><a name="l13849"></a><span class="lineno">13849</span> <span class="comment">// assertion or an explicit FAIL(), ADD_FAILURE(), or SUCCESS()).</span></div><div class="line"><a name="l13850"></a><span class="lineno">13850</span> <span class="comment">//</span></div><div class="line"><a name="l13851"></a><span class="lineno">13851</span> <span class="comment">// Don't inherit from TestPartResult as its destructor is not virtual.</span></div><div class="line"><a name="l13852"></a><span class="lineno">13852</span> <span class="keyword">class </span><a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> TestPartResult {</div><div class="line"><a name="l13853"></a><span class="lineno">13853</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l13854"></a><span class="lineno">13854</span>  <span class="comment">// The possible outcomes of a test part (i.e. an assertion or an</span></div><div class="line"><a name="l13855"></a><span class="lineno">13855</span>  <span class="comment">// explicit SUCCEED(), FAIL(), or ADD_FAILURE()).</span></div><div class="line"><a name="l13856"></a><span class="lineno">13856</span>  <span class="keyword">enum</span> Type {</div><div class="line"><a name="l13857"></a><span class="lineno">13857</span>  kSuccess, <span class="comment">// Succeeded.</span></div><div class="line"><a name="l13858"></a><span class="lineno">13858</span>  kNonFatalFailure, <span class="comment">// Failed but the test can continue.</span></div><div class="line"><a name="l13859"></a><span class="lineno">13859</span>  kFatalFailure, <span class="comment">// Failed and the test should be terminated.</span></div><div class="line"><a name="l13860"></a><span class="lineno">13860</span>  kSkip <span class="comment">// Skipped.</span></div><div class="line"><a name="l13861"></a><span class="lineno">13861</span>  };</div><div class="line"><a name="l13862"></a><span class="lineno">13862</span> </div><div class="line"><a name="l13863"></a><span class="lineno">13863</span>  <span class="comment">// C'tor. TestPartResult does NOT have a default constructor.</span></div><div class="line"><a name="l13864"></a><span class="lineno">13864</span>  <span class="comment">// Always use this constructor (with parameters) to create a</span></div><div class="line"><a name="l13865"></a><span class="lineno">13865</span>  <span class="comment">// TestPartResult object.</span></div><div class="line"><a name="l13866"></a><span class="lineno">13866</span>  TestPartResult(Type a_type, <span class="keyword">const</span> <span class="keywordtype">char</span>* a_file_name, <span class="keywordtype">int</span> a_line_number,</div><div class="line"><a name="l13867"></a><span class="lineno">13867</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* a_message)</div><div class="line"><a name="l13868"></a><span class="lineno">13868</span>  : type_(a_type),</div><div class="line"><a name="l13869"></a><span class="lineno">13869</span>  file_name_(a_file_name == <span class="keyword">nullptr</span> ? <span class="stringliteral">""</span> : a_file_name),</div><div class="line"><a name="l13870"></a><span class="lineno">13870</span>  line_number_(a_line_number),</div><div class="line"><a name="l13871"></a><span class="lineno">13871</span>  summary_(ExtractSummary(a_message)),</div><div class="line"><a name="l13872"></a><span class="lineno">13872</span>  message_(a_message) {}</div><div class="line"><a name="l13873"></a><span class="lineno">13873</span> </div><div class="line"><a name="l13874"></a><span class="lineno">13874</span>  <span class="comment">// Gets the outcome of the test part.</span></div><div class="line"><a name="l13875"></a><span class="lineno">13875</span>  Type type()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> type_; }</div><div class="line"><a name="l13876"></a><span class="lineno">13876</span> </div><div class="line"><a name="l13877"></a><span class="lineno">13877</span>  <span class="comment">// Gets the name of the source file where the test part took place, or</span></div><div class="line"><a name="l13878"></a><span class="lineno">13878</span>  <span class="comment">// NULL if it's unknown.</span></div><div class="line"><a name="l13879"></a><span class="lineno">13879</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* file_name()<span class="keyword"> const </span>{</div><div class="line"><a name="l13880"></a><span class="lineno">13880</span>  <span class="keywordflow">return</span> file_name_.empty() ? nullptr : file_name_.c_str();</div><div class="line"><a name="l13881"></a><span class="lineno">13881</span>  }</div><div class="line"><a name="l13882"></a><span class="lineno">13882</span> </div><div class="line"><a name="l13883"></a><span class="lineno">13883</span>  <span class="comment">// Gets the line in the source file where the test part took place,</span></div><div class="line"><a name="l13884"></a><span class="lineno">13884</span>  <span class="comment">// or -1 if it's unknown.</span></div><div class="line"><a name="l13885"></a><span class="lineno">13885</span>  <span class="keywordtype">int</span> line_number()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> line_number_; }</div><div class="line"><a name="l13886"></a><span class="lineno">13886</span> </div><div class="line"><a name="l13887"></a><span class="lineno">13887</span>  <span class="comment">// Gets the summary of the failure message.</span></div><div class="line"><a name="l13888"></a><span class="lineno">13888</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* summary()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> summary_.c_str(); }</div><div class="line"><a name="l13889"></a><span class="lineno">13889</span> </div><div class="line"><a name="l13890"></a><span class="lineno">13890</span>  <span class="comment">// Gets the message associated with the test part.</span></div><div class="line"><a name="l13891"></a><span class="lineno">13891</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* message()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> message_.c_str(); }</div><div class="line"><a name="l13892"></a><span class="lineno">13892</span> </div><div class="line"><a name="l13893"></a><span class="lineno">13893</span>  <span class="comment">// Returns true iff the test part was skipped.</span></div><div class="line"><a name="l13894"></a><span class="lineno">13894</span>  <span class="keywordtype">bool</span> skipped()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> type_ == kSkip; }</div><div class="line"><a name="l13895"></a><span class="lineno">13895</span> </div><div class="line"><a name="l13896"></a><span class="lineno">13896</span>  <span class="comment">// Returns true iff the test part passed.</span></div><div class="line"><a name="l13897"></a><span class="lineno">13897</span>  <span class="keywordtype">bool</span> passed()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> type_ == kSuccess; }</div><div class="line"><a name="l13898"></a><span class="lineno">13898</span> </div><div class="line"><a name="l13899"></a><span class="lineno">13899</span>  <span class="comment">// Returns true iff the test part non-fatally failed.</span></div><div class="line"><a name="l13900"></a><span class="lineno">13900</span>  <span class="keywordtype">bool</span> nonfatally_failed()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> type_ == kNonFatalFailure; }</div><div class="line"><a name="l13901"></a><span class="lineno">13901</span> </div><div class="line"><a name="l13902"></a><span class="lineno">13902</span>  <span class="comment">// Returns true iff the test part fatally failed.</span></div><div class="line"><a name="l13903"></a><span class="lineno">13903</span>  <span class="keywordtype">bool</span> fatally_failed()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> type_ == kFatalFailure; }</div><div class="line"><a name="l13904"></a><span class="lineno">13904</span> </div><div class="line"><a name="l13905"></a><span class="lineno">13905</span>  <span class="comment">// Returns true iff the test part failed.</span></div><div class="line"><a name="l13906"></a><span class="lineno">13906</span>  <span class="keywordtype">bool</span> failed()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> fatally_failed() || nonfatally_failed(); }</div><div class="line"><a name="l13907"></a><span class="lineno">13907</span> </div><div class="line"><a name="l13908"></a><span class="lineno">13908</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l13909"></a><span class="lineno">13909</span>  Type type_;</div><div class="line"><a name="l13910"></a><span class="lineno">13910</span> </div><div class="line"><a name="l13911"></a><span class="lineno">13911</span>  <span class="comment">// Gets the summary of the failure message by omitting the stack</span></div><div class="line"><a name="l13912"></a><span class="lineno">13912</span>  <span class="comment">// trace in it.</span></div><div class="line"><a name="l13913"></a><span class="lineno">13913</span>  <span class="keyword">static</span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a> ExtractSummary(<span class="keyword">const</span> <span class="keywordtype">char</span>* message);</div><div class="line"><a name="l13914"></a><span class="lineno">13914</span> </div><div class="line"><a name="l13915"></a><span class="lineno">13915</span>  <span class="comment">// The name of the source file where the test part took place, or</span></div><div class="line"><a name="l13916"></a><span class="lineno">13916</span>  <span class="comment">// "" if the source file is unknown.</span></div><div class="line"><a name="l13917"></a><span class="lineno">13917</span>  <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a> file_name_;</div><div class="line"><a name="l13918"></a><span class="lineno">13918</span>  <span class="comment">// The line in the source file where the test part took place, or -1</span></div><div class="line"><a name="l13919"></a><span class="lineno">13919</span>  <span class="comment">// if the line number is unknown.</span></div><div class="line"><a name="l13920"></a><span class="lineno">13920</span>  <span class="keywordtype">int</span> line_number_;</div><div class="line"><a name="l13921"></a><span class="lineno">13921</span>  <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a> summary_; <span class="comment">// The test failure summary.</span></div><div class="line"><a name="l13922"></a><span class="lineno">13922</span>  <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a> message_; <span class="comment">// The test failure message.</span></div><div class="line"><a name="l13923"></a><span class="lineno">13923</span> };</div><div class="line"><a name="l13924"></a><span class="lineno">13924</span> </div><div class="line"><a name="l13925"></a><span class="lineno">13925</span> <span class="comment">// Prints a TestPartResult object.</span></div><div class="line"><a name="l13926"></a><span class="lineno">13926</span> std::ostream& <a class="code" href="namespacetesting_1_1internal2.html#a07dbe129beb8952074f04b599dfce39b">operator<<</a>(std::ostream& os, <span class="keyword">const</span> TestPartResult& result);</div><div class="line"><a name="l13927"></a><span class="lineno">13927</span> </div><div class="line"><a name="l13928"></a><span class="lineno">13928</span> <span class="comment">// An array of TestPartResult objects.</span></div><div class="line"><a name="l13929"></a><span class="lineno">13929</span> <span class="comment">//</span></div><div class="line"><a name="l13930"></a><span class="lineno">13930</span> <span class="comment">// Don't inherit from TestPartResultArray as its destructor is not</span></div><div class="line"><a name="l13931"></a><span class="lineno">13931</span> <span class="comment">// virtual.</span></div><div class="line"><a name="l13932"></a><span class="lineno">13932</span> <span class="keyword">class </span><a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> TestPartResultArray {</div><div class="line"><a name="l13933"></a><span class="lineno">13933</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l13934"></a><span class="lineno">13934</span>  TestPartResultArray() {}</div><div class="line"><a name="l13935"></a><span class="lineno">13935</span> </div><div class="line"><a name="l13936"></a><span class="lineno">13936</span>  <span class="comment">// Appends the given TestPartResult to the array.</span></div><div class="line"><a name="l13937"></a><span class="lineno">13937</span>  <span class="keywordtype">void</span> Append(<span class="keyword">const</span> TestPartResult& result);</div><div class="line"><a name="l13938"></a><span class="lineno">13938</span> </div><div class="line"><a name="l13939"></a><span class="lineno">13939</span>  <span class="comment">// Returns the TestPartResult at the given index (0-based).</span></div><div class="line"><a name="l13940"></a><span class="lineno">13940</span>  <span class="keyword">const</span> TestPartResult& GetTestPartResult(<span class="keywordtype">int</span> index) <span class="keyword">const</span>;</div><div class="line"><a name="l13941"></a><span class="lineno">13941</span> </div><div class="line"><a name="l13942"></a><span class="lineno">13942</span>  <span class="comment">// Returns the number of TestPartResult objects in the array.</span></div><div class="line"><a name="l13943"></a><span class="lineno">13943</span>  <span class="keywordtype">int</span> <a class="code" href="namespaceutl_1_1meta.html#a0edfc2c15e42531e53c0822264d220ec">size</a>() <span class="keyword">const</span>;</div><div class="line"><a name="l13944"></a><span class="lineno">13944</span> </div><div class="line"><a name="l13945"></a><span class="lineno">13945</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l13946"></a><span class="lineno">13946</span>  std::vector<TestPartResult> array_;</div><div class="line"><a name="l13947"></a><span class="lineno">13947</span> </div><div class="line"><a name="l13948"></a><span class="lineno">13948</span>  <a class="code" href="gtest_8h.html#aed8c1888c32b588b0681e88b95031e29">GTEST_DISALLOW_COPY_AND_ASSIGN_</a>(TestPartResultArray);</div><div class="line"><a name="l13949"></a><span class="lineno">13949</span> };</div><div class="line"><a name="l13950"></a><span class="lineno">13950</span> </div><div class="line"><a name="l13951"></a><span class="lineno">13951</span> <span class="comment">// This interface knows how to report a test part result.</span></div><div class="line"><a name="l13952"></a><span class="lineno">13952</span> <span class="keyword">class </span><a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> TestPartResultReporterInterface {</div><div class="line"><a name="l13953"></a><span class="lineno">13953</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l13954"></a><span class="lineno">13954</span>  <span class="keyword">virtual</span> ~TestPartResultReporterInterface() {}</div><div class="line"><a name="l13955"></a><span class="lineno">13955</span> </div><div class="line"><a name="l13956"></a><span class="lineno">13956</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> ReportTestPartResult(<span class="keyword">const</span> TestPartResult& result) = 0;</div><div class="line"><a name="l13957"></a><span class="lineno">13957</span> };</div><div class="line"><a name="l13958"></a><span class="lineno">13958</span> </div><div class="line"><a name="l13959"></a><span class="lineno">13959</span> <span class="keyword">namespace </span>internal {</div><div class="line"><a name="l13960"></a><span class="lineno">13960</span> </div><div class="line"><a name="l13961"></a><span class="lineno">13961</span> <span class="comment">// This helper class is used by {ASSERT|EXPECT}_NO_FATAL_FAILURE to check if a</span></div><div class="line"><a name="l13962"></a><span class="lineno">13962</span> <span class="comment">// statement generates new fatal failures. To do so it registers itself as the</span></div><div class="line"><a name="l13963"></a><span class="lineno">13963</span> <span class="comment">// current test part result reporter. Besides checking if fatal failures were</span></div><div class="line"><a name="l13964"></a><span class="lineno">13964</span> <span class="comment">// reported, it only delegates the reporting to the former result reporter.</span></div><div class="line"><a name="l13965"></a><span class="lineno">13965</span> <span class="comment">// The original result reporter is restored in the destructor.</span></div><div class="line"><a name="l13966"></a><span class="lineno">13966</span> <span class="comment">// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.</span></div><div class="line"><a name="l13967"></a><span class="lineno">13967</span> <span class="keyword">class </span><a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> HasNewFatalFailureHelper</div><div class="line"><a name="l13968"></a><span class="lineno">13968</span>  : <span class="keyword">public</span> TestPartResultReporterInterface {</div><div class="line"><a name="l13969"></a><span class="lineno">13969</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l13970"></a><span class="lineno">13970</span>  HasNewFatalFailureHelper();</div><div class="line"><a name="l13971"></a><span class="lineno">13971</span>  ~HasNewFatalFailureHelper() <span class="keyword">override</span>;</div><div class="line"><a name="l13972"></a><span class="lineno">13972</span>  <span class="keywordtype">void</span> ReportTestPartResult(<span class="keyword">const</span> TestPartResult& result) <span class="keyword">override</span>;</div><div class="line"><a name="l13973"></a><span class="lineno">13973</span>  <span class="keywordtype">bool</span> has_new_fatal_failure()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> has_new_fatal_failure_; }</div><div class="line"><a name="l13974"></a><span class="lineno">13974</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l13975"></a><span class="lineno">13975</span>  <span class="keywordtype">bool</span> has_new_fatal_failure_;</div><div class="line"><a name="l13976"></a><span class="lineno">13976</span>  TestPartResultReporterInterface* original_reporter_;</div><div class="line"><a name="l13977"></a><span class="lineno">13977</span> </div><div class="line"><a name="l13978"></a><span class="lineno">13978</span>  <a class="code" href="gtest_8h.html#aed8c1888c32b588b0681e88b95031e29">GTEST_DISALLOW_COPY_AND_ASSIGN_</a>(HasNewFatalFailureHelper);</div><div class="line"><a name="l13979"></a><span class="lineno">13979</span> };</div><div class="line"><a name="l13980"></a><span class="lineno">13980</span> </div><div class="line"><a name="l13981"></a><span class="lineno">13981</span> } <span class="comment">// namespace internal</span></div><div class="line"><a name="l13982"></a><span class="lineno">13982</span> </div><div class="line"><a name="l13983"></a><span class="lineno">13983</span> } <span class="comment">// namespace testing</span></div><div class="line"><a name="l13984"></a><span class="lineno">13984</span> </div><div class="line"><a name="l13985"></a><span class="lineno">13985</span> <a class="code" href="gtest_8h.html#aebf8277c9069c1e124f9a5bbe2948061">GTEST_DISABLE_MSC_WARNINGS_POP_</a>() <span class="comment">// 4251</span></div><div class="line"><a name="l13986"></a><span class="lineno">13986</span> </div><div class="line"><a name="l13987"></a><span class="lineno">13987</span> <span class="preprocessor">#endif // GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_</span></div><div class="line"><a name="l13988"></a><span class="lineno">13988</span> <span class="comment">// Copyright 2008 Google Inc.</span></div><div class="line"><a name="l13989"></a><span class="lineno">13989</span> <span class="comment">// All Rights Reserved.</span></div><div class="line"><a name="l13990"></a><span class="lineno">13990</span> <span class="comment">//</span></div><div class="line"><a name="l13991"></a><span class="lineno">13991</span> <span class="comment">// Redistribution and use in source and binary forms, with or without</span></div><div class="line"><a name="l13992"></a><span class="lineno">13992</span> <span class="comment">// modification, are permitted provided that the following conditions are</span></div><div class="line"><a name="l13993"></a><span class="lineno">13993</span> <span class="comment">// met:</span></div><div class="line"><a name="l13994"></a><span class="lineno">13994</span> <span class="comment">//</span></div><div class="line"><a name="l13995"></a><span class="lineno">13995</span> <span class="comment">// * Redistributions of source code must retain the above copyright</span></div><div class="line"><a name="l13996"></a><span class="lineno">13996</span> <span class="comment">// notice, this list of conditions and the following disclaimer.</span></div><div class="line"><a name="l13997"></a><span class="lineno">13997</span> <span class="comment">// * Redistributions in binary form must reproduce the above</span></div><div class="line"><a name="l13998"></a><span class="lineno">13998</span> <span class="comment">// copyright notice, this list of conditions and the following disclaimer</span></div><div class="line"><a name="l13999"></a><span class="lineno">13999</span> <span class="comment">// in the documentation and/or other materials provided with the</span></div><div class="line"><a name="l14000"></a><span class="lineno">14000</span> <span class="comment">// distribution.</span></div><div class="line"><a name="l14001"></a><span class="lineno">14001</span> <span class="comment">// * Neither the name of Google Inc. nor the names of its</span></div><div class="line"><a name="l14002"></a><span class="lineno">14002</span> <span class="comment">// contributors may be used to endorse or promote products derived from</span></div><div class="line"><a name="l14003"></a><span class="lineno">14003</span> <span class="comment">// this software without specific prior written permission.</span></div><div class="line"><a name="l14004"></a><span class="lineno">14004</span> <span class="comment">//</span></div><div class="line"><a name="l14005"></a><span class="lineno">14005</span> <span class="comment">// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS</span></div><div class="line"><a name="l14006"></a><span class="lineno">14006</span> <span class="comment">// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT</span></div><div class="line"><a name="l14007"></a><span class="lineno">14007</span> <span class="comment">// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR</span></div><div class="line"><a name="l14008"></a><span class="lineno">14008</span> <span class="comment">// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT</span></div><div class="line"><a name="l14009"></a><span class="lineno">14009</span> <span class="comment">// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,</span></div><div class="line"><a name="l14010"></a><span class="lineno">14010</span> <span class="comment">// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT</span></div><div class="line"><a name="l14011"></a><span class="lineno">14011</span> <span class="comment">// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,</span></div><div class="line"><a name="l14012"></a><span class="lineno">14012</span> <span class="comment">// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY</span></div><div class="line"><a name="l14013"></a><span class="lineno">14013</span> <span class="comment">// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</span></div><div class="line"><a name="l14014"></a><span class="lineno">14014</span> <span class="comment">// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE</span></div><div class="line"><a name="l14015"></a><span class="lineno">14015</span> <span class="comment">// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span></div><div class="line"><a name="l14016"></a><span class="lineno">14016</span> </div><div class="line"><a name="l14017"></a><span class="lineno">14017</span> </div><div class="line"><a name="l14018"></a><span class="lineno">14018</span> <span class="comment">// GOOGLETEST_CM0001 DO NOT DELETE</span></div><div class="line"><a name="l14019"></a><span class="lineno">14019</span> </div><div class="line"><a name="l14020"></a><span class="lineno">14020</span> <span class="preprocessor">#ifndef GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_</span></div><div class="line"><a name="l14021"></a><span class="lineno">14021</span> <span class="preprocessor">#define GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_</span></div><div class="line"><a name="l14022"></a><span class="lineno">14022</span> </div><div class="line"><a name="l14023"></a><span class="lineno">14023</span> <span class="comment">// This header implements typed tests and type-parameterized tests.</span></div><div class="line"><a name="l14024"></a><span class="lineno">14024</span> </div><div class="line"><a name="l14025"></a><span class="lineno">14025</span> <span class="comment">// Typed (aka type-driven) tests repeat the same test for types in a</span></div><div class="line"><a name="l14026"></a><span class="lineno">14026</span> <span class="comment">// list. You must know which types you want to test with when writing</span></div><div class="line"><a name="l14027"></a><span class="lineno">14027</span> <span class="comment">// typed tests. Here's how you do it:</span></div><div class="line"><a name="l14028"></a><span class="lineno">14028</span> </div><div class="line"><a name="l14029"></a><span class="lineno">14029</span> <span class="preprocessor">#if 0</span></div><div class="line"><a name="l14030"></a><span class="lineno">14030</span> </div><div class="line"><a name="l14031"></a><span class="lineno">14031</span> <span class="comment">// First, define a fixture class template. It should be parameterized</span></div><div class="line"><a name="l14032"></a><span class="lineno">14032</span> <span class="comment">// by a type. Remember to derive it from testing::Test.</span></div><div class="line"><a name="l14033"></a><span class="lineno">14033</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l14034"></a><span class="lineno">14034</span> <span class="keyword">class </span>FooTest : <span class="keyword">public</span> <a class="code" href="classtesting_1_1_test.html">testing::Test</a> {</div><div class="line"><a name="l14035"></a><span class="lineno">14035</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l14036"></a><span class="lineno">14036</span>  ...</div><div class="line"><a name="l14037"></a><span class="lineno">14037</span>  <span class="keyword">typedef</span> std::list<T> List;</div><div class="line"><a name="l14038"></a><span class="lineno">14038</span>  <span class="keyword">static</span> T shared_;</div><div class="line"><a name="l14039"></a><span class="lineno">14039</span>  T value_;</div><div class="line"><a name="l14040"></a><span class="lineno">14040</span> };</div><div class="line"><a name="l14041"></a><span class="lineno">14041</span> </div><div class="line"><a name="l14042"></a><span class="lineno">14042</span> <span class="comment">// Next, associate a list of types with the test suite, which will be</span></div><div class="line"><a name="l14043"></a><span class="lineno">14043</span> <span class="comment">// repeated for each type in the list. The typedef is necessary for</span></div><div class="line"><a name="l14044"></a><span class="lineno">14044</span> <span class="comment">// the macro to parse correctly.</span></div><div class="line"><a name="l14045"></a><span class="lineno">14045</span> <span class="keyword">typedef</span> testing::Types<char, int, unsigned int> MyTypes;</div><div class="line"><a name="l14046"></a><span class="lineno">14046</span> TYPED_TEST_SUITE(FooTest, MyTypes);</div><div class="line"><a name="l14047"></a><span class="lineno">14047</span> </div><div class="line"><a name="l14048"></a><span class="lineno">14048</span> <span class="comment">// If the type list contains only one type, you can write that type</span></div><div class="line"><a name="l14049"></a><span class="lineno">14049</span> <span class="comment">// directly without Types<...>:</span></div><div class="line"><a name="l14050"></a><span class="lineno">14050</span> <span class="comment">// TYPED_TEST_SUITE(FooTest, int);</span></div><div class="line"><a name="l14051"></a><span class="lineno">14051</span> </div><div class="line"><a name="l14052"></a><span class="lineno">14052</span> <span class="comment">// Then, use TYPED_TEST() instead of TEST_F() to define as many typed</span></div><div class="line"><a name="l14053"></a><span class="lineno">14053</span> <span class="comment">// tests for this test suite as you want.</span></div><div class="line"><a name="l14054"></a><span class="lineno">14054</span> TYPED_TEST(FooTest, DoesBlah) {</div><div class="line"><a name="l14055"></a><span class="lineno">14055</span>  <span class="comment">// Inside a test, refer to TypeParam to get the type parameter.</span></div><div class="line"><a name="l14056"></a><span class="lineno">14056</span>  <span class="comment">// Since we are inside a derived class template, C++ requires use to</span></div><div class="line"><a name="l14057"></a><span class="lineno">14057</span>  <span class="comment">// visit the members of FooTest via 'this'.</span></div><div class="line"><a name="l14058"></a><span class="lineno">14058</span>  TypeParam n = this->value_;</div><div class="line"><a name="l14059"></a><span class="lineno">14059</span> </div><div class="line"><a name="l14060"></a><span class="lineno">14060</span>  <span class="comment">// To visit static members of the fixture, add the TestFixture::</span></div><div class="line"><a name="l14061"></a><span class="lineno">14061</span>  <span class="comment">// prefix.</span></div><div class="line"><a name="l14062"></a><span class="lineno">14062</span>  n += TestFixture::shared_;</div><div class="line"><a name="l14063"></a><span class="lineno">14063</span> </div><div class="line"><a name="l14064"></a><span class="lineno">14064</span>  <span class="comment">// To refer to typedefs in the fixture, add the "typename</span></div><div class="line"><a name="l14065"></a><span class="lineno">14065</span>  <span class="comment">// TestFixture::" prefix.</span></div><div class="line"><a name="l14066"></a><span class="lineno">14066</span>  <span class="keyword">typename</span> TestFixture::List values;</div><div class="line"><a name="l14067"></a><span class="lineno">14067</span>  values.push_back(n);</div><div class="line"><a name="l14068"></a><span class="lineno">14068</span>  ...</div><div class="line"><a name="l14069"></a><span class="lineno">14069</span> }</div><div class="line"><a name="l14070"></a><span class="lineno">14070</span> </div><div class="line"><a name="l14071"></a><span class="lineno">14071</span> TYPED_TEST(FooTest, HasPropertyA) { ... }</div><div class="line"><a name="l14072"></a><span class="lineno">14072</span> </div><div class="line"><a name="l14073"></a><span class="lineno">14073</span> <span class="comment">// TYPED_TEST_SUITE takes an optional third argument which allows to specify a</span></div><div class="line"><a name="l14074"></a><span class="lineno">14074</span> <span class="comment">// class that generates custom test name suffixes based on the type. This should</span></div><div class="line"><a name="l14075"></a><span class="lineno">14075</span> <span class="comment">// be a class which has a static template function GetName(int index) returning</span></div><div class="line"><a name="l14076"></a><span class="lineno">14076</span> <span class="comment">// a string for each type. The provided integer index equals the index of the</span></div><div class="line"><a name="l14077"></a><span class="lineno">14077</span> <span class="comment">// type in the provided type list. In many cases the index can be ignored.</span></div><div class="line"><a name="l14078"></a><span class="lineno">14078</span> <span class="comment">//</span></div><div class="line"><a name="l14079"></a><span class="lineno">14079</span> <span class="comment">// For example:</span></div><div class="line"><a name="l14080"></a><span class="lineno">14080</span> <span class="comment">// class MyTypeNames {</span></div><div class="line"><a name="l14081"></a><span class="lineno">14081</span> <span class="comment">// public:</span></div><div class="line"><a name="l14082"></a><span class="lineno">14082</span> <span class="comment">// template <typename T></span></div><div class="line"><a name="l14083"></a><span class="lineno">14083</span> <span class="comment">// static std::string GetName(int) {</span></div><div class="line"><a name="l14084"></a><span class="lineno">14084</span> <span class="comment">// if (std::is_same<T, char>()) return "char";</span></div><div class="line"><a name="l14085"></a><span class="lineno">14085</span> <span class="comment">// if (std::is_same<T, int>()) return "int";</span></div><div class="line"><a name="l14086"></a><span class="lineno">14086</span> <span class="comment">// if (std::is_same<T, unsigned int>()) return "unsignedInt";</span></div><div class="line"><a name="l14087"></a><span class="lineno">14087</span> <span class="comment">// }</span></div><div class="line"><a name="l14088"></a><span class="lineno">14088</span> <span class="comment">// };</span></div><div class="line"><a name="l14089"></a><span class="lineno">14089</span> <span class="comment">// TYPED_TEST_SUITE(FooTest, MyTypes, MyTypeNames);</span></div><div class="line"><a name="l14090"></a><span class="lineno">14090</span> </div><div class="line"><a name="l14091"></a><span class="lineno">14091</span> <span class="preprocessor">#endif // 0</span></div><div class="line"><a name="l14092"></a><span class="lineno">14092</span> </div><div class="line"><a name="l14093"></a><span class="lineno">14093</span> <span class="comment">// Type-parameterized tests are abstract test patterns parameterized</span></div><div class="line"><a name="l14094"></a><span class="lineno">14094</span> <span class="comment">// by a type. Compared with typed tests, type-parameterized tests</span></div><div class="line"><a name="l14095"></a><span class="lineno">14095</span> <span class="comment">// allow you to define the test pattern without knowing what the type</span></div><div class="line"><a name="l14096"></a><span class="lineno">14096</span> <span class="comment">// parameters are. The defined pattern can be instantiated with</span></div><div class="line"><a name="l14097"></a><span class="lineno">14097</span> <span class="comment">// different types any number of times, in any number of translation</span></div><div class="line"><a name="l14098"></a><span class="lineno">14098</span> <span class="comment">// units.</span></div><div class="line"><a name="l14099"></a><span class="lineno">14099</span> <span class="comment">//</span></div><div class="line"><a name="l14100"></a><span class="lineno">14100</span> <span class="comment">// If you are designing an interface or concept, you can define a</span></div><div class="line"><a name="l14101"></a><span class="lineno">14101</span> <span class="comment">// suite of type-parameterized tests to verify properties that any</span></div><div class="line"><a name="l14102"></a><span class="lineno">14102</span> <span class="comment">// valid implementation of the interface/concept should have. Then,</span></div><div class="line"><a name="l14103"></a><span class="lineno">14103</span> <span class="comment">// each implementation can easily instantiate the test suite to verify</span></div><div class="line"><a name="l14104"></a><span class="lineno">14104</span> <span class="comment">// that it conforms to the requirements, without having to write</span></div><div class="line"><a name="l14105"></a><span class="lineno">14105</span> <span class="comment">// similar tests repeatedly. Here's an example:</span></div><div class="line"><a name="l14106"></a><span class="lineno">14106</span> </div><div class="line"><a name="l14107"></a><span class="lineno">14107</span> <span class="preprocessor">#if 0</span></div><div class="line"><a name="l14108"></a><span class="lineno">14108</span> </div><div class="line"><a name="l14109"></a><span class="lineno">14109</span> <span class="comment">// First, define a fixture class template. It should be parameterized</span></div><div class="line"><a name="l14110"></a><span class="lineno">14110</span> <span class="comment">// by a type. Remember to derive it from testing::Test.</span></div><div class="line"><a name="l14111"></a><span class="lineno">14111</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l14112"></a><span class="lineno">14112</span> <span class="keyword">class </span>FooTest : <span class="keyword">public</span> <a class="code" href="classtesting_1_1_test.html">testing::Test</a> {</div><div class="line"><a name="l14113"></a><span class="lineno">14113</span>  ...</div><div class="line"><a name="l14114"></a><span class="lineno">14114</span> };</div><div class="line"><a name="l14115"></a><span class="lineno">14115</span> </div><div class="line"><a name="l14116"></a><span class="lineno">14116</span> <span class="comment">// Next, declare that you will define a type-parameterized test suite</span></div><div class="line"><a name="l14117"></a><span class="lineno">14117</span> <span class="comment">// (the _P suffix is for "parameterized" or "pattern", whichever you</span></div><div class="line"><a name="l14118"></a><span class="lineno">14118</span> <span class="comment">// prefer):</span></div><div class="line"><a name="l14119"></a><span class="lineno">14119</span> TYPED_TEST_SUITE_P(FooTest);</div><div class="line"><a name="l14120"></a><span class="lineno">14120</span> </div><div class="line"><a name="l14121"></a><span class="lineno">14121</span> <span class="comment">// Then, use TYPED_TEST_P() to define as many type-parameterized tests</span></div><div class="line"><a name="l14122"></a><span class="lineno">14122</span> <span class="comment">// for this type-parameterized test suite as you want.</span></div><div class="line"><a name="l14123"></a><span class="lineno">14123</span> TYPED_TEST_P(FooTest, DoesBlah) {</div><div class="line"><a name="l14124"></a><span class="lineno">14124</span>  <span class="comment">// Inside a test, refer to TypeParam to get the type parameter.</span></div><div class="line"><a name="l14125"></a><span class="lineno">14125</span>  TypeParam n = 0;</div><div class="line"><a name="l14126"></a><span class="lineno">14126</span>  ...</div><div class="line"><a name="l14127"></a><span class="lineno">14127</span> }</div><div class="line"><a name="l14128"></a><span class="lineno">14128</span> </div><div class="line"><a name="l14129"></a><span class="lineno">14129</span> TYPED_TEST_P(FooTest, HasPropertyA) { ... }</div><div class="line"><a name="l14130"></a><span class="lineno">14130</span> </div><div class="line"><a name="l14131"></a><span class="lineno">14131</span> <span class="comment">// Now the tricky part: you need to register all test patterns before</span></div><div class="line"><a name="l14132"></a><span class="lineno">14132</span> <span class="comment">// you can instantiate them. The first argument of the macro is the</span></div><div class="line"><a name="l14133"></a><span class="lineno">14133</span> <span class="comment">// test suite name; the rest are the names of the tests in this test</span></div><div class="line"><a name="l14134"></a><span class="lineno">14134</span> <span class="comment">// case.</span></div><div class="line"><a name="l14135"></a><span class="lineno">14135</span> REGISTER_TYPED_TEST_SUITE_P(FooTest,</div><div class="line"><a name="l14136"></a><span class="lineno">14136</span>  DoesBlah, HasPropertyA);</div><div class="line"><a name="l14137"></a><span class="lineno">14137</span> </div><div class="line"><a name="l14138"></a><span class="lineno">14138</span> <span class="comment">// Finally, you are free to instantiate the pattern with the types you</span></div><div class="line"><a name="l14139"></a><span class="lineno">14139</span> <span class="comment">// want. If you put the above code in a header file, you can #include</span></div><div class="line"><a name="l14140"></a><span class="lineno">14140</span> <span class="comment">// it in multiple C++ source files and instantiate it multiple times.</span></div><div class="line"><a name="l14141"></a><span class="lineno">14141</span> <span class="comment">//</span></div><div class="line"><a name="l14142"></a><span class="lineno">14142</span> <span class="comment">// To distinguish different instances of the pattern, the first</span></div><div class="line"><a name="l14143"></a><span class="lineno">14143</span> <span class="comment">// argument to the INSTANTIATE_* macro is a prefix that will be added</span></div><div class="line"><a name="l14144"></a><span class="lineno">14144</span> <span class="comment">// to the actual test suite name. Remember to pick unique prefixes for</span></div><div class="line"><a name="l14145"></a><span class="lineno">14145</span> <span class="comment">// different instances.</span></div><div class="line"><a name="l14146"></a><span class="lineno">14146</span> <span class="keyword">typedef</span> testing::Types<char, int, unsigned int> MyTypes;</div><div class="line"><a name="l14147"></a><span class="lineno">14147</span> INSTANTIATE_TYPED_TEST_SUITE_P(My, FooTest, MyTypes);</div><div class="line"><a name="l14148"></a><span class="lineno">14148</span> </div><div class="line"><a name="l14149"></a><span class="lineno">14149</span> <span class="comment">// If the type list contains only one type, you can write that type</span></div><div class="line"><a name="l14150"></a><span class="lineno">14150</span> <span class="comment">// directly without Types<...>:</span></div><div class="line"><a name="l14151"></a><span class="lineno">14151</span> <span class="comment">// INSTANTIATE_TYPED_TEST_SUITE_P(My, FooTest, int);</span></div><div class="line"><a name="l14152"></a><span class="lineno">14152</span> <span class="comment">//</span></div><div class="line"><a name="l14153"></a><span class="lineno">14153</span> <span class="comment">// Similar to the optional argument of TYPED_TEST_SUITE above,</span></div><div class="line"><a name="l14154"></a><span class="lineno">14154</span> <span class="comment">// INSTANTIATE_TEST_SUITE_P takes an optional fourth argument which allows to</span></div><div class="line"><a name="l14155"></a><span class="lineno">14155</span> <span class="comment">// generate custom names.</span></div><div class="line"><a name="l14156"></a><span class="lineno">14156</span> <span class="comment">// INSTANTIATE_TYPED_TEST_SUITE_P(My, FooTest, MyTypes, MyTypeNames);</span></div><div class="line"><a name="l14157"></a><span class="lineno">14157</span> </div><div class="line"><a name="l14158"></a><span class="lineno">14158</span> <span class="preprocessor">#endif // 0</span></div><div class="line"><a name="l14159"></a><span class="lineno">14159</span> </div><div class="line"><a name="l14160"></a><span class="lineno">14160</span> </div><div class="line"><a name="l14161"></a><span class="lineno">14161</span> <span class="comment">// Implements typed tests.</span></div><div class="line"><a name="l14162"></a><span class="lineno">14162</span> </div><div class="line"><a name="l14163"></a><span class="lineno">14163</span> <span class="preprocessor">#if GTEST_HAS_TYPED_TEST</span></div><div class="line"><a name="l14164"></a><span class="lineno">14164</span> </div><div class="line"><a name="l14165"></a><span class="lineno">14165</span> <span class="comment">// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.</span></div><div class="line"><a name="l14166"></a><span class="lineno">14166</span> <span class="comment">//</span></div><div class="line"><a name="l14167"></a><span class="lineno">14167</span> <span class="comment">// Expands to the name of the typedef for the type parameters of the</span></div><div class="line"><a name="l14168"></a><span class="lineno">14168</span> <span class="comment">// given test suite.</span></div><div class="line"><a name="l14169"></a><span class="lineno">14169</span> <span class="preprocessor">#define GTEST_TYPE_PARAMS_(TestSuiteName) gtest_type_params_##TestSuiteName##_</span></div><div class="line"><a name="l14170"></a><span class="lineno">14170</span> </div><div class="line"><a name="l14171"></a><span class="lineno">14171</span> <span class="comment">// Expands to the name of the typedef for the NameGenerator, responsible for</span></div><div class="line"><a name="l14172"></a><span class="lineno">14172</span> <span class="comment">// creating the suffixes of the name.</span></div><div class="line"><a name="l14173"></a><span class="lineno">14173</span> <span class="preprocessor">#define GTEST_NAME_GENERATOR_(TestSuiteName) \</span></div><div class="line"><a name="l14174"></a><span class="lineno">14174</span> <span class="preprocessor"> gtest_type_params_##TestSuiteName##_NameGenerator</span></div><div class="line"><a name="l14175"></a><span class="lineno">14175</span> </div><div class="line"><a name="l14176"></a><span class="lineno">14176</span> <span class="comment">// The 'Types' template argument below must have spaces around it</span></div><div class="line"><a name="l14177"></a><span class="lineno">14177</span> <span class="comment">// since some compilers may choke on '>>' when passing a template</span></div><div class="line"><a name="l14178"></a><span class="lineno">14178</span> <span class="comment">// instance (e.g. Types<int>)</span></div><div class="line"><a name="l14179"></a><span class="lineno">14179</span> <span class="preprocessor">#define TYPED_TEST_SUITE(CaseName, Types, ...) \</span></div><div class="line"><a name="l14180"></a><span class="lineno">14180</span> <span class="preprocessor"> typedef ::testing::internal::TypeList<Types>::type GTEST_TYPE_PARAMS_( \</span></div><div class="line"><a name="l14181"></a><span class="lineno">14181</span> <span class="preprocessor"> CaseName); \</span></div><div class="line"><a name="l14182"></a><span class="lineno">14182</span> <span class="preprocessor"> typedef ::testing::internal::NameGeneratorSelector<__VA_ARGS__>::type \</span></div><div class="line"><a name="l14183"></a><span class="lineno">14183</span> <span class="preprocessor"> GTEST_NAME_GENERATOR_(CaseName)</span></div><div class="line"><a name="l14184"></a><span class="lineno">14184</span> </div><div class="line"><a name="l14185"></a><span class="lineno">14185</span> <span class="preprocessor"># define TYPED_TEST(CaseName, TestName) \</span></div><div class="line"><a name="l14186"></a><span class="lineno">14186</span> <span class="preprocessor"> template <typename gtest_TypeParam_> \</span></div><div class="line"><a name="l14187"></a><span class="lineno">14187</span> <span class="preprocessor"> class GTEST_TEST_CLASS_NAME_(CaseName, TestName) \</span></div><div class="line"><a name="l14188"></a><span class="lineno">14188</span> <span class="preprocessor"> : public CaseName<gtest_TypeParam_> { \</span></div><div class="line"><a name="l14189"></a><span class="lineno">14189</span> <span class="preprocessor"> private: \</span></div><div class="line"><a name="l14190"></a><span class="lineno">14190</span> <span class="preprocessor"> typedef CaseName<gtest_TypeParam_> TestFixture; \</span></div><div class="line"><a name="l14191"></a><span class="lineno">14191</span> <span class="preprocessor"> typedef gtest_TypeParam_ TypeParam; \</span></div><div class="line"><a name="l14192"></a><span class="lineno">14192</span> <span class="preprocessor"> virtual void TestBody(); \</span></div><div class="line"><a name="l14193"></a><span class="lineno">14193</span> <span class="preprocessor"> }; \</span></div><div class="line"><a name="l14194"></a><span class="lineno">14194</span> <span class="preprocessor"> static bool gtest_##CaseName##_##TestName##_registered_ \</span></div><div class="line"><a name="l14195"></a><span class="lineno">14195</span> <span class="preprocessor"> GTEST_ATTRIBUTE_UNUSED_ = \</span></div><div class="line"><a name="l14196"></a><span class="lineno">14196</span> <span class="preprocessor"> ::testing::internal::TypeParameterizedTest< \</span></div><div class="line"><a name="l14197"></a><span class="lineno">14197</span> <span class="preprocessor"> CaseName, \</span></div><div class="line"><a name="l14198"></a><span class="lineno">14198</span> <span class="preprocessor"> ::testing::internal::TemplateSel<GTEST_TEST_CLASS_NAME_(CaseName, \</span></div><div class="line"><a name="l14199"></a><span class="lineno">14199</span> <span class="preprocessor"> TestName)>, \</span></div><div class="line"><a name="l14200"></a><span class="lineno">14200</span> <span class="preprocessor"> GTEST_TYPE_PARAMS_( \</span></div><div class="line"><a name="l14201"></a><span class="lineno">14201</span> <span class="preprocessor"> CaseName)>::Register("", \</span></div><div class="line"><a name="l14202"></a><span class="lineno">14202</span> <span class="preprocessor"> ::testing::internal::CodeLocation( \</span></div><div class="line"><a name="l14203"></a><span class="lineno">14203</span> <span class="preprocessor"> __FILE__, __LINE__), \</span></div><div class="line"><a name="l14204"></a><span class="lineno">14204</span> <span class="preprocessor"> #CaseName, #TestName, 0, \</span></div><div class="line"><a name="l14205"></a><span class="lineno">14205</span> <span class="preprocessor"> ::testing::internal::GenerateNames< \</span></div><div class="line"><a name="l14206"></a><span class="lineno">14206</span> <span class="preprocessor"> GTEST_NAME_GENERATOR_(CaseName), \</span></div><div class="line"><a name="l14207"></a><span class="lineno">14207</span> <span class="preprocessor"> GTEST_TYPE_PARAMS_(CaseName)>()); \</span></div><div class="line"><a name="l14208"></a><span class="lineno">14208</span> <span class="preprocessor"> template <typename gtest_TypeParam_> \</span></div><div class="line"><a name="l14209"></a><span class="lineno">14209</span> <span class="preprocessor"> void GTEST_TEST_CLASS_NAME_(CaseName, \</span></div><div class="line"><a name="l14210"></a><span class="lineno">14210</span> <span class="preprocessor"> TestName)<gtest_TypeParam_>::TestBody()</span></div><div class="line"><a name="l14211"></a><span class="lineno">14211</span> </div><div class="line"><a name="l14212"></a><span class="lineno">14212</span> <span class="comment">// Legacy API is deprecated but still available</span></div><div class="line"><a name="l14213"></a><span class="lineno">14213</span> <span class="preprocessor">#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_</span></div><div class="line"><a name="l14214"></a><span class="lineno">14214</span> <span class="preprocessor">#define TYPED_TEST_CASE TYPED_TEST_SUITE</span></div><div class="line"><a name="l14215"></a><span class="lineno">14215</span> <span class="preprocessor">#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_</span></div><div class="line"><a name="l14216"></a><span class="lineno">14216</span> </div><div class="line"><a name="l14217"></a><span class="lineno">14217</span> <span class="preprocessor">#endif // GTEST_HAS_TYPED_TEST</span></div><div class="line"><a name="l14218"></a><span class="lineno">14218</span> </div><div class="line"><a name="l14219"></a><span class="lineno">14219</span> <span class="comment">// Implements type-parameterized tests.</span></div><div class="line"><a name="l14220"></a><span class="lineno">14220</span> </div><div class="line"><a name="l14221"></a><span class="lineno">14221</span> <span class="preprocessor">#if GTEST_HAS_TYPED_TEST_P</span></div><div class="line"><a name="l14222"></a><span class="lineno">14222</span> </div><div class="line"><a name="l14223"></a><span class="lineno">14223</span> <span class="comment">// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.</span></div><div class="line"><a name="l14224"></a><span class="lineno">14224</span> <span class="comment">//</span></div><div class="line"><a name="l14225"></a><span class="lineno">14225</span> <span class="comment">// Expands to the namespace name that the type-parameterized tests for</span></div><div class="line"><a name="l14226"></a><span class="lineno">14226</span> <span class="comment">// the given type-parameterized test suite are defined in. The exact</span></div><div class="line"><a name="l14227"></a><span class="lineno">14227</span> <span class="comment">// name of the namespace is subject to change without notice.</span></div><div class="line"><a name="l14228"></a><span class="lineno">14228</span> <span class="preprocessor">#define GTEST_SUITE_NAMESPACE_(TestSuiteName) gtest_suite_##TestSuiteName##_</span></div><div class="line"><a name="l14229"></a><span class="lineno">14229</span> </div><div class="line"><a name="l14230"></a><span class="lineno">14230</span> <span class="comment">// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.</span></div><div class="line"><a name="l14231"></a><span class="lineno">14231</span> <span class="comment">//</span></div><div class="line"><a name="l14232"></a><span class="lineno">14232</span> <span class="comment">// Expands to the name of the variable used to remember the names of</span></div><div class="line"><a name="l14233"></a><span class="lineno">14233</span> <span class="comment">// the defined tests in the given test suite.</span></div><div class="line"><a name="l14234"></a><span class="lineno">14234</span> <span class="preprocessor">#define GTEST_TYPED_TEST_SUITE_P_STATE_(TestSuiteName) \</span></div><div class="line"><a name="l14235"></a><span class="lineno">14235</span> <span class="preprocessor"> gtest_typed_test_suite_p_state_##TestSuiteName##_</span></div><div class="line"><a name="l14236"></a><span class="lineno">14236</span> </div><div class="line"><a name="l14237"></a><span class="lineno">14237</span> <span class="comment">// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE DIRECTLY.</span></div><div class="line"><a name="l14238"></a><span class="lineno">14238</span> <span class="comment">//</span></div><div class="line"><a name="l14239"></a><span class="lineno">14239</span> <span class="comment">// Expands to the name of the variable used to remember the names of</span></div><div class="line"><a name="l14240"></a><span class="lineno">14240</span> <span class="comment">// the registered tests in the given test suite.</span></div><div class="line"><a name="l14241"></a><span class="lineno">14241</span> <span class="preprocessor">#define GTEST_REGISTERED_TEST_NAMES_(TestSuiteName) \</span></div><div class="line"><a name="l14242"></a><span class="lineno">14242</span> <span class="preprocessor"> gtest_registered_test_names_##TestSuiteName##_</span></div><div class="line"><a name="l14243"></a><span class="lineno">14243</span> </div><div class="line"><a name="l14244"></a><span class="lineno">14244</span> <span class="comment">// The variables defined in the type-parameterized test macros are</span></div><div class="line"><a name="l14245"></a><span class="lineno">14245</span> <span class="comment">// static as typically these macros are used in a .h file that can be</span></div><div class="line"><a name="l14246"></a><span class="lineno">14246</span> <span class="comment">// #included in multiple translation units linked together.</span></div><div class="line"><a name="l14247"></a><span class="lineno">14247</span> <span class="preprocessor">#define TYPED_TEST_SUITE_P(SuiteName) \</span></div><div class="line"><a name="l14248"></a><span class="lineno">14248</span> <span class="preprocessor"> static ::testing::internal::TypedTestSuitePState \</span></div><div class="line"><a name="l14249"></a><span class="lineno">14249</span> <span class="preprocessor"> GTEST_TYPED_TEST_SUITE_P_STATE_(SuiteName)</span></div><div class="line"><a name="l14250"></a><span class="lineno">14250</span> </div><div class="line"><a name="l14251"></a><span class="lineno">14251</span> <span class="comment">// Legacy API is deprecated but still available</span></div><div class="line"><a name="l14252"></a><span class="lineno">14252</span> <span class="preprocessor">#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_</span></div><div class="line"><a name="l14253"></a><span class="lineno">14253</span> <span class="preprocessor">#define TYPED_TEST_CASE_P TYPED_TEST_SUITE_P</span></div><div class="line"><a name="l14254"></a><span class="lineno">14254</span> <span class="preprocessor">#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_</span></div><div class="line"><a name="l14255"></a><span class="lineno">14255</span> </div><div class="line"><a name="l14256"></a><span class="lineno">14256</span> <span class="preprocessor">#define TYPED_TEST_P(SuiteName, TestName) \</span></div><div class="line"><a name="l14257"></a><span class="lineno">14257</span> <span class="preprocessor"> namespace GTEST_SUITE_NAMESPACE_(SuiteName) { \</span></div><div class="line"><a name="l14258"></a><span class="lineno">14258</span> <span class="preprocessor"> template <typename gtest_TypeParam_> \</span></div><div class="line"><a name="l14259"></a><span class="lineno">14259</span> <span class="preprocessor"> class TestName : public SuiteName<gtest_TypeParam_> { \</span></div><div class="line"><a name="l14260"></a><span class="lineno">14260</span> <span class="preprocessor"> private: \</span></div><div class="line"><a name="l14261"></a><span class="lineno">14261</span> <span class="preprocessor"> typedef SuiteName<gtest_TypeParam_> TestFixture; \</span></div><div class="line"><a name="l14262"></a><span class="lineno">14262</span> <span class="preprocessor"> typedef gtest_TypeParam_ TypeParam; \</span></div><div class="line"><a name="l14263"></a><span class="lineno">14263</span> <span class="preprocessor"> virtual void TestBody(); \</span></div><div class="line"><a name="l14264"></a><span class="lineno">14264</span> <span class="preprocessor"> }; \</span></div><div class="line"><a name="l14265"></a><span class="lineno">14265</span> <span class="preprocessor"> static bool gtest_##TestName##_defined_ GTEST_ATTRIBUTE_UNUSED_ = \</span></div><div class="line"><a name="l14266"></a><span class="lineno">14266</span> <span class="preprocessor"> GTEST_TYPED_TEST_SUITE_P_STATE_(SuiteName).AddTestName( \</span></div><div class="line"><a name="l14267"></a><span class="lineno">14267</span> <span class="preprocessor"> __FILE__, __LINE__, #SuiteName, #TestName); \</span></div><div class="line"><a name="l14268"></a><span class="lineno">14268</span> <span class="preprocessor"> } \</span></div><div class="line"><a name="l14269"></a><span class="lineno">14269</span> <span class="preprocessor"> template <typename gtest_TypeParam_> \</span></div><div class="line"><a name="l14270"></a><span class="lineno">14270</span> <span class="preprocessor"> void GTEST_SUITE_NAMESPACE_( \</span></div><div class="line"><a name="l14271"></a><span class="lineno">14271</span> <span class="preprocessor"> SuiteName)::TestName<gtest_TypeParam_>::TestBody()</span></div><div class="line"><a name="l14272"></a><span class="lineno">14272</span> </div><div class="line"><a name="l14273"></a><span class="lineno">14273</span> <span class="preprocessor">#define REGISTER_TYPED_TEST_SUITE_P(SuiteName, ...) \</span></div><div class="line"><a name="l14274"></a><span class="lineno">14274</span> <span class="preprocessor"> namespace GTEST_SUITE_NAMESPACE_(SuiteName) { \</span></div><div class="line"><a name="l14275"></a><span class="lineno">14275</span> <span class="preprocessor"> typedef ::testing::internal::Templates<__VA_ARGS__>::type gtest_AllTests_; \</span></div><div class="line"><a name="l14276"></a><span class="lineno">14276</span> <span class="preprocessor"> } \</span></div><div class="line"><a name="l14277"></a><span class="lineno">14277</span> <span class="preprocessor"> static const char* const GTEST_REGISTERED_TEST_NAMES_( \</span></div><div class="line"><a name="l14278"></a><span class="lineno">14278</span> <span class="preprocessor"> SuiteName) GTEST_ATTRIBUTE_UNUSED_ = \</span></div><div class="line"><a name="l14279"></a><span class="lineno">14279</span> <span class="preprocessor"> GTEST_TYPED_TEST_SUITE_P_STATE_(SuiteName).VerifyRegisteredTestNames( \</span></div><div class="line"><a name="l14280"></a><span class="lineno">14280</span> <span class="preprocessor"> __FILE__, __LINE__, #__VA_ARGS__)</span></div><div class="line"><a name="l14281"></a><span class="lineno">14281</span> </div><div class="line"><a name="l14282"></a><span class="lineno">14282</span> <span class="comment">// Legacy API is deprecated but still available</span></div><div class="line"><a name="l14283"></a><span class="lineno">14283</span> <span class="preprocessor">#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_</span></div><div class="line"><a name="l14284"></a><span class="lineno">14284</span> <span class="preprocessor">#define REGISTER_TYPED_TEST_CASE_P REGISTER_TYPED_TEST_SUITE_P</span></div><div class="line"><a name="l14285"></a><span class="lineno">14285</span> <span class="preprocessor">#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_</span></div><div class="line"><a name="l14286"></a><span class="lineno">14286</span> </div><div class="line"><a name="l14287"></a><span class="lineno">14287</span> <span class="comment">// The 'Types' template argument below must have spaces around it</span></div><div class="line"><a name="l14288"></a><span class="lineno">14288</span> <span class="comment">// since some compilers may choke on '>>' when passing a template</span></div><div class="line"><a name="l14289"></a><span class="lineno">14289</span> <span class="comment">// instance (e.g. Types<int>)</span></div><div class="line"><a name="l14290"></a><span class="lineno">14290</span> <span class="preprocessor">#define INSTANTIATE_TYPED_TEST_SUITE_P(Prefix, SuiteName, Types, ...) \</span></div><div class="line"><a name="l14291"></a><span class="lineno">14291</span> <span class="preprocessor"> static bool gtest_##Prefix##_##SuiteName GTEST_ATTRIBUTE_UNUSED_ = \</span></div><div class="line"><a name="l14292"></a><span class="lineno">14292</span> <span class="preprocessor"> ::testing::internal::TypeParameterizedTestSuite< \</span></div><div class="line"><a name="l14293"></a><span class="lineno">14293</span> <span class="preprocessor"> SuiteName, GTEST_SUITE_NAMESPACE_(SuiteName)::gtest_AllTests_, \</span></div><div class="line"><a name="l14294"></a><span class="lineno">14294</span> <span class="preprocessor"> ::testing::internal::TypeList<Types>::type>:: \</span></div><div class="line"><a name="l14295"></a><span class="lineno">14295</span> <span class="preprocessor"> Register(#Prefix, \</span></div><div class="line"><a name="l14296"></a><span class="lineno">14296</span> <span class="preprocessor"> ::testing::internal::CodeLocation(__FILE__, __LINE__), \</span></div><div class="line"><a name="l14297"></a><span class="lineno">14297</span> <span class="preprocessor"> &GTEST_TYPED_TEST_SUITE_P_STATE_(SuiteName), #SuiteName, \</span></div><div class="line"><a name="l14298"></a><span class="lineno">14298</span> <span class="preprocessor"> GTEST_REGISTERED_TEST_NAMES_(SuiteName), \</span></div><div class="line"><a name="l14299"></a><span class="lineno">14299</span> <span class="preprocessor"> ::testing::internal::GenerateNames< \</span></div><div class="line"><a name="l14300"></a><span class="lineno">14300</span> <span class="preprocessor"> ::testing::internal::NameGeneratorSelector< \</span></div><div class="line"><a name="l14301"></a><span class="lineno">14301</span> <span class="preprocessor"> __VA_ARGS__>::type, \</span></div><div class="line"><a name="l14302"></a><span class="lineno">14302</span> <span class="preprocessor"> ::testing::internal::TypeList<Types>::type>())</span></div><div class="line"><a name="l14303"></a><span class="lineno">14303</span> </div><div class="line"><a name="l14304"></a><span class="lineno">14304</span> <span class="comment">// Legacy API is deprecated but still available</span></div><div class="line"><a name="l14305"></a><span class="lineno">14305</span> <span class="preprocessor">#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_</span></div><div class="line"><a name="l14306"></a><span class="lineno">14306</span> <span class="preprocessor">#define INSTANTIATE_TYPED_TEST_CASE_P INSTANTIATE_TYPED_TEST_SUITE_P</span></div><div class="line"><a name="l14307"></a><span class="lineno">14307</span> <span class="preprocessor">#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_</span></div><div class="line"><a name="l14308"></a><span class="lineno">14308</span> </div><div class="line"><a name="l14309"></a><span class="lineno">14309</span> <span class="preprocessor">#endif // GTEST_HAS_TYPED_TEST_P</span></div><div class="line"><a name="l14310"></a><span class="lineno">14310</span> </div><div class="line"><a name="l14311"></a><span class="lineno">14311</span> <span class="preprocessor">#endif // GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_</span></div><div class="line"><a name="l14312"></a><span class="lineno">14312</span> </div><div class="line"><a name="l14313"></a><span class="lineno">14313</span> <a class="code" href="gtest_8h.html#a86994cc68e844d8b82089c70408dfc61">GTEST_DISABLE_MSC_WARNINGS_PUSH_</a>(4251 \</div><div class="line"><a name="l14314"></a><span class="lineno">14314</span> <span class="comment">/* class A needs to have dll-interface to be used by clients of class B */</span>)</div><div class="line"><a name="l14315"></a><span class="lineno">14315</span> </div><div class="line"><a name="l14316"></a><span class="lineno">14316</span> <span class="comment">// Depending on the platform, different string classes are available.</span></div><div class="line"><a name="l14317"></a><span class="lineno">14317</span> <span class="comment">// On Linux, in addition to ::std::string, Google also makes use of</span></div><div class="line"><a name="l14318"></a><span class="lineno">14318</span> <span class="comment">// class ::string, which has the same interface as ::std::string, but</span></div><div class="line"><a name="l14319"></a><span class="lineno">14319</span> <span class="comment">// has a different implementation.</span></div><div class="line"><a name="l14320"></a><span class="lineno">14320</span> <span class="comment">//</span></div><div class="line"><a name="l14321"></a><span class="lineno">14321</span> <span class="comment">// You can define GTEST_HAS_GLOBAL_STRING to 1 to indicate that</span></div><div class="line"><a name="l14322"></a><span class="lineno">14322</span> <span class="comment">// ::string is available AND is a distinct type to ::std::string, or</span></div><div class="line"><a name="l14323"></a><span class="lineno">14323</span> <span class="comment">// define it to 0 to indicate otherwise.</span></div><div class="line"><a name="l14324"></a><span class="lineno">14324</span> <span class="comment">//</span></div><div class="line"><a name="l14325"></a><span class="lineno">14325</span> <span class="comment">// If ::std::string and ::string are the same class on your platform</span></div><div class="line"><a name="l14326"></a><span class="lineno">14326</span> <span class="comment">// due to aliasing, you should define GTEST_HAS_GLOBAL_STRING to 0.</span></div><div class="line"><a name="l14327"></a><span class="lineno">14327</span> <span class="comment">//</span></div><div class="line"><a name="l14328"></a><span class="lineno">14328</span> <span class="comment">// If you do not define GTEST_HAS_GLOBAL_STRING, it is defined</span></div><div class="line"><a name="l14329"></a><span class="lineno">14329</span> <span class="comment">// heuristically.</span></div><div class="line"><a name="l14330"></a><span class="lineno">14330</span> </div><div class="line"><a name="l14331"></a><span class="lineno">14331</span> namespace <a class="code" href="namespacetesting.html">testing</a> {</div><div class="line"><a name="l14332"></a><span class="lineno">14332</span> </div><div class="line"><a name="l14333"></a><span class="lineno">14333</span> <span class="comment">// Silence C4100 (unreferenced formal parameter) and 4805</span></div><div class="line"><a name="l14334"></a><span class="lineno">14334</span> <span class="comment">// unsafe mix of type 'const int' and type 'const bool'</span></div><div class="line"><a name="l14335"></a><span class="lineno">14335</span> <span class="preprocessor">#ifdef _MSC_VER</span></div><div class="line"><a name="l14336"></a><span class="lineno">14336</span> <span class="preprocessor"># pragma warning(push)</span></div><div class="line"><a name="l14337"></a><span class="lineno">14337</span> <span class="preprocessor"># pragma warning(disable:4805)</span></div><div class="line"><a name="l14338"></a><span class="lineno">14338</span> <span class="preprocessor"># pragma warning(disable:4100)</span></div><div class="line"><a name="l14339"></a><span class="lineno">14339</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l14340"></a><span class="lineno">14340</span> </div><div class="line"><a name="l14341"></a><span class="lineno">14341</span> </div><div class="line"><a name="l14342"></a><span class="lineno">14342</span> <span class="comment">// Declares the flags.</span></div><div class="line"><a name="l14343"></a><span class="lineno">14343</span> </div><div class="line"><a name="l14344"></a><span class="lineno">14344</span> <span class="comment">// This flag temporary enables the disabled tests.</span></div><div class="line"><a name="l14345"></a><span class="lineno">14345</span> <a class="code" href="gtest_8h.html#a14eb0e9c6e0df765d1fbfd2db6966d14">GTEST_DECLARE_bool_</a>(also_run_disabled_tests);</div><div class="line"><a name="l14346"></a><span class="lineno">14346</span> </div><div class="line"><a name="l14347"></a><span class="lineno">14347</span> <span class="comment">// This flag brings the debugger on an assertion failure.</span></div><div class="line"><a name="l14348"></a><span class="lineno">14348</span> <a class="code" href="gtest_8h.html#a14eb0e9c6e0df765d1fbfd2db6966d14">GTEST_DECLARE_bool_</a>(break_on_failure);</div><div class="line"><a name="l14349"></a><span class="lineno">14349</span> </div><div class="line"><a name="l14350"></a><span class="lineno">14350</span> <span class="comment">// This flag controls whether Google Test catches all test-thrown exceptions</span></div><div class="line"><a name="l14351"></a><span class="lineno">14351</span> <span class="comment">// and logs them as failures.</span></div><div class="line"><a name="l14352"></a><span class="lineno">14352</span> <a class="code" href="gtest_8h.html#a14eb0e9c6e0df765d1fbfd2db6966d14">GTEST_DECLARE_bool_</a>(catch_exceptions);</div><div class="line"><a name="l14353"></a><span class="lineno">14353</span> </div><div class="line"><a name="l14354"></a><span class="lineno">14354</span> <span class="comment">// This flag enables using colors in terminal output. Available values are</span></div><div class="line"><a name="l14355"></a><span class="lineno">14355</span> <span class="comment">// "yes" to enable colors, "no" (disable colors), or "auto" (the default)</span></div><div class="line"><a name="l14356"></a><span class="lineno">14356</span> <span class="comment">// to let Google Test decide.</span></div><div class="line"><a name="l14357"></a><span class="lineno">14357</span> <a class="code" href="gtest_8h.html#a9f74eee05f7ee5534139a622fe7da7dd">GTEST_DECLARE_string_</a>(color);</div><div class="line"><a name="l14358"></a><span class="lineno">14358</span> </div><div class="line"><a name="l14359"></a><span class="lineno">14359</span> <span class="comment">// This flag sets up the filter to select by name using a glob pattern</span></div><div class="line"><a name="l14360"></a><span class="lineno">14360</span> <span class="comment">// the tests to run. If the filter is not given all tests are executed.</span></div><div class="line"><a name="l14361"></a><span class="lineno">14361</span> <a class="code" href="gtest_8h.html#a9f74eee05f7ee5534139a622fe7da7dd">GTEST_DECLARE_string_</a>(<a class="code" href="namespaceutl_1_1meta.html#ac72acc616316c322e750d20a46553ba4">filter</a>);</div><div class="line"><a name="l14362"></a><span class="lineno">14362</span> </div><div class="line"><a name="l14363"></a><span class="lineno">14363</span> <span class="comment">// This flag controls whether Google Test installs a signal handler that dumps</span></div><div class="line"><a name="l14364"></a><span class="lineno">14364</span> <span class="comment">// debugging information when fatal signals are raised.</span></div><div class="line"><a name="l14365"></a><span class="lineno">14365</span> <a class="code" href="gtest_8h.html#a14eb0e9c6e0df765d1fbfd2db6966d14">GTEST_DECLARE_bool_</a>(install_failure_signal_handler);</div><div class="line"><a name="l14366"></a><span class="lineno">14366</span> </div><div class="line"><a name="l14367"></a><span class="lineno">14367</span> <span class="comment">// This flag causes the Google Test to list tests. None of the tests listed</span></div><div class="line"><a name="l14368"></a><span class="lineno">14368</span> <span class="comment">// are actually run if the flag is provided.</span></div><div class="line"><a name="l14369"></a><span class="lineno">14369</span> <a class="code" href="gtest_8h.html#a14eb0e9c6e0df765d1fbfd2db6966d14">GTEST_DECLARE_bool_</a>(list_tests);</div><div class="line"><a name="l14370"></a><span class="lineno">14370</span> </div><div class="line"><a name="l14371"></a><span class="lineno">14371</span> <span class="comment">// This flag controls whether Google Test emits a detailed XML report to a file</span></div><div class="line"><a name="l14372"></a><span class="lineno">14372</span> <span class="comment">// in addition to its normal textual output.</span></div><div class="line"><a name="l14373"></a><span class="lineno">14373</span> <a class="code" href="gtest_8h.html#a9f74eee05f7ee5534139a622fe7da7dd">GTEST_DECLARE_string_</a>(output);</div><div class="line"><a name="l14374"></a><span class="lineno">14374</span> </div><div class="line"><a name="l14375"></a><span class="lineno">14375</span> <span class="comment">// This flags control whether Google Test prints the elapsed time for each</span></div><div class="line"><a name="l14376"></a><span class="lineno">14376</span> <span class="comment">// test.</span></div><div class="line"><a name="l14377"></a><span class="lineno">14377</span> <a class="code" href="gtest_8h.html#a14eb0e9c6e0df765d1fbfd2db6966d14">GTEST_DECLARE_bool_</a>(print_time);</div><div class="line"><a name="l14378"></a><span class="lineno">14378</span> </div><div class="line"><a name="l14379"></a><span class="lineno">14379</span> <span class="comment">// This flags control whether Google Test prints UTF8 characters as text.</span></div><div class="line"><a name="l14380"></a><span class="lineno">14380</span> <a class="code" href="gtest_8h.html#a14eb0e9c6e0df765d1fbfd2db6966d14">GTEST_DECLARE_bool_</a>(print_utf8);</div><div class="line"><a name="l14381"></a><span class="lineno">14381</span> </div><div class="line"><a name="l14382"></a><span class="lineno">14382</span> <span class="comment">// This flag specifies the random number seed.</span></div><div class="line"><a name="l14383"></a><span class="lineno">14383</span> <a class="code" href="gtest_8h.html#aab2ee98cb616054b1d3a7dc71efe81fc">GTEST_DECLARE_int32_</a>(random_seed);</div><div class="line"><a name="l14384"></a><span class="lineno">14384</span> </div><div class="line"><a name="l14385"></a><span class="lineno">14385</span> <span class="comment">// This flag sets how many times the tests are repeated. The default value</span></div><div class="line"><a name="l14386"></a><span class="lineno">14386</span> <span class="comment">// is 1. If the value is -1 the tests are repeating forever.</span></div><div class="line"><a name="l14387"></a><span class="lineno">14387</span> <a class="code" href="gtest_8h.html#aab2ee98cb616054b1d3a7dc71efe81fc">GTEST_DECLARE_int32_</a>(<a class="code" href="namespaceutl_1_1meta.html#aa013c45afb59b5c132a72be54ba145fb">repeat</a>);</div><div class="line"><a name="l14388"></a><span class="lineno">14388</span> </div><div class="line"><a name="l14389"></a><span class="lineno">14389</span> <span class="comment">// This flag controls whether Google Test includes Google Test internal</span></div><div class="line"><a name="l14390"></a><span class="lineno">14390</span> <span class="comment">// stack frames in failure stack traces.</span></div><div class="line"><a name="l14391"></a><span class="lineno">14391</span> <a class="code" href="gtest_8h.html#a14eb0e9c6e0df765d1fbfd2db6966d14">GTEST_DECLARE_bool_</a>(show_internal_stack_frames);</div><div class="line"><a name="l14392"></a><span class="lineno">14392</span> </div><div class="line"><a name="l14393"></a><span class="lineno">14393</span> <span class="comment">// When this flag is specified, tests' order is randomized on every iteration.</span></div><div class="line"><a name="l14394"></a><span class="lineno">14394</span> <a class="code" href="gtest_8h.html#a14eb0e9c6e0df765d1fbfd2db6966d14">GTEST_DECLARE_bool_</a>(shuffle);</div><div class="line"><a name="l14395"></a><span class="lineno">14395</span> </div><div class="line"><a name="l14396"></a><span class="lineno">14396</span> <span class="comment">// This flag specifies the maximum number of stack frames to be</span></div><div class="line"><a name="l14397"></a><span class="lineno">14397</span> <span class="comment">// printed in a failure message.</span></div><div class="line"><a name="l14398"></a><span class="lineno">14398</span> <a class="code" href="gtest_8h.html#aab2ee98cb616054b1d3a7dc71efe81fc">GTEST_DECLARE_int32_</a>(stack_trace_depth);</div><div class="line"><a name="l14399"></a><span class="lineno">14399</span> </div><div class="line"><a name="l14400"></a><span class="lineno">14400</span> <span class="comment">// When this flag is specified, a failed assertion will throw an</span></div><div class="line"><a name="l14401"></a><span class="lineno">14401</span> <span class="comment">// exception if exceptions are enabled, or exit the program with a</span></div><div class="line"><a name="l14402"></a><span class="lineno">14402</span> <span class="comment">// non-zero code otherwise. For use with an external test framework.</span></div><div class="line"><a name="l14403"></a><span class="lineno">14403</span> <a class="code" href="gtest_8h.html#a14eb0e9c6e0df765d1fbfd2db6966d14">GTEST_DECLARE_bool_</a>(throw_on_failure);</div><div class="line"><a name="l14404"></a><span class="lineno">14404</span> </div><div class="line"><a name="l14405"></a><span class="lineno">14405</span> <span class="comment">// When this flag is set with a "host:port" string, on supported</span></div><div class="line"><a name="l14406"></a><span class="lineno">14406</span> <span class="comment">// platforms test results are streamed to the specified port on</span></div><div class="line"><a name="l14407"></a><span class="lineno">14407</span> <span class="comment">// the specified host machine.</span></div><div class="line"><a name="l14408"></a><span class="lineno">14408</span> <a class="code" href="gtest_8h.html#a9f74eee05f7ee5534139a622fe7da7dd">GTEST_DECLARE_string_</a>(stream_result_to);</div><div class="line"><a name="l14409"></a><span class="lineno">14409</span> </div><div class="line"><a name="l14410"></a><span class="lineno">14410</span> <span class="preprocessor">#if GTEST_USE_OWN_FLAGFILE_FLAG_</span></div><div class="line"><a name="l14411"></a><span class="lineno">14411</span> <a class="code" href="gtest_8h.html#a9f74eee05f7ee5534139a622fe7da7dd">GTEST_DECLARE_string_</a>(flagfile);</div><div class="line"><a name="l14412"></a><span class="lineno">14412</span> <span class="preprocessor">#endif // GTEST_USE_OWN_FLAGFILE_FLAG_</span></div><div class="line"><a name="l14413"></a><span class="lineno">14413</span> </div><div class="line"><a name="l14414"></a><span class="lineno">14414</span> <span class="comment">// The upper limit for valid stack trace depths.</span></div><div class="line"><a name="l14415"></a><span class="lineno">14415</span> <span class="keyword">const</span> <span class="keywordtype">int</span> kMaxStackTraceDepth = 100;</div><div class="line"><a name="l14416"></a><span class="lineno">14416</span> </div><div class="line"><a name="l14417"></a><span class="lineno">14417</span> <span class="keyword">namespace </span>internal {</div><div class="line"><a name="l14418"></a><span class="lineno">14418</span> </div><div class="line"><a name="l14419"></a><span class="lineno">14419</span> <span class="keyword">class </span>AssertHelper;</div><div class="line"><a name="l14420"></a><span class="lineno">14420</span> <span class="keyword">class </span>DefaultGlobalTestPartResultReporter;</div><div class="line"><a name="l14421"></a><span class="lineno">14421</span> <span class="keyword">class </span>ExecDeathTest;</div><div class="line"><a name="l14422"></a><span class="lineno">14422</span> <span class="keyword">class </span>NoExecDeathTest;</div><div class="line"><a name="l14423"></a><span class="lineno">14423</span> <span class="keyword">class </span>FinalSuccessChecker;</div><div class="line"><a name="l14424"></a><span class="lineno">14424</span> <span class="keyword">class </span>GTestFlagSaver;</div><div class="line"><a name="l14425"></a><span class="lineno">14425</span> <span class="keyword">class </span>StreamingListenerTest;</div><div class="line"><a name="l14426"></a><span class="lineno">14426</span> <span class="keyword">class </span>TestResultAccessor;</div><div class="line"><a name="l14427"></a><span class="lineno">14427</span> <span class="keyword">class </span>TestEventListenersAccessor;</div><div class="line"><a name="l14428"></a><span class="lineno">14428</span> <span class="keyword">class </span>TestEventRepeater;</div><div class="line"><a name="l14429"></a><span class="lineno">14429</span> <span class="keyword">class </span>UnitTestRecordPropertyTestHelper;</div><div class="line"><a name="l14430"></a><span class="lineno">14430</span> <span class="keyword">class </span>WindowsDeathTest;</div><div class="line"><a name="l14431"></a><span class="lineno">14431</span> <span class="keyword">class </span>FuchsiaDeathTest;</div><div class="line"><a name="l14432"></a><span class="lineno">14432</span> <span class="keyword">class </span>UnitTestImpl* GetUnitTestImpl();</div><div class="line"><a name="l14433"></a><span class="lineno">14433</span> <span class="keywordtype">void</span> ReportFailureInUnknownLocation(TestPartResult::Type result_type,</div><div class="line"><a name="l14434"></a><span class="lineno">14434</span>  <span class="keyword">const</span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a>& message);</div><div class="line"><a name="l14435"></a><span class="lineno">14435</span> </div><div class="line"><a name="l14436"></a><span class="lineno">14436</span> } <span class="comment">// namespace internal</span></div><div class="line"><a name="l14437"></a><span class="lineno">14437</span> </div><div class="line"><a name="l14438"></a><span class="lineno">14438</span> <span class="comment">// The friend relationship of some of these classes is cyclic.</span></div><div class="line"><a name="l14439"></a><span class="lineno">14439</span> <span class="comment">// If we don't forward declare them the compiler might confuse the classes</span></div><div class="line"><a name="l14440"></a><span class="lineno">14440</span> <span class="comment">// in friendship clauses with same named classes on the scope.</span></div><div class="line"><a name="l14441"></a><span class="lineno">14441</span> <span class="keyword">class </span>Test;</div><div class="line"><a name="l14442"></a><span class="lineno">14442</span> <span class="keyword">class </span>TestSuite;</div><div class="line"><a name="l14443"></a><span class="lineno">14443</span> </div><div class="line"><a name="l14444"></a><span class="lineno">14444</span> <span class="comment">// Old API is still available but deprecated</span></div><div class="line"><a name="l14445"></a><span class="lineno">14445</span> <span class="preprocessor">#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_</span></div><div class="line"><a name="l14446"></a><span class="lineno">14446</span> <span class="keyword">using</span> TestCase = TestSuite;</div><div class="line"><a name="l14447"></a><span class="lineno">14447</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l14448"></a><span class="lineno">14448</span> <span class="keyword">class </span>TestInfo;</div><div class="line"><a name="l14449"></a><span class="lineno">14449</span> <span class="keyword">class </span>UnitTest;</div><div class="line"><a name="l14450"></a><span class="lineno">14450</span> </div><div class="line"><a name="l14451"></a><span class="lineno">14451</span> <span class="comment">// A class for indicating whether an assertion was successful. When</span></div><div class="line"><a name="l14452"></a><span class="lineno">14452</span> <span class="comment">// the assertion wasn't successful, the AssertionResult object</span></div><div class="line"><a name="l14453"></a><span class="lineno">14453</span> <span class="comment">// remembers a non-empty message that describes how it failed.</span></div><div class="line"><a name="l14454"></a><span class="lineno">14454</span> <span class="comment">//</span></div><div class="line"><a name="l14455"></a><span class="lineno">14455</span> <span class="comment">// To create an instance of this class, use one of the factory functions</span></div><div class="line"><a name="l14456"></a><span class="lineno">14456</span> <span class="comment">// (AssertionSuccess() and AssertionFailure()).</span></div><div class="line"><a name="l14457"></a><span class="lineno">14457</span> <span class="comment">//</span></div><div class="line"><a name="l14458"></a><span class="lineno">14458</span> <span class="comment">// This class is useful for two purposes:</span></div><div class="line"><a name="l14459"></a><span class="lineno">14459</span> <span class="comment">// 1. Defining predicate functions to be used with Boolean test assertions</span></div><div class="line"><a name="l14460"></a><span class="lineno">14460</span> <span class="comment">// EXPECT_TRUE/EXPECT_FALSE and their ASSERT_ counterparts</span></div><div class="line"><a name="l14461"></a><span class="lineno">14461</span> <span class="comment">// 2. Defining predicate-format functions to be</span></div><div class="line"><a name="l14462"></a><span class="lineno">14462</span> <span class="comment">// used with predicate assertions (ASSERT_PRED_FORMAT*, etc).</span></div><div class="line"><a name="l14463"></a><span class="lineno">14463</span> <span class="comment">//</span></div><div class="line"><a name="l14464"></a><span class="lineno">14464</span> <span class="comment">// For example, if you define IsEven predicate:</span></div><div class="line"><a name="l14465"></a><span class="lineno">14465</span> <span class="comment">//</span></div><div class="line"><a name="l14466"></a><span class="lineno">14466</span> <span class="comment">// testing::AssertionResult IsEven(int n) {</span></div><div class="line"><a name="l14467"></a><span class="lineno">14467</span> <span class="comment">// if ((n % 2) == 0)</span></div><div class="line"><a name="l14468"></a><span class="lineno">14468</span> <span class="comment">// return testing::AssertionSuccess();</span></div><div class="line"><a name="l14469"></a><span class="lineno">14469</span> <span class="comment">// else</span></div><div class="line"><a name="l14470"></a><span class="lineno">14470</span> <span class="comment">// return testing::AssertionFailure() << n << " is odd";</span></div><div class="line"><a name="l14471"></a><span class="lineno">14471</span> <span class="comment">// }</span></div><div class="line"><a name="l14472"></a><span class="lineno">14472</span> <span class="comment">//</span></div><div class="line"><a name="l14473"></a><span class="lineno">14473</span> <span class="comment">// Then the failed expectation EXPECT_TRUE(IsEven(Fib(5)))</span></div><div class="line"><a name="l14474"></a><span class="lineno">14474</span> <span class="comment">// will print the message</span></div><div class="line"><a name="l14475"></a><span class="lineno">14475</span> <span class="comment">//</span></div><div class="line"><a name="l14476"></a><span class="lineno">14476</span> <span class="comment">// Value of: IsEven(Fib(5))</span></div><div class="line"><a name="l14477"></a><span class="lineno">14477</span> <span class="comment">// Actual: false (5 is odd)</span></div><div class="line"><a name="l14478"></a><span class="lineno">14478</span> <span class="comment">// Expected: true</span></div><div class="line"><a name="l14479"></a><span class="lineno">14479</span> <span class="comment">//</span></div><div class="line"><a name="l14480"></a><span class="lineno">14480</span> <span class="comment">// instead of a more opaque</span></div><div class="line"><a name="l14481"></a><span class="lineno">14481</span> <span class="comment">//</span></div><div class="line"><a name="l14482"></a><span class="lineno">14482</span> <span class="comment">// Value of: IsEven(Fib(5))</span></div><div class="line"><a name="l14483"></a><span class="lineno">14483</span> <span class="comment">// Actual: false</span></div><div class="line"><a name="l14484"></a><span class="lineno">14484</span> <span class="comment">// Expected: true</span></div><div class="line"><a name="l14485"></a><span class="lineno">14485</span> <span class="comment">//</span></div><div class="line"><a name="l14486"></a><span class="lineno">14486</span> <span class="comment">// in case IsEven is a simple Boolean predicate.</span></div><div class="line"><a name="l14487"></a><span class="lineno">14487</span> <span class="comment">//</span></div><div class="line"><a name="l14488"></a><span class="lineno">14488</span> <span class="comment">// If you expect your predicate to be reused and want to support informative</span></div><div class="line"><a name="l14489"></a><span class="lineno">14489</span> <span class="comment">// messages in EXPECT_FALSE and ASSERT_FALSE (negative assertions show up</span></div><div class="line"><a name="l14490"></a><span class="lineno">14490</span> <span class="comment">// about half as often as positive ones in our tests), supply messages for</span></div><div class="line"><a name="l14491"></a><span class="lineno">14491</span> <span class="comment">// both success and failure cases:</span></div><div class="line"><a name="l14492"></a><span class="lineno">14492</span> <span class="comment">//</span></div><div class="line"><a name="l14493"></a><span class="lineno">14493</span> <span class="comment">// testing::AssertionResult IsEven(int n) {</span></div><div class="line"><a name="l14494"></a><span class="lineno">14494</span> <span class="comment">// if ((n % 2) == 0)</span></div><div class="line"><a name="l14495"></a><span class="lineno">14495</span> <span class="comment">// return testing::AssertionSuccess() << n << " is even";</span></div><div class="line"><a name="l14496"></a><span class="lineno">14496</span> <span class="comment">// else</span></div><div class="line"><a name="l14497"></a><span class="lineno">14497</span> <span class="comment">// return testing::AssertionFailure() << n << " is odd";</span></div><div class="line"><a name="l14498"></a><span class="lineno">14498</span> <span class="comment">// }</span></div><div class="line"><a name="l14499"></a><span class="lineno">14499</span> <span class="comment">//</span></div><div class="line"><a name="l14500"></a><span class="lineno">14500</span> <span class="comment">// Then a statement EXPECT_FALSE(IsEven(Fib(6))) will print</span></div><div class="line"><a name="l14501"></a><span class="lineno">14501</span> <span class="comment">//</span></div><div class="line"><a name="l14502"></a><span class="lineno">14502</span> <span class="comment">// Value of: IsEven(Fib(6))</span></div><div class="line"><a name="l14503"></a><span class="lineno">14503</span> <span class="comment">// Actual: true (8 is even)</span></div><div class="line"><a name="l14504"></a><span class="lineno">14504</span> <span class="comment">// Expected: false</span></div><div class="line"><a name="l14505"></a><span class="lineno">14505</span> <span class="comment">//</span></div><div class="line"><a name="l14506"></a><span class="lineno">14506</span> <span class="comment">// NB: Predicates that support negative Boolean assertions have reduced</span></div><div class="line"><a name="l14507"></a><span class="lineno">14507</span> <span class="comment">// performance in positive ones so be careful not to use them in tests</span></div><div class="line"><a name="l14508"></a><span class="lineno">14508</span> <span class="comment">// that have lots (tens of thousands) of positive Boolean assertions.</span></div><div class="line"><a name="l14509"></a><span class="lineno">14509</span> <span class="comment">//</span></div><div class="line"><a name="l14510"></a><span class="lineno">14510</span> <span class="comment">// To use this class with EXPECT_PRED_FORMAT assertions such as:</span></div><div class="line"><a name="l14511"></a><span class="lineno">14511</span> <span class="comment">//</span></div><div class="line"><a name="l14512"></a><span class="lineno">14512</span> <span class="comment">// // Verifies that Foo() returns an even number.</span></div><div class="line"><a name="l14513"></a><span class="lineno">14513</span> <span class="comment">// EXPECT_PRED_FORMAT1(IsEven, Foo());</span></div><div class="line"><a name="l14514"></a><span class="lineno">14514</span> <span class="comment">//</span></div><div class="line"><a name="l14515"></a><span class="lineno">14515</span> <span class="comment">// you need to define:</span></div><div class="line"><a name="l14516"></a><span class="lineno">14516</span> <span class="comment">//</span></div><div class="line"><a name="l14517"></a><span class="lineno">14517</span> <span class="comment">// testing::AssertionResult IsEven(const char* expr, int n) {</span></div><div class="line"><a name="l14518"></a><span class="lineno">14518</span> <span class="comment">// if ((n % 2) == 0)</span></div><div class="line"><a name="l14519"></a><span class="lineno">14519</span> <span class="comment">// return testing::AssertionSuccess();</span></div><div class="line"><a name="l14520"></a><span class="lineno">14520</span> <span class="comment">// else</span></div><div class="line"><a name="l14521"></a><span class="lineno">14521</span> <span class="comment">// return testing::AssertionFailure()</span></div><div class="line"><a name="l14522"></a><span class="lineno">14522</span> <span class="comment">// << "Expected: " << expr << " is even\n Actual: it's " << n;</span></div><div class="line"><a name="l14523"></a><span class="lineno">14523</span> <span class="comment">// }</span></div><div class="line"><a name="l14524"></a><span class="lineno">14524</span> <span class="comment">//</span></div><div class="line"><a name="l14525"></a><span class="lineno">14525</span> <span class="comment">// If Foo() returns 5, you will see the following message:</span></div><div class="line"><a name="l14526"></a><span class="lineno">14526</span> <span class="comment">//</span></div><div class="line"><a name="l14527"></a><span class="lineno">14527</span> <span class="comment">// Expected: Foo() is even</span></div><div class="line"><a name="l14528"></a><span class="lineno">14528</span> <span class="comment">// Actual: it's 5</span></div><div class="line"><a name="l14529"></a><span class="lineno">14529</span> <span class="comment">//</span></div><div class="line"><a name="l14530"></a><span class="lineno">14530</span> <span class="keyword">class </span><a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> AssertionResult {</div><div class="line"><a name="l14531"></a><span class="lineno">14531</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l14532"></a><span class="lineno">14532</span>  <span class="comment">// Copy constructor.</span></div><div class="line"><a name="l14533"></a><span class="lineno">14533</span>  <span class="comment">// Used in EXPECT_TRUE/FALSE(assertion_result).</span></div><div class="line"><a name="l14534"></a><span class="lineno">14534</span>  AssertionResult(<span class="keyword">const</span> AssertionResult& other);</div><div class="line"><a name="l14535"></a><span class="lineno">14535</span> </div><div class="line"><a name="l14536"></a><span class="lineno">14536</span> <span class="preprocessor">#if defined(_MSC_VER) && _MSC_VER < 1910</span></div><div class="line"><a name="l14537"></a><span class="lineno">14537</span>  <a class="code" href="gtest_8h.html#a86994cc68e844d8b82089c70408dfc61">GTEST_DISABLE_MSC_WARNINGS_PUSH_</a>(4800 <span class="comment">/* forcing value to bool */</span>)</div><div class="line"><a name="l14538"></a><span class="lineno">14538</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l14539"></a><span class="lineno">14539</span> </div><div class="line"><a name="l14540"></a><span class="lineno">14540</span>  <span class="comment">// Used in the EXPECT_TRUE/FALSE(bool_expression).</span></div><div class="line"><a name="l14541"></a><span class="lineno">14541</span>  <span class="comment">//</span></div><div class="line"><a name="l14542"></a><span class="lineno">14542</span>  <span class="comment">// T must be contextually convertible to bool.</span></div><div class="line"><a name="l14543"></a><span class="lineno">14543</span>  <span class="comment">//</span></div><div class="line"><a name="l14544"></a><span class="lineno">14544</span>  <span class="comment">// The second parameter prevents this overload from being considered if</span></div><div class="line"><a name="l14545"></a><span class="lineno">14545</span>  <span class="comment">// the argument is implicitly convertible to AssertionResult. In that case</span></div><div class="line"><a name="l14546"></a><span class="lineno">14546</span>  <span class="comment">// we want AssertionResult's copy constructor to be used.</span></div><div class="line"><a name="l14547"></a><span class="lineno">14547</span>  <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l14548"></a><span class="lineno">14548</span>  <span class="keyword">explicit</span> AssertionResult(</div><div class="line"><a name="l14549"></a><span class="lineno">14549</span>  <span class="keyword">const</span> T& success,</div><div class="line"><a name="l14550"></a><span class="lineno">14550</span>  <span class="keyword">typename</span> internal::EnableIf<</div><div class="line"><a name="l14551"></a><span class="lineno">14551</span>  !internal::ImplicitlyConvertible<T, AssertionResult>::value>::type*</div><div class="line"><a name="l14552"></a><span class="lineno">14552</span>  <span class="comment">/*enabler*/</span></div><div class="line"><a name="l14553"></a><span class="lineno">14553</span>  = <span class="keyword">nullptr</span>)</div><div class="line"><a name="l14554"></a><span class="lineno">14554</span>  : success_(success) {}</div><div class="line"><a name="l14555"></a><span class="lineno">14555</span> </div><div class="line"><a name="l14556"></a><span class="lineno">14556</span> <span class="preprocessor">#if defined(_MSC_VER) && _MSC_VER < 1910</span></div><div class="line"><a name="l14557"></a><span class="lineno">14557</span>  <a class="code" href="gtest_8h.html#aebf8277c9069c1e124f9a5bbe2948061">GTEST_DISABLE_MSC_WARNINGS_POP_</a>()</div><div class="line"><a name="l14558"></a><span class="lineno">14558</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l14559"></a><span class="lineno">14559</span> </div><div class="line"><a name="l14560"></a><span class="lineno">14560</span>  <span class="comment">// Assignment operator.</span></div><div class="line"><a name="l14561"></a><span class="lineno">14561</span>  AssertionResult& operator=(AssertionResult other) {</div><div class="line"><a name="l14562"></a><span class="lineno">14562</span>  <a class="code" href="namespaceutl.html#ae0f873b4883af7cc18cb23dd2810f4e6">swap</a>(other);</div><div class="line"><a name="l14563"></a><span class="lineno">14563</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l14564"></a><span class="lineno">14564</span>  }</div><div class="line"><a name="l14565"></a><span class="lineno">14565</span> </div><div class="line"><a name="l14566"></a><span class="lineno">14566</span>  <span class="comment">// Returns true iff the assertion succeeded.</span></div><div class="line"><a name="l14567"></a><span class="lineno">14567</span>  <span class="keyword">operator</span> bool()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> success_; } <span class="comment">// NOLINT</span></div><div class="line"><a name="l14568"></a><span class="lineno">14568</span> </div><div class="line"><a name="l14569"></a><span class="lineno">14569</span>  <span class="comment">// Returns the assertion's negation. Used with EXPECT/ASSERT_FALSE.</span></div><div class="line"><a name="l14570"></a><span class="lineno">14570</span>  AssertionResult operator!() <span class="keyword">const</span>;</div><div class="line"><a name="l14571"></a><span class="lineno">14571</span> </div><div class="line"><a name="l14572"></a><span class="lineno">14572</span>  <span class="comment">// Returns the text streamed into this AssertionResult. Test assertions</span></div><div class="line"><a name="l14573"></a><span class="lineno">14573</span>  <span class="comment">// use it when they fail (i.e., the predicate's outcome doesn't match the</span></div><div class="line"><a name="l14574"></a><span class="lineno">14574</span>  <span class="comment">// assertion's expectation). When nothing has been streamed into the</span></div><div class="line"><a name="l14575"></a><span class="lineno">14575</span>  <span class="comment">// object, returns an empty string.</span></div><div class="line"><a name="l14576"></a><span class="lineno">14576</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* message()<span class="keyword"> const </span>{</div><div class="line"><a name="l14577"></a><span class="lineno">14577</span>  <span class="keywordflow">return</span> message_.get() != <span class="keyword">nullptr</span> ? message_->c_str() : <span class="stringliteral">""</span>;</div><div class="line"><a name="l14578"></a><span class="lineno">14578</span>  }</div><div class="line"><a name="l14579"></a><span class="lineno">14579</span>  <span class="comment">// Deprecated; please use message() instead.</span></div><div class="line"><a name="l14580"></a><span class="lineno">14580</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* failure_message()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> message(); }</div><div class="line"><a name="l14581"></a><span class="lineno">14581</span> </div><div class="line"><a name="l14582"></a><span class="lineno">14582</span>  <span class="comment">// Streams a custom failure message into this object.</span></div><div class="line"><a name="l14583"></a><span class="lineno">14583</span>  <span class="keyword">template</span> <<span class="keyword">typename</span> T> AssertionResult& <a class="code" href="namespacetesting_1_1internal2.html#a07dbe129beb8952074f04b599dfce39b">operator<<</a>(<span class="keyword">const</span> T& value) {</div><div class="line"><a name="l14584"></a><span class="lineno">14584</span>  AppendMessage(Message() << value);</div><div class="line"><a name="l14585"></a><span class="lineno">14585</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l14586"></a><span class="lineno">14586</span>  }</div><div class="line"><a name="l14587"></a><span class="lineno">14587</span> </div><div class="line"><a name="l14588"></a><span class="lineno">14588</span>  <span class="comment">// Allows streaming basic output manipulators such as endl or flush into</span></div><div class="line"><a name="l14589"></a><span class="lineno">14589</span>  <span class="comment">// this object.</span></div><div class="line"><a name="l14590"></a><span class="lineno">14590</span>  AssertionResult& <a class="code" href="namespacetesting_1_1internal2.html#a07dbe129beb8952074f04b599dfce39b">operator<<</a>(</div><div class="line"><a name="l14591"></a><span class="lineno">14591</span>  ::std::ostream& (*basic_manipulator)(::std::ostream& stream)) {</div><div class="line"><a name="l14592"></a><span class="lineno">14592</span>  AppendMessage(Message() << basic_manipulator);</div><div class="line"><a name="l14593"></a><span class="lineno">14593</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l14594"></a><span class="lineno">14594</span>  }</div><div class="line"><a name="l14595"></a><span class="lineno">14595</span> </div><div class="line"><a name="l14596"></a><span class="lineno">14596</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l14597"></a><span class="lineno">14597</span>  <span class="comment">// Appends the contents of message to message_.</span></div><div class="line"><a name="l14598"></a><span class="lineno">14598</span>  <span class="keywordtype">void</span> AppendMessage(<span class="keyword">const</span> Message& a_message) {</div><div class="line"><a name="l14599"></a><span class="lineno">14599</span>  <span class="keywordflow">if</span> (message_.get() == <span class="keyword">nullptr</span>) message_.reset(<a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">new ::std::string</a>);</div><div class="line"><a name="l14600"></a><span class="lineno">14600</span>  message_->append(a_message.GetString().c_str());</div><div class="line"><a name="l14601"></a><span class="lineno">14601</span>  }</div><div class="line"><a name="l14602"></a><span class="lineno">14602</span> </div><div class="line"><a name="l14603"></a><span class="lineno">14603</span>  <span class="comment">// Swap the contents of this AssertionResult with other.</span></div><div class="line"><a name="l14604"></a><span class="lineno">14604</span>  <span class="keywordtype">void</span> <a class="code" href="namespaceutl.html#ae0f873b4883af7cc18cb23dd2810f4e6">swap</a>(AssertionResult& other);</div><div class="line"><a name="l14605"></a><span class="lineno">14605</span> </div><div class="line"><a name="l14606"></a><span class="lineno">14606</span>  <span class="comment">// Stores result of the assertion predicate.</span></div><div class="line"><a name="l14607"></a><span class="lineno">14607</span>  <span class="keywordtype">bool</span> success_;</div><div class="line"><a name="l14608"></a><span class="lineno">14608</span>  <span class="comment">// Stores the message describing the condition in case the expectation</span></div><div class="line"><a name="l14609"></a><span class="lineno">14609</span>  <span class="comment">// construct is not satisfied with the predicate's outcome.</span></div><div class="line"><a name="l14610"></a><span class="lineno">14610</span>  <span class="comment">// Referenced via a pointer to avoid taking too much stack frame space</span></div><div class="line"><a name="l14611"></a><span class="lineno">14611</span>  <span class="comment">// with test assertions.</span></div><div class="line"><a name="l14612"></a><span class="lineno">14612</span>  std::unique_ptr< ::std::string> message_;</div><div class="line"><a name="l14613"></a><span class="lineno">14613</span> };</div><div class="line"><a name="l14614"></a><span class="lineno">14614</span> </div><div class="line"><a name="l14615"></a><span class="lineno">14615</span> <span class="comment">// Makes a successful assertion result.</span></div><div class="line"><a name="l14616"></a><span class="lineno">14616</span> <a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> AssertionResult AssertionSuccess();</div><div class="line"><a name="l14617"></a><span class="lineno">14617</span> </div><div class="line"><a name="l14618"></a><span class="lineno">14618</span> <span class="comment">// Makes a failed assertion result.</span></div><div class="line"><a name="l14619"></a><span class="lineno">14619</span> <a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> AssertionResult AssertionFailure();</div><div class="line"><a name="l14620"></a><span class="lineno">14620</span> </div><div class="line"><a name="l14621"></a><span class="lineno">14621</span> <span class="comment">// Makes a failed assertion result with the given failure message.</span></div><div class="line"><a name="l14622"></a><span class="lineno">14622</span> <span class="comment">// Deprecated; use AssertionFailure() << msg.</span></div><div class="line"><a name="l14623"></a><span class="lineno">14623</span> <a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> AssertionResult AssertionFailure(<span class="keyword">const</span> Message& msg);</div><div class="line"><a name="l14624"></a><span class="lineno">14624</span> </div><div class="line"><a name="l14625"></a><span class="lineno">14625</span> } <span class="comment">// namespace testing</span></div><div class="line"><a name="l14626"></a><span class="lineno">14626</span> </div><div class="line"><a name="l14627"></a><span class="lineno">14627</span> <span class="comment">// Includes the auto-generated header that implements a family of generic</span></div><div class="line"><a name="l14628"></a><span class="lineno">14628</span> <span class="comment">// predicate assertion macros. This include comes late because it relies on</span></div><div class="line"><a name="l14629"></a><span class="lineno">14629</span> <span class="comment">// APIs declared above.</span></div><div class="line"><a name="l14630"></a><span class="lineno">14630</span> <span class="comment">// Copyright 2006, Google Inc.</span></div><div class="line"><a name="l14631"></a><span class="lineno">14631</span> <span class="comment">// All rights reserved.</span></div><div class="line"><a name="l14632"></a><span class="lineno">14632</span> <span class="comment">//</span></div><div class="line"><a name="l14633"></a><span class="lineno">14633</span> <span class="comment">// Redistribution and use in source and binary forms, with or without</span></div><div class="line"><a name="l14634"></a><span class="lineno">14634</span> <span class="comment">// modification, are permitted provided that the following conditions are</span></div><div class="line"><a name="l14635"></a><span class="lineno">14635</span> <span class="comment">// met:</span></div><div class="line"><a name="l14636"></a><span class="lineno">14636</span> <span class="comment">//</span></div><div class="line"><a name="l14637"></a><span class="lineno">14637</span> <span class="comment">// * Redistributions of source code must retain the above copyright</span></div><div class="line"><a name="l14638"></a><span class="lineno">14638</span> <span class="comment">// notice, this list of conditions and the following disclaimer.</span></div><div class="line"><a name="l14639"></a><span class="lineno">14639</span> <span class="comment">// * Redistributions in binary form must reproduce the above</span></div><div class="line"><a name="l14640"></a><span class="lineno">14640</span> <span class="comment">// copyright notice, this list of conditions and the following disclaimer</span></div><div class="line"><a name="l14641"></a><span class="lineno">14641</span> <span class="comment">// in the documentation and/or other materials provided with the</span></div><div class="line"><a name="l14642"></a><span class="lineno">14642</span> <span class="comment">// distribution.</span></div><div class="line"><a name="l14643"></a><span class="lineno">14643</span> <span class="comment">// * Neither the name of Google Inc. nor the names of its</span></div><div class="line"><a name="l14644"></a><span class="lineno">14644</span> <span class="comment">// contributors may be used to endorse or promote products derived from</span></div><div class="line"><a name="l14645"></a><span class="lineno">14645</span> <span class="comment">// this software without specific prior written permission.</span></div><div class="line"><a name="l14646"></a><span class="lineno">14646</span> <span class="comment">//</span></div><div class="line"><a name="l14647"></a><span class="lineno">14647</span> <span class="comment">// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS</span></div><div class="line"><a name="l14648"></a><span class="lineno">14648</span> <span class="comment">// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT</span></div><div class="line"><a name="l14649"></a><span class="lineno">14649</span> <span class="comment">// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR</span></div><div class="line"><a name="l14650"></a><span class="lineno">14650</span> <span class="comment">// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT</span></div><div class="line"><a name="l14651"></a><span class="lineno">14651</span> <span class="comment">// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,</span></div><div class="line"><a name="l14652"></a><span class="lineno">14652</span> <span class="comment">// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT</span></div><div class="line"><a name="l14653"></a><span class="lineno">14653</span> <span class="comment">// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,</span></div><div class="line"><a name="l14654"></a><span class="lineno">14654</span> <span class="comment">// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY</span></div><div class="line"><a name="l14655"></a><span class="lineno">14655</span> <span class="comment">// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</span></div><div class="line"><a name="l14656"></a><span class="lineno">14656</span> <span class="comment">// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE</span></div><div class="line"><a name="l14657"></a><span class="lineno">14657</span> <span class="comment">// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span></div><div class="line"><a name="l14658"></a><span class="lineno">14658</span> </div><div class="line"><a name="l14659"></a><span class="lineno">14659</span> <span class="comment">// This file is AUTOMATICALLY GENERATED on 01/02/2019 by command</span></div><div class="line"><a name="l14660"></a><span class="lineno">14660</span> <span class="comment">// 'gen_gtest_pred_impl.py 5'. DO NOT EDIT BY HAND!</span></div><div class="line"><a name="l14661"></a><span class="lineno">14661</span> <span class="comment">//</span></div><div class="line"><a name="l14662"></a><span class="lineno">14662</span> <span class="comment">// Implements a family of generic predicate assertion macros.</span></div><div class="line"><a name="l14663"></a><span class="lineno">14663</span> <span class="comment">// GOOGLETEST_CM0001 DO NOT DELETE</span></div><div class="line"><a name="l14664"></a><span class="lineno">14664</span> </div><div class="line"><a name="l14665"></a><span class="lineno">14665</span> <span class="preprocessor">#ifndef GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_</span></div><div class="line"><a name="l14666"></a><span class="lineno"><a class="line" href="gtest_8h.html#a36afb7e44e600d2da0e6d8f4f739ea3b">14666</a></span> <span class="preprocessor">#define GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_</span></div><div class="line"><a name="l14667"></a><span class="lineno">14667</span> </div><div class="line"><a name="l14668"></a><span class="lineno">14668</span> </div><div class="line"><a name="l14669"></a><span class="lineno">14669</span> <span class="keyword">namespace </span><a class="code" href="namespacetesting.html">testing</a> {</div><div class="line"><a name="l14670"></a><span class="lineno">14670</span> </div><div class="line"><a name="l14671"></a><span class="lineno">14671</span> <span class="comment">// This header implements a family of generic predicate assertion</span></div><div class="line"><a name="l14672"></a><span class="lineno">14672</span> <span class="comment">// macros:</span></div><div class="line"><a name="l14673"></a><span class="lineno">14673</span> <span class="comment">//</span></div><div class="line"><a name="l14674"></a><span class="lineno">14674</span> <span class="comment">// ASSERT_PRED_FORMAT1(pred_format, v1)</span></div><div class="line"><a name="l14675"></a><span class="lineno">14675</span> <span class="comment">// ASSERT_PRED_FORMAT2(pred_format, v1, v2)</span></div><div class="line"><a name="l14676"></a><span class="lineno">14676</span> <span class="comment">// ...</span></div><div class="line"><a name="l14677"></a><span class="lineno">14677</span> <span class="comment">//</span></div><div class="line"><a name="l14678"></a><span class="lineno">14678</span> <span class="comment">// where pred_format is a function or functor that takes n (in the</span></div><div class="line"><a name="l14679"></a><span class="lineno">14679</span> <span class="comment">// case of ASSERT_PRED_FORMATn) values and their source expression</span></div><div class="line"><a name="l14680"></a><span class="lineno">14680</span> <span class="comment">// text, and returns a testing::AssertionResult. See the definition</span></div><div class="line"><a name="l14681"></a><span class="lineno">14681</span> <span class="comment">// of ASSERT_EQ in gtest.h for an example.</span></div><div class="line"><a name="l14682"></a><span class="lineno">14682</span> <span class="comment">//</span></div><div class="line"><a name="l14683"></a><span class="lineno">14683</span> <span class="comment">// If you don't care about formatting, you can use the more</span></div><div class="line"><a name="l14684"></a><span class="lineno">14684</span> <span class="comment">// restrictive version:</span></div><div class="line"><a name="l14685"></a><span class="lineno">14685</span> <span class="comment">//</span></div><div class="line"><a name="l14686"></a><span class="lineno">14686</span> <span class="comment">// ASSERT_PRED1(pred, v1)</span></div><div class="line"><a name="l14687"></a><span class="lineno">14687</span> <span class="comment">// ASSERT_PRED2(pred, v1, v2)</span></div><div class="line"><a name="l14688"></a><span class="lineno">14688</span> <span class="comment">// ...</span></div><div class="line"><a name="l14689"></a><span class="lineno">14689</span> <span class="comment">//</span></div><div class="line"><a name="l14690"></a><span class="lineno">14690</span> <span class="comment">// where pred is an n-ary function or functor that returns bool,</span></div><div class="line"><a name="l14691"></a><span class="lineno">14691</span> <span class="comment">// and the values v1, v2, ..., must support the << operator for</span></div><div class="line"><a name="l14692"></a><span class="lineno">14692</span> <span class="comment">// streaming to std::ostream.</span></div><div class="line"><a name="l14693"></a><span class="lineno">14693</span> <span class="comment">//</span></div><div class="line"><a name="l14694"></a><span class="lineno">14694</span> <span class="comment">// We also define the EXPECT_* variations.</span></div><div class="line"><a name="l14695"></a><span class="lineno">14695</span> <span class="comment">//</span></div><div class="line"><a name="l14696"></a><span class="lineno">14696</span> <span class="comment">// For now we only support predicates whose arity is at most 5.</span></div><div class="line"><a name="l14697"></a><span class="lineno">14697</span> <span class="comment">// Please email googletestframework@googlegroups.com if you need</span></div><div class="line"><a name="l14698"></a><span class="lineno">14698</span> <span class="comment">// support for higher arities.</span></div><div class="line"><a name="l14699"></a><span class="lineno">14699</span> </div><div class="line"><a name="l14700"></a><span class="lineno">14700</span> <span class="comment">// GTEST_ASSERT_ is the basic statement to which all of the assertions</span></div><div class="line"><a name="l14701"></a><span class="lineno">14701</span> <span class="comment">// in this file reduce. Don't use this in your code.</span></div><div class="line"><a name="l14702"></a><span class="lineno">14702</span> </div><div class="line"><a name="l14703"></a><span class="lineno"><a class="line" href="gtest_8h.html#a8c09939dd67f1bb5b68c9f6a44ea75db">14703</a></span> <span class="preprocessor">#define GTEST_ASSERT_(expression, on_failure) \</span></div><div class="line"><a name="l14704"></a><span class="lineno">14704</span> <span class="preprocessor"> GTEST_AMBIGUOUS_ELSE_BLOCKER_ \</span></div><div class="line"><a name="l14705"></a><span class="lineno">14705</span> <span class="preprocessor"> if (const ::testing::AssertionResult gtest_ar = (expression)) \</span></div><div class="line"><a name="l14706"></a><span class="lineno">14706</span> <span class="preprocessor"> ; \</span></div><div class="line"><a name="l14707"></a><span class="lineno">14707</span> <span class="preprocessor"> else \</span></div><div class="line"><a name="l14708"></a><span class="lineno">14708</span> <span class="preprocessor"> on_failure(gtest_ar.failure_message())</span></div><div class="line"><a name="l14709"></a><span class="lineno">14709</span> </div><div class="line"><a name="l14710"></a><span class="lineno">14710</span> </div><div class="line"><a name="l14711"></a><span class="lineno">14711</span> <span class="comment">// Helper function for implementing {EXPECT|ASSERT}_PRED1. Don't use</span></div><div class="line"><a name="l14712"></a><span class="lineno">14712</span> <span class="comment">// this in your code.</span></div><div class="line"><a name="l14713"></a><span class="lineno">14713</span> <span class="keyword">template</span> <<span class="keyword">typename</span> Pred,</div><div class="line"><a name="l14714"></a><span class="lineno">14714</span>  <span class="keyword">typename</span> T1></div><div class="line"><a name="l14715"></a><span class="lineno"><a class="line" href="namespacetesting.html#a7f73180474723be6e92185d6fa9e7c9f">14715</a></span> AssertionResult <a class="code" href="namespacetesting.html#a7f73180474723be6e92185d6fa9e7c9f">AssertPred1Helper</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* pred_text,</div><div class="line"><a name="l14716"></a><span class="lineno">14716</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* e1,</div><div class="line"><a name="l14717"></a><span class="lineno">14717</span>  Pred pred,</div><div class="line"><a name="l14718"></a><span class="lineno">14718</span>  <span class="keyword">const</span> T1& v1) {</div><div class="line"><a name="l14719"></a><span class="lineno">14719</span>  <span class="keywordflow">if</span> (pred(v1)) <span class="keywordflow">return</span> AssertionSuccess();</div><div class="line"><a name="l14720"></a><span class="lineno">14720</span> </div><div class="line"><a name="l14721"></a><span class="lineno">14721</span>  <span class="keywordflow">return</span> AssertionFailure()</div><div class="line"><a name="l14722"></a><span class="lineno">14722</span>  << pred_text << <span class="stringliteral">"("</span> << e1 << <span class="stringliteral">") evaluates to false, where"</span></div><div class="line"><a name="l14723"></a><span class="lineno">14723</span>  << <span class="stringliteral">"\n"</span></div><div class="line"><a name="l14724"></a><span class="lineno">14724</span>  << e1 << <span class="stringliteral">" evaluates to "</span> << <a class="code" href="namespacetesting.html#aa5717bb1144edd1d262d310ba70c82ed">::testing::PrintToString</a>(v1);</div><div class="line"><a name="l14725"></a><span class="lineno">14725</span> }</div><div class="line"><a name="l14726"></a><span class="lineno">14726</span> </div><div class="line"><a name="l14727"></a><span class="lineno">14727</span> <span class="comment">// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT1.</span></div><div class="line"><a name="l14728"></a><span class="lineno">14728</span> <span class="comment">// Don't use this in your code.</span></div><div class="line"><a name="l14729"></a><span class="lineno"><a class="line" href="gtest_8h.html#aa3e3bfe04bb0e54d7f0e57e2f991d1eb">14729</a></span> <span class="preprocessor">#define GTEST_PRED_FORMAT1_(pred_format, v1, on_failure)\</span></div><div class="line"><a name="l14730"></a><span class="lineno">14730</span> <span class="preprocessor"> GTEST_ASSERT_(pred_format(#v1, v1), \</span></div><div class="line"><a name="l14731"></a><span class="lineno">14731</span> <span class="preprocessor"> on_failure)</span></div><div class="line"><a name="l14732"></a><span class="lineno">14732</span> </div><div class="line"><a name="l14733"></a><span class="lineno">14733</span> <span class="comment">// Internal macro for implementing {EXPECT|ASSERT}_PRED1. Don't use</span></div><div class="line"><a name="l14734"></a><span class="lineno">14734</span> <span class="comment">// this in your code.</span></div><div class="line"><a name="l14735"></a><span class="lineno"><a class="line" href="gtest_8h.html#ad44cf322952076d85305bbdf39769ac1">14735</a></span> <span class="preprocessor">#define GTEST_PRED1_(pred, v1, on_failure)\</span></div><div class="line"><a name="l14736"></a><span class="lineno">14736</span> <span class="preprocessor"> GTEST_ASSERT_(::testing::AssertPred1Helper(#pred, \</span></div><div class="line"><a name="l14737"></a><span class="lineno">14737</span> <span class="preprocessor"> #v1, \</span></div><div class="line"><a name="l14738"></a><span class="lineno">14738</span> <span class="preprocessor"> pred, \</span></div><div class="line"><a name="l14739"></a><span class="lineno">14739</span> <span class="preprocessor"> v1), on_failure)</span></div><div class="line"><a name="l14740"></a><span class="lineno">14740</span> </div><div class="line"><a name="l14741"></a><span class="lineno">14741</span> <span class="comment">// Unary predicate assertion macros.</span></div><div class="line"><a name="l14742"></a><span class="lineno"><a class="line" href="gtest_8h.html#a07132aa62cf4902e50e68d0265f573b6">14742</a></span> <span class="preprocessor">#define EXPECT_PRED_FORMAT1(pred_format, v1) \</span></div><div class="line"><a name="l14743"></a><span class="lineno">14743</span> <span class="preprocessor"> GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_NONFATAL_FAILURE_)</span></div><div class="line"><a name="l14744"></a><span class="lineno"><a class="line" href="gtest_8h.html#a6d09aa83f8d297481380c7c073c9f070">14744</a></span> <span class="preprocessor">#define EXPECT_PRED1(pred, v1) \</span></div><div class="line"><a name="l14745"></a><span class="lineno">14745</span> <span class="preprocessor"> GTEST_PRED1_(pred, v1, GTEST_NONFATAL_FAILURE_)</span></div><div class="line"><a name="l14746"></a><span class="lineno"><a class="line" href="gtest_8h.html#a3771ca0d1a72013aebc3d66e046491ed">14746</a></span> <span class="preprocessor">#define ASSERT_PRED_FORMAT1(pred_format, v1) \</span></div><div class="line"><a name="l14747"></a><span class="lineno">14747</span> <span class="preprocessor"> GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_FATAL_FAILURE_)</span></div><div class="line"><a name="l14748"></a><span class="lineno"><a class="line" href="gtest_8h.html#a7d72f779b7d39b8f73a563ebc6d0604b">14748</a></span> <span class="preprocessor">#define ASSERT_PRED1(pred, v1) \</span></div><div class="line"><a name="l14749"></a><span class="lineno">14749</span> <span class="preprocessor"> GTEST_PRED1_(pred, v1, GTEST_FATAL_FAILURE_)</span></div><div class="line"><a name="l14750"></a><span class="lineno">14750</span> </div><div class="line"><a name="l14751"></a><span class="lineno">14751</span> </div><div class="line"><a name="l14752"></a><span class="lineno">14752</span> </div><div class="line"><a name="l14753"></a><span class="lineno">14753</span> <span class="comment">// Helper function for implementing {EXPECT|ASSERT}_PRED2. Don't use</span></div><div class="line"><a name="l14754"></a><span class="lineno">14754</span> <span class="comment">// this in your code.</span></div><div class="line"><a name="l14755"></a><span class="lineno">14755</span> <span class="keyword">template</span> <<span class="keyword">typename</span> Pred,</div><div class="line"><a name="l14756"></a><span class="lineno">14756</span>  <span class="keyword">typename</span> T1,</div><div class="line"><a name="l14757"></a><span class="lineno">14757</span>  <span class="keyword">typename</span> T2></div><div class="line"><a name="l14758"></a><span class="lineno"><a class="line" href="namespacetesting.html#aa6587938029dd8733ecb885068f08247">14758</a></span> AssertionResult <a class="code" href="namespacetesting.html#aa6587938029dd8733ecb885068f08247">AssertPred2Helper</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* pred_text,</div><div class="line"><a name="l14759"></a><span class="lineno">14759</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* e1,</div><div class="line"><a name="l14760"></a><span class="lineno">14760</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* e2,</div><div class="line"><a name="l14761"></a><span class="lineno">14761</span>  Pred pred,</div><div class="line"><a name="l14762"></a><span class="lineno">14762</span>  <span class="keyword">const</span> T1& v1,</div><div class="line"><a name="l14763"></a><span class="lineno">14763</span>  <span class="keyword">const</span> T2& v2) {</div><div class="line"><a name="l14764"></a><span class="lineno">14764</span>  <span class="keywordflow">if</span> (pred(v1, v2)) <span class="keywordflow">return</span> AssertionSuccess();</div><div class="line"><a name="l14765"></a><span class="lineno">14765</span> </div><div class="line"><a name="l14766"></a><span class="lineno">14766</span>  <span class="keywordflow">return</span> AssertionFailure()</div><div class="line"><a name="l14767"></a><span class="lineno">14767</span>  << pred_text << <span class="stringliteral">"("</span> << e1 << <span class="stringliteral">", "</span> << e2</div><div class="line"><a name="l14768"></a><span class="lineno">14768</span>  << <span class="stringliteral">") evaluates to false, where"</span></div><div class="line"><a name="l14769"></a><span class="lineno">14769</span>  << <span class="stringliteral">"\n"</span></div><div class="line"><a name="l14770"></a><span class="lineno">14770</span>  << e1 << <span class="stringliteral">" evaluates to "</span> << <a class="code" href="namespacetesting.html#aa5717bb1144edd1d262d310ba70c82ed">::testing::PrintToString</a>(v1) << <span class="stringliteral">"\n"</span></div><div class="line"><a name="l14771"></a><span class="lineno">14771</span>  << e2 << <span class="stringliteral">" evaluates to "</span> << <a class="code" href="namespacetesting.html#aa5717bb1144edd1d262d310ba70c82ed">::testing::PrintToString</a>(v2);</div><div class="line"><a name="l14772"></a><span class="lineno">14772</span> }</div><div class="line"><a name="l14773"></a><span class="lineno">14773</span> </div><div class="line"><a name="l14774"></a><span class="lineno">14774</span> <span class="comment">// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT2.</span></div><div class="line"><a name="l14775"></a><span class="lineno">14775</span> <span class="comment">// Don't use this in your code.</span></div><div class="line"><a name="l14776"></a><span class="lineno"><a class="line" href="gtest_8h.html#a115c18d1f752b7f091d577fb69cac372">14776</a></span> <span class="preprocessor">#define GTEST_PRED_FORMAT2_(pred_format, v1, v2, on_failure)\</span></div><div class="line"><a name="l14777"></a><span class="lineno">14777</span> <span class="preprocessor"> GTEST_ASSERT_(pred_format(#v1, #v2, v1, v2), \</span></div><div class="line"><a name="l14778"></a><span class="lineno">14778</span> <span class="preprocessor"> on_failure)</span></div><div class="line"><a name="l14779"></a><span class="lineno">14779</span> </div><div class="line"><a name="l14780"></a><span class="lineno">14780</span> <span class="comment">// Internal macro for implementing {EXPECT|ASSERT}_PRED2. Don't use</span></div><div class="line"><a name="l14781"></a><span class="lineno">14781</span> <span class="comment">// this in your code.</span></div><div class="line"><a name="l14782"></a><span class="lineno"><a class="line" href="gtest_8h.html#ac560264104bd030b64034505d294a7b6">14782</a></span> <span class="preprocessor">#define GTEST_PRED2_(pred, v1, v2, on_failure)\</span></div><div class="line"><a name="l14783"></a><span class="lineno">14783</span> <span class="preprocessor"> GTEST_ASSERT_(::testing::AssertPred2Helper(#pred, \</span></div><div class="line"><a name="l14784"></a><span class="lineno">14784</span> <span class="preprocessor"> #v1, \</span></div><div class="line"><a name="l14785"></a><span class="lineno">14785</span> <span class="preprocessor"> #v2, \</span></div><div class="line"><a name="l14786"></a><span class="lineno">14786</span> <span class="preprocessor"> pred, \</span></div><div class="line"><a name="l14787"></a><span class="lineno">14787</span> <span class="preprocessor"> v1, \</span></div><div class="line"><a name="l14788"></a><span class="lineno">14788</span> <span class="preprocessor"> v2), on_failure)</span></div><div class="line"><a name="l14789"></a><span class="lineno">14789</span> </div><div class="line"><a name="l14790"></a><span class="lineno">14790</span> <span class="comment">// Binary predicate assertion macros.</span></div><div class="line"><a name="l14791"></a><span class="lineno"><a class="line" href="gtest_8h.html#af0141918615a5e2d5247e9cda8324dae">14791</a></span> <span class="preprocessor">#define EXPECT_PRED_FORMAT2(pred_format, v1, v2) \</span></div><div class="line"><a name="l14792"></a><span class="lineno">14792</span> <span class="preprocessor"> GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_NONFATAL_FAILURE_)</span></div><div class="line"><a name="l14793"></a><span class="lineno"><a class="line" href="gtest_8h.html#a14e74e655e502914d3d07e083145ac91">14793</a></span> <span class="preprocessor">#define EXPECT_PRED2(pred, v1, v2) \</span></div><div class="line"><a name="l14794"></a><span class="lineno">14794</span> <span class="preprocessor"> GTEST_PRED2_(pred, v1, v2, GTEST_NONFATAL_FAILURE_)</span></div><div class="line"><a name="l14795"></a><span class="lineno"><a class="line" href="gtest_8h.html#ac452685a1a98ea3d96eb956a062ee210">14795</a></span> <span class="preprocessor">#define ASSERT_PRED_FORMAT2(pred_format, v1, v2) \</span></div><div class="line"><a name="l14796"></a><span class="lineno">14796</span> <span class="preprocessor"> GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_FATAL_FAILURE_)</span></div><div class="line"><a name="l14797"></a><span class="lineno"><a class="line" href="gtest_8h.html#a4e9b777cce4e5423f4c2e491be7aa818">14797</a></span> <span class="preprocessor">#define ASSERT_PRED2(pred, v1, v2) \</span></div><div class="line"><a name="l14798"></a><span class="lineno">14798</span> <span class="preprocessor"> GTEST_PRED2_(pred, v1, v2, GTEST_FATAL_FAILURE_)</span></div><div class="line"><a name="l14799"></a><span class="lineno">14799</span> </div><div class="line"><a name="l14800"></a><span class="lineno">14800</span> </div><div class="line"><a name="l14801"></a><span class="lineno">14801</span> </div><div class="line"><a name="l14802"></a><span class="lineno">14802</span> <span class="comment">// Helper function for implementing {EXPECT|ASSERT}_PRED3. Don't use</span></div><div class="line"><a name="l14803"></a><span class="lineno">14803</span> <span class="comment">// this in your code.</span></div><div class="line"><a name="l14804"></a><span class="lineno">14804</span> <span class="keyword">template</span> <<span class="keyword">typename</span> Pred,</div><div class="line"><a name="l14805"></a><span class="lineno">14805</span>  <span class="keyword">typename</span> T1,</div><div class="line"><a name="l14806"></a><span class="lineno">14806</span>  <span class="keyword">typename</span> T2,</div><div class="line"><a name="l14807"></a><span class="lineno">14807</span>  <span class="keyword">typename</span> T3></div><div class="line"><a name="l14808"></a><span class="lineno"><a class="line" href="namespacetesting.html#ac92dcbd00a0ffb2913e65d286e321a22">14808</a></span> AssertionResult <a class="code" href="namespacetesting.html#ac92dcbd00a0ffb2913e65d286e321a22">AssertPred3Helper</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* pred_text,</div><div class="line"><a name="l14809"></a><span class="lineno">14809</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* e1,</div><div class="line"><a name="l14810"></a><span class="lineno">14810</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* e2,</div><div class="line"><a name="l14811"></a><span class="lineno">14811</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* e3,</div><div class="line"><a name="l14812"></a><span class="lineno">14812</span>  Pred pred,</div><div class="line"><a name="l14813"></a><span class="lineno">14813</span>  <span class="keyword">const</span> T1& v1,</div><div class="line"><a name="l14814"></a><span class="lineno">14814</span>  <span class="keyword">const</span> T2& v2,</div><div class="line"><a name="l14815"></a><span class="lineno">14815</span>  <span class="keyword">const</span> T3& v3) {</div><div class="line"><a name="l14816"></a><span class="lineno">14816</span>  <span class="keywordflow">if</span> (pred(v1, v2, v3)) <span class="keywordflow">return</span> AssertionSuccess();</div><div class="line"><a name="l14817"></a><span class="lineno">14817</span> </div><div class="line"><a name="l14818"></a><span class="lineno">14818</span>  <span class="keywordflow">return</span> AssertionFailure()</div><div class="line"><a name="l14819"></a><span class="lineno">14819</span>  << pred_text << <span class="stringliteral">"("</span> << e1 << <span class="stringliteral">", "</span> << e2 << <span class="stringliteral">", "</span> << e3</div><div class="line"><a name="l14820"></a><span class="lineno">14820</span>  << <span class="stringliteral">") evaluates to false, where"</span></div><div class="line"><a name="l14821"></a><span class="lineno">14821</span>  << <span class="stringliteral">"\n"</span></div><div class="line"><a name="l14822"></a><span class="lineno">14822</span>  << e1 << <span class="stringliteral">" evaluates to "</span> << <a class="code" href="namespacetesting.html#aa5717bb1144edd1d262d310ba70c82ed">::testing::PrintToString</a>(v1) << <span class="stringliteral">"\n"</span></div><div class="line"><a name="l14823"></a><span class="lineno">14823</span>  << e2 << <span class="stringliteral">" evaluates to "</span> << <a class="code" href="namespacetesting.html#aa5717bb1144edd1d262d310ba70c82ed">::testing::PrintToString</a>(v2) << <span class="stringliteral">"\n"</span></div><div class="line"><a name="l14824"></a><span class="lineno">14824</span>  << e3 << <span class="stringliteral">" evaluates to "</span> << <a class="code" href="namespacetesting.html#aa5717bb1144edd1d262d310ba70c82ed">::testing::PrintToString</a>(v3);</div><div class="line"><a name="l14825"></a><span class="lineno">14825</span> }</div><div class="line"><a name="l14826"></a><span class="lineno">14826</span> </div><div class="line"><a name="l14827"></a><span class="lineno">14827</span> <span class="comment">// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT3.</span></div><div class="line"><a name="l14828"></a><span class="lineno">14828</span> <span class="comment">// Don't use this in your code.</span></div><div class="line"><a name="l14829"></a><span class="lineno"><a class="line" href="gtest_8h.html#a49cdf8707268ee932bb772d879a226cc">14829</a></span> <span class="preprocessor">#define GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, on_failure)\</span></div><div class="line"><a name="l14830"></a><span class="lineno">14830</span> <span class="preprocessor"> GTEST_ASSERT_(pred_format(#v1, #v2, #v3, v1, v2, v3), \</span></div><div class="line"><a name="l14831"></a><span class="lineno">14831</span> <span class="preprocessor"> on_failure)</span></div><div class="line"><a name="l14832"></a><span class="lineno">14832</span> </div><div class="line"><a name="l14833"></a><span class="lineno">14833</span> <span class="comment">// Internal macro for implementing {EXPECT|ASSERT}_PRED3. Don't use</span></div><div class="line"><a name="l14834"></a><span class="lineno">14834</span> <span class="comment">// this in your code.</span></div><div class="line"><a name="l14835"></a><span class="lineno"><a class="line" href="gtest_8h.html#af30518f03233bc4486b55284b0827eb8">14835</a></span> <span class="preprocessor">#define GTEST_PRED3_(pred, v1, v2, v3, on_failure)\</span></div><div class="line"><a name="l14836"></a><span class="lineno">14836</span> <span class="preprocessor"> GTEST_ASSERT_(::testing::AssertPred3Helper(#pred, \</span></div><div class="line"><a name="l14837"></a><span class="lineno">14837</span> <span class="preprocessor"> #v1, \</span></div><div class="line"><a name="l14838"></a><span class="lineno">14838</span> <span class="preprocessor"> #v2, \</span></div><div class="line"><a name="l14839"></a><span class="lineno">14839</span> <span class="preprocessor"> #v3, \</span></div><div class="line"><a name="l14840"></a><span class="lineno">14840</span> <span class="preprocessor"> pred, \</span></div><div class="line"><a name="l14841"></a><span class="lineno">14841</span> <span class="preprocessor"> v1, \</span></div><div class="line"><a name="l14842"></a><span class="lineno">14842</span> <span class="preprocessor"> v2, \</span></div><div class="line"><a name="l14843"></a><span class="lineno">14843</span> <span class="preprocessor"> v3), on_failure)</span></div><div class="line"><a name="l14844"></a><span class="lineno">14844</span> </div><div class="line"><a name="l14845"></a><span class="lineno">14845</span> <span class="comment">// Ternary predicate assertion macros.</span></div><div class="line"><a name="l14846"></a><span class="lineno"><a class="line" href="gtest_8h.html#a7285708fa5d37d6d8ed5b5e59da08bae">14846</a></span> <span class="preprocessor">#define EXPECT_PRED_FORMAT3(pred_format, v1, v2, v3) \</span></div><div class="line"><a name="l14847"></a><span class="lineno">14847</span> <span class="preprocessor"> GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_NONFATAL_FAILURE_)</span></div><div class="line"><a name="l14848"></a><span class="lineno"><a class="line" href="gtest_8h.html#a0a0aff2564ea84c7eb3517ac8eda04da">14848</a></span> <span class="preprocessor">#define EXPECT_PRED3(pred, v1, v2, v3) \</span></div><div class="line"><a name="l14849"></a><span class="lineno">14849</span> <span class="preprocessor"> GTEST_PRED3_(pred, v1, v2, v3, GTEST_NONFATAL_FAILURE_)</span></div><div class="line"><a name="l14850"></a><span class="lineno"><a class="line" href="gtest_8h.html#a494e3b8dc22f4765f7e041f16c930e3d">14850</a></span> <span class="preprocessor">#define ASSERT_PRED_FORMAT3(pred_format, v1, v2, v3) \</span></div><div class="line"><a name="l14851"></a><span class="lineno">14851</span> <span class="preprocessor"> GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_FATAL_FAILURE_)</span></div><div class="line"><a name="l14852"></a><span class="lineno"><a class="line" href="gtest_8h.html#aa7688f3ab9f09a2c1dbf13bd1f29d8fd">14852</a></span> <span class="preprocessor">#define ASSERT_PRED3(pred, v1, v2, v3) \</span></div><div class="line"><a name="l14853"></a><span class="lineno">14853</span> <span class="preprocessor"> GTEST_PRED3_(pred, v1, v2, v3, GTEST_FATAL_FAILURE_)</span></div><div class="line"><a name="l14854"></a><span class="lineno">14854</span> </div><div class="line"><a name="l14855"></a><span class="lineno">14855</span> </div><div class="line"><a name="l14856"></a><span class="lineno">14856</span> </div><div class="line"><a name="l14857"></a><span class="lineno">14857</span> <span class="comment">// Helper function for implementing {EXPECT|ASSERT}_PRED4. Don't use</span></div><div class="line"><a name="l14858"></a><span class="lineno">14858</span> <span class="comment">// this in your code.</span></div><div class="line"><a name="l14859"></a><span class="lineno">14859</span> <span class="keyword">template</span> <<span class="keyword">typename</span> Pred,</div><div class="line"><a name="l14860"></a><span class="lineno">14860</span>  <span class="keyword">typename</span> T1,</div><div class="line"><a name="l14861"></a><span class="lineno">14861</span>  <span class="keyword">typename</span> T2,</div><div class="line"><a name="l14862"></a><span class="lineno">14862</span>  <span class="keyword">typename</span> T3,</div><div class="line"><a name="l14863"></a><span class="lineno">14863</span>  <span class="keyword">typename</span> T4></div><div class="line"><a name="l14864"></a><span class="lineno"><a class="line" href="namespacetesting.html#ae90c778d69db4682e8fd8baaa0a9f9cd">14864</a></span> AssertionResult <a class="code" href="namespacetesting.html#ae90c778d69db4682e8fd8baaa0a9f9cd">AssertPred4Helper</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* pred_text,</div><div class="line"><a name="l14865"></a><span class="lineno">14865</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* e1,</div><div class="line"><a name="l14866"></a><span class="lineno">14866</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* e2,</div><div class="line"><a name="l14867"></a><span class="lineno">14867</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* e3,</div><div class="line"><a name="l14868"></a><span class="lineno">14868</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* e4,</div><div class="line"><a name="l14869"></a><span class="lineno">14869</span>  Pred pred,</div><div class="line"><a name="l14870"></a><span class="lineno">14870</span>  <span class="keyword">const</span> T1& v1,</div><div class="line"><a name="l14871"></a><span class="lineno">14871</span>  <span class="keyword">const</span> T2& v2,</div><div class="line"><a name="l14872"></a><span class="lineno">14872</span>  <span class="keyword">const</span> T3& v3,</div><div class="line"><a name="l14873"></a><span class="lineno">14873</span>  <span class="keyword">const</span> T4& v4) {</div><div class="line"><a name="l14874"></a><span class="lineno">14874</span>  <span class="keywordflow">if</span> (pred(v1, v2, v3, v4)) <span class="keywordflow">return</span> AssertionSuccess();</div><div class="line"><a name="l14875"></a><span class="lineno">14875</span> </div><div class="line"><a name="l14876"></a><span class="lineno">14876</span>  <span class="keywordflow">return</span> AssertionFailure()</div><div class="line"><a name="l14877"></a><span class="lineno">14877</span>  << pred_text << <span class="stringliteral">"("</span> << e1 << <span class="stringliteral">", "</span> << e2 << <span class="stringliteral">", "</span> << e3 << <span class="stringliteral">", "</span> << e4</div><div class="line"><a name="l14878"></a><span class="lineno">14878</span>  << <span class="stringliteral">") evaluates to false, where"</span></div><div class="line"><a name="l14879"></a><span class="lineno">14879</span>  << <span class="stringliteral">"\n"</span></div><div class="line"><a name="l14880"></a><span class="lineno">14880</span>  << e1 << <span class="stringliteral">" evaluates to "</span> << <a class="code" href="namespacetesting.html#aa5717bb1144edd1d262d310ba70c82ed">::testing::PrintToString</a>(v1) << <span class="stringliteral">"\n"</span></div><div class="line"><a name="l14881"></a><span class="lineno">14881</span>  << e2 << <span class="stringliteral">" evaluates to "</span> << <a class="code" href="namespacetesting.html#aa5717bb1144edd1d262d310ba70c82ed">::testing::PrintToString</a>(v2) << <span class="stringliteral">"\n"</span></div><div class="line"><a name="l14882"></a><span class="lineno">14882</span>  << e3 << <span class="stringliteral">" evaluates to "</span> << <a class="code" href="namespacetesting.html#aa5717bb1144edd1d262d310ba70c82ed">::testing::PrintToString</a>(v3) << <span class="stringliteral">"\n"</span></div><div class="line"><a name="l14883"></a><span class="lineno">14883</span>  << e4 << <span class="stringliteral">" evaluates to "</span> << <a class="code" href="namespacetesting.html#aa5717bb1144edd1d262d310ba70c82ed">::testing::PrintToString</a>(v4);</div><div class="line"><a name="l14884"></a><span class="lineno">14884</span> }</div><div class="line"><a name="l14885"></a><span class="lineno">14885</span> </div><div class="line"><a name="l14886"></a><span class="lineno">14886</span> <span class="comment">// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT4.</span></div><div class="line"><a name="l14887"></a><span class="lineno">14887</span> <span class="comment">// Don't use this in your code.</span></div><div class="line"><a name="l14888"></a><span class="lineno"><a class="line" href="gtest_8h.html#abd207ed869491ba4bba29f8df37b7355">14888</a></span> <span class="preprocessor">#define GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, on_failure)\</span></div><div class="line"><a name="l14889"></a><span class="lineno">14889</span> <span class="preprocessor"> GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, v1, v2, v3, v4), \</span></div><div class="line"><a name="l14890"></a><span class="lineno">14890</span> <span class="preprocessor"> on_failure)</span></div><div class="line"><a name="l14891"></a><span class="lineno">14891</span> </div><div class="line"><a name="l14892"></a><span class="lineno">14892</span> <span class="comment">// Internal macro for implementing {EXPECT|ASSERT}_PRED4. Don't use</span></div><div class="line"><a name="l14893"></a><span class="lineno">14893</span> <span class="comment">// this in your code.</span></div><div class="line"><a name="l14894"></a><span class="lineno"><a class="line" href="gtest_8h.html#a14e8c70455104fac032efec097ef668b">14894</a></span> <span class="preprocessor">#define GTEST_PRED4_(pred, v1, v2, v3, v4, on_failure)\</span></div><div class="line"><a name="l14895"></a><span class="lineno">14895</span> <span class="preprocessor"> GTEST_ASSERT_(::testing::AssertPred4Helper(#pred, \</span></div><div class="line"><a name="l14896"></a><span class="lineno">14896</span> <span class="preprocessor"> #v1, \</span></div><div class="line"><a name="l14897"></a><span class="lineno">14897</span> <span class="preprocessor"> #v2, \</span></div><div class="line"><a name="l14898"></a><span class="lineno">14898</span> <span class="preprocessor"> #v3, \</span></div><div class="line"><a name="l14899"></a><span class="lineno">14899</span> <span class="preprocessor"> #v4, \</span></div><div class="line"><a name="l14900"></a><span class="lineno">14900</span> <span class="preprocessor"> pred, \</span></div><div class="line"><a name="l14901"></a><span class="lineno">14901</span> <span class="preprocessor"> v1, \</span></div><div class="line"><a name="l14902"></a><span class="lineno">14902</span> <span class="preprocessor"> v2, \</span></div><div class="line"><a name="l14903"></a><span class="lineno">14903</span> <span class="preprocessor"> v3, \</span></div><div class="line"><a name="l14904"></a><span class="lineno">14904</span> <span class="preprocessor"> v4), on_failure)</span></div><div class="line"><a name="l14905"></a><span class="lineno">14905</span> </div><div class="line"><a name="l14906"></a><span class="lineno">14906</span> <span class="comment">// 4-ary predicate assertion macros.</span></div><div class="line"><a name="l14907"></a><span class="lineno"><a class="line" href="gtest_8h.html#a3354347de0f2445400b509cf39dce1dc">14907</a></span> <span class="preprocessor">#define EXPECT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \</span></div><div class="line"><a name="l14908"></a><span class="lineno">14908</span> <span class="preprocessor"> GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_)</span></div><div class="line"><a name="l14909"></a><span class="lineno"><a class="line" href="gtest_8h.html#a4fd2b1bad63eb752bc2ff2b6bb3f4569">14909</a></span> <span class="preprocessor">#define EXPECT_PRED4(pred, v1, v2, v3, v4) \</span></div><div class="line"><a name="l14910"></a><span class="lineno">14910</span> <span class="preprocessor"> GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_)</span></div><div class="line"><a name="l14911"></a><span class="lineno"><a class="line" href="gtest_8h.html#a1842593c1dfb13c9a4b33b01540a8b40">14911</a></span> <span class="preprocessor">#define ASSERT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \</span></div><div class="line"><a name="l14912"></a><span class="lineno">14912</span> <span class="preprocessor"> GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_FATAL_FAILURE_)</span></div><div class="line"><a name="l14913"></a><span class="lineno"><a class="line" href="gtest_8h.html#addc030c521775610e4619a01541a2167">14913</a></span> <span class="preprocessor">#define ASSERT_PRED4(pred, v1, v2, v3, v4) \</span></div><div class="line"><a name="l14914"></a><span class="lineno">14914</span> <span class="preprocessor"> GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_FATAL_FAILURE_)</span></div><div class="line"><a name="l14915"></a><span class="lineno">14915</span> </div><div class="line"><a name="l14916"></a><span class="lineno">14916</span> </div><div class="line"><a name="l14917"></a><span class="lineno">14917</span> </div><div class="line"><a name="l14918"></a><span class="lineno">14918</span> <span class="comment">// Helper function for implementing {EXPECT|ASSERT}_PRED5. Don't use</span></div><div class="line"><a name="l14919"></a><span class="lineno">14919</span> <span class="comment">// this in your code.</span></div><div class="line"><a name="l14920"></a><span class="lineno">14920</span> <span class="keyword">template</span> <<span class="keyword">typename</span> Pred,</div><div class="line"><a name="l14921"></a><span class="lineno">14921</span>  <span class="keyword">typename</span> T1,</div><div class="line"><a name="l14922"></a><span class="lineno">14922</span>  <span class="keyword">typename</span> T2,</div><div class="line"><a name="l14923"></a><span class="lineno">14923</span>  <span class="keyword">typename</span> T3,</div><div class="line"><a name="l14924"></a><span class="lineno">14924</span>  <span class="keyword">typename</span> T4,</div><div class="line"><a name="l14925"></a><span class="lineno">14925</span>  <span class="keyword">typename</span> T5></div><div class="line"><a name="l14926"></a><span class="lineno"><a class="line" href="namespacetesting.html#addcf52b273ce17269cbf4956cfe600a6">14926</a></span> AssertionResult <a class="code" href="namespacetesting.html#addcf52b273ce17269cbf4956cfe600a6">AssertPred5Helper</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* pred_text,</div><div class="line"><a name="l14927"></a><span class="lineno">14927</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* e1,</div><div class="line"><a name="l14928"></a><span class="lineno">14928</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* e2,</div><div class="line"><a name="l14929"></a><span class="lineno">14929</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* e3,</div><div class="line"><a name="l14930"></a><span class="lineno">14930</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* e4,</div><div class="line"><a name="l14931"></a><span class="lineno">14931</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* e5,</div><div class="line"><a name="l14932"></a><span class="lineno">14932</span>  Pred pred,</div><div class="line"><a name="l14933"></a><span class="lineno">14933</span>  <span class="keyword">const</span> T1& v1,</div><div class="line"><a name="l14934"></a><span class="lineno">14934</span>  <span class="keyword">const</span> T2& v2,</div><div class="line"><a name="l14935"></a><span class="lineno">14935</span>  <span class="keyword">const</span> T3& v3,</div><div class="line"><a name="l14936"></a><span class="lineno">14936</span>  <span class="keyword">const</span> T4& v4,</div><div class="line"><a name="l14937"></a><span class="lineno">14937</span>  <span class="keyword">const</span> T5& v5) {</div><div class="line"><a name="l14938"></a><span class="lineno">14938</span>  <span class="keywordflow">if</span> (pred(v1, v2, v3, v4, v5)) <span class="keywordflow">return</span> AssertionSuccess();</div><div class="line"><a name="l14939"></a><span class="lineno">14939</span> </div><div class="line"><a name="l14940"></a><span class="lineno">14940</span>  <span class="keywordflow">return</span> AssertionFailure()</div><div class="line"><a name="l14941"></a><span class="lineno">14941</span>  << pred_text << <span class="stringliteral">"("</span> << e1 << <span class="stringliteral">", "</span> << e2 << <span class="stringliteral">", "</span> << e3 << <span class="stringliteral">", "</span> << e4</div><div class="line"><a name="l14942"></a><span class="lineno">14942</span>  << <span class="stringliteral">", "</span> << e5 << <span class="stringliteral">") evaluates to false, where"</span></div><div class="line"><a name="l14943"></a><span class="lineno">14943</span>  << <span class="stringliteral">"\n"</span></div><div class="line"><a name="l14944"></a><span class="lineno">14944</span>  << e1 << <span class="stringliteral">" evaluates to "</span> << <a class="code" href="namespacetesting.html#aa5717bb1144edd1d262d310ba70c82ed">::testing::PrintToString</a>(v1) << <span class="stringliteral">"\n"</span></div><div class="line"><a name="l14945"></a><span class="lineno">14945</span>  << e2 << <span class="stringliteral">" evaluates to "</span> << <a class="code" href="namespacetesting.html#aa5717bb1144edd1d262d310ba70c82ed">::testing::PrintToString</a>(v2) << <span class="stringliteral">"\n"</span></div><div class="line"><a name="l14946"></a><span class="lineno">14946</span>  << e3 << <span class="stringliteral">" evaluates to "</span> << <a class="code" href="namespacetesting.html#aa5717bb1144edd1d262d310ba70c82ed">::testing::PrintToString</a>(v3) << <span class="stringliteral">"\n"</span></div><div class="line"><a name="l14947"></a><span class="lineno">14947</span>  << e4 << <span class="stringliteral">" evaluates to "</span> << <a class="code" href="namespacetesting.html#aa5717bb1144edd1d262d310ba70c82ed">::testing::PrintToString</a>(v4) << <span class="stringliteral">"\n"</span></div><div class="line"><a name="l14948"></a><span class="lineno">14948</span>  << e5 << <span class="stringliteral">" evaluates to "</span> << <a class="code" href="namespacetesting.html#aa5717bb1144edd1d262d310ba70c82ed">::testing::PrintToString</a>(v5);</div><div class="line"><a name="l14949"></a><span class="lineno">14949</span> }</div><div class="line"><a name="l14950"></a><span class="lineno">14950</span> </div><div class="line"><a name="l14951"></a><span class="lineno">14951</span> <span class="comment">// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT5.</span></div><div class="line"><a name="l14952"></a><span class="lineno">14952</span> <span class="comment">// Don't use this in your code.</span></div><div class="line"><a name="l14953"></a><span class="lineno"><a class="line" href="gtest_8h.html#a107623ee191560f703a3fdc983803c8e">14953</a></span> <span class="preprocessor">#define GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, on_failure)\</span></div><div class="line"><a name="l14954"></a><span class="lineno">14954</span> <span class="preprocessor"> GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, #v5, v1, v2, v3, v4, v5), \</span></div><div class="line"><a name="l14955"></a><span class="lineno">14955</span> <span class="preprocessor"> on_failure)</span></div><div class="line"><a name="l14956"></a><span class="lineno">14956</span> </div><div class="line"><a name="l14957"></a><span class="lineno">14957</span> <span class="comment">// Internal macro for implementing {EXPECT|ASSERT}_PRED5. Don't use</span></div><div class="line"><a name="l14958"></a><span class="lineno">14958</span> <span class="comment">// this in your code.</span></div><div class="line"><a name="l14959"></a><span class="lineno"><a class="line" href="gtest_8h.html#a2c42692f7d910dc2fe57869883190e6c">14959</a></span> <span class="preprocessor">#define GTEST_PRED5_(pred, v1, v2, v3, v4, v5, on_failure)\</span></div><div class="line"><a name="l14960"></a><span class="lineno">14960</span> <span class="preprocessor"> GTEST_ASSERT_(::testing::AssertPred5Helper(#pred, \</span></div><div class="line"><a name="l14961"></a><span class="lineno">14961</span> <span class="preprocessor"> #v1, \</span></div><div class="line"><a name="l14962"></a><span class="lineno">14962</span> <span class="preprocessor"> #v2, \</span></div><div class="line"><a name="l14963"></a><span class="lineno">14963</span> <span class="preprocessor"> #v3, \</span></div><div class="line"><a name="l14964"></a><span class="lineno">14964</span> <span class="preprocessor"> #v4, \</span></div><div class="line"><a name="l14965"></a><span class="lineno">14965</span> <span class="preprocessor"> #v5, \</span></div><div class="line"><a name="l14966"></a><span class="lineno">14966</span> <span class="preprocessor"> pred, \</span></div><div class="line"><a name="l14967"></a><span class="lineno">14967</span> <span class="preprocessor"> v1, \</span></div><div class="line"><a name="l14968"></a><span class="lineno">14968</span> <span class="preprocessor"> v2, \</span></div><div class="line"><a name="l14969"></a><span class="lineno">14969</span> <span class="preprocessor"> v3, \</span></div><div class="line"><a name="l14970"></a><span class="lineno">14970</span> <span class="preprocessor"> v4, \</span></div><div class="line"><a name="l14971"></a><span class="lineno">14971</span> <span class="preprocessor"> v5), on_failure)</span></div><div class="line"><a name="l14972"></a><span class="lineno">14972</span> </div><div class="line"><a name="l14973"></a><span class="lineno">14973</span> <span class="comment">// 5-ary predicate assertion macros.</span></div><div class="line"><a name="l14974"></a><span class="lineno"><a class="line" href="gtest_8h.html#a74beddf9661e4460f9969fe211b9e80e">14974</a></span> <span class="preprocessor">#define EXPECT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \</span></div><div class="line"><a name="l14975"></a><span class="lineno">14975</span> <span class="preprocessor"> GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_)</span></div><div class="line"><a name="l14976"></a><span class="lineno"><a class="line" href="gtest_8h.html#adbfcc13f3b3d14c42a7fbd41573932bf">14976</a></span> <span class="preprocessor">#define EXPECT_PRED5(pred, v1, v2, v3, v4, v5) \</span></div><div class="line"><a name="l14977"></a><span class="lineno">14977</span> <span class="preprocessor"> GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_)</span></div><div class="line"><a name="l14978"></a><span class="lineno"><a class="line" href="gtest_8h.html#abd7cb4f36d6aa2cb346ab3ac812568f3">14978</a></span> <span class="preprocessor">#define ASSERT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \</span></div><div class="line"><a name="l14979"></a><span class="lineno">14979</span> <span class="preprocessor"> GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_)</span></div><div class="line"><a name="l14980"></a><span class="lineno"><a class="line" href="gtest_8h.html#af8e510af2b4a14d90eef66ace17d1c30">14980</a></span> <span class="preprocessor">#define ASSERT_PRED5(pred, v1, v2, v3, v4, v5) \</span></div><div class="line"><a name="l14981"></a><span class="lineno">14981</span> <span class="preprocessor"> GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_)</span></div><div class="line"><a name="l14982"></a><span class="lineno">14982</span> </div><div class="line"><a name="l14983"></a><span class="lineno">14983</span> </div><div class="line"><a name="l14984"></a><span class="lineno">14984</span> </div><div class="line"><a name="l14985"></a><span class="lineno">14985</span> } <span class="comment">// namespace testing</span></div><div class="line"><a name="l14986"></a><span class="lineno">14986</span> </div><div class="line"><a name="l14987"></a><span class="lineno">14987</span> <span class="preprocessor">#endif // GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_</span></div><div class="line"><a name="l14988"></a><span class="lineno">14988</span> </div><div class="line"><a name="l14989"></a><span class="lineno">14989</span> <span class="keyword">namespace </span><a class="code" href="namespacetesting.html">testing</a> {</div><div class="line"><a name="l14990"></a><span class="lineno">14990</span> </div><div class="line"><a name="l14991"></a><span class="lineno">14991</span> <span class="comment">// The abstract class that all tests inherit from.</span></div><div class="line"><a name="l14992"></a><span class="lineno">14992</span> <span class="comment">//</span></div><div class="line"><a name="l14993"></a><span class="lineno">14993</span> <span class="comment">// In Google Test, a unit test program contains one or many TestSuites, and</span></div><div class="line"><a name="l14994"></a><span class="lineno">14994</span> <span class="comment">// each TestSuite contains one or many Tests.</span></div><div class="line"><a name="l14995"></a><span class="lineno">14995</span> <span class="comment">//</span></div><div class="line"><a name="l14996"></a><span class="lineno">14996</span> <span class="comment">// When you define a test using the TEST macro, you don't need to</span></div><div class="line"><a name="l14997"></a><span class="lineno">14997</span> <span class="comment">// explicitly derive from Test - the TEST macro automatically does</span></div><div class="line"><a name="l14998"></a><span class="lineno">14998</span> <span class="comment">// this for you.</span></div><div class="line"><a name="l14999"></a><span class="lineno">14999</span> <span class="comment">//</span></div><div class="line"><a name="l15000"></a><span class="lineno">15000</span> <span class="comment">// The only time you derive from Test is when defining a test fixture</span></div><div class="line"><a name="l15001"></a><span class="lineno">15001</span> <span class="comment">// to be used in a TEST_F. For example:</span></div><div class="line"><a name="l15002"></a><span class="lineno">15002</span> <span class="comment">//</span></div><div class="line"><a name="l15003"></a><span class="lineno">15003</span> <span class="comment">// class FooTest : public testing::Test {</span></div><div class="line"><a name="l15004"></a><span class="lineno">15004</span> <span class="comment">// protected:</span></div><div class="line"><a name="l15005"></a><span class="lineno">15005</span> <span class="comment">// void SetUp() override { ... }</span></div><div class="line"><a name="l15006"></a><span class="lineno">15006</span> <span class="comment">// void TearDown() override { ... }</span></div><div class="line"><a name="l15007"></a><span class="lineno">15007</span> <span class="comment">// ...</span></div><div class="line"><a name="l15008"></a><span class="lineno">15008</span> <span class="comment">// };</span></div><div class="line"><a name="l15009"></a><span class="lineno">15009</span> <span class="comment">//</span></div><div class="line"><a name="l15010"></a><span class="lineno">15010</span> <span class="comment">// TEST_F(FooTest, Bar) { ... }</span></div><div class="line"><a name="l15011"></a><span class="lineno">15011</span> <span class="comment">// TEST_F(FooTest, Baz) { ... }</span></div><div class="line"><a name="l15012"></a><span class="lineno">15012</span> <span class="comment">//</span></div><div class="line"><a name="l15013"></a><span class="lineno">15013</span> <span class="comment">// Test is not copyable.</span></div><div class="line"><a name="l15014"></a><span class="lineno"><a class="line" href="classtesting_1_1_test.html">15014</a></span> <span class="keyword">class </span><a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> <a class="code" href="classtesting_1_1_test.html">Test</a> {</div><div class="line"><a name="l15015"></a><span class="lineno">15015</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l15016"></a><span class="lineno"><a class="line" href="classtesting_1_1_test.html#a4c49c2cdb6c328e6b709b4542f23de3c">15016</a></span>  <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classtesting_1_1_test_info.html">TestInfo</a>;</div><div class="line"><a name="l15017"></a><span class="lineno">15017</span> </div><div class="line"><a name="l15018"></a><span class="lineno">15018</span>  <span class="comment">// The d'tor is virtual as we intend to inherit from Test.</span></div><div class="line"><a name="l15019"></a><span class="lineno">15019</span>  <span class="keyword">virtual</span> ~<a class="code" href="classtesting_1_1_test.html">Test</a>();</div><div class="line"><a name="l15020"></a><span class="lineno">15020</span> </div><div class="line"><a name="l15021"></a><span class="lineno">15021</span>  <span class="comment">// Sets up the stuff shared by all tests in this test case.</span></div><div class="line"><a name="l15022"></a><span class="lineno">15022</span>  <span class="comment">//</span></div><div class="line"><a name="l15023"></a><span class="lineno">15023</span>  <span class="comment">// Google Test will call Foo::SetUpTestSuite() before running the first</span></div><div class="line"><a name="l15024"></a><span class="lineno">15024</span>  <span class="comment">// test in test case Foo. Hence a sub-class can define its own</span></div><div class="line"><a name="l15025"></a><span class="lineno">15025</span>  <span class="comment">// SetUpTestSuite() method to shadow the one defined in the super</span></div><div class="line"><a name="l15026"></a><span class="lineno">15026</span>  <span class="comment">// class.</span></div><div class="line"><a name="l15027"></a><span class="lineno"><a class="line" href="classtesting_1_1_test.html#ae173b07a0fdd09fc1d417a2bb6cbdd76">15027</a></span>  <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classtesting_1_1_test.html#ae173b07a0fdd09fc1d417a2bb6cbdd76">SetUpTestSuite</a>() {}</div><div class="line"><a name="l15028"></a><span class="lineno">15028</span> </div><div class="line"><a name="l15029"></a><span class="lineno">15029</span>  <span class="comment">// Tears down the stuff shared by all tests in this test case.</span></div><div class="line"><a name="l15030"></a><span class="lineno">15030</span>  <span class="comment">//</span></div><div class="line"><a name="l15031"></a><span class="lineno">15031</span>  <span class="comment">// Google Test will call Foo::TearDownTestSuite() after running the last</span></div><div class="line"><a name="l15032"></a><span class="lineno">15032</span>  <span class="comment">// test in test case Foo. Hence a sub-class can define its own</span></div><div class="line"><a name="l15033"></a><span class="lineno">15033</span>  <span class="comment">// TearDownTestSuite() method to shadow the one defined in the super</span></div><div class="line"><a name="l15034"></a><span class="lineno">15034</span>  <span class="comment">// class.</span></div><div class="line"><a name="l15035"></a><span class="lineno"><a class="line" href="classtesting_1_1_test.html#a7704c8223ba28338a66ca2eaeba66383">15035</a></span>  <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classtesting_1_1_test.html#a7704c8223ba28338a66ca2eaeba66383">TearDownTestSuite</a>() {}</div><div class="line"><a name="l15036"></a><span class="lineno">15036</span> </div><div class="line"><a name="l15037"></a><span class="lineno">15037</span>  <span class="comment">// Legacy API is deprecated but still available</span></div><div class="line"><a name="l15038"></a><span class="lineno">15038</span> <span class="preprocessor">#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_</span></div><div class="line"><a name="l15039"></a><span class="lineno"><a class="line" href="classtesting_1_1_test.html#af374706cbaf0ffc460f4fd04e7c150f1">15039</a></span>  <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classtesting_1_1_test.html#af374706cbaf0ffc460f4fd04e7c150f1">TearDownTestCase</a>() {}</div><div class="line"><a name="l15040"></a><span class="lineno"><a class="line" href="classtesting_1_1_test.html#a5ccbac42fee8c5b00b0bfe89b6c49d79">15040</a></span>  <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classtesting_1_1_test.html#a5ccbac42fee8c5b00b0bfe89b6c49d79">SetUpTestCase</a>() {}</div><div class="line"><a name="l15041"></a><span class="lineno">15041</span> <span class="preprocessor">#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_</span></div><div class="line"><a name="l15042"></a><span class="lineno">15042</span> </div><div class="line"><a name="l15043"></a><span class="lineno">15043</span>  <span class="comment">// Returns true iff the current test has a fatal failure.</span></div><div class="line"><a name="l15044"></a><span class="lineno">15044</span>  <span class="keyword">static</span> <span class="keywordtype">bool</span> HasFatalFailure();</div><div class="line"><a name="l15045"></a><span class="lineno">15045</span> </div><div class="line"><a name="l15046"></a><span class="lineno">15046</span>  <span class="comment">// Returns true iff the current test has a non-fatal failure.</span></div><div class="line"><a name="l15047"></a><span class="lineno">15047</span>  <span class="keyword">static</span> <span class="keywordtype">bool</span> HasNonfatalFailure();</div><div class="line"><a name="l15048"></a><span class="lineno">15048</span> </div><div class="line"><a name="l15049"></a><span class="lineno">15049</span>  <span class="comment">// Returns true iff the current test was skipped.</span></div><div class="line"><a name="l15050"></a><span class="lineno">15050</span>  <span class="keyword">static</span> <span class="keywordtype">bool</span> IsSkipped();</div><div class="line"><a name="l15051"></a><span class="lineno">15051</span> </div><div class="line"><a name="l15052"></a><span class="lineno">15052</span>  <span class="comment">// Returns true iff the current test has a (either fatal or</span></div><div class="line"><a name="l15053"></a><span class="lineno">15053</span>  <span class="comment">// non-fatal) failure.</span></div><div class="line"><a name="l15054"></a><span class="lineno"><a class="line" href="classtesting_1_1_test.html#a7a00be7dd0a6bfdc8d47a1b784623613">15054</a></span>  <span class="keyword">static</span> <span class="keywordtype">bool</span> <a class="code" href="classtesting_1_1_test.html#a7a00be7dd0a6bfdc8d47a1b784623613">HasFailure</a>() { <span class="keywordflow">return</span> HasFatalFailure() || HasNonfatalFailure(); }</div><div class="line"><a name="l15055"></a><span class="lineno">15055</span> </div><div class="line"><a name="l15056"></a><span class="lineno">15056</span>  <span class="comment">// Logs a property for the current test, test suite, or for the entire</span></div><div class="line"><a name="l15057"></a><span class="lineno">15057</span>  <span class="comment">// invocation of the test program when used outside of the context of a</span></div><div class="line"><a name="l15058"></a><span class="lineno">15058</span>  <span class="comment">// test suite. Only the last value for a given key is remembered. These</span></div><div class="line"><a name="l15059"></a><span class="lineno">15059</span>  <span class="comment">// are public static so they can be called from utility functions that are</span></div><div class="line"><a name="l15060"></a><span class="lineno">15060</span>  <span class="comment">// not members of the test fixture. Calls to RecordProperty made during</span></div><div class="line"><a name="l15061"></a><span class="lineno">15061</span>  <span class="comment">// lifespan of the test (from the moment its constructor starts to the</span></div><div class="line"><a name="l15062"></a><span class="lineno">15062</span>  <span class="comment">// moment its destructor finishes) will be output in XML as attributes of</span></div><div class="line"><a name="l15063"></a><span class="lineno">15063</span>  <span class="comment">// the <testcase> element. Properties recorded from fixture's</span></div><div class="line"><a name="l15064"></a><span class="lineno">15064</span>  <span class="comment">// SetUpTestSuite or TearDownTestSuite are logged as attributes of the</span></div><div class="line"><a name="l15065"></a><span class="lineno">15065</span>  <span class="comment">// corresponding <testsuite> element. Calls to RecordProperty made in the</span></div><div class="line"><a name="l15066"></a><span class="lineno">15066</span>  <span class="comment">// global context (before or after invocation of RUN_ALL_TESTS and from</span></div><div class="line"><a name="l15067"></a><span class="lineno">15067</span>  <span class="comment">// SetUp/TearDown method of Environment objects registered with Google</span></div><div class="line"><a name="l15068"></a><span class="lineno">15068</span>  <span class="comment">// Test) will be output as attributes of the <testsuites> element.</span></div><div class="line"><a name="l15069"></a><span class="lineno">15069</span>  <span class="keyword">static</span> <span class="keywordtype">void</span> RecordProperty(<span class="keyword">const</span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a>& key, <span class="keyword">const</span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a>& value);</div><div class="line"><a name="l15070"></a><span class="lineno">15070</span>  <span class="keyword">static</span> <span class="keywordtype">void</span> RecordProperty(<span class="keyword">const</span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a>& key, <span class="keywordtype">int</span> value);</div><div class="line"><a name="l15071"></a><span class="lineno">15071</span> </div><div class="line"><a name="l15072"></a><span class="lineno">15072</span>  <span class="keyword">protected</span>:</div><div class="line"><a name="l15073"></a><span class="lineno">15073</span>  <span class="comment">// Creates a Test object.</span></div><div class="line"><a name="l15074"></a><span class="lineno">15074</span>  <a class="code" href="classtesting_1_1_test.html">Test</a>();</div><div class="line"><a name="l15075"></a><span class="lineno">15075</span> </div><div class="line"><a name="l15076"></a><span class="lineno">15076</span>  <span class="comment">// Sets up the test fixture.</span></div><div class="line"><a name="l15077"></a><span class="lineno">15077</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> SetUp();</div><div class="line"><a name="l15078"></a><span class="lineno">15078</span> </div><div class="line"><a name="l15079"></a><span class="lineno">15079</span>  <span class="comment">// Tears down the test fixture.</span></div><div class="line"><a name="l15080"></a><span class="lineno">15080</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> TearDown();</div><div class="line"><a name="l15081"></a><span class="lineno">15081</span> </div><div class="line"><a name="l15082"></a><span class="lineno">15082</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l15083"></a><span class="lineno">15083</span>  <span class="comment">// Returns true iff the current test has the same fixture class as</span></div><div class="line"><a name="l15084"></a><span class="lineno">15084</span>  <span class="comment">// the first test in the current test suite.</span></div><div class="line"><a name="l15085"></a><span class="lineno">15085</span>  <span class="keyword">static</span> <span class="keywordtype">bool</span> HasSameFixtureClass();</div><div class="line"><a name="l15086"></a><span class="lineno">15086</span> </div><div class="line"><a name="l15087"></a><span class="lineno">15087</span>  <span class="comment">// Runs the test after the test fixture has been set up.</span></div><div class="line"><a name="l15088"></a><span class="lineno">15088</span>  <span class="comment">//</span></div><div class="line"><a name="l15089"></a><span class="lineno">15089</span>  <span class="comment">// A sub-class must implement this to define the test logic.</span></div><div class="line"><a name="l15090"></a><span class="lineno">15090</span>  <span class="comment">//</span></div><div class="line"><a name="l15091"></a><span class="lineno">15091</span>  <span class="comment">// DO NOT OVERRIDE THIS FUNCTION DIRECTLY IN A USER PROGRAM.</span></div><div class="line"><a name="l15092"></a><span class="lineno">15092</span>  <span class="comment">// Instead, use the TEST or TEST_F macro.</span></div><div class="line"><a name="l15093"></a><span class="lineno">15093</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> TestBody() = 0;</div><div class="line"><a name="l15094"></a><span class="lineno">15094</span> </div><div class="line"><a name="l15095"></a><span class="lineno">15095</span>  <span class="comment">// Sets up, executes, and tears down the test.</span></div><div class="line"><a name="l15096"></a><span class="lineno">15096</span>  <span class="keywordtype">void</span> Run();</div><div class="line"><a name="l15097"></a><span class="lineno">15097</span> </div><div class="line"><a name="l15098"></a><span class="lineno">15098</span>  <span class="comment">// Deletes self. We deliberately pick an unusual name for this</span></div><div class="line"><a name="l15099"></a><span class="lineno">15099</span>  <span class="comment">// internal method to avoid clashing with names used in user TESTs.</span></div><div class="line"><a name="l15100"></a><span class="lineno">15100</span>  <span class="keywordtype">void</span> DeleteSelf_() { <span class="keyword">delete</span> <span class="keyword">this</span>; }</div><div class="line"><a name="l15101"></a><span class="lineno">15101</span> </div><div class="line"><a name="l15102"></a><span class="lineno">15102</span>  <span class="keyword">const</span> std::unique_ptr<GTEST_FLAG_SAVER_> gtest_flag_saver_;</div><div class="line"><a name="l15103"></a><span class="lineno">15103</span> </div><div class="line"><a name="l15104"></a><span class="lineno">15104</span>  <span class="comment">// Often a user misspells SetUp() as Setup() and spends a long time</span></div><div class="line"><a name="l15105"></a><span class="lineno">15105</span>  <span class="comment">// wondering why it is never called by Google Test. The declaration of</span></div><div class="line"><a name="l15106"></a><span class="lineno">15106</span>  <span class="comment">// the following method is solely for catching such an error at</span></div><div class="line"><a name="l15107"></a><span class="lineno">15107</span>  <span class="comment">// compile time:</span></div><div class="line"><a name="l15108"></a><span class="lineno">15108</span>  <span class="comment">//</span></div><div class="line"><a name="l15109"></a><span class="lineno">15109</span>  <span class="comment">// - The return type is deliberately chosen to be not void, so it</span></div><div class="line"><a name="l15110"></a><span class="lineno">15110</span>  <span class="comment">// will be a conflict if void Setup() is declared in the user's</span></div><div class="line"><a name="l15111"></a><span class="lineno">15111</span>  <span class="comment">// test fixture.</span></div><div class="line"><a name="l15112"></a><span class="lineno">15112</span>  <span class="comment">//</span></div><div class="line"><a name="l15113"></a><span class="lineno">15113</span>  <span class="comment">// - This method is private, so it will be another compiler error</span></div><div class="line"><a name="l15114"></a><span class="lineno">15114</span>  <span class="comment">// if the method is called from the user's test fixture.</span></div><div class="line"><a name="l15115"></a><span class="lineno">15115</span>  <span class="comment">//</span></div><div class="line"><a name="l15116"></a><span class="lineno">15116</span>  <span class="comment">// DO NOT OVERRIDE THIS FUNCTION.</span></div><div class="line"><a name="l15117"></a><span class="lineno">15117</span>  <span class="comment">//</span></div><div class="line"><a name="l15118"></a><span class="lineno">15118</span>  <span class="comment">// If you see an error about overriding the following function or</span></div><div class="line"><a name="l15119"></a><span class="lineno">15119</span>  <span class="comment">// about it being private, you have mis-spelled SetUp() as Setup().</span></div><div class="line"><a name="l15120"></a><span class="lineno">15120</span>  <span class="keyword">struct </span>Setup_should_be_spelled_SetUp {};</div><div class="line"><a name="l15121"></a><span class="lineno">15121</span>  <span class="keyword">virtual</span> Setup_should_be_spelled_SetUp* Setup() { <span class="keywordflow">return</span> <span class="keyword">nullptr</span>; }</div><div class="line"><a name="l15122"></a><span class="lineno">15122</span> </div><div class="line"><a name="l15123"></a><span class="lineno">15123</span>  <span class="comment">// We disallow copying Tests.</span></div><div class="line"><a name="l15124"></a><span class="lineno">15124</span>  <a class="code" href="gtest_8h.html#aed8c1888c32b588b0681e88b95031e29">GTEST_DISALLOW_COPY_AND_ASSIGN_</a>(Test);</div><div class="line"><a name="l15125"></a><span class="lineno">15125</span> };</div><div class="line"><a name="l15126"></a><span class="lineno">15126</span> </div><div class="line"><a name="l15127"></a><span class="lineno"><a class="line" href="namespacetesting.html#a992de1d091ce660f451d1e8b3ce30fd6">15127</a></span> <span class="keyword">typedef</span> <a class="code" href="namespacetesting_1_1internal.html#a66a845df404b38fe85c5e14a069f255a">internal::TimeInMillis</a> <a class="code" href="namespacetesting.html#a992de1d091ce660f451d1e8b3ce30fd6">TimeInMillis</a>;</div><div class="line"><a name="l15128"></a><span class="lineno">15128</span> </div><div class="line"><a name="l15129"></a><span class="lineno">15129</span> <span class="comment">// A copyable object representing a user specified test property which can be</span></div><div class="line"><a name="l15130"></a><span class="lineno">15130</span> <span class="comment">// output as a key/value string pair.</span></div><div class="line"><a name="l15131"></a><span class="lineno">15131</span> <span class="comment">//</span></div><div class="line"><a name="l15132"></a><span class="lineno">15132</span> <span class="comment">// Don't inherit from TestProperty as its destructor is not virtual.</span></div><div class="line"><a name="l15133"></a><span class="lineno"><a class="line" href="classtesting_1_1_test_property.html">15133</a></span> <span class="keyword">class </span><a class="code" href="classtesting_1_1_test_property.html">TestProperty</a> {</div><div class="line"><a name="l15134"></a><span class="lineno">15134</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l15135"></a><span class="lineno">15135</span>  <span class="comment">// C'tor. TestProperty does NOT have a default constructor.</span></div><div class="line"><a name="l15136"></a><span class="lineno">15136</span>  <span class="comment">// Always use this constructor (with parameters) to create a</span></div><div class="line"><a name="l15137"></a><span class="lineno">15137</span>  <span class="comment">// TestProperty object.</span></div><div class="line"><a name="l15138"></a><span class="lineno"><a class="line" href="classtesting_1_1_test_property.html#a25a0ccf1c75a92af46a48d3c2a873e6d">15138</a></span>  <a class="code" href="classtesting_1_1_test_property.html#a25a0ccf1c75a92af46a48d3c2a873e6d">TestProperty</a>(<span class="keyword">const</span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a>& a_key, <span class="keyword">const</span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a>& a_value) :</div><div class="line"><a name="l15139"></a><span class="lineno">15139</span>  key_(a_key), value_(a_value) {</div><div class="line"><a name="l15140"></a><span class="lineno">15140</span>  }</div><div class="line"><a name="l15141"></a><span class="lineno">15141</span> </div><div class="line"><a name="l15142"></a><span class="lineno">15142</span>  <span class="comment">// Gets the user supplied key.</span></div><div class="line"><a name="l15143"></a><span class="lineno"><a class="line" href="classtesting_1_1_test_property.html#ad60435d4ad04ac030487d8998fc61c5f">15143</a></span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="classtesting_1_1_test_property.html#ad60435d4ad04ac030487d8998fc61c5f">key</a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l15144"></a><span class="lineno">15144</span>  <span class="keywordflow">return</span> key_.c_str();</div><div class="line"><a name="l15145"></a><span class="lineno">15145</span>  }</div><div class="line"><a name="l15146"></a><span class="lineno">15146</span> </div><div class="line"><a name="l15147"></a><span class="lineno">15147</span>  <span class="comment">// Gets the user supplied value.</span></div><div class="line"><a name="l15148"></a><span class="lineno"><a class="line" href="classtesting_1_1_test_property.html#ad423a07af33c88b0c9ed33ee74815a63">15148</a></span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="classtesting_1_1_test_property.html#ad423a07af33c88b0c9ed33ee74815a63">value</a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l15149"></a><span class="lineno">15149</span>  <span class="keywordflow">return</span> value_.c_str();</div><div class="line"><a name="l15150"></a><span class="lineno">15150</span>  }</div><div class="line"><a name="l15151"></a><span class="lineno">15151</span> </div><div class="line"><a name="l15152"></a><span class="lineno">15152</span>  <span class="comment">// Sets a new value, overriding the one supplied in the constructor.</span></div><div class="line"><a name="l15153"></a><span class="lineno"><a class="line" href="classtesting_1_1_test_property.html#a377245335d9f614cd06d1650e3358e1d">15153</a></span>  <span class="keywordtype">void</span> <a class="code" href="classtesting_1_1_test_property.html#a377245335d9f614cd06d1650e3358e1d">SetValue</a>(<span class="keyword">const</span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a>& new_value) {</div><div class="line"><a name="l15154"></a><span class="lineno">15154</span>  value_ = new_value;</div><div class="line"><a name="l15155"></a><span class="lineno">15155</span>  }</div><div class="line"><a name="l15156"></a><span class="lineno">15156</span> </div><div class="line"><a name="l15157"></a><span class="lineno">15157</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l15158"></a><span class="lineno">15158</span>  <span class="comment">// The key supplied by the user.</span></div><div class="line"><a name="l15159"></a><span class="lineno">15159</span>  <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a> key_;</div><div class="line"><a name="l15160"></a><span class="lineno">15160</span>  <span class="comment">// The value supplied by the user.</span></div><div class="line"><a name="l15161"></a><span class="lineno">15161</span>  <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a> value_;</div><div class="line"><a name="l15162"></a><span class="lineno">15162</span> };</div><div class="line"><a name="l15163"></a><span class="lineno">15163</span> </div><div class="line"><a name="l15164"></a><span class="lineno">15164</span> <span class="comment">// The result of a single Test. This includes a list of</span></div><div class="line"><a name="l15165"></a><span class="lineno">15165</span> <span class="comment">// TestPartResults, a list of TestProperties, a count of how many</span></div><div class="line"><a name="l15166"></a><span class="lineno">15166</span> <span class="comment">// death tests there are in the Test, and how much time it took to run</span></div><div class="line"><a name="l15167"></a><span class="lineno">15167</span> <span class="comment">// the Test.</span></div><div class="line"><a name="l15168"></a><span class="lineno">15168</span> <span class="comment">//</span></div><div class="line"><a name="l15169"></a><span class="lineno">15169</span> <span class="comment">// TestResult is not copyable.</span></div><div class="line"><a name="l15170"></a><span class="lineno"><a class="line" href="classtesting_1_1_test_result.html">15170</a></span> <span class="keyword">class </span><a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> <a class="code" href="classtesting_1_1_test_result.html">TestResult</a> {</div><div class="line"><a name="l15171"></a><span class="lineno">15171</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l15172"></a><span class="lineno">15172</span>  <span class="comment">// Creates an empty TestResult.</span></div><div class="line"><a name="l15173"></a><span class="lineno">15173</span>  <a class="code" href="classtesting_1_1_test_result.html">TestResult</a>();</div><div class="line"><a name="l15174"></a><span class="lineno">15174</span> </div><div class="line"><a name="l15175"></a><span class="lineno">15175</span>  <span class="comment">// D'tor. Do not inherit from TestResult.</span></div><div class="line"><a name="l15176"></a><span class="lineno">15176</span>  ~<a class="code" href="classtesting_1_1_test_result.html">TestResult</a>();</div><div class="line"><a name="l15177"></a><span class="lineno">15177</span> </div><div class="line"><a name="l15178"></a><span class="lineno">15178</span>  <span class="comment">// Gets the number of all test parts. This is the sum of the number</span></div><div class="line"><a name="l15179"></a><span class="lineno">15179</span>  <span class="comment">// of successful test parts and the number of failed test parts.</span></div><div class="line"><a name="l15180"></a><span class="lineno">15180</span>  <span class="keywordtype">int</span> total_part_count() <span class="keyword">const</span>;</div><div class="line"><a name="l15181"></a><span class="lineno">15181</span> </div><div class="line"><a name="l15182"></a><span class="lineno">15182</span>  <span class="comment">// Returns the number of the test properties.</span></div><div class="line"><a name="l15183"></a><span class="lineno">15183</span>  <span class="keywordtype">int</span> test_property_count() <span class="keyword">const</span>;</div><div class="line"><a name="l15184"></a><span class="lineno">15184</span> </div><div class="line"><a name="l15185"></a><span class="lineno">15185</span>  <span class="comment">// Returns true iff the test passed (i.e. no test part failed).</span></div><div class="line"><a name="l15186"></a><span class="lineno"><a class="line" href="classtesting_1_1_test_result.html#acf7e6e72f05a0545c48ea48e7f8851df">15186</a></span>  <span class="keywordtype">bool</span> <a class="code" href="classtesting_1_1_test_result.html#acf7e6e72f05a0545c48ea48e7f8851df">Passed</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> !Skipped() && !Failed(); }</div><div class="line"><a name="l15187"></a><span class="lineno">15187</span> </div><div class="line"><a name="l15188"></a><span class="lineno">15188</span>  <span class="comment">// Returns true iff the test was skipped.</span></div><div class="line"><a name="l15189"></a><span class="lineno">15189</span>  <span class="keywordtype">bool</span> Skipped() <span class="keyword">const</span>;</div><div class="line"><a name="l15190"></a><span class="lineno">15190</span> </div><div class="line"><a name="l15191"></a><span class="lineno">15191</span>  <span class="comment">// Returns true iff the test failed.</span></div><div class="line"><a name="l15192"></a><span class="lineno">15192</span>  <span class="keywordtype">bool</span> Failed() <span class="keyword">const</span>;</div><div class="line"><a name="l15193"></a><span class="lineno">15193</span> </div><div class="line"><a name="l15194"></a><span class="lineno">15194</span>  <span class="comment">// Returns true iff the test fatally failed.</span></div><div class="line"><a name="l15195"></a><span class="lineno">15195</span>  <span class="keywordtype">bool</span> HasFatalFailure() <span class="keyword">const</span>;</div><div class="line"><a name="l15196"></a><span class="lineno">15196</span> </div><div class="line"><a name="l15197"></a><span class="lineno">15197</span>  <span class="comment">// Returns true iff the test has a non-fatal failure.</span></div><div class="line"><a name="l15198"></a><span class="lineno">15198</span>  <span class="keywordtype">bool</span> HasNonfatalFailure() <span class="keyword">const</span>;</div><div class="line"><a name="l15199"></a><span class="lineno">15199</span> </div><div class="line"><a name="l15200"></a><span class="lineno">15200</span>  <span class="comment">// Returns the elapsed time, in milliseconds.</span></div><div class="line"><a name="l15201"></a><span class="lineno"><a class="line" href="classtesting_1_1_test_result.html#a717e05e00d4af5cb809433e343ab63af">15201</a></span>  <a class="code" href="namespacetesting.html#a992de1d091ce660f451d1e8b3ce30fd6">TimeInMillis</a> <a class="code" href="classtesting_1_1_test_result.html#a717e05e00d4af5cb809433e343ab63af">elapsed_time</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> elapsed_time_; }</div><div class="line"><a name="l15202"></a><span class="lineno">15202</span> </div><div class="line"><a name="l15203"></a><span class="lineno">15203</span>  <span class="comment">// Returns the i-th test part result among all the results. i can range from 0</span></div><div class="line"><a name="l15204"></a><span class="lineno">15204</span>  <span class="comment">// to total_part_count() - 1. If i is not in that range, aborts the program.</span></div><div class="line"><a name="l15205"></a><span class="lineno">15205</span>  <span class="keyword">const</span> TestPartResult& GetTestPartResult(<span class="keywordtype">int</span> i) <span class="keyword">const</span>;</div><div class="line"><a name="l15206"></a><span class="lineno">15206</span> </div><div class="line"><a name="l15207"></a><span class="lineno">15207</span>  <span class="comment">// Returns the i-th test property. i can range from 0 to</span></div><div class="line"><a name="l15208"></a><span class="lineno">15208</span>  <span class="comment">// test_property_count() - 1. If i is not in that range, aborts the</span></div><div class="line"><a name="l15209"></a><span class="lineno">15209</span>  <span class="comment">// program.</span></div><div class="line"><a name="l15210"></a><span class="lineno">15210</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1_test_property.html">TestProperty</a>& GetTestProperty(<span class="keywordtype">int</span> i) <span class="keyword">const</span>;</div><div class="line"><a name="l15211"></a><span class="lineno">15211</span> </div><div class="line"><a name="l15212"></a><span class="lineno">15212</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l15213"></a><span class="lineno"><a class="line" href="classtesting_1_1_test_result.html#a4c49c2cdb6c328e6b709b4542f23de3c">15213</a></span>  <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classtesting_1_1_test_info.html">TestInfo</a>;</div><div class="line"><a name="l15214"></a><span class="lineno"><a class="line" href="classtesting_1_1_test_result.html#ab9aaba231fd11196425e75caf709bfc6">15214</a></span>  <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classtesting_1_1_test_suite.html">TestSuite</a>;</div><div class="line"><a name="l15215"></a><span class="lineno"><a class="line" href="classtesting_1_1_test_result.html#a832b4d233efee1a32feb0f4190b30d39">15215</a></span>  <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classtesting_1_1_unit_test.html">UnitTest</a>;</div><div class="line"><a name="l15216"></a><span class="lineno"><a class="line" href="classtesting_1_1_test_result.html#abae39633da9932847b41cb80efd62115">15216</a></span>  <span class="keyword">friend</span> <span class="keyword">class </span>internal::DefaultGlobalTestPartResultReporter;</div><div class="line"><a name="l15217"></a><span class="lineno"><a class="line" href="classtesting_1_1_test_result.html#adf5553cae6aea6f8648d47e299237e34">15217</a></span>  <span class="keyword">friend</span> <span class="keyword">class </span>internal::ExecDeathTest;</div><div class="line"><a name="l15218"></a><span class="lineno"><a class="line" href="classtesting_1_1_test_result.html#ae762da04e74a0d3b0daded3c5bd4a8e8">15218</a></span>  <span class="keyword">friend</span> <span class="keyword">class </span>internal::TestResultAccessor;</div><div class="line"><a name="l15219"></a><span class="lineno"><a class="line" href="classtesting_1_1_test_result.html#acc0a5e7573fd6ae7ad1878613bb86853">15219</a></span>  <span class="keyword">friend</span> <span class="keyword">class </span>internal::UnitTestImpl;</div><div class="line"><a name="l15220"></a><span class="lineno"><a class="line" href="classtesting_1_1_test_result.html#a6aeedc04a0590fcc1b3c5f687dbb0f9f">15220</a></span>  <span class="keyword">friend</span> <span class="keyword">class </span>internal::WindowsDeathTest;</div><div class="line"><a name="l15221"></a><span class="lineno"><a class="line" href="classtesting_1_1_test_result.html#af29d5921f68031cdfba0b28cf4b3b559">15221</a></span>  <span class="keyword">friend</span> <span class="keyword">class </span>internal::FuchsiaDeathTest;</div><div class="line"><a name="l15222"></a><span class="lineno">15222</span> </div><div class="line"><a name="l15223"></a><span class="lineno">15223</span>  <span class="comment">// Gets the vector of TestPartResults.</span></div><div class="line"><a name="l15224"></a><span class="lineno">15224</span>  <span class="keyword">const</span> std::vector<TestPartResult>& test_part_results()<span class="keyword"> const </span>{</div><div class="line"><a name="l15225"></a><span class="lineno">15225</span>  <span class="keywordflow">return</span> test_part_results_;</div><div class="line"><a name="l15226"></a><span class="lineno">15226</span>  }</div><div class="line"><a name="l15227"></a><span class="lineno">15227</span> </div><div class="line"><a name="l15228"></a><span class="lineno">15228</span>  <span class="comment">// Gets the vector of TestProperties.</span></div><div class="line"><a name="l15229"></a><span class="lineno">15229</span>  <span class="keyword">const</span> std::vector<TestProperty>& test_properties()<span class="keyword"> const </span>{</div><div class="line"><a name="l15230"></a><span class="lineno">15230</span>  <span class="keywordflow">return</span> test_properties_;</div><div class="line"><a name="l15231"></a><span class="lineno">15231</span>  }</div><div class="line"><a name="l15232"></a><span class="lineno">15232</span> </div><div class="line"><a name="l15233"></a><span class="lineno">15233</span>  <span class="comment">// Sets the elapsed time.</span></div><div class="line"><a name="l15234"></a><span class="lineno">15234</span>  <span class="keywordtype">void</span> set_elapsed_time(<a class="code" href="namespacetesting.html#a992de1d091ce660f451d1e8b3ce30fd6">TimeInMillis</a> elapsed) { elapsed_time_ = elapsed; }</div><div class="line"><a name="l15235"></a><span class="lineno">15235</span> </div><div class="line"><a name="l15236"></a><span class="lineno">15236</span>  <span class="comment">// Adds a test property to the list. The property is validated and may add</span></div><div class="line"><a name="l15237"></a><span class="lineno">15237</span>  <span class="comment">// a non-fatal failure if invalid (e.g., if it conflicts with reserved</span></div><div class="line"><a name="l15238"></a><span class="lineno">15238</span>  <span class="comment">// key names). If a property is already recorded for the same key, the</span></div><div class="line"><a name="l15239"></a><span class="lineno">15239</span>  <span class="comment">// value will be updated, rather than storing multiple values for the same</span></div><div class="line"><a name="l15240"></a><span class="lineno">15240</span>  <span class="comment">// key. xml_element specifies the element for which the property is being</span></div><div class="line"><a name="l15241"></a><span class="lineno">15241</span>  <span class="comment">// recorded and is used for validation.</span></div><div class="line"><a name="l15242"></a><span class="lineno">15242</span>  <span class="keywordtype">void</span> RecordProperty(<span class="keyword">const</span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a>& xml_element,</div><div class="line"><a name="l15243"></a><span class="lineno">15243</span>  <span class="keyword">const</span> TestProperty& test_property);</div><div class="line"><a name="l15244"></a><span class="lineno">15244</span> </div><div class="line"><a name="l15245"></a><span class="lineno">15245</span>  <span class="comment">// Adds a failure if the key is a reserved attribute of Google Test</span></div><div class="line"><a name="l15246"></a><span class="lineno">15246</span>  <span class="comment">// testsuite tags. Returns true if the property is valid.</span></div><div class="line"><a name="l15247"></a><span class="lineno">15247</span>  <span class="comment">// FIXME: Validate attribute names are legal and human readable.</span></div><div class="line"><a name="l15248"></a><span class="lineno">15248</span>  <span class="keyword">static</span> <span class="keywordtype">bool</span> ValidateTestProperty(<span class="keyword">const</span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a>& xml_element,</div><div class="line"><a name="l15249"></a><span class="lineno">15249</span>  <span class="keyword">const</span> TestProperty& test_property);</div><div class="line"><a name="l15250"></a><span class="lineno">15250</span> </div><div class="line"><a name="l15251"></a><span class="lineno">15251</span>  <span class="comment">// Adds a test part result to the list.</span></div><div class="line"><a name="l15252"></a><span class="lineno">15252</span>  <span class="keywordtype">void</span> AddTestPartResult(<span class="keyword">const</span> TestPartResult& test_part_result);</div><div class="line"><a name="l15253"></a><span class="lineno">15253</span> </div><div class="line"><a name="l15254"></a><span class="lineno">15254</span>  <span class="comment">// Returns the death test count.</span></div><div class="line"><a name="l15255"></a><span class="lineno">15255</span>  <span class="keywordtype">int</span> death_test_count()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> death_test_count_; }</div><div class="line"><a name="l15256"></a><span class="lineno">15256</span> </div><div class="line"><a name="l15257"></a><span class="lineno">15257</span>  <span class="comment">// Increments the death test count, returning the new count.</span></div><div class="line"><a name="l15258"></a><span class="lineno">15258</span>  <span class="keywordtype">int</span> increment_death_test_count() { <span class="keywordflow">return</span> ++death_test_count_; }</div><div class="line"><a name="l15259"></a><span class="lineno">15259</span> </div><div class="line"><a name="l15260"></a><span class="lineno">15260</span>  <span class="comment">// Clears the test part results.</span></div><div class="line"><a name="l15261"></a><span class="lineno">15261</span>  <span class="keywordtype">void</span> ClearTestPartResults();</div><div class="line"><a name="l15262"></a><span class="lineno">15262</span> </div><div class="line"><a name="l15263"></a><span class="lineno">15263</span>  <span class="comment">// Clears the object.</span></div><div class="line"><a name="l15264"></a><span class="lineno">15264</span>  <span class="keywordtype">void</span> Clear();</div><div class="line"><a name="l15265"></a><span class="lineno">15265</span> </div><div class="line"><a name="l15266"></a><span class="lineno">15266</span>  <span class="comment">// Protects mutable state of the property vector and of owned</span></div><div class="line"><a name="l15267"></a><span class="lineno">15267</span>  <span class="comment">// properties, whose values may be updated.</span></div><div class="line"><a name="l15268"></a><span class="lineno">15268</span>  internal::Mutex test_properites_mutex_;</div><div class="line"><a name="l15269"></a><span class="lineno">15269</span> </div><div class="line"><a name="l15270"></a><span class="lineno">15270</span>  <span class="comment">// The vector of TestPartResults</span></div><div class="line"><a name="l15271"></a><span class="lineno">15271</span>  std::vector<TestPartResult> test_part_results_;</div><div class="line"><a name="l15272"></a><span class="lineno">15272</span>  <span class="comment">// The vector of TestProperties</span></div><div class="line"><a name="l15273"></a><span class="lineno">15273</span>  std::vector<TestProperty> test_properties_;</div><div class="line"><a name="l15274"></a><span class="lineno">15274</span>  <span class="comment">// Running count of death tests.</span></div><div class="line"><a name="l15275"></a><span class="lineno">15275</span>  <span class="keywordtype">int</span> death_test_count_;</div><div class="line"><a name="l15276"></a><span class="lineno">15276</span>  <span class="comment">// The elapsed time, in milliseconds.</span></div><div class="line"><a name="l15277"></a><span class="lineno">15277</span>  <a class="code" href="namespacetesting.html#a992de1d091ce660f451d1e8b3ce30fd6">TimeInMillis</a> elapsed_time_;</div><div class="line"><a name="l15278"></a><span class="lineno">15278</span> </div><div class="line"><a name="l15279"></a><span class="lineno">15279</span>  <span class="comment">// We disallow copying TestResult.</span></div><div class="line"><a name="l15280"></a><span class="lineno">15280</span>  <a class="code" href="gtest_8h.html#aed8c1888c32b588b0681e88b95031e29">GTEST_DISALLOW_COPY_AND_ASSIGN_</a>(TestResult);</div><div class="line"><a name="l15281"></a><span class="lineno">15281</span> }; <span class="comment">// class TestResult</span></div><div class="line"><a name="l15282"></a><span class="lineno">15282</span> </div><div class="line"><a name="l15283"></a><span class="lineno">15283</span> <span class="comment">// A TestInfo object stores the following information about a test:</span></div><div class="line"><a name="l15284"></a><span class="lineno">15284</span> <span class="comment">//</span></div><div class="line"><a name="l15285"></a><span class="lineno">15285</span> <span class="comment">// Test suite name</span></div><div class="line"><a name="l15286"></a><span class="lineno">15286</span> <span class="comment">// Test name</span></div><div class="line"><a name="l15287"></a><span class="lineno">15287</span> <span class="comment">// Whether the test should be run</span></div><div class="line"><a name="l15288"></a><span class="lineno">15288</span> <span class="comment">// A function pointer that creates the test object when invoked</span></div><div class="line"><a name="l15289"></a><span class="lineno">15289</span> <span class="comment">// Test result</span></div><div class="line"><a name="l15290"></a><span class="lineno">15290</span> <span class="comment">//</span></div><div class="line"><a name="l15291"></a><span class="lineno">15291</span> <span class="comment">// The constructor of TestInfo registers itself with the UnitTest</span></div><div class="line"><a name="l15292"></a><span class="lineno">15292</span> <span class="comment">// singleton such that the RUN_ALL_TESTS() macro knows which tests to</span></div><div class="line"><a name="l15293"></a><span class="lineno">15293</span> <span class="comment">// run.</span></div><div class="line"><a name="l15294"></a><span class="lineno"><a class="line" href="classtesting_1_1_test_info.html">15294</a></span> <span class="keyword">class </span><a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> <a class="code" href="classtesting_1_1_test_info.html">TestInfo</a> {</div><div class="line"><a name="l15295"></a><span class="lineno">15295</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l15296"></a><span class="lineno">15296</span>  <span class="comment">// Destructs a TestInfo object. This function is not virtual, so</span></div><div class="line"><a name="l15297"></a><span class="lineno">15297</span>  <span class="comment">// don't inherit from TestInfo.</span></div><div class="line"><a name="l15298"></a><span class="lineno">15298</span>  ~<a class="code" href="classtesting_1_1_test_info.html">TestInfo</a>();</div><div class="line"><a name="l15299"></a><span class="lineno">15299</span> </div><div class="line"><a name="l15300"></a><span class="lineno">15300</span>  <span class="comment">// Returns the test suite name.</span></div><div class="line"><a name="l15301"></a><span class="lineno"><a class="line" href="classtesting_1_1_test_info.html#a82a84ffd0e4d18eb5a3f97a2077e12cc">15301</a></span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="classtesting_1_1_test_info.html#a82a84ffd0e4d18eb5a3f97a2077e12cc">test_suite_name</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> test_suite_name_.c_str(); }</div><div class="line"><a name="l15302"></a><span class="lineno">15302</span> </div><div class="line"><a name="l15303"></a><span class="lineno">15303</span> <span class="comment">// Legacy API is deprecated but still available</span></div><div class="line"><a name="l15304"></a><span class="lineno">15304</span> <span class="preprocessor">#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_</span></div><div class="line"><a name="l15305"></a><span class="lineno"><a class="line" href="classtesting_1_1_test_info.html#a036a20710c8c2252889544daba9a8ff9">15305</a></span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="classtesting_1_1_test_info.html#a036a20710c8c2252889544daba9a8ff9">test_case_name</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> test_suite_name(); }</div><div class="line"><a name="l15306"></a><span class="lineno">15306</span> <span class="preprocessor">#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_</span></div><div class="line"><a name="l15307"></a><span class="lineno">15307</span> </div><div class="line"><a name="l15308"></a><span class="lineno">15308</span>  <span class="comment">// Returns the test name.</span></div><div class="line"><a name="l15309"></a><span class="lineno"><a class="line" href="classtesting_1_1_test_info.html#ac2581b45eccc9a3b94cb41c4807d0e34">15309</a></span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="classtesting_1_1_test_info.html#ac2581b45eccc9a3b94cb41c4807d0e34">name</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> name_.c_str(); }</div><div class="line"><a name="l15310"></a><span class="lineno">15310</span> </div><div class="line"><a name="l15311"></a><span class="lineno">15311</span>  <span class="comment">// Returns the name of the parameter type, or NULL if this is not a typed</span></div><div class="line"><a name="l15312"></a><span class="lineno">15312</span>  <span class="comment">// or a type-parameterized test.</span></div><div class="line"><a name="l15313"></a><span class="lineno"><a class="line" href="classtesting_1_1_test_info.html#a7759bc57f4350ad406cbbb0b3bcea320">15313</a></span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="classtesting_1_1_test_info.html#a7759bc57f4350ad406cbbb0b3bcea320">type_param</a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l15314"></a><span class="lineno">15314</span>  <span class="keywordflow">if</span> (type_param_.get() != <span class="keyword">nullptr</span>) <span class="keywordflow">return</span> type_param_->c_str();</div><div class="line"><a name="l15315"></a><span class="lineno">15315</span>  <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div><div class="line"><a name="l15316"></a><span class="lineno">15316</span>  }</div><div class="line"><a name="l15317"></a><span class="lineno">15317</span> </div><div class="line"><a name="l15318"></a><span class="lineno">15318</span>  <span class="comment">// Returns the text representation of the value parameter, or NULL if this</span></div><div class="line"><a name="l15319"></a><span class="lineno">15319</span>  <span class="comment">// is not a value-parameterized test.</span></div><div class="line"><a name="l15320"></a><span class="lineno"><a class="line" href="classtesting_1_1_test_info.html#abdf2c6cfcf4819e725816c64e1c1fc24">15320</a></span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="classtesting_1_1_test_info.html#abdf2c6cfcf4819e725816c64e1c1fc24">value_param</a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l15321"></a><span class="lineno">15321</span>  <span class="keywordflow">if</span> (value_param_.get() != <span class="keyword">nullptr</span>) <span class="keywordflow">return</span> value_param_->c_str();</div><div class="line"><a name="l15322"></a><span class="lineno">15322</span>  <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div><div class="line"><a name="l15323"></a><span class="lineno">15323</span>  }</div><div class="line"><a name="l15324"></a><span class="lineno">15324</span> </div><div class="line"><a name="l15325"></a><span class="lineno">15325</span>  <span class="comment">// Returns the file name where this test is defined.</span></div><div class="line"><a name="l15326"></a><span class="lineno"><a class="line" href="classtesting_1_1_test_info.html#a9b74d79cf618ce5bb0d0b1da75ee8b35">15326</a></span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="classtesting_1_1_test_info.html#a9b74d79cf618ce5bb0d0b1da75ee8b35">file</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> location_.file.c_str(); }</div><div class="line"><a name="l15327"></a><span class="lineno">15327</span> </div><div class="line"><a name="l15328"></a><span class="lineno">15328</span>  <span class="comment">// Returns the line where this test is defined.</span></div><div class="line"><a name="l15329"></a><span class="lineno"><a class="line" href="classtesting_1_1_test_info.html#af5931cfc594b5d660c56b3c61c41ea13">15329</a></span>  <span class="keywordtype">int</span> <a class="code" href="classtesting_1_1_test_info.html#af5931cfc594b5d660c56b3c61c41ea13">line</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> location_.line; }</div><div class="line"><a name="l15330"></a><span class="lineno">15330</span> </div><div class="line"><a name="l15331"></a><span class="lineno">15331</span>  <span class="comment">// Return true if this test should not be run because it's in another shard.</span></div><div class="line"><a name="l15332"></a><span class="lineno"><a class="line" href="classtesting_1_1_test_info.html#a8621f2cf7623fd1609db8e324f0c2fec">15332</a></span>  <span class="keywordtype">bool</span> <a class="code" href="classtesting_1_1_test_info.html#a8621f2cf7623fd1609db8e324f0c2fec">is_in_another_shard</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> is_in_another_shard_; }</div><div class="line"><a name="l15333"></a><span class="lineno">15333</span> </div><div class="line"><a name="l15334"></a><span class="lineno">15334</span>  <span class="comment">// Returns true if this test should run, that is if the test is not</span></div><div class="line"><a name="l15335"></a><span class="lineno">15335</span>  <span class="comment">// disabled (or it is disabled but the also_run_disabled_tests flag has</span></div><div class="line"><a name="l15336"></a><span class="lineno">15336</span>  <span class="comment">// been specified) and its full name matches the user-specified filter.</span></div><div class="line"><a name="l15337"></a><span class="lineno">15337</span>  <span class="comment">//</span></div><div class="line"><a name="l15338"></a><span class="lineno">15338</span>  <span class="comment">// Google Test allows the user to filter the tests by their full names.</span></div><div class="line"><a name="l15339"></a><span class="lineno">15339</span>  <span class="comment">// The full name of a test Bar in test suite Foo is defined as</span></div><div class="line"><a name="l15340"></a><span class="lineno">15340</span>  <span class="comment">// "Foo.Bar". Only the tests that match the filter will run.</span></div><div class="line"><a name="l15341"></a><span class="lineno">15341</span>  <span class="comment">//</span></div><div class="line"><a name="l15342"></a><span class="lineno">15342</span>  <span class="comment">// A filter is a colon-separated list of glob (not regex) patterns,</span></div><div class="line"><a name="l15343"></a><span class="lineno">15343</span>  <span class="comment">// optionally followed by a '-' and a colon-separated list of</span></div><div class="line"><a name="l15344"></a><span class="lineno">15344</span>  <span class="comment">// negative patterns (tests to exclude). A test is run if it</span></div><div class="line"><a name="l15345"></a><span class="lineno">15345</span>  <span class="comment">// matches one of the positive patterns and does not match any of</span></div><div class="line"><a name="l15346"></a><span class="lineno">15346</span>  <span class="comment">// the negative patterns.</span></div><div class="line"><a name="l15347"></a><span class="lineno">15347</span>  <span class="comment">//</span></div><div class="line"><a name="l15348"></a><span class="lineno">15348</span>  <span class="comment">// For example, *A*:Foo.* is a filter that matches any string that</span></div><div class="line"><a name="l15349"></a><span class="lineno">15349</span>  <span class="comment">// contains the character 'A' or starts with "Foo.".</span></div><div class="line"><a name="l15350"></a><span class="lineno"><a class="line" href="classtesting_1_1_test_info.html#a866e33b5bc5ab2a6e5375fc7d3af0f96">15350</a></span>  <span class="keywordtype">bool</span> <a class="code" href="classtesting_1_1_test_info.html#a866e33b5bc5ab2a6e5375fc7d3af0f96">should_run</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> should_run_; }</div><div class="line"><a name="l15351"></a><span class="lineno">15351</span> </div><div class="line"><a name="l15352"></a><span class="lineno">15352</span>  <span class="comment">// Returns true iff this test will appear in the XML report.</span></div><div class="line"><a name="l15353"></a><span class="lineno"><a class="line" href="classtesting_1_1_test_info.html#a63e7042028b0b846f4b5a1e5bcffc079">15353</a></span>  <span class="keywordtype">bool</span> <a class="code" href="classtesting_1_1_test_info.html#a63e7042028b0b846f4b5a1e5bcffc079">is_reportable</a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l15354"></a><span class="lineno">15354</span>  <span class="comment">// The XML report includes tests matching the filter, excluding those</span></div><div class="line"><a name="l15355"></a><span class="lineno">15355</span>  <span class="comment">// run in other shards.</span></div><div class="line"><a name="l15356"></a><span class="lineno">15356</span>  <span class="keywordflow">return</span> matches_filter_ && !is_in_another_shard_;</div><div class="line"><a name="l15357"></a><span class="lineno">15357</span>  }</div><div class="line"><a name="l15358"></a><span class="lineno">15358</span> </div><div class="line"><a name="l15359"></a><span class="lineno">15359</span>  <span class="comment">// Returns the result of the test.</span></div><div class="line"><a name="l15360"></a><span class="lineno"><a class="line" href="classtesting_1_1_test_info.html#aee8cb884c95cd446129aba936b4159e0">15360</a></span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1_test_result.html">TestResult</a>* <a class="code" href="classtesting_1_1_test_info.html#aee8cb884c95cd446129aba936b4159e0">result</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> &result_; }</div><div class="line"><a name="l15361"></a><span class="lineno">15361</span> </div><div class="line"><a name="l15362"></a><span class="lineno">15362</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l15363"></a><span class="lineno">15363</span> <span class="preprocessor">#if GTEST_HAS_DEATH_TEST</span></div><div class="line"><a name="l15364"></a><span class="lineno">15364</span>  <span class="keyword">friend</span> <span class="keyword">class </span>internal::DefaultDeathTestFactory;</div><div class="line"><a name="l15365"></a><span class="lineno">15365</span> <span class="preprocessor">#endif // GTEST_HAS_DEATH_TEST</span></div><div class="line"><a name="l15366"></a><span class="lineno"><a class="line" href="classtesting_1_1_test_info.html#a5b78b1c2e1fa07ffed92da365593eaa4">15366</a></span>  <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classtesting_1_1_test.html">Test</a>;</div><div class="line"><a name="l15367"></a><span class="lineno"><a class="line" href="classtesting_1_1_test_info.html#ab9aaba231fd11196425e75caf709bfc6">15367</a></span>  <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classtesting_1_1_test_suite.html">TestSuite</a>;</div><div class="line"><a name="l15368"></a><span class="lineno"><a class="line" href="classtesting_1_1_test_info.html#acc0a5e7573fd6ae7ad1878613bb86853">15368</a></span>  <span class="keyword">friend</span> <span class="keyword">class </span>internal::UnitTestImpl;</div><div class="line"><a name="l15369"></a><span class="lineno"><a class="line" href="classtesting_1_1_test_info.html#adc037d188dab349a94868991955c9cd4">15369</a></span>  <span class="keyword">friend</span> <span class="keyword">class </span>internal::StreamingListenerTest;</div><div class="line"><a name="l15370"></a><span class="lineno">15370</span>  <span class="keyword">friend</span> <a class="code" href="classtesting_1_1_test_info.html">TestInfo</a>* <a class="code" href="namespacetesting_1_1internal.html#a7ab4072540184e26119ad853f45059f7">internal::MakeAndRegisterTestInfo</a>(</div><div class="line"><a name="l15371"></a><span class="lineno">15371</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* test_suite_name, <span class="keyword">const</span> <span class="keywordtype">char</span>* name, <span class="keyword">const</span> <span class="keywordtype">char</span>* type_param,</div><div class="line"><a name="l15372"></a><span class="lineno">15372</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* value_param, <a class="code" href="structtesting_1_1internal_1_1_code_location.html">internal::CodeLocation</a> code_location,</div><div class="line"><a name="l15373"></a><span class="lineno">15373</span>  <a class="code" href="namespacetesting_1_1internal.html#ab1114197d3c657d8b7f8e0c5caa12d00">internal::TypeId</a> fixture_class_id, <a class="code" href="namespacetesting_1_1internal.html#a83e4e0732ac6a9dcfe6ee299dc1b9fa2">internal::SetUpTestSuiteFunc</a> set_up_tc,</div><div class="line"><a name="l15374"></a><span class="lineno">15374</span>  <a class="code" href="namespacetesting_1_1internal.html#a8257a87aa42cebaa54b0c48a6ae657a5">internal::TearDownTestSuiteFunc</a> tear_down_tc,</div><div class="line"><a name="l15375"></a><span class="lineno">15375</span>  <a class="code" href="classtesting_1_1internal_1_1_test_factory_base.html">internal::TestFactoryBase</a>* factory);</div><div class="line"><a name="l15376"></a><span class="lineno">15376</span> </div><div class="line"><a name="l15377"></a><span class="lineno">15377</span>  <span class="comment">// Constructs a TestInfo object. The newly constructed instance assumes</span></div><div class="line"><a name="l15378"></a><span class="lineno">15378</span>  <span class="comment">// ownership of the factory object.</span></div><div class="line"><a name="l15379"></a><span class="lineno">15379</span>  <a class="code" href="classtesting_1_1_test_info.html">TestInfo</a>(<span class="keyword">const</span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a>& test_suite_name, <span class="keyword">const</span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a>& name,</div><div class="line"><a name="l15380"></a><span class="lineno">15380</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* a_type_param, <span class="comment">// NULL if not a type-parameterized test</span></div><div class="line"><a name="l15381"></a><span class="lineno">15381</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* a_value_param, <span class="comment">// NULL if not a value-parameterized test</span></div><div class="line"><a name="l15382"></a><span class="lineno">15382</span>  <a class="code" href="structtesting_1_1internal_1_1_code_location.html">internal::CodeLocation</a> a_code_location,</div><div class="line"><a name="l15383"></a><span class="lineno">15383</span>  <a class="code" href="namespacetesting_1_1internal.html#ab1114197d3c657d8b7f8e0c5caa12d00">internal::TypeId</a> fixture_class_id,</div><div class="line"><a name="l15384"></a><span class="lineno">15384</span>  <a class="code" href="classtesting_1_1internal_1_1_test_factory_base.html">internal::TestFactoryBase</a>* factory);</div><div class="line"><a name="l15385"></a><span class="lineno">15385</span> </div><div class="line"><a name="l15386"></a><span class="lineno">15386</span>  <span class="comment">// Increments the number of death tests encountered in this test so</span></div><div class="line"><a name="l15387"></a><span class="lineno">15387</span>  <span class="comment">// far.</span></div><div class="line"><a name="l15388"></a><span class="lineno">15388</span>  <span class="keywordtype">int</span> increment_death_test_count() {</div><div class="line"><a name="l15389"></a><span class="lineno">15389</span>  <span class="keywordflow">return</span> result_.increment_death_test_count();</div><div class="line"><a name="l15390"></a><span class="lineno">15390</span>  }</div><div class="line"><a name="l15391"></a><span class="lineno">15391</span> </div><div class="line"><a name="l15392"></a><span class="lineno">15392</span>  <span class="comment">// Creates the test object, runs it, records its result, and then</span></div><div class="line"><a name="l15393"></a><span class="lineno">15393</span>  <span class="comment">// deletes it.</span></div><div class="line"><a name="l15394"></a><span class="lineno">15394</span>  <span class="keywordtype">void</span> Run();</div><div class="line"><a name="l15395"></a><span class="lineno">15395</span> </div><div class="line"><a name="l15396"></a><span class="lineno">15396</span>  <span class="keyword">static</span> <span class="keywordtype">void</span> ClearTestResult(<a class="code" href="classtesting_1_1_test_info.html">TestInfo</a>* test_info) {</div><div class="line"><a name="l15397"></a><span class="lineno">15397</span>  test_info->result_.Clear();</div><div class="line"><a name="l15398"></a><span class="lineno">15398</span>  }</div><div class="line"><a name="l15399"></a><span class="lineno">15399</span> </div><div class="line"><a name="l15400"></a><span class="lineno">15400</span>  <span class="comment">// These fields are immutable properties of the test.</span></div><div class="line"><a name="l15401"></a><span class="lineno">15401</span>  <span class="keyword">const</span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a> test_suite_name_; <span class="comment">// test suite name</span></div><div class="line"><a name="l15402"></a><span class="lineno">15402</span>  <span class="keyword">const</span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a> name_; <span class="comment">// Test name</span></div><div class="line"><a name="l15403"></a><span class="lineno">15403</span>  <span class="comment">// Name of the parameter type, or NULL if this is not a typed or a</span></div><div class="line"><a name="l15404"></a><span class="lineno">15404</span>  <span class="comment">// type-parameterized test.</span></div><div class="line"><a name="l15405"></a><span class="lineno">15405</span>  <span class="keyword">const</span> std::unique_ptr<const ::std::string> type_param_;</div><div class="line"><a name="l15406"></a><span class="lineno">15406</span>  <span class="comment">// Text representation of the value parameter, or NULL if this is not a</span></div><div class="line"><a name="l15407"></a><span class="lineno">15407</span>  <span class="comment">// value-parameterized test.</span></div><div class="line"><a name="l15408"></a><span class="lineno">15408</span>  <span class="keyword">const</span> std::unique_ptr<const ::std::string> value_param_;</div><div class="line"><a name="l15409"></a><span class="lineno">15409</span>  internal::CodeLocation location_;</div><div class="line"><a name="l15410"></a><span class="lineno">15410</span>  <span class="keyword">const</span> <a class="code" href="namespacetesting_1_1internal.html#ab1114197d3c657d8b7f8e0c5caa12d00">internal::TypeId</a> fixture_class_id_; <span class="comment">// ID of the test fixture class</span></div><div class="line"><a name="l15411"></a><span class="lineno">15411</span>  <span class="keywordtype">bool</span> should_run_; <span class="comment">// True iff this test should run</span></div><div class="line"><a name="l15412"></a><span class="lineno">15412</span>  <span class="keywordtype">bool</span> is_disabled_; <span class="comment">// True iff this test is disabled</span></div><div class="line"><a name="l15413"></a><span class="lineno">15413</span>  <span class="keywordtype">bool</span> matches_filter_; <span class="comment">// True if this test matches the</span></div><div class="line"><a name="l15414"></a><span class="lineno">15414</span>  <span class="comment">// user-specified filter.</span></div><div class="line"><a name="l15415"></a><span class="lineno">15415</span>  <span class="keywordtype">bool</span> is_in_another_shard_; <span class="comment">// Will be run in another shard.</span></div><div class="line"><a name="l15416"></a><span class="lineno">15416</span>  internal::TestFactoryBase* <span class="keyword">const</span> factory_; <span class="comment">// The factory that creates</span></div><div class="line"><a name="l15417"></a><span class="lineno">15417</span>  <span class="comment">// the test object</span></div><div class="line"><a name="l15418"></a><span class="lineno">15418</span> </div><div class="line"><a name="l15419"></a><span class="lineno">15419</span>  <span class="comment">// This field is mutable and needs to be reset before running the</span></div><div class="line"><a name="l15420"></a><span class="lineno">15420</span>  <span class="comment">// test for the second time.</span></div><div class="line"><a name="l15421"></a><span class="lineno">15421</span>  TestResult result_;</div><div class="line"><a name="l15422"></a><span class="lineno">15422</span> </div><div class="line"><a name="l15423"></a><span class="lineno">15423</span>  <a class="code" href="gtest_8h.html#aed8c1888c32b588b0681e88b95031e29">GTEST_DISALLOW_COPY_AND_ASSIGN_</a>(TestInfo);</div><div class="line"><a name="l15424"></a><span class="lineno">15424</span> };</div><div class="line"><a name="l15425"></a><span class="lineno">15425</span> </div><div class="line"><a name="l15426"></a><span class="lineno">15426</span> <span class="comment">// A test suite, which consists of a vector of TestInfos.</span></div><div class="line"><a name="l15427"></a><span class="lineno">15427</span> <span class="comment">//</span></div><div class="line"><a name="l15428"></a><span class="lineno">15428</span> <span class="comment">// TestSuite is not copyable.</span></div><div class="line"><a name="l15429"></a><span class="lineno"><a class="line" href="classtesting_1_1_test_suite.html">15429</a></span> <span class="keyword">class </span><a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> <a class="code" href="classtesting_1_1_test_suite.html">TestSuite</a> {</div><div class="line"><a name="l15430"></a><span class="lineno">15430</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l15431"></a><span class="lineno">15431</span>  <span class="comment">// Creates a TestSuite with the given name.</span></div><div class="line"><a name="l15432"></a><span class="lineno">15432</span>  <span class="comment">//</span></div><div class="line"><a name="l15433"></a><span class="lineno">15433</span>  <span class="comment">// TestSuite does NOT have a default constructor. Always use this</span></div><div class="line"><a name="l15434"></a><span class="lineno">15434</span>  <span class="comment">// constructor to create a TestSuite object.</span></div><div class="line"><a name="l15435"></a><span class="lineno">15435</span>  <span class="comment">//</span></div><div class="line"><a name="l15436"></a><span class="lineno">15436</span>  <span class="comment">// Arguments:</span></div><div class="line"><a name="l15437"></a><span class="lineno">15437</span>  <span class="comment">//</span></div><div class="line"><a name="l15438"></a><span class="lineno">15438</span>  <span class="comment">// name: name of the test suite</span></div><div class="line"><a name="l15439"></a><span class="lineno">15439</span>  <span class="comment">// a_type_param: the name of the test's type parameter, or NULL if</span></div><div class="line"><a name="l15440"></a><span class="lineno">15440</span>  <span class="comment">// this is not a type-parameterized test.</span></div><div class="line"><a name="l15441"></a><span class="lineno">15441</span>  <span class="comment">// set_up_tc: pointer to the function that sets up the test suite</span></div><div class="line"><a name="l15442"></a><span class="lineno">15442</span>  <span class="comment">// tear_down_tc: pointer to the function that tears down the test suite</span></div><div class="line"><a name="l15443"></a><span class="lineno">15443</span>  <a class="code" href="classtesting_1_1_test_suite.html">TestSuite</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* name, <span class="keyword">const</span> <span class="keywordtype">char</span>* a_type_param,</div><div class="line"><a name="l15444"></a><span class="lineno">15444</span>  <a class="code" href="namespacetesting_1_1internal.html#a83e4e0732ac6a9dcfe6ee299dc1b9fa2">internal::SetUpTestSuiteFunc</a> set_up_tc,</div><div class="line"><a name="l15445"></a><span class="lineno">15445</span>  <a class="code" href="namespacetesting_1_1internal.html#a8257a87aa42cebaa54b0c48a6ae657a5">internal::TearDownTestSuiteFunc</a> tear_down_tc);</div><div class="line"><a name="l15446"></a><span class="lineno">15446</span> </div><div class="line"><a name="l15447"></a><span class="lineno">15447</span>  <span class="comment">// Destructor of TestSuite.</span></div><div class="line"><a name="l15448"></a><span class="lineno">15448</span>  <span class="keyword">virtual</span> ~<a class="code" href="classtesting_1_1_test_suite.html">TestSuite</a>();</div><div class="line"><a name="l15449"></a><span class="lineno">15449</span> </div><div class="line"><a name="l15450"></a><span class="lineno">15450</span>  <span class="comment">// Gets the name of the TestSuite.</span></div><div class="line"><a name="l15451"></a><span class="lineno"><a class="line" href="classtesting_1_1_test_suite.html#ab3369db678ca3d9648d6fd63ad038986">15451</a></span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="classtesting_1_1_test_suite.html#ab3369db678ca3d9648d6fd63ad038986">name</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> name_.c_str(); }</div><div class="line"><a name="l15452"></a><span class="lineno">15452</span> </div><div class="line"><a name="l15453"></a><span class="lineno">15453</span>  <span class="comment">// Returns the name of the parameter type, or NULL if this is not a</span></div><div class="line"><a name="l15454"></a><span class="lineno">15454</span>  <span class="comment">// type-parameterized test suite.</span></div><div class="line"><a name="l15455"></a><span class="lineno"><a class="line" href="classtesting_1_1_test_suite.html#ab2ea12318bdbfb6aa97792344b49e3db">15455</a></span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="classtesting_1_1_test_suite.html#ab2ea12318bdbfb6aa97792344b49e3db">type_param</a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l15456"></a><span class="lineno">15456</span>  <span class="keywordflow">if</span> (type_param_.get() != <span class="keyword">nullptr</span>) <span class="keywordflow">return</span> type_param_->c_str();</div><div class="line"><a name="l15457"></a><span class="lineno">15457</span>  <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div><div class="line"><a name="l15458"></a><span class="lineno">15458</span>  }</div><div class="line"><a name="l15459"></a><span class="lineno">15459</span> </div><div class="line"><a name="l15460"></a><span class="lineno">15460</span>  <span class="comment">// Returns true if any test in this test suite should run.</span></div><div class="line"><a name="l15461"></a><span class="lineno"><a class="line" href="classtesting_1_1_test_suite.html#a8f62c17baef80042e0ff03ef5d5e4ba7">15461</a></span>  <span class="keywordtype">bool</span> <a class="code" href="classtesting_1_1_test_suite.html#a8f62c17baef80042e0ff03ef5d5e4ba7">should_run</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> should_run_; }</div><div class="line"><a name="l15462"></a><span class="lineno">15462</span> </div><div class="line"><a name="l15463"></a><span class="lineno">15463</span>  <span class="comment">// Gets the number of successful tests in this test suite.</span></div><div class="line"><a name="l15464"></a><span class="lineno">15464</span>  <span class="keywordtype">int</span> successful_test_count() <span class="keyword">const</span>;</div><div class="line"><a name="l15465"></a><span class="lineno">15465</span> </div><div class="line"><a name="l15466"></a><span class="lineno">15466</span>  <span class="comment">// Gets the number of skipped tests in this test suite.</span></div><div class="line"><a name="l15467"></a><span class="lineno">15467</span>  <span class="keywordtype">int</span> skipped_test_count() <span class="keyword">const</span>;</div><div class="line"><a name="l15468"></a><span class="lineno">15468</span> </div><div class="line"><a name="l15469"></a><span class="lineno">15469</span>  <span class="comment">// Gets the number of failed tests in this test suite.</span></div><div class="line"><a name="l15470"></a><span class="lineno">15470</span>  <span class="keywordtype">int</span> failed_test_count() <span class="keyword">const</span>;</div><div class="line"><a name="l15471"></a><span class="lineno">15471</span> </div><div class="line"><a name="l15472"></a><span class="lineno">15472</span>  <span class="comment">// Gets the number of disabled tests that will be reported in the XML report.</span></div><div class="line"><a name="l15473"></a><span class="lineno">15473</span>  <span class="keywordtype">int</span> reportable_disabled_test_count() <span class="keyword">const</span>;</div><div class="line"><a name="l15474"></a><span class="lineno">15474</span> </div><div class="line"><a name="l15475"></a><span class="lineno">15475</span>  <span class="comment">// Gets the number of disabled tests in this test suite.</span></div><div class="line"><a name="l15476"></a><span class="lineno">15476</span>  <span class="keywordtype">int</span> disabled_test_count() <span class="keyword">const</span>;</div><div class="line"><a name="l15477"></a><span class="lineno">15477</span> </div><div class="line"><a name="l15478"></a><span class="lineno">15478</span>  <span class="comment">// Gets the number of tests to be printed in the XML report.</span></div><div class="line"><a name="l15479"></a><span class="lineno">15479</span>  <span class="keywordtype">int</span> reportable_test_count() <span class="keyword">const</span>;</div><div class="line"><a name="l15480"></a><span class="lineno">15480</span> </div><div class="line"><a name="l15481"></a><span class="lineno">15481</span>  <span class="comment">// Get the number of tests in this test suite that should run.</span></div><div class="line"><a name="l15482"></a><span class="lineno">15482</span>  <span class="keywordtype">int</span> test_to_run_count() <span class="keyword">const</span>;</div><div class="line"><a name="l15483"></a><span class="lineno">15483</span> </div><div class="line"><a name="l15484"></a><span class="lineno">15484</span>  <span class="comment">// Gets the number of all tests in this test suite.</span></div><div class="line"><a name="l15485"></a><span class="lineno">15485</span>  <span class="keywordtype">int</span> total_test_count() <span class="keyword">const</span>;</div><div class="line"><a name="l15486"></a><span class="lineno">15486</span> </div><div class="line"><a name="l15487"></a><span class="lineno">15487</span>  <span class="comment">// Returns true iff the test suite passed.</span></div><div class="line"><a name="l15488"></a><span class="lineno"><a class="line" href="classtesting_1_1_test_suite.html#add51ece89b069b29e07f0476e0e6aae9">15488</a></span>  <span class="keywordtype">bool</span> <a class="code" href="classtesting_1_1_test_suite.html#add51ece89b069b29e07f0476e0e6aae9">Passed</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> !Failed(); }</div><div class="line"><a name="l15489"></a><span class="lineno">15489</span> </div><div class="line"><a name="l15490"></a><span class="lineno">15490</span>  <span class="comment">// Returns true iff the test suite failed.</span></div><div class="line"><a name="l15491"></a><span class="lineno"><a class="line" href="classtesting_1_1_test_suite.html#adec55446c23dc2d0bfea91c6125a1047">15491</a></span>  <span class="keywordtype">bool</span> <a class="code" href="classtesting_1_1_test_suite.html#adec55446c23dc2d0bfea91c6125a1047">Failed</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> failed_test_count() > 0; }</div><div class="line"><a name="l15492"></a><span class="lineno">15492</span> </div><div class="line"><a name="l15493"></a><span class="lineno">15493</span>  <span class="comment">// Returns the elapsed time, in milliseconds.</span></div><div class="line"><a name="l15494"></a><span class="lineno"><a class="line" href="classtesting_1_1_test_suite.html#a2ede69fa37985ab8b21128955c56d6d7">15494</a></span>  <a class="code" href="namespacetesting.html#a992de1d091ce660f451d1e8b3ce30fd6">TimeInMillis</a> <a class="code" href="classtesting_1_1_test_suite.html#a2ede69fa37985ab8b21128955c56d6d7">elapsed_time</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> elapsed_time_; }</div><div class="line"><a name="l15495"></a><span class="lineno">15495</span> </div><div class="line"><a name="l15496"></a><span class="lineno">15496</span>  <span class="comment">// Returns the i-th test among all the tests. i can range from 0 to</span></div><div class="line"><a name="l15497"></a><span class="lineno">15497</span>  <span class="comment">// total_test_count() - 1. If i is not in that range, returns NULL.</span></div><div class="line"><a name="l15498"></a><span class="lineno">15498</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1_test_info.html">TestInfo</a>* GetTestInfo(<span class="keywordtype">int</span> i) <span class="keyword">const</span>;</div><div class="line"><a name="l15499"></a><span class="lineno">15499</span> </div><div class="line"><a name="l15500"></a><span class="lineno">15500</span>  <span class="comment">// Returns the TestResult that holds test properties recorded during</span></div><div class="line"><a name="l15501"></a><span class="lineno">15501</span>  <span class="comment">// execution of SetUpTestSuite and TearDownTestSuite.</span></div><div class="line"><a name="l15502"></a><span class="lineno"><a class="line" href="classtesting_1_1_test_suite.html#a3391a0ec111c66e1ac16a800f5068af7">15502</a></span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1_test_result.html">TestResult</a>& <a class="code" href="classtesting_1_1_test_suite.html#a3391a0ec111c66e1ac16a800f5068af7">ad_hoc_test_result</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> ad_hoc_test_result_; }</div><div class="line"><a name="l15503"></a><span class="lineno">15503</span> </div><div class="line"><a name="l15504"></a><span class="lineno">15504</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l15505"></a><span class="lineno"><a class="line" href="classtesting_1_1_test_suite.html#a5b78b1c2e1fa07ffed92da365593eaa4">15505</a></span>  <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classtesting_1_1_test.html">Test</a>;</div><div class="line"><a name="l15506"></a><span class="lineno"><a class="line" href="classtesting_1_1_test_suite.html#acc0a5e7573fd6ae7ad1878613bb86853">15506</a></span>  <span class="keyword">friend</span> <span class="keyword">class </span>internal::UnitTestImpl;</div><div class="line"><a name="l15507"></a><span class="lineno">15507</span> </div><div class="line"><a name="l15508"></a><span class="lineno">15508</span>  <span class="comment">// Gets the (mutable) vector of TestInfos in this TestSuite.</span></div><div class="line"><a name="l15509"></a><span class="lineno">15509</span>  std::vector<TestInfo*>& test_info_list() { <span class="keywordflow">return</span> test_info_list_; }</div><div class="line"><a name="l15510"></a><span class="lineno">15510</span> </div><div class="line"><a name="l15511"></a><span class="lineno">15511</span>  <span class="comment">// Gets the (immutable) vector of TestInfos in this TestSuite.</span></div><div class="line"><a name="l15512"></a><span class="lineno">15512</span>  <span class="keyword">const</span> std::vector<TestInfo*>& test_info_list()<span class="keyword"> const </span>{</div><div class="line"><a name="l15513"></a><span class="lineno">15513</span>  <span class="keywordflow">return</span> test_info_list_;</div><div class="line"><a name="l15514"></a><span class="lineno">15514</span>  }</div><div class="line"><a name="l15515"></a><span class="lineno">15515</span> </div><div class="line"><a name="l15516"></a><span class="lineno">15516</span>  <span class="comment">// Returns the i-th test among all the tests. i can range from 0 to</span></div><div class="line"><a name="l15517"></a><span class="lineno">15517</span>  <span class="comment">// total_test_count() - 1. If i is not in that range, returns NULL.</span></div><div class="line"><a name="l15518"></a><span class="lineno">15518</span>  TestInfo* GetMutableTestInfo(<span class="keywordtype">int</span> i);</div><div class="line"><a name="l15519"></a><span class="lineno">15519</span> </div><div class="line"><a name="l15520"></a><span class="lineno">15520</span>  <span class="comment">// Sets the should_run member.</span></div><div class="line"><a name="l15521"></a><span class="lineno">15521</span>  <span class="keywordtype">void</span> set_should_run(<span class="keywordtype">bool</span> should) { should_run_ = should; }</div><div class="line"><a name="l15522"></a><span class="lineno">15522</span> </div><div class="line"><a name="l15523"></a><span class="lineno">15523</span>  <span class="comment">// Adds a TestInfo to this test suite. Will delete the TestInfo upon</span></div><div class="line"><a name="l15524"></a><span class="lineno">15524</span>  <span class="comment">// destruction of the TestSuite object.</span></div><div class="line"><a name="l15525"></a><span class="lineno">15525</span>  <span class="keywordtype">void</span> AddTestInfo(TestInfo * test_info);</div><div class="line"><a name="l15526"></a><span class="lineno">15526</span> </div><div class="line"><a name="l15527"></a><span class="lineno">15527</span>  <span class="comment">// Clears the results of all tests in this test suite.</span></div><div class="line"><a name="l15528"></a><span class="lineno">15528</span>  <span class="keywordtype">void</span> ClearResult();</div><div class="line"><a name="l15529"></a><span class="lineno">15529</span> </div><div class="line"><a name="l15530"></a><span class="lineno">15530</span>  <span class="comment">// Clears the results of all tests in the given test suite.</span></div><div class="line"><a name="l15531"></a><span class="lineno">15531</span>  <span class="keyword">static</span> <span class="keywordtype">void</span> ClearTestSuiteResult(TestSuite* test_suite) {</div><div class="line"><a name="l15532"></a><span class="lineno">15532</span>  test_suite->ClearResult();</div><div class="line"><a name="l15533"></a><span class="lineno">15533</span>  }</div><div class="line"><a name="l15534"></a><span class="lineno">15534</span> </div><div class="line"><a name="l15535"></a><span class="lineno">15535</span>  <span class="comment">// Runs every test in this TestSuite.</span></div><div class="line"><a name="l15536"></a><span class="lineno">15536</span>  <span class="keywordtype">void</span> Run();</div><div class="line"><a name="l15537"></a><span class="lineno">15537</span> </div><div class="line"><a name="l15538"></a><span class="lineno">15538</span>  <span class="comment">// Runs SetUpTestSuite() for this TestSuite. This wrapper is needed</span></div><div class="line"><a name="l15539"></a><span class="lineno">15539</span>  <span class="comment">// for catching exceptions thrown from SetUpTestSuite().</span></div><div class="line"><a name="l15540"></a><span class="lineno">15540</span>  <span class="keywordtype">void</span> RunSetUpTestSuite() {</div><div class="line"><a name="l15541"></a><span class="lineno">15541</span>  <span class="keywordflow">if</span> (set_up_tc_ != <span class="keyword">nullptr</span>) {</div><div class="line"><a name="l15542"></a><span class="lineno">15542</span>  (*set_up_tc_)();</div><div class="line"><a name="l15543"></a><span class="lineno">15543</span>  }</div><div class="line"><a name="l15544"></a><span class="lineno">15544</span>  }</div><div class="line"><a name="l15545"></a><span class="lineno">15545</span> </div><div class="line"><a name="l15546"></a><span class="lineno">15546</span>  <span class="comment">// Runs TearDownTestSuite() for this TestSuite. This wrapper is</span></div><div class="line"><a name="l15547"></a><span class="lineno">15547</span>  <span class="comment">// needed for catching exceptions thrown from TearDownTestSuite().</span></div><div class="line"><a name="l15548"></a><span class="lineno">15548</span>  <span class="keywordtype">void</span> RunTearDownTestSuite() {</div><div class="line"><a name="l15549"></a><span class="lineno">15549</span>  <span class="keywordflow">if</span> (tear_down_tc_ != <span class="keyword">nullptr</span>) {</div><div class="line"><a name="l15550"></a><span class="lineno">15550</span>  (*tear_down_tc_)();</div><div class="line"><a name="l15551"></a><span class="lineno">15551</span>  }</div><div class="line"><a name="l15552"></a><span class="lineno">15552</span>  }</div><div class="line"><a name="l15553"></a><span class="lineno">15553</span> </div><div class="line"><a name="l15554"></a><span class="lineno">15554</span>  <span class="comment">// Returns true iff test passed.</span></div><div class="line"><a name="l15555"></a><span class="lineno">15555</span>  <span class="keyword">static</span> <span class="keywordtype">bool</span> TestPassed(<span class="keyword">const</span> TestInfo* test_info) {</div><div class="line"><a name="l15556"></a><span class="lineno">15556</span>  <span class="keywordflow">return</span> test_info->should_run() && test_info->result()->Passed();</div><div class="line"><a name="l15557"></a><span class="lineno">15557</span>  }</div><div class="line"><a name="l15558"></a><span class="lineno">15558</span> </div><div class="line"><a name="l15559"></a><span class="lineno">15559</span>  <span class="comment">// Returns true iff test skipped.</span></div><div class="line"><a name="l15560"></a><span class="lineno">15560</span>  <span class="keyword">static</span> <span class="keywordtype">bool</span> TestSkipped(<span class="keyword">const</span> TestInfo* test_info) {</div><div class="line"><a name="l15561"></a><span class="lineno">15561</span>  <span class="keywordflow">return</span> test_info->should_run() && test_info->result()->Skipped();</div><div class="line"><a name="l15562"></a><span class="lineno">15562</span>  }</div><div class="line"><a name="l15563"></a><span class="lineno">15563</span> </div><div class="line"><a name="l15564"></a><span class="lineno">15564</span>  <span class="comment">// Returns true iff test failed.</span></div><div class="line"><a name="l15565"></a><span class="lineno">15565</span>  <span class="keyword">static</span> <span class="keywordtype">bool</span> TestFailed(<span class="keyword">const</span> TestInfo* test_info) {</div><div class="line"><a name="l15566"></a><span class="lineno">15566</span>  <span class="keywordflow">return</span> test_info->should_run() && test_info->result()->Failed();</div><div class="line"><a name="l15567"></a><span class="lineno">15567</span>  }</div><div class="line"><a name="l15568"></a><span class="lineno">15568</span> </div><div class="line"><a name="l15569"></a><span class="lineno">15569</span>  <span class="comment">// Returns true iff the test is disabled and will be reported in the XML</span></div><div class="line"><a name="l15570"></a><span class="lineno">15570</span>  <span class="comment">// report.</span></div><div class="line"><a name="l15571"></a><span class="lineno">15571</span>  <span class="keyword">static</span> <span class="keywordtype">bool</span> TestReportableDisabled(<span class="keyword">const</span> TestInfo* test_info) {</div><div class="line"><a name="l15572"></a><span class="lineno">15572</span>  <span class="keywordflow">return</span> test_info->is_reportable() && test_info->is_disabled_;</div><div class="line"><a name="l15573"></a><span class="lineno">15573</span>  }</div><div class="line"><a name="l15574"></a><span class="lineno">15574</span> </div><div class="line"><a name="l15575"></a><span class="lineno">15575</span>  <span class="comment">// Returns true iff test is disabled.</span></div><div class="line"><a name="l15576"></a><span class="lineno">15576</span>  <span class="keyword">static</span> <span class="keywordtype">bool</span> TestDisabled(<span class="keyword">const</span> TestInfo* test_info) {</div><div class="line"><a name="l15577"></a><span class="lineno">15577</span>  <span class="keywordflow">return</span> test_info->is_disabled_;</div><div class="line"><a name="l15578"></a><span class="lineno">15578</span>  }</div><div class="line"><a name="l15579"></a><span class="lineno">15579</span> </div><div class="line"><a name="l15580"></a><span class="lineno">15580</span>  <span class="comment">// Returns true iff this test will appear in the XML report.</span></div><div class="line"><a name="l15581"></a><span class="lineno">15581</span>  <span class="keyword">static</span> <span class="keywordtype">bool</span> TestReportable(<span class="keyword">const</span> TestInfo* test_info) {</div><div class="line"><a name="l15582"></a><span class="lineno">15582</span>  <span class="keywordflow">return</span> test_info->is_reportable();</div><div class="line"><a name="l15583"></a><span class="lineno">15583</span>  }</div><div class="line"><a name="l15584"></a><span class="lineno">15584</span> </div><div class="line"><a name="l15585"></a><span class="lineno">15585</span>  <span class="comment">// Returns true if the given test should run.</span></div><div class="line"><a name="l15586"></a><span class="lineno">15586</span>  <span class="keyword">static</span> <span class="keywordtype">bool</span> ShouldRunTest(<span class="keyword">const</span> TestInfo* test_info) {</div><div class="line"><a name="l15587"></a><span class="lineno">15587</span>  <span class="keywordflow">return</span> test_info->should_run();</div><div class="line"><a name="l15588"></a><span class="lineno">15588</span>  }</div><div class="line"><a name="l15589"></a><span class="lineno">15589</span> </div><div class="line"><a name="l15590"></a><span class="lineno">15590</span>  <span class="comment">// Shuffles the tests in this test suite.</span></div><div class="line"><a name="l15591"></a><span class="lineno">15591</span>  <span class="keywordtype">void</span> ShuffleTests(internal::Random* random);</div><div class="line"><a name="l15592"></a><span class="lineno">15592</span> </div><div class="line"><a name="l15593"></a><span class="lineno">15593</span>  <span class="comment">// Restores the test order to before the first shuffle.</span></div><div class="line"><a name="l15594"></a><span class="lineno">15594</span>  <span class="keywordtype">void</span> UnshuffleTests();</div><div class="line"><a name="l15595"></a><span class="lineno">15595</span> </div><div class="line"><a name="l15596"></a><span class="lineno">15596</span>  <span class="comment">// Name of the test suite.</span></div><div class="line"><a name="l15597"></a><span class="lineno">15597</span>  <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a> name_;</div><div class="line"><a name="l15598"></a><span class="lineno">15598</span>  <span class="comment">// Name of the parameter type, or NULL if this is not a typed or a</span></div><div class="line"><a name="l15599"></a><span class="lineno">15599</span>  <span class="comment">// type-parameterized test.</span></div><div class="line"><a name="l15600"></a><span class="lineno">15600</span>  <span class="keyword">const</span> std::unique_ptr<const ::std::string> type_param_;</div><div class="line"><a name="l15601"></a><span class="lineno">15601</span>  <span class="comment">// The vector of TestInfos in their original order. It owns the</span></div><div class="line"><a name="l15602"></a><span class="lineno">15602</span>  <span class="comment">// elements in the vector.</span></div><div class="line"><a name="l15603"></a><span class="lineno">15603</span>  std::vector<TestInfo*> test_info_list_;</div><div class="line"><a name="l15604"></a><span class="lineno">15604</span>  <span class="comment">// Provides a level of indirection for the test list to allow easy</span></div><div class="line"><a name="l15605"></a><span class="lineno">15605</span>  <span class="comment">// shuffling and restoring the test order. The i-th element in this</span></div><div class="line"><a name="l15606"></a><span class="lineno">15606</span>  <span class="comment">// vector is the index of the i-th test in the shuffled test list.</span></div><div class="line"><a name="l15607"></a><span class="lineno">15607</span>  std::vector<int> test_indices_;</div><div class="line"><a name="l15608"></a><span class="lineno">15608</span>  <span class="comment">// Pointer to the function that sets up the test suite.</span></div><div class="line"><a name="l15609"></a><span class="lineno">15609</span>  <a class="code" href="namespacetesting_1_1internal.html#a83e4e0732ac6a9dcfe6ee299dc1b9fa2">internal::SetUpTestSuiteFunc</a> set_up_tc_;</div><div class="line"><a name="l15610"></a><span class="lineno">15610</span>  <span class="comment">// Pointer to the function that tears down the test suite.</span></div><div class="line"><a name="l15611"></a><span class="lineno">15611</span>  <a class="code" href="namespacetesting_1_1internal.html#a8257a87aa42cebaa54b0c48a6ae657a5">internal::TearDownTestSuiteFunc</a> tear_down_tc_;</div><div class="line"><a name="l15612"></a><span class="lineno">15612</span>  <span class="comment">// True iff any test in this test suite should run.</span></div><div class="line"><a name="l15613"></a><span class="lineno">15613</span>  <span class="keywordtype">bool</span> should_run_;</div><div class="line"><a name="l15614"></a><span class="lineno">15614</span>  <span class="comment">// Elapsed time, in milliseconds.</span></div><div class="line"><a name="l15615"></a><span class="lineno">15615</span>  <a class="code" href="namespacetesting.html#a992de1d091ce660f451d1e8b3ce30fd6">TimeInMillis</a> elapsed_time_;</div><div class="line"><a name="l15616"></a><span class="lineno">15616</span>  <span class="comment">// Holds test properties recorded during execution of SetUpTestSuite and</span></div><div class="line"><a name="l15617"></a><span class="lineno">15617</span>  <span class="comment">// TearDownTestSuite.</span></div><div class="line"><a name="l15618"></a><span class="lineno">15618</span>  TestResult ad_hoc_test_result_;</div><div class="line"><a name="l15619"></a><span class="lineno">15619</span> </div><div class="line"><a name="l15620"></a><span class="lineno">15620</span>  <span class="comment">// We disallow copying TestSuites.</span></div><div class="line"><a name="l15621"></a><span class="lineno">15621</span>  <a class="code" href="gtest_8h.html#aed8c1888c32b588b0681e88b95031e29">GTEST_DISALLOW_COPY_AND_ASSIGN_</a>(TestSuite);</div><div class="line"><a name="l15622"></a><span class="lineno">15622</span> };</div><div class="line"><a name="l15623"></a><span class="lineno">15623</span> </div><div class="line"><a name="l15624"></a><span class="lineno">15624</span> <span class="comment">// An Environment object is capable of setting up and tearing down an</span></div><div class="line"><a name="l15625"></a><span class="lineno">15625</span> <span class="comment">// environment. You should subclass this to define your own</span></div><div class="line"><a name="l15626"></a><span class="lineno">15626</span> <span class="comment">// environment(s).</span></div><div class="line"><a name="l15627"></a><span class="lineno">15627</span> <span class="comment">//</span></div><div class="line"><a name="l15628"></a><span class="lineno">15628</span> <span class="comment">// An Environment object does the set-up and tear-down in virtual</span></div><div class="line"><a name="l15629"></a><span class="lineno">15629</span> <span class="comment">// methods SetUp() and TearDown() instead of the constructor and the</span></div><div class="line"><a name="l15630"></a><span class="lineno">15630</span> <span class="comment">// destructor, as:</span></div><div class="line"><a name="l15631"></a><span class="lineno">15631</span> <span class="comment">//</span></div><div class="line"><a name="l15632"></a><span class="lineno">15632</span> <span class="comment">// 1. You cannot safely throw from a destructor. This is a problem</span></div><div class="line"><a name="l15633"></a><span class="lineno">15633</span> <span class="comment">// as in some cases Google Test is used where exceptions are enabled, and</span></div><div class="line"><a name="l15634"></a><span class="lineno">15634</span> <span class="comment">// we may want to implement ASSERT_* using exceptions where they are</span></div><div class="line"><a name="l15635"></a><span class="lineno">15635</span> <span class="comment">// available.</span></div><div class="line"><a name="l15636"></a><span class="lineno">15636</span> <span class="comment">// 2. You cannot use ASSERT_* directly in a constructor or</span></div><div class="line"><a name="l15637"></a><span class="lineno">15637</span> <span class="comment">// destructor.</span></div><div class="line"><a name="l15638"></a><span class="lineno"><a class="line" href="classtesting_1_1_environment.html">15638</a></span> <span class="keyword">class </span><a class="code" href="classtesting_1_1_environment.html">Environment</a> {</div><div class="line"><a name="l15639"></a><span class="lineno">15639</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l15640"></a><span class="lineno">15640</span>  <span class="comment">// The d'tor is virtual as we need to subclass Environment.</span></div><div class="line"><a name="l15641"></a><span class="lineno"><a class="line" href="classtesting_1_1_environment.html#a0e41c320362576d752cd1f44cabd57d4">15641</a></span>  <span class="keyword">virtual</span> <a class="code" href="classtesting_1_1_environment.html#a0e41c320362576d752cd1f44cabd57d4">~Environment</a>() {}</div><div class="line"><a name="l15642"></a><span class="lineno">15642</span> </div><div class="line"><a name="l15643"></a><span class="lineno">15643</span>  <span class="comment">// Override this to define how to set up the environment.</span></div><div class="line"><a name="l15644"></a><span class="lineno"><a class="line" href="classtesting_1_1_environment.html#a1bf8cafaa9d4eba9feb98655ee434eb3">15644</a></span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classtesting_1_1_environment.html#a1bf8cafaa9d4eba9feb98655ee434eb3">SetUp</a>() {}</div><div class="line"><a name="l15645"></a><span class="lineno">15645</span> </div><div class="line"><a name="l15646"></a><span class="lineno">15646</span>  <span class="comment">// Override this to define how to tear down the environment.</span></div><div class="line"><a name="l15647"></a><span class="lineno"><a class="line" href="classtesting_1_1_environment.html#a039bdaa705c46b9b88234cf4d3bb6254">15647</a></span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classtesting_1_1_environment.html#a039bdaa705c46b9b88234cf4d3bb6254">TearDown</a>() {}</div><div class="line"><a name="l15648"></a><span class="lineno">15648</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l15649"></a><span class="lineno">15649</span>  <span class="comment">// If you see an error about overriding the following function or</span></div><div class="line"><a name="l15650"></a><span class="lineno">15650</span>  <span class="comment">// about it being private, you have mis-spelled SetUp() as Setup().</span></div><div class="line"><a name="l15651"></a><span class="lineno">15651</span>  <span class="keyword">struct </span>Setup_should_be_spelled_SetUp {};</div><div class="line"><a name="l15652"></a><span class="lineno">15652</span>  <span class="keyword">virtual</span> Setup_should_be_spelled_SetUp* Setup() { <span class="keywordflow">return</span> <span class="keyword">nullptr</span>; }</div><div class="line"><a name="l15653"></a><span class="lineno">15653</span> };</div><div class="line"><a name="l15654"></a><span class="lineno">15654</span> </div><div class="line"><a name="l15655"></a><span class="lineno">15655</span> <span class="preprocessor">#if GTEST_HAS_EXCEPTIONS</span></div><div class="line"><a name="l15656"></a><span class="lineno">15656</span> </div><div class="line"><a name="l15657"></a><span class="lineno">15657</span> <span class="comment">// Exception which can be thrown from TestEventListener::OnTestPartResult.</span></div><div class="line"><a name="l15658"></a><span class="lineno">15658</span> <span class="keyword">class </span><a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> AssertionException</div><div class="line"><a name="l15659"></a><span class="lineno">15659</span>  : <span class="keyword">public</span> internal::GoogleTestFailureException {</div><div class="line"><a name="l15660"></a><span class="lineno">15660</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l15661"></a><span class="lineno">15661</span>  <span class="keyword">explicit</span> AssertionException(<span class="keyword">const</span> TestPartResult& result)</div><div class="line"><a name="l15662"></a><span class="lineno">15662</span>  : GoogleTestFailureException(result) {}</div><div class="line"><a name="l15663"></a><span class="lineno">15663</span> };</div><div class="line"><a name="l15664"></a><span class="lineno">15664</span> </div><div class="line"><a name="l15665"></a><span class="lineno">15665</span> <span class="preprocessor">#endif // GTEST_HAS_EXCEPTIONS</span></div><div class="line"><a name="l15666"></a><span class="lineno">15666</span> </div><div class="line"><a name="l15667"></a><span class="lineno">15667</span> <span class="comment">// The interface for tracing execution of tests. The methods are organized in</span></div><div class="line"><a name="l15668"></a><span class="lineno">15668</span> <span class="comment">// the order the corresponding events are fired.</span></div><div class="line"><a name="l15669"></a><span class="lineno"><a class="line" href="classtesting_1_1_test_event_listener.html">15669</a></span> <span class="keyword">class </span><a class="code" href="classtesting_1_1_test_event_listener.html">TestEventListener</a> {</div><div class="line"><a name="l15670"></a><span class="lineno">15670</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l15671"></a><span class="lineno"><a class="line" href="classtesting_1_1_test_event_listener.html#a4512d19e7a108ec4926239ec1ea85d63">15671</a></span>  <span class="keyword">virtual</span> <a class="code" href="classtesting_1_1_test_event_listener.html#a4512d19e7a108ec4926239ec1ea85d63">~TestEventListener</a>() {}</div><div class="line"><a name="l15672"></a><span class="lineno">15672</span> </div><div class="line"><a name="l15673"></a><span class="lineno">15673</span>  <span class="comment">// Fired before any test activity starts.</span></div><div class="line"><a name="l15674"></a><span class="lineno">15674</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classtesting_1_1_test_event_listener.html#a5f6c84f39851e8a603a2d2e10063816b">OnTestProgramStart</a>(<span class="keyword">const</span> <a class="code" href="classtesting_1_1_unit_test.html">UnitTest</a>& unit_test) = 0;</div><div class="line"><a name="l15675"></a><span class="lineno">15675</span> </div><div class="line"><a name="l15676"></a><span class="lineno">15676</span>  <span class="comment">// Fired before each iteration of tests starts. There may be more than</span></div><div class="line"><a name="l15677"></a><span class="lineno">15677</span>  <span class="comment">// one iteration if GTEST_FLAG(repeat) is set. iteration is the iteration</span></div><div class="line"><a name="l15678"></a><span class="lineno">15678</span>  <span class="comment">// index, starting from 0.</span></div><div class="line"><a name="l15679"></a><span class="lineno">15679</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classtesting_1_1_test_event_listener.html#a60cc09b7907cb329d152eb5e7133bdeb">OnTestIterationStart</a>(<span class="keyword">const</span> <a class="code" href="classtesting_1_1_unit_test.html">UnitTest</a>& unit_test,</div><div class="line"><a name="l15680"></a><span class="lineno">15680</span>  <span class="keywordtype">int</span> iteration) = 0;</div><div class="line"><a name="l15681"></a><span class="lineno">15681</span> </div><div class="line"><a name="l15682"></a><span class="lineno">15682</span>  <span class="comment">// Fired before environment set-up for each iteration of tests starts.</span></div><div class="line"><a name="l15683"></a><span class="lineno">15683</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classtesting_1_1_test_event_listener.html#aa6502e534919605be45f26a6daf9a40c">OnEnvironmentsSetUpStart</a>(<span class="keyword">const</span> <a class="code" href="classtesting_1_1_unit_test.html">UnitTest</a>& unit_test) = 0;</div><div class="line"><a name="l15684"></a><span class="lineno">15684</span> </div><div class="line"><a name="l15685"></a><span class="lineno">15685</span>  <span class="comment">// Fired after environment set-up for each iteration of tests ends.</span></div><div class="line"><a name="l15686"></a><span class="lineno">15686</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classtesting_1_1_test_event_listener.html#aaa1021d75f5dbf3f05c829c1cc520341">OnEnvironmentsSetUpEnd</a>(<span class="keyword">const</span> <a class="code" href="classtesting_1_1_unit_test.html">UnitTest</a>& unit_test) = 0;</div><div class="line"><a name="l15687"></a><span class="lineno">15687</span> </div><div class="line"><a name="l15688"></a><span class="lineno">15688</span>  <span class="comment">// Fired before the test suite starts.</span></div><div class="line"><a name="l15689"></a><span class="lineno"><a class="line" href="classtesting_1_1_test_event_listener.html#ac6605dbb5859436d59d117348d63746c">15689</a></span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classtesting_1_1_test_event_listener.html#ac6605dbb5859436d59d117348d63746c">OnTestSuiteStart</a>(<span class="keyword">const</span> <a class="code" href="classtesting_1_1_test_suite.html">TestSuite</a>& test_suite) {}</div><div class="line"><a name="l15690"></a><span class="lineno">15690</span> </div><div class="line"><a name="l15691"></a><span class="lineno">15691</span>  <span class="comment">// Legacy API is deprecated but still available</span></div><div class="line"><a name="l15692"></a><span class="lineno">15692</span> <span class="preprocessor">#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_</span></div><div class="line"><a name="l15693"></a><span class="lineno"><a class="line" href="classtesting_1_1_test_event_listener.html#a96693881a1872657b4683e2f0a236ca5">15693</a></span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classtesting_1_1_test_event_listener.html#a96693881a1872657b4683e2f0a236ca5">OnTestCaseStart</a>(<span class="keyword">const</span> TestCase& test_case) {}</div><div class="line"><a name="l15694"></a><span class="lineno">15694</span> <span class="preprocessor">#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_</span></div><div class="line"><a name="l15695"></a><span class="lineno">15695</span> </div><div class="line"><a name="l15696"></a><span class="lineno">15696</span>  <span class="comment">// Fired before the test starts.</span></div><div class="line"><a name="l15697"></a><span class="lineno">15697</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classtesting_1_1_test_event_listener.html#ab4f6a0ca16ae75daf385b3b5914e1048">OnTestStart</a>(<span class="keyword">const</span> <a class="code" href="classtesting_1_1_test_info.html">TestInfo</a>& test_info) = 0;</div><div class="line"><a name="l15698"></a><span class="lineno">15698</span> </div><div class="line"><a name="l15699"></a><span class="lineno">15699</span>  <span class="comment">// Fired after a failed assertion or a SUCCEED() invocation.</span></div><div class="line"><a name="l15700"></a><span class="lineno">15700</span>  <span class="comment">// If you want to throw an exception from this function to skip to the next</span></div><div class="line"><a name="l15701"></a><span class="lineno">15701</span>  <span class="comment">// TEST, it must be AssertionException defined above, or inherited from it.</span></div><div class="line"><a name="l15702"></a><span class="lineno">15702</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classtesting_1_1_test_event_listener.html#a054f8705c883fa120b91473aff38f2ee">OnTestPartResult</a>(<span class="keyword">const</span> TestPartResult& test_part_result) = 0;</div><div class="line"><a name="l15703"></a><span class="lineno">15703</span> </div><div class="line"><a name="l15704"></a><span class="lineno">15704</span>  <span class="comment">// Fired after the test ends.</span></div><div class="line"><a name="l15705"></a><span class="lineno">15705</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classtesting_1_1_test_event_listener.html#abb1c44525ef038500608b5dc2f17099b">OnTestEnd</a>(<span class="keyword">const</span> <a class="code" href="classtesting_1_1_test_info.html">TestInfo</a>& test_info) = 0;</div><div class="line"><a name="l15706"></a><span class="lineno">15706</span> </div><div class="line"><a name="l15707"></a><span class="lineno">15707</span>  <span class="comment">// Fired after the test suite ends.</span></div><div class="line"><a name="l15708"></a><span class="lineno"><a class="line" href="classtesting_1_1_test_event_listener.html#a841e522e537bb858d21eb75d0228d3b5">15708</a></span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classtesting_1_1_test_event_listener.html#a841e522e537bb858d21eb75d0228d3b5">OnTestSuiteEnd</a>(<span class="keyword">const</span> <a class="code" href="classtesting_1_1_test_suite.html">TestSuite</a>& test_suite) {}</div><div class="line"><a name="l15709"></a><span class="lineno">15709</span> </div><div class="line"><a name="l15710"></a><span class="lineno">15710</span> <span class="comment">// Legacy API is deprecated but still available</span></div><div class="line"><a name="l15711"></a><span class="lineno">15711</span> <span class="preprocessor">#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_</span></div><div class="line"><a name="l15712"></a><span class="lineno"><a class="line" href="classtesting_1_1_test_event_listener.html#a76dbb7c3868d1c9abb957faee2568c0b">15712</a></span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classtesting_1_1_test_event_listener.html#a76dbb7c3868d1c9abb957faee2568c0b">OnTestCaseEnd</a>(<span class="keyword">const</span> TestCase& test_case) {}</div><div class="line"><a name="l15713"></a><span class="lineno">15713</span> <span class="preprocessor">#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_</span></div><div class="line"><a name="l15714"></a><span class="lineno">15714</span> </div><div class="line"><a name="l15715"></a><span class="lineno">15715</span>  <span class="comment">// Fired before environment tear-down for each iteration of tests starts.</span></div><div class="line"><a name="l15716"></a><span class="lineno">15716</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classtesting_1_1_test_event_listener.html#a468b5e6701bcb86cb2c956caadbba5e4">OnEnvironmentsTearDownStart</a>(<span class="keyword">const</span> <a class="code" href="classtesting_1_1_unit_test.html">UnitTest</a>& unit_test) = 0;</div><div class="line"><a name="l15717"></a><span class="lineno">15717</span> </div><div class="line"><a name="l15718"></a><span class="lineno">15718</span>  <span class="comment">// Fired after environment tear-down for each iteration of tests ends.</span></div><div class="line"><a name="l15719"></a><span class="lineno">15719</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classtesting_1_1_test_event_listener.html#a9ea04fa7f447865ba76df35e12ba2092">OnEnvironmentsTearDownEnd</a>(<span class="keyword">const</span> <a class="code" href="classtesting_1_1_unit_test.html">UnitTest</a>& unit_test) = 0;</div><div class="line"><a name="l15720"></a><span class="lineno">15720</span> </div><div class="line"><a name="l15721"></a><span class="lineno">15721</span>  <span class="comment">// Fired after each iteration of tests finishes.</span></div><div class="line"><a name="l15722"></a><span class="lineno">15722</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classtesting_1_1_test_event_listener.html#a550fdb3e55726e4cefa09f5697941425">OnTestIterationEnd</a>(<span class="keyword">const</span> <a class="code" href="classtesting_1_1_unit_test.html">UnitTest</a>& unit_test,</div><div class="line"><a name="l15723"></a><span class="lineno">15723</span>  <span class="keywordtype">int</span> iteration) = 0;</div><div class="line"><a name="l15724"></a><span class="lineno">15724</span> </div><div class="line"><a name="l15725"></a><span class="lineno">15725</span>  <span class="comment">// Fired after all test activities have ended.</span></div><div class="line"><a name="l15726"></a><span class="lineno">15726</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classtesting_1_1_test_event_listener.html#ad15b6246d94c268e233487a86463ef3d">OnTestProgramEnd</a>(<span class="keyword">const</span> <a class="code" href="classtesting_1_1_unit_test.html">UnitTest</a>& unit_test) = 0;</div><div class="line"><a name="l15727"></a><span class="lineno">15727</span> };</div><div class="line"><a name="l15728"></a><span class="lineno">15728</span> </div><div class="line"><a name="l15729"></a><span class="lineno">15729</span> <span class="comment">// The convenience class for users who need to override just one or two</span></div><div class="line"><a name="l15730"></a><span class="lineno">15730</span> <span class="comment">// methods and are not concerned that a possible change to a signature of</span></div><div class="line"><a name="l15731"></a><span class="lineno">15731</span> <span class="comment">// the methods they override will not be caught during the build. For</span></div><div class="line"><a name="l15732"></a><span class="lineno">15732</span> <span class="comment">// comments about each method please see the definition of TestEventListener</span></div><div class="line"><a name="l15733"></a><span class="lineno">15733</span> <span class="comment">// above.</span></div><div class="line"><a name="l15734"></a><span class="lineno"><a class="line" href="classtesting_1_1_empty_test_event_listener.html">15734</a></span> <span class="keyword">class </span><a class="code" href="classtesting_1_1_empty_test_event_listener.html">EmptyTestEventListener</a> : <span class="keyword">public</span> <a class="code" href="classtesting_1_1_test_event_listener.html">TestEventListener</a> {</div><div class="line"><a name="l15735"></a><span class="lineno">15735</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l15736"></a><span class="lineno"><a class="line" href="classtesting_1_1_empty_test_event_listener.html#ac3f5033fcd82080edb45f546ce9854fe">15736</a></span>  <span class="keywordtype">void</span> <a class="code" href="classtesting_1_1_empty_test_event_listener.html#ac3f5033fcd82080edb45f546ce9854fe">OnTestProgramStart</a>(<span class="keyword">const</span> <a class="code" href="classtesting_1_1_unit_test.html">UnitTest</a>& <span class="comment">/*unit_test*/</span>)<span class="keyword"> override </span>{}</div><div class="line"><a name="l15737"></a><span class="lineno"><a class="line" href="classtesting_1_1_empty_test_event_listener.html#a31edf103561e8b4d747656bc2d927661">15737</a></span>  <span class="keywordtype">void</span> <a class="code" href="classtesting_1_1_empty_test_event_listener.html#a31edf103561e8b4d747656bc2d927661">OnTestIterationStart</a>(<span class="keyword">const</span> <a class="code" href="classtesting_1_1_unit_test.html">UnitTest</a>& <span class="comment">/*unit_test*/</span>,</div><div class="line"><a name="l15738"></a><span class="lineno">15738</span>  <span class="keywordtype">int</span> <span class="comment">/*iteration*/</span>)<span class="keyword"> override </span>{}</div><div class="line"><a name="l15739"></a><span class="lineno"><a class="line" href="classtesting_1_1_empty_test_event_listener.html#a6e498ae763ac8c1a46bd861e0b7ff3f5">15739</a></span>  <span class="keywordtype">void</span> <a class="code" href="classtesting_1_1_empty_test_event_listener.html#a6e498ae763ac8c1a46bd861e0b7ff3f5">OnEnvironmentsSetUpStart</a>(<span class="keyword">const</span> <a class="code" href="classtesting_1_1_unit_test.html">UnitTest</a>& <span class="comment">/*unit_test*/</span>)<span class="keyword"> override </span>{}</div><div class="line"><a name="l15740"></a><span class="lineno"><a class="line" href="classtesting_1_1_empty_test_event_listener.html#a9b4e781c0b38065a55c2fd163724ba69">15740</a></span>  <span class="keywordtype">void</span> <a class="code" href="classtesting_1_1_empty_test_event_listener.html#a9b4e781c0b38065a55c2fd163724ba69">OnEnvironmentsSetUpEnd</a>(<span class="keyword">const</span> <a class="code" href="classtesting_1_1_unit_test.html">UnitTest</a>& <span class="comment">/*unit_test*/</span>)<span class="keyword"> override </span>{}</div><div class="line"><a name="l15741"></a><span class="lineno"><a class="line" href="classtesting_1_1_empty_test_event_listener.html#a1e32e4bd4857822b6b50e6900aa5c651">15741</a></span>  <span class="keywordtype">void</span> <a class="code" href="classtesting_1_1_empty_test_event_listener.html#a1e32e4bd4857822b6b50e6900aa5c651">OnTestSuiteStart</a>(<span class="keyword">const</span> <a class="code" href="classtesting_1_1_test_suite.html">TestSuite</a>& <span class="comment">/*test_suite*/</span>)<span class="keyword"> override </span>{}</div><div class="line"><a name="l15742"></a><span class="lineno">15742</span> <span class="comment">// Legacy API is deprecated but still available</span></div><div class="line"><a name="l15743"></a><span class="lineno">15743</span> <span class="preprocessor">#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_</span></div><div class="line"><a name="l15744"></a><span class="lineno"><a class="line" href="classtesting_1_1_empty_test_event_listener.html#aa1fd7d378f2cdde00a4f8a2f4efb95b4">15744</a></span>  <span class="keywordtype">void</span> <a class="code" href="classtesting_1_1_empty_test_event_listener.html#aa1fd7d378f2cdde00a4f8a2f4efb95b4">OnTestCaseStart</a>(<span class="keyword">const</span> TestCase& tc <span class="comment">/*test_suite*/</span>)<span class="keyword"> override </span>{}</div><div class="line"><a name="l15745"></a><span class="lineno">15745</span> <span class="preprocessor">#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_</span></div><div class="line"><a name="l15746"></a><span class="lineno">15746</span> </div><div class="line"><a name="l15747"></a><span class="lineno"><a class="line" href="classtesting_1_1_empty_test_event_listener.html#a1d8c7f3f1f92826f668edae1bc5aadf4">15747</a></span>  <span class="keywordtype">void</span> <a class="code" href="classtesting_1_1_empty_test_event_listener.html#a1d8c7f3f1f92826f668edae1bc5aadf4">OnTestStart</a>(<span class="keyword">const</span> <a class="code" href="classtesting_1_1_test_info.html">TestInfo</a>& <span class="comment">/*test_info*/</span>)<span class="keyword"> override </span>{}</div><div class="line"><a name="l15748"></a><span class="lineno"><a class="line" href="classtesting_1_1_empty_test_event_listener.html#ab95992f0a0b3741d59a24c3a7115fa60">15748</a></span>  <span class="keywordtype">void</span> <a class="code" href="classtesting_1_1_empty_test_event_listener.html#ab95992f0a0b3741d59a24c3a7115fa60">OnTestPartResult</a>(<span class="keyword">const</span> TestPartResult& <span class="comment">/*test_part_result*/</span>)<span class="keyword"> override </span>{}</div><div class="line"><a name="l15749"></a><span class="lineno"><a class="line" href="classtesting_1_1_empty_test_event_listener.html#a709d7077c086c877d214231bc520ef90">15749</a></span>  <span class="keywordtype">void</span> <a class="code" href="classtesting_1_1_empty_test_event_listener.html#a709d7077c086c877d214231bc520ef90">OnTestEnd</a>(<span class="keyword">const</span> <a class="code" href="classtesting_1_1_test_info.html">TestInfo</a>& <span class="comment">/*test_info*/</span>)<span class="keyword"> override </span>{}</div><div class="line"><a name="l15750"></a><span class="lineno"><a class="line" href="classtesting_1_1_empty_test_event_listener.html#aefdb73682d290791461e186d864db718">15750</a></span>  <span class="keywordtype">void</span> <a class="code" href="classtesting_1_1_empty_test_event_listener.html#aefdb73682d290791461e186d864db718">OnTestSuiteEnd</a>(<span class="keyword">const</span> <a class="code" href="classtesting_1_1_test_suite.html">TestSuite</a>& <span class="comment">/*test_suite*/</span>)<span class="keyword"> override </span>{}</div><div class="line"><a name="l15751"></a><span class="lineno">15751</span> <span class="preprocessor">#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_</span></div><div class="line"><a name="l15752"></a><span class="lineno"><a class="line" href="classtesting_1_1_empty_test_event_listener.html#a166bcf075f37bfe14f912d2def55f61a">15752</a></span>  <span class="keywordtype">void</span> <a class="code" href="classtesting_1_1_empty_test_event_listener.html#a166bcf075f37bfe14f912d2def55f61a">OnTestCaseEnd</a>(<span class="keyword">const</span> TestCase& tc <span class="comment">/*test_suite*/</span>)<span class="keyword"> override </span>{}</div><div class="line"><a name="l15753"></a><span class="lineno">15753</span> <span class="preprocessor">#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_</span></div><div class="line"><a name="l15754"></a><span class="lineno">15754</span> </div><div class="line"><a name="l15755"></a><span class="lineno"><a class="line" href="classtesting_1_1_empty_test_event_listener.html#a320780451eac9178434b7c77d948ecbd">15755</a></span>  <span class="keywordtype">void</span> <a class="code" href="classtesting_1_1_empty_test_event_listener.html#a320780451eac9178434b7c77d948ecbd">OnEnvironmentsTearDownStart</a>(<span class="keyword">const</span> <a class="code" href="classtesting_1_1_unit_test.html">UnitTest</a>& <span class="comment">/*unit_test*/</span>)<span class="keyword"> override </span>{}</div><div class="line"><a name="l15756"></a><span class="lineno"><a class="line" href="classtesting_1_1_empty_test_event_listener.html#ad9984052e82c3ae26395a2d9480326d2">15756</a></span>  <span class="keywordtype">void</span> <a class="code" href="classtesting_1_1_empty_test_event_listener.html#ad9984052e82c3ae26395a2d9480326d2">OnEnvironmentsTearDownEnd</a>(<span class="keyword">const</span> <a class="code" href="classtesting_1_1_unit_test.html">UnitTest</a>& <span class="comment">/*unit_test*/</span>)<span class="keyword"> override </span>{}</div><div class="line"><a name="l15757"></a><span class="lineno"><a class="line" href="classtesting_1_1_empty_test_event_listener.html#aae9c5c61e476f0c421402fb1dde434d2">15757</a></span>  <span class="keywordtype">void</span> <a class="code" href="classtesting_1_1_empty_test_event_listener.html#aae9c5c61e476f0c421402fb1dde434d2">OnTestIterationEnd</a>(<span class="keyword">const</span> <a class="code" href="classtesting_1_1_unit_test.html">UnitTest</a>& <span class="comment">/*unit_test*/</span>,</div><div class="line"><a name="l15758"></a><span class="lineno">15758</span>  <span class="keywordtype">int</span> <span class="comment">/*iteration*/</span>)<span class="keyword"> override </span>{}</div><div class="line"><a name="l15759"></a><span class="lineno"><a class="line" href="classtesting_1_1_empty_test_event_listener.html#aaa9d683e8e0c850af67a0b92d785ddb9">15759</a></span>  <span class="keywordtype">void</span> <a class="code" href="classtesting_1_1_empty_test_event_listener.html#aaa9d683e8e0c850af67a0b92d785ddb9">OnTestProgramEnd</a>(<span class="keyword">const</span> <a class="code" href="classtesting_1_1_unit_test.html">UnitTest</a>& <span class="comment">/*unit_test*/</span>)<span class="keyword"> override </span>{}</div><div class="line"><a name="l15760"></a><span class="lineno">15760</span> };</div><div class="line"><a name="l15761"></a><span class="lineno">15761</span> </div><div class="line"><a name="l15762"></a><span class="lineno">15762</span> <span class="comment">// TestEventListeners lets users add listeners to track events in Google Test.</span></div><div class="line"><a name="l15763"></a><span class="lineno"><a class="line" href="classtesting_1_1_test_event_listeners.html">15763</a></span> <span class="keyword">class </span><a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> <a class="code" href="classtesting_1_1_test_event_listeners.html">TestEventListeners</a> {</div><div class="line"><a name="l15764"></a><span class="lineno">15764</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l15765"></a><span class="lineno">15765</span>  <a class="code" href="classtesting_1_1_test_event_listeners.html">TestEventListeners</a>();</div><div class="line"><a name="l15766"></a><span class="lineno">15766</span>  ~<a class="code" href="classtesting_1_1_test_event_listeners.html">TestEventListeners</a>();</div><div class="line"><a name="l15767"></a><span class="lineno">15767</span> </div><div class="line"><a name="l15768"></a><span class="lineno">15768</span>  <span class="comment">// Appends an event listener to the end of the list. Google Test assumes</span></div><div class="line"><a name="l15769"></a><span class="lineno">15769</span>  <span class="comment">// the ownership of the listener (i.e. it will delete the listener when</span></div><div class="line"><a name="l15770"></a><span class="lineno">15770</span>  <span class="comment">// the test program finishes).</span></div><div class="line"><a name="l15771"></a><span class="lineno">15771</span>  <span class="keywordtype">void</span> Append(<a class="code" href="classtesting_1_1_test_event_listener.html">TestEventListener</a>* listener);</div><div class="line"><a name="l15772"></a><span class="lineno">15772</span> </div><div class="line"><a name="l15773"></a><span class="lineno">15773</span>  <span class="comment">// Removes the given event listener from the list and returns it. It then</span></div><div class="line"><a name="l15774"></a><span class="lineno">15774</span>  <span class="comment">// becomes the caller's responsibility to delete the listener. Returns</span></div><div class="line"><a name="l15775"></a><span class="lineno">15775</span>  <span class="comment">// NULL if the listener is not found in the list.</span></div><div class="line"><a name="l15776"></a><span class="lineno">15776</span>  <a class="code" href="classtesting_1_1_test_event_listener.html">TestEventListener</a>* Release(<a class="code" href="classtesting_1_1_test_event_listener.html">TestEventListener</a>* listener);</div><div class="line"><a name="l15777"></a><span class="lineno">15777</span> </div><div class="line"><a name="l15778"></a><span class="lineno">15778</span>  <span class="comment">// Returns the standard listener responsible for the default console</span></div><div class="line"><a name="l15779"></a><span class="lineno">15779</span>  <span class="comment">// output. Can be removed from the listeners list to shut down default</span></div><div class="line"><a name="l15780"></a><span class="lineno">15780</span>  <span class="comment">// console output. Note that removing this object from the listener list</span></div><div class="line"><a name="l15781"></a><span class="lineno">15781</span>  <span class="comment">// with Release transfers its ownership to the caller and makes this</span></div><div class="line"><a name="l15782"></a><span class="lineno">15782</span>  <span class="comment">// function return NULL the next time.</span></div><div class="line"><a name="l15783"></a><span class="lineno"><a class="line" href="classtesting_1_1_test_event_listeners.html#a6293443acb5af942eeec638b6aa6dcf2">15783</a></span>  <a class="code" href="classtesting_1_1_test_event_listener.html">TestEventListener</a>* <a class="code" href="classtesting_1_1_test_event_listeners.html#a6293443acb5af942eeec638b6aa6dcf2">default_result_printer</a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l15784"></a><span class="lineno">15784</span>  <span class="keywordflow">return</span> default_result_printer_;</div><div class="line"><a name="l15785"></a><span class="lineno">15785</span>  }</div><div class="line"><a name="l15786"></a><span class="lineno">15786</span> </div><div class="line"><a name="l15787"></a><span class="lineno">15787</span>  <span class="comment">// Returns the standard listener responsible for the default XML output</span></div><div class="line"><a name="l15788"></a><span class="lineno">15788</span>  <span class="comment">// controlled by the --gtest_output=xml flag. Can be removed from the</span></div><div class="line"><a name="l15789"></a><span class="lineno">15789</span>  <span class="comment">// listeners list by users who want to shut down the default XML output</span></div><div class="line"><a name="l15790"></a><span class="lineno">15790</span>  <span class="comment">// controlled by this flag and substitute it with custom one. Note that</span></div><div class="line"><a name="l15791"></a><span class="lineno">15791</span>  <span class="comment">// removing this object from the listener list with Release transfers its</span></div><div class="line"><a name="l15792"></a><span class="lineno">15792</span>  <span class="comment">// ownership to the caller and makes this function return NULL the next</span></div><div class="line"><a name="l15793"></a><span class="lineno">15793</span>  <span class="comment">// time.</span></div><div class="line"><a name="l15794"></a><span class="lineno"><a class="line" href="classtesting_1_1_test_event_listeners.html#aa880de6ddfc3f5824371853c6846abbd">15794</a></span>  <a class="code" href="classtesting_1_1_test_event_listener.html">TestEventListener</a>* <a class="code" href="classtesting_1_1_test_event_listeners.html#aa880de6ddfc3f5824371853c6846abbd">default_xml_generator</a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l15795"></a><span class="lineno">15795</span>  <span class="keywordflow">return</span> default_xml_generator_;</div><div class="line"><a name="l15796"></a><span class="lineno">15796</span>  }</div><div class="line"><a name="l15797"></a><span class="lineno">15797</span> </div><div class="line"><a name="l15798"></a><span class="lineno">15798</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l15799"></a><span class="lineno"><a class="line" href="classtesting_1_1_test_event_listeners.html#ab9aaba231fd11196425e75caf709bfc6">15799</a></span>  <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classtesting_1_1_test_suite.html">TestSuite</a>;</div><div class="line"><a name="l15800"></a><span class="lineno"><a class="line" href="classtesting_1_1_test_event_listeners.html#a4c49c2cdb6c328e6b709b4542f23de3c">15800</a></span>  <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classtesting_1_1_test_info.html">TestInfo</a>;</div><div class="line"><a name="l15801"></a><span class="lineno"><a class="line" href="classtesting_1_1_test_event_listeners.html#abae39633da9932847b41cb80efd62115">15801</a></span>  <span class="keyword">friend</span> <span class="keyword">class </span>internal::DefaultGlobalTestPartResultReporter;</div><div class="line"><a name="l15802"></a><span class="lineno"><a class="line" href="classtesting_1_1_test_event_listeners.html#afddba49fdf3f493532b4d5efb9814f4e">15802</a></span>  <span class="keyword">friend</span> <span class="keyword">class </span>internal::NoExecDeathTest;</div><div class="line"><a name="l15803"></a><span class="lineno"><a class="line" href="classtesting_1_1_test_event_listeners.html#addbc107b6b445617c880182bd4f44cf9">15803</a></span>  <span class="keyword">friend</span> <span class="keyword">class </span>internal::TestEventListenersAccessor;</div><div class="line"><a name="l15804"></a><span class="lineno"><a class="line" href="classtesting_1_1_test_event_listeners.html#acc0a5e7573fd6ae7ad1878613bb86853">15804</a></span>  <span class="keyword">friend</span> <span class="keyword">class </span>internal::UnitTestImpl;</div><div class="line"><a name="l15805"></a><span class="lineno">15805</span> </div><div class="line"><a name="l15806"></a><span class="lineno">15806</span>  <span class="comment">// Returns repeater that broadcasts the TestEventListener events to all</span></div><div class="line"><a name="l15807"></a><span class="lineno">15807</span>  <span class="comment">// subscribers.</span></div><div class="line"><a name="l15808"></a><span class="lineno">15808</span>  <a class="code" href="classtesting_1_1_test_event_listener.html">TestEventListener</a>* repeater();</div><div class="line"><a name="l15809"></a><span class="lineno">15809</span> </div><div class="line"><a name="l15810"></a><span class="lineno">15810</span>  <span class="comment">// Sets the default_result_printer attribute to the provided listener.</span></div><div class="line"><a name="l15811"></a><span class="lineno">15811</span>  <span class="comment">// The listener is also added to the listener list and previous</span></div><div class="line"><a name="l15812"></a><span class="lineno">15812</span>  <span class="comment">// default_result_printer is removed from it and deleted. The listener can</span></div><div class="line"><a name="l15813"></a><span class="lineno">15813</span>  <span class="comment">// also be NULL in which case it will not be added to the list. Does</span></div><div class="line"><a name="l15814"></a><span class="lineno">15814</span>  <span class="comment">// nothing if the previous and the current listener objects are the same.</span></div><div class="line"><a name="l15815"></a><span class="lineno">15815</span>  <span class="keywordtype">void</span> SetDefaultResultPrinter(<a class="code" href="classtesting_1_1_test_event_listener.html">TestEventListener</a>* listener);</div><div class="line"><a name="l15816"></a><span class="lineno">15816</span> </div><div class="line"><a name="l15817"></a><span class="lineno">15817</span>  <span class="comment">// Sets the default_xml_generator attribute to the provided listener. The</span></div><div class="line"><a name="l15818"></a><span class="lineno">15818</span>  <span class="comment">// listener is also added to the listener list and previous</span></div><div class="line"><a name="l15819"></a><span class="lineno">15819</span>  <span class="comment">// default_xml_generator is removed from it and deleted. The listener can</span></div><div class="line"><a name="l15820"></a><span class="lineno">15820</span>  <span class="comment">// also be NULL in which case it will not be added to the list. Does</span></div><div class="line"><a name="l15821"></a><span class="lineno">15821</span>  <span class="comment">// nothing if the previous and the current listener objects are the same.</span></div><div class="line"><a name="l15822"></a><span class="lineno">15822</span>  <span class="keywordtype">void</span> SetDefaultXmlGenerator(<a class="code" href="classtesting_1_1_test_event_listener.html">TestEventListener</a>* listener);</div><div class="line"><a name="l15823"></a><span class="lineno">15823</span> </div><div class="line"><a name="l15824"></a><span class="lineno">15824</span>  <span class="comment">// Controls whether events will be forwarded by the repeater to the</span></div><div class="line"><a name="l15825"></a><span class="lineno">15825</span>  <span class="comment">// listeners in the list.</span></div><div class="line"><a name="l15826"></a><span class="lineno">15826</span>  <span class="keywordtype">bool</span> EventForwardingEnabled() <span class="keyword">const</span>;</div><div class="line"><a name="l15827"></a><span class="lineno">15827</span>  <span class="keywordtype">void</span> SuppressEventForwarding();</div><div class="line"><a name="l15828"></a><span class="lineno">15828</span> </div><div class="line"><a name="l15829"></a><span class="lineno">15829</span>  <span class="comment">// The actual list of listeners.</span></div><div class="line"><a name="l15830"></a><span class="lineno">15830</span>  internal::TestEventRepeater* repeater_;</div><div class="line"><a name="l15831"></a><span class="lineno">15831</span>  <span class="comment">// Listener responsible for the standard result output.</span></div><div class="line"><a name="l15832"></a><span class="lineno">15832</span>  <a class="code" href="classtesting_1_1_test_event_listener.html">TestEventListener</a>* default_result_printer_;</div><div class="line"><a name="l15833"></a><span class="lineno">15833</span>  <span class="comment">// Listener responsible for the creation of the XML output file.</span></div><div class="line"><a name="l15834"></a><span class="lineno">15834</span>  <a class="code" href="classtesting_1_1_test_event_listener.html">TestEventListener</a>* default_xml_generator_;</div><div class="line"><a name="l15835"></a><span class="lineno">15835</span> </div><div class="line"><a name="l15836"></a><span class="lineno">15836</span>  <span class="comment">// We disallow copying TestEventListeners.</span></div><div class="line"><a name="l15837"></a><span class="lineno">15837</span>  <a class="code" href="gtest_8h.html#aed8c1888c32b588b0681e88b95031e29">GTEST_DISALLOW_COPY_AND_ASSIGN_</a>(<a class="code" href="classtesting_1_1_test_event_listeners.html">TestEventListeners</a>);</div><div class="line"><a name="l15838"></a><span class="lineno">15838</span> };</div><div class="line"><a name="l15839"></a><span class="lineno">15839</span> </div><div class="line"><a name="l15840"></a><span class="lineno">15840</span> <span class="comment">// A UnitTest consists of a vector of TestSuites.</span></div><div class="line"><a name="l15841"></a><span class="lineno">15841</span> <span class="comment">//</span></div><div class="line"><a name="l15842"></a><span class="lineno">15842</span> <span class="comment">// This is a singleton class. The only instance of UnitTest is</span></div><div class="line"><a name="l15843"></a><span class="lineno">15843</span> <span class="comment">// created when UnitTest::GetInstance() is first called. This</span></div><div class="line"><a name="l15844"></a><span class="lineno">15844</span> <span class="comment">// instance is never deleted.</span></div><div class="line"><a name="l15845"></a><span class="lineno">15845</span> <span class="comment">//</span></div><div class="line"><a name="l15846"></a><span class="lineno">15846</span> <span class="comment">// UnitTest is not copyable.</span></div><div class="line"><a name="l15847"></a><span class="lineno">15847</span> <span class="comment">//</span></div><div class="line"><a name="l15848"></a><span class="lineno">15848</span> <span class="comment">// This class is thread-safe as long as the methods are called</span></div><div class="line"><a name="l15849"></a><span class="lineno">15849</span> <span class="comment">// according to their specification.</span></div><div class="line"><a name="l15850"></a><span class="lineno"><a class="line" href="classtesting_1_1_unit_test.html">15850</a></span> <span class="keyword">class </span><a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> <a class="code" href="classtesting_1_1_unit_test.html">UnitTest</a> {</div><div class="line"><a name="l15851"></a><span class="lineno">15851</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l15852"></a><span class="lineno">15852</span>  <span class="comment">// Gets the singleton UnitTest object. The first time this method</span></div><div class="line"><a name="l15853"></a><span class="lineno">15853</span>  <span class="comment">// is called, a UnitTest object is constructed and returned.</span></div><div class="line"><a name="l15854"></a><span class="lineno">15854</span>  <span class="comment">// Consecutive calls will return the same object.</span></div><div class="line"><a name="l15855"></a><span class="lineno">15855</span>  <span class="keyword">static</span> <a class="code" href="classtesting_1_1_unit_test.html">UnitTest</a>* GetInstance();</div><div class="line"><a name="l15856"></a><span class="lineno">15856</span> </div><div class="line"><a name="l15857"></a><span class="lineno">15857</span>  <span class="comment">// Runs all tests in this UnitTest object and prints the result.</span></div><div class="line"><a name="l15858"></a><span class="lineno">15858</span>  <span class="comment">// Returns 0 if successful, or 1 otherwise.</span></div><div class="line"><a name="l15859"></a><span class="lineno">15859</span>  <span class="comment">//</span></div><div class="line"><a name="l15860"></a><span class="lineno">15860</span>  <span class="comment">// This method can only be called from the main thread.</span></div><div class="line"><a name="l15861"></a><span class="lineno">15861</span>  <span class="comment">//</span></div><div class="line"><a name="l15862"></a><span class="lineno">15862</span>  <span class="comment">// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.</span></div><div class="line"><a name="l15863"></a><span class="lineno">15863</span>  <span class="keywordtype">int</span> Run() <a class="code" href="gtest_8h.html#a8e5aab8276b2645f64f41c9e3021b935">GTEST_MUST_USE_RESULT_</a>;</div><div class="line"><a name="l15864"></a><span class="lineno">15864</span> </div><div class="line"><a name="l15865"></a><span class="lineno">15865</span>  <span class="comment">// Returns the working directory when the first TEST() or TEST_F()</span></div><div class="line"><a name="l15866"></a><span class="lineno">15866</span>  <span class="comment">// was executed. The UnitTest object owns the string.</span></div><div class="line"><a name="l15867"></a><span class="lineno">15867</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* original_working_dir() <span class="keyword">const</span>;</div><div class="line"><a name="l15868"></a><span class="lineno">15868</span> </div><div class="line"><a name="l15869"></a><span class="lineno">15869</span>  <span class="comment">// Returns the TestSuite object for the test that's currently running,</span></div><div class="line"><a name="l15870"></a><span class="lineno">15870</span>  <span class="comment">// or NULL if no test is running.</span></div><div class="line"><a name="l15871"></a><span class="lineno">15871</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1_test_suite.html">TestSuite</a>* current_test_suite() <span class="keyword">const</span> <a class="code" href="gtest_8h.html#a69abff5a4efdd07bd5faebe3dd318d06">GTEST_LOCK_EXCLUDED_</a>(mutex_);</div><div class="line"><a name="l15872"></a><span class="lineno">15872</span> </div><div class="line"><a name="l15873"></a><span class="lineno">15873</span> <span class="comment">// Legacy API is still available but deprecated</span></div><div class="line"><a name="l15874"></a><span class="lineno">15874</span> <span class="preprocessor">#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_</span></div><div class="line"><a name="l15875"></a><span class="lineno">15875</span>  <span class="keyword">const</span> TestCase* current_test_case() <span class="keyword">const</span> <a class="code" href="gtest_8h.html#a69abff5a4efdd07bd5faebe3dd318d06">GTEST_LOCK_EXCLUDED_</a>(mutex_);</div><div class="line"><a name="l15876"></a><span class="lineno">15876</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l15877"></a><span class="lineno">15877</span> </div><div class="line"><a name="l15878"></a><span class="lineno">15878</span>  <span class="comment">// Returns the TestInfo object for the test that's currently running,</span></div><div class="line"><a name="l15879"></a><span class="lineno">15879</span>  <span class="comment">// or NULL if no test is running.</span></div><div class="line"><a name="l15880"></a><span class="lineno">15880</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1_test_info.html">TestInfo</a>* current_test_info() <span class="keyword">const</span></div><div class="line"><a name="l15881"></a><span class="lineno">15881</span>  <a class="code" href="gtest_8h.html#a69abff5a4efdd07bd5faebe3dd318d06">GTEST_LOCK_EXCLUDED_</a>(mutex_);</div><div class="line"><a name="l15882"></a><span class="lineno">15882</span> </div><div class="line"><a name="l15883"></a><span class="lineno">15883</span>  <span class="comment">// Returns the random seed used at the start of the current test run.</span></div><div class="line"><a name="l15884"></a><span class="lineno">15884</span>  <span class="keywordtype">int</span> random_seed() <span class="keyword">const</span>;</div><div class="line"><a name="l15885"></a><span class="lineno">15885</span> </div><div class="line"><a name="l15886"></a><span class="lineno">15886</span>  <span class="comment">// Returns the ParameterizedTestSuiteRegistry object used to keep track of</span></div><div class="line"><a name="l15887"></a><span class="lineno">15887</span>  <span class="comment">// value-parameterized tests and instantiate and register them.</span></div><div class="line"><a name="l15888"></a><span class="lineno">15888</span>  <span class="comment">//</span></div><div class="line"><a name="l15889"></a><span class="lineno">15889</span>  <span class="comment">// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.</span></div><div class="line"><a name="l15890"></a><span class="lineno">15890</span>  <a class="code" href="classtesting_1_1internal_1_1_parameterized_test_suite_registry.html">internal::ParameterizedTestSuiteRegistry</a>& parameterized_test_registry()</div><div class="line"><a name="l15891"></a><span class="lineno">15891</span>  <a class="code" href="gtest_8h.html#a69abff5a4efdd07bd5faebe3dd318d06">GTEST_LOCK_EXCLUDED_</a>(mutex_);</div><div class="line"><a name="l15892"></a><span class="lineno">15892</span> </div><div class="line"><a name="l15893"></a><span class="lineno">15893</span>  <span class="comment">// Gets the number of successful test suites.</span></div><div class="line"><a name="l15894"></a><span class="lineno">15894</span>  <span class="keywordtype">int</span> successful_test_suite_count() <span class="keyword">const</span>;</div><div class="line"><a name="l15895"></a><span class="lineno">15895</span> </div><div class="line"><a name="l15896"></a><span class="lineno">15896</span>  <span class="comment">// Gets the number of failed test suites.</span></div><div class="line"><a name="l15897"></a><span class="lineno">15897</span>  <span class="keywordtype">int</span> failed_test_suite_count() <span class="keyword">const</span>;</div><div class="line"><a name="l15898"></a><span class="lineno">15898</span> </div><div class="line"><a name="l15899"></a><span class="lineno">15899</span>  <span class="comment">// Gets the number of all test suites.</span></div><div class="line"><a name="l15900"></a><span class="lineno">15900</span>  <span class="keywordtype">int</span> total_test_suite_count() <span class="keyword">const</span>;</div><div class="line"><a name="l15901"></a><span class="lineno">15901</span> </div><div class="line"><a name="l15902"></a><span class="lineno">15902</span>  <span class="comment">// Gets the number of all test suites that contain at least one test</span></div><div class="line"><a name="l15903"></a><span class="lineno">15903</span>  <span class="comment">// that should run.</span></div><div class="line"><a name="l15904"></a><span class="lineno">15904</span>  <span class="keywordtype">int</span> test_suite_to_run_count() <span class="keyword">const</span>;</div><div class="line"><a name="l15905"></a><span class="lineno">15905</span> </div><div class="line"><a name="l15906"></a><span class="lineno">15906</span>  <span class="comment">// Legacy API is deprecated but still available</span></div><div class="line"><a name="l15907"></a><span class="lineno">15907</span> <span class="preprocessor">#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_</span></div><div class="line"><a name="l15908"></a><span class="lineno">15908</span>  <span class="keywordtype">int</span> successful_test_case_count() <span class="keyword">const</span>;</div><div class="line"><a name="l15909"></a><span class="lineno">15909</span>  <span class="keywordtype">int</span> failed_test_case_count() <span class="keyword">const</span>;</div><div class="line"><a name="l15910"></a><span class="lineno">15910</span>  <span class="keywordtype">int</span> total_test_case_count() <span class="keyword">const</span>;</div><div class="line"><a name="l15911"></a><span class="lineno">15911</span>  <span class="keywordtype">int</span> test_case_to_run_count() <span class="keyword">const</span>;</div><div class="line"><a name="l15912"></a><span class="lineno">15912</span> <span class="preprocessor">#endif // EMOVE_LEGACY_TEST_CASEAPI</span></div><div class="line"><a name="l15913"></a><span class="lineno">15913</span> </div><div class="line"><a name="l15914"></a><span class="lineno">15914</span>  <span class="comment">// Gets the number of successful tests.</span></div><div class="line"><a name="l15915"></a><span class="lineno">15915</span>  <span class="keywordtype">int</span> successful_test_count() <span class="keyword">const</span>;</div><div class="line"><a name="l15916"></a><span class="lineno">15916</span> </div><div class="line"><a name="l15917"></a><span class="lineno">15917</span>  <span class="comment">// Gets the number of skipped tests.</span></div><div class="line"><a name="l15918"></a><span class="lineno">15918</span>  <span class="keywordtype">int</span> skipped_test_count() <span class="keyword">const</span>;</div><div class="line"><a name="l15919"></a><span class="lineno">15919</span> </div><div class="line"><a name="l15920"></a><span class="lineno">15920</span>  <span class="comment">// Gets the number of failed tests.</span></div><div class="line"><a name="l15921"></a><span class="lineno">15921</span>  <span class="keywordtype">int</span> failed_test_count() <span class="keyword">const</span>;</div><div class="line"><a name="l15922"></a><span class="lineno">15922</span> </div><div class="line"><a name="l15923"></a><span class="lineno">15923</span>  <span class="comment">// Gets the number of disabled tests that will be reported in the XML report.</span></div><div class="line"><a name="l15924"></a><span class="lineno">15924</span>  <span class="keywordtype">int</span> reportable_disabled_test_count() <span class="keyword">const</span>;</div><div class="line"><a name="l15925"></a><span class="lineno">15925</span> </div><div class="line"><a name="l15926"></a><span class="lineno">15926</span>  <span class="comment">// Gets the number of disabled tests.</span></div><div class="line"><a name="l15927"></a><span class="lineno">15927</span>  <span class="keywordtype">int</span> disabled_test_count() <span class="keyword">const</span>;</div><div class="line"><a name="l15928"></a><span class="lineno">15928</span> </div><div class="line"><a name="l15929"></a><span class="lineno">15929</span>  <span class="comment">// Gets the number of tests to be printed in the XML report.</span></div><div class="line"><a name="l15930"></a><span class="lineno">15930</span>  <span class="keywordtype">int</span> reportable_test_count() <span class="keyword">const</span>;</div><div class="line"><a name="l15931"></a><span class="lineno">15931</span> </div><div class="line"><a name="l15932"></a><span class="lineno">15932</span>  <span class="comment">// Gets the number of all tests.</span></div><div class="line"><a name="l15933"></a><span class="lineno">15933</span>  <span class="keywordtype">int</span> total_test_count() <span class="keyword">const</span>;</div><div class="line"><a name="l15934"></a><span class="lineno">15934</span> </div><div class="line"><a name="l15935"></a><span class="lineno">15935</span>  <span class="comment">// Gets the number of tests that should run.</span></div><div class="line"><a name="l15936"></a><span class="lineno">15936</span>  <span class="keywordtype">int</span> test_to_run_count() <span class="keyword">const</span>;</div><div class="line"><a name="l15937"></a><span class="lineno">15937</span> </div><div class="line"><a name="l15938"></a><span class="lineno">15938</span>  <span class="comment">// Gets the time of the test program start, in ms from the start of the</span></div><div class="line"><a name="l15939"></a><span class="lineno">15939</span>  <span class="comment">// UNIX epoch.</span></div><div class="line"><a name="l15940"></a><span class="lineno">15940</span>  <a class="code" href="namespacetesting.html#a992de1d091ce660f451d1e8b3ce30fd6">TimeInMillis</a> start_timestamp() <span class="keyword">const</span>;</div><div class="line"><a name="l15941"></a><span class="lineno">15941</span> </div><div class="line"><a name="l15942"></a><span class="lineno">15942</span>  <span class="comment">// Gets the elapsed time, in milliseconds.</span></div><div class="line"><a name="l15943"></a><span class="lineno">15943</span>  <a class="code" href="namespacetesting.html#a992de1d091ce660f451d1e8b3ce30fd6">TimeInMillis</a> elapsed_time() <span class="keyword">const</span>;</div><div class="line"><a name="l15944"></a><span class="lineno">15944</span> </div><div class="line"><a name="l15945"></a><span class="lineno">15945</span>  <span class="comment">// Returns true iff the unit test passed (i.e. all test suites passed).</span></div><div class="line"><a name="l15946"></a><span class="lineno">15946</span>  <span class="keywordtype">bool</span> Passed() <span class="keyword">const</span>;</div><div class="line"><a name="l15947"></a><span class="lineno">15947</span> </div><div class="line"><a name="l15948"></a><span class="lineno">15948</span>  <span class="comment">// Returns true iff the unit test failed (i.e. some test suite failed</span></div><div class="line"><a name="l15949"></a><span class="lineno">15949</span>  <span class="comment">// or something outside of all tests failed).</span></div><div class="line"><a name="l15950"></a><span class="lineno">15950</span>  <span class="keywordtype">bool</span> Failed() <span class="keyword">const</span>;</div><div class="line"><a name="l15951"></a><span class="lineno">15951</span> </div><div class="line"><a name="l15952"></a><span class="lineno">15952</span>  <span class="comment">// Gets the i-th test suite among all the test suites. i can range from 0 to</span></div><div class="line"><a name="l15953"></a><span class="lineno">15953</span>  <span class="comment">// total_test_suite_count() - 1. If i is not in that range, returns NULL.</span></div><div class="line"><a name="l15954"></a><span class="lineno">15954</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1_test_suite.html">TestSuite</a>* GetTestSuite(<span class="keywordtype">int</span> i) <span class="keyword">const</span>;</div><div class="line"><a name="l15955"></a><span class="lineno">15955</span> </div><div class="line"><a name="l15956"></a><span class="lineno">15956</span> <span class="comment">// Legacy API is deprecated but still available</span></div><div class="line"><a name="l15957"></a><span class="lineno">15957</span> <span class="preprocessor">#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_</span></div><div class="line"><a name="l15958"></a><span class="lineno">15958</span>  <span class="keyword">const</span> TestCase* GetTestCase(<span class="keywordtype">int</span> i) <span class="keyword">const</span>;</div><div class="line"><a name="l15959"></a><span class="lineno">15959</span> <span class="preprocessor">#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_</span></div><div class="line"><a name="l15960"></a><span class="lineno">15960</span> </div><div class="line"><a name="l15961"></a><span class="lineno">15961</span>  <span class="comment">// Returns the TestResult containing information on test failures and</span></div><div class="line"><a name="l15962"></a><span class="lineno">15962</span>  <span class="comment">// properties logged outside of individual test suites.</span></div><div class="line"><a name="l15963"></a><span class="lineno">15963</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1_test_result.html">TestResult</a>& ad_hoc_test_result() <span class="keyword">const</span>;</div><div class="line"><a name="l15964"></a><span class="lineno">15964</span> </div><div class="line"><a name="l15965"></a><span class="lineno">15965</span>  <span class="comment">// Returns the list of event listeners that can be used to track events</span></div><div class="line"><a name="l15966"></a><span class="lineno">15966</span>  <span class="comment">// inside Google Test.</span></div><div class="line"><a name="l15967"></a><span class="lineno">15967</span>  <a class="code" href="classtesting_1_1_test_event_listeners.html">TestEventListeners</a>& listeners();</div><div class="line"><a name="l15968"></a><span class="lineno">15968</span> </div><div class="line"><a name="l15969"></a><span class="lineno">15969</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l15970"></a><span class="lineno">15970</span>  <span class="comment">// Registers and returns a global test environment. When a test</span></div><div class="line"><a name="l15971"></a><span class="lineno">15971</span>  <span class="comment">// program is run, all global test environments will be set-up in</span></div><div class="line"><a name="l15972"></a><span class="lineno">15972</span>  <span class="comment">// the order they were registered. After all tests in the program</span></div><div class="line"><a name="l15973"></a><span class="lineno">15973</span>  <span class="comment">// have finished, all global test environments will be torn-down in</span></div><div class="line"><a name="l15974"></a><span class="lineno">15974</span>  <span class="comment">// the *reverse* order they were registered.</span></div><div class="line"><a name="l15975"></a><span class="lineno">15975</span>  <span class="comment">//</span></div><div class="line"><a name="l15976"></a><span class="lineno">15976</span>  <span class="comment">// The UnitTest object takes ownership of the given environment.</span></div><div class="line"><a name="l15977"></a><span class="lineno">15977</span>  <span class="comment">//</span></div><div class="line"><a name="l15978"></a><span class="lineno">15978</span>  <span class="comment">// This method can only be called from the main thread.</span></div><div class="line"><a name="l15979"></a><span class="lineno">15979</span>  <a class="code" href="classtesting_1_1_environment.html">Environment</a>* AddEnvironment(<a class="code" href="classtesting_1_1_environment.html">Environment</a>* env);</div><div class="line"><a name="l15980"></a><span class="lineno">15980</span> </div><div class="line"><a name="l15981"></a><span class="lineno">15981</span>  <span class="comment">// Adds a TestPartResult to the current TestResult object. All</span></div><div class="line"><a name="l15982"></a><span class="lineno">15982</span>  <span class="comment">// Google Test assertion macros (e.g. ASSERT_TRUE, EXPECT_EQ, etc)</span></div><div class="line"><a name="l15983"></a><span class="lineno">15983</span>  <span class="comment">// eventually call this to report their results. The user code</span></div><div class="line"><a name="l15984"></a><span class="lineno">15984</span>  <span class="comment">// should use the assertion macros instead of calling this directly.</span></div><div class="line"><a name="l15985"></a><span class="lineno">15985</span>  <span class="keywordtype">void</span> AddTestPartResult(TestPartResult::Type result_type,</div><div class="line"><a name="l15986"></a><span class="lineno">15986</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* file_name,</div><div class="line"><a name="l15987"></a><span class="lineno">15987</span>  <span class="keywordtype">int</span> line_number,</div><div class="line"><a name="l15988"></a><span class="lineno">15988</span>  <span class="keyword">const</span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a>& message,</div><div class="line"><a name="l15989"></a><span class="lineno">15989</span>  <span class="keyword">const</span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a>& os_stack_trace)</div><div class="line"><a name="l15990"></a><span class="lineno">15990</span>  <a class="code" href="gtest_8h.html#a69abff5a4efdd07bd5faebe3dd318d06">GTEST_LOCK_EXCLUDED_</a>(mutex_);</div><div class="line"><a name="l15991"></a><span class="lineno">15991</span> </div><div class="line"><a name="l15992"></a><span class="lineno">15992</span>  <span class="comment">// Adds a TestProperty to the current TestResult object when invoked from</span></div><div class="line"><a name="l15993"></a><span class="lineno">15993</span>  <span class="comment">// inside a test, to current TestSuite's ad_hoc_test_result_ when invoked</span></div><div class="line"><a name="l15994"></a><span class="lineno">15994</span>  <span class="comment">// from SetUpTestSuite or TearDownTestSuite, or to the global property set</span></div><div class="line"><a name="l15995"></a><span class="lineno">15995</span>  <span class="comment">// when invoked elsewhere. If the result already contains a property with</span></div><div class="line"><a name="l15996"></a><span class="lineno">15996</span>  <span class="comment">// the same key, the value will be updated.</span></div><div class="line"><a name="l15997"></a><span class="lineno">15997</span>  <span class="keywordtype">void</span> RecordProperty(<span class="keyword">const</span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a>& key, <span class="keyword">const</span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a>& value);</div><div class="line"><a name="l15998"></a><span class="lineno">15998</span> </div><div class="line"><a name="l15999"></a><span class="lineno">15999</span>  <span class="comment">// Gets the i-th test suite among all the test suites. i can range from 0 to</span></div><div class="line"><a name="l16000"></a><span class="lineno">16000</span>  <span class="comment">// total_test_suite_count() - 1. If i is not in that range, returns NULL.</span></div><div class="line"><a name="l16001"></a><span class="lineno">16001</span>  <a class="code" href="classtesting_1_1_test_suite.html">TestSuite</a>* GetMutableTestSuite(<span class="keywordtype">int</span> i);</div><div class="line"><a name="l16002"></a><span class="lineno">16002</span> </div><div class="line"><a name="l16003"></a><span class="lineno">16003</span>  <span class="comment">// Accessors for the implementation object.</span></div><div class="line"><a name="l16004"></a><span class="lineno">16004</span>  internal::UnitTestImpl* impl() { <span class="keywordflow">return</span> impl_; }</div><div class="line"><a name="l16005"></a><span class="lineno">16005</span>  <span class="keyword">const</span> internal::UnitTestImpl* impl()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> impl_; }</div><div class="line"><a name="l16006"></a><span class="lineno">16006</span> </div><div class="line"><a name="l16007"></a><span class="lineno">16007</span>  <span class="comment">// These classes and functions are friends as they need to access private</span></div><div class="line"><a name="l16008"></a><span class="lineno">16008</span>  <span class="comment">// members of UnitTest.</span></div><div class="line"><a name="l16009"></a><span class="lineno"><a class="line" href="classtesting_1_1_unit_test.html#ada54bdd5bdc24f39b9ca16807326654a">16009</a></span>  <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classtesting_1_1_scoped_trace.html">ScopedTrace</a>;</div><div class="line"><a name="l16010"></a><span class="lineno"><a class="line" href="classtesting_1_1_unit_test.html#a5b78b1c2e1fa07ffed92da365593eaa4">16010</a></span>  <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classtesting_1_1_test.html">Test</a>;</div><div class="line"><a name="l16011"></a><span class="lineno"><a class="line" href="classtesting_1_1_unit_test.html#a183151aa061362c87572e743fe233db1">16011</a></span>  <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classtesting_1_1internal_1_1_assert_helper.html">internal::AssertHelper</a>;</div><div class="line"><a name="l16012"></a><span class="lineno"><a class="line" href="classtesting_1_1_unit_test.html#adc037d188dab349a94868991955c9cd4">16012</a></span>  <span class="keyword">friend</span> <span class="keyword">class </span>internal::StreamingListenerTest;</div><div class="line"><a name="l16013"></a><span class="lineno"><a class="line" href="classtesting_1_1_unit_test.html#ae970f89a9f477a349fe5778be85ef42e">16013</a></span>  <span class="keyword">friend</span> <span class="keyword">class </span>internal::UnitTestRecordPropertyTestHelper;</div><div class="line"><a name="l16014"></a><span class="lineno">16014</span>  <span class="keyword">friend</span> <a class="code" href="classtesting_1_1_environment.html">Environment</a>* <a class="code" href="namespacetesting.html#a460d7b998622e332392c1e00be3a60d5">AddGlobalTestEnvironment</a>(<a class="code" href="classtesting_1_1_environment.html">Environment</a>* env);</div><div class="line"><a name="l16015"></a><span class="lineno">16015</span>  <span class="keyword">friend</span> internal::UnitTestImpl* internal::GetUnitTestImpl();</div><div class="line"><a name="l16016"></a><span class="lineno">16016</span>  <span class="keyword">friend</span> <span class="keywordtype">void</span> internal::ReportFailureInUnknownLocation(</div><div class="line"><a name="l16017"></a><span class="lineno">16017</span>  TestPartResult::Type result_type,</div><div class="line"><a name="l16018"></a><span class="lineno">16018</span>  <span class="keyword">const</span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a>& message);</div><div class="line"><a name="l16019"></a><span class="lineno">16019</span> </div><div class="line"><a name="l16020"></a><span class="lineno">16020</span>  <span class="comment">// Creates an empty UnitTest.</span></div><div class="line"><a name="l16021"></a><span class="lineno">16021</span>  <a class="code" href="classtesting_1_1_unit_test.html">UnitTest</a>();</div><div class="line"><a name="l16022"></a><span class="lineno">16022</span> </div><div class="line"><a name="l16023"></a><span class="lineno">16023</span>  <span class="comment">// D'tor</span></div><div class="line"><a name="l16024"></a><span class="lineno">16024</span>  <span class="keyword">virtual</span> ~<a class="code" href="classtesting_1_1_unit_test.html">UnitTest</a>();</div><div class="line"><a name="l16025"></a><span class="lineno">16025</span> </div><div class="line"><a name="l16026"></a><span class="lineno">16026</span>  <span class="comment">// Pushes a trace defined by SCOPED_TRACE() on to the per-thread</span></div><div class="line"><a name="l16027"></a><span class="lineno">16027</span>  <span class="comment">// Google Test trace stack.</span></div><div class="line"><a name="l16028"></a><span class="lineno">16028</span>  <span class="keywordtype">void</span> PushGTestTrace(<span class="keyword">const</span> internal::TraceInfo& trace)</div><div class="line"><a name="l16029"></a><span class="lineno">16029</span>  <a class="code" href="gtest_8h.html#a69abff5a4efdd07bd5faebe3dd318d06">GTEST_LOCK_EXCLUDED_</a>(mutex_);</div><div class="line"><a name="l16030"></a><span class="lineno">16030</span> </div><div class="line"><a name="l16031"></a><span class="lineno">16031</span>  <span class="comment">// Pops a trace from the per-thread Google Test trace stack.</span></div><div class="line"><a name="l16032"></a><span class="lineno">16032</span>  <span class="keywordtype">void</span> PopGTestTrace()</div><div class="line"><a name="l16033"></a><span class="lineno">16033</span>  <a class="code" href="gtest_8h.html#a69abff5a4efdd07bd5faebe3dd318d06">GTEST_LOCK_EXCLUDED_</a>(mutex_);</div><div class="line"><a name="l16034"></a><span class="lineno">16034</span> </div><div class="line"><a name="l16035"></a><span class="lineno">16035</span>  <span class="comment">// Protects mutable state in *impl_. This is mutable as some const</span></div><div class="line"><a name="l16036"></a><span class="lineno">16036</span>  <span class="comment">// methods need to lock it too.</span></div><div class="line"><a name="l16037"></a><span class="lineno">16037</span>  mutable internal::Mutex mutex_;</div><div class="line"><a name="l16038"></a><span class="lineno">16038</span> </div><div class="line"><a name="l16039"></a><span class="lineno">16039</span>  <span class="comment">// Opaque implementation object. This field is never changed once</span></div><div class="line"><a name="l16040"></a><span class="lineno">16040</span>  <span class="comment">// the object is constructed. We don't mark it as const here, as</span></div><div class="line"><a name="l16041"></a><span class="lineno">16041</span>  <span class="comment">// doing so will cause a warning in the constructor of UnitTest.</span></div><div class="line"><a name="l16042"></a><span class="lineno">16042</span>  <span class="comment">// Mutable state in *impl_ is protected by mutex_.</span></div><div class="line"><a name="l16043"></a><span class="lineno">16043</span>  internal::UnitTestImpl* impl_;</div><div class="line"><a name="l16044"></a><span class="lineno">16044</span> </div><div class="line"><a name="l16045"></a><span class="lineno">16045</span>  <span class="comment">// We disallow copying UnitTest.</span></div><div class="line"><a name="l16046"></a><span class="lineno">16046</span>  <a class="code" href="gtest_8h.html#aed8c1888c32b588b0681e88b95031e29">GTEST_DISALLOW_COPY_AND_ASSIGN_</a>(<a class="code" href="classtesting_1_1_unit_test.html">UnitTest</a>);</div><div class="line"><a name="l16047"></a><span class="lineno">16047</span> };</div><div class="line"><a name="l16048"></a><span class="lineno">16048</span> </div><div class="line"><a name="l16049"></a><span class="lineno">16049</span> <span class="comment">// A convenient wrapper for adding an environment for the test</span></div><div class="line"><a name="l16050"></a><span class="lineno">16050</span> <span class="comment">// program.</span></div><div class="line"><a name="l16051"></a><span class="lineno">16051</span> <span class="comment">//</span></div><div class="line"><a name="l16052"></a><span class="lineno">16052</span> <span class="comment">// You should call this before RUN_ALL_TESTS() is called, probably in</span></div><div class="line"><a name="l16053"></a><span class="lineno">16053</span> <span class="comment">// main(). If you use gtest_main, you need to call this before main()</span></div><div class="line"><a name="l16054"></a><span class="lineno">16054</span> <span class="comment">// starts for it to take effect. For example, you can define a global</span></div><div class="line"><a name="l16055"></a><span class="lineno">16055</span> <span class="comment">// variable like this:</span></div><div class="line"><a name="l16056"></a><span class="lineno">16056</span> <span class="comment">//</span></div><div class="line"><a name="l16057"></a><span class="lineno">16057</span> <span class="comment">// testing::Environment* const foo_env =</span></div><div class="line"><a name="l16058"></a><span class="lineno">16058</span> <span class="comment">// testing::AddGlobalTestEnvironment(new FooEnvironment);</span></div><div class="line"><a name="l16059"></a><span class="lineno">16059</span> <span class="comment">//</span></div><div class="line"><a name="l16060"></a><span class="lineno">16060</span> <span class="comment">// However, we strongly recommend you to write your own main() and</span></div><div class="line"><a name="l16061"></a><span class="lineno">16061</span> <span class="comment">// call AddGlobalTestEnvironment() there, as relying on initialization</span></div><div class="line"><a name="l16062"></a><span class="lineno">16062</span> <span class="comment">// of global variables makes the code harder to read and may cause</span></div><div class="line"><a name="l16063"></a><span class="lineno">16063</span> <span class="comment">// problems when you register multiple environments from different</span></div><div class="line"><a name="l16064"></a><span class="lineno">16064</span> <span class="comment">// translation units and the environments have dependencies among them</span></div><div class="line"><a name="l16065"></a><span class="lineno">16065</span> <span class="comment">// (remember that the compiler doesn't guarantee the order in which</span></div><div class="line"><a name="l16066"></a><span class="lineno">16066</span> <span class="comment">// global variables from different translation units are initialized).</span></div><div class="line"><a name="l16067"></a><span class="lineno"><a class="line" href="namespacetesting.html#a460d7b998622e332392c1e00be3a60d5">16067</a></span> inline <a class="code" href="classtesting_1_1_environment.html">Environment</a>* <a class="code" href="namespacetesting.html#a460d7b998622e332392c1e00be3a60d5">AddGlobalTestEnvironment</a>(<a class="code" href="classtesting_1_1_environment.html">Environment</a>* env) {</div><div class="line"><a name="l16068"></a><span class="lineno">16068</span>  <span class="keywordflow">return</span> <a class="code" href="classtesting_1_1_unit_test.html#af254e2e695471eb9f128bc556bae3668">UnitTest::GetInstance</a>()->AddEnvironment(env);</div><div class="line"><a name="l16069"></a><span class="lineno">16069</span> }</div><div class="line"><a name="l16070"></a><span class="lineno">16070</span> </div><div class="line"><a name="l16071"></a><span class="lineno">16071</span> <span class="comment">// Initializes Google Test. This must be called before calling</span></div><div class="line"><a name="l16072"></a><span class="lineno">16072</span> <span class="comment">// RUN_ALL_TESTS(). In particular, it parses a command line for the</span></div><div class="line"><a name="l16073"></a><span class="lineno">16073</span> <span class="comment">// flags that Google Test recognizes. Whenever a Google Test flag is</span></div><div class="line"><a name="l16074"></a><span class="lineno">16074</span> <span class="comment">// seen, it is removed from argv, and *argc is decremented.</span></div><div class="line"><a name="l16075"></a><span class="lineno">16075</span> <span class="comment">//</span></div><div class="line"><a name="l16076"></a><span class="lineno">16076</span> <span class="comment">// No value is returned. Instead, the Google Test flag variables are</span></div><div class="line"><a name="l16077"></a><span class="lineno">16077</span> <span class="comment">// updated.</span></div><div class="line"><a name="l16078"></a><span class="lineno">16078</span> <span class="comment">//</span></div><div class="line"><a name="l16079"></a><span class="lineno">16079</span> <span class="comment">// Calling the function for the second time has no user-visible effect.</span></div><div class="line"><a name="l16080"></a><span class="lineno">16080</span> <a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> <span class="keywordtype">void</span> <a class="code" href="namespacetesting.html#aee3f6f99df893f576f705f66c0559482">InitGoogleTest</a>(<span class="keywordtype">int</span>* argc, <span class="keywordtype">char</span>** argv);</div><div class="line"><a name="l16081"></a><span class="lineno">16081</span> </div><div class="line"><a name="l16082"></a><span class="lineno">16082</span> <span class="comment">// This overloaded version can be used in Windows programs compiled in</span></div><div class="line"><a name="l16083"></a><span class="lineno">16083</span> <span class="comment">// UNICODE mode.</span></div><div class="line"><a name="l16084"></a><span class="lineno">16084</span> <a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> <span class="keywordtype">void</span> <a class="code" href="namespacetesting.html#aee3f6f99df893f576f705f66c0559482">InitGoogleTest</a>(<span class="keywordtype">int</span>* argc, <span class="keywordtype">wchar_t</span>** argv);</div><div class="line"><a name="l16085"></a><span class="lineno">16085</span> </div><div class="line"><a name="l16086"></a><span class="lineno">16086</span> <span class="keyword">namespace </span>internal {</div><div class="line"><a name="l16087"></a><span class="lineno">16087</span> </div><div class="line"><a name="l16088"></a><span class="lineno">16088</span> <span class="comment">// Separate the error generating code from the code path to reduce the stack</span></div><div class="line"><a name="l16089"></a><span class="lineno">16089</span> <span class="comment">// frame size of CmpHelperEQ. This helps reduce the overhead of some sanitizers</span></div><div class="line"><a name="l16090"></a><span class="lineno">16090</span> <span class="comment">// when calling EXPECT_* in a tight loop.</span></div><div class="line"><a name="l16091"></a><span class="lineno">16091</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2></div><div class="line"><a name="l16092"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#a1def8ec9393360a1b34a20528703e7f7">16092</a></span> AssertionResult <a class="code" href="namespacetesting_1_1internal.html#a1def8ec9393360a1b34a20528703e7f7">CmpHelperEQFailure</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* lhs_expression,</div><div class="line"><a name="l16093"></a><span class="lineno">16093</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* rhs_expression,</div><div class="line"><a name="l16094"></a><span class="lineno">16094</span>  <span class="keyword">const</span> T1& lhs, <span class="keyword">const</span> T2& rhs) {</div><div class="line"><a name="l16095"></a><span class="lineno">16095</span>  <span class="keywordflow">return</span> <a class="code" href="namespacetesting_1_1internal.html#ac61e2ba2cbf259fd6ee5ffd4e49c9445">EqFailure</a>(lhs_expression,</div><div class="line"><a name="l16096"></a><span class="lineno">16096</span>  rhs_expression,</div><div class="line"><a name="l16097"></a><span class="lineno">16097</span>  <a class="code" href="namespacetesting_1_1internal.html#a91ab078f10adc669f09b7f604975c518">FormatForComparisonFailureMessage</a>(lhs, rhs),</div><div class="line"><a name="l16098"></a><span class="lineno">16098</span>  <a class="code" href="namespacetesting_1_1internal.html#a91ab078f10adc669f09b7f604975c518">FormatForComparisonFailureMessage</a>(rhs, lhs),</div><div class="line"><a name="l16099"></a><span class="lineno">16099</span>  <span class="keyword">false</span>);</div><div class="line"><a name="l16100"></a><span class="lineno">16100</span> }</div><div class="line"><a name="l16101"></a><span class="lineno">16101</span> </div><div class="line"><a name="l16102"></a><span class="lineno">16102</span> <span class="comment">// This block of code defines operator==/!=</span></div><div class="line"><a name="l16103"></a><span class="lineno">16103</span> <span class="comment">// to block lexical scope lookup.</span></div><div class="line"><a name="l16104"></a><span class="lineno">16104</span> <span class="comment">// It prevents using invalid operator==/!= defined at namespace scope.</span></div><div class="line"><a name="l16105"></a><span class="lineno"><a class="line" href="structtesting_1_1internal_1_1faketype.html">16105</a></span> <span class="keyword">struct </span><a class="code" href="structtesting_1_1internal_1_1faketype.html">faketype</a> {};</div><div class="line"><a name="l16106"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#a5e3e473798de3189e9343132bcfd4fea">16106</a></span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="namespacetesting_1_1internal.html#a5e3e473798de3189e9343132bcfd4fea">operator==</a>(<a class="code" href="structtesting_1_1internal_1_1faketype.html">faketype</a>, <a class="code" href="structtesting_1_1internal_1_1faketype.html">faketype</a>) { <span class="keywordflow">return</span> <span class="keyword">true</span>; }</div><div class="line"><a name="l16107"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#afa44fdec84edfc155ef63e4f0d4287cc">16107</a></span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="namespacetesting_1_1internal.html#afa44fdec84edfc155ef63e4f0d4287cc">operator!=</a>(<a class="code" href="structtesting_1_1internal_1_1faketype.html">faketype</a>, <a class="code" href="structtesting_1_1internal_1_1faketype.html">faketype</a>) { <span class="keywordflow">return</span> <span class="keyword">false</span>; }</div><div class="line"><a name="l16108"></a><span class="lineno">16108</span> </div><div class="line"><a name="l16109"></a><span class="lineno">16109</span> <span class="comment">// The helper function for {ASSERT|EXPECT}_EQ.</span></div><div class="line"><a name="l16110"></a><span class="lineno">16110</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2></div><div class="line"><a name="l16111"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#a4638c74d9b32e971f9b321af6fafc2f1">16111</a></span> AssertionResult <a class="code" href="namespacetesting_1_1internal.html#a1edf90480571c0659a39d13e3777d9ce">CmpHelperEQ</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* lhs_expression,</div><div class="line"><a name="l16112"></a><span class="lineno">16112</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* rhs_expression,</div><div class="line"><a name="l16113"></a><span class="lineno">16113</span>  <span class="keyword">const</span> T1& lhs,</div><div class="line"><a name="l16114"></a><span class="lineno">16114</span>  <span class="keyword">const</span> T2& rhs) {</div><div class="line"><a name="l16115"></a><span class="lineno">16115</span>  <span class="keywordflow">if</span> (lhs == rhs) {</div><div class="line"><a name="l16116"></a><span class="lineno">16116</span>  <span class="keywordflow">return</span> AssertionSuccess();</div><div class="line"><a name="l16117"></a><span class="lineno">16117</span>  }</div><div class="line"><a name="l16118"></a><span class="lineno">16118</span> </div><div class="line"><a name="l16119"></a><span class="lineno">16119</span>  <span class="keywordflow">return</span> <a class="code" href="namespacetesting_1_1internal.html#a1def8ec9393360a1b34a20528703e7f7">CmpHelperEQFailure</a>(lhs_expression, rhs_expression, lhs, rhs);</div><div class="line"><a name="l16120"></a><span class="lineno">16120</span> }</div><div class="line"><a name="l16121"></a><span class="lineno">16121</span> </div><div class="line"><a name="l16122"></a><span class="lineno">16122</span> <span class="comment">// With this overloaded version, we allow anonymous enums to be used</span></div><div class="line"><a name="l16123"></a><span class="lineno">16123</span> <span class="comment">// in {ASSERT|EXPECT}_EQ when compiled with gcc 4, as anonymous enums</span></div><div class="line"><a name="l16124"></a><span class="lineno">16124</span> <span class="comment">// can be implicitly cast to BiggestInt.</span></div><div class="line"><a name="l16125"></a><span class="lineno">16125</span> <a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> AssertionResult <a class="code" href="namespacetesting_1_1internal.html#a1edf90480571c0659a39d13e3777d9ce">CmpHelperEQ</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* lhs_expression,</div><div class="line"><a name="l16126"></a><span class="lineno">16126</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* rhs_expression,</div><div class="line"><a name="l16127"></a><span class="lineno">16127</span>  <a class="code" href="namespacetesting_1_1internal.html#a05c6bd9ede5ccdf25191a590d610dcc6">BiggestInt</a> lhs,</div><div class="line"><a name="l16128"></a><span class="lineno">16128</span>  <a class="code" href="namespacetesting_1_1internal.html#a05c6bd9ede5ccdf25191a590d610dcc6">BiggestInt</a> rhs);</div><div class="line"><a name="l16129"></a><span class="lineno">16129</span> </div><div class="line"><a name="l16130"></a><span class="lineno">16130</span> <span class="comment">// The helper class for {ASSERT|EXPECT}_EQ. The template argument</span></div><div class="line"><a name="l16131"></a><span class="lineno">16131</span> <span class="comment">// lhs_is_null_literal is true iff the first argument to ASSERT_EQ()</span></div><div class="line"><a name="l16132"></a><span class="lineno">16132</span> <span class="comment">// is a null pointer literal. The following default implementation is</span></div><div class="line"><a name="l16133"></a><span class="lineno">16133</span> <span class="comment">// for lhs_is_null_literal being false.</span></div><div class="line"><a name="l16134"></a><span class="lineno">16134</span> <span class="keyword">template</span> <<span class="keywordtype">bool</span> lhs_is_null_literal></div><div class="line"><a name="l16135"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_eq_helper.html">16135</a></span> <span class="keyword">class </span><a class="code" href="classtesting_1_1internal_1_1_eq_helper.html">EqHelper</a> {</div><div class="line"><a name="l16136"></a><span class="lineno">16136</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l16137"></a><span class="lineno">16137</span>  <span class="comment">// This templatized version is for the general case.</span></div><div class="line"><a name="l16138"></a><span class="lineno">16138</span>  <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2></div><div class="line"><a name="l16139"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_eq_helper.html#ae3572c7374534a916b9117efaa89f33f">16139</a></span>  <span class="keyword">static</span> AssertionResult <a class="code" href="classtesting_1_1internal_1_1_eq_helper.html#ae3572c7374534a916b9117efaa89f33f">Compare</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* lhs_expression,</div><div class="line"><a name="l16140"></a><span class="lineno">16140</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* rhs_expression,</div><div class="line"><a name="l16141"></a><span class="lineno">16141</span>  <span class="keyword">const</span> T1& lhs,</div><div class="line"><a name="l16142"></a><span class="lineno">16142</span>  <span class="keyword">const</span> T2& rhs) {</div><div class="line"><a name="l16143"></a><span class="lineno">16143</span>  <span class="keywordflow">return</span> <a class="code" href="namespacetesting_1_1internal.html#a1edf90480571c0659a39d13e3777d9ce">CmpHelperEQ</a>(lhs_expression, rhs_expression, lhs, rhs);</div><div class="line"><a name="l16144"></a><span class="lineno">16144</span>  }</div><div class="line"><a name="l16145"></a><span class="lineno">16145</span> </div><div class="line"><a name="l16146"></a><span class="lineno">16146</span>  <span class="comment">// With this overloaded version, we allow anonymous enums to be used</span></div><div class="line"><a name="l16147"></a><span class="lineno">16147</span>  <span class="comment">// in {ASSERT|EXPECT}_EQ when compiled with gcc 4, as anonymous</span></div><div class="line"><a name="l16148"></a><span class="lineno">16148</span>  <span class="comment">// enums can be implicitly cast to BiggestInt.</span></div><div class="line"><a name="l16149"></a><span class="lineno">16149</span>  <span class="comment">//</span></div><div class="line"><a name="l16150"></a><span class="lineno">16150</span>  <span class="comment">// Even though its body looks the same as the above version, we</span></div><div class="line"><a name="l16151"></a><span class="lineno">16151</span>  <span class="comment">// cannot merge the two, as it will make anonymous enums unhappy.</span></div><div class="line"><a name="l16152"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_eq_helper.html#aaa42c0059bb3dcc43d556243febb5f1c">16152</a></span>  <span class="keyword">static</span> AssertionResult <a class="code" href="classtesting_1_1internal_1_1_eq_helper.html#aaa42c0059bb3dcc43d556243febb5f1c">Compare</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* lhs_expression,</div><div class="line"><a name="l16153"></a><span class="lineno">16153</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* rhs_expression,</div><div class="line"><a name="l16154"></a><span class="lineno">16154</span>  <a class="code" href="namespacetesting_1_1internal.html#a05c6bd9ede5ccdf25191a590d610dcc6">BiggestInt</a> lhs,</div><div class="line"><a name="l16155"></a><span class="lineno">16155</span>  <a class="code" href="namespacetesting_1_1internal.html#a05c6bd9ede5ccdf25191a590d610dcc6">BiggestInt</a> rhs) {</div><div class="line"><a name="l16156"></a><span class="lineno">16156</span>  <span class="keywordflow">return</span> <a class="code" href="namespacetesting_1_1internal.html#a1edf90480571c0659a39d13e3777d9ce">CmpHelperEQ</a>(lhs_expression, rhs_expression, lhs, rhs);</div><div class="line"><a name="l16157"></a><span class="lineno">16157</span>  }</div><div class="line"><a name="l16158"></a><span class="lineno">16158</span> };</div><div class="line"><a name="l16159"></a><span class="lineno">16159</span> </div><div class="line"><a name="l16160"></a><span class="lineno">16160</span> <span class="comment">// This specialization is used when the first argument to ASSERT_EQ()</span></div><div class="line"><a name="l16161"></a><span class="lineno">16161</span> <span class="comment">// is a null pointer literal, like NULL, false, or 0.</span></div><div class="line"><a name="l16162"></a><span class="lineno">16162</span> <span class="keyword">template</span> <></div><div class="line"><a name="l16163"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_eq_helper_3_01true_01_4.html">16163</a></span> <span class="keyword">class </span><a class="code" href="classtesting_1_1internal_1_1_eq_helper.html">EqHelper</a><true> {</div><div class="line"><a name="l16164"></a><span class="lineno">16164</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l16165"></a><span class="lineno">16165</span>  <span class="comment">// We define two overloaded versions of Compare(). The first</span></div><div class="line"><a name="l16166"></a><span class="lineno">16166</span>  <span class="comment">// version will be picked when the second argument to ASSERT_EQ() is</span></div><div class="line"><a name="l16167"></a><span class="lineno">16167</span>  <span class="comment">// NOT a pointer, e.g. ASSERT_EQ(0, AnIntFunction()) or</span></div><div class="line"><a name="l16168"></a><span class="lineno">16168</span>  <span class="comment">// EXPECT_EQ(false, a_bool).</span></div><div class="line"><a name="l16169"></a><span class="lineno">16169</span>  <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2></div><div class="line"><a name="l16170"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_eq_helper_3_01true_01_4.html#a332e92bcca7a71c273e50d800f943fcf">16170</a></span>  <span class="keyword">static</span> AssertionResult <a class="code" href="classtesting_1_1internal_1_1_eq_helper_3_01true_01_4.html#a332e92bcca7a71c273e50d800f943fcf">Compare</a>(</div><div class="line"><a name="l16171"></a><span class="lineno">16171</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* lhs_expression, <span class="keyword">const</span> <span class="keywordtype">char</span>* rhs_expression, <span class="keyword">const</span> T1& lhs,</div><div class="line"><a name="l16172"></a><span class="lineno">16172</span>  <span class="keyword">const</span> T2& rhs,</div><div class="line"><a name="l16173"></a><span class="lineno">16173</span>  <span class="comment">// The following line prevents this overload from being considered if T2</span></div><div class="line"><a name="l16174"></a><span class="lineno">16174</span>  <span class="comment">// is not a pointer type. We need this because ASSERT_EQ(NULL, my_ptr)</span></div><div class="line"><a name="l16175"></a><span class="lineno">16175</span>  <span class="comment">// expands to Compare("", "", NULL, my_ptr), which requires a conversion</span></div><div class="line"><a name="l16176"></a><span class="lineno">16176</span>  <span class="comment">// to match the Secret* in the other overload, which would otherwise make</span></div><div class="line"><a name="l16177"></a><span class="lineno">16177</span>  <span class="comment">// this template match better.</span></div><div class="line"><a name="l16178"></a><span class="lineno">16178</span>  <span class="keyword">typename</span> <a class="code" href="structtesting_1_1internal_1_1_enable_if.html">EnableIf</a><!std::is_pointer<T2>::value>::type* = <span class="keyword">nullptr</span>) {</div><div class="line"><a name="l16179"></a><span class="lineno">16179</span>  <span class="keywordflow">return</span> <a class="code" href="namespacetesting_1_1internal.html#a1edf90480571c0659a39d13e3777d9ce">CmpHelperEQ</a>(lhs_expression, rhs_expression, lhs, rhs);</div><div class="line"><a name="l16180"></a><span class="lineno">16180</span>  }</div><div class="line"><a name="l16181"></a><span class="lineno">16181</span> </div><div class="line"><a name="l16182"></a><span class="lineno">16182</span>  <span class="comment">// This version will be picked when the second argument to ASSERT_EQ() is a</span></div><div class="line"><a name="l16183"></a><span class="lineno">16183</span>  <span class="comment">// pointer, e.g. ASSERT_EQ(NULL, a_pointer).</span></div><div class="line"><a name="l16184"></a><span class="lineno">16184</span>  <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l16185"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_eq_helper_3_01true_01_4.html#a6f292601a68c8f0d49e6d48bd309b900">16185</a></span>  <span class="keyword">static</span> AssertionResult <a class="code" href="classtesting_1_1internal_1_1_eq_helper_3_01true_01_4.html#a6f292601a68c8f0d49e6d48bd309b900">Compare</a>(</div><div class="line"><a name="l16186"></a><span class="lineno">16186</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* lhs_expression,</div><div class="line"><a name="l16187"></a><span class="lineno">16187</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* rhs_expression,</div><div class="line"><a name="l16188"></a><span class="lineno">16188</span>  <span class="comment">// We used to have a second template parameter instead of Secret*. That</span></div><div class="line"><a name="l16189"></a><span class="lineno">16189</span>  <span class="comment">// template parameter would deduce to 'long', making this a better match</span></div><div class="line"><a name="l16190"></a><span class="lineno">16190</span>  <span class="comment">// than the first overload even without the first overload's EnableIf.</span></div><div class="line"><a name="l16191"></a><span class="lineno">16191</span>  <span class="comment">// Unfortunately, gcc with -Wconversion-null warns when "passing NULL to</span></div><div class="line"><a name="l16192"></a><span class="lineno">16192</span>  <span class="comment">// non-pointer argument" (even a deduced integral argument), so the old</span></div><div class="line"><a name="l16193"></a><span class="lineno">16193</span>  <span class="comment">// implementation caused warnings in user code.</span></div><div class="line"><a name="l16194"></a><span class="lineno">16194</span>  Secret* <span class="comment">/* lhs (NULL) */</span>,</div><div class="line"><a name="l16195"></a><span class="lineno">16195</span>  T* rhs) {</div><div class="line"><a name="l16196"></a><span class="lineno">16196</span>  <span class="comment">// We already know that 'lhs' is a null pointer.</span></div><div class="line"><a name="l16197"></a><span class="lineno">16197</span>  <span class="keywordflow">return</span> <a class="code" href="namespacetesting_1_1internal.html#a1edf90480571c0659a39d13e3777d9ce">CmpHelperEQ</a>(lhs_expression, rhs_expression, static_cast<T*>(<span class="keyword">nullptr</span>),</div><div class="line"><a name="l16198"></a><span class="lineno">16198</span>  rhs);</div><div class="line"><a name="l16199"></a><span class="lineno">16199</span>  }</div><div class="line"><a name="l16200"></a><span class="lineno">16200</span> };</div><div class="line"><a name="l16201"></a><span class="lineno">16201</span> </div><div class="line"><a name="l16202"></a><span class="lineno">16202</span> <span class="comment">// Separate the error generating code from the code path to reduce the stack</span></div><div class="line"><a name="l16203"></a><span class="lineno">16203</span> <span class="comment">// frame size of CmpHelperOP. This helps reduce the overhead of some sanitizers</span></div><div class="line"><a name="l16204"></a><span class="lineno">16204</span> <span class="comment">// when calling EXPECT_OP in a tight loop.</span></div><div class="line"><a name="l16205"></a><span class="lineno">16205</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2></div><div class="line"><a name="l16206"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#a894ffccd936d78fd555f490020c27f0a">16206</a></span> AssertionResult <a class="code" href="namespacetesting_1_1internal.html#a894ffccd936d78fd555f490020c27f0a">CmpHelperOpFailure</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* expr1, <span class="keyword">const</span> <span class="keywordtype">char</span>* expr2,</div><div class="line"><a name="l16207"></a><span class="lineno">16207</span>  <span class="keyword">const</span> T1& val1, <span class="keyword">const</span> T2& val2,</div><div class="line"><a name="l16208"></a><span class="lineno">16208</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* op) {</div><div class="line"><a name="l16209"></a><span class="lineno">16209</span>  <span class="keywordflow">return</span> AssertionFailure()</div><div class="line"><a name="l16210"></a><span class="lineno">16210</span>  << <span class="stringliteral">"Expected: ("</span> << expr1 << <span class="stringliteral">") "</span> << op << <span class="stringliteral">" ("</span> << expr2</div><div class="line"><a name="l16211"></a><span class="lineno">16211</span>  << <span class="stringliteral">"), actual: "</span> << <a class="code" href="namespacetesting_1_1internal.html#a91ab078f10adc669f09b7f604975c518">FormatForComparisonFailureMessage</a>(val1, val2)</div><div class="line"><a name="l16212"></a><span class="lineno">16212</span>  << <span class="stringliteral">" vs "</span> << <a class="code" href="namespacetesting_1_1internal.html#a91ab078f10adc669f09b7f604975c518">FormatForComparisonFailureMessage</a>(val2, val1);</div><div class="line"><a name="l16213"></a><span class="lineno">16213</span> }</div><div class="line"><a name="l16214"></a><span class="lineno">16214</span> </div><div class="line"><a name="l16215"></a><span class="lineno">16215</span> <span class="comment">// A macro for implementing the helper functions needed to implement</span></div><div class="line"><a name="l16216"></a><span class="lineno">16216</span> <span class="comment">// ASSERT_?? and EXPECT_??. It is here just to avoid copy-and-paste</span></div><div class="line"><a name="l16217"></a><span class="lineno">16217</span> <span class="comment">// of similar code.</span></div><div class="line"><a name="l16218"></a><span class="lineno">16218</span> <span class="comment">//</span></div><div class="line"><a name="l16219"></a><span class="lineno">16219</span> <span class="comment">// For each templatized helper function, we also define an overloaded</span></div><div class="line"><a name="l16220"></a><span class="lineno">16220</span> <span class="comment">// version for BiggestInt in order to reduce code bloat and allow</span></div><div class="line"><a name="l16221"></a><span class="lineno">16221</span> <span class="comment">// anonymous enums to be used with {ASSERT|EXPECT}_?? when compiled</span></div><div class="line"><a name="l16222"></a><span class="lineno">16222</span> <span class="comment">// with gcc 4.</span></div><div class="line"><a name="l16223"></a><span class="lineno">16223</span> <span class="comment">//</span></div><div class="line"><a name="l16224"></a><span class="lineno">16224</span> <span class="comment">// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.</span></div><div class="line"><a name="l16225"></a><span class="lineno">16225</span> </div><div class="line"><a name="l16226"></a><span class="lineno"><a class="line" href="gtest_8h.html#a4a5b6fbde5dd05e05dd6846ac5e5c18e">16226</a></span> <span class="preprocessor">#define GTEST_IMPL_CMP_HELPER_(op_name, op)\</span></div><div class="line"><a name="l16227"></a><span class="lineno">16227</span> <span class="preprocessor">template <typename T1, typename T2>\</span></div><div class="line"><a name="l16228"></a><span class="lineno">16228</span> <span class="preprocessor">AssertionResult CmpHelper##op_name(const char* expr1, const char* expr2, \</span></div><div class="line"><a name="l16229"></a><span class="lineno">16229</span> <span class="preprocessor"> const T1& val1, const T2& val2) {\</span></div><div class="line"><a name="l16230"></a><span class="lineno">16230</span> <span class="preprocessor"> if (val1 op val2) {\</span></div><div class="line"><a name="l16231"></a><span class="lineno">16231</span> <span class="preprocessor"> return AssertionSuccess();\</span></div><div class="line"><a name="l16232"></a><span class="lineno">16232</span> <span class="preprocessor"> } else {\</span></div><div class="line"><a name="l16233"></a><span class="lineno">16233</span> <span class="preprocessor"> return CmpHelperOpFailure(expr1, expr2, val1, val2, #op);\</span></div><div class="line"><a name="l16234"></a><span class="lineno">16234</span> <span class="preprocessor"> }\</span></div><div class="line"><a name="l16235"></a><span class="lineno">16235</span> <span class="preprocessor">}\</span></div><div class="line"><a name="l16236"></a><span class="lineno">16236</span> <span class="preprocessor">GTEST_API_ AssertionResult CmpHelper##op_name(\</span></div><div class="line"><a name="l16237"></a><span class="lineno">16237</span> <span class="preprocessor"> const char* expr1, const char* expr2, BiggestInt val1, BiggestInt val2)</span></div><div class="line"><a name="l16238"></a><span class="lineno">16238</span> </div><div class="line"><a name="l16239"></a><span class="lineno">16239</span> <span class="comment">// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.</span></div><div class="line"><a name="l16240"></a><span class="lineno">16240</span> </div><div class="line"><a name="l16241"></a><span class="lineno">16241</span> <span class="comment">// Implements the helper function for {ASSERT|EXPECT}_NE</span></div><div class="line"><a name="l16242"></a><span class="lineno">16242</span> <a class="code" href="gtest_8h.html#a4a5b6fbde5dd05e05dd6846ac5e5c18e">GTEST_IMPL_CMP_HELPER_</a>(NE, !=);</div><div class="line"><a name="l16243"></a><span class="lineno">16243</span> <span class="comment">// Implements the helper function for {ASSERT|EXPECT}_LE</span></div><div class="line"><a name="l16244"></a><span class="lineno">16244</span> <a class="code" href="gtest_8h.html#a4a5b6fbde5dd05e05dd6846ac5e5c18e">GTEST_IMPL_CMP_HELPER_</a>(LE, <=);</div><div class="line"><a name="l16245"></a><span class="lineno">16245</span> <span class="comment">// Implements the helper function for {ASSERT|EXPECT}_LT</span></div><div class="line"><a name="l16246"></a><span class="lineno">16246</span> <a class="code" href="gtest_8h.html#a4a5b6fbde5dd05e05dd6846ac5e5c18e">GTEST_IMPL_CMP_HELPER_</a>(LT, <);</div><div class="line"><a name="l16247"></a><span class="lineno">16247</span> <span class="comment">// Implements the helper function for {ASSERT|EXPECT}_GE</span></div><div class="line"><a name="l16248"></a><span class="lineno">16248</span> <a class="code" href="gtest_8h.html#a4a5b6fbde5dd05e05dd6846ac5e5c18e">GTEST_IMPL_CMP_HELPER_</a>(GE, >=);</div><div class="line"><a name="l16249"></a><span class="lineno">16249</span> <span class="comment">// Implements the helper function for {ASSERT|EXPECT}_GT</span></div><div class="line"><a name="l16250"></a><span class="lineno">16250</span> <a class="code" href="gtest_8h.html#a4a5b6fbde5dd05e05dd6846ac5e5c18e">GTEST_IMPL_CMP_HELPER_</a>(GT, >);</div><div class="line"><a name="l16251"></a><span class="lineno">16251</span> </div><div class="line"><a name="l16252"></a><span class="lineno">16252</span> <span class="preprocessor">#undef GTEST_IMPL_CMP_HELPER_</span></div><div class="line"><a name="l16253"></a><span class="lineno">16253</span> </div><div class="line"><a name="l16254"></a><span class="lineno">16254</span> <span class="comment">// The helper function for {ASSERT|EXPECT}_STREQ.</span></div><div class="line"><a name="l16255"></a><span class="lineno">16255</span> <span class="comment">//</span></div><div class="line"><a name="l16256"></a><span class="lineno">16256</span> <span class="comment">// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.</span></div><div class="line"><a name="l16257"></a><span class="lineno">16257</span> <a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> AssertionResult <a class="code" href="namespacetesting_1_1internal.html#ad40d557f9c157790160d6e4f2b0d9bab">CmpHelperSTREQ</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* s1_expression,</div><div class="line"><a name="l16258"></a><span class="lineno">16258</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* s2_expression,</div><div class="line"><a name="l16259"></a><span class="lineno">16259</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* s1,</div><div class="line"><a name="l16260"></a><span class="lineno">16260</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* s2);</div><div class="line"><a name="l16261"></a><span class="lineno">16261</span> </div><div class="line"><a name="l16262"></a><span class="lineno">16262</span> <span class="comment">// The helper function for {ASSERT|EXPECT}_STRCASEEQ.</span></div><div class="line"><a name="l16263"></a><span class="lineno">16263</span> <span class="comment">//</span></div><div class="line"><a name="l16264"></a><span class="lineno">16264</span> <span class="comment">// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.</span></div><div class="line"><a name="l16265"></a><span class="lineno">16265</span> <a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> AssertionResult <a class="code" href="namespacetesting_1_1internal.html#a00c3d012df6173622ef558a131bfb95d">CmpHelperSTRCASEEQ</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* s1_expression,</div><div class="line"><a name="l16266"></a><span class="lineno">16266</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* s2_expression,</div><div class="line"><a name="l16267"></a><span class="lineno">16267</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* s1,</div><div class="line"><a name="l16268"></a><span class="lineno">16268</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* s2);</div><div class="line"><a name="l16269"></a><span class="lineno">16269</span> </div><div class="line"><a name="l16270"></a><span class="lineno">16270</span> <span class="comment">// The helper function for {ASSERT|EXPECT}_STRNE.</span></div><div class="line"><a name="l16271"></a><span class="lineno">16271</span> <span class="comment">//</span></div><div class="line"><a name="l16272"></a><span class="lineno">16272</span> <span class="comment">// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.</span></div><div class="line"><a name="l16273"></a><span class="lineno">16273</span> <a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> AssertionResult <a class="code" href="namespacetesting_1_1internal.html#a6e700804399b6694d8d6157e3a141b17">CmpHelperSTRNE</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* s1_expression,</div><div class="line"><a name="l16274"></a><span class="lineno">16274</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* s2_expression,</div><div class="line"><a name="l16275"></a><span class="lineno">16275</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* s1,</div><div class="line"><a name="l16276"></a><span class="lineno">16276</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* s2);</div><div class="line"><a name="l16277"></a><span class="lineno">16277</span> </div><div class="line"><a name="l16278"></a><span class="lineno">16278</span> <span class="comment">// The helper function for {ASSERT|EXPECT}_STRCASENE.</span></div><div class="line"><a name="l16279"></a><span class="lineno">16279</span> <span class="comment">//</span></div><div class="line"><a name="l16280"></a><span class="lineno">16280</span> <span class="comment">// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.</span></div><div class="line"><a name="l16281"></a><span class="lineno">16281</span> <a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> AssertionResult <a class="code" href="namespacetesting_1_1internal.html#a5f74b933606b0a742cd5a8ad2d7087e0">CmpHelperSTRCASENE</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* s1_expression,</div><div class="line"><a name="l16282"></a><span class="lineno">16282</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* s2_expression,</div><div class="line"><a name="l16283"></a><span class="lineno">16283</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* s1,</div><div class="line"><a name="l16284"></a><span class="lineno">16284</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* s2);</div><div class="line"><a name="l16285"></a><span class="lineno">16285</span> </div><div class="line"><a name="l16286"></a><span class="lineno">16286</span> </div><div class="line"><a name="l16287"></a><span class="lineno">16287</span> <span class="comment">// Helper function for *_STREQ on wide strings.</span></div><div class="line"><a name="l16288"></a><span class="lineno">16288</span> <span class="comment">//</span></div><div class="line"><a name="l16289"></a><span class="lineno">16289</span> <span class="comment">// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.</span></div><div class="line"><a name="l16290"></a><span class="lineno">16290</span> <a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> AssertionResult <a class="code" href="namespacetesting_1_1internal.html#ad40d557f9c157790160d6e4f2b0d9bab">CmpHelperSTREQ</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* s1_expression,</div><div class="line"><a name="l16291"></a><span class="lineno">16291</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* s2_expression,</div><div class="line"><a name="l16292"></a><span class="lineno">16292</span>  <span class="keyword">const</span> <span class="keywordtype">wchar_t</span>* s1,</div><div class="line"><a name="l16293"></a><span class="lineno">16293</span>  <span class="keyword">const</span> <span class="keywordtype">wchar_t</span>* s2);</div><div class="line"><a name="l16294"></a><span class="lineno">16294</span> </div><div class="line"><a name="l16295"></a><span class="lineno">16295</span> <span class="comment">// Helper function for *_STRNE on wide strings.</span></div><div class="line"><a name="l16296"></a><span class="lineno">16296</span> <span class="comment">//</span></div><div class="line"><a name="l16297"></a><span class="lineno">16297</span> <span class="comment">// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.</span></div><div class="line"><a name="l16298"></a><span class="lineno">16298</span> <a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> AssertionResult <a class="code" href="namespacetesting_1_1internal.html#a6e700804399b6694d8d6157e3a141b17">CmpHelperSTRNE</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* s1_expression,</div><div class="line"><a name="l16299"></a><span class="lineno">16299</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* s2_expression,</div><div class="line"><a name="l16300"></a><span class="lineno">16300</span>  <span class="keyword">const</span> <span class="keywordtype">wchar_t</span>* s1,</div><div class="line"><a name="l16301"></a><span class="lineno">16301</span>  <span class="keyword">const</span> <span class="keywordtype">wchar_t</span>* s2);</div><div class="line"><a name="l16302"></a><span class="lineno">16302</span> </div><div class="line"><a name="l16303"></a><span class="lineno">16303</span> } <span class="comment">// namespace internal</span></div><div class="line"><a name="l16304"></a><span class="lineno">16304</span> </div><div class="line"><a name="l16305"></a><span class="lineno">16305</span> <span class="comment">// IsSubstring() and IsNotSubstring() are intended to be used as the</span></div><div class="line"><a name="l16306"></a><span class="lineno">16306</span> <span class="comment">// first argument to {EXPECT,ASSERT}_PRED_FORMAT2(), not by</span></div><div class="line"><a name="l16307"></a><span class="lineno">16307</span> <span class="comment">// themselves. They check whether needle is a substring of haystack</span></div><div class="line"><a name="l16308"></a><span class="lineno">16308</span> <span class="comment">// (NULL is considered a substring of itself only), and return an</span></div><div class="line"><a name="l16309"></a><span class="lineno">16309</span> <span class="comment">// appropriate error message when they fail.</span></div><div class="line"><a name="l16310"></a><span class="lineno">16310</span> <span class="comment">//</span></div><div class="line"><a name="l16311"></a><span class="lineno">16311</span> <span class="comment">// The {needle,haystack}_expr arguments are the stringified</span></div><div class="line"><a name="l16312"></a><span class="lineno">16312</span> <span class="comment">// expressions that generated the two real arguments.</span></div><div class="line"><a name="l16313"></a><span class="lineno">16313</span> <a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> AssertionResult <a class="code" href="namespacetesting.html#a5c90a86562b2470213c07742e0eeb0fe">IsSubstring</a>(</div><div class="line"><a name="l16314"></a><span class="lineno">16314</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* needle_expr, <span class="keyword">const</span> <span class="keywordtype">char</span>* haystack_expr,</div><div class="line"><a name="l16315"></a><span class="lineno">16315</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* needle, <span class="keyword">const</span> <span class="keywordtype">char</span>* haystack);</div><div class="line"><a name="l16316"></a><span class="lineno">16316</span> <a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> AssertionResult <a class="code" href="namespacetesting.html#a5c90a86562b2470213c07742e0eeb0fe">IsSubstring</a>(</div><div class="line"><a name="l16317"></a><span class="lineno">16317</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* needle_expr, <span class="keyword">const</span> <span class="keywordtype">char</span>* haystack_expr,</div><div class="line"><a name="l16318"></a><span class="lineno">16318</span>  <span class="keyword">const</span> <span class="keywordtype">wchar_t</span>* needle, <span class="keyword">const</span> <span class="keywordtype">wchar_t</span>* haystack);</div><div class="line"><a name="l16319"></a><span class="lineno">16319</span> <a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> AssertionResult <a class="code" href="namespacetesting.html#ab553b649b06ef2339cbd90f8dfa119f0">IsNotSubstring</a>(</div><div class="line"><a name="l16320"></a><span class="lineno">16320</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* needle_expr, <span class="keyword">const</span> <span class="keywordtype">char</span>* haystack_expr,</div><div class="line"><a name="l16321"></a><span class="lineno">16321</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* needle, <span class="keyword">const</span> <span class="keywordtype">char</span>* haystack);</div><div class="line"><a name="l16322"></a><span class="lineno">16322</span> <a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> AssertionResult <a class="code" href="namespacetesting.html#ab553b649b06ef2339cbd90f8dfa119f0">IsNotSubstring</a>(</div><div class="line"><a name="l16323"></a><span class="lineno">16323</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* needle_expr, <span class="keyword">const</span> <span class="keywordtype">char</span>* haystack_expr,</div><div class="line"><a name="l16324"></a><span class="lineno">16324</span>  <span class="keyword">const</span> <span class="keywordtype">wchar_t</span>* needle, <span class="keyword">const</span> <span class="keywordtype">wchar_t</span>* haystack);</div><div class="line"><a name="l16325"></a><span class="lineno">16325</span> <a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> AssertionResult <a class="code" href="namespacetesting.html#a5c90a86562b2470213c07742e0eeb0fe">IsSubstring</a>(</div><div class="line"><a name="l16326"></a><span class="lineno">16326</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* needle_expr, <span class="keyword">const</span> <span class="keywordtype">char</span>* haystack_expr,</div><div class="line"><a name="l16327"></a><span class="lineno">16327</span>  <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">const ::std::string</a>& needle, <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">const ::std::string</a>& haystack);</div><div class="line"><a name="l16328"></a><span class="lineno">16328</span> <a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> AssertionResult <a class="code" href="namespacetesting.html#ab553b649b06ef2339cbd90f8dfa119f0">IsNotSubstring</a>(</div><div class="line"><a name="l16329"></a><span class="lineno">16329</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* needle_expr, <span class="keyword">const</span> <span class="keywordtype">char</span>* haystack_expr,</div><div class="line"><a name="l16330"></a><span class="lineno">16330</span>  <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">const ::std::string</a>& needle, <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">const ::std::string</a>& haystack);</div><div class="line"><a name="l16331"></a><span class="lineno">16331</span> </div><div class="line"><a name="l16332"></a><span class="lineno">16332</span> <span class="preprocessor">#if GTEST_HAS_STD_WSTRING</span></div><div class="line"><a name="l16333"></a><span class="lineno">16333</span> <a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> AssertionResult <a class="code" href="namespacetesting.html#a5c90a86562b2470213c07742e0eeb0fe">IsSubstring</a>(</div><div class="line"><a name="l16334"></a><span class="lineno">16334</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* needle_expr, <span class="keyword">const</span> <span class="keywordtype">char</span>* haystack_expr,</div><div class="line"><a name="l16335"></a><span class="lineno">16335</span>  <a class="code" href="namespacetesting_1_1internal.html#a3f543179329c353aee1d7b54a9a8e335">const ::std::wstring</a>& needle, <a class="code" href="namespacetesting_1_1internal.html#a3f543179329c353aee1d7b54a9a8e335">const ::std::wstring</a>& haystack);</div><div class="line"><a name="l16336"></a><span class="lineno">16336</span> <a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> AssertionResult <a class="code" href="namespacetesting.html#ab553b649b06ef2339cbd90f8dfa119f0">IsNotSubstring</a>(</div><div class="line"><a name="l16337"></a><span class="lineno">16337</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* needle_expr, <span class="keyword">const</span> <span class="keywordtype">char</span>* haystack_expr,</div><div class="line"><a name="l16338"></a><span class="lineno">16338</span>  <a class="code" href="namespacetesting_1_1internal.html#a3f543179329c353aee1d7b54a9a8e335">const ::std::wstring</a>& needle, <a class="code" href="namespacetesting_1_1internal.html#a3f543179329c353aee1d7b54a9a8e335">const ::std::wstring</a>& haystack);</div><div class="line"><a name="l16339"></a><span class="lineno">16339</span> <span class="preprocessor">#endif // GTEST_HAS_STD_WSTRING</span></div><div class="line"><a name="l16340"></a><span class="lineno">16340</span> </div><div class="line"><a name="l16341"></a><span class="lineno">16341</span> <span class="keyword">namespace </span>internal {</div><div class="line"><a name="l16342"></a><span class="lineno">16342</span> </div><div class="line"><a name="l16343"></a><span class="lineno">16343</span> <span class="comment">// Helper template function for comparing floating-points.</span></div><div class="line"><a name="l16344"></a><span class="lineno">16344</span> <span class="comment">//</span></div><div class="line"><a name="l16345"></a><span class="lineno">16345</span> <span class="comment">// Template parameter:</span></div><div class="line"><a name="l16346"></a><span class="lineno">16346</span> <span class="comment">//</span></div><div class="line"><a name="l16347"></a><span class="lineno">16347</span> <span class="comment">// RawType: the raw floating-point type (either float or double)</span></div><div class="line"><a name="l16348"></a><span class="lineno">16348</span> <span class="comment">//</span></div><div class="line"><a name="l16349"></a><span class="lineno">16349</span> <span class="comment">// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.</span></div><div class="line"><a name="l16350"></a><span class="lineno">16350</span> <span class="keyword">template</span> <<span class="keyword">typename</span> RawType></div><div class="line"><a name="l16351"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#a98ce463e5dbe0c6120fa817e1f8f2944">16351</a></span> AssertionResult <a class="code" href="namespacetesting_1_1internal.html#a98ce463e5dbe0c6120fa817e1f8f2944">CmpHelperFloatingPointEQ</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* lhs_expression,</div><div class="line"><a name="l16352"></a><span class="lineno">16352</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* rhs_expression,</div><div class="line"><a name="l16353"></a><span class="lineno">16353</span>  RawType lhs_value,</div><div class="line"><a name="l16354"></a><span class="lineno">16354</span>  RawType rhs_value) {</div><div class="line"><a name="l16355"></a><span class="lineno">16355</span>  <span class="keyword">const</span> <a class="code" href="classtesting_1_1internal_1_1_floating_point.html">FloatingPoint<RawType></a> lhs(lhs_value), rhs(rhs_value);</div><div class="line"><a name="l16356"></a><span class="lineno">16356</span> </div><div class="line"><a name="l16357"></a><span class="lineno">16357</span>  <span class="keywordflow">if</span> (lhs.AlmostEquals(rhs)) {</div><div class="line"><a name="l16358"></a><span class="lineno">16358</span>  <span class="keywordflow">return</span> AssertionSuccess();</div><div class="line"><a name="l16359"></a><span class="lineno">16359</span>  }</div><div class="line"><a name="l16360"></a><span class="lineno">16360</span> </div><div class="line"><a name="l16361"></a><span class="lineno">16361</span>  ::std::stringstream lhs_ss;</div><div class="line"><a name="l16362"></a><span class="lineno">16362</span>  lhs_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)</div><div class="line"><a name="l16363"></a><span class="lineno">16363</span>  << lhs_value;</div><div class="line"><a name="l16364"></a><span class="lineno">16364</span> </div><div class="line"><a name="l16365"></a><span class="lineno">16365</span>  ::std::stringstream rhs_ss;</div><div class="line"><a name="l16366"></a><span class="lineno">16366</span>  rhs_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)</div><div class="line"><a name="l16367"></a><span class="lineno">16367</span>  << rhs_value;</div><div class="line"><a name="l16368"></a><span class="lineno">16368</span> </div><div class="line"><a name="l16369"></a><span class="lineno">16369</span>  <span class="keywordflow">return</span> <a class="code" href="namespacetesting_1_1internal.html#ac61e2ba2cbf259fd6ee5ffd4e49c9445">EqFailure</a>(lhs_expression,</div><div class="line"><a name="l16370"></a><span class="lineno">16370</span>  rhs_expression,</div><div class="line"><a name="l16371"></a><span class="lineno">16371</span>  StringStreamToString(&lhs_ss),</div><div class="line"><a name="l16372"></a><span class="lineno">16372</span>  StringStreamToString(&rhs_ss),</div><div class="line"><a name="l16373"></a><span class="lineno">16373</span>  <span class="keyword">false</span>);</div><div class="line"><a name="l16374"></a><span class="lineno">16374</span> }</div><div class="line"><a name="l16375"></a><span class="lineno">16375</span> </div><div class="line"><a name="l16376"></a><span class="lineno">16376</span> <span class="comment">// Helper function for implementing ASSERT_NEAR.</span></div><div class="line"><a name="l16377"></a><span class="lineno">16377</span> <span class="comment">//</span></div><div class="line"><a name="l16378"></a><span class="lineno">16378</span> <span class="comment">// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.</span></div><div class="line"><a name="l16379"></a><span class="lineno">16379</span> <a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> AssertionResult <a class="code" href="namespacetesting_1_1internal.html#aea60207c4cedc8946a70ada62e38da8f">DoubleNearPredFormat</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* expr1,</div><div class="line"><a name="l16380"></a><span class="lineno">16380</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* expr2,</div><div class="line"><a name="l16381"></a><span class="lineno">16381</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* abs_error_expr,</div><div class="line"><a name="l16382"></a><span class="lineno">16382</span>  <span class="keywordtype">double</span> val1,</div><div class="line"><a name="l16383"></a><span class="lineno">16383</span>  <span class="keywordtype">double</span> val2,</div><div class="line"><a name="l16384"></a><span class="lineno">16384</span>  <span class="keywordtype">double</span> abs_error);</div><div class="line"><a name="l16385"></a><span class="lineno">16385</span> </div><div class="line"><a name="l16386"></a><span class="lineno">16386</span> <span class="comment">// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.</span></div><div class="line"><a name="l16387"></a><span class="lineno">16387</span> <span class="comment">// A class that enables one to stream messages to assertion macros</span></div><div class="line"><a name="l16388"></a><span class="lineno"><a class="line" href="classtesting_1_1internal_1_1_assert_helper.html">16388</a></span> <span class="keyword">class </span><a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> <a class="code" href="classtesting_1_1internal_1_1_assert_helper.html">AssertHelper</a> {</div><div class="line"><a name="l16389"></a><span class="lineno">16389</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l16390"></a><span class="lineno">16390</span>  <span class="comment">// Constructor.</span></div><div class="line"><a name="l16391"></a><span class="lineno">16391</span>  <a class="code" href="classtesting_1_1internal_1_1_assert_helper.html">AssertHelper</a>(TestPartResult::Type type,</div><div class="line"><a name="l16392"></a><span class="lineno">16392</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* file,</div><div class="line"><a name="l16393"></a><span class="lineno">16393</span>  <span class="keywordtype">int</span> line,</div><div class="line"><a name="l16394"></a><span class="lineno">16394</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* message);</div><div class="line"><a name="l16395"></a><span class="lineno">16395</span>  ~<a class="code" href="classtesting_1_1internal_1_1_assert_helper.html">AssertHelper</a>();</div><div class="line"><a name="l16396"></a><span class="lineno">16396</span> </div><div class="line"><a name="l16397"></a><span class="lineno">16397</span>  <span class="comment">// Message assignment is a semantic trick to enable assertion</span></div><div class="line"><a name="l16398"></a><span class="lineno">16398</span>  <span class="comment">// streaming; see the GTEST_MESSAGE_ macro below.</span></div><div class="line"><a name="l16399"></a><span class="lineno">16399</span>  <span class="keywordtype">void</span> operator=(<span class="keyword">const</span> <a class="code" href="classtesting_1_1_message.html">Message</a>& message) <span class="keyword">const</span>;</div><div class="line"><a name="l16400"></a><span class="lineno">16400</span> </div><div class="line"><a name="l16401"></a><span class="lineno">16401</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l16402"></a><span class="lineno">16402</span>  <span class="comment">// We put our data in a struct so that the size of the AssertHelper class can</span></div><div class="line"><a name="l16403"></a><span class="lineno">16403</span>  <span class="comment">// be as small as possible. This is important because gcc is incapable of</span></div><div class="line"><a name="l16404"></a><span class="lineno">16404</span>  <span class="comment">// re-using stack space even for temporary variables, so every EXPECT_EQ</span></div><div class="line"><a name="l16405"></a><span class="lineno">16405</span>  <span class="comment">// reserves stack space for another AssertHelper.</span></div><div class="line"><a name="l16406"></a><span class="lineno">16406</span>  <span class="keyword">struct </span>AssertHelperData {</div><div class="line"><a name="l16407"></a><span class="lineno">16407</span>  AssertHelperData(TestPartResult::Type t,</div><div class="line"><a name="l16408"></a><span class="lineno">16408</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* srcfile,</div><div class="line"><a name="l16409"></a><span class="lineno">16409</span>  <span class="keywordtype">int</span> line_num,</div><div class="line"><a name="l16410"></a><span class="lineno">16410</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* msg)</div><div class="line"><a name="l16411"></a><span class="lineno">16411</span>  : type(t), file(srcfile), line(line_num), message(msg) { }</div><div class="line"><a name="l16412"></a><span class="lineno">16412</span> </div><div class="line"><a name="l16413"></a><span class="lineno">16413</span>  TestPartResult::Type <span class="keyword">const</span> type;</div><div class="line"><a name="l16414"></a><span class="lineno">16414</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* <span class="keyword">const</span> file;</div><div class="line"><a name="l16415"></a><span class="lineno">16415</span>  <span class="keywordtype">int</span> <span class="keyword">const</span> line;</div><div class="line"><a name="l16416"></a><span class="lineno">16416</span>  <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a> <span class="keyword">const</span> message;</div><div class="line"><a name="l16417"></a><span class="lineno">16417</span> </div><div class="line"><a name="l16418"></a><span class="lineno">16418</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l16419"></a><span class="lineno">16419</span>  <a class="code" href="gtest_8h.html#aed8c1888c32b588b0681e88b95031e29">GTEST_DISALLOW_COPY_AND_ASSIGN_</a>(AssertHelperData);</div><div class="line"><a name="l16420"></a><span class="lineno">16420</span>  };</div><div class="line"><a name="l16421"></a><span class="lineno">16421</span> </div><div class="line"><a name="l16422"></a><span class="lineno">16422</span>  AssertHelperData* <span class="keyword">const</span> data_;</div><div class="line"><a name="l16423"></a><span class="lineno">16423</span> </div><div class="line"><a name="l16424"></a><span class="lineno">16424</span>  <a class="code" href="gtest_8h.html#aed8c1888c32b588b0681e88b95031e29">GTEST_DISALLOW_COPY_AND_ASSIGN_</a>(<a class="code" href="classtesting_1_1internal_1_1_assert_helper.html">AssertHelper</a>);</div><div class="line"><a name="l16425"></a><span class="lineno">16425</span> };</div><div class="line"><a name="l16426"></a><span class="lineno">16426</span> </div><div class="line"><a name="l16427"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#a648c1bc94c2ef9e868ff3f9dff0f9c4e">16427</a></span> <span class="keyword">enum</span> <a class="code" href="namespacetesting_1_1internal.html#a648c1bc94c2ef9e868ff3f9dff0f9c4e">GTestColor</a> { <a class="code" href="namespacetesting_1_1internal.html#a648c1bc94c2ef9e868ff3f9dff0f9c4eafcd8803dc9e37e374d5a4486afc230b7">COLOR_DEFAULT</a>, <a class="code" href="namespacetesting_1_1internal.html#a648c1bc94c2ef9e868ff3f9dff0f9c4ea9ebb3ddab9391781f6ee5021e1e443c3">COLOR_RED</a>, <a class="code" href="namespacetesting_1_1internal.html#a648c1bc94c2ef9e868ff3f9dff0f9c4ea3b1e81f5b14a17b35a8672d57d166507">COLOR_GREEN</a>, <a class="code" href="namespacetesting_1_1internal.html#a648c1bc94c2ef9e868ff3f9dff0f9c4ea2cca441161aca75a208ff08d07f5b1a5">COLOR_YELLOW</a> };</div><div class="line"><a name="l16428"></a><span class="lineno">16428</span> </div><div class="line"><a name="l16429"></a><span class="lineno">16429</span> <a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> <a class="code" href="gtest_8h.html#ae29b00ca46783509cc900cd03d61ef37">GTEST_ATTRIBUTE_PRINTF_</a>(2, 3) void ColoredPrintf(<a class="code" href="namespacetesting_1_1internal.html#a648c1bc94c2ef9e868ff3f9dff0f9c4e">GTestColor</a> color,</div><div class="line"><a name="l16430"></a><span class="lineno"><a class="line" href="namespacetesting_1_1internal.html#a40b2a93ff318f5975eb8246b01221ce8">16430</a></span>  const <span class="keywordtype">char</span>* <a class="code" href="namespacetesting_1_1internal.html#a40b2a93ff318f5975eb8246b01221ce8">fmt</a>,</div><div class="line"><a name="l16431"></a><span class="lineno">16431</span>  ...);</div><div class="line"><a name="l16432"></a><span class="lineno">16432</span> </div><div class="line"><a name="l16433"></a><span class="lineno">16433</span> } <span class="comment">// namespace internal</span></div><div class="line"><a name="l16434"></a><span class="lineno">16434</span> </div><div class="line"><a name="l16435"></a><span class="lineno">16435</span> <span class="comment">// The pure interface class that all value-parameterized tests inherit from.</span></div><div class="line"><a name="l16436"></a><span class="lineno">16436</span> <span class="comment">// A value-parameterized class must inherit from both ::testing::Test and</span></div><div class="line"><a name="l16437"></a><span class="lineno">16437</span> <span class="comment">// ::testing::WithParamInterface. In most cases that just means inheriting</span></div><div class="line"><a name="l16438"></a><span class="lineno">16438</span> <span class="comment">// from ::testing::TestWithParam, but more complicated test hierarchies</span></div><div class="line"><a name="l16439"></a><span class="lineno">16439</span> <span class="comment">// may need to inherit from Test and WithParamInterface at different levels.</span></div><div class="line"><a name="l16440"></a><span class="lineno">16440</span> <span class="comment">//</span></div><div class="line"><a name="l16441"></a><span class="lineno">16441</span> <span class="comment">// This interface has support for accessing the test parameter value via</span></div><div class="line"><a name="l16442"></a><span class="lineno">16442</span> <span class="comment">// the GetParam() method.</span></div><div class="line"><a name="l16443"></a><span class="lineno">16443</span> <span class="comment">//</span></div><div class="line"><a name="l16444"></a><span class="lineno">16444</span> <span class="comment">// Use it with one of the parameter generator defining functions, like Range(),</span></div><div class="line"><a name="l16445"></a><span class="lineno">16445</span> <span class="comment">// Values(), ValuesIn(), Bool(), and Combine().</span></div><div class="line"><a name="l16446"></a><span class="lineno">16446</span> <span class="comment">//</span></div><div class="line"><a name="l16447"></a><span class="lineno">16447</span> <span class="comment">// class FooTest : public ::testing::TestWithParam<int> {</span></div><div class="line"><a name="l16448"></a><span class="lineno">16448</span> <span class="comment">// protected:</span></div><div class="line"><a name="l16449"></a><span class="lineno">16449</span> <span class="comment">// FooTest() {</span></div><div class="line"><a name="l16450"></a><span class="lineno">16450</span> <span class="comment">// // Can use GetParam() here.</span></div><div class="line"><a name="l16451"></a><span class="lineno">16451</span> <span class="comment">// }</span></div><div class="line"><a name="l16452"></a><span class="lineno">16452</span> <span class="comment">// virtual ~FooTest() {</span></div><div class="line"><a name="l16453"></a><span class="lineno">16453</span> <span class="comment">// // Can use GetParam() here.</span></div><div class="line"><a name="l16454"></a><span class="lineno">16454</span> <span class="comment">// }</span></div><div class="line"><a name="l16455"></a><span class="lineno">16455</span> <span class="comment">// virtual void SetUp() {</span></div><div class="line"><a name="l16456"></a><span class="lineno">16456</span> <span class="comment">// // Can use GetParam() here.</span></div><div class="line"><a name="l16457"></a><span class="lineno">16457</span> <span class="comment">// }</span></div><div class="line"><a name="l16458"></a><span class="lineno">16458</span> <span class="comment">// virtual void TearDown {</span></div><div class="line"><a name="l16459"></a><span class="lineno">16459</span> <span class="comment">// // Can use GetParam() here.</span></div><div class="line"><a name="l16460"></a><span class="lineno">16460</span> <span class="comment">// }</span></div><div class="line"><a name="l16461"></a><span class="lineno">16461</span> <span class="comment">// };</span></div><div class="line"><a name="l16462"></a><span class="lineno">16462</span> <span class="comment">// TEST_P(FooTest, DoesBar) {</span></div><div class="line"><a name="l16463"></a><span class="lineno">16463</span> <span class="comment">// // Can use GetParam() method here.</span></div><div class="line"><a name="l16464"></a><span class="lineno">16464</span> <span class="comment">// Foo foo;</span></div><div class="line"><a name="l16465"></a><span class="lineno">16465</span> <span class="comment">// ASSERT_TRUE(foo.DoesBar(GetParam()));</span></div><div class="line"><a name="l16466"></a><span class="lineno">16466</span> <span class="comment">// }</span></div><div class="line"><a name="l16467"></a><span class="lineno">16467</span> <span class="comment">// INSTANTIATE_TEST_SUITE_P(OneToTenRange, FooTest, ::testing::Range(1, 10));</span></div><div class="line"><a name="l16468"></a><span class="lineno">16468</span> </div><div class="line"><a name="l16469"></a><span class="lineno">16469</span> template <typename T></div><div class="line"><a name="l16470"></a><span class="lineno"><a class="line" href="classtesting_1_1_with_param_interface.html">16470</a></span> class <a class="code" href="classtesting_1_1_with_param_interface.html">WithParamInterface</a> {</div><div class="line"><a name="l16471"></a><span class="lineno">16471</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l16472"></a><span class="lineno"><a class="line" href="classtesting_1_1_with_param_interface.html#a343febaaebf1f025bda484f841d4fec1">16472</a></span>  <span class="keyword">typedef</span> T <a class="code" href="classtesting_1_1_with_param_interface.html#a343febaaebf1f025bda484f841d4fec1">ParamType</a>;</div><div class="line"><a name="l16473"></a><span class="lineno"><a class="line" href="classtesting_1_1_with_param_interface.html#a4e170bd42fa5e8ce48b80cee6bb52e26">16473</a></span>  <span class="keyword">virtual</span> <a class="code" href="classtesting_1_1_with_param_interface.html#a4e170bd42fa5e8ce48b80cee6bb52e26">~WithParamInterface</a>() {}</div><div class="line"><a name="l16474"></a><span class="lineno">16474</span> </div><div class="line"><a name="l16475"></a><span class="lineno">16475</span>  <span class="comment">// The current parameter value. Is also available in the test fixture's</span></div><div class="line"><a name="l16476"></a><span class="lineno">16476</span>  <span class="comment">// constructor.</span></div><div class="line"><a name="l16477"></a><span class="lineno"><a class="line" href="classtesting_1_1_with_param_interface.html#a1078d4493d7aa4d3e50d1d6c661bee4d">16477</a></span>  <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="classtesting_1_1_with_param_interface.html#a343febaaebf1f025bda484f841d4fec1">ParamType</a>& <a class="code" href="classtesting_1_1_with_param_interface.html#a1078d4493d7aa4d3e50d1d6c661bee4d">GetParam</a>() {</div><div class="line"><a name="l16478"></a><span class="lineno">16478</span>  <a class="code" href="gtest_8h.html#ab54343f0a36dc4cb0ce8a478dd7847b8">GTEST_CHECK_</a>(parameter_ != <span class="keyword">nullptr</span>)</div><div class="line"><a name="l16479"></a><span class="lineno">16479</span>  << <span class="stringliteral">"GetParam() can only be called inside a value-parameterized test "</span></div><div class="line"><a name="l16480"></a><span class="lineno">16480</span>  << <span class="stringliteral">"-- did you intend to write TEST_P instead of TEST_F?"</span>;</div><div class="line"><a name="l16481"></a><span class="lineno">16481</span>  <span class="keywordflow">return</span> *parameter_;</div><div class="line"><a name="l16482"></a><span class="lineno">16482</span>  }</div><div class="line"><a name="l16483"></a><span class="lineno">16483</span> </div><div class="line"><a name="l16484"></a><span class="lineno">16484</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l16485"></a><span class="lineno">16485</span>  <span class="comment">// Sets parameter value. The caller is responsible for making sure the value</span></div><div class="line"><a name="l16486"></a><span class="lineno">16486</span>  <span class="comment">// remains alive and unchanged throughout the current test.</span></div><div class="line"><a name="l16487"></a><span class="lineno">16487</span>  <span class="keyword">static</span> <span class="keywordtype">void</span> SetParam(<span class="keyword">const</span> ParamType* parameter) {</div><div class="line"><a name="l16488"></a><span class="lineno">16488</span>  parameter_ = parameter;</div><div class="line"><a name="l16489"></a><span class="lineno">16489</span>  }</div><div class="line"><a name="l16490"></a><span class="lineno">16490</span> </div><div class="line"><a name="l16491"></a><span class="lineno">16491</span>  <span class="comment">// Static value used for accessing parameter during a test lifetime.</span></div><div class="line"><a name="l16492"></a><span class="lineno">16492</span>  <span class="keyword">static</span> <span class="keyword">const</span> ParamType* parameter_;</div><div class="line"><a name="l16493"></a><span class="lineno">16493</span> </div><div class="line"><a name="l16494"></a><span class="lineno">16494</span>  <span class="comment">// TestClass must be a subclass of WithParamInterface<T> and Test.</span></div><div class="line"><a name="l16495"></a><span class="lineno"><a class="line" href="classtesting_1_1_with_param_interface.html#a7543eb7df89f00fff517dba24bc11dd5">16495</a></span>  <span class="keyword">template</span> <<span class="keyword">class</span> TestClass> <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classtesting_1_1internal_1_1_parameterized_test_factory.html">internal::ParameterizedTestFactory</a>;</div><div class="line"><a name="l16496"></a><span class="lineno">16496</span> };</div><div class="line"><a name="l16497"></a><span class="lineno">16497</span> </div><div class="line"><a name="l16498"></a><span class="lineno">16498</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l16499"></a><span class="lineno">16499</span> <span class="keyword">const</span> T* <a class="code" href="classtesting_1_1_with_param_interface.html">WithParamInterface<T>::parameter_</a> = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l16500"></a><span class="lineno">16500</span> </div><div class="line"><a name="l16501"></a><span class="lineno">16501</span> <span class="comment">// Most value-parameterized classes can ignore the existence of</span></div><div class="line"><a name="l16502"></a><span class="lineno">16502</span> <span class="comment">// WithParamInterface, and can just inherit from ::testing::TestWithParam.</span></div><div class="line"><a name="l16503"></a><span class="lineno">16503</span> </div><div class="line"><a name="l16504"></a><span class="lineno">16504</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l16505"></a><span class="lineno"><a class="line" href="classtesting_1_1_test_with_param.html">16505</a></span> <span class="keyword">class </span><a class="code" href="classtesting_1_1_test_with_param.html">TestWithParam</a> : <span class="keyword">public</span> <a class="code" href="classtesting_1_1_test.html">Test</a>, <span class="keyword">public</span> <a class="code" href="classtesting_1_1_with_param_interface.html">WithParamInterface</a><T> {</div><div class="line"><a name="l16506"></a><span class="lineno">16506</span> };</div><div class="line"><a name="l16507"></a><span class="lineno">16507</span> </div><div class="line"><a name="l16508"></a><span class="lineno">16508</span> <span class="comment">// Macros for indicating success/failure in test code.</span></div><div class="line"><a name="l16509"></a><span class="lineno">16509</span> </div><div class="line"><a name="l16510"></a><span class="lineno">16510</span> <span class="comment">// Skips test in runtime.</span></div><div class="line"><a name="l16511"></a><span class="lineno">16511</span> <span class="comment">// Skipping test aborts current function.</span></div><div class="line"><a name="l16512"></a><span class="lineno">16512</span> <span class="comment">// Skipped tests are neither successful nor failed.</span></div><div class="line"><a name="l16513"></a><span class="lineno"><a class="line" href="gtest_8h.html#a3c0bbb980d533108ecc23c3534527d3c">16513</a></span> <span class="preprocessor">#define GTEST_SKIP() GTEST_SKIP_("Skipped")</span></div><div class="line"><a name="l16514"></a><span class="lineno">16514</span> </div><div class="line"><a name="l16515"></a><span class="lineno">16515</span> <span class="comment">// ADD_FAILURE unconditionally adds a failure to the current test.</span></div><div class="line"><a name="l16516"></a><span class="lineno">16516</span> <span class="comment">// SUCCEED generates a success - it doesn't automatically make the</span></div><div class="line"><a name="l16517"></a><span class="lineno">16517</span> <span class="comment">// current test successful, as a test is only successful when it has</span></div><div class="line"><a name="l16518"></a><span class="lineno">16518</span> <span class="comment">// no failure.</span></div><div class="line"><a name="l16519"></a><span class="lineno">16519</span> <span class="comment">//</span></div><div class="line"><a name="l16520"></a><span class="lineno">16520</span> <span class="comment">// EXPECT_* verifies that a certain condition is satisfied. If not,</span></div><div class="line"><a name="l16521"></a><span class="lineno">16521</span> <span class="comment">// it behaves like ADD_FAILURE. In particular:</span></div><div class="line"><a name="l16522"></a><span class="lineno">16522</span> <span class="comment">//</span></div><div class="line"><a name="l16523"></a><span class="lineno">16523</span> <span class="comment">// EXPECT_TRUE verifies that a Boolean condition is true.</span></div><div class="line"><a name="l16524"></a><span class="lineno">16524</span> <span class="comment">// EXPECT_FALSE verifies that a Boolean condition is false.</span></div><div class="line"><a name="l16525"></a><span class="lineno">16525</span> <span class="comment">//</span></div><div class="line"><a name="l16526"></a><span class="lineno">16526</span> <span class="comment">// FAIL and ASSERT_* are similar to ADD_FAILURE and EXPECT_*, except</span></div><div class="line"><a name="l16527"></a><span class="lineno">16527</span> <span class="comment">// that they will also abort the current function on failure. People</span></div><div class="line"><a name="l16528"></a><span class="lineno">16528</span> <span class="comment">// usually want the fail-fast behavior of FAIL and ASSERT_*, but those</span></div><div class="line"><a name="l16529"></a><span class="lineno">16529</span> <span class="comment">// writing data-driven tests often find themselves using ADD_FAILURE</span></div><div class="line"><a name="l16530"></a><span class="lineno">16530</span> <span class="comment">// and EXPECT_* more.</span></div><div class="line"><a name="l16531"></a><span class="lineno">16531</span> </div><div class="line"><a name="l16532"></a><span class="lineno">16532</span> <span class="comment">// Generates a nonfatal failure with a generic message.</span></div><div class="line"><a name="l16533"></a><span class="lineno"><a class="line" href="gtest_8h.html#adc16b5b0a740c39084ea5c9e960e3063">16533</a></span> <span class="preprocessor">#define ADD_FAILURE() GTEST_NONFATAL_FAILURE_("Failed")</span></div><div class="line"><a name="l16534"></a><span class="lineno">16534</span> </div><div class="line"><a name="l16535"></a><span class="lineno">16535</span> <span class="comment">// Generates a nonfatal failure at the given source file location with</span></div><div class="line"><a name="l16536"></a><span class="lineno">16536</span> <span class="comment">// a generic message.</span></div><div class="line"><a name="l16537"></a><span class="lineno"><a class="line" href="gtest_8h.html#a448d7e5105b640e892fd8153fbee0b7f">16537</a></span> <span class="preprocessor">#define ADD_FAILURE_AT(file, line) \</span></div><div class="line"><a name="l16538"></a><span class="lineno">16538</span> <span class="preprocessor"> GTEST_MESSAGE_AT_(file, line, "Failed", \</span></div><div class="line"><a name="l16539"></a><span class="lineno">16539</span> <span class="preprocessor"> ::testing::TestPartResult::kNonFatalFailure)</span></div><div class="line"><a name="l16540"></a><span class="lineno">16540</span> </div><div class="line"><a name="l16541"></a><span class="lineno">16541</span> <span class="comment">// Generates a fatal failure with a generic message.</span></div><div class="line"><a name="l16542"></a><span class="lineno"><a class="line" href="gtest_8h.html#a636231436707c30d6778f79ae96f5dc6">16542</a></span> <span class="preprocessor">#define GTEST_FAIL() GTEST_FATAL_FAILURE_("Failed")</span></div><div class="line"><a name="l16543"></a><span class="lineno">16543</span> </div><div class="line"><a name="l16544"></a><span class="lineno">16544</span> <span class="comment">// Define this macro to 1 to omit the definition of FAIL(), which is a</span></div><div class="line"><a name="l16545"></a><span class="lineno">16545</span> <span class="comment">// generic name and clashes with some other libraries.</span></div><div class="line"><a name="l16546"></a><span class="lineno">16546</span> <span class="preprocessor">#if !GTEST_DONT_DEFINE_FAIL</span></div><div class="line"><a name="l16547"></a><span class="lineno"><a class="line" href="gtest_8h.html#a3e26a8d27caa386ed0ea7ce9d5b7c4ed">16547</a></span> <span class="preprocessor"># define FAIL() GTEST_FAIL()</span></div><div class="line"><a name="l16548"></a><span class="lineno">16548</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l16549"></a><span class="lineno">16549</span> </div><div class="line"><a name="l16550"></a><span class="lineno">16550</span> <span class="comment">// Generates a success with a generic message.</span></div><div class="line"><a name="l16551"></a><span class="lineno"><a class="line" href="gtest_8h.html#a2690441c38202728f4159ac2462d9720">16551</a></span> <span class="preprocessor">#define GTEST_SUCCEED() GTEST_SUCCESS_("Succeeded")</span></div><div class="line"><a name="l16552"></a><span class="lineno">16552</span> </div><div class="line"><a name="l16553"></a><span class="lineno">16553</span> <span class="comment">// Define this macro to 1 to omit the definition of SUCCEED(), which</span></div><div class="line"><a name="l16554"></a><span class="lineno">16554</span> <span class="comment">// is a generic name and clashes with some other libraries.</span></div><div class="line"><a name="l16555"></a><span class="lineno">16555</span> <span class="preprocessor">#if !GTEST_DONT_DEFINE_SUCCEED</span></div><div class="line"><a name="l16556"></a><span class="lineno"><a class="line" href="gtest_8h.html#a75adcdf89f69b0b615e395daafc315af">16556</a></span> <span class="preprocessor"># define SUCCEED() GTEST_SUCCEED()</span></div><div class="line"><a name="l16557"></a><span class="lineno">16557</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l16558"></a><span class="lineno">16558</span> </div><div class="line"><a name="l16559"></a><span class="lineno">16559</span> <span class="comment">// Macros for testing exceptions.</span></div><div class="line"><a name="l16560"></a><span class="lineno">16560</span> <span class="comment">//</span></div><div class="line"><a name="l16561"></a><span class="lineno">16561</span> <span class="comment">// * {ASSERT|EXPECT}_THROW(statement, expected_exception):</span></div><div class="line"><a name="l16562"></a><span class="lineno">16562</span> <span class="comment">// Tests that the statement throws the expected exception.</span></div><div class="line"><a name="l16563"></a><span class="lineno">16563</span> <span class="comment">// * {ASSERT|EXPECT}_NO_THROW(statement):</span></div><div class="line"><a name="l16564"></a><span class="lineno">16564</span> <span class="comment">// Tests that the statement doesn't throw any exception.</span></div><div class="line"><a name="l16565"></a><span class="lineno">16565</span> <span class="comment">// * {ASSERT|EXPECT}_ANY_THROW(statement):</span></div><div class="line"><a name="l16566"></a><span class="lineno">16566</span> <span class="comment">// Tests that the statement throws an exception.</span></div><div class="line"><a name="l16567"></a><span class="lineno">16567</span> </div><div class="line"><a name="l16568"></a><span class="lineno"><a class="line" href="gtest_8h.html#a789842b4475eed948e6fd18390d5a859">16568</a></span> <span class="preprocessor">#define EXPECT_THROW(statement, expected_exception) \</span></div><div class="line"><a name="l16569"></a><span class="lineno">16569</span> <span class="preprocessor"> GTEST_TEST_THROW_(statement, expected_exception, GTEST_NONFATAL_FAILURE_)</span></div><div class="line"><a name="l16570"></a><span class="lineno"><a class="line" href="gtest_8h.html#a2743a1438137ad857aa3f9fec3ff67ec">16570</a></span> <span class="preprocessor">#define EXPECT_NO_THROW(statement) \</span></div><div class="line"><a name="l16571"></a><span class="lineno">16571</span> <span class="preprocessor"> GTEST_TEST_NO_THROW_(statement, GTEST_NONFATAL_FAILURE_)</span></div><div class="line"><a name="l16572"></a><span class="lineno"><a class="line" href="gtest_8h.html#a9be43f44d148e8a8d6a89c864bf4e461">16572</a></span> <span class="preprocessor">#define EXPECT_ANY_THROW(statement) \</span></div><div class="line"><a name="l16573"></a><span class="lineno">16573</span> <span class="preprocessor"> GTEST_TEST_ANY_THROW_(statement, GTEST_NONFATAL_FAILURE_)</span></div><div class="line"><a name="l16574"></a><span class="lineno"><a class="line" href="gtest_8h.html#aedb1eddae6c2a2430b0e7b7e03b4f052">16574</a></span> <span class="preprocessor">#define ASSERT_THROW(statement, expected_exception) \</span></div><div class="line"><a name="l16575"></a><span class="lineno">16575</span> <span class="preprocessor"> GTEST_TEST_THROW_(statement, expected_exception, GTEST_FATAL_FAILURE_)</span></div><div class="line"><a name="l16576"></a><span class="lineno"><a class="line" href="gtest_8h.html#a895c34d9b192cdc2ba46d2680623485d">16576</a></span> <span class="preprocessor">#define ASSERT_NO_THROW(statement) \</span></div><div class="line"><a name="l16577"></a><span class="lineno">16577</span> <span class="preprocessor"> GTEST_TEST_NO_THROW_(statement, GTEST_FATAL_FAILURE_)</span></div><div class="line"><a name="l16578"></a><span class="lineno"><a class="line" href="gtest_8h.html#affadeef9379fe5aabf6f28d9eab9d3c0">16578</a></span> <span class="preprocessor">#define ASSERT_ANY_THROW(statement) \</span></div><div class="line"><a name="l16579"></a><span class="lineno">16579</span> <span class="preprocessor"> GTEST_TEST_ANY_THROW_(statement, GTEST_FATAL_FAILURE_)</span></div><div class="line"><a name="l16580"></a><span class="lineno">16580</span> </div><div class="line"><a name="l16581"></a><span class="lineno">16581</span> <span class="comment">// Boolean assertions. Condition can be either a Boolean expression or an</span></div><div class="line"><a name="l16582"></a><span class="lineno">16582</span> <span class="comment">// AssertionResult. For more information on how to use AssertionResult with</span></div><div class="line"><a name="l16583"></a><span class="lineno">16583</span> <span class="comment">// these macros see comments on that class.</span></div><div class="line"><a name="l16584"></a><span class="lineno"><a class="line" href="gtest_8h.html#ac33e7cdfb5d44a7a0f0ab552eb5c3c6a">16584</a></span> <span class="preprocessor">#define EXPECT_TRUE(condition) \</span></div><div class="line"><a name="l16585"></a><span class="lineno">16585</span> <span class="preprocessor"> GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \</span></div><div class="line"><a name="l16586"></a><span class="lineno">16586</span> <span class="preprocessor"> GTEST_NONFATAL_FAILURE_)</span></div><div class="line"><a name="l16587"></a><span class="lineno"><a class="line" href="gtest_8h.html#aeb6c7ae89f440c90c1a1815951c836da">16587</a></span> <span class="preprocessor">#define EXPECT_FALSE(condition) \</span></div><div class="line"><a name="l16588"></a><span class="lineno">16588</span> <span class="preprocessor"> GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \</span></div><div class="line"><a name="l16589"></a><span class="lineno">16589</span> <span class="preprocessor"> GTEST_NONFATAL_FAILURE_)</span></div><div class="line"><a name="l16590"></a><span class="lineno"><a class="line" href="gtest_8h.html#ae9244bfbda562e8b798789b001993fa5">16590</a></span> <span class="preprocessor">#define ASSERT_TRUE(condition) \</span></div><div class="line"><a name="l16591"></a><span class="lineno">16591</span> <span class="preprocessor"> GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \</span></div><div class="line"><a name="l16592"></a><span class="lineno">16592</span> <span class="preprocessor"> GTEST_FATAL_FAILURE_)</span></div><div class="line"><a name="l16593"></a><span class="lineno"><a class="line" href="gtest_8h.html#a8197fa52f3538588d20d8af4834c9003">16593</a></span> <span class="preprocessor">#define ASSERT_FALSE(condition) \</span></div><div class="line"><a name="l16594"></a><span class="lineno">16594</span> <span class="preprocessor"> GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \</span></div><div class="line"><a name="l16595"></a><span class="lineno">16595</span> <span class="preprocessor"> GTEST_FATAL_FAILURE_)</span></div><div class="line"><a name="l16596"></a><span class="lineno">16596</span> </div><div class="line"><a name="l16597"></a><span class="lineno">16597</span> <span class="comment">// Macros for testing equalities and inequalities.</span></div><div class="line"><a name="l16598"></a><span class="lineno">16598</span> <span class="comment">//</span></div><div class="line"><a name="l16599"></a><span class="lineno">16599</span> <span class="comment">// * {ASSERT|EXPECT}_EQ(v1, v2): Tests that v1 == v2</span></div><div class="line"><a name="l16600"></a><span class="lineno">16600</span> <span class="comment">// * {ASSERT|EXPECT}_NE(v1, v2): Tests that v1 != v2</span></div><div class="line"><a name="l16601"></a><span class="lineno">16601</span> <span class="comment">// * {ASSERT|EXPECT}_LT(v1, v2): Tests that v1 < v2</span></div><div class="line"><a name="l16602"></a><span class="lineno">16602</span> <span class="comment">// * {ASSERT|EXPECT}_LE(v1, v2): Tests that v1 <= v2</span></div><div class="line"><a name="l16603"></a><span class="lineno">16603</span> <span class="comment">// * {ASSERT|EXPECT}_GT(v1, v2): Tests that v1 > v2</span></div><div class="line"><a name="l16604"></a><span class="lineno">16604</span> <span class="comment">// * {ASSERT|EXPECT}_GE(v1, v2): Tests that v1 >= v2</span></div><div class="line"><a name="l16605"></a><span class="lineno">16605</span> <span class="comment">//</span></div><div class="line"><a name="l16606"></a><span class="lineno">16606</span> <span class="comment">// When they are not, Google Test prints both the tested expressions and</span></div><div class="line"><a name="l16607"></a><span class="lineno">16607</span> <span class="comment">// their actual values. The values must be compatible built-in types,</span></div><div class="line"><a name="l16608"></a><span class="lineno">16608</span> <span class="comment">// or you will get a compiler error. By "compatible" we mean that the</span></div><div class="line"><a name="l16609"></a><span class="lineno">16609</span> <span class="comment">// values can be compared by the respective operator.</span></div><div class="line"><a name="l16610"></a><span class="lineno">16610</span> <span class="comment">//</span></div><div class="line"><a name="l16611"></a><span class="lineno">16611</span> <span class="comment">// Note:</span></div><div class="line"><a name="l16612"></a><span class="lineno">16612</span> <span class="comment">//</span></div><div class="line"><a name="l16613"></a><span class="lineno">16613</span> <span class="comment">// 1. It is possible to make a user-defined type work with</span></div><div class="line"><a name="l16614"></a><span class="lineno">16614</span> <span class="comment">// {ASSERT|EXPECT}_??(), but that requires overloading the</span></div><div class="line"><a name="l16615"></a><span class="lineno">16615</span> <span class="comment">// comparison operators and is thus discouraged by the Google C++</span></div><div class="line"><a name="l16616"></a><span class="lineno">16616</span> <span class="comment">// Usage Guide. Therefore, you are advised to use the</span></div><div class="line"><a name="l16617"></a><span class="lineno">16617</span> <span class="comment">// {ASSERT|EXPECT}_TRUE() macro to assert that two objects are</span></div><div class="line"><a name="l16618"></a><span class="lineno">16618</span> <span class="comment">// equal.</span></div><div class="line"><a name="l16619"></a><span class="lineno">16619</span> <span class="comment">//</span></div><div class="line"><a name="l16620"></a><span class="lineno">16620</span> <span class="comment">// 2. The {ASSERT|EXPECT}_??() macros do pointer comparisons on</span></div><div class="line"><a name="l16621"></a><span class="lineno">16621</span> <span class="comment">// pointers (in particular, C strings). Therefore, if you use it</span></div><div class="line"><a name="l16622"></a><span class="lineno">16622</span> <span class="comment">// with two C strings, you are testing how their locations in memory</span></div><div class="line"><a name="l16623"></a><span class="lineno">16623</span> <span class="comment">// are related, not how their content is related. To compare two C</span></div><div class="line"><a name="l16624"></a><span class="lineno">16624</span> <span class="comment">// strings by content, use {ASSERT|EXPECT}_STR*().</span></div><div class="line"><a name="l16625"></a><span class="lineno">16625</span> <span class="comment">//</span></div><div class="line"><a name="l16626"></a><span class="lineno">16626</span> <span class="comment">// 3. {ASSERT|EXPECT}_EQ(v1, v2) is preferred to</span></div><div class="line"><a name="l16627"></a><span class="lineno">16627</span> <span class="comment">// {ASSERT|EXPECT}_TRUE(v1 == v2), as the former tells you</span></div><div class="line"><a name="l16628"></a><span class="lineno">16628</span> <span class="comment">// what the actual value is when it fails, and similarly for the</span></div><div class="line"><a name="l16629"></a><span class="lineno">16629</span> <span class="comment">// other comparisons.</span></div><div class="line"><a name="l16630"></a><span class="lineno">16630</span> <span class="comment">//</span></div><div class="line"><a name="l16631"></a><span class="lineno">16631</span> <span class="comment">// 4. Do not depend on the order in which {ASSERT|EXPECT}_??()</span></div><div class="line"><a name="l16632"></a><span class="lineno">16632</span> <span class="comment">// evaluate their arguments, which is undefined.</span></div><div class="line"><a name="l16633"></a><span class="lineno">16633</span> <span class="comment">//</span></div><div class="line"><a name="l16634"></a><span class="lineno">16634</span> <span class="comment">// 5. These macros evaluate their arguments exactly once.</span></div><div class="line"><a name="l16635"></a><span class="lineno">16635</span> <span class="comment">//</span></div><div class="line"><a name="l16636"></a><span class="lineno">16636</span> <span class="comment">// Examples:</span></div><div class="line"><a name="l16637"></a><span class="lineno">16637</span> <span class="comment">//</span></div><div class="line"><a name="l16638"></a><span class="lineno">16638</span> <span class="comment">// EXPECT_NE(Foo(), 5);</span></div><div class="line"><a name="l16639"></a><span class="lineno">16639</span> <span class="comment">// EXPECT_EQ(a_pointer, NULL);</span></div><div class="line"><a name="l16640"></a><span class="lineno">16640</span> <span class="comment">// ASSERT_LT(i, array_size);</span></div><div class="line"><a name="l16641"></a><span class="lineno">16641</span> <span class="comment">// ASSERT_GT(records.size(), 0) << "There is no record left.";</span></div><div class="line"><a name="l16642"></a><span class="lineno">16642</span> </div><div class="line"><a name="l16643"></a><span class="lineno"><a class="line" href="gtest_8h.html#a4159019abda84f5366acdb7604ff220a">16643</a></span> <span class="preprocessor">#define EXPECT_EQ(val1, val2) \</span></div><div class="line"><a name="l16644"></a><span class="lineno">16644</span> <span class="preprocessor"> EXPECT_PRED_FORMAT2(::testing::internal:: \</span></div><div class="line"><a name="l16645"></a><span class="lineno">16645</span> <span class="preprocessor"> EqHelper<GTEST_IS_NULL_LITERAL_(val1)>::Compare, \</span></div><div class="line"><a name="l16646"></a><span class="lineno">16646</span> <span class="preprocessor"> val1, val2)</span></div><div class="line"><a name="l16647"></a><span class="lineno"><a class="line" href="gtest_8h.html#a6ae7443947f25abc58bfcfcfc56b0d75">16647</a></span> <span class="preprocessor">#define EXPECT_NE(val1, val2) \</span></div><div class="line"><a name="l16648"></a><span class="lineno">16648</span> <span class="preprocessor"> EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperNE, val1, val2)</span></div><div class="line"><a name="l16649"></a><span class="lineno"><a class="line" href="gtest_8h.html#ae0f265632323b4a07b585dcfde10f60a">16649</a></span> <span class="preprocessor">#define EXPECT_LE(val1, val2) \</span></div><div class="line"><a name="l16650"></a><span class="lineno">16650</span> <span class="preprocessor"> EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val1, val2)</span></div><div class="line"><a name="l16651"></a><span class="lineno"><a class="line" href="gtest_8h.html#af28c06b2b5e8dee151896f299f6610cf">16651</a></span> <span class="preprocessor">#define EXPECT_LT(val1, val2) \</span></div><div class="line"><a name="l16652"></a><span class="lineno">16652</span> <span class="preprocessor"> EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLT, val1, val2)</span></div><div class="line"><a name="l16653"></a><span class="lineno"><a class="line" href="gtest_8h.html#ab7a0ff4bfa4d9b27baa118d8b0756ca0">16653</a></span> <span class="preprocessor">#define EXPECT_GE(val1, val2) \</span></div><div class="line"><a name="l16654"></a><span class="lineno">16654</span> <span class="preprocessor"> EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val1, val2)</span></div><div class="line"><a name="l16655"></a><span class="lineno"><a class="line" href="gtest_8h.html#aa8bc8320813e1abb0016129b636e3b27">16655</a></span> <span class="preprocessor">#define EXPECT_GT(val1, val2) \</span></div><div class="line"><a name="l16656"></a><span class="lineno">16656</span> <span class="preprocessor"> EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2)</span></div><div class="line"><a name="l16657"></a><span class="lineno">16657</span> </div><div class="line"><a name="l16658"></a><span class="lineno"><a class="line" href="gtest_8h.html#a8a7a47387090810cdfe78933d348182d">16658</a></span> <span class="preprocessor">#define GTEST_ASSERT_EQ(val1, val2) \</span></div><div class="line"><a name="l16659"></a><span class="lineno">16659</span> <span class="preprocessor"> ASSERT_PRED_FORMAT2(::testing::internal:: \</span></div><div class="line"><a name="l16660"></a><span class="lineno">16660</span> <span class="preprocessor"> EqHelper<GTEST_IS_NULL_LITERAL_(val1)>::Compare, \</span></div><div class="line"><a name="l16661"></a><span class="lineno">16661</span> <span class="preprocessor"> val1, val2)</span></div><div class="line"><a name="l16662"></a><span class="lineno"><a class="line" href="gtest_8h.html#a6fa9bb2b6731eba8f481e40e9e4931b3">16662</a></span> <span class="preprocessor">#define GTEST_ASSERT_NE(val1, val2) \</span></div><div class="line"><a name="l16663"></a><span class="lineno">16663</span> <span class="preprocessor"> ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperNE, val1, val2)</span></div><div class="line"><a name="l16664"></a><span class="lineno"><a class="line" href="gtest_8h.html#abef04dcd4a0259d378de7b3b3ffb6730">16664</a></span> <span class="preprocessor">#define GTEST_ASSERT_LE(val1, val2) \</span></div><div class="line"><a name="l16665"></a><span class="lineno">16665</span> <span class="preprocessor"> ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val1, val2)</span></div><div class="line"><a name="l16666"></a><span class="lineno"><a class="line" href="gtest_8h.html#a5a75667e637febd18e5f7d4f3abf55e8">16666</a></span> <span class="preprocessor">#define GTEST_ASSERT_LT(val1, val2) \</span></div><div class="line"><a name="l16667"></a><span class="lineno">16667</span> <span class="preprocessor"> ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperLT, val1, val2)</span></div><div class="line"><a name="l16668"></a><span class="lineno"><a class="line" href="gtest_8h.html#a55373d99c079ff1b894e2eb5bcd15c5a">16668</a></span> <span class="preprocessor">#define GTEST_ASSERT_GE(val1, val2) \</span></div><div class="line"><a name="l16669"></a><span class="lineno">16669</span> <span class="preprocessor"> ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val1, val2)</span></div><div class="line"><a name="l16670"></a><span class="lineno"><a class="line" href="gtest_8h.html#a088b9056fd1c1f316b41c22f64deb33a">16670</a></span> <span class="preprocessor">#define GTEST_ASSERT_GT(val1, val2) \</span></div><div class="line"><a name="l16671"></a><span class="lineno">16671</span> <span class="preprocessor"> ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2)</span></div><div class="line"><a name="l16672"></a><span class="lineno">16672</span> </div><div class="line"><a name="l16673"></a><span class="lineno">16673</span> <span class="comment">// Define macro GTEST_DONT_DEFINE_ASSERT_XY to 1 to omit the definition of</span></div><div class="line"><a name="l16674"></a><span class="lineno">16674</span> <span class="comment">// ASSERT_XY(), which clashes with some users' own code.</span></div><div class="line"><a name="l16675"></a><span class="lineno">16675</span> </div><div class="line"><a name="l16676"></a><span class="lineno">16676</span> <span class="preprocessor">#if !GTEST_DONT_DEFINE_ASSERT_EQ</span></div><div class="line"><a name="l16677"></a><span class="lineno"><a class="line" href="gtest_8h.html#a1a6db8b1338ee7040329322b77779086">16677</a></span> <span class="preprocessor"># define ASSERT_EQ(val1, val2) GTEST_ASSERT_EQ(val1, val2)</span></div><div class="line"><a name="l16678"></a><span class="lineno">16678</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l16679"></a><span class="lineno">16679</span> </div><div class="line"><a name="l16680"></a><span class="lineno">16680</span> <span class="preprocessor">#if !GTEST_DONT_DEFINE_ASSERT_NE</span></div><div class="line"><a name="l16681"></a><span class="lineno"><a class="line" href="gtest_8h.html#aa866c8dece57912e6f51495ed3e8d8d5">16681</a></span> <span class="preprocessor"># define ASSERT_NE(val1, val2) GTEST_ASSERT_NE(val1, val2)</span></div><div class="line"><a name="l16682"></a><span class="lineno">16682</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l16683"></a><span class="lineno">16683</span> </div><div class="line"><a name="l16684"></a><span class="lineno">16684</span> <span class="preprocessor">#if !GTEST_DONT_DEFINE_ASSERT_LE</span></div><div class="line"><a name="l16685"></a><span class="lineno"><a class="line" href="gtest_8h.html#a775643748feff0b490aae651d041e971">16685</a></span> <span class="preprocessor"># define ASSERT_LE(val1, val2) GTEST_ASSERT_LE(val1, val2)</span></div><div class="line"><a name="l16686"></a><span class="lineno">16686</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l16687"></a><span class="lineno">16687</span> </div><div class="line"><a name="l16688"></a><span class="lineno">16688</span> <span class="preprocessor">#if !GTEST_DONT_DEFINE_ASSERT_LT</span></div><div class="line"><a name="l16689"></a><span class="lineno"><a class="line" href="gtest_8h.html#affc4f9cae4c3aabfe60fced83737b42c">16689</a></span> <span class="preprocessor"># define ASSERT_LT(val1, val2) GTEST_ASSERT_LT(val1, val2)</span></div><div class="line"><a name="l16690"></a><span class="lineno">16690</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l16691"></a><span class="lineno">16691</span> </div><div class="line"><a name="l16692"></a><span class="lineno">16692</span> <span class="preprocessor">#if !GTEST_DONT_DEFINE_ASSERT_GE</span></div><div class="line"><a name="l16693"></a><span class="lineno"><a class="line" href="gtest_8h.html#af4ff5dc71479fcb374b6bc2ed195bcc4">16693</a></span> <span class="preprocessor"># define ASSERT_GE(val1, val2) GTEST_ASSERT_GE(val1, val2)</span></div><div class="line"><a name="l16694"></a><span class="lineno">16694</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l16695"></a><span class="lineno">16695</span> </div><div class="line"><a name="l16696"></a><span class="lineno">16696</span> <span class="preprocessor">#if !GTEST_DONT_DEFINE_ASSERT_GT</span></div><div class="line"><a name="l16697"></a><span class="lineno"><a class="line" href="gtest_8h.html#a16a882d4eafc9f8643867aea40879140">16697</a></span> <span class="preprocessor"># define ASSERT_GT(val1, val2) GTEST_ASSERT_GT(val1, val2)</span></div><div class="line"><a name="l16698"></a><span class="lineno">16698</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l16699"></a><span class="lineno">16699</span> </div><div class="line"><a name="l16700"></a><span class="lineno">16700</span> <span class="comment">// C-string Comparisons. All tests treat NULL and any non-NULL string</span></div><div class="line"><a name="l16701"></a><span class="lineno">16701</span> <span class="comment">// as different. Two NULLs are equal.</span></div><div class="line"><a name="l16702"></a><span class="lineno">16702</span> <span class="comment">//</span></div><div class="line"><a name="l16703"></a><span class="lineno">16703</span> <span class="comment">// * {ASSERT|EXPECT}_STREQ(s1, s2): Tests that s1 == s2</span></div><div class="line"><a name="l16704"></a><span class="lineno">16704</span> <span class="comment">// * {ASSERT|EXPECT}_STRNE(s1, s2): Tests that s1 != s2</span></div><div class="line"><a name="l16705"></a><span class="lineno">16705</span> <span class="comment">// * {ASSERT|EXPECT}_STRCASEEQ(s1, s2): Tests that s1 == s2, ignoring case</span></div><div class="line"><a name="l16706"></a><span class="lineno">16706</span> <span class="comment">// * {ASSERT|EXPECT}_STRCASENE(s1, s2): Tests that s1 != s2, ignoring case</span></div><div class="line"><a name="l16707"></a><span class="lineno">16707</span> <span class="comment">//</span></div><div class="line"><a name="l16708"></a><span class="lineno">16708</span> <span class="comment">// For wide or narrow string objects, you can use the</span></div><div class="line"><a name="l16709"></a><span class="lineno">16709</span> <span class="comment">// {ASSERT|EXPECT}_??() macros.</span></div><div class="line"><a name="l16710"></a><span class="lineno">16710</span> <span class="comment">//</span></div><div class="line"><a name="l16711"></a><span class="lineno">16711</span> <span class="comment">// Don't depend on the order in which the arguments are evaluated,</span></div><div class="line"><a name="l16712"></a><span class="lineno">16712</span> <span class="comment">// which is undefined.</span></div><div class="line"><a name="l16713"></a><span class="lineno">16713</span> <span class="comment">//</span></div><div class="line"><a name="l16714"></a><span class="lineno">16714</span> <span class="comment">// These macros evaluate their arguments exactly once.</span></div><div class="line"><a name="l16715"></a><span class="lineno">16715</span> </div><div class="line"><a name="l16716"></a><span class="lineno"><a class="line" href="gtest_8h.html#ad20f7b94ac5081e16f0005b94e95f0c6">16716</a></span> <span class="preprocessor">#define EXPECT_STREQ(s1, s2) \</span></div><div class="line"><a name="l16717"></a><span class="lineno">16717</span> <span class="preprocessor"> EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTREQ, s1, s2)</span></div><div class="line"><a name="l16718"></a><span class="lineno"><a class="line" href="gtest_8h.html#aee7e9c42f55549dbc0dfc42391eb9775">16718</a></span> <span class="preprocessor">#define EXPECT_STRNE(s1, s2) \</span></div><div class="line"><a name="l16719"></a><span class="lineno">16719</span> <span class="preprocessor"> EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRNE, s1, s2)</span></div><div class="line"><a name="l16720"></a><span class="lineno"><a class="line" href="gtest_8h.html#a740cab7e3eec5c178a64b4f558bde66e">16720</a></span> <span class="preprocessor">#define EXPECT_STRCASEEQ(s1, s2) \</span></div><div class="line"><a name="l16721"></a><span class="lineno">16721</span> <span class="preprocessor"> EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASEEQ, s1, s2)</span></div><div class="line"><a name="l16722"></a><span class="lineno"><a class="line" href="gtest_8h.html#a07d0b5cbd3b5f7c8b6f44c609046ff07">16722</a></span> <span class="preprocessor">#define EXPECT_STRCASENE(s1, s2)\</span></div><div class="line"><a name="l16723"></a><span class="lineno">16723</span> <span class="preprocessor"> EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASENE, s1, s2)</span></div><div class="line"><a name="l16724"></a><span class="lineno">16724</span> </div><div class="line"><a name="l16725"></a><span class="lineno"><a class="line" href="gtest_8h.html#a74f4189ea570bab9a65d47104659ef9c">16725</a></span> <span class="preprocessor">#define ASSERT_STREQ(s1, s2) \</span></div><div class="line"><a name="l16726"></a><span class="lineno">16726</span> <span class="preprocessor"> ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTREQ, s1, s2)</span></div><div class="line"><a name="l16727"></a><span class="lineno"><a class="line" href="gtest_8h.html#a3d679660ac1b2f9f6e6c7608452af923">16727</a></span> <span class="preprocessor">#define ASSERT_STRNE(s1, s2) \</span></div><div class="line"><a name="l16728"></a><span class="lineno">16728</span> <span class="preprocessor"> ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRNE, s1, s2)</span></div><div class="line"><a name="l16729"></a><span class="lineno"><a class="line" href="gtest_8h.html#a58847dd696200a3268361401dfcd0fa0">16729</a></span> <span class="preprocessor">#define ASSERT_STRCASEEQ(s1, s2) \</span></div><div class="line"><a name="l16730"></a><span class="lineno">16730</span> <span class="preprocessor"> ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASEEQ, s1, s2)</span></div><div class="line"><a name="l16731"></a><span class="lineno"><a class="line" href="gtest_8h.html#ac3d2c3836b103068a050f32585b2aaad">16731</a></span> <span class="preprocessor">#define ASSERT_STRCASENE(s1, s2)\</span></div><div class="line"><a name="l16732"></a><span class="lineno">16732</span> <span class="preprocessor"> ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASENE, s1, s2)</span></div><div class="line"><a name="l16733"></a><span class="lineno">16733</span> </div><div class="line"><a name="l16734"></a><span class="lineno">16734</span> <span class="comment">// Macros for comparing floating-point numbers.</span></div><div class="line"><a name="l16735"></a><span class="lineno">16735</span> <span class="comment">//</span></div><div class="line"><a name="l16736"></a><span class="lineno">16736</span> <span class="comment">// * {ASSERT|EXPECT}_FLOAT_EQ(val1, val2):</span></div><div class="line"><a name="l16737"></a><span class="lineno">16737</span> <span class="comment">// Tests that two float values are almost equal.</span></div><div class="line"><a name="l16738"></a><span class="lineno">16738</span> <span class="comment">// * {ASSERT|EXPECT}_DOUBLE_EQ(val1, val2):</span></div><div class="line"><a name="l16739"></a><span class="lineno">16739</span> <span class="comment">// Tests that two double values are almost equal.</span></div><div class="line"><a name="l16740"></a><span class="lineno">16740</span> <span class="comment">// * {ASSERT|EXPECT}_NEAR(v1, v2, abs_error):</span></div><div class="line"><a name="l16741"></a><span class="lineno">16741</span> <span class="comment">// Tests that v1 and v2 are within the given distance to each other.</span></div><div class="line"><a name="l16742"></a><span class="lineno">16742</span> <span class="comment">//</span></div><div class="line"><a name="l16743"></a><span class="lineno">16743</span> <span class="comment">// Google Test uses ULP-based comparison to automatically pick a default</span></div><div class="line"><a name="l16744"></a><span class="lineno">16744</span> <span class="comment">// error bound that is appropriate for the operands. See the</span></div><div class="line"><a name="l16745"></a><span class="lineno">16745</span> <span class="comment">// FloatingPoint template class in gtest-internal.h if you are</span></div><div class="line"><a name="l16746"></a><span class="lineno">16746</span> <span class="comment">// interested in the implementation details.</span></div><div class="line"><a name="l16747"></a><span class="lineno">16747</span> </div><div class="line"><a name="l16748"></a><span class="lineno"><a class="line" href="gtest_8h.html#a981e552322fb084042d02d6dfa9860ca">16748</a></span> <span class="preprocessor">#define EXPECT_FLOAT_EQ(val1, val2)\</span></div><div class="line"><a name="l16749"></a><span class="lineno">16749</span> <span class="preprocessor"> EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<float>, \</span></div><div class="line"><a name="l16750"></a><span class="lineno">16750</span> <span class="preprocessor"> val1, val2)</span></div><div class="line"><a name="l16751"></a><span class="lineno">16751</span> </div><div class="line"><a name="l16752"></a><span class="lineno"><a class="line" href="gtest_8h.html#ab4852f9430cf656690256ea7fe6323b8">16752</a></span> <span class="preprocessor">#define EXPECT_DOUBLE_EQ(val1, val2)\</span></div><div class="line"><a name="l16753"></a><span class="lineno">16753</span> <span class="preprocessor"> EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<double>, \</span></div><div class="line"><a name="l16754"></a><span class="lineno">16754</span> <span class="preprocessor"> val1, val2)</span></div><div class="line"><a name="l16755"></a><span class="lineno">16755</span> </div><div class="line"><a name="l16756"></a><span class="lineno"><a class="line" href="gtest_8h.html#a4663ffbf844baa54bdb29f9148fd0f96">16756</a></span> <span class="preprocessor">#define ASSERT_FLOAT_EQ(val1, val2)\</span></div><div class="line"><a name="l16757"></a><span class="lineno">16757</span> <span class="preprocessor"> ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<float>, \</span></div><div class="line"><a name="l16758"></a><span class="lineno">16758</span> <span class="preprocessor"> val1, val2)</span></div><div class="line"><a name="l16759"></a><span class="lineno">16759</span> </div><div class="line"><a name="l16760"></a><span class="lineno"><a class="line" href="gtest_8h.html#a6617da62e5ae5490995a3bfca1f331a9">16760</a></span> <span class="preprocessor">#define ASSERT_DOUBLE_EQ(val1, val2)\</span></div><div class="line"><a name="l16761"></a><span class="lineno">16761</span> <span class="preprocessor"> ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<double>, \</span></div><div class="line"><a name="l16762"></a><span class="lineno">16762</span> <span class="preprocessor"> val1, val2)</span></div><div class="line"><a name="l16763"></a><span class="lineno">16763</span> </div><div class="line"><a name="l16764"></a><span class="lineno"><a class="line" href="gtest_8h.html#a88cd7978af0e7dbd42cd606dfabdcc6f">16764</a></span> <span class="preprocessor">#define EXPECT_NEAR(val1, val2, abs_error)\</span></div><div class="line"><a name="l16765"></a><span class="lineno">16765</span> <span class="preprocessor"> EXPECT_PRED_FORMAT3(::testing::internal::DoubleNearPredFormat, \</span></div><div class="line"><a name="l16766"></a><span class="lineno">16766</span> <span class="preprocessor"> val1, val2, abs_error)</span></div><div class="line"><a name="l16767"></a><span class="lineno">16767</span> </div><div class="line"><a name="l16768"></a><span class="lineno"><a class="line" href="gtest_8h.html#a73cce6b752d204f91a36bef2f8e663b3">16768</a></span> <span class="preprocessor">#define ASSERT_NEAR(val1, val2, abs_error)\</span></div><div class="line"><a name="l16769"></a><span class="lineno">16769</span> <span class="preprocessor"> ASSERT_PRED_FORMAT3(::testing::internal::DoubleNearPredFormat, \</span></div><div class="line"><a name="l16770"></a><span class="lineno">16770</span> <span class="preprocessor"> val1, val2, abs_error)</span></div><div class="line"><a name="l16771"></a><span class="lineno">16771</span> </div><div class="line"><a name="l16772"></a><span class="lineno">16772</span> <span class="comment">// These predicate format functions work on floating-point values, and</span></div><div class="line"><a name="l16773"></a><span class="lineno">16773</span> <span class="comment">// can be used in {ASSERT|EXPECT}_PRED_FORMAT2*(), e.g.</span></div><div class="line"><a name="l16774"></a><span class="lineno">16774</span> <span class="comment">//</span></div><div class="line"><a name="l16775"></a><span class="lineno">16775</span> <span class="comment">// EXPECT_PRED_FORMAT2(testing::DoubleLE, Foo(), 5.0);</span></div><div class="line"><a name="l16776"></a><span class="lineno">16776</span> </div><div class="line"><a name="l16777"></a><span class="lineno">16777</span> <span class="comment">// Asserts that val1 is less than, or almost equal to, val2. Fails</span></div><div class="line"><a name="l16778"></a><span class="lineno">16778</span> <span class="comment">// otherwise. In particular, it fails if either val1 or val2 is NaN.</span></div><div class="line"><a name="l16779"></a><span class="lineno">16779</span> <a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> AssertionResult <a class="code" href="namespacetesting.html#a69106491c2e7f50e50da0ce5e8ae4374">FloatLE</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* expr1, <span class="keyword">const</span> <span class="keywordtype">char</span>* expr2,</div><div class="line"><a name="l16780"></a><span class="lineno">16780</span>  <span class="keywordtype">float</span> val1, <span class="keywordtype">float</span> val2);</div><div class="line"><a name="l16781"></a><span class="lineno">16781</span> <a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> AssertionResult <a class="code" href="namespacetesting.html#a84c020b981d0eb4eabfb0feda155aaaf">DoubleLE</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* expr1, <span class="keyword">const</span> <span class="keywordtype">char</span>* expr2,</div><div class="line"><a name="l16782"></a><span class="lineno">16782</span>  <span class="keywordtype">double</span> val1, <span class="keywordtype">double</span> val2);</div><div class="line"><a name="l16783"></a><span class="lineno">16783</span> </div><div class="line"><a name="l16784"></a><span class="lineno">16784</span> </div><div class="line"><a name="l16785"></a><span class="lineno">16785</span> <span class="preprocessor">#if GTEST_OS_WINDOWS</span></div><div class="line"><a name="l16786"></a><span class="lineno">16786</span> </div><div class="line"><a name="l16787"></a><span class="lineno">16787</span> <span class="comment">// Macros that test for HRESULT failure and success, these are only useful</span></div><div class="line"><a name="l16788"></a><span class="lineno">16788</span> <span class="comment">// on Windows, and rely on Windows SDK macros and APIs to compile.</span></div><div class="line"><a name="l16789"></a><span class="lineno">16789</span> <span class="comment">//</span></div><div class="line"><a name="l16790"></a><span class="lineno">16790</span> <span class="comment">// * {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED}(expr)</span></div><div class="line"><a name="l16791"></a><span class="lineno">16791</span> <span class="comment">//</span></div><div class="line"><a name="l16792"></a><span class="lineno">16792</span> <span class="comment">// When expr unexpectedly fails or succeeds, Google Test prints the</span></div><div class="line"><a name="l16793"></a><span class="lineno">16793</span> <span class="comment">// expected result and the actual result with both a human-readable</span></div><div class="line"><a name="l16794"></a><span class="lineno">16794</span> <span class="comment">// string representation of the error, if available, as well as the</span></div><div class="line"><a name="l16795"></a><span class="lineno">16795</span> <span class="comment">// hex result code.</span></div><div class="line"><a name="l16796"></a><span class="lineno">16796</span> <span class="preprocessor"># define EXPECT_HRESULT_SUCCEEDED(expr) \</span></div><div class="line"><a name="l16797"></a><span class="lineno">16797</span> <span class="preprocessor"> EXPECT_PRED_FORMAT1(::testing::internal::IsHRESULTSuccess, (expr))</span></div><div class="line"><a name="l16798"></a><span class="lineno">16798</span> </div><div class="line"><a name="l16799"></a><span class="lineno">16799</span> <span class="preprocessor"># define ASSERT_HRESULT_SUCCEEDED(expr) \</span></div><div class="line"><a name="l16800"></a><span class="lineno">16800</span> <span class="preprocessor"> ASSERT_PRED_FORMAT1(::testing::internal::IsHRESULTSuccess, (expr))</span></div><div class="line"><a name="l16801"></a><span class="lineno">16801</span> </div><div class="line"><a name="l16802"></a><span class="lineno">16802</span> <span class="preprocessor"># define EXPECT_HRESULT_FAILED(expr) \</span></div><div class="line"><a name="l16803"></a><span class="lineno">16803</span> <span class="preprocessor"> EXPECT_PRED_FORMAT1(::testing::internal::IsHRESULTFailure, (expr))</span></div><div class="line"><a name="l16804"></a><span class="lineno">16804</span> </div><div class="line"><a name="l16805"></a><span class="lineno">16805</span> <span class="preprocessor"># define ASSERT_HRESULT_FAILED(expr) \</span></div><div class="line"><a name="l16806"></a><span class="lineno">16806</span> <span class="preprocessor"> ASSERT_PRED_FORMAT1(::testing::internal::IsHRESULTFailure, (expr))</span></div><div class="line"><a name="l16807"></a><span class="lineno">16807</span> </div><div class="line"><a name="l16808"></a><span class="lineno">16808</span> <span class="preprocessor">#endif // GTEST_OS_WINDOWS</span></div><div class="line"><a name="l16809"></a><span class="lineno">16809</span> </div><div class="line"><a name="l16810"></a><span class="lineno">16810</span> <span class="comment">// Macros that execute statement and check that it doesn't generate new fatal</span></div><div class="line"><a name="l16811"></a><span class="lineno">16811</span> <span class="comment">// failures in the current thread.</span></div><div class="line"><a name="l16812"></a><span class="lineno">16812</span> <span class="comment">//</span></div><div class="line"><a name="l16813"></a><span class="lineno">16813</span> <span class="comment">// * {ASSERT|EXPECT}_NO_FATAL_FAILURE(statement);</span></div><div class="line"><a name="l16814"></a><span class="lineno">16814</span> <span class="comment">//</span></div><div class="line"><a name="l16815"></a><span class="lineno">16815</span> <span class="comment">// Examples:</span></div><div class="line"><a name="l16816"></a><span class="lineno">16816</span> <span class="comment">//</span></div><div class="line"><a name="l16817"></a><span class="lineno">16817</span> <span class="comment">// EXPECT_NO_FATAL_FAILURE(Process());</span></div><div class="line"><a name="l16818"></a><span class="lineno">16818</span> <span class="comment">// ASSERT_NO_FATAL_FAILURE(Process()) << "Process() failed";</span></div><div class="line"><a name="l16819"></a><span class="lineno">16819</span> <span class="comment">//</span></div><div class="line"><a name="l16820"></a><span class="lineno"><a class="line" href="gtest_8h.html#a5034fda3490aad5a93942ac83f4cea49">16820</a></span> <span class="preprocessor">#define ASSERT_NO_FATAL_FAILURE(statement) \</span></div><div class="line"><a name="l16821"></a><span class="lineno">16821</span> <span class="preprocessor"> GTEST_TEST_NO_FATAL_FAILURE_(statement, GTEST_FATAL_FAILURE_)</span></div><div class="line"><a name="l16822"></a><span class="lineno"><a class="line" href="gtest_8h.html#a067c02ccaf3171d6e1781cd0f8cdcf74">16822</a></span> <span class="preprocessor">#define EXPECT_NO_FATAL_FAILURE(statement) \</span></div><div class="line"><a name="l16823"></a><span class="lineno">16823</span> <span class="preprocessor"> GTEST_TEST_NO_FATAL_FAILURE_(statement, GTEST_NONFATAL_FAILURE_)</span></div><div class="line"><a name="l16824"></a><span class="lineno">16824</span> </div><div class="line"><a name="l16825"></a><span class="lineno">16825</span> <span class="comment">// Causes a trace (including the given source file path and line number,</span></div><div class="line"><a name="l16826"></a><span class="lineno">16826</span> <span class="comment">// and the given message) to be included in every test failure message generated</span></div><div class="line"><a name="l16827"></a><span class="lineno">16827</span> <span class="comment">// by code in the scope of the lifetime of an instance of this class. The effect</span></div><div class="line"><a name="l16828"></a><span class="lineno">16828</span> <span class="comment">// is undone with the destruction of the instance.</span></div><div class="line"><a name="l16829"></a><span class="lineno">16829</span> <span class="comment">//</span></div><div class="line"><a name="l16830"></a><span class="lineno">16830</span> <span class="comment">// The message argument can be anything streamable to std::ostream.</span></div><div class="line"><a name="l16831"></a><span class="lineno">16831</span> <span class="comment">//</span></div><div class="line"><a name="l16832"></a><span class="lineno">16832</span> <span class="comment">// Example:</span></div><div class="line"><a name="l16833"></a><span class="lineno">16833</span> <span class="comment">// testing::ScopedTrace trace("file.cc", 123, "message");</span></div><div class="line"><a name="l16834"></a><span class="lineno">16834</span> <span class="comment">//</span></div><div class="line"><a name="l16835"></a><span class="lineno"><a class="line" href="classtesting_1_1_scoped_trace.html">16835</a></span> <span class="keyword">class </span><a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> <a class="code" href="classtesting_1_1_scoped_trace.html">ScopedTrace</a> {</div><div class="line"><a name="l16836"></a><span class="lineno">16836</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l16837"></a><span class="lineno">16837</span>  <span class="comment">// The c'tor pushes the given source file location and message onto</span></div><div class="line"><a name="l16838"></a><span class="lineno">16838</span>  <span class="comment">// a trace stack maintained by Google Test.</span></div><div class="line"><a name="l16839"></a><span class="lineno">16839</span> </div><div class="line"><a name="l16840"></a><span class="lineno">16840</span>  <span class="comment">// Template version. Uses Message() to convert the values into strings.</span></div><div class="line"><a name="l16841"></a><span class="lineno">16841</span>  <span class="comment">// Slow, but flexible.</span></div><div class="line"><a name="l16842"></a><span class="lineno">16842</span>  <span class="keyword">template</span> <<span class="keyword">typename</span> T></div><div class="line"><a name="l16843"></a><span class="lineno"><a class="line" href="classtesting_1_1_scoped_trace.html#a2da90b95d682d518cca472934d53c59c">16843</a></span>  <a class="code" href="classtesting_1_1_scoped_trace.html#a2da90b95d682d518cca472934d53c59c">ScopedTrace</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* file, <span class="keywordtype">int</span> line, <span class="keyword">const</span> T& message) {</div><div class="line"><a name="l16844"></a><span class="lineno">16844</span>  PushTrace(file, line, (<a class="code" href="classtesting_1_1_message.html">Message</a>() << message).GetString());</div><div class="line"><a name="l16845"></a><span class="lineno">16845</span>  }</div><div class="line"><a name="l16846"></a><span class="lineno">16846</span> </div><div class="line"><a name="l16847"></a><span class="lineno">16847</span>  <span class="comment">// Optimize for some known types.</span></div><div class="line"><a name="l16848"></a><span class="lineno"><a class="line" href="classtesting_1_1_scoped_trace.html#accd2a06cc941ffd7d6fe109adfdb4f19">16848</a></span>  <a class="code" href="classtesting_1_1_scoped_trace.html#accd2a06cc941ffd7d6fe109adfdb4f19">ScopedTrace</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* file, <span class="keywordtype">int</span> line, <span class="keyword">const</span> <span class="keywordtype">char</span>* message) {</div><div class="line"><a name="l16849"></a><span class="lineno">16849</span>  PushTrace(file, line, message ? message : <span class="stringliteral">"(null)"</span>);</div><div class="line"><a name="l16850"></a><span class="lineno">16850</span>  }</div><div class="line"><a name="l16851"></a><span class="lineno">16851</span> </div><div class="line"><a name="l16852"></a><span class="lineno">16852</span> <span class="preprocessor">#if GTEST_HAS_GLOBAL_STRING</span></div><div class="line"><a name="l16853"></a><span class="lineno">16853</span>  <a class="code" href="classtesting_1_1_scoped_trace.html">ScopedTrace</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* file, <span class="keywordtype">int</span> line, <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">const ::string</a>& message) {</div><div class="line"><a name="l16854"></a><span class="lineno">16854</span>  PushTrace(file, line, message);</div><div class="line"><a name="l16855"></a><span class="lineno">16855</span>  }</div><div class="line"><a name="l16856"></a><span class="lineno">16856</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l16857"></a><span class="lineno">16857</span> </div><div class="line"><a name="l16858"></a><span class="lineno"><a class="line" href="classtesting_1_1_scoped_trace.html#a1f453a2aade0db6955a111a7cb329615">16858</a></span>  <a class="code" href="classtesting_1_1_scoped_trace.html#a1f453a2aade0db6955a111a7cb329615">ScopedTrace</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* file, <span class="keywordtype">int</span> line, <span class="keyword">const</span> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a>& message) {</div><div class="line"><a name="l16859"></a><span class="lineno">16859</span>  PushTrace(file, line, message);</div><div class="line"><a name="l16860"></a><span class="lineno">16860</span>  }</div><div class="line"><a name="l16861"></a><span class="lineno">16861</span> </div><div class="line"><a name="l16862"></a><span class="lineno">16862</span>  <span class="comment">// The d'tor pops the info pushed by the c'tor.</span></div><div class="line"><a name="l16863"></a><span class="lineno">16863</span>  <span class="comment">//</span></div><div class="line"><a name="l16864"></a><span class="lineno">16864</span>  <span class="comment">// Note that the d'tor is not virtual in order to be efficient.</span></div><div class="line"><a name="l16865"></a><span class="lineno">16865</span>  <span class="comment">// Don't inherit from ScopedTrace!</span></div><div class="line"><a name="l16866"></a><span class="lineno">16866</span>  ~<a class="code" href="classtesting_1_1_scoped_trace.html">ScopedTrace</a>();</div><div class="line"><a name="l16867"></a><span class="lineno">16867</span> </div><div class="line"><a name="l16868"></a><span class="lineno">16868</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l16869"></a><span class="lineno">16869</span>  <span class="keywordtype">void</span> PushTrace(<span class="keyword">const</span> <span class="keywordtype">char</span>* file, <span class="keywordtype">int</span> line, <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a> message);</div><div class="line"><a name="l16870"></a><span class="lineno">16870</span> </div><div class="line"><a name="l16871"></a><span class="lineno">16871</span>  <a class="code" href="gtest_8h.html#aed8c1888c32b588b0681e88b95031e29">GTEST_DISALLOW_COPY_AND_ASSIGN_</a>(<a class="code" href="classtesting_1_1_scoped_trace.html">ScopedTrace</a>);</div><div class="line"><a name="l16872"></a><span class="lineno">16872</span> } <a class="code" href="namespacetesting.html#aa09221196f0a830d5bf1c63ffce69dc3">GTEST_ATTRIBUTE_UNUSED_</a>; <span class="comment">// A ScopedTrace object does its job in its</span></div><div class="line"><a name="l16873"></a><span class="lineno">16873</span>  <span class="comment">// c'tor and d'tor. Therefore it doesn't</span></div><div class="line"><a name="l16874"></a><span class="lineno">16874</span>  <span class="comment">// need to be used otherwise.</span></div><div class="line"><a name="l16875"></a><span class="lineno">16875</span> </div><div class="line"><a name="l16876"></a><span class="lineno">16876</span> <span class="comment">// Causes a trace (including the source file path, the current line</span></div><div class="line"><a name="l16877"></a><span class="lineno">16877</span> <span class="comment">// number, and the given message) to be included in every test failure</span></div><div class="line"><a name="l16878"></a><span class="lineno">16878</span> <span class="comment">// message generated by code in the current scope. The effect is</span></div><div class="line"><a name="l16879"></a><span class="lineno">16879</span> <span class="comment">// undone when the control leaves the current scope.</span></div><div class="line"><a name="l16880"></a><span class="lineno">16880</span> <span class="comment">//</span></div><div class="line"><a name="l16881"></a><span class="lineno">16881</span> <span class="comment">// The message argument can be anything streamable to std::ostream.</span></div><div class="line"><a name="l16882"></a><span class="lineno">16882</span> <span class="comment">//</span></div><div class="line"><a name="l16883"></a><span class="lineno">16883</span> <span class="comment">// In the implementation, we include the current line number as part</span></div><div class="line"><a name="l16884"></a><span class="lineno">16884</span> <span class="comment">// of the dummy variable name, thus allowing multiple SCOPED_TRACE()s</span></div><div class="line"><a name="l16885"></a><span class="lineno">16885</span> <span class="comment">// to appear in the same block - as long as they are on different</span></div><div class="line"><a name="l16886"></a><span class="lineno">16886</span> <span class="comment">// lines.</span></div><div class="line"><a name="l16887"></a><span class="lineno">16887</span> <span class="comment">//</span></div><div class="line"><a name="l16888"></a><span class="lineno">16888</span> <span class="comment">// Assuming that each thread maintains its own stack of traces.</span></div><div class="line"><a name="l16889"></a><span class="lineno">16889</span> <span class="comment">// Therefore, a SCOPED_TRACE() would (correctly) only affect the</span></div><div class="line"><a name="l16890"></a><span class="lineno">16890</span> <span class="comment">// assertions in its own thread.</span></div><div class="line"><a name="l16891"></a><span class="lineno"><a class="line" href="gtest_8h.html#a4dac08f15adc8cb1ee0e5c1bfb0f440d">16891</a></span> <span class="preprocessor">#define SCOPED_TRACE(message) \</span></div><div class="line"><a name="l16892"></a><span class="lineno">16892</span> <span class="preprocessor"> ::testing::ScopedTrace GTEST_CONCAT_TOKEN_(gtest_trace_, __LINE__)(\</span></div><div class="line"><a name="l16893"></a><span class="lineno">16893</span> <span class="preprocessor"> __FILE__, __LINE__, (message))</span></div><div class="line"><a name="l16894"></a><span class="lineno">16894</span> </div><div class="line"><a name="l16895"></a><span class="lineno">16895</span> </div><div class="line"><a name="l16896"></a><span class="lineno">16896</span> <span class="comment">// Compile-time assertion for type equality.</span></div><div class="line"><a name="l16897"></a><span class="lineno">16897</span> <span class="comment">// StaticAssertTypeEq<type1, type2>() compiles iff type1 and type2 are</span></div><div class="line"><a name="l16898"></a><span class="lineno">16898</span> <span class="comment">// the same type. The value it returns is not interesting.</span></div><div class="line"><a name="l16899"></a><span class="lineno">16899</span> <span class="comment">//</span></div><div class="line"><a name="l16900"></a><span class="lineno">16900</span> <span class="comment">// Instead of making StaticAssertTypeEq a class template, we make it a</span></div><div class="line"><a name="l16901"></a><span class="lineno">16901</span> <span class="comment">// function template that invokes a helper class template. This</span></div><div class="line"><a name="l16902"></a><span class="lineno">16902</span> <span class="comment">// prevents a user from misusing StaticAssertTypeEq<T1, T2> by</span></div><div class="line"><a name="l16903"></a><span class="lineno">16903</span> <span class="comment">// defining objects of that type.</span></div><div class="line"><a name="l16904"></a><span class="lineno">16904</span> <span class="comment">//</span></div><div class="line"><a name="l16905"></a><span class="lineno">16905</span> <span class="comment">// CAVEAT:</span></div><div class="line"><a name="l16906"></a><span class="lineno">16906</span> <span class="comment">//</span></div><div class="line"><a name="l16907"></a><span class="lineno">16907</span> <span class="comment">// When used inside a method of a class template,</span></div><div class="line"><a name="l16908"></a><span class="lineno">16908</span> <span class="comment">// StaticAssertTypeEq<T1, T2>() is effective ONLY IF the method is</span></div><div class="line"><a name="l16909"></a><span class="lineno">16909</span> <span class="comment">// instantiated. For example, given:</span></div><div class="line"><a name="l16910"></a><span class="lineno">16910</span> <span class="comment">//</span></div><div class="line"><a name="l16911"></a><span class="lineno">16911</span> <span class="comment">// template <typename T> class Foo {</span></div><div class="line"><a name="l16912"></a><span class="lineno">16912</span> <span class="comment">// public:</span></div><div class="line"><a name="l16913"></a><span class="lineno">16913</span> <span class="comment">// void Bar() { testing::StaticAssertTypeEq<int, T>(); }</span></div><div class="line"><a name="l16914"></a><span class="lineno">16914</span> <span class="comment">// };</span></div><div class="line"><a name="l16915"></a><span class="lineno">16915</span> <span class="comment">//</span></div><div class="line"><a name="l16916"></a><span class="lineno">16916</span> <span class="comment">// the code:</span></div><div class="line"><a name="l16917"></a><span class="lineno">16917</span> <span class="comment">//</span></div><div class="line"><a name="l16918"></a><span class="lineno">16918</span> <span class="comment">// void Test1() { Foo<bool> foo; }</span></div><div class="line"><a name="l16919"></a><span class="lineno">16919</span> <span class="comment">//</span></div><div class="line"><a name="l16920"></a><span class="lineno">16920</span> <span class="comment">// will NOT generate a compiler error, as Foo<bool>::Bar() is never</span></div><div class="line"><a name="l16921"></a><span class="lineno">16921</span> <span class="comment">// actually instantiated. Instead, you need:</span></div><div class="line"><a name="l16922"></a><span class="lineno">16922</span> <span class="comment">//</span></div><div class="line"><a name="l16923"></a><span class="lineno">16923</span> <span class="comment">// void Test2() { Foo<bool> foo; foo.Bar(); }</span></div><div class="line"><a name="l16924"></a><span class="lineno">16924</span> <span class="comment">//</span></div><div class="line"><a name="l16925"></a><span class="lineno">16925</span> <span class="comment">// to cause a compiler error.</span></div><div class="line"><a name="l16926"></a><span class="lineno">16926</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2></div><div class="line"><a name="l16927"></a><span class="lineno"><a class="line" href="namespacetesting.html#a661e70fc6afeb5c085eed3716aa45059">16927</a></span> <span class="keywordtype">bool</span> <a class="code" href="namespacetesting.html#a661e70fc6afeb5c085eed3716aa45059">StaticAssertTypeEq</a>() {</div><div class="line"><a name="l16928"></a><span class="lineno">16928</span>  (void)<a class="code" href="structtesting_1_1internal_1_1_static_assert_type_eq_helper.html">internal::StaticAssertTypeEqHelper<T1, T2></a>();</div><div class="line"><a name="l16929"></a><span class="lineno">16929</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l16930"></a><span class="lineno">16930</span> }</div><div class="line"><a name="l16931"></a><span class="lineno">16931</span> </div><div class="line"><a name="l16932"></a><span class="lineno">16932</span> <span class="comment">// Defines a test.</span></div><div class="line"><a name="l16933"></a><span class="lineno">16933</span> <span class="comment">//</span></div><div class="line"><a name="l16934"></a><span class="lineno">16934</span> <span class="comment">// The first parameter is the name of the test suite, and the second</span></div><div class="line"><a name="l16935"></a><span class="lineno">16935</span> <span class="comment">// parameter is the name of the test within the test suite.</span></div><div class="line"><a name="l16936"></a><span class="lineno">16936</span> <span class="comment">//</span></div><div class="line"><a name="l16937"></a><span class="lineno">16937</span> <span class="comment">// The convention is to end the test suite name with "Test". For</span></div><div class="line"><a name="l16938"></a><span class="lineno">16938</span> <span class="comment">// example, a test suite for the Foo class can be named FooTest.</span></div><div class="line"><a name="l16939"></a><span class="lineno">16939</span> <span class="comment">//</span></div><div class="line"><a name="l16940"></a><span class="lineno">16940</span> <span class="comment">// Test code should appear between braces after an invocation of</span></div><div class="line"><a name="l16941"></a><span class="lineno">16941</span> <span class="comment">// this macro. Example:</span></div><div class="line"><a name="l16942"></a><span class="lineno">16942</span> <span class="comment">//</span></div><div class="line"><a name="l16943"></a><span class="lineno">16943</span> <span class="comment">// TEST(FooTest, InitializesCorrectly) {</span></div><div class="line"><a name="l16944"></a><span class="lineno">16944</span> <span class="comment">// Foo foo;</span></div><div class="line"><a name="l16945"></a><span class="lineno">16945</span> <span class="comment">// EXPECT_TRUE(foo.StatusIsOK());</span></div><div class="line"><a name="l16946"></a><span class="lineno">16946</span> <span class="comment">// }</span></div><div class="line"><a name="l16947"></a><span class="lineno">16947</span> </div><div class="line"><a name="l16948"></a><span class="lineno">16948</span> <span class="comment">// Note that we call GetTestTypeId() instead of GetTypeId<</span></div><div class="line"><a name="l16949"></a><span class="lineno">16949</span> <span class="comment">// ::testing::Test>() here to get the type ID of testing::Test. This</span></div><div class="line"><a name="l16950"></a><span class="lineno">16950</span> <span class="comment">// is to work around a suspected linker bug when using Google Test as</span></div><div class="line"><a name="l16951"></a><span class="lineno">16951</span> <span class="comment">// a framework on Mac OS X. The bug causes GetTypeId<</span></div><div class="line"><a name="l16952"></a><span class="lineno">16952</span> <span class="comment">// ::testing::Test>() to return different values depending on whether</span></div><div class="line"><a name="l16953"></a><span class="lineno">16953</span> <span class="comment">// the call is from the Google Test framework itself or from user test</span></div><div class="line"><a name="l16954"></a><span class="lineno">16954</span> <span class="comment">// code. GetTestTypeId() is guaranteed to always return the same</span></div><div class="line"><a name="l16955"></a><span class="lineno">16955</span> <span class="comment">// value, as it always calls GetTypeId<>() from the Google Test</span></div><div class="line"><a name="l16956"></a><span class="lineno">16956</span> <span class="comment">// framework.</span></div><div class="line"><a name="l16957"></a><span class="lineno"><a class="line" href="gtest_8h.html#a216a746d9241b1f42fdd4449698a4d8d">16957</a></span> <span class="preprocessor">#define GTEST_TEST(test_suite_name, test_name) \</span></div><div class="line"><a name="l16958"></a><span class="lineno">16958</span> <span class="preprocessor"> GTEST_TEST_(test_suite_name, test_name, ::testing::Test, \</span></div><div class="line"><a name="l16959"></a><span class="lineno">16959</span> <span class="preprocessor"> ::testing::internal::GetTestTypeId())</span></div><div class="line"><a name="l16960"></a><span class="lineno">16960</span> </div><div class="line"><a name="l16961"></a><span class="lineno">16961</span> <span class="comment">// Define this macro to 1 to omit the definition of TEST(), which</span></div><div class="line"><a name="l16962"></a><span class="lineno">16962</span> <span class="comment">// is a generic name and clashes with some other libraries.</span></div><div class="line"><a name="l16963"></a><span class="lineno">16963</span> <span class="preprocessor">#if !GTEST_DONT_DEFINE_TEST</span></div><div class="line"><a name="l16964"></a><span class="lineno"><a class="line" href="gtest_8h.html#ab5540a6d621853916be8240ff51819cf">16964</a></span> <span class="preprocessor">#define TEST(test_suite_name, test_name) GTEST_TEST(test_suite_name, test_name)</span></div><div class="line"><a name="l16965"></a><span class="lineno">16965</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l16966"></a><span class="lineno">16966</span> </div><div class="line"><a name="l16967"></a><span class="lineno">16967</span> <span class="comment">// Defines a test that uses a test fixture.</span></div><div class="line"><a name="l16968"></a><span class="lineno">16968</span> <span class="comment">//</span></div><div class="line"><a name="l16969"></a><span class="lineno">16969</span> <span class="comment">// The first parameter is the name of the test fixture class, which</span></div><div class="line"><a name="l16970"></a><span class="lineno">16970</span> <span class="comment">// also doubles as the test suite name. The second parameter is the</span></div><div class="line"><a name="l16971"></a><span class="lineno">16971</span> <span class="comment">// name of the test within the test suite.</span></div><div class="line"><a name="l16972"></a><span class="lineno">16972</span> <span class="comment">//</span></div><div class="line"><a name="l16973"></a><span class="lineno">16973</span> <span class="comment">// A test fixture class must be declared earlier. The user should put</span></div><div class="line"><a name="l16974"></a><span class="lineno">16974</span> <span class="comment">// the test code between braces after using this macro. Example:</span></div><div class="line"><a name="l16975"></a><span class="lineno">16975</span> <span class="comment">//</span></div><div class="line"><a name="l16976"></a><span class="lineno">16976</span> <span class="comment">// class FooTest : public testing::Test {</span></div><div class="line"><a name="l16977"></a><span class="lineno">16977</span> <span class="comment">// protected:</span></div><div class="line"><a name="l16978"></a><span class="lineno">16978</span> <span class="comment">// virtual void SetUp() { b_.AddElement(3); }</span></div><div class="line"><a name="l16979"></a><span class="lineno">16979</span> <span class="comment">//</span></div><div class="line"><a name="l16980"></a><span class="lineno">16980</span> <span class="comment">// Foo a_;</span></div><div class="line"><a name="l16981"></a><span class="lineno">16981</span> <span class="comment">// Foo b_;</span></div><div class="line"><a name="l16982"></a><span class="lineno">16982</span> <span class="comment">// };</span></div><div class="line"><a name="l16983"></a><span class="lineno">16983</span> <span class="comment">//</span></div><div class="line"><a name="l16984"></a><span class="lineno">16984</span> <span class="comment">// TEST_F(FooTest, InitializesCorrectly) {</span></div><div class="line"><a name="l16985"></a><span class="lineno">16985</span> <span class="comment">// EXPECT_TRUE(a_.StatusIsOK());</span></div><div class="line"><a name="l16986"></a><span class="lineno">16986</span> <span class="comment">// }</span></div><div class="line"><a name="l16987"></a><span class="lineno">16987</span> <span class="comment">//</span></div><div class="line"><a name="l16988"></a><span class="lineno">16988</span> <span class="comment">// TEST_F(FooTest, ReturnsElementCountCorrectly) {</span></div><div class="line"><a name="l16989"></a><span class="lineno">16989</span> <span class="comment">// EXPECT_EQ(a_.size(), 0);</span></div><div class="line"><a name="l16990"></a><span class="lineno">16990</span> <span class="comment">// EXPECT_EQ(b_.size(), 1);</span></div><div class="line"><a name="l16991"></a><span class="lineno">16991</span> <span class="comment">// }</span></div><div class="line"><a name="l16992"></a><span class="lineno">16992</span> </div><div class="line"><a name="l16993"></a><span class="lineno"><a class="line" href="gtest_8h.html#a0ee66d464d1a06c20c1929cae09d8758">16993</a></span> <span class="preprocessor">#define TEST_F(test_fixture, test_name)\</span></div><div class="line"><a name="l16994"></a><span class="lineno">16994</span> <span class="preprocessor"> GTEST_TEST_(test_fixture, test_name, test_fixture, \</span></div><div class="line"><a name="l16995"></a><span class="lineno">16995</span> <span class="preprocessor"> ::testing::internal::GetTypeId<test_fixture>())</span></div><div class="line"><a name="l16996"></a><span class="lineno">16996</span> </div><div class="line"><a name="l16997"></a><span class="lineno">16997</span> <span class="comment">// Returns a path to temporary directory.</span></div><div class="line"><a name="l16998"></a><span class="lineno">16998</span> <span class="comment">// Tries to determine an appropriate directory for the platform.</span></div><div class="line"><a name="l16999"></a><span class="lineno">16999</span> <a class="code" href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a> <a class="code" href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">std::string</a> <a class="code" href="namespacetesting.html#abcf5181cecc3c07915dceb3de46ab07f">TempDir</a>();</div><div class="line"><a name="l17000"></a><span class="lineno">17000</span> </div><div class="line"><a name="l17001"></a><span class="lineno">17001</span> <span class="preprocessor">#ifdef _MSC_VER</span></div><div class="line"><a name="l17002"></a><span class="lineno">17002</span> <span class="preprocessor"># pragma warning(pop)</span></div><div class="line"><a name="l17003"></a><span class="lineno">17003</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l17004"></a><span class="lineno">17004</span> </div><div class="line"><a name="l17005"></a><span class="lineno">17005</span> <span class="comment">// Dynamically registers a test with the framework.</span></div><div class="line"><a name="l17006"></a><span class="lineno">17006</span> <span class="comment">//</span></div><div class="line"><a name="l17007"></a><span class="lineno">17007</span> <span class="comment">// This is an advanced API only to be used when the `TEST` macros are</span></div><div class="line"><a name="l17008"></a><span class="lineno">17008</span> <span class="comment">// insufficient. The macros should be preferred when possible, as they avoid</span></div><div class="line"><a name="l17009"></a><span class="lineno">17009</span> <span class="comment">// most of the complexity of calling this function.</span></div><div class="line"><a name="l17010"></a><span class="lineno">17010</span> <span class="comment">//</span></div><div class="line"><a name="l17011"></a><span class="lineno">17011</span> <span class="comment">// The `factory` argument is a factory callable (move-constructible) object or</span></div><div class="line"><a name="l17012"></a><span class="lineno">17012</span> <span class="comment">// function pointer that creates a new instance of the Test object. It</span></div><div class="line"><a name="l17013"></a><span class="lineno">17013</span> <span class="comment">// handles ownership to the caller. The signature of the callable is</span></div><div class="line"><a name="l17014"></a><span class="lineno">17014</span> <span class="comment">// `Fixture*()`, where `Fixture` is the test fixture class for the test. All</span></div><div class="line"><a name="l17015"></a><span class="lineno">17015</span> <span class="comment">// tests registered with the same `test_suite_name` must return the same</span></div><div class="line"><a name="l17016"></a><span class="lineno">17016</span> <span class="comment">// fixture type. This is checked at runtime.</span></div><div class="line"><a name="l17017"></a><span class="lineno">17017</span> <span class="comment">//</span></div><div class="line"><a name="l17018"></a><span class="lineno">17018</span> <span class="comment">// The framework will infer the fixture class from the factory and will call</span></div><div class="line"><a name="l17019"></a><span class="lineno">17019</span> <span class="comment">// the `SetUpTestSuite` and `TearDownTestSuite` for it.</span></div><div class="line"><a name="l17020"></a><span class="lineno">17020</span> <span class="comment">//</span></div><div class="line"><a name="l17021"></a><span class="lineno">17021</span> <span class="comment">// Must be called before `RUN_ALL_TESTS()` is invoked, otherwise behavior is</span></div><div class="line"><a name="l17022"></a><span class="lineno">17022</span> <span class="comment">// undefined.</span></div><div class="line"><a name="l17023"></a><span class="lineno">17023</span> <span class="comment">//</span></div><div class="line"><a name="l17024"></a><span class="lineno">17024</span> <span class="comment">// Use case example:</span></div><div class="line"><a name="l17025"></a><span class="lineno">17025</span> <span class="comment">//</span></div><div class="line"><a name="l17026"></a><span class="lineno">17026</span> <span class="comment">// class MyFixture : public ::testing::Test {</span></div><div class="line"><a name="l17027"></a><span class="lineno">17027</span> <span class="comment">// public:</span></div><div class="line"><a name="l17028"></a><span class="lineno">17028</span> <span class="comment">// // All of these optional, just like in regular macro usage.</span></div><div class="line"><a name="l17029"></a><span class="lineno">17029</span> <span class="comment">// static void SetUpTestSuite() { ... }</span></div><div class="line"><a name="l17030"></a><span class="lineno">17030</span> <span class="comment">// static void TearDownTestSuite() { ... }</span></div><div class="line"><a name="l17031"></a><span class="lineno">17031</span> <span class="comment">// void SetUp() override { ... }</span></div><div class="line"><a name="l17032"></a><span class="lineno">17032</span> <span class="comment">// void TearDown() override { ... }</span></div><div class="line"><a name="l17033"></a><span class="lineno">17033</span> <span class="comment">// };</span></div><div class="line"><a name="l17034"></a><span class="lineno">17034</span> <span class="comment">//</span></div><div class="line"><a name="l17035"></a><span class="lineno">17035</span> <span class="comment">// class MyTest : public MyFixture {</span></div><div class="line"><a name="l17036"></a><span class="lineno">17036</span> <span class="comment">// public:</span></div><div class="line"><a name="l17037"></a><span class="lineno">17037</span> <span class="comment">// explicit MyTest(int data) : data_(data) {}</span></div><div class="line"><a name="l17038"></a><span class="lineno">17038</span> <span class="comment">// void TestBody() override { ... }</span></div><div class="line"><a name="l17039"></a><span class="lineno">17039</span> <span class="comment">//</span></div><div class="line"><a name="l17040"></a><span class="lineno">17040</span> <span class="comment">// private:</span></div><div class="line"><a name="l17041"></a><span class="lineno">17041</span> <span class="comment">// int data_;</span></div><div class="line"><a name="l17042"></a><span class="lineno">17042</span> <span class="comment">// };</span></div><div class="line"><a name="l17043"></a><span class="lineno">17043</span> <span class="comment">//</span></div><div class="line"><a name="l17044"></a><span class="lineno">17044</span> <span class="comment">// void RegisterMyTests(const std::vector<int>& values) {</span></div><div class="line"><a name="l17045"></a><span class="lineno">17045</span> <span class="comment">// for (int v : values) {</span></div><div class="line"><a name="l17046"></a><span class="lineno">17046</span> <span class="comment">// ::testing::RegisterTest(</span></div><div class="line"><a name="l17047"></a><span class="lineno">17047</span> <span class="comment">// "MyFixture", ("Test" + std::to_string(v)).c_str(), nullptr,</span></div><div class="line"><a name="l17048"></a><span class="lineno">17048</span> <span class="comment">// std::to_string(v).c_str(),</span></div><div class="line"><a name="l17049"></a><span class="lineno">17049</span> <span class="comment">// __FILE__, __LINE__,</span></div><div class="line"><a name="l17050"></a><span class="lineno">17050</span> <span class="comment">// // Important to use the fixture type as the return type here.</span></div><div class="line"><a name="l17051"></a><span class="lineno">17051</span> <span class="comment">// [=]() -> MyFixture* { return new MyTest(v); });</span></div><div class="line"><a name="l17052"></a><span class="lineno">17052</span> <span class="comment">// }</span></div><div class="line"><a name="l17053"></a><span class="lineno">17053</span> <span class="comment">// }</span></div><div class="line"><a name="l17054"></a><span class="lineno">17054</span> <span class="comment">// ...</span></div><div class="line"><a name="l17055"></a><span class="lineno">17055</span> <span class="comment">// int main(int argc, char** argv) {</span></div><div class="line"><a name="l17056"></a><span class="lineno">17056</span> <span class="comment">// std::vector<int> values_to_test = LoadValuesFromConfig();</span></div><div class="line"><a name="l17057"></a><span class="lineno">17057</span> <span class="comment">// RegisterMyTests(values_to_test);</span></div><div class="line"><a name="l17058"></a><span class="lineno">17058</span> <span class="comment">// ...</span></div><div class="line"><a name="l17059"></a><span class="lineno">17059</span> <span class="comment">// return RUN_ALL_TESTS();</span></div><div class="line"><a name="l17060"></a><span class="lineno">17060</span> <span class="comment">// }</span></div><div class="line"><a name="l17061"></a><span class="lineno">17061</span> <span class="comment">//</span></div><div class="line"><a name="l17062"></a><span class="lineno">17062</span> <span class="keyword">template</span> <<span class="keywordtype">int</span>&... ExplicitParameterBarrier, <span class="keyword">typename</span> Factory></div><div class="line"><a name="l17063"></a><span class="lineno"><a class="line" href="namespacetesting.html#a302c84bdc88f2138696da2a4756b6466">17063</a></span> <a class="code" href="classtesting_1_1_test_info.html">TestInfo</a>* <a class="code" href="namespacetesting.html#a302c84bdc88f2138696da2a4756b6466">RegisterTest</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* test_suite_name, <span class="keyword">const</span> <span class="keywordtype">char</span>* test_name,</div><div class="line"><a name="l17064"></a><span class="lineno">17064</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* type_param, <span class="keyword">const</span> <span class="keywordtype">char</span>* value_param,</div><div class="line"><a name="l17065"></a><span class="lineno">17065</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* file, <span class="keywordtype">int</span> line, Factory factory) {</div><div class="line"><a name="l17066"></a><span class="lineno">17066</span>  <span class="keyword">using</span> TestT = <span class="keyword">typename</span> std::remove_pointer<decltype(factory())>::type;</div><div class="line"><a name="l17067"></a><span class="lineno">17067</span> </div><div class="line"><a name="l17068"></a><span class="lineno">17068</span>  <span class="keyword">class </span>FactoryImpl : <span class="keyword">public</span> <a class="code" href="classtesting_1_1internal_1_1_test_factory_base.html">internal::TestFactoryBase</a> {</div><div class="line"><a name="l17069"></a><span class="lineno">17069</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l17070"></a><span class="lineno">17070</span>  <span class="keyword">explicit</span> FactoryImpl(Factory f) : factory_(std::move(f)) {}</div><div class="line"><a name="l17071"></a><span class="lineno">17071</span>  <a class="code" href="classtesting_1_1_test.html">Test</a>* CreateTest()<span class="keyword"> override </span>{ <span class="keywordflow">return</span> factory_(); }</div><div class="line"><a name="l17072"></a><span class="lineno">17072</span> </div><div class="line"><a name="l17073"></a><span class="lineno">17073</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l17074"></a><span class="lineno">17074</span>  Factory factory_;</div><div class="line"><a name="l17075"></a><span class="lineno">17075</span>  };</div><div class="line"><a name="l17076"></a><span class="lineno">17076</span> </div><div class="line"><a name="l17077"></a><span class="lineno">17077</span>  <span class="keywordflow">return</span> <a class="code" href="namespacetesting_1_1internal.html#a7ab4072540184e26119ad853f45059f7">internal::MakeAndRegisterTestInfo</a>(</div><div class="line"><a name="l17078"></a><span class="lineno">17078</span>  test_suite_name, test_name, type_param, value_param,</div><div class="line"><a name="l17079"></a><span class="lineno">17079</span>  <a class="code" href="structtesting_1_1internal_1_1_code_location.html">internal::CodeLocation</a>(file, line), internal::GetTypeId<TestT>(),</div><div class="line"><a name="l17080"></a><span class="lineno">17080</span>  <a class="code" href="structtesting_1_1internal_1_1_suite_api_resolver.html">internal::SuiteApiResolver<TestT>::GetSetUpCaseOrSuite</a>(),</div><div class="line"><a name="l17081"></a><span class="lineno">17081</span>  <a class="code" href="structtesting_1_1internal_1_1_suite_api_resolver.html">internal::SuiteApiResolver<TestT>::GetTearDownCaseOrSuite</a>(),</div><div class="line"><a name="l17082"></a><span class="lineno">17082</span>  <span class="keyword">new</span> FactoryImpl{std::move(factory)});</div><div class="line"><a name="l17083"></a><span class="lineno">17083</span> }</div><div class="line"><a name="l17084"></a><span class="lineno">17084</span> </div><div class="line"><a name="l17085"></a><span class="lineno">17085</span> } <span class="comment">// namespace testing</span></div><div class="line"><a name="l17086"></a><span class="lineno">17086</span> </div><div class="line"><a name="l17087"></a><span class="lineno">17087</span> <span class="comment">// Use this function in main() to run all tests. It returns 0 if all</span></div><div class="line"><a name="l17088"></a><span class="lineno">17088</span> <span class="comment">// tests are successful, or 1 otherwise.</span></div><div class="line"><a name="l17089"></a><span class="lineno">17089</span> <span class="comment">//</span></div><div class="line"><a name="l17090"></a><span class="lineno">17090</span> <span class="comment">// RUN_ALL_TESTS() should be invoked after the command line has been</span></div><div class="line"><a name="l17091"></a><span class="lineno">17091</span> <span class="comment">// parsed by InitGoogleTest().</span></div><div class="line"><a name="l17092"></a><span class="lineno">17092</span> <span class="comment">//</span></div><div class="line"><a name="l17093"></a><span class="lineno">17093</span> <span class="comment">// This function was formerly a macro; thus, it is in the global</span></div><div class="line"><a name="l17094"></a><span class="lineno">17094</span> <span class="comment">// namespace and has an all-caps name.</span></div><div class="line"><a name="l17095"></a><span class="lineno">17095</span> <span class="keywordtype">int</span> <a class="code" href="gtest_8h.html#a853a3792807489591d3d4a2f2ff9359f">RUN_ALL_TESTS</a>() <a class="code" href="gtest_8h.html#a8e5aab8276b2645f64f41c9e3021b935">GTEST_MUST_USE_RESULT_</a>;</div><div class="line"><a name="l17096"></a><span class="lineno">17096</span> </div><div class="line"><a name="l17097"></a><span class="lineno"><a class="line" href="gtest_8h.html#a853a3792807489591d3d4a2f2ff9359f">17097</a></span> inline <span class="keywordtype">int</span> <a class="code" href="gtest_8h.html#a853a3792807489591d3d4a2f2ff9359f">RUN_ALL_TESTS</a>() {</div><div class="line"><a name="l17098"></a><span class="lineno">17098</span>  return ::testing::UnitTest::GetInstance()->Run();</div><div class="line"><a name="l17099"></a><span class="lineno">17099</span> }</div><div class="line"><a name="l17100"></a><span class="lineno">17100</span> </div><div class="line"><a name="l17101"></a><span class="lineno">17101</span> <a class="code" href="gtest_8h.html#aebf8277c9069c1e124f9a5bbe2948061">GTEST_DISABLE_MSC_WARNINGS_POP_</a>() <span class="comment">// 4251</span></div><div class="line"><a name="l17102"></a><span class="lineno">17102</span> </div><div class="line"><a name="l17103"></a><span class="lineno">17103</span> <span class="preprocessor">#endif // GTEST_INCLUDE_GTEST_GTEST_H_</span></div><div class="ttc" id="structtesting_1_1internal_1_1_const_ref_html_a53610a4d0e72958332222b0a85f8937a"><div class="ttname"><a href="structtesting_1_1internal_1_1_const_ref.html#a53610a4d0e72958332222b0a85f8937a">testing::internal::ConstRef::type</a></div><div class="ttdeci">const T & type</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l01313">gtest.h:1313</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_param_generator_html_a448b08a8eaae1f1d27840d4dbd66c357"><div class="ttname"><a href="classtesting_1_1internal_1_1_param_generator.html#a448b08a8eaae1f1d27840d4dbd66c357">testing::internal::ParamGenerator::iterator</a></div><div class="ttdeci">ParamIterator< T > iterator</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l10721">gtest.h:10721</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_aa234ef141278263fb143b616c74c86e7"><div class="ttname"><a href="namespacetesting_1_1internal.html#aa234ef141278263fb143b616c74c86e7">testing::internal::IsXDigit</a></div><div class="ttdeci">bool IsXDigit(char ch)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02251">gtest.h:2251</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_1_1posix_html_a9ef6d089cdae03f9d9e0e6d379c40703"><div class="ttname"><a href="namespacetesting_1_1internal_1_1posix.html#a9ef6d089cdae03f9d9e0e6d379c40703">testing::internal::posix::FReopen</a></div><div class="ttdeci">FILE * FReopen(const char *path, const char *mode, FILE *stream)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02353">gtest.h:2353</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_param_iterator_html_aad035d35e8f0c1412854959a94d4887e"><div class="ttname"><a href="classtesting_1_1internal_1_1_param_iterator.html#aad035d35e8f0c1412854959a94d4887e">testing::internal::ParamIterator::operator-></a></div><div class="ttdeci">const T * operator->() const</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l10674">gtest.h:10674</a></div></div>
- <div class="ttc" id="structtesting_1_1internal_1_1_is_recursive_container_impl_3_01_c_00_01true_01_4_html"><div class="ttname"><a href="structtesting_1_1internal_1_1_is_recursive_container_impl_3_01_c_00_01true_01_4.html">testing::internal::IsRecursiveContainerImpl< C, true ></a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l07470">gtest.h:7470</a></div></div>
- <div class="ttc" id="structtesting_1_1internal_1_1_is_recursive_container_impl_3_01_c_00_01false_01_4_html"><div class="ttname"><a href="structtesting_1_1internal_1_1_is_recursive_container_impl_3_01_c_00_01false_01_4.html">testing::internal::IsRecursiveContainerImpl< C, false ></a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l07463">gtest.h:7463</a></div></div>
- <div class="ttc" id="classtesting_1_1_test_event_listener_html_a60cc09b7907cb329d152eb5e7133bdeb"><div class="ttname"><a href="classtesting_1_1_test_event_listener.html#a60cc09b7907cb329d152eb5e7133bdeb">testing::TestEventListener::OnTestIterationStart</a></div><div class="ttdeci">virtual void OnTestIterationStart(const UnitTest &unit_test, int iteration)=0</div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_cartesian_product_generator3_html_a8ef3e248a6d5ba1ea4ae17a8d045e98a"><div class="ttname"><a href="classtesting_1_1internal_1_1_cartesian_product_generator3.html#a8ef3e248a6d5ba1ea4ae17a8d045e98a">testing::internal::CartesianProductGenerator3::ParamType</a></div><div class="ttdeci">::std::tuple< T1, T2, T3 > ParamType</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l11483">gtest.h:11483</a></div></div>
- <div class="ttc" id="namespacetesting_html_a84c020b981d0eb4eabfb0feda155aaaf"><div class="ttname"><a href="namespacetesting.html#a84c020b981d0eb4eabfb0feda155aaaf">testing::DoubleLE</a></div><div class="ttdeci">GTEST_API_ AssertionResult DoubleLE(const char *expr1, const char *expr2, double val1, double val2)</div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_floating_point_html_ac551f793522e54fbd8a25acb79eac5b1"><div class="ttname"><a href="classtesting_1_1internal_1_1_floating_point.html#ac551f793522e54fbd8a25acb79eac5b1">testing::internal::FloatingPoint::ReinterpretBits</a></div><div class="ttdeci">static RawType ReinterpretBits(const Bits bits)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l06742">gtest.h:6742</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_cartesian_product_generator8_html_a75fc8856e032710e9efe753ad788dcf1"><div class="ttname"><a href="classtesting_1_1internal_1_1_cartesian_product_generator8.html#a75fc8856e032710e9efe753ad788dcf1">testing::internal::CartesianProductGenerator8::ParamType</a></div><div class="ttdeci">::std::tuple< T1, T2, T3, T4, T5, T6, T7, T8 > ParamType</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l12323">gtest.h:12323</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_parameterized_test_suite_info_html_a56fc02ddec2cf2101332d1125e4c75a9"><div class="ttname"><a href="classtesting_1_1internal_1_1_parameterized_test_suite_info.html#a56fc02ddec2cf2101332d1125e4c75a9">testing::internal::ParameterizedTestSuiteInfo::ParameterizedTestSuiteInfo</a></div><div class="ttdeci">ParameterizedTestSuiteInfo(const char *name, CodeLocation code_location)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l11044">gtest.h:11044</a></div></div>
- <div class="ttc" id="gtest_8h_html_ae29b00ca46783509cc900cd03d61ef37"><div class="ttname"><a href="gtest_8h.html#ae29b00ca46783509cc900cd03d61ef37">GTEST_ATTRIBUTE_PRINTF_</a></div><div class="ttdeci">#define GTEST_ATTRIBUTE_PRINTF_(string_index, first_to_check)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l00916">gtest.h:916</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_implicitly_convertible_html"><div class="ttname"><a href="classtesting_1_1internal_1_1_implicitly_convertible.html">testing::internal::ImplicitlyConvertible</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l07344">gtest.h:7344</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_thread_local_html_a57e45bb60e3cd94abb04fa449e9f0367"><div class="ttname"><a href="classtesting_1_1internal_1_1_thread_local.html#a57e45bb60e3cd94abb04fa449e9f0367">testing::internal::ThreadLocal::pointer</a></div><div class="ttdeci">const T * pointer() const</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02170">gtest.h:2170</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_test_factory_impl_html_ab9b9236ef39b14f0a78e611748e970e3"><div class="ttname"><a href="classtesting_1_1internal_1_1_test_factory_impl.html#ab9b9236ef39b14f0a78e611748e970e3">testing::internal::TestFactoryImpl::CreateTest</a></div><div class="ttdeci">Test * CreateTest() override</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l06909">gtest.h:6909</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_cartesian_product_holder10_html"><div class="ttname"><a href="classtesting_1_1internal_1_1_cartesian_product_holder10.html">testing::internal::CartesianProductHolder10</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l13295">gtest.h:13295</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a3db36c62f31a9439117c41c2b13f4941"><div class="ttname"><a href="namespacetesting_1_1internal.html#a3db36c62f31a9439117c41c2b13f4941">testing::internal::IsNullLiteralHelper</a></div><div class="ttdeci">std::true_type IsNullLiteralHelper(Secret *)</div></div>
- <div class="ttc" id="structtesting_1_1internal_1_1_wrap_printer_type_html"><div class="ttname"><a href="structtesting_1_1internal_1_1_wrap_printer_type.html">testing::internal::WrapPrinterType</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l08440">gtest.h:8440</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a4d46f09c3bfe68700b7f728d2cc3782f"><div class="ttname"><a href="namespacetesting_1_1internal.html#a4d46f09c3bfe68700b7f728d2cc3782f">testing::internal::AlwaysTrue</a></div><div class="ttdeci">GTEST_API_ bool AlwaysTrue()</div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a17fb8f0125fa92404a249ed38a43faa4a8eaa6fff4a58832b30027df49f73dcbf"><div class="ttname"><a href="namespacetesting_1_1internal.html#a17fb8f0125fa92404a249ed38a43faa4a8eaa6fff4a58832b30027df49f73dcbf">testing::internal::kPrintPointer</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l08436">gtest.h:8436</a></div></div>
- <div class="ttc" id="classtesting_1_1_test_event_listener_html_aaa1021d75f5dbf3f05c829c1cc520341"><div class="ttname"><a href="classtesting_1_1_test_event_listener.html#aaa1021d75f5dbf3f05c829c1cc520341">testing::TestEventListener::OnEnvironmentsSetUpEnd</a></div><div class="ttdeci">virtual void OnEnvironmentsSetUpEnd(const UnitTest &unit_test)=0</div></div>
- <div class="ttc" id="namespacetesting_html_a460d7b998622e332392c1e00be3a60d5"><div class="ttname"><a href="namespacetesting.html#a460d7b998622e332392c1e00be3a60d5">testing::AddGlobalTestEnvironment</a></div><div class="ttdeci">Environment * AddGlobalTestEnvironment(Environment *env)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l16067">gtest.h:16067</a></div></div>
- <div class="ttc" id="classtesting_1_1_empty_test_event_listener_html_aa1fd7d378f2cdde00a4f8a2f4efb95b4"><div class="ttname"><a href="classtesting_1_1_empty_test_event_listener.html#aa1fd7d378f2cdde00a4f8a2f4efb95b4">testing::EmptyTestEventListener::OnTestCaseStart</a></div><div class="ttdeci">void OnTestCaseStart(const TestCase &tc) override</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l15744">gtest.h:15744</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_abc0f0626877188afba6ad122d502f088"><div class="ttname"><a href="namespacetesting_1_1internal.html#abc0f0626877188afba6ad122d502f088">testing::internal::GetParamNameGen</a></div><div class="ttdeci">ParamNameGenFunctor GetParamNameGen(ParamNameGenFunctor func)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l10924">gtest.h:10924</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_g_test_mutex_lock_html"><div class="ttname"><a href="classtesting_1_1internal_1_1_g_test_mutex_lock.html">testing::internal::GTestMutexLock</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02157">gtest.h:2157</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_cartesian_product_holder3_html_ad74b6d31441c7f3f7f8514a563c8277e"><div class="ttname"><a href="classtesting_1_1internal_1_1_cartesian_product_holder3.html#ad74b6d31441c7f3f7f8514a563c8277e">testing::internal::CartesianProductHolder3::CartesianProductHolder3</a></div><div class="ttdeci">CartesianProductHolder3(const Generator1 &g1, const Generator2 &g2, const Generator3 &g3)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l13064">gtest.h:13064</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_universal_terse_printer_3_01const_01wchar__t_01_5_01_4_html_af0d3bb36d6defbc67c43e5785e939478"><div class="ttname"><a href="classtesting_1_1internal_1_1_universal_terse_printer_3_01const_01wchar__t_01_5_01_4.html#af0d3bb36d6defbc67c43e5785e939478">testing::internal::UniversalTersePrinter< const wchar_t * >::Print</a></div><div class="ttdeci">static void Print(const wchar_t *str, ::std::ostream *os)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l08891">gtest.h:8891</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_aed657219a9856a8d249a3230de0c54ce"><div class="ttname"><a href="namespacetesting_1_1internal.html#aed657219a9856a8d249a3230de0c54ce">testing::internal::GetCapturedStdout</a></div><div class="ttdeci">std::string GetCapturedStdout()</div><div class="ttdef"><b>Definition:</b> <a href="gtest-all_8cc_source.html#l10789">gtest-all.cc:10789</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_parameterized_test_suite_info_base_html_aa6e36241431dc72c251ecee9b637b4d3"><div class="ttname"><a href="classtesting_1_1internal_1_1_parameterized_test_suite_info_base.html#aa6e36241431dc72c251ecee9b637b4d3">testing::internal::ParameterizedTestSuiteInfoBase::GetTestSuiteName</a></div><div class="ttdeci">virtual const std::string & GetTestSuiteName() const =0</div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_aea60207c4cedc8946a70ada62e38da8f"><div class="ttname"><a href="namespacetesting_1_1internal.html#aea60207c4cedc8946a70ada62e38da8f">testing::internal::DoubleNearPredFormat</a></div><div class="ttdeci">GTEST_API_ AssertionResult DoubleNearPredFormat(const char *expr1, const char *expr2, const char *abs_error_expr, double val1, double val2, double abs_error)</div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a374156401da17704099d0c33fa53adfb"><div class="ttname"><a href="namespacetesting_1_1internal.html#a374156401da17704099d0c33fa53adfb">testing::internal::GetCapturedStderr</a></div><div class="ttdeci">std::string GetCapturedStderr()</div><div class="ttdef"><b>Definition:</b> <a href="gtest-all_8cc_source.html#l10794">gtest-all.cc:10794</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a6b108e56fdc68ea937ffb3759fb55ab0"><div class="ttname"><a href="namespacetesting_1_1internal.html#a6b108e56fdc68ea937ffb3759fb55ab0">testing::internal::GetTypeId</a></div><div class="ttdeci">TypeId GetTypeId()</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l06872">gtest.h:6872</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a982df3f369643b175f79cda4048bc3b9"><div class="ttname"><a href="namespacetesting_1_1internal.html#a982df3f369643b175f79cda4048bc3b9">testing::internal::ImplicitCast_</a></div><div class="ttdeci">To ImplicitCast_(To x)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l01342">gtest.h:1342</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_cartesian_product_generator4_html"><div class="ttname"><a href="classtesting_1_1internal_1_1_cartesian_product_generator4.html">testing::internal::CartesianProductGenerator4</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l11612">gtest.h:11612</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_param_iterator_html_ab0922f2f554fb3beaf13c442da605e8d"><div class="ttname"><a href="classtesting_1_1internal_1_1_param_iterator.html#ab0922f2f554fb3beaf13c442da605e8d">testing::internal::ParamIterator::operator++</a></div><div class="ttdeci">ParamIterator & operator++()</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l10676">gtest.h:10676</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal2_html_aeb8161b0b3ee503347b0662d7028fd57abe8aaea44751d6ebd0cdf5bd94451db1"><div class="ttname"><a href="namespacetesting_1_1internal2.html#aeb8161b0b3ee503347b0662d7028fd57abe8aaea44751d6ebd0cdf5bd94451db1">testing::internal2::kOtherType</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l08172">gtest.h:8172</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_mutex_html_a315188055de1be98884519ad84eff2e6"><div class="ttname"><a href="classtesting_1_1internal_1_1_mutex.html#a315188055de1be98884519ad84eff2e6">testing::internal::Mutex::Unlock</a></div><div class="ttdeci">void Unlock()</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02143">gtest.h:2143</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_cartesian_product_generator4_html_ae04bf9d551c6dc3996d18e90e88f4bfd"><div class="ttname"><a href="classtesting_1_1internal_1_1_cartesian_product_generator4.html#ae04bf9d551c6dc3996d18e90e88f4bfd">testing::internal::CartesianProductGenerator4::Begin</a></div><div class="ttdeci">ParamIteratorInterface< ParamType > * Begin() const override</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l11623">gtest.h:11623</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_flat_tuple_html_a611d01b9ff2437e4b9cfe3bbedc6d6ae"><div class="ttname"><a href="classtesting_1_1internal_1_1_flat_tuple.html#a611d01b9ff2437e4b9cfe3bbedc6d6ae">testing::internal::FlatTuple::FlatTuple</a></div><div class="ttdeci">FlatTuple(T... t)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l07737">gtest.h:7737</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_cartesian_product_generator8_html_a1893e189b87ba1a7cc664dcd4d87a1fd"><div class="ttname"><a href="classtesting_1_1internal_1_1_cartesian_product_generator8.html#a1893e189b87ba1a7cc664dcd4d87a1fd">testing::internal::CartesianProductGenerator8::End</a></div><div class="ttdeci">ParamIteratorInterface< ParamType > * End() const override</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l12339">gtest.h:12339</a></div></div>
- <div class="ttc" id="namespacetesting_html"><div class="ttname"><a href="namespacetesting.html">testing</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest-all_8cc_source.html#l07620">gtest-all.cc:7620</a></div></div>
- <div class="ttc" id="structtesting_1_1internal_1_1_remove_reference_html"><div class="ttname"><a href="structtesting_1_1internal_1_1_remove_reference.html">testing::internal::RemoveReference</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l07306">gtest.h:7306</a></div></div>
- <div class="ttc" id="classtesting_1_1_test_info_html_a036a20710c8c2252889544daba9a8ff9"><div class="ttname"><a href="classtesting_1_1_test_info.html#a036a20710c8c2252889544daba9a8ff9">testing::TestInfo::test_case_name</a></div><div class="ttdeci">const char * test_case_name() const</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l15305">gtest.h:15305</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_cartesian_product_generator7_html_a1481728b2ece0109ac7897074d42a1f4"><div class="ttname"><a href="classtesting_1_1internal_1_1_cartesian_product_generator7.html#a1481728b2ece0109ac7897074d42a1f4">testing::internal::CartesianProductGenerator7::ParamType</a></div><div class="ttdeci">::std::tuple< T1, T2, T3, T4, T5, T6, T7 > ParamType</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l12120">gtest.h:12120</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_ae7ae495d3207e26968dfbd537c5e6dee"><div class="ttname"><a href="namespacetesting_1_1internal.html#ae7ae495d3207e26968dfbd537c5e6dee">testing::internal::GetCurrentOsStackTraceExceptTop</a></div><div class="ttdeci">GTEST_API_ std::string GetCurrentOsStackTraceExceptTop(UnitTest *unit_test, int skip_count)</div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_test_meta_factory_base_html"><div class="ttname"><a href="classtesting_1_1internal_1_1_test_meta_factory_base.html">testing::internal::TestMetaFactoryBase</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l10964">gtest.h:10964</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_test_factory_impl_html"><div class="ttname"><a href="classtesting_1_1internal_1_1_test_factory_impl.html">testing::internal::TestFactoryImpl</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l06907">gtest.h:6907</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_range_generator_html_ac112ca69567b9c47bf14554e0473e1e2"><div class="ttname"><a href="classtesting_1_1internal_1_1_range_generator.html#ac112ca69567b9c47bf14554e0473e1e2">testing::internal::RangeGenerator::End</a></div><div class="ttdeci">ParamIteratorInterface< T > * End() const override</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l10753">gtest.h:10753</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_cartesian_product_generator10_html_a23b2a79fc2fd0224fd31c519520cb945"><div class="ttname"><a href="classtesting_1_1internal_1_1_cartesian_product_generator10.html#a23b2a79fc2fd0224fd31c519520cb945">testing::internal::CartesianProductGenerator10::Begin</a></div><div class="ttdeci">ParamIteratorInterface< ParamType > * Begin() const override</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l12796">gtest.h:12796</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_test_factory_base_html_afedbf147b2a213517b315880d8c81427"><div class="ttname"><a href="classtesting_1_1internal_1_1_test_factory_base.html#afedbf147b2a213517b315880d8c81427">testing::internal::TestFactoryBase::TestFactoryBase</a></div><div class="ttdeci">TestFactoryBase()</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l06898">gtest.h:6898</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a83e4e0732ac6a9dcfe6ee299dc1b9fa2"><div class="ttname"><a href="namespacetesting_1_1internal.html#a83e4e0732ac6a9dcfe6ee299dc1b9fa2">testing::internal::SetUpTestSuiteFunc</a></div><div class="ttdeci">void(*)() SetUpTestSuiteFunc</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l06926">gtest.h:6926</a></div></div>
- <div class="ttc" id="classtesting_1_1internal2_1_1_type_without_formatter_3_01_t_00_01k_convertible_to_integer_01_4_html_ab27a411afb608e730a57d232b3f4f486"><div class="ttname"><a href="classtesting_1_1internal2_1_1_type_without_formatter_3_01_t_00_01k_convertible_to_integer_01_4.html#ab27a411afb608e730a57d232b3f4f486">testing::internal2::TypeWithoutFormatter< T, kConvertibleToInteger >::PrintValue</a></div><div class="ttdeci">static void PrintValue(const T &value, ::std::ostream *os)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l08217">gtest.h:8217</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_native_array_html_a12216d686e16e4cc63d952fada5b2ba9"><div class="ttname"><a href="classtesting_1_1internal_1_1_native_array.html#a12216d686e16e4cc63d952fada5b2ba9">testing::internal::NativeArray::value_type</a></div><div class="ttdeci">Element value_type</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l07582">gtest.h:7582</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_cartesian_product_holder7_html_a289e661f9252bac3570700410eb041b3"><div class="ttname"><a href="classtesting_1_1internal_1_1_cartesian_product_holder7.html#a289e661f9252bac3570700410eb041b3">testing::internal::CartesianProductHolder7::CartesianProductHolder7</a></div><div class="ttdeci">CartesianProductHolder7(const Generator1 &g1, const Generator2 &g2, const Generator3 &g3, const Generator4 &g4, const Generator5 &g5, const Generator6 &g6, const Generator7 &g7)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l13178">gtest.h:13178</a></div></div>
- <div class="ttc" id="classtesting_1_1_empty_test_event_listener_html_a166bcf075f37bfe14f912d2def55f61a"><div class="ttname"><a href="classtesting_1_1_empty_test_event_listener.html#a166bcf075f37bfe14f912d2def55f61a">testing::EmptyTestEventListener::OnTestCaseEnd</a></div><div class="ttdeci">void OnTestCaseEnd(const TestCase &tc) override</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l15752">gtest.h:15752</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_aac72b20299ad4a99554ce161e1769560"><div class="ttname"><a href="namespacetesting_1_1internal.html#aac72b20299ad4a99554ce161e1769560">testing::internal::SkipPrefix</a></div><div class="ttdeci">GTEST_API_ bool SkipPrefix(const char *prefix, const char **pstr)</div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_floating_point_html_aae5954d8a57d3ff0987c6930cb68e114"><div class="ttname"><a href="classtesting_1_1internal_1_1_floating_point.html#aae5954d8a57d3ff0987c6930cb68e114">testing::internal::FloatingPoint::Max</a></div><div class="ttdeci">static RawType Max()</div></div>
- <div class="ttc" id="gtest_8h_html_a69b0cadb05bf2a1ef96151243c6b6241"><div class="ttname"><a href="gtest_8h.html#a69b0cadb05bf2a1ef96151243c6b6241">GTEST_INTENTIONAL_CONST_COND_PUSH_</a></div><div class="ttdeci">#define GTEST_INTENTIONAL_CONST_COND_PUSH_()</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l00950">gtest.h:950</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_parameterized_test_suite_registry_html"><div class="ttname"><a href="classtesting_1_1internal_1_1_parameterized_test_suite_registry.html">testing::internal::ParameterizedTestSuiteRegistry</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l11205">gtest.h:11205</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_cartesian_product_holder4_html_a07fe92a091d7717a159d7ba5f2fe3c75"><div class="ttname"><a href="classtesting_1_1internal_1_1_cartesian_product_holder4.html#a07fe92a091d7717a159d7ba5f2fe3c75">testing::internal::CartesianProductHolder4::CartesianProductHolder4</a></div><div class="ttdeci">CartesianProductHolder4(const Generator1 &g1, const Generator2 &g2, const Generator3 &g3, const Generator4 &g4)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l13089">gtest.h:13089</a></div></div>
- <div class="ttc" id="structtesting_1_1internal_1_1_compile_assert_types_equal_html"><div class="ttname"><a href="structtesting_1_1internal_1_1_compile_assert_types_equal.html">testing::internal::CompileAssertTypesEqual</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l07296">gtest.h:7296</a></div></div>
- <div class="ttc" id="classtesting_1_1_test_result_html_acf7e6e72f05a0545c48ea48e7f8851df"><div class="ttname"><a href="classtesting_1_1_test_result.html#acf7e6e72f05a0545c48ea48e7f8851df">testing::TestResult::Passed</a></div><div class="ttdeci">bool Passed() const</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l15186">gtest.h:15186</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_format_for_comparison_html"><div class="ttname"><a href="classtesting_1_1internal_1_1_format_for_comparison.html">testing::internal::FormatForComparison</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l08340">gtest.h:8340</a></div></div>
- <div class="ttc" id="namespacetesting_html_aa6587938029dd8733ecb885068f08247"><div class="ttname"><a href="namespacetesting.html#aa6587938029dd8733ecb885068f08247">testing::AssertPred2Helper</a></div><div class="ttdeci">AssertionResult AssertPred2Helper(const char *pred_text, const char *e1, const char *e2, Pred pred, const T1 &v1, const T2 &v2)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l14758">gtest.h:14758</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_floating_point_html_aca98b5ea6f2222a66a82e52421682efa"><div class="ttname"><a href="classtesting_1_1internal_1_1_floating_point.html#aca98b5ea6f2222a66a82e52421682efa">testing::internal::FloatingPoint::kSignBitMask</a></div><div class="ttdeci">static const Bits kSignBitMask</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l06706">gtest.h:6706</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_1_1posix_html_af4beeaaa8d62916d5e3b644a1ddfbd6b"><div class="ttname"><a href="namespacetesting_1_1internal_1_1posix.html#af4beeaaa8d62916d5e3b644a1ddfbd6b">testing::internal::posix::FClose</a></div><div class="ttdeci">int FClose(FILE *fp)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02358">gtest.h:2358</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_cartesian_product_generator5_html_ab25fd0df9d6325f10f218c3b7553820d"><div class="ttname"><a href="classtesting_1_1internal_1_1_cartesian_product_generator5.html#ab25fd0df9d6325f10f218c3b7553820d">testing::internal::CartesianProductGenerator5::CartesianProductGenerator5</a></div><div class="ttdeci">CartesianProductGenerator5(const ParamGenerator< T1 > &g1, const ParamGenerator< T2 > &g2, const ParamGenerator< T3 > &g3, const ParamGenerator< T4 > &g4, const ParamGenerator< T5 > &g5)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l11768">gtest.h:11768</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_parameterized_test_suite_info_base_html_a3b50ae419b0de858f3ad9b8dd49989de"><div class="ttname"><a href="classtesting_1_1internal_1_1_parameterized_test_suite_info_base.html#a3b50ae419b0de858f3ad9b8dd49989de">testing::internal::ParameterizedTestSuiteInfoBase::ParameterizedTestSuiteInfoBase</a></div><div class="ttdeci">ParameterizedTestSuiteInfoBase()</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l11020">gtest.h:11020</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_cartesian_product_generator6_html_a6ff15d46e4ff7f8f24215b8244a6a094"><div class="ttname"><a href="classtesting_1_1internal_1_1_cartesian_product_generator6.html#a6ff15d46e4ff7f8f24215b8244a6a094">testing::internal::CartesianProductGenerator6::CartesianProductGenerator6</a></div><div class="ttdeci">CartesianProductGenerator6(const ParamGenerator< T1 > &g1, const ParamGenerator< T2 > &g2, const ParamGenerator< T3 > &g3, const ParamGenerator< T4 > &g4, const ParamGenerator< T5 > &g5, const ParamGenerator< T6 > &g6)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l11936">gtest.h:11936</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a8cbd8bf820517923d7f3c4477b3af5fa"><div class="ttname"><a href="namespacetesting_1_1internal.html#a8cbd8bf820517923d7f3c4477b3af5fa">testing::internal::GetThreadCount</a></div><div class="ttdeci">size_t GetThreadCount()</div><div class="ttdef"><b>Definition:</b> <a href="gtest-all_8cc_source.html#l09875">gtest-all.cc:9875</a></div></div>
- <div class="ttc" id="classtesting_1_1_test_property_html"><div class="ttname"><a href="classtesting_1_1_test_property.html">testing::TestProperty</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l15133">gtest.h:15133</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a764748b94f628bdd1dcd39dc81e8b71f"><div class="ttname"><a href="namespacetesting_1_1internal.html#a764748b94f628bdd1dcd39dc81e8b71f">testing::internal::IsContainerTest</a></div><div class="ttdeci">IsContainer IsContainerTest(int)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l07429">gtest.h:7429</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_cartesian_product_holder3_html"><div class="ttname"><a href="classtesting_1_1internal_1_1_cartesian_product_holder3.html">testing::internal::CartesianProductHolder3</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l13062">gtest.h:13062</a></div></div>
- <div class="ttc" id="classtesting_1_1_test_suite_html_a3391a0ec111c66e1ac16a800f5068af7"><div class="ttname"><a href="classtesting_1_1_test_suite.html#a3391a0ec111c66e1ac16a800f5068af7">testing::TestSuite::ad_hoc_test_result</a></div><div class="ttdeci">const TestResult & ad_hoc_test_result() const</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l15502">gtest.h:15502</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_native_array_html_abb346ac3040f5da733f594cc2d5958bc"><div class="ttname"><a href="classtesting_1_1internal_1_1_native_array.html#abb346ac3040f5da733f594cc2d5958bc">testing::internal::NativeArray::NativeArray</a></div><div class="ttdeci">NativeArray(const NativeArray &rhs)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l07597">gtest.h:7597</a></div></div>
- <div class="ttc" id="namespaceutl_1_1meta_html_ac72acc616316c322e750d20a46553ba4"><div class="ttname"><a href="namespaceutl_1_1meta.html#ac72acc616316c322e750d20a46553ba4">utl::meta::filter</a></div><div class="ttdeci">eval< filter_impl::filter_< List, Pred, typelist<> > > filter</div><div class="ttdef"><b>Definition:</b> <a href="typelist_8h_source.html#l00800">typelist.h:800</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_parameterized_test_suite_info_html_a8c0af866d3c291a63d3f4581ccd452d1"><div class="ttname"><a href="classtesting_1_1internal_1_1_parameterized_test_suite_info.html#a8c0af866d3c291a63d3f4581ccd452d1">testing::internal::ParameterizedTestSuiteInfo::RegisterTests</a></div><div class="ttdeci">void RegisterTests() override</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l11080">gtest.h:11080</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_implicitly_convertible_html_aea51cecabca681fb75659e224771b7b7"><div class="ttname"><a href="classtesting_1_1internal_1_1_implicitly_convertible.html#aea51cecabca681fb75659e224771b7b7">testing::internal::ImplicitlyConvertible::value</a></div><div class="ttdeci">static const bool value</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l07380">gtest.h:7380</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_param_iterator_html_aa10585055ee055e304703a3004f24f33"><div class="ttname"><a href="classtesting_1_1internal_1_1_param_iterator.html#aa10585055ee055e304703a3004f24f33">testing::internal::ParamIterator::ParamIterator</a></div><div class="ttdeci">ParamIterator(const ParamIterator &other)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l10666">gtest.h:10666</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_r_e_html_a24236aab3a6b0183a145a6f4c0bb9848"><div class="ttname"><a href="classtesting_1_1internal_1_1_r_e.html#a24236aab3a6b0183a145a6f4c0bb9848">testing::internal::RE::pattern</a></div><div class="ttdeci">const char * pattern() const</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l01155">gtest.h:1155</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_r_e_html_a1e81f9a87211bdca645e025f8f0236c8"><div class="ttname"><a href="classtesting_1_1internal_1_1_r_e.html#a1e81f9a87211bdca645e025f8f0236c8">testing::internal::RE::PartialMatch</a></div><div class="ttdeci">static bool PartialMatch(const ::std::string &str, const RE &re)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l01164">gtest.h:1164</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_native_array_html_a52b3689c62532703d11e9d82939a7141"><div class="ttname"><a href="classtesting_1_1internal_1_1_native_array.html#a52b3689c62532703d11e9d82939a7141">testing::internal::NativeArray::NativeArray</a></div><div class="ttdeci">NativeArray(const Element *array, size_t count, RelationToSourceReference)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l07587">gtest.h:7587</a></div></div>
- <div class="ttc" id="classtesting_1_1_test_suite_html_a8f62c17baef80042e0ff03ef5d5e4ba7"><div class="ttname"><a href="classtesting_1_1_test_suite.html#a8f62c17baef80042e0ff03ef5d5e4ba7">testing::TestSuite::should_run</a></div><div class="ttdeci">bool should_run() const</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l15461">gtest.h:15461</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_cartesian_product_generator10_html_a53d945670e910c0baaf14f3d25f1bbb6"><div class="ttname"><a href="classtesting_1_1internal_1_1_cartesian_product_generator10.html#a53d945670e910c0baaf14f3d25f1bbb6">testing::internal::CartesianProductGenerator10::CartesianProductGenerator10</a></div><div class="ttdeci">CartesianProductGenerator10(const ParamGenerator< T1 > &g1, const ParamGenerator< T2 > &g2, const ParamGenerator< T3 > &g3, const ParamGenerator< T4 > &g4, const ParamGenerator< T5 > &g5, const ParamGenerator< T6 > &g6, const ParamGenerator< T7 > &g7, const ParamGenerator< T8 > &g8, const ParamGenerator< T9 > &g9, const ParamGenerator< T10 > &g10)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l12786">gtest.h:12786</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_ad8f0c2883245f1df2a53618a49f0deb3"><div class="ttname"><a href="namespacetesting_1_1internal.html#ad8f0c2883245f1df2a53618a49f0deb3">testing::internal::IsContainer</a></div><div class="ttdeci">int IsContainer</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l07422">gtest.h:7422</a></div></div>
- <div class="ttc" id="structtesting_1_1internal_1_1_const_ref_3_01_t_01_6_01_4_html_a9f664dd25649a0d260cfb1f610c7a349"><div class="ttname"><a href="structtesting_1_1internal_1_1_const_ref_3_01_t_01_6_01_4.html#a9f664dd25649a0d260cfb1f610c7a349">testing::internal::ConstRef< T & >::type</a></div><div class="ttdeci">T & type</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l01315">gtest.h:1315</a></div></div>
- <div class="ttc" id="classtesting_1_1_test_info_html"><div class="ttname"><a href="classtesting_1_1_test_info.html">testing::TestInfo</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l15294">gtest.h:15294</a></div></div>
- <div class="ttc" id="classtesting_1_1_empty_test_event_listener_html_aae9c5c61e476f0c421402fb1dde434d2"><div class="ttname"><a href="classtesting_1_1_empty_test_event_listener.html#aae9c5c61e476f0c421402fb1dde434d2">testing::EmptyTestEventListener::OnTestIterationEnd</a></div><div class="ttdeci">void OnTestIterationEnd(const UnitTest &, int) override</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l15757">gtest.h:15757</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_values_in_iterator_range_generator_html_a71ffed6f1deba05f11c9d45f6ab5b85d"><div class="ttname"><a href="classtesting_1_1internal_1_1_values_in_iterator_range_generator.html#a71ffed6f1deba05f11c9d45f6ab5b85d">testing::internal::ValuesInIteratorRangeGenerator::Begin</a></div><div class="ttdeci">ParamIteratorInterface< T > * Begin() const override</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l10835">gtest.h:10835</a></div></div>
- <div class="ttc" id="classtesting_1_1_scoped_trace_html"><div class="ttname"><a href="classtesting_1_1_scoped_trace.html">testing::ScopedTrace</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l16835">gtest.h:16835</a></div></div>
- <div class="ttc" id="structtesting_1_1internal_1_1bool__constant_html_a499fba6576296b04d99690a486424b32"><div class="ttname"><a href="structtesting_1_1internal_1_1bool__constant.html#a499fba6576296b04d99690a486424b32">testing::internal::bool_constant::value</a></div><div class="ttdeci">static const bool value</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02186">gtest.h:2186</a></div></div>
- <div class="ttc" id="structtesting_1_1internal_1_1_index_sequence_html"><div class="ttname"><a href="structtesting_1_1internal_1_1_index_sequence.html">testing::internal::IndexSequence</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l07646">gtest.h:7646</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_ab2709373c78eb8b1c22a6ba30cceba52"><div class="ttname"><a href="namespacetesting_1_1internal.html#ab2709373c78eb8b1c22a6ba30cceba52">testing::internal::IsTrue</a></div><div class="ttdeci">GTEST_API_ bool IsTrue(bool condition)</div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a5e3e473798de3189e9343132bcfd4fea"><div class="ttname"><a href="namespacetesting_1_1internal.html#a5e3e473798de3189e9343132bcfd4fea">testing::internal::operator==</a></div><div class="ttdeci">bool operator==(faketype, faketype)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l16106">gtest.h:16106</a></div></div>
- <div class="ttc" id="namespacetesting_html_aa5717bb1144edd1d262d310ba70c82ed"><div class="ttname"><a href="namespacetesting.html#aa5717bb1144edd1d262d310ba70c82ed">testing::PrintToString</a></div><div class="ttdeci">::std::string PrintToString(const T &value)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l08969">gtest.h:8969</a></div></div>
- <div class="ttc" id="classtesting_1_1_with_param_interface_html_a343febaaebf1f025bda484f841d4fec1"><div class="ttname"><a href="classtesting_1_1_with_param_interface.html#a343febaaebf1f025bda484f841d4fec1">testing::WithParamInterface::ParamType</a></div><div class="ttdeci">T ParamType</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l16472">gtest.h:16472</a></div></div>
- <div class="ttc" id="classtesting_1_1_test_event_listener_html_a76dbb7c3868d1c9abb957faee2568c0b"><div class="ttname"><a href="classtesting_1_1_test_event_listener.html#a76dbb7c3868d1c9abb957faee2568c0b">testing::TestEventListener::OnTestCaseEnd</a></div><div class="ttdeci">virtual void OnTestCaseEnd(const TestCase &test_case)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l15712">gtest.h:15712</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_cartesian_product_generator10_html_a373c054dc7b60a9ab6236c327cac4e23"><div class="ttname"><a href="classtesting_1_1internal_1_1_cartesian_product_generator10.html#a373c054dc7b60a9ab6236c327cac4e23">testing::internal::CartesianProductGenerator10::End</a></div><div class="ttdeci">ParamIteratorInterface< ParamType > * End() const override</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l12801">gtest.h:12801</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_1_1edit__distance_html_ad46aa6da12aec1a3f166310478b53a08a7bdb9c74613a94f21b7489e0b5640a63"><div class="ttname"><a href="namespacetesting_1_1internal_1_1edit__distance.html#ad46aa6da12aec1a3f166310478b53a08a7bdb9c74613a94f21b7489e0b5640a63">testing::internal::edit_distance::kMatch</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l06605">gtest.h:6605</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_ab81b0af2a0131ea54dc11de00d5e6e51"><div class="ttname"><a href="namespacetesting_1_1internal.html#ab81b0af2a0131ea54dc11de00d5e6e51">testing::internal::ReadEntireFile</a></div><div class="ttdeci">std::string ReadEntireFile(FILE *file)</div><div class="ttdef"><b>Definition:</b> <a href="gtest-all_8cc_source.html#l10809">gtest-all.cc:10809</a></div></div>
- <div class="ttc" id="structtesting_1_1internal_1_1_add_reference_html"><div class="ttname"><a href="structtesting_1_1internal_1_1_add_reference.html">testing::internal::AddReference</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l01292">gtest.h:1292</a></div></div>
- <div class="ttc" id="classtesting_1_1_empty_test_event_listener_html_aefdb73682d290791461e186d864db718"><div class="ttname"><a href="classtesting_1_1_empty_test_event_listener.html#aefdb73682d290791461e186d864db718">testing::EmptyTestEventListener::OnTestSuiteEnd</a></div><div class="ttdeci">void OnTestSuiteEnd(const TestSuite &) override</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l15750">gtest.h:15750</a></div></div>
- <div class="ttc" id="gtest_8h_html_a38f6151210e363ad7c69a836b13cf0af"><div class="ttname"><a href="gtest_8h.html#a38f6151210e363ad7c69a836b13cf0af">GTEST_CHECK_POSIX_SUCCESS_</a></div><div class="ttdeci">#define GTEST_CHECK_POSIX_SUCCESS_(posix_call)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l01283">gtest.h:1283</a></div></div>
- <div class="ttc" id="gtest_8h_html_aa0dc86dc9837f1610e91da65458f53b3"><div class="ttname"><a href="gtest_8h.html#aa0dc86dc9837f1610e91da65458f53b3">GTEST_DISABLE_MSC_DEPRECATED_POP_</a></div><div class="ttdeci">#define GTEST_DISABLE_MSC_DEPRECATED_POP_()</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l00561">gtest.h:561</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_aa6255ef3b023c5b4e1a2198d887fb977a7a051bc2794f15a4bf0eab40562a304c"><div class="ttname"><a href="namespacetesting_1_1internal.html#aa6255ef3b023c5b4e1a2198d887fb977a7a051bc2794f15a4bf0eab40562a304c">testing::internal::GTEST_WARNING</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l01221">gtest.h:1221</a></div></div>
- <div class="ttc" id="structtesting_1_1internal_1_1_const_char_ptr_html_ae94f6453fa679d815994eccc63062907"><div class="ttname"><a href="structtesting_1_1internal_1_1_const_char_ptr.html#ae94f6453fa679d815994eccc63062907">testing::internal::ConstCharPtr::ConstCharPtr</a></div><div class="ttdeci">ConstCharPtr(const char *str)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l07266">gtest.h:7266</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_type_with_size_3_018_01_4_html_a747e21c5aee8faf07ec65cd4c3d1ca62"><div class="ttname"><a href="classtesting_1_1internal_1_1_type_with_size_3_018_01_4.html#a747e21c5aee8faf07ec65cd4c3d1ca62">testing::internal::TypeWithSize< 8 >::UInt</a></div><div class="ttdeci">unsigned long long UInt</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02470">gtest.h:2470</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_parameterized_test_suite_info_base_html_ac2aa0664f56e84cacab823d345c7d67b"><div class="ttname"><a href="classtesting_1_1internal_1_1_parameterized_test_suite_info_base.html#ac2aa0664f56e84cacab823d345c7d67b">testing::internal::ParameterizedTestSuiteInfoBase::~ParameterizedTestSuiteInfoBase</a></div><div class="ttdeci">virtual ~ParameterizedTestSuiteInfoBase()</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l11007">gtest.h:11007</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_cartesian_product_generator2_html_afb1a5fe2810721040689e2e8c85b8a42"><div class="ttname"><a href="classtesting_1_1internal_1_1_cartesian_product_generator2.html#afb1a5fe2810721040689e2e8c85b8a42">testing::internal::CartesianProductGenerator2::End</a></div><div class="ttdeci">ParamIteratorInterface< ParamType > * End() const override</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l11378">gtest.h:11378</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a1055088bb9b867e1b7b8f096f519d7c5"><div class="ttname"><a href="namespacetesting_1_1internal.html#a1055088bb9b867e1b7b8f096f519d7c5">testing::internal::BoolFromGTestEnv</a></div><div class="ttdeci">bool BoolFromGTestEnv(const char *flag, bool default_value)</div><div class="ttdef"><b>Definition:</b> <a href="gtest-all_8cc_source.html#l10934">gtest-all.cc:10934</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_cartesian_product_generator4_html_a75d7d9ee7bae873295df5d4dbec6a165"><div class="ttname"><a href="classtesting_1_1internal_1_1_cartesian_product_generator4.html#a75d7d9ee7bae873295df5d4dbec6a165">testing::internal::CartesianProductGenerator4::~CartesianProductGenerator4</a></div><div class="ttdeci">~CartesianProductGenerator4() override</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l11621">gtest.h:11621</a></div></div>
- <div class="ttc" id="structtesting_1_1internal_1_1_is_same_html"><div class="ttname"><a href="structtesting_1_1internal_1_1_is_same.html">testing::internal::IsSame</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l01101">gtest.h:1101</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_param_generator_interface_html_ae1de83b16fe9a53c67778a026c6a9569"><div class="ttname"><a href="classtesting_1_1internal_1_1_param_generator_interface.html#ae1de83b16fe9a53c67778a026c6a9569">testing::internal::ParamGeneratorInterface::Begin</a></div><div class="ttdeci">virtual ParamIteratorInterface< T > * Begin() const =0</div></div>
- <div class="ttc" id="classtesting_1_1_test_info_html_aee8cb884c95cd446129aba936b4159e0"><div class="ttname"><a href="classtesting_1_1_test_info.html#aee8cb884c95cd446129aba936b4159e0">testing::TestInfo::result</a></div><div class="ttdeci">const TestResult * result() const</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l15360">gtest.h:15360</a></div></div>
- <div class="ttc" id="namespacetesting_html_a5c90a86562b2470213c07742e0eeb0fe"><div class="ttname"><a href="namespacetesting.html#a5c90a86562b2470213c07742e0eeb0fe">testing::IsSubstring</a></div><div class="ttdeci">GTEST_API_ AssertionResult IsSubstring(const char *needle_expr, const char *haystack_expr, const char *needle, const char *haystack)</div></div>
- <div class="ttc" id="classtesting_1_1_scoped_trace_html_a1f453a2aade0db6955a111a7cb329615"><div class="ttname"><a href="classtesting_1_1_scoped_trace.html#a1f453a2aade0db6955a111a7cb329615">testing::ScopedTrace::ScopedTrace</a></div><div class="ttdeci">ScopedTrace(const char *file, int line, const std::string &message)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l16858">gtest.h:16858</a></div></div>
- <div class="ttc" id="structtesting_1_1internal_1_1_elem_from_list_impl_3_01_t_00_01_i_00_01_i_01_4_html_ab1552e339cc1ff1e0aa448d684ffaf39"><div class="ttname"><a href="structtesting_1_1internal_1_1_elem_from_list_impl_3_01_t_00_01_i_00_01_i_01_4.html#ab1552e339cc1ff1e0aa448d684ffaf39">testing::internal::ElemFromListImpl< T, I, I >::type</a></div><div class="ttdeci">T type</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l07680">gtest.h:7680</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a31b7c3abed4a7c395f42c61e993989f4"><div class="ttname"><a href="namespacetesting_1_1internal.html#a31b7c3abed4a7c395f42c61e993989f4">testing::internal::FormatFileLocation</a></div><div class="ttdeci">GTEST_API_ ::std::string FormatFileLocation(const char *file, int line)</div><div class="ttdef"><b>Definition:</b> <a href="gtest-all_8cc_source.html#l10620">gtest-all.cc:10620</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_cartesian_product_generator2_html_a971ef5a45783db277f5fae84eaef41a3"><div class="ttname"><a href="classtesting_1_1internal_1_1_cartesian_product_generator2.html#a971ef5a45783db277f5fae84eaef41a3">testing::internal::CartesianProductGenerator2::CartesianProductGenerator2</a></div><div class="ttdeci">CartesianProductGenerator2(const ParamGenerator< T1 > &g1, const ParamGenerator< T2 > &g2)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l11370">gtest.h:11370</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_cartesian_product_generator5_html_a13453a5614cda6c4d4b09011daa37800"><div class="ttname"><a href="classtesting_1_1internal_1_1_cartesian_product_generator5.html#a13453a5614cda6c4d4b09011daa37800">testing::internal::CartesianProductGenerator5::~CartesianProductGenerator5</a></div><div class="ttdeci">~CartesianProductGenerator5() override</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l11772">gtest.h:11772</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_1_1edit__distance_html_ad46aa6da12aec1a3f166310478b53a08a814768ef6cd0264a0a10b1e701a63e78"><div class="ttname"><a href="namespacetesting_1_1internal_1_1edit__distance.html#ad46aa6da12aec1a3f166310478b53a08a814768ef6cd0264a0a10b1e701a63e78">testing::internal::edit_distance::kRemove</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l06605">gtest.h:6605</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_cartesian_product_generator8_html"><div class="ttname"><a href="classtesting_1_1internal_1_1_cartesian_product_generator8.html">testing::internal::CartesianProductGenerator8</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l12319">gtest.h:12319</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_afa44fdec84edfc155ef63e4f0d4287cc"><div class="ttname"><a href="namespacetesting_1_1internal.html#afa44fdec84edfc155ef63e4f0d4287cc">testing::internal::operator!=</a></div><div class="ttdeci">bool operator!=(faketype, faketype)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l16107">gtest.h:16107</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_g_test_log_html"><div class="ttname"><a href="classtesting_1_1internal_1_1_g_test_log.html">testing::internal::GTestLog</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l01229">gtest.h:1229</a></div></div>
- <div class="ttc" id="classtesting_1_1_test_event_listener_html_ab4f6a0ca16ae75daf385b3b5914e1048"><div class="ttname"><a href="classtesting_1_1_test_event_listener.html#ab4f6a0ca16ae75daf385b3b5914e1048">testing::TestEventListener::OnTestStart</a></div><div class="ttdeci">virtual void OnTestStart(const TestInfo &test_info)=0</div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_param_iterator_html_a4afe3a68db0d0744753c8afe262e35df"><div class="ttname"><a href="classtesting_1_1internal_1_1_param_iterator.html#a4afe3a68db0d0744753c8afe262e35df">testing::internal::ParamIterator::value_type</a></div><div class="ttdeci">T value_type</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l10661">gtest.h:10661</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_1_1posix_html_a16ebe936b3a8ea462a94191635aedc27"><div class="ttname"><a href="namespacetesting_1_1internal_1_1posix.html#a16ebe936b3a8ea462a94191635aedc27">testing::internal::posix::IsATTY</a></div><div class="ttdeci">int IsATTY(int fd)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02323">gtest.h:2323</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a8e8ff5b11e64078831112677156cb111"><div class="ttname"><a href="namespacetesting_1_1internal.html#a8e8ff5b11e64078831112677156cb111">testing::internal::string</a></div><div class="ttdeci">::std::string string</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l01115">gtest.h:1115</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_test_meta_factory_base_html_aad80adf04686f7dfcf952e44afc02767"><div class="ttname"><a href="classtesting_1_1internal_1_1_test_meta_factory_base.html#aad80adf04686f7dfcf952e44afc02767">testing::internal::TestMetaFactoryBase::~TestMetaFactoryBase</a></div><div class="ttdeci">virtual ~TestMetaFactoryBase()</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l10966">gtest.h:10966</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_floating_point_html"><div class="ttname"><a href="classtesting_1_1internal_1_1_floating_point.html">testing::internal::FloatingPoint</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l06687">gtest.h:6687</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_cartesian_product_generator5_html_aadf6e9a6638c07af046c489b78aed214"><div class="ttname"><a href="classtesting_1_1internal_1_1_cartesian_product_generator5.html#aadf6e9a6638c07af046c489b78aed214">testing::internal::CartesianProductGenerator5::Begin</a></div><div class="ttdeci">ParamIteratorInterface< ParamType > * Begin() const override</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l11774">gtest.h:11774</a></div></div>
- <div class="ttc" id="structtesting_1_1internal_1_1bool__constant_html_aba6d09ecf7eecea6c93480f0d627a167"><div class="ttname"><a href="structtesting_1_1internal_1_1bool__constant.html#aba6d09ecf7eecea6c93480f0d627a167">testing::internal::bool_constant::type</a></div><div class="ttdeci">bool_constant< bool_value > type</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02185">gtest.h:2185</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_floating_point_html_a0dabf840863e0df84046f171c891fe71"><div class="ttname"><a href="classtesting_1_1internal_1_1_floating_point.html#a0dabf840863e0df84046f171c891fe71">testing::internal::FloatingPoint::FloatingPoint</a></div><div class="ttdeci">FloatingPoint(const RawType &x)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l06735">gtest.h:6735</a></div></div>
- <div class="ttc" id="namespacetesting_html_aa9f9150ed43f949c8a6bacf3f04c03ce"><div class="ttname"><a href="namespacetesting.html#aa9f9150ed43f949c8a6bacf3f04c03ce">testing::Bool</a></div><div class="ttdeci">internal::ParamGenerator< bool > Bool()</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l13520">gtest.h:13520</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a2196f070b2d28bceb45c7ad3b565b9ba"><div class="ttname"><a href="namespacetesting_1_1internal.html#a2196f070b2d28bceb45c7ad3b565b9ba">testing::internal::Int32FromGTestEnv</a></div><div class="ttdeci">Int32 Int32FromGTestEnv(const char *flag, Int32 default_value)</div><div class="ttdef"><b>Definition:</b> <a href="gtest-all_8cc_source.html#l10948">gtest-all.cc:10948</a></div></div>
- <div class="ttc" id="gtest_8h_html_a0ee66d464d1a06c20c1929cae09d8758"><div class="ttname"><a href="gtest_8h.html#a0ee66d464d1a06c20c1929cae09d8758">TEST_F</a></div><div class="ttdeci">#define TEST_F(test_fixture, test_name)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l16993">gtest.h:16993</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_param_generator_html_a590a03c6e0a3a3ac6279943ad1f01dc8"><div class="ttname"><a href="classtesting_1_1internal_1_1_param_generator.html#a590a03c6e0a3a3ac6279943ad1f01dc8">testing::internal::ParamGenerator::operator=</a></div><div class="ttdeci">ParamGenerator & operator=(const ParamGenerator &other)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l10726">gtest.h:10726</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_1_1edit__distance_html_ad28f23b77f716200bc6644bfc7413a63"><div class="ttname"><a href="namespacetesting_1_1internal_1_1edit__distance.html#ad28f23b77f716200bc6644bfc7413a63">testing::internal::edit_distance::CalculateOptimalEdits</a></div><div class="ttdeci">GTEST_API_ std::vector< EditType > CalculateOptimalEdits(const std::vector< size_t > &left, const std::vector< size_t > &right)</div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_type_with_size_html_a3898640d9f6c1e18110eef90f47a5d7b"><div class="ttname"><a href="classtesting_1_1internal_1_1_type_with_size.html#a3898640d9f6c1e18110eef90f47a5d7b">testing::internal::TypeWithSize::UInt</a></div><div class="ttdeci">void UInt</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02446">gtest.h:2446</a></div></div>
- <div class="ttc" id="gtest_8h_html_ad115e2c466f7e8a32f1cf23ef2e5f220"><div class="ttname"><a href="gtest_8h.html#ad115e2c466f7e8a32f1cf23ef2e5f220">GTEST_INTENTIONAL_CONST_COND_POP_</a></div><div class="ttdeci">#define GTEST_INTENTIONAL_CONST_COND_POP_()</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l00952">gtest.h:952</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_ac06fc81336a3d80755f4020d34321766"><div class="ttname"><a href="namespacetesting_1_1internal.html#ac06fc81336a3d80755f4020d34321766">testing::internal::ParseInt32</a></div><div class="ttdeci">bool ParseInt32(const Message &src_text, const char *str, Int32 *value)</div><div class="ttdef"><b>Definition:</b> <a href="gtest-all_8cc_source.html#l10892">gtest-all.cc:10892</a></div></div>
- <div class="ttc" id="classtesting_1_1_test_property_html_a377245335d9f614cd06d1650e3358e1d"><div class="ttname"><a href="classtesting_1_1_test_property.html#a377245335d9f614cd06d1650e3358e1d">testing::TestProperty::SetValue</a></div><div class="ttdeci">void SetValue(const std::string &new_value)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l15153">gtest.h:15153</a></div></div>
- <div class="ttc" id="namespaceutl_1_1meta_html_a0edfc2c15e42531e53c0822264d220ec"><div class="ttname"><a href="namespaceutl_1_1meta.html#a0edfc2c15e42531e53c0822264d220ec">utl::meta::size</a></div><div class="ttdeci">size_< List::size()> size</div><div class="ttdef"><b>Definition:</b> <a href="typelist_8h_source.html#l00129">typelist.h:129</a></div></div>
- <div class="ttc" id="classtesting_1_1_test_event_listener_html_a550fdb3e55726e4cefa09f5697941425"><div class="ttname"><a href="classtesting_1_1_test_event_listener.html#a550fdb3e55726e4cefa09f5697941425">testing::TestEventListener::OnTestIterationEnd</a></div><div class="ttdeci">virtual void OnTestIterationEnd(const UnitTest &unit_test, int iteration)=0</div></div>
- <div class="ttc" id="classtesting_1_1_empty_test_event_listener_html_ab95992f0a0b3741d59a24c3a7115fa60"><div class="ttname"><a href="classtesting_1_1_empty_test_event_listener.html#ab95992f0a0b3741d59a24c3a7115fa60">testing::EmptyTestEventListener::OnTestPartResult</a></div><div class="ttdeci">void OnTestPartResult(const TestPartResult &) override</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l15748">gtest.h:15748</a></div></div>
- <div class="ttc" id="structtesting_1_1internal_1_1_iterator_traits_html"><div class="ttname"><a href="structtesting_1_1internal_1_1_iterator_traits.html">testing::internal::IteratorTraits</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02200">gtest.h:2200</a></div></div>
- <div class="ttc" id="classtesting_1_1_test_info_html_a7759bc57f4350ad406cbbb0b3bcea320"><div class="ttname"><a href="classtesting_1_1_test_info.html#a7759bc57f4350ad406cbbb0b3bcea320">testing::TestInfo::type_param</a></div><div class="ttdeci">const char * type_param() const</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l15313">gtest.h:15313</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a3f543179329c353aee1d7b54a9a8e335"><div class="ttname"><a href="namespacetesting_1_1internal.html#a3f543179329c353aee1d7b54a9a8e335">testing::internal::wstring</a></div><div class="ttdeci">::std::wstring wstring</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l01121">gtest.h:1121</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_r_e_html_a908ea936a5b7a14479a1b292a7189ca6"><div class="ttname"><a href="classtesting_1_1internal_1_1_r_e.html#a908ea936a5b7a14479a1b292a7189ca6">testing::internal::RE::RE</a></div><div class="ttdeci">RE(const char *regex)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l01151">gtest.h:1151</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_param_iterator_html_adc356b4789eb0c2a1b5b033c7874e5a6"><div class="ttname"><a href="classtesting_1_1internal_1_1_param_iterator.html#adc356b4789eb0c2a1b5b033c7874e5a6">testing::internal::ParamIterator::operator==</a></div><div class="ttdeci">bool operator==(const ParamIterator &other) const</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l10686">gtest.h:10686</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_range_generator_html_a5b3b83223b9cada3569bcee729e0fdf3"><div class="ttname"><a href="classtesting_1_1internal_1_1_range_generator.html#a5b3b83223b9cada3569bcee729e0fdf3">testing::internal::RangeGenerator::RangeGenerator</a></div><div class="ttdeci">RangeGenerator(T begin, T end, IncrementT step)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l10745">gtest.h:10745</a></div></div>
- <div class="ttc" id="structtesting_1_1internal_1_1_is_recursive_container_html"><div class="ttname"><a href="structtesting_1_1internal_1_1_is_recursive_container.html">testing::internal::IsRecursiveContainer</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l07485">gtest.h:7485</a></div></div>
- <div class="ttc" id="classtesting_1_1_environment_html"><div class="ttname"><a href="classtesting_1_1_environment.html">testing::Environment</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l15638">gtest.h:15638</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_param_iterator_html_af51e17827dd54977165937550c0fb030"><div class="ttname"><a href="classtesting_1_1internal_1_1_param_iterator.html#af51e17827dd54977165937550c0fb030">testing::internal::ParamIterator::operator++</a></div><div class="ttdeci">ParamIterator operator++(int)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l10681">gtest.h:10681</a></div></div>
- <div class="ttc" id="classtesting_1_1internal2_1_1_type_without_formatter_3_01_t_00_01k_protobuf_01_4_html_ac96fb775dc776f02da9a671ea0e04599"><div class="ttname"><a href="classtesting_1_1internal2_1_1_type_without_formatter_3_01_t_00_01k_protobuf_01_4.html#ac96fb775dc776f02da9a671ea0e04599">testing::internal2::TypeWithoutFormatter< T, kProtobuf >::PrintValue</a></div><div class="ttdeci">static void PrintValue(const T &value, ::std::ostream *os)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l08198">gtest.h:8198</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a4bd96b7fa6486802d33ddc217af55a39"><div class="ttname"><a href="namespacetesting_1_1internal.html#a4bd96b7fa6486802d33ddc217af55a39">testing::internal::IsDigit</a></div><div class="ttdeci">bool IsDigit(char ch)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02239">gtest.h:2239</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_param_iterator_html"><div class="ttname"><a href="classtesting_1_1internal_1_1_param_iterator.html">testing::internal::ParamIterator</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l10659">gtest.h:10659</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_aa6255ef3b023c5b4e1a2198d887fb977a75063567740f6bf7da419b1b9197b12e"><div class="ttname"><a href="namespacetesting_1_1internal.html#aa6255ef3b023c5b4e1a2198d887fb977a75063567740f6bf7da419b1b9197b12e">testing::internal::GTEST_FATAL</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l01223">gtest.h:1223</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a50003bb76ec2934be1062be11efba8bf"><div class="ttname"><a href="namespacetesting_1_1internal.html#a50003bb76ec2934be1062be11efba8bf">testing::internal::Strings</a></div><div class="ttdeci">::std::vector< ::std::string > Strings</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l08926">gtest.h:8926</a></div></div>
- <div class="ttc" id="structtesting_1_1internal_1_1_relation_to_source_copy_html"><div class="ttname"><a href="structtesting_1_1internal_1_1_relation_to_source_copy.html">testing::internal::RelationToSourceCopy</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l07568">gtest.h:7568</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_range_generator_html_a502913fbcf14e89d5765dfb44f3c1295"><div class="ttname"><a href="classtesting_1_1internal_1_1_range_generator.html#a502913fbcf14e89d5765dfb44f3c1295">testing::internal::RangeGenerator::Begin</a></div><div class="ttdeci">ParamIteratorInterface< T > * Begin() const override</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l10750">gtest.h:10750</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_1_1posix_html_a2b87b7ff647a128614daf50667eb9304"><div class="ttname"><a href="namespacetesting_1_1internal_1_1posix.html#a2b87b7ff647a128614daf50667eb9304">testing::internal::posix::Stat</a></div><div class="ttdeci">int Stat(const char *path, StatStruct *buf)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02324">gtest.h:2324</a></div></div>
- <div class="ttc" id="classtesting_1_1_test_event_listener_html_a9ea04fa7f447865ba76df35e12ba2092"><div class="ttname"><a href="classtesting_1_1_test_event_listener.html#a9ea04fa7f447865ba76df35e12ba2092">testing::TestEventListener::OnEnvironmentsTearDownEnd</a></div><div class="ttdeci">virtual void OnEnvironmentsTearDownEnd(const UnitTest &unit_test)=0</div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_param_iterator_interface_html"><div class="ttname"><a href="classtesting_1_1internal_1_1_param_iterator_interface.html">testing::internal::ParamIteratorInterface</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l10629">gtest.h:10629</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_native_array_html_ac1301a57977b57a1ad013e4e25fc2a72"><div class="ttname"><a href="classtesting_1_1internal_1_1_native_array.html#ac1301a57977b57a1ad013e4e25fc2a72">testing::internal::NativeArray::iterator</a></div><div class="ttdeci">Element * iterator</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l07583">gtest.h:7583</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_param_generator_interface_html"><div class="ttname"><a href="classtesting_1_1internal_1_1_param_generator_interface.html">testing::internal::ParamGeneratorInterface</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l10623">gtest.h:10623</a></div></div>
- <div class="ttc" id="classtesting_1_1_test_event_listener_html_aa6502e534919605be45f26a6daf9a40c"><div class="ttname"><a href="classtesting_1_1_test_event_listener.html#aa6502e534919605be45f26a6daf9a40c">testing::TestEventListener::OnEnvironmentsSetUpStart</a></div><div class="ttdeci">virtual void OnEnvironmentsSetUpStart(const UnitTest &unit_test)=0</div></div>
- <div class="ttc" id="structtesting_1_1_test_param_info_html_a146d921039f9da8b1336f7cc6e8436c2"><div class="ttname"><a href="structtesting_1_1_test_param_info.html#a146d921039f9da8b1336f7cc6e8436c2">testing::TestParamInfo::param</a></div><div class="ttdeci">ParamType param</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l10598">gtest.h:10598</a></div></div>
- <div class="ttc" id="namespacetesting_html_ab553b649b06ef2339cbd90f8dfa119f0"><div class="ttname"><a href="namespacetesting.html#ab553b649b06ef2339cbd90f8dfa119f0">testing::IsNotSubstring</a></div><div class="ttdeci">GTEST_API_ AssertionResult IsNotSubstring(const char *needle_expr, const char *haystack_expr, const char *needle, const char *haystack)</div></div>
- <div class="ttc" id="structtesting_1_1internal_1_1_is_recursive_container_impl_html"><div class="ttname"><a href="structtesting_1_1internal_1_1_is_recursive_container_impl.html">testing::internal::IsRecursiveContainerImpl</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l07460">gtest.h:7460</a></div></div>
- <div class="ttc" id="structtesting_1_1internal_1_1_suite_api_resolver_html_a8495afe4e71c81842119035a71db7e18"><div class="ttname"><a href="structtesting_1_1internal_1_1_suite_api_resolver.html#a8495afe4e71c81842119035a71db7e18">testing::internal::SuiteApiResolver::GetTearDownCaseOrSuite</a></div><div class="ttdeci">static SetUpTearDownSuiteFuncType GetTearDownCaseOrSuite()</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l06971">gtest.h:6971</a></div></div>
- <div class="ttc" id="classtesting_1_1_unit_test_html"><div class="ttname"><a href="classtesting_1_1_unit_test.html">testing::UnitTest</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l15850">gtest.h:15850</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_1_1posix_html_a1ddc8a4fc6bb21da372307485591a212"><div class="ttname"><a href="namespacetesting_1_1internal_1_1posix.html#a1ddc8a4fc6bb21da372307485591a212">testing::internal::posix::ChDir</a></div><div class="ttdeci">int ChDir(const char *dir)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02347">gtest.h:2347</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_parameterized_test_suite_registry_html_ab29f7a321883945d7f86f3292c100eb5"><div class="ttname"><a href="classtesting_1_1internal_1_1_parameterized_test_suite_registry.html#ab29f7a321883945d7f86f3292c100eb5">testing::internal::ParameterizedTestSuiteRegistry::~ParameterizedTestSuiteRegistry</a></div><div class="ttdeci">~ParameterizedTestSuiteRegistry()</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l11208">gtest.h:11208</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a648c1bc94c2ef9e868ff3f9dff0f9c4e"><div class="ttname"><a href="namespacetesting_1_1internal.html#a648c1bc94c2ef9e868ff3f9dff0f9c4e">testing::internal::GTestColor</a></div><div class="ttdeci">GTestColor</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l16427">gtest.h:16427</a></div></div>
- <div class="ttc" id="structtesting_1_1internal_1_1_enable_if_3_01true_01_4_html_a9398d803f1fdd99ff41823746f6299ff"><div class="ttname"><a href="structtesting_1_1internal_1_1_enable_if_3_01true_01_4.html#a9398d803f1fdd99ff41823746f6299ff">testing::internal::EnableIf< true >::type</a></div><div class="ttdeci">void type</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l07492">gtest.h:7492</a></div></div>
- <div class="ttc" id="namespaceutl_1_1meta_html_aa013c45afb59b5c132a72be54ba145fb"><div class="ttname"><a href="namespaceutl_1_1meta.html#aa013c45afb59b5c132a72be54ba145fb">utl::meta::repeat</a></div><div class="ttdeci">repeat_c< N::type::value, Ts... > repeat</div><div class="ttdef"><b>Definition:</b> <a href="typelist_8h_source.html#l00161">typelist.h:161</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal2_html_a07dbe129beb8952074f04b599dfce39b"><div class="ttname"><a href="namespacetesting_1_1internal2.html#a07dbe129beb8952074f04b599dfce39b">testing::internal2::operator<<</a></div><div class="ttdeci">::std::basic_ostream< Char, CharTraits > & operator<<(::std::basic_ostream< Char, CharTraits > &os, const T &x)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l08261">gtest.h:8261</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_param_iterator_interface_html_adf6ba49e6b54a6e3b15dbd5733988bef"><div class="ttname"><a href="classtesting_1_1internal_1_1_param_iterator_interface.html#adf6ba49e6b54a6e3b15dbd5733988bef">testing::internal::ParamIteratorInterface::~ParamIteratorInterface</a></div><div class="ttdeci">virtual ~ParamIteratorInterface()</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l10631">gtest.h:10631</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_cartesian_product_generator2_html_a4dd5db877d076b52d44fb631e34cd47f"><div class="ttname"><a href="classtesting_1_1internal_1_1_cartesian_product_generator2.html#a4dd5db877d076b52d44fb631e34cd47f">testing::internal::CartesianProductGenerator2::ParamType</a></div><div class="ttdeci">::std::tuple< T1, T2 > ParamType</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l11368">gtest.h:11368</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_native_array_html"><div class="ttname"><a href="classtesting_1_1internal_1_1_native_array.html">testing::internal::NativeArray</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l07579">gtest.h:7579</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_1_1edit__distance_html_ad46aa6da12aec1a3f166310478b53a08"><div class="ttname"><a href="namespacetesting_1_1internal_1_1edit__distance.html#ad46aa6da12aec1a3f166310478b53a08">testing::internal::edit_distance::EditType</a></div><div class="ttdeci">EditType</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l06605">gtest.h:6605</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_1_1posix_html_a1d5e3da5a27eed25986859fa83cafe95"><div class="ttname"><a href="namespacetesting_1_1internal_1_1posix.html#a1d5e3da5a27eed25986859fa83cafe95">testing::internal::posix::GetEnv</a></div><div class="ttdeci">const char * GetEnv(const char *name)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02369">gtest.h:2369</a></div></div>
- <div class="ttc" id="classtesting_1_1_empty_test_event_listener_html_a31edf103561e8b4d747656bc2d927661"><div class="ttname"><a href="classtesting_1_1_empty_test_event_listener.html#a31edf103561e8b4d747656bc2d927661">testing::EmptyTestEventListener::OnTestIterationStart</a></div><div class="ttdeci">void OnTestIterationStart(const UnitTest &, int) override</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l15737">gtest.h:15737</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_type_id_helper_html"><div class="ttname"><a href="classtesting_1_1internal_1_1_type_id_helper.html">testing::internal::TypeIdHelper</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l06857">gtest.h:6857</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_parameterized_test_suite_info_html_a35e630877b1d9589a4bbc0439b35bbda"><div class="ttname"><a href="classtesting_1_1internal_1_1_parameterized_test_suite_info.html#a35e630877b1d9589a4bbc0439b35bbda">testing::internal::ParameterizedTestSuiteInfo::ParamNameGeneratorFunc</a></div><div class="ttdeci">ParamNameGenFunc< ParamType >::Type ParamNameGeneratorFunc</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l11042">gtest.h:11042</a></div></div>
- <div class="ttc" id="classtesting_1_1_environment_html_a039bdaa705c46b9b88234cf4d3bb6254"><div class="ttname"><a href="classtesting_1_1_environment.html#a039bdaa705c46b9b88234cf4d3bb6254">testing::Environment::TearDown</a></div><div class="ttdeci">virtual void TearDown()</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l15647">gtest.h:15647</a></div></div>
- <div class="ttc" id="structtesting_1_1internal_1_1_suite_api_resolver_html_a343c36f492a946d302b1cfc930266768"><div class="ttname"><a href="structtesting_1_1internal_1_1_suite_api_resolver.html#a343c36f492a946d302b1cfc930266768">testing::internal::SuiteApiResolver::Test</a></div><div class="ttdeci">typename std::conditional< sizeof(T) !=0, ::testing::Test, void >::type Test</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l06956">gtest.h:6956</a></div></div>
- <div class="ttc" id="namespacetesting_html_a265ed70a86cf2d6641582c45ad9529e2"><div class="ttname"><a href="namespacetesting.html#a265ed70a86cf2d6641582c45ad9529e2">testing::Range</a></div><div class="ttdeci">internal::ParamGenerator< T > Range(T start, T end, IncrementT step)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l13389">gtest.h:13389</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_universal_terse_printer_3_01const_01char_01_5_01_4_html_a37a3be2d26dc07b24d16c2b5eb88ecda"><div class="ttname"><a href="classtesting_1_1internal_1_1_universal_terse_printer_3_01const_01char_01_5_01_4.html#a37a3be2d26dc07b24d16c2b5eb88ecda">testing::internal::UniversalTersePrinter< const char * >::Print</a></div><div class="ttdeci">static void Print(const char *str, ::std::ostream *os)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l08871">gtest.h:8871</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_ad609167d8d6792b0fb186539e0e159bd"><div class="ttname"><a href="namespacetesting_1_1internal.html#ad609167d8d6792b0fb186539e0e159bd">testing::internal::PrintStringTo</a></div><div class="ttdeci">void PrintStringTo(const ::std::string &s, ostream *os)</div><div class="ttdef"><b>Definition:</b> <a href="gtest-all_8cc_source.html#l11432">gtest-all.cc:11432</a></div></div>
- <div class="ttc" id="gtest_8h_html_a9f74eee05f7ee5534139a622fe7da7dd"><div class="ttname"><a href="gtest_8h.html#a9f74eee05f7ee5534139a622fe7da7dd">GTEST_DECLARE_string_</a></div><div class="ttdeci">#define GTEST_DECLARE_string_(name)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02499">gtest.h:2499</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_param_iterator_interface_html_a17500953df75ecda1ace46c08ff731e9"><div class="ttname"><a href="classtesting_1_1internal_1_1_param_iterator_interface.html#a17500953df75ecda1ace46c08ff731e9">testing::internal::ParamIteratorInterface::BaseGenerator</a></div><div class="ttdeci">virtual const ParamGeneratorInterface< T > * BaseGenerator() const =0</div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a6e700804399b6694d8d6157e3a141b17"><div class="ttname"><a href="namespacetesting_1_1internal.html#a6e700804399b6694d8d6157e3a141b17">testing::internal::CmpHelperSTRNE</a></div><div class="ttdeci">GTEST_API_ AssertionResult CmpHelperSTRNE(const char *s1_expression, const char *s2_expression, const wchar_t *s1, const wchar_t *s2)</div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_cartesian_product_generator9_html_a60476505c616957d1a04a31d1635df6d"><div class="ttname"><a href="classtesting_1_1internal_1_1_cartesian_product_generator9.html#a60476505c616957d1a04a31d1635df6d">testing::internal::CartesianProductGenerator9::End</a></div><div class="ttdeci">ParamIteratorInterface< ParamType > * End() const override</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l12561">gtest.h:12561</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_values_in_iterator_range_generator_html_a8b30f6028bc5739bbd7c24b0f0e409f7"><div class="ttname"><a href="classtesting_1_1internal_1_1_values_in_iterator_range_generator.html#a8b30f6028bc5739bbd7c24b0f0e409f7">testing::internal::ValuesInIteratorRangeGenerator::ValuesInIteratorRangeGenerator</a></div><div class="ttdeci">ValuesInIteratorRangeGenerator(ForwardIterator begin, ForwardIterator end)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l10831">gtest.h:10831</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_acba06d4f0343dec407738ba5544af990"><div class="ttname"><a href="namespacetesting_1_1internal.html#acba06d4f0343dec407738ba5544af990">testing::internal::CaptureStdout</a></div><div class="ttdeci">void CaptureStdout()</div><div class="ttdef"><b>Definition:</b> <a href="gtest-all_8cc_source.html#l10779">gtest-all.cc:10779</a></div></div>
- <div class="ttc" id="classtesting_1_1_test_event_listener_html_a4512d19e7a108ec4926239ec1ea85d63"><div class="ttname"><a href="classtesting_1_1_test_event_listener.html#a4512d19e7a108ec4926239ec1ea85d63">testing::TestEventListener::~TestEventListener</a></div><div class="ttdeci">virtual ~TestEventListener()</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l15671">gtest.h:15671</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a91ab078f10adc669f09b7f604975c518"><div class="ttname"><a href="namespacetesting_1_1internal.html#a91ab078f10adc669f09b7f604975c518">testing::internal::FormatForComparisonFailureMessage</a></div><div class="ttdeci">std::string FormatForComparisonFailureMessage(const T1 &value, const T2 &)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l08416">gtest.h:8416</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_param_generator_html_a5891d25c31919b3099489f8bbcd58b5e"><div class="ttname"><a href="classtesting_1_1internal_1_1_param_generator.html#a5891d25c31919b3099489f8bbcd58b5e">testing::internal::ParamGenerator::ParamGenerator</a></div><div class="ttdeci">ParamGenerator(const ParamGenerator &other)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l10724">gtest.h:10724</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_cartesian_product_generator9_html_a8fc8d5664560c3a788fe51903f896429"><div class="ttname"><a href="classtesting_1_1internal_1_1_cartesian_product_generator9.html#a8fc8d5664560c3a788fe51903f896429">testing::internal::CartesianProductGenerator9::Begin</a></div><div class="ttdeci">ParamIteratorInterface< ParamType > * Begin() const override</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l12556">gtest.h:12556</a></div></div>
- <div class="ttc" id="gtest_8h_html_a5b130138db254deaf29dbe3dffa1a2a8"><div class="ttname"><a href="gtest_8h.html#a5b130138db254deaf29dbe3dffa1a2a8">GTEST_DISABLE_MSC_DEPRECATED_PUSH_</a></div><div class="ttdeci">#define GTEST_DISABLE_MSC_DEPRECATED_PUSH_()</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l00559">gtest.h:559</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_value_array_html_acd7cd6a969a7e95152eac1787c42c9ed"><div class="ttname"><a href="classtesting_1_1internal_1_1_value_array.html#acd7cd6a969a7e95152eac1787c42c9ed">testing::internal::ValueArray::ValueArray</a></div><div class="ttdeci">ValueArray(Ts... v)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l11282">gtest.h:11282</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a66a845df404b38fe85c5e14a069f255a"><div class="ttname"><a href="namespacetesting_1_1internal.html#a66a845df404b38fe85c5e14a069f255a">testing::internal::TimeInMillis</a></div><div class="ttdeci">TypeWithSize< 8 >::Int TimeInMillis</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02479">gtest.h:2479</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_aa6255ef3b023c5b4e1a2198d887fb977"><div class="ttname"><a href="namespacetesting_1_1internal.html#aa6255ef3b023c5b4e1a2198d887fb977">testing::internal::GTestLogSeverity</a></div><div class="ttdeci">GTestLogSeverity</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l01219">gtest.h:1219</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a62f917c3424d8841de9b49b5ec28edb4"><div class="ttname"><a href="namespacetesting_1_1internal.html#a62f917c3424d8841de9b49b5ec28edb4">testing::internal::true_type</a></div><div class="ttdeci">bool_constant< true > true_type</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02191">gtest.h:2191</a></div></div>
- <div class="ttc" id="classtesting_1_1_test_event_listeners_html_a6293443acb5af942eeec638b6aa6dcf2"><div class="ttname"><a href="classtesting_1_1_test_event_listeners.html#a6293443acb5af942eeec638b6aa6dcf2">testing::TestEventListeners::default_result_printer</a></div><div class="ttdeci">TestEventListener * default_result_printer() const</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l15783">gtest.h:15783</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_cartesian_product_generator3_html_a474d70e577e76b7f84b0d83e90a6ec89"><div class="ttname"><a href="classtesting_1_1internal_1_1_cartesian_product_generator3.html#a474d70e577e76b7f84b0d83e90a6ec89">testing::internal::CartesianProductGenerator3::End</a></div><div class="ttdeci">ParamIteratorInterface< ParamType > * End() const override</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l11494">gtest.h:11494</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_thread_local_html_a85610bdfdbc93a4c56215e0aad7da870"><div class="ttname"><a href="classtesting_1_1internal_1_1_thread_local.html#a85610bdfdbc93a4c56215e0aad7da870">testing::internal::ThreadLocal::ThreadLocal</a></div><div class="ttdeci">ThreadLocal(const T &value)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02168">gtest.h:2168</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_cartesian_product_generator9_html_ab1b886bfb8c9c2c575ee4f9da61e3180"><div class="ttname"><a href="classtesting_1_1internal_1_1_cartesian_product_generator9.html#ab1b886bfb8c9c2c575ee4f9da61e3180">testing::internal::CartesianProductGenerator9::~CartesianProductGenerator9</a></div><div class="ttdeci">~CartesianProductGenerator9() override</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l12554">gtest.h:12554</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a1a1a1aed3fe00908b8a45d5ab4a33665"><div class="ttname"><a href="namespacetesting_1_1internal.html#a1a1a1aed3fe00908b8a45d5ab4a33665">testing::internal::DownCast_</a></div><div class="ttdeci">To DownCast_(From *f)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l01366">gtest.h:1366</a></div></div>
- <div class="ttc" id="classtesting_1_1_empty_test_event_listener_html_a320780451eac9178434b7c77d948ecbd"><div class="ttname"><a href="classtesting_1_1_empty_test_event_listener.html#a320780451eac9178434b7c77d948ecbd">testing::EmptyTestEventListener::OnEnvironmentsTearDownStart</a></div><div class="ttdeci">void OnEnvironmentsTearDownStart(const UnitTest &) override</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l15755">gtest.h:15755</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_ac61e2ba2cbf259fd6ee5ffd4e49c9445"><div class="ttname"><a href="namespacetesting_1_1internal.html#ac61e2ba2cbf259fd6ee5ffd4e49c9445">testing::internal::EqFailure</a></div><div class="ttdeci">GTEST_API_ AssertionResult EqFailure(const char *expected_expression, const char *actual_expression, const std::string &expected_value, const std::string &actual_value, bool ignoring_case)</div></div>
- <div class="ttc" id="classtesting_1_1_empty_test_event_listener_html_ad9984052e82c3ae26395a2d9480326d2"><div class="ttname"><a href="classtesting_1_1_empty_test_event_listener.html#ad9984052e82c3ae26395a2d9480326d2">testing::EmptyTestEventListener::OnEnvironmentsTearDownEnd</a></div><div class="ttdeci">void OnEnvironmentsTearDownEnd(const UnitTest &) override</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l15756">gtest.h:15756</a></div></div>
- <div class="ttc" id="classtesting_1_1_test_event_listeners_html"><div class="ttname"><a href="classtesting_1_1_test_event_listeners.html">testing::TestEventListeners</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l15763">gtest.h:15763</a></div></div>
- <div class="ttc" id="structtesting_1_1internal_1_1_is_hash_table_html_a165e0a3eddfa5fadf9b950be6432d848"><div class="ttname"><a href="structtesting_1_1internal_1_1_is_hash_table.html#a165e0a3eddfa5fadf9b950be6432d848">testing::internal::IsHashTable::value</a></div><div class="ttdeci">static const bool value</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l07452">gtest.h:7452</a></div></div>
- <div class="ttc" id="gtest_8h_html_a86994cc68e844d8b82089c70408dfc61"><div class="ttname"><a href="gtest_8h.html#a86994cc68e844d8b82089c70408dfc61">GTEST_DISABLE_MSC_WARNINGS_PUSH_</a></div><div class="ttdeci">#define GTEST_DISABLE_MSC_WARNINGS_PUSH_(warnings)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l00545">gtest.h:545</a></div></div>
- <div class="ttc" id="classtesting_1_1internal2_1_1_type_without_formatter_html_a6651f6f7be2c0f899729eeb6038f76d3"><div class="ttname"><a href="classtesting_1_1internal2_1_1_type_without_formatter.html#a6651f6f7be2c0f899729eeb6038f76d3">testing::internal2::TypeWithoutFormatter::PrintValue</a></div><div class="ttdeci">static void PrintValue(const T &value, ::std::ostream *os)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l08183">gtest.h:8183</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_1_1edit__distance_html_ad46aa6da12aec1a3f166310478b53a08a63400b073f5b311a87d568b5ae27ffe8"><div class="ttname"><a href="namespacetesting_1_1internal_1_1edit__distance.html#ad46aa6da12aec1a3f166310478b53a08a63400b073f5b311a87d568b5ae27ffe8">testing::internal::edit_distance::kAdd</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l06605">gtest.h:6605</a></div></div>
- <div class="ttc" id="structtesting_1_1internal_1_1_is_same_html_a4dfd313ccff08905c7c36f990ab52e1ca58968a8c680eff4326a25fab55aa0a5e"><div class="ttname"><a href="structtesting_1_1internal_1_1_is_same.html#a4dfd313ccff08905c7c36f990ab52e1ca58968a8c680eff4326a25fab55aa0a5e">testing::internal::IsSame::value</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l01102">gtest.h:1102</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_universal_terse_printer_3_01wchar__t_01_5_01_4_html_a9cdf673b44d19e6879253f30f11cd740"><div class="ttname"><a href="classtesting_1_1internal_1_1_universal_terse_printer_3_01wchar__t_01_5_01_4.html#a9cdf673b44d19e6879253f30f11cd740">testing::internal::UniversalTersePrinter< wchar_t * >::Print</a></div><div class="ttdeci">static void Print(wchar_t *str, ::std::ostream *os)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l08904">gtest.h:8904</a></div></div>
- <div class="ttc" id="structtesting_1_1internal_1_1_flat_tuple_elem_base_3_01_flat_tuple_3_01_t_8_8_8_01_4_00_01_i_01_4_html_a6b87a445f87724f9363b348e6c697766"><div class="ttname"><a href="structtesting_1_1internal_1_1_flat_tuple_elem_base_3_01_flat_tuple_3_01_t_8_8_8_01_4_00_01_i_01_4.html#a6b87a445f87724f9363b348e6c697766">testing::internal::FlatTupleElemBase< FlatTuple< T... >, I >::value_type</a></div><div class="ttdeci">typename ElemFromList< I, typename MakeIndexSequence< sizeof...(T)>::type, T... >::type value_type</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l07702">gtest.h:7702</a></div></div>
- <div class="ttc" id="classtesting_1_1_test_event_listeners_html_aa880de6ddfc3f5824371853c6846abbd"><div class="ttname"><a href="classtesting_1_1_test_event_listeners.html#aa880de6ddfc3f5824371853c6846abbd">testing::TestEventListeners::default_xml_generator</a></div><div class="ttdeci">TestEventListener * default_xml_generator() const</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l15794">gtest.h:15794</a></div></div>
- <div class="ttc" id="gtest_8h_html_a14eb0e9c6e0df765d1fbfd2db6966d14"><div class="ttname"><a href="gtest_8h.html#a14eb0e9c6e0df765d1fbfd2db6966d14">GTEST_DECLARE_bool_</a></div><div class="ttdeci">#define GTEST_DECLARE_bool_(name)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02496">gtest.h:2496</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_format_for_comparison_3_01_to_print[_n]_00_01_other_operand_01_4_html_a76c526461c8fa7df75f7b32ab889b9e0"><div class="ttname"><a href="classtesting_1_1internal_1_1_format_for_comparison_3_01_to_print[_n]_00_01_other_operand_01_4.html#a76c526461c8fa7df75f7b32ab889b9e0">testing::internal::FormatForComparison< ToPrint[N], OtherOperand >::Format</a></div><div class="ttdeci">::std::string Format(const ToPrint *value)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l08351">gtest.h:8351</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_cartesian_product_generator3_html_a2a1d5af705de6cc340291294fa38437e"><div class="ttname"><a href="classtesting_1_1internal_1_1_cartesian_product_generator3.html#a2a1d5af705de6cc340291294fa38437e">testing::internal::CartesianProductGenerator3::Begin</a></div><div class="ttdeci">ParamIteratorInterface< ParamType > * Begin() const override</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l11490">gtest.h:11490</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a40bcfd87e26aae36e0cc51e5db64fd89"><div class="ttname"><a href="namespacetesting_1_1internal.html#a40bcfd87e26aae36e0cc51e5db64fd89">testing::internal::GetFileSize</a></div><div class="ttdeci">size_t GetFileSize(FILE *file)</div><div class="ttdef"><b>Definition:</b> <a href="gtest-all_8cc_source.html#l10804">gtest-all.cc:10804</a></div></div>
- <div class="ttc" id="classtesting_1_1_empty_test_event_listener_html"><div class="ttname"><a href="classtesting_1_1_empty_test_event_listener.html">testing::EmptyTestEventListener</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l15734">gtest.h:15734</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_flat_tuple_html_a48a13560f8963f727d81a7922e3b3e50"><div class="ttname"><a href="classtesting_1_1internal_1_1_flat_tuple.html#a48a13560f8963f727d81a7922e3b3e50">testing::internal::FlatTuple::Get</a></div><div class="ttdeci">ElemFromList< I, Indices, T... >::type & Get()</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l07745">gtest.h:7745</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_universal_terse_printer_html"><div class="ttname"><a href="classtesting_1_1internal_1_1_universal_terse_printer.html">testing::internal::UniversalTersePrinter</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l08848">gtest.h:8848</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_aad4beed95d0846e6ffc5da0978ef3bb9"><div class="ttname"><a href="namespacetesting_1_1internal.html#aad4beed95d0846e6ffc5da0978ef3bb9">testing::internal::StreamableToString</a></div><div class="ttdeci">std::string StreamableToString(const T &streamable)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02769">gtest.h:2769</a></div></div>
- <div class="ttc" id="namespaceutl_1_1meta_html_ab5508236016638fa8e6b97cd17dfc9c2"><div class="ttname"><a href="namespaceutl_1_1meta.html#ab5508236016638fa8e6b97cd17dfc9c2">utl::meta::count</a></div><div class="ttdeci">count_if< List, same_as< T > > count</div><div class="ttdef"><b>Definition:</b> <a href="typelist_8h_source.html#l00761">typelist.h:761</a></div></div>
- <div class="ttc" id="classtesting_1_1_environment_html_a0e41c320362576d752cd1f44cabd57d4"><div class="ttname"><a href="classtesting_1_1_environment.html#a0e41c320362576d752cd1f44cabd57d4">testing::Environment::~Environment</a></div><div class="ttdeci">virtual ~Environment()</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l15641">gtest.h:15641</a></div></div>
- <div class="ttc" id="structtesting_1_1_test_param_info_html"><div class="ttname"><a href="structtesting_1_1_test_param_info.html">testing::TestParamInfo</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l10594">gtest.h:10594</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_range_generator_html_a72f6e6f65f1dd3f86672f6ed47df74ef"><div class="ttname"><a href="classtesting_1_1internal_1_1_range_generator.html#a72f6e6f65f1dd3f86672f6ed47df74ef">testing::internal::RangeGenerator::~RangeGenerator</a></div><div class="ttdeci">~RangeGenerator() override</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l10748">gtest.h:10748</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_param_generator_html_a14e735c8bd113556ae905a560cd2d607"><div class="ttname"><a href="classtesting_1_1internal_1_1_param_generator.html#a14e735c8bd113556ae905a560cd2d607">testing::internal::ParamGenerator::begin</a></div><div class="ttdeci">iterator begin() const</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l10731">gtest.h:10731</a></div></div>
- <div class="ttc" id="namespacetesting_html_a992de1d091ce660f451d1e8b3ce30fd6"><div class="ttname"><a href="namespacetesting.html#a992de1d091ce660f451d1e8b3ce30fd6">testing::TimeInMillis</a></div><div class="ttdeci">internal::TimeInMillis TimeInMillis</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l15127">gtest.h:15127</a></div></div>
- <div class="ttc" id="gtest_8h_html_aa73be6f0ba4a7456180a94904ce17790"><div class="ttname"><a href="gtest_8h.html#aa73be6f0ba4a7456180a94904ce17790">GTEST_API_</a></div><div class="ttdeci">#define GTEST_API_</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l00998">gtest.h:998</a></div></div>
- <div class="ttc" id="classtesting_1_1_test_suite_html_add51ece89b069b29e07f0476e0e6aae9"><div class="ttname"><a href="classtesting_1_1_test_suite.html#add51ece89b069b29e07f0476e0e6aae9">testing::TestSuite::Passed</a></div><div class="ttdeci">bool Passed() const</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l15488">gtest.h:15488</a></div></div>
- <div class="ttc" id="structtesting_1_1internal_1_1_elem_from_list_html"><div class="ttname"><a href="structtesting_1_1internal_1_1_elem_from_list.html">testing::internal::ElemFromList</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l07686">gtest.h:7686</a></div></div>
- <div class="ttc" id="structtesting_1_1internal_1_1_make_index_sequence_html"><div class="ttname"><a href="structtesting_1_1internal_1_1_make_index_sequence.html">testing::internal::MakeIndexSequence</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l07665">gtest.h:7665</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_abb1d0789f19bdde21affccbd1078b525"><div class="ttname"><a href="namespacetesting_1_1internal.html#abb1d0789f19bdde21affccbd1078b525">testing::internal::false_type</a></div><div class="ttdeci">bool_constant< false > false_type</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02190">gtest.h:2190</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_parameterized_test_suite_registry_html_a89ef6dd228f4188e1928513e860580d0"><div class="ttname"><a href="classtesting_1_1internal_1_1_parameterized_test_suite_registry.html#a89ef6dd228f4188e1928513e860580d0">testing::internal::ParameterizedTestSuiteRegistry::GetTestSuitePatternHolder</a></div><div class="ttdeci">ParameterizedTestSuiteInfo< TestSuite > * GetTestSuitePatternHolder(const char *test_suite_name, CodeLocation code_location)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l11217">gtest.h:11217</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_param_generator_interface_html_afa7211b74990e11d3fc7ad4e7113da4f"><div class="ttname"><a href="classtesting_1_1internal_1_1_param_generator_interface.html#afa7211b74990e11d3fc7ad4e7113da4f">testing::internal::ParamGeneratorInterface::End</a></div><div class="ttdeci">virtual ParamIteratorInterface< T > * End() const =0</div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_native_array_html_a3046d93cfa23097e7b7c91f5f982dc78"><div class="ttname"><a href="classtesting_1_1internal_1_1_native_array.html#a3046d93cfa23097e7b7c91f5f982dc78">testing::internal::NativeArray::begin</a></div><div class="ttdeci">const_iterator begin() const</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l07608">gtest.h:7608</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_af4bebf36baf0b0a5b26d051dde55fa47"><div class="ttname"><a href="namespacetesting_1_1internal.html#af4bebf36baf0b0a5b26d051dde55fa47">testing::internal::ArrayEq</a></div><div class="ttdeci">bool ArrayEq(const T *lhs, size_t size, const U *rhs)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l07517">gtest.h:7517</a></div></div>
- <div class="ttc" id="structtesting_1_1internal_1_1_code_location_html"><div class="ttname"><a href="structtesting_1_1internal_1_1_code_location.html">testing::internal::CodeLocation</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l06929">gtest.h:6929</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a40d4fffcd2bf56f18b1c380615aa85e3"><div class="ttname"><a href="namespacetesting_1_1internal.html#a40d4fffcd2bf56f18b1c380615aa85e3">testing::internal::UInt32</a></div><div class="ttdeci">TypeWithSize< 4 >::UInt UInt32</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02476">gtest.h:2476</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_native_array_html_ac184ee5741af5be3402213819c834405"><div class="ttname"><a href="classtesting_1_1internal_1_1_native_array.html#ac184ee5741af5be3402213819c834405">testing::internal::NativeArray::NativeArray</a></div><div class="ttdeci">NativeArray(const Element *array, size_t count, RelationToSourceCopy)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l07592">gtest.h:7592</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_mutex_html_ae7e2191886c00182176b23c4f4d049f8"><div class="ttname"><a href="classtesting_1_1internal_1_1_mutex.html#ae7e2191886c00182176b23c4f4d049f8">testing::internal::Mutex::Lock</a></div><div class="ttdeci">void Lock()</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02142">gtest.h:2142</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal2_html_a140c8efd51e63a3def98445bff107518"><div class="ttname"><a href="namespacetesting_1_1internal2.html#a140c8efd51e63a3def98445bff107518">testing::internal2::kProtobufOneLinerMaxLength</a></div><div class="ttdeci">const size_t kProtobufOneLinerMaxLength</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l08193">gtest.h:8193</a></div></div>
- <div class="ttc" id="structtesting_1_1internal_1_1_add_reference_3_01_t_01_6_01_4_html_a93c064cdcdaced0abd167258425e57af"><div class="ttname"><a href="structtesting_1_1internal_1_1_add_reference_3_01_t_01_6_01_4.html#a93c064cdcdaced0abd167258425e57af">testing::internal::AddReference< T & >::type</a></div><div class="ttdeci">T & type</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l01294">gtest.h:1294</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_ab1114197d3c657d8b7f8e0c5caa12d00"><div class="ttname"><a href="namespacetesting_1_1internal.html#ab1114197d3c657d8b7f8e0c5caa12d00">testing::internal::TypeId</a></div><div class="ttdeci">const void * TypeId</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l06854">gtest.h:6854</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a0967cbf18fb1594f82512d8d822aba21"><div class="ttname"><a href="namespacetesting_1_1internal.html#a0967cbf18fb1594f82512d8d822aba21">testing::internal::StringFromGTestEnv</a></div><div class="ttdeci">const char * StringFromGTestEnv(const char *flag, const char *default_value)</div><div class="ttdef"><b>Definition:</b> <a href="gtest-all_8cc_source.html#l10991">gtest-all.cc:10991</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_1_1posix_html_af4acf9f78d55f815a18b43786511abef"><div class="ttname"><a href="namespacetesting_1_1internal_1_1posix.html#af4acf9f78d55f815a18b43786511abef">testing::internal::posix::Write</a></div><div class="ttdeci">int Write(int fd, const void *buf, unsigned int count)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02363">gtest.h:2363</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_cartesian_product_generator5_html"><div class="ttname"><a href="classtesting_1_1internal_1_1_cartesian_product_generator5.html">testing::internal::CartesianProductGenerator5</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l11763">gtest.h:11763</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_ad9c627ef2a94245e3fd69e7ab3d49b42"><div class="ttname"><a href="namespacetesting_1_1internal.html#ad9c627ef2a94245e3fd69e7ab3d49b42">testing::internal::ToLower</a></div><div class="ttdeci">char ToLower(char ch)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02259">gtest.h:2259</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_mutex_html_a38e1833a78e3eec81ad23ce1b056b40e"><div class="ttname"><a href="classtesting_1_1internal_1_1_mutex.html#a38e1833a78e3eec81ad23ce1b056b40e">testing::internal::Mutex::Mutex</a></div><div class="ttdeci">Mutex()</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02141">gtest.h:2141</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_flat_tuple_html_a9ea6508fa6413ceca5e38b8077c67938"><div class="ttname"><a href="classtesting_1_1internal_1_1_flat_tuple.html#a9ea6508fa6413ceca5e38b8077c67938">testing::internal::FlatTuple::Get</a></div><div class="ttdeci">const ElemFromList< I, Indices, T... >::type & Get() const</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l07740">gtest.h:7740</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal2_html_abfb9aa80365f93b952e9a4bea09947a8"><div class="ttname"><a href="namespacetesting_1_1internal2.html#abfb9aa80365f93b952e9a4bea09947a8">testing::internal2::PrintBytesInObjectTo</a></div><div class="ttdeci">void PrintBytesInObjectTo(const unsigned char *obj_bytes, size_t count, ostream *os)</div><div class="ttdef"><b>Definition:</b> <a href="gtest-all_8cc_source.html#l11112">gtest-all.cc:11112</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_param_generator_html_a6b017d4d030927714d495ee95ae92fbc"><div class="ttname"><a href="classtesting_1_1internal_1_1_param_generator.html#a6b017d4d030927714d495ee95ae92fbc">testing::internal::ParamGenerator::ParamGenerator</a></div><div class="ttdeci">ParamGenerator(ParamGeneratorInterface< T > *impl)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l10723">gtest.h:10723</a></div></div>
- <div class="ttc" id="structtesting_1_1internal_1_1faketype_html"><div class="ttname"><a href="structtesting_1_1internal_1_1faketype.html">testing::internal::faketype</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l16105">gtest.h:16105</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_param_iterator_interface_html_adfff808576d929085679c315b255af7e"><div class="ttname"><a href="classtesting_1_1internal_1_1_param_iterator_interface.html#adfff808576d929085679c315b255af7e">testing::internal::ParamIteratorInterface::Current</a></div><div class="ttdeci">virtual const T * Current() const =0</div></div>
- <div class="ttc" id="classtesting_1_1_test_suite_html_ab2ea12318bdbfb6aa97792344b49e3db"><div class="ttname"><a href="classtesting_1_1_test_suite.html#ab2ea12318bdbfb6aa97792344b49e3db">testing::TestSuite::type_param</a></div><div class="ttdeci">const char * type_param() const</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l15455">gtest.h:15455</a></div></div>
- <div class="ttc" id="namespaceutl_html_a1b83655ba00b548af9b51f169c6c567a"><div class="ttname"><a href="namespaceutl.html#a1b83655ba00b548af9b51f169c6c567a">utl::ptrdiff_t</a></div><div class="ttdeci">std::ptrdiff_t ptrdiff_t</div><div class="ttdef"><b>Definition:</b> <a href="types_8h_source.html#l00040">types.h:40</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a98ce463e5dbe0c6120fa817e1f8f2944"><div class="ttname"><a href="namespacetesting_1_1internal.html#a98ce463e5dbe0c6120fa817e1f8f2944">testing::internal::CmpHelperFloatingPointEQ</a></div><div class="ttdeci">AssertionResult CmpHelperFloatingPointEQ(const char *lhs_expression, const char *rhs_expression, RawType lhs_value, RawType rhs_value)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l16351">gtest.h:16351</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_floating_point_html_aa17337e50a2ac855719bc0676529558f"><div class="ttname"><a href="classtesting_1_1internal_1_1_floating_point.html#aa17337e50a2ac855719bc0676529558f">testing::internal::FloatingPoint::fraction_bits</a></div><div class="ttdeci">Bits fraction_bits() const</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l06765">gtest.h:6765</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a7174fbf5d6ba458afae675022c9aae1e"><div class="ttname"><a href="namespacetesting_1_1internal.html#a7174fbf5d6ba458afae675022c9aae1e">testing::internal::PrintTupleTo</a></div><div class="ttdeci">void PrintTupleTo(const T &, std::integral_constant< size_t, 0 >, ::std::ostream *)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l08677">gtest.h:8677</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a00c3d012df6173622ef558a131bfb95d"><div class="ttname"><a href="namespacetesting_1_1internal.html#a00c3d012df6173622ef558a131bfb95d">testing::internal::CmpHelperSTRCASEEQ</a></div><div class="ttdeci">GTEST_API_ AssertionResult CmpHelperSTRCASEEQ(const char *s1_expression, const char *s2_expression, const char *s1, const char *s2)</div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a8ee38faaf875f133358abaf9bc056cec"><div class="ttname"><a href="namespacetesting_1_1internal.html#a8ee38faaf875f133358abaf9bc056cec">testing::internal::Int32</a></div><div class="ttdeci">TypeWithSize< 4 >::Int Int32</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02475">gtest.h:2475</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_flat_tuple_html_a056c58b5dd85f470ec5db1db9956c702"><div class="ttname"><a href="classtesting_1_1internal_1_1_flat_tuple.html#a056c58b5dd85f470ec5db1db9956c702">testing::internal::FlatTuple::FlatTuple</a></div><div class="ttdeci">FlatTuple()=default</div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_af429e04f70f9c10f6aa76a5d1ccd389f"><div class="ttname"><a href="namespacetesting_1_1internal.html#af429e04f70f9c10f6aa76a5d1ccd389f">testing::internal::IsSpace</a></div><div class="ttdeci">bool IsSpace(char ch)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02245">gtest.h:2245</a></div></div>
- <div class="ttc" id="structtesting_1_1_print_to_string_param_name_html"><div class="ttname"><a href="structtesting_1_1_print_to_string_param_name.html">testing::PrintToStringParamName</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l10604">gtest.h:10604</a></div></div>
- <div class="ttc" id="gtest_8h_html_a4a5b6fbde5dd05e05dd6846ac5e5c18e"><div class="ttname"><a href="gtest_8h.html#a4a5b6fbde5dd05e05dd6846ac5e5c18e">GTEST_IMPL_CMP_HELPER_</a></div><div class="ttdeci">#define GTEST_IMPL_CMP_HELPER_(op_name, op)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l16226">gtest.h:16226</a></div></div>
- <div class="ttc" id="classtesting_1_1_test_info_html_a866e33b5bc5ab2a6e5375fc7d3af0f96"><div class="ttname"><a href="classtesting_1_1_test_info.html#a866e33b5bc5ab2a6e5375fc7d3af0f96">testing::TestInfo::should_run</a></div><div class="ttdeci">bool should_run() const</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l15350">gtest.h:15350</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_cartesian_product_holder5_html_afb3a413ff0e59f31e621937f968d0923"><div class="ttname"><a href="classtesting_1_1internal_1_1_cartesian_product_holder5.html#afb3a413ff0e59f31e621937f968d0923">testing::internal::CartesianProductHolder5::CartesianProductHolder5</a></div><div class="ttdeci">CartesianProductHolder5(const Generator1 &g1, const Generator2 &g2, const Generator3 &g3, const Generator4 &g4, const Generator5 &g5)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l13116">gtest.h:13116</a></div></div>
- <div class="ttc" id="classtesting_1_1_empty_test_event_listener_html_a1e32e4bd4857822b6b50e6900aa5c651"><div class="ttname"><a href="classtesting_1_1_empty_test_event_listener.html#a1e32e4bd4857822b6b50e6900aa5c651">testing::EmptyTestEventListener::OnTestSuiteStart</a></div><div class="ttdeci">void OnTestSuiteStart(const TestSuite &) override</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l15741">gtest.h:15741</a></div></div>
- <div class="ttc" id="structtesting_1_1internal_1_1_flat_tuple_elem_base_html"><div class="ttname"><a href="structtesting_1_1internal_1_1_flat_tuple_elem_base.html">testing::internal::FlatTupleElemBase</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l07696">gtest.h:7696</a></div></div>
- <div class="ttc" id="structtesting_1_1internal_1_1_add_reference_html_a2df8dd7c4e41f6390e6e66b1a9a67bb4"><div class="ttname"><a href="structtesting_1_1internal_1_1_add_reference.html#a2df8dd7c4e41f6390e6e66b1a9a67bb4">testing::internal::AddReference::type</a></div><div class="ttdeci">T & type</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l01292">gtest.h:1292</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a40b2a93ff318f5975eb8246b01221ce8"><div class="ttname"><a href="namespacetesting_1_1internal.html#a40b2a93ff318f5975eb8246b01221ce8">testing::internal::fmt</a></div><div class="ttdeci">GTEST_API_ const char * fmt</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l16430">gtest.h:16430</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_param_iterator_html_a52e5fdca7d497a0ed358051e36b8b491"><div class="ttname"><a href="classtesting_1_1internal_1_1_param_iterator.html#a52e5fdca7d497a0ed358051e36b8b491">testing::internal::ParamIterator::operator*</a></div><div class="ttdeci">const T & operator*() const</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l10673">gtest.h:10673</a></div></div>
- <div class="ttc" id="namespacetesting_html_abcf5181cecc3c07915dceb3de46ab07f"><div class="ttname"><a href="namespacetesting.html#abcf5181cecc3c07915dceb3de46ab07f">testing::TempDir</a></div><div class="ttdeci">GTEST_API_ std::string TempDir()</div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_floating_point_html_afb8a816bb598225d775caaf43a893ef0"><div class="ttname"><a href="classtesting_1_1internal_1_1_floating_point.html#afb8a816bb598225d775caaf43a893ef0">testing::internal::FloatingPoint::sign_bit</a></div><div class="ttdeci">Bits sign_bit() const</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l06768">gtest.h:6768</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_cartesian_product_generator8_html_a07f33a7263f933d4fbabdb9e930d7f86"><div class="ttname"><a href="classtesting_1_1internal_1_1_cartesian_product_generator8.html#a07f33a7263f933d4fbabdb9e930d7f86">testing::internal::CartesianProductGenerator8::CartesianProductGenerator8</a></div><div class="ttdeci">CartesianProductGenerator8(const ParamGenerator< T1 > &g1, const ParamGenerator< T2 > &g2, const ParamGenerator< T3 > &g3, const ParamGenerator< T4 > &g4, const ParamGenerator< T5 > &g5, const ParamGenerator< T6 > &g6, const ParamGenerator< T7 > &g7, const ParamGenerator< T8 > &g8)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l12325">gtest.h:12325</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_universal_printer_html_aecec021e1abbaa260b701e24e3fe33eb"><div class="ttname"><a href="classtesting_1_1internal_1_1_universal_printer.html#aecec021e1abbaa260b701e24e3fe33eb">testing::internal::UniversalPrinter::Print</a></div><div class="ttdeci">static void Print(const T &value, ::std::ostream *os)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l08724">gtest.h:8724</a></div></div>
- <div class="ttc" id="classtesting_1_1_test_html_af374706cbaf0ffc460f4fd04e7c150f1"><div class="ttname"><a href="classtesting_1_1_test.html#af374706cbaf0ffc460f4fd04e7c150f1">testing::Test::TearDownTestCase</a></div><div class="ttdeci">static void TearDownTestCase()</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l15039">gtest.h:15039</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a999c7ef9ff01b6d2d76669372c444aa3"><div class="ttname"><a href="namespacetesting_1_1internal.html#a999c7ef9ff01b6d2d76669372c444aa3">testing::internal::kStackTraceMarker</a></div><div class="ttdeci">GTEST_API_ const char kStackTraceMarker[]</div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_parameterized_test_suite_registry_html_a44c2ee0296de42dc6ca7abbf48d00495"><div class="ttname"><a href="classtesting_1_1internal_1_1_parameterized_test_suite_registry.html#a44c2ee0296de42dc6ca7abbf48d00495">testing::internal::ParameterizedTestSuiteRegistry::RegisterTests</a></div><div class="ttdeci">void RegisterTests()</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l11245">gtest.h:11245</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_cartesian_product_generator3_html_a230b2ec353e917e1afeb6aae5668e19e"><div class="ttname"><a href="classtesting_1_1internal_1_1_cartesian_product_generator3.html#a230b2ec353e917e1afeb6aae5668e19e">testing::internal::CartesianProductGenerator3::~CartesianProductGenerator3</a></div><div class="ttdeci">~CartesianProductGenerator3() override</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l11488">gtest.h:11488</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_native_array_html_ae1cda748e49c6906421c6183c4d07c5a"><div class="ttname"><a href="classtesting_1_1internal_1_1_native_array.html#ae1cda748e49c6906421c6183c4d07c5a">testing::internal::NativeArray::end</a></div><div class="ttdeci">const_iterator end() const</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l07609">gtest.h:7609</a></div></div>
- <div class="ttc" id="classtesting_1_1internal2_1_1_type_without_formatter_html"><div class="ttname"><a href="classtesting_1_1internal2_1_1_type_without_formatter.html">testing::internal2::TypeWithoutFormatter</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l08180">gtest.h:8180</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_g_test_log_html_aebb92e67d98eca69f0347d5121dab27a"><div class="ttname"><a href="classtesting_1_1internal_1_1_g_test_log.html#aebb92e67d98eca69f0347d5121dab27a">testing::internal::GTestLog::GetStream</a></div><div class="ttdeci">::std::ostream & GetStream()</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l01236">gtest.h:1236</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_values_in_iterator_range_generator_html"><div class="ttname"><a href="classtesting_1_1internal_1_1_values_in_iterator_range_generator.html">testing::internal::ValuesInIteratorRangeGenerator</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l10828">gtest.h:10828</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_parameterized_test_suite_info_html"><div class="ttname"><a href="classtesting_1_1internal_1_1_parameterized_test_suite_info.html">testing::internal::ParameterizedTestSuiteInfo</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l11034">gtest.h:11034</a></div></div>
- <div class="ttc" id="namespacetesting_html_a4917922963bacef3e301e67366c41df3"><div class="ttname"><a href="namespacetesting.html#a4917922963bacef3e301e67366c41df3">testing::Combine</a></div><div class="ttdeci">internal::CartesianProductHolder2< Generator1, Generator2 > Combine(const Generator1 &g1, const Generator2 &g2)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l13571">gtest.h:13571</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_cartesian_product_generator3_html_afdca1e94b01f654564b9cbe66fb5ca94"><div class="ttname"><a href="classtesting_1_1internal_1_1_cartesian_product_generator3.html#afdca1e94b01f654564b9cbe66fb5ca94">testing::internal::CartesianProductGenerator3::CartesianProductGenerator3</a></div><div class="ttdeci">CartesianProductGenerator3(const ParamGenerator< T1 > &g1, const ParamGenerator< T2 > &g2, const ParamGenerator< T3 > &g3)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l11485">gtest.h:11485</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a2e96c98d5bd8ee4a1b92f8e3cde7dd40"><div class="ttname"><a href="namespacetesting_1_1internal.html#a2e96c98d5bd8ee4a1b92f8e3cde7dd40">testing::internal::DefaultPrintTo</a></div><div class="ttdeci">void DefaultPrintTo(WrapPrinterType< kPrintContainer >, const C &container, ::std::ostream *os)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l08445">gtest.h:8445</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a02e1981f5ff70609e6ac06e006ff519a"><div class="ttname"><a href="namespacetesting_1_1internal.html#a02e1981f5ff70609e6ac06e006ff519a">testing::internal::Float</a></div><div class="ttdeci">FloatingPoint< float > Float</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l06845">gtest.h:6845</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a66a7579b1893b260c31dad577f7a5c48"><div class="ttname"><a href="namespacetesting_1_1internal.html#a66a7579b1893b260c31dad577f7a5c48">testing::internal::Double</a></div><div class="ttdeci">FloatingPoint< double > Double</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l06846">gtest.h:6846</a></div></div>
- <div class="ttc" id="classtesting_1_1_test_suite_html_ab3369db678ca3d9648d6fd63ad038986"><div class="ttname"><a href="classtesting_1_1_test_suite.html#ab3369db678ca3d9648d6fd63ad038986">testing::TestSuite::name</a></div><div class="ttdeci">const char * name() const</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l15451">gtest.h:15451</a></div></div>
- <div class="ttc" id="classtesting_1_1_empty_test_event_listener_html_a1d8c7f3f1f92826f668edae1bc5aadf4"><div class="ttname"><a href="classtesting_1_1_empty_test_event_listener.html#a1d8c7f3f1f92826f668edae1bc5aadf4">testing::EmptyTestEventListener::OnTestStart</a></div><div class="ttdeci">void OnTestStart(const TestInfo &) override</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l15747">gtest.h:15747</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_1_1posix_html_acbad5d4ea5b73fd1765f5f760642932a"><div class="ttname"><a href="namespacetesting_1_1internal_1_1posix.html#acbad5d4ea5b73fd1765f5f760642932a">testing::internal::posix::RmDir</a></div><div class="ttdeci">int RmDir(const char *dir)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02329">gtest.h:2329</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a5f74b933606b0a742cd5a8ad2d7087e0"><div class="ttname"><a href="namespacetesting_1_1internal.html#a5f74b933606b0a742cd5a8ad2d7087e0">testing::internal::CmpHelperSTRCASENE</a></div><div class="ttdeci">GTEST_API_ AssertionResult CmpHelperSTRCASENE(const char *s1_expression, const char *s2_expression, const char *s1, const char *s2)</div></div>
- <div class="ttc" id="namespacetesting_1_1internal2_html_aeb8161b0b3ee503347b0662d7028fd57"><div class="ttname"><a href="namespacetesting_1_1internal2.html#aeb8161b0b3ee503347b0662d7028fd57">testing::internal2::TypeKind</a></div><div class="ttdeci">TypeKind</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l08164">gtest.h:8164</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_cartesian_product_holder6_html"><div class="ttname"><a href="classtesting_1_1internal_1_1_cartesian_product_holder6.html">testing::internal::CartesianProductHolder6</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l13143">gtest.h:13143</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_ad40d557f9c157790160d6e4f2b0d9bab"><div class="ttname"><a href="namespacetesting_1_1internal.html#ad40d557f9c157790160d6e4f2b0d9bab">testing::internal::CmpHelperSTREQ</a></div><div class="ttdeci">GTEST_API_ AssertionResult CmpHelperSTREQ(const char *s1_expression, const char *s2_expression, const wchar_t *s1, const wchar_t *s2)</div></div>
- <div class="ttc" id="structtesting_1_1internal_1_1_const_char_ptr_html"><div class="ttname"><a href="structtesting_1_1internal_1_1_const_char_ptr.html">testing::internal::ConstCharPtr</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l07265">gtest.h:7265</a></div></div>
- <div class="ttc" id="structtesting_1_1_test_param_info_html_aa54199319bcad5a33c8538ecaecb6de5"><div class="ttname"><a href="structtesting_1_1_test_param_info.html#aa54199319bcad5a33c8538ecaecb6de5">testing::TestParamInfo::TestParamInfo</a></div><div class="ttdeci">TestParamInfo(const ParamType &a_param, size_t an_index)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l10595">gtest.h:10595</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_cartesian_product_generator2_html"><div class="ttname"><a href="classtesting_1_1internal_1_1_cartesian_product_generator2.html">testing::internal::CartesianProductGenerator2</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l11365">gtest.h:11365</a></div></div>
- <div class="ttc" id="structtesting_1_1internal_1_1_double_sequence_html"><div class="ttname"><a href="structtesting_1_1internal_1_1_double_sequence.html">testing::internal::DoubleSequence</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l07652">gtest.h:7652</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a648c1bc94c2ef9e868ff3f9dff0f9c4ea2cca441161aca75a208ff08d07f5b1a5"><div class="ttname"><a href="namespacetesting_1_1internal.html#a648c1bc94c2ef9e868ff3f9dff0f9c4ea2cca441161aca75a208ff08d07f5b1a5">testing::internal::COLOR_YELLOW</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l16427">gtest.h:16427</a></div></div>
- <div class="ttc" id="classtesting_1_1_test_event_listener_html_ad15b6246d94c268e233487a86463ef3d"><div class="ttname"><a href="classtesting_1_1_test_event_listener.html#ad15b6246d94c268e233487a86463ef3d">testing::TestEventListener::OnTestProgramEnd</a></div><div class="ttdeci">virtual void OnTestProgramEnd(const UnitTest &unit_test)=0</div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_r_e_html_aa79a950758d0f1d62f7762d1e9cefe86"><div class="ttname"><a href="classtesting_1_1internal_1_1_r_e.html#aa79a950758d0f1d62f7762d1e9cefe86">testing::internal::RE::FullMatch</a></div><div class="ttdeci">static bool FullMatch(const ::std::string &str, const RE &re)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l01161">gtest.h:1161</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a8257a87aa42cebaa54b0c48a6ae657a5"><div class="ttname"><a href="namespacetesting_1_1internal.html#a8257a87aa42cebaa54b0c48a6ae657a5">testing::internal::TearDownTestSuiteFunc</a></div><div class="ttdeci">void(*)() TearDownTestSuiteFunc</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l06927">gtest.h:6927</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_universal_terse_printer_3_01_t_01_6_01_4_html_a931f93cc52a3046706c87d0a90640483"><div class="ttname"><a href="classtesting_1_1internal_1_1_universal_terse_printer_3_01_t_01_6_01_4.html#a931f93cc52a3046706c87d0a90640483">testing::internal::UniversalTersePrinter< T & >::Print</a></div><div class="ttdeci">static void Print(const T &value, ::std::ostream *os)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l08857">gtest.h:8857</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_test_meta_factory_html_abd5d30fab71229deb5e63f5bb5ea3fd8"><div class="ttname"><a href="classtesting_1_1internal_1_1_test_meta_factory.html#abd5d30fab71229deb5e63f5bb5ea3fd8">testing::internal::TestMetaFactory::CreateTestFactory</a></div><div class="ttdeci">TestFactoryBase * CreateTestFactory(ParamType parameter) override</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l10987">gtest.h:10987</a></div></div>
- <div class="ttc" id="structtesting_1_1internal_1_1_static_assert_type_eq_helper_html"><div class="ttname"><a href="structtesting_1_1internal_1_1_static_assert_type_eq_helper.html">testing::internal::StaticAssertTypeEqHelper</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l01092">gtest.h:1092</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_1_1posix_html_a8eb9f08d3af29941c2d2a964cfff3ecb"><div class="ttname"><a href="namespacetesting_1_1internal_1_1posix.html#a8eb9f08d3af29941c2d2a964cfff3ecb">testing::internal::posix::StatStruct</a></div><div class="ttdeci">struct stat StatStruct</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02320">gtest.h:2320</a></div></div>
- <div class="ttc" id="namespacetesting_html_aee3f6f99df893f576f705f66c0559482"><div class="ttname"><a href="namespacetesting.html#aee3f6f99df893f576f705f66c0559482">testing::InitGoogleTest</a></div><div class="ttdeci">GTEST_API_ void InitGoogleTest(int *argc, char **argv)</div></div>
- <div class="ttc" id="classtesting_1_1_test_with_param_html"><div class="ttname"><a href="classtesting_1_1_test_with_param.html">testing::TestWithParam</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l16505">gtest.h:16505</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_flat_tuple_html"><div class="ttname"><a href="classtesting_1_1internal_1_1_flat_tuple.html">testing::internal::FlatTuple</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l07693">gtest.h:7693</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a06b1b20029fbd1dbeb59752f914fab84"><div class="ttname"><a href="namespacetesting_1_1internal.html#a06b1b20029fbd1dbeb59752f914fab84">testing::internal::LogToStderr</a></div><div class="ttdeci">void LogToStderr()</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l01250">gtest.h:1250</a></div></div>
- <div class="ttc" id="namespaceutl_html_a22cbecb50ee5c1032de66133e96cbac6"><div class="ttname"><a href="namespaceutl.html#a22cbecb50ee5c1032de66133e96cbac6">utl::size_t</a></div><div class="ttdeci">std::size_t size_t</div><div class="ttdef"><b>Definition:</b> <a href="types_8h_source.html#l00037">types.h:37</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_afa92f5a284929dc3723e654a25feb7b9"><div class="ttname"><a href="namespacetesting_1_1internal.html#afa92f5a284929dc3723e654a25feb7b9">testing::internal::UniversalTersePrint</a></div><div class="ttdeci">void UniversalTersePrint(const T &value, ::std::ostream *os)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l08910">gtest.h:8910</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_floating_point_html_abf228bf6cd48f12c8b44c85b4971a731"><div class="ttname"><a href="classtesting_1_1internal_1_1_floating_point.html#abf228bf6cd48f12c8b44c85b4971a731">testing::internal::FloatingPoint::Bits</a></div><div class="ttdeci">TypeWithSize< sizeof(RawType)>::UInt Bits</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l06691">gtest.h:6691</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_parameterized_test_factory_html_a36d962674d7bf845398637338b9f75cb"><div class="ttname"><a href="classtesting_1_1internal_1_1_parameterized_test_factory.html#a36d962674d7bf845398637338b9f75cb">testing::internal::ParameterizedTestFactory::CreateTest</a></div><div class="ttdeci">Test * CreateTest() override</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l10948">gtest.h:10948</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a17fb8f0125fa92404a249ed38a43faa4"><div class="ttname"><a href="namespacetesting_1_1internal.html#a17fb8f0125fa92404a249ed38a43faa4">testing::internal::DefaultPrinterType</a></div><div class="ttdeci">DefaultPrinterType</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l08434">gtest.h:8434</a></div></div>
- <div class="ttc" id="structtesting_1_1internal_1_1_const_ref_html"><div class="ttname"><a href="structtesting_1_1internal_1_1_const_ref.html">testing::internal::ConstRef</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l01313">gtest.h:1313</a></div></div>
- <div class="ttc" id="gtest_8h_html_a016124361c862c0db315e4c9dc4d911a"><div class="ttname"><a href="gtest_8h.html#a016124361c862c0db315e4c9dc4d911a">INSTANTIATE_TEST_SUITE_P</a></div><div class="ttdeci">#define INSTANTIATE_TEST_SUITE_P(prefix, test_suite_name, generator,...)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l13715">gtest.h:13715</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a8d8ed3acadedd9c0db28d35a188973ea"><div class="ttname"><a href="namespacetesting_1_1internal.html#a8d8ed3acadedd9c0db28d35a188973ea">testing::internal::GetArgvs</a></div><div class="ttdeci">GTEST_API_ std::vector< std::string > GetArgvs()</div></div>
- <div class="ttc" id="namespacetesting_html_a37b7e87f0a5f502c6918f37d1768c1f3"><div class="ttname"><a href="namespacetesting.html#a37b7e87f0a5f502c6918f37d1768c1f3">testing::GTEST_DECLARE_string_</a></div><div class="ttdeci">GTEST_DECLARE_string_(death_test_style)</div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_native_array_html_a9ce7c8408460d7158a2870456d134557"><div class="ttname"><a href="classtesting_1_1internal_1_1_native_array.html#a9ce7c8408460d7158a2870456d134557">testing::internal::NativeArray::const_iterator</a></div><div class="ttdeci">const Element * const_iterator</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l07584">gtest.h:7584</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a7ab4072540184e26119ad853f45059f7"><div class="ttname"><a href="namespacetesting_1_1internal.html#a7ab4072540184e26119ad853f45059f7">testing::internal::MakeAndRegisterTestInfo</a></div><div class="ttdeci">GTEST_API_ TestInfo * MakeAndRegisterTestInfo(const char *test_suite_name, const char *name, const char *type_param, const char *value_param, CodeLocation code_location, TypeId fixture_class_id, SetUpTestSuiteFunc set_up_tc, TearDownTestSuiteFunc tear_down_tc, TestFactoryBase *factory)</div></div>
- <div class="ttc" id="namespacetesting_1_1internal_1_1posix_html_a3c6ab13e581a56f1b02f3eb7536c97fd"><div class="ttname"><a href="namespacetesting_1_1internal_1_1posix.html#a3c6ab13e581a56f1b02f3eb7536c97fd">testing::internal::posix::Read</a></div><div class="ttdeci">int Read(int fd, void *buf, unsigned int count)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02360">gtest.h:2360</a></div></div>
- <div class="ttc" id="gtest_8h_html_aebf8277c9069c1e124f9a5bbe2948061"><div class="ttname"><a href="gtest_8h.html#aebf8277c9069c1e124f9a5bbe2948061">GTEST_DISABLE_MSC_WARNINGS_POP_</a></div><div class="ttdeci">#define GTEST_DISABLE_MSC_WARNINGS_POP_()</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l00546">gtest.h:546</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a894ffccd936d78fd555f490020c27f0a"><div class="ttname"><a href="namespacetesting_1_1internal.html#a894ffccd936d78fd555f490020c27f0a">testing::internal::CmpHelperOpFailure</a></div><div class="ttdeci">AssertionResult CmpHelperOpFailure(const char *expr1, const char *expr2, const T1 &val1, const T2 &val2, const char *op)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l16206">gtest.h:16206</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_parameterized_test_suite_info_base_html_a41d7d663014af0c1e614c5a61293cb5a"><div class="ttname"><a href="classtesting_1_1internal_1_1_parameterized_test_suite_info_base.html#a41d7d663014af0c1e614c5a61293cb5a">testing::internal::ParameterizedTestSuiteInfoBase::RegisterTests</a></div><div class="ttdeci">virtual void RegisterTests()=0</div></div>
- <div class="ttc" id="classtesting_1_1_test_html_a7a00be7dd0a6bfdc8d47a1b784623613"><div class="ttname"><a href="classtesting_1_1_test.html#a7a00be7dd0a6bfdc8d47a1b784623613">testing::Test::HasFailure</a></div><div class="ttdeci">static bool HasFailure()</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l15054">gtest.h:15054</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_param_generator_html_aaf8f75df1099a07ff771a550b48f9fbe"><div class="ttname"><a href="classtesting_1_1internal_1_1_param_generator.html#aaf8f75df1099a07ff771a550b48f9fbe">testing::internal::ParamGenerator::end</a></div><div class="ttdeci">iterator end() const</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l10732">gtest.h:10732</a></div></div>
- <div class="ttc" id="namespacetesting__internal_html_a3f49d3d0c996242f9d383c850097a656"><div class="ttname"><a href="namespacetesting__internal.html#a3f49d3d0c996242f9d383c850097a656">testing_internal::DefaultPrintNonContainerTo</a></div><div class="ttdeci">void DefaultPrintNonContainerTo(const T &value, ::std::ostream *os)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l08289">gtest.h:8289</a></div></div>
- <div class="ttc" id="structtesting_1_1internal_1_1_remove_const_3_01const_01_t_01_4_html_ac88c6824d228ab05091e5a4f1c1a95fc"><div class="ttname"><a href="structtesting_1_1internal_1_1_remove_const_3_01const_01_t_01_4.html#ac88c6824d228ab05091e5a4f1c1a95fc">testing::internal::RemoveConst< const T >::type</a></div><div class="ttdeci">T type</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l07321">gtest.h:7321</a></div></div>
- <div class="ttc" id="gtest_8h_html_ab54343f0a36dc4cb0ce8a478dd7847b8"><div class="ttname"><a href="gtest_8h.html#ab54343f0a36dc4cb0ce8a478dd7847b8">GTEST_CHECK_</a></div><div class="ttdeci">#define GTEST_CHECK_(condition)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l01270">gtest.h:1270</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_cartesian_product_generator9_html"><div class="ttname"><a href="classtesting_1_1internal_1_1_cartesian_product_generator9.html">testing::internal::CartesianProductGenerator9</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l12541">gtest.h:12541</a></div></div>
- <div class="ttc" id="classtesting_1_1_test_property_html_ad60435d4ad04ac030487d8998fc61c5f"><div class="ttname"><a href="classtesting_1_1_test_property.html#ad60435d4ad04ac030487d8998fc61c5f">testing::TestProperty::key</a></div><div class="ttdeci">const char * key() const</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l15143">gtest.h:15143</a></div></div>
- <div class="ttc" id="structtesting_1_1internal_1_1_remove_reference_3_01_t_01_6_01_4_html_a3d0f32a66759f333c2dd66aa31005e6d"><div class="ttname"><a href="structtesting_1_1internal_1_1_remove_reference_3_01_t_01_6_01_4.html#a3d0f32a66759f333c2dd66aa31005e6d">testing::internal::RemoveReference< T & >::type</a></div><div class="ttdeci">T type</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l07308">gtest.h:7308</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a4b24c851ab13569b1b15b3d259b60d2e"><div class="ttname"><a href="namespacetesting_1_1internal.html#a4b24c851ab13569b1b15b3d259b60d2e">testing::internal::AlwaysFalse</a></div><div class="ttdeci">bool AlwaysFalse()</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l07260">gtest.h:7260</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a17fb8f0125fa92404a249ed38a43faa4a945a19e59155ce1d335e8c3bcbdf61db"><div class="ttname"><a href="namespacetesting_1_1internal.html#a17fb8f0125fa92404a249ed38a43faa4a945a19e59155ce1d335e8c3bcbdf61db">testing::internal::kPrintContainer</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l08435">gtest.h:8435</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a08b187c6cc4e28400aadf9a32fccc8de"><div class="ttname"><a href="namespacetesting_1_1internal.html#a08b187c6cc4e28400aadf9a32fccc8de">testing::internal::MutexLock</a></div><div class="ttdeci">GTestMutexLock MutexLock</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02162">gtest.h:2162</a></div></div>
- <div class="ttc" id="structtesting_1_1_print_to_string_param_name_html_a05b411cfb75dadb2c3c0355aee1dcf21"><div class="ttname"><a href="structtesting_1_1_print_to_string_param_name.html#a05b411cfb75dadb2c3c0355aee1dcf21">testing::PrintToStringParamName::operator()</a></div><div class="ttdeci">std::string operator()(const TestParamInfo< ParamType > &info) const</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l10606">gtest.h:10606</a></div></div>
- <div class="ttc" id="structtesting_1_1internal_1_1_iterator_traits_3_01const_01_t_01_5_01_4_html_ae7c8867223e106f374b56a7dc4a85547"><div class="ttname"><a href="structtesting_1_1internal_1_1_iterator_traits_3_01const_01_t_01_5_01_4.html#ae7c8867223e106f374b56a7dc4a85547">testing::internal::IteratorTraits< const T * >::value_type</a></div><div class="ttdeci">T value_type</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02212">gtest.h:2212</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_aa6255ef3b023c5b4e1a2198d887fb977a651e9cd2a904e0c8210536271b875f75"><div class="ttname"><a href="namespacetesting_1_1internal.html#aa6255ef3b023c5b4e1a2198d887fb977a651e9cd2a904e0c8210536271b875f75">testing::internal::GTEST_ERROR</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l01222">gtest.h:1222</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_cartesian_product_generator5_html_af1829ba003b0e7c3a463f87dacd4c3b2"><div class="ttname"><a href="classtesting_1_1internal_1_1_cartesian_product_generator5.html#af1829ba003b0e7c3a463f87dacd4c3b2">testing::internal::CartesianProductGenerator5::End</a></div><div class="ttdeci">ParamIteratorInterface< ParamType > * End() const override</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l11778">gtest.h:11778</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_aeac30230dcc362221bdd07d61eaa4ec1"><div class="ttname"><a href="namespacetesting_1_1internal.html#aeac30230dcc362221bdd07d61eaa4ec1">testing::internal::GTEST_IMPL_FORMAT_C_STRING_AS_STRING_</a></div><div class="ttdeci">GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(char, ::std::string)</div></div>
- <div class="ttc" id="classtesting_1_1_test_html_a7704c8223ba28338a66ca2eaeba66383"><div class="ttname"><a href="classtesting_1_1_test.html#a7704c8223ba28338a66ca2eaeba66383">testing::Test::TearDownTestSuite</a></div><div class="ttdeci">static void TearDownTestSuite()</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l15035">gtest.h:15035</a></div></div>
- <div class="ttc" id="classtesting_1_1_environment_html_a1bf8cafaa9d4eba9feb98655ee434eb3"><div class="ttname"><a href="classtesting_1_1_environment.html#a1bf8cafaa9d4eba9feb98655ee434eb3">testing::Environment::SetUp</a></div><div class="ttdeci">virtual void SetUp()</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l15644">gtest.h:15644</a></div></div>
- <div class="ttc" id="gtest_8h_html_ac593b50ce24257d5b6aa84845c344c9e"><div class="ttname"><a href="gtest_8h.html#ac593b50ce24257d5b6aa84845c344c9e">GTEST_DISALLOW_ASSIGN_</a></div><div class="ttdeci">#define GTEST_DISALLOW_ASSIGN_(type)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l00922">gtest.h:922</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_cartesian_product_generator8_html_ab5e728b287d0d520e7281799a67189c7"><div class="ttname"><a href="classtesting_1_1internal_1_1_cartesian_product_generator8.html#ab5e728b287d0d520e7281799a67189c7">testing::internal::CartesianProductGenerator8::~CartesianProductGenerator8</a></div><div class="ttdeci">~CartesianProductGenerator8() override</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l12332">gtest.h:12332</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_cartesian_product_holder9_html"><div class="ttname"><a href="classtesting_1_1internal_1_1_cartesian_product_holder9.html">testing::internal::CartesianProductHolder9</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l13252">gtest.h:13252</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_parameterized_test_suite_info_base_html_ac5bcbf8c50a44472d697e0c80b54387d"><div class="ttname"><a href="classtesting_1_1internal_1_1_parameterized_test_suite_info_base.html#ac5bcbf8c50a44472d697e0c80b54387d">testing::internal::ParameterizedTestSuiteInfoBase::GetTestSuiteTypeId</a></div><div class="ttdeci">virtual TypeId GetTestSuiteTypeId() const =0</div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_eq_helper_3_01true_01_4_html_a6f292601a68c8f0d49e6d48bd309b900"><div class="ttname"><a href="classtesting_1_1internal_1_1_eq_helper_3_01true_01_4.html#a6f292601a68c8f0d49e6d48bd309b900">testing::internal::EqHelper< true >::Compare</a></div><div class="ttdeci">static AssertionResult Compare(const char *lhs_expression, const char *rhs_expression, Secret *, T *rhs)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l16185">gtest.h:16185</a></div></div>
- <div class="ttc" id="classtesting_1_1_test_event_listener_html_ac6605dbb5859436d59d117348d63746c"><div class="ttname"><a href="classtesting_1_1_test_event_listener.html#ac6605dbb5859436d59d117348d63746c">testing::TestEventListener::OnTestSuiteStart</a></div><div class="ttdeci">virtual void OnTestSuiteStart(const TestSuite &test_suite)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l15689">gtest.h:15689</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_random_html_adf2f24199318a46f885c78f50d89a69e"><div class="ttname"><a href="classtesting_1_1internal_1_1_random.html#adf2f24199318a46f885c78f50d89a69e">testing::internal::Random::Reseed</a></div><div class="ttdeci">void Reseed(UInt32 seed)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l07282">gtest.h:7282</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_1_1posix_html_a1ef2385a7f8e4c706054da35967e76bd"><div class="ttname"><a href="namespacetesting_1_1internal_1_1posix.html#a1ef2385a7f8e4c706054da35967e76bd">testing::internal::posix::StrCaseCmp</a></div><div class="ttdeci">int StrCaseCmp(const char *s1, const char *s2)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02325">gtest.h:2325</a></div></div>
- <div class="ttc" id="namespacetesting_html_a302c84bdc88f2138696da2a4756b6466"><div class="ttname"><a href="namespacetesting.html#a302c84bdc88f2138696da2a4756b6466">testing::RegisterTest</a></div><div class="ttdeci">TestInfo * RegisterTest(const char *test_suite_name, const char *test_name, const char *type_param, const char *value_param, const char *file, int line, Factory factory)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l17063">gtest.h:17063</a></div></div>
- <div class="ttc" id="structtesting_1_1internal_1_1_elem_from_list_impl_html"><div class="ttname"><a href="structtesting_1_1internal_1_1_elem_from_list_impl.html">testing::internal::ElemFromListImpl</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l07676">gtest.h:7676</a></div></div>
- <div class="ttc" id="structtesting_1_1internal_1_1_flat_tuple_base_html"><div class="ttname"><a href="structtesting_1_1internal_1_1_flat_tuple_base.html">testing::internal::FlatTupleBase</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l07709">gtest.h:7709</a></div></div>
- <div class="ttc" id="classtesting_1_1_empty_test_event_listener_html_a9b4e781c0b38065a55c2fd163724ba69"><div class="ttname"><a href="classtesting_1_1_empty_test_event_listener.html#a9b4e781c0b38065a55c2fd163724ba69">testing::EmptyTestEventListener::OnEnvironmentsSetUpEnd</a></div><div class="ttdeci">void OnEnvironmentsSetUpEnd(const UnitTest &) override</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l15740">gtest.h:15740</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a9579a78c229ea302caded45d65f77336"><div class="ttname"><a href="namespacetesting_1_1internal.html#a9579a78c229ea302caded45d65f77336">testing::internal::GetNotDefaultOrNull</a></div><div class="ttdeci">SetUpTearDownSuiteFuncType GetNotDefaultOrNull(SetUpTearDownSuiteFuncType a, SetUpTearDownSuiteFuncType def)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l06943">gtest.h:6943</a></div></div>
- <div class="ttc" id="classtesting_1_1_message_html_a9de694ca239486809fc99fbbea8ac21d"><div class="ttname"><a href="classtesting_1_1_message.html#a9de694ca239486809fc99fbbea8ac21d">testing::Message::Message</a></div><div class="ttdeci">Message(const char *str)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02660">gtest.h:2660</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_cartesian_product_generator10_html"><div class="ttname"><a href="classtesting_1_1internal_1_1_cartesian_product_generator10.html">testing::internal::CartesianProductGenerator10</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l12780">gtest.h:12780</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_cartesian_product_generator9_html_aff06c7992c06297c6bf5ad5eb56534e9"><div class="ttname"><a href="classtesting_1_1internal_1_1_cartesian_product_generator9.html#aff06c7992c06297c6bf5ad5eb56534e9">testing::internal::CartesianProductGenerator9::CartesianProductGenerator9</a></div><div class="ttdeci">CartesianProductGenerator9(const ParamGenerator< T1 > &g1, const ParamGenerator< T2 > &g2, const ParamGenerator< T3 > &g3, const ParamGenerator< T4 > &g4, const ParamGenerator< T5 > &g5, const ParamGenerator< T6 > &g6, const ParamGenerator< T7 > &g7, const ParamGenerator< T8 > &g8, const ParamGenerator< T9 > &g9)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l12547">gtest.h:12547</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_parameterized_test_factory_html_ad9a27b8e1a83de2f1687625bccff460d"><div class="ttname"><a href="classtesting_1_1internal_1_1_parameterized_test_factory.html#ad9a27b8e1a83de2f1687625bccff460d">testing::internal::ParameterizedTestFactory::ParamType</a></div><div class="ttdeci">TestClass::ParamType ParamType</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l10945">gtest.h:10945</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a05c6bd9ede5ccdf25191a590d610dcc6"><div class="ttname"><a href="namespacetesting_1_1internal.html#a05c6bd9ede5ccdf25191a590d610dcc6">testing::internal::BiggestInt</a></div><div class="ttdeci">long long BiggestInt</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02223">gtest.h:2223</a></div></div>
- <div class="ttc" id="structtesting_1_1internal_1_1_param_name_gen_func_html_adf1ce5df22a930ae715082862d72590f"><div class="ttname"><a href="structtesting_1_1internal_1_1_param_name_gen_func.html#adf1ce5df22a930ae715082862d72590f">testing::internal::ParamNameGenFunc::Type</a></div><div class="ttdeci">std::string Type(const TestParamInfo< ParamType > &)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l10930">gtest.h:10930</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_r_e_html"><div class="ttname"><a href="classtesting_1_1internal_1_1_r_e.html">testing::internal::RE</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l01136">gtest.h:1136</a></div></div>
- <div class="ttc" id="classtesting_1_1_scoped_trace_html_a2da90b95d682d518cca472934d53c59c"><div class="ttname"><a href="classtesting_1_1_scoped_trace.html#a2da90b95d682d518cca472934d53c59c">testing::ScopedTrace::ScopedTrace</a></div><div class="ttdeci">ScopedTrace(const char *file, int line, const T &message)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l16843">gtest.h:16843</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_param_iterator_interface_html_a4998c23e27e2943d97546011aa35db80"><div class="ttname"><a href="classtesting_1_1internal_1_1_param_iterator_interface.html#a4998c23e27e2943d97546011aa35db80">testing::internal::ParamIteratorInterface::Clone</a></div><div class="ttdeci">virtual ParamIteratorInterface * Clone() const =0</div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_cartesian_product_generator10_html_a2bee6d271df046f7660c85e2b2d305a5"><div class="ttname"><a href="classtesting_1_1internal_1_1_cartesian_product_generator10.html#a2bee6d271df046f7660c85e2b2d305a5">testing::internal::CartesianProductGenerator10::~CartesianProductGenerator10</a></div><div class="ttdeci">~CartesianProductGenerator10() override</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l12794">gtest.h:12794</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_parameterized_test_suite_registry_html_a3fe06fb4e1b4194dae1fbcdf3560fbd3"><div class="ttname"><a href="classtesting_1_1internal_1_1_parameterized_test_suite_registry.html#a3fe06fb4e1b4194dae1fbcdf3560fbd3">testing::internal::ParameterizedTestSuiteRegistry::GetTestCasePatternHolder</a></div><div class="ttdeci">ParameterizedTestCaseInfo< TestCase > * GetTestCasePatternHolder(const char *test_case_name, CodeLocation code_location)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l11253">gtest.h:11253</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_1_1posix_html_af0d04ed5baeed28353fa38742748a421"><div class="ttname"><a href="namespacetesting_1_1internal_1_1posix.html#af0d04ed5baeed28353fa38742748a421">testing::internal::posix::IsDir</a></div><div class="ttdeci">bool IsDir(const StatStruct &st)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02330">gtest.h:2330</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_universal_terse_printer_html_a042249cdb42fdb77588c9ad54ea7ed54"><div class="ttname"><a href="classtesting_1_1internal_1_1_universal_terse_printer.html#a042249cdb42fdb77588c9ad54ea7ed54">testing::internal::UniversalTersePrinter::Print</a></div><div class="ttdeci">static void Print(const T &value, ::std::ostream *os)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l08850">gtest.h:8850</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_type_with_size_html"><div class="ttname"><a href="classtesting_1_1internal_1_1_type_with_size.html">testing::internal::TypeWithSize</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02442">gtest.h:2442</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_aeb957087fd6bbf9db98ab7cd41b0c129"><div class="ttname"><a href="namespacetesting_1_1internal.html#aeb957087fd6bbf9db98ab7cd41b0c129">testing::internal::IsAlpha</a></div><div class="ttdeci">bool IsAlpha(char ch)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02233">gtest.h:2233</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_cartesian_product_generator7_html_a242bc369feb56ff096b906c833403077"><div class="ttname"><a href="classtesting_1_1internal_1_1_cartesian_product_generator7.html#a242bc369feb56ff096b906c833403077">testing::internal::CartesianProductGenerator7::~CartesianProductGenerator7</a></div><div class="ttdeci">~CartesianProductGenerator7() override</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l12127">gtest.h:12127</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_ad3013b6b4c825edee9fe18ff1d982faa"><div class="ttname"><a href="namespacetesting_1_1internal.html#ad3013b6b4c825edee9fe18ff1d982faa">testing::internal::PrintRawArrayTo</a></div><div class="ttdeci">void PrintRawArrayTo(const T a[], size_t count, ::std::ostream *os)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l08623">gtest.h:8623</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_cartesian_product_generator6_html_aa9d67ce7d77623ebb27053bb2f704c62"><div class="ttname"><a href="classtesting_1_1internal_1_1_cartesian_product_generator6.html#aa9d67ce7d77623ebb27053bb2f704c62">testing::internal::CartesianProductGenerator6::ParamType</a></div><div class="ttdeci">::std::tuple< T1, T2, T3, T4, T5, T6 > ParamType</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l11934">gtest.h:11934</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_cartesian_product_generator2_html_a4359f80cc1888d4a18d2e0a6865b920d"><div class="ttname"><a href="classtesting_1_1internal_1_1_cartesian_product_generator2.html#a4359f80cc1888d4a18d2e0a6865b920d">testing::internal::CartesianProductGenerator2::~CartesianProductGenerator2</a></div><div class="ttdeci">~CartesianProductGenerator2() override</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l11373">gtest.h:11373</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_cartesian_product_holder2_html"><div class="ttname"><a href="classtesting_1_1internal_1_1_cartesian_product_holder2.html">testing::internal::CartesianProductHolder2</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l13041">gtest.h:13041</a></div></div>
- <div class="ttc" id="gtest_8h_html_aed8c1888c32b588b0681e88b95031e29"><div class="ttname"><a href="gtest_8h.html#aed8c1888c32b588b0681e88b95031e29">GTEST_DISALLOW_COPY_AND_ASSIGN_</a></div><div class="ttdeci">#define GTEST_DISALLOW_COPY_AND_ASSIGN_(type)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l00927">gtest.h:927</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_cartesian_product_generator6_html"><div class="ttname"><a href="classtesting_1_1internal_1_1_cartesian_product_generator6.html">testing::internal::CartesianProductGenerator6</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l11931">gtest.h:11931</a></div></div>
- <div class="ttc" id="structtesting_1_1internal_1_1_param_name_gen_func_html"><div class="ttname"><a href="structtesting_1_1internal_1_1_param_name_gen_func.html">testing::internal::ParamNameGenFunc</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l10929">gtest.h:10929</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_1_1edit__distance_html_ad46aa6da12aec1a3f166310478b53a08afdbf30ecf9f32f60c646a34a358615f2"><div class="ttname"><a href="namespacetesting_1_1internal_1_1edit__distance.html#ad46aa6da12aec1a3f166310478b53a08afdbf30ecf9f32f60c646a34a358615f2">testing::internal::edit_distance::kReplace</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l06605">gtest.h:6605</a></div></div>
- <div class="ttc" id="classtesting_1_1_empty_test_event_listener_html_a6e498ae763ac8c1a46bd861e0b7ff3f5"><div class="ttname"><a href="classtesting_1_1_empty_test_event_listener.html#a6e498ae763ac8c1a46bd861e0b7ff3f5">testing::EmptyTestEventListener::OnEnvironmentsSetUpStart</a></div><div class="ttdeci">void OnEnvironmentsSetUpStart(const UnitTest &) override</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l15739">gtest.h:15739</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_cartesian_product_holder10_html_a3255f824dd20e02b8bb718bb7d3d3634"><div class="ttname"><a href="classtesting_1_1internal_1_1_cartesian_product_holder10.html#a3255f824dd20e02b8bb718bb7d3d3634">testing::internal::CartesianProductHolder10::CartesianProductHolder10</a></div><div class="ttdeci">CartesianProductHolder10(const Generator1 &g1, const Generator2 &g2, const Generator3 &g3, const Generator4 &g4, const Generator5 &g5, const Generator6 &g6, const Generator7 &g7, const Generator8 &g8, const Generator9 &g9, const Generator10 &g10)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l13297">gtest.h:13297</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_floating_point_html_af6bf8fab8df572ecb137a3516ff390ae"><div class="ttname"><a href="classtesting_1_1internal_1_1_floating_point.html#af6bf8fab8df572ecb137a3516ff390ae">testing::internal::FloatingPoint::exponent_bits</a></div><div class="ttdeci">Bits exponent_bits() const</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l06762">gtest.h:6762</a></div></div>
- <div class="ttc" id="namespacetesting__internal_html"><div class="ttname"><a href="namespacetesting__internal.html">testing_internal</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l08284">gtest.h:8284</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a17fb8f0125fa92404a249ed38a43faa4a6f88d77d9d763d8a009caf950cfbab28"><div class="ttname"><a href="namespacetesting_1_1internal.html#a17fb8f0125fa92404a249ed38a43faa4a6f88d77d9d763d8a009caf950cfbab28">testing::internal::kPrintOther</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l08438">gtest.h:8438</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a648c1bc94c2ef9e868ff3f9dff0f9c4ea3b1e81f5b14a17b35a8672d57d166507"><div class="ttname"><a href="namespacetesting_1_1internal.html#a648c1bc94c2ef9e868ff3f9dff0f9c4ea3b1e81f5b14a17b35a8672d57d166507">testing::internal::COLOR_GREEN</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l16427">gtest.h:16427</a></div></div>
- <div class="ttc" id="namespaceutl_1_1meta_html_a5b7d36b9e568b81f2df897d56dc23b64"><div class="ttname"><a href="namespaceutl_1_1meta.html#a5b7d36b9e568b81f2df897d56dc23b64">utl::meta::index_</a></div><div class="ttdeci">integral_< index_t, v > index_</div><div class="ttdoc">index_ type: integral constant wrapper for index_t a.k.a std::size_t </div><div class="ttdef"><b>Definition:</b> <a href="integral_8h_source.html#l00106">integral.h:106</a></div></div>
- <div class="ttc" id="namespacetesting_html_a0b9ea6594ac06ad5d9eba2511ffa0fb7"><div class="ttname"><a href="namespacetesting.html#a0b9ea6594ac06ad5d9eba2511ffa0fb7">testing::ValuesIn</a></div><div class="ttdeci">internal::ParamGenerator< T > ValuesIn(const T(&array)[N])</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l13465">gtest.h:13465</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_test_factory_base_html_a18f22a7594336a36642289c1decddc9e"><div class="ttname"><a href="classtesting_1_1internal_1_1_test_factory_base.html#a18f22a7594336a36642289c1decddc9e">testing::internal::TestFactoryBase::~TestFactoryBase</a></div><div class="ttdeci">virtual ~TestFactoryBase()</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l06891">gtest.h:6891</a></div></div>
- <div class="ttc" id="structtesting_1_1internal_1_1bool__constant_html"><div class="ttname"><a href="structtesting_1_1internal_1_1bool__constant.html">testing::internal::bool_constant</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02184">gtest.h:2184</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_parameterized_test_suite_info_html_a174f164f38e522a3935da911a9c1e450"><div class="ttname"><a href="classtesting_1_1internal_1_1_parameterized_test_suite_info.html#a174f164f38e522a3935da911a9c1e450">testing::internal::ParameterizedTestSuiteInfo::AddTestSuiteInstantiation</a></div><div class="ttdeci">int AddTestSuiteInstantiation(const std::string &instantiation_name, GeneratorCreationFunc *func, ParamNameGeneratorFunc *name_func, const char *file, int line)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l11067">gtest.h:11067</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_cartesian_product_generator4_html_ab5e2480f7abacb80850de470c3225412"><div class="ttname"><a href="classtesting_1_1internal_1_1_cartesian_product_generator4.html#ab5e2480f7abacb80850de470c3225412">testing::internal::CartesianProductGenerator4::ParamType</a></div><div class="ttdeci">::std::tuple< T1, T2, T3, T4 > ParamType</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l11615">gtest.h:11615</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_aa7e70a85d66f0c109e3e69629ef577f2"><div class="ttname"><a href="namespacetesting_1_1internal.html#aa7e70a85d66f0c109e3e69629ef577f2">testing::internal::PrintTo</a></div><div class="ttdeci">void PrintTo(unsigned char c, ::std::ostream *os)</div><div class="ttdef"><b>Definition:</b> <a href="gtest-all_8cc_source.html#l11242">gtest-all.cc:11242</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_cartesian_product_generator4_html_ae25a27430e476014a2f07c0be4f030f7"><div class="ttname"><a href="classtesting_1_1internal_1_1_cartesian_product_generator4.html#ae25a27430e476014a2f07c0be4f030f7">testing::internal::CartesianProductGenerator4::End</a></div><div class="ttdeci">ParamIteratorInterface< ParamType > * End() const override</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l11627">gtest.h:11627</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_type_with_size_3_014_01_4_html_a7d559570f830bf35d095eeb94d98de58"><div class="ttname"><a href="classtesting_1_1internal_1_1_type_with_size_3_014_01_4.html#a7d559570f830bf35d095eeb94d98de58">testing::internal::TypeWithSize< 4 >::UInt</a></div><div class="ttdeci">unsigned int UInt</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02458">gtest.h:2458</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_values_in_iterator_range_generator_html_a9070d5b79803164625d3aa77a1659e9f"><div class="ttname"><a href="classtesting_1_1internal_1_1_values_in_iterator_range_generator.html#a9070d5b79803164625d3aa77a1659e9f">testing::internal::ValuesInIteratorRangeGenerator::~ValuesInIteratorRangeGenerator</a></div><div class="ttdeci">~ValuesInIteratorRangeGenerator() override</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l10833">gtest.h:10833</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_floating_point_html_a66065dfc4d5f41100f686159637af23b"><div class="ttname"><a href="classtesting_1_1internal_1_1_floating_point.html#a66065dfc4d5f41100f686159637af23b">testing::internal::FloatingPoint::kExponentBitMask</a></div><div class="ttdeci">static const Bits kExponentBitMask</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l06713">gtest.h:6713</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_assert_helper_html"><div class="ttname"><a href="classtesting_1_1internal_1_1_assert_helper.html">testing::internal::AssertHelper</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l16388">gtest.h:16388</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_1_1posix_html_a3117b067e1f942a2031e666953120ccc"><div class="ttname"><a href="namespacetesting_1_1internal_1_1posix.html#a3117b067e1f942a2031e666953120ccc">testing::internal::posix::FileNo</a></div><div class="ttdeci">int FileNo(FILE *file)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02322">gtest.h:2322</a></div></div>
- <div class="ttc" id="classtesting_1_1_test_event_listener_html_a5f6c84f39851e8a603a2d2e10063816b"><div class="ttname"><a href="classtesting_1_1_test_event_listener.html#a5f6c84f39851e8a603a2d2e10063816b">testing::TestEventListener::OnTestProgramStart</a></div><div class="ttdeci">virtual void OnTestProgramStart(const UnitTest &unit_test)=0</div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_aed8d3ad4341f8f2de53440e39c995632"><div class="ttname"><a href="namespacetesting_1_1internal.html#aed8d3ad4341f8f2de53440e39c995632">testing::internal::GetBoolAssertionFailureMessage</a></div><div class="ttdeci">GTEST_API_ std::string GetBoolAssertionFailureMessage(const AssertionResult &assertion_result, const char *expression_text, const char *actual_predicate_value, const char *expected_predicate_value)</div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_parameterized_test_factory_html_a82d78356cd402224255edec760a048fb"><div class="ttname"><a href="classtesting_1_1internal_1_1_parameterized_test_factory.html#a82d78356cd402224255edec760a048fb">testing::internal::ParameterizedTestFactory::ParameterizedTestFactory</a></div><div class="ttdeci">ParameterizedTestFactory(ParamType parameter)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l10946">gtest.h:10946</a></div></div>
- <div class="ttc" id="classtesting_1_1_test_property_html_a25a0ccf1c75a92af46a48d3c2a873e6d"><div class="ttname"><a href="classtesting_1_1_test_property.html#a25a0ccf1c75a92af46a48d3c2a873e6d">testing::TestProperty::TestProperty</a></div><div class="ttdeci">TestProperty(const std::string &a_key, const std::string &a_value)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l15138">gtest.h:15138</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_type_id_helper_html_a372268b1520d965d0bdf01ebad3d270e"><div class="ttname"><a href="classtesting_1_1internal_1_1_type_id_helper.html#a372268b1520d965d0bdf01ebad3d270e">testing::internal::TypeIdHelper::dummy_</a></div><div class="ttdeci">static bool dummy_</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l06862">gtest.h:6862</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a1ee4cde97868c53e442d3182496a9f3c"><div class="ttname"><a href="namespacetesting_1_1internal.html#a1ee4cde97868c53e442d3182496a9f3c">testing::internal::FormatCompilerIndependentFileLocation</a></div><div class="ttdeci">GTEST_API_ ::std::string FormatCompilerIndependentFileLocation(const char *file, int line)</div><div class="ttdef"><b>Definition:</b> <a href="gtest-all_8cc_source.html#l10638">gtest-all.cc:10638</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_aa6255ef3b023c5b4e1a2198d887fb977aff315e0913fcda86fe4de882bf5e33e9"><div class="ttname"><a href="namespacetesting_1_1internal.html#aa6255ef3b023c5b4e1a2198d887fb977aff315e0913fcda86fe4de882bf5e33e9">testing::internal::GTEST_INFO</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l01220">gtest.h:1220</a></div></div>
- <div class="ttc" id="namespaceproto2_html"><div class="ttname"><a href="namespaceproto2.html">proto2</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l06517">gtest.h:6517</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_ignored_value_html"><div class="ttname"><a href="classtesting_1_1internal_1_1_ignored_value.html">testing::internal::IgnoredValue</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l06544">gtest.h:6544</a></div></div>
- <div class="ttc" id="classtesting_1_1_test_event_listener_html_abb1c44525ef038500608b5dc2f17099b"><div class="ttname"><a href="classtesting_1_1_test_event_listener.html#abb1c44525ef038500608b5dc2f17099b">testing::TestEventListener::OnTestEnd</a></div><div class="ttdeci">virtual void OnTestEnd(const TestInfo &test_info)=0</div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_test_factory_base_html_a07ac3ca0b196cdb092da0bb186b7c030"><div class="ttname"><a href="classtesting_1_1internal_1_1_test_factory_base.html#a07ac3ca0b196cdb092da0bb186b7c030">testing::internal::TestFactoryBase::CreateTest</a></div><div class="ttdeci">virtual Test * CreateTest()=0</div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_parameterized_test_suite_registry_html_ae3827c085ed16faaa9197486513292c0"><div class="ttname"><a href="classtesting_1_1internal_1_1_parameterized_test_suite_registry.html#ae3827c085ed16faaa9197486513292c0">testing::internal::ParameterizedTestSuiteRegistry::ParameterizedTestSuiteRegistry</a></div><div class="ttdeci">ParameterizedTestSuiteRegistry()</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l11207">gtest.h:11207</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_param_generator_html"><div class="ttname"><a href="classtesting_1_1internal_1_1_param_generator.html">testing::internal::ParamGenerator</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l10624">gtest.h:10624</a></div></div>
- <div class="ttc" id="classtesting_1_1_test_event_listener_html_a054f8705c883fa120b91473aff38f2ee"><div class="ttname"><a href="classtesting_1_1_test_event_listener.html#a054f8705c883fa120b91473aff38f2ee">testing::TestEventListener::OnTestPartResult</a></div><div class="ttdeci">virtual void OnTestPartResult(const TestPartResult &test_part_result)=0</div></div>
- <div class="ttc" id="classtesting_1_1_test_info_html_abdf2c6cfcf4819e725816c64e1c1fc24"><div class="ttname"><a href="classtesting_1_1_test_info.html#abdf2c6cfcf4819e725816c64e1c1fc24">testing::TestInfo::value_param</a></div><div class="ttdeci">const char * value_param() const</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l15320">gtest.h:15320</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_1_1posix_html_a4042201dcc4932641d484e7ddf94de7d"><div class="ttname"><a href="namespacetesting_1_1internal_1_1posix.html#a4042201dcc4932641d484e7ddf94de7d">testing::internal::posix::FOpen</a></div><div class="ttdeci">FILE * FOpen(const char *path, const char *mode)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02349">gtest.h:2349</a></div></div>
- <div class="ttc" id="structtesting_1_1internal_1_1_is_a_protocol_message_html"><div class="ttname"><a href="structtesting_1_1internal_1_1_is_a_protocol_message.html">testing::internal::IsAProtocolMessage</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l07392">gtest.h:7392</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_cartesian_product_generator5_html_a381a9c3c18106872251acffe59453a95"><div class="ttname"><a href="classtesting_1_1internal_1_1_cartesian_product_generator5.html#a381a9c3c18106872251acffe59453a95">testing::internal::CartesianProductGenerator5::ParamType</a></div><div class="ttdeci">::std::tuple< T1, T2, T3, T4, T5 > ParamType</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l11766">gtest.h:11766</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_floating_point_html_aab053be914bdc9e507c0db89740c318c"><div class="ttname"><a href="classtesting_1_1internal_1_1_floating_point.html#aab053be914bdc9e507c0db89740c318c">testing::internal::FloatingPoint::bits</a></div><div class="ttdeci">const Bits & bits() const</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l06759">gtest.h:6759</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_cartesian_product_holder5_html"><div class="ttname"><a href="classtesting_1_1internal_1_1_cartesian_product_holder5.html">testing::internal::CartesianProductHolder5</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l13114">gtest.h:13114</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_ac26ce3883bc8919c27074975e958f3b7"><div class="ttname"><a href="namespacetesting_1_1internal.html#ac26ce3883bc8919c27074975e958f3b7">testing::internal::IsLower</a></div><div class="ttdeci">bool IsLower(char ch)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02242">gtest.h:2242</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_1_1posix_html_a15e5b8f2a535ef1b2529b85b861e4846"><div class="ttname"><a href="namespacetesting_1_1internal_1_1posix.html#a15e5b8f2a535ef1b2529b85b861e4846">testing::internal::posix::Close</a></div><div class="ttdeci">int Close(int fd)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02366">gtest.h:2366</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal2_html_aeb8161b0b3ee503347b0662d7028fd57a9bdcf3f1548f498b2b7f097306ea0224"><div class="ttname"><a href="namespacetesting_1_1internal2.html#aeb8161b0b3ee503347b0662d7028fd57a9bdcf3f1548f498b2b7f097306ea0224">testing::internal2::kConvertibleToInteger</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l08166">gtest.h:8166</a></div></div>
- <div class="ttc" id="namespacetesting_html_aa67d0c8470c5f69fcfcacc9e775fa982"><div class="ttname"><a href="namespacetesting.html#aa67d0c8470c5f69fcfcacc9e775fa982">testing::ValuesIn</a></div><div class="ttdeci">internal::ParamGenerator< typename Container::value_type > ValuesIn(const Container &container)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l13470">gtest.h:13470</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_value_array_html"><div class="ttname"><a href="classtesting_1_1internal_1_1_value_array.html">testing::internal::ValueArray</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l11280">gtest.h:11280</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a954ec4a8a932dac7743e77e459ffefdc"><div class="ttname"><a href="namespacetesting_1_1internal.html#a954ec4a8a932dac7743e77e459ffefdc">testing::internal::DefaultParamName</a></div><div class="ttdeci">std::string DefaultParamName(const TestParamInfo< ParamType > &info)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l10912">gtest.h:10912</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a7e60d1478b074801c766eeee9be6c772"><div class="ttname"><a href="namespacetesting_1_1internal.html#a7e60d1478b074801c766eeee9be6c772">testing::internal::UniversalTersePrintTupleFieldsToStrings</a></div><div class="ttdeci">Strings UniversalTersePrintTupleFieldsToStrings(const Tuple &value)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l08948">gtest.h:8948</a></div></div>
- <div class="ttc" id="structtesting_1_1internal_1_1_relation_to_source_reference_html"><div class="ttname"><a href="structtesting_1_1internal_1_1_relation_to_source_reference.html">testing::internal::RelationToSourceReference</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l07567">gtest.h:7567</a></div></div>
- <div class="ttc" id="classtesting_1_1_test_html"><div class="ttname"><a href="classtesting_1_1_test.html">testing::Test</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l15014">gtest.h:15014</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_abf080521ce135deb510e0a7830fd3d33"><div class="ttname"><a href="namespacetesting_1_1internal.html#abf080521ce135deb510e0a7830fd3d33">testing::internal::IsNotContainer</a></div><div class="ttdeci">char IsNotContainer</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l07433">gtest.h:7433</a></div></div>
- <div class="ttc" id="gtest_8h_html_a1adc861b311e3fbd97bcc72e0b0f5962"><div class="ttname"><a href="gtest_8h.html#a1adc861b311e3fbd97bcc72e0b0f5962">TEST_P</a></div><div class="ttdeci">#define TEST_P(test_suite_name, test_name)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l13674">gtest.h:13674</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_param_iterator_html_a7a6aee04e8e44b5c8294929951cfac2b"><div class="ttname"><a href="classtesting_1_1internal_1_1_param_iterator.html#a7a6aee04e8e44b5c8294929951cfac2b">testing::internal::ParamIterator::operator!=</a></div><div class="ttdeci">bool operator!=(const ParamIterator &other) const</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l10689">gtest.h:10689</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a070107e7a8205ad6ec4d538d52b15b38"><div class="ttname"><a href="namespacetesting_1_1internal.html#a070107e7a8205ad6ec4d538d52b15b38">testing::internal::UniversalPrintArray</a></div><div class="ttdeci">void UniversalPrintArray(const char *begin, size_t len, ostream *os)</div><div class="ttdef"><b>Definition:</b> <a href="gtest-all_8cc_source.html#l11316">gtest-all.cc:11316</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_eq_helper_3_01true_01_4_html_a332e92bcca7a71c273e50d800f943fcf"><div class="ttname"><a href="classtesting_1_1internal_1_1_eq_helper_3_01true_01_4.html#a332e92bcca7a71c273e50d800f943fcf">testing::internal::EqHelper< true >::Compare</a></div><div class="ttdeci">static AssertionResult Compare(const char *lhs_expression, const char *rhs_expression, const T1 &lhs, const T2 &rhs, typename EnableIf<!std::is_pointer< T2 >::value >::type *=nullptr)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l16170">gtest.h:16170</a></div></div>
- <div class="ttc" id="classtesting_1_1_test_html_a5ccbac42fee8c5b00b0bfe89b6c49d79"><div class="ttname"><a href="classtesting_1_1_test.html#a5ccbac42fee8c5b00b0bfe89b6c49d79">testing::Test::SetUpTestCase</a></div><div class="ttdeci">static void SetUpTestCase()</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l15040">gtest.h:15040</a></div></div>
- <div class="ttc" id="structtesting_1_1internal_1_1is__same_html"><div class="ttname"><a href="structtesting_1_1internal_1_1is__same.html">testing::internal::is_same</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02194">gtest.h:2194</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a1def8ec9393360a1b34a20528703e7f7"><div class="ttname"><a href="namespacetesting_1_1internal.html#a1def8ec9393360a1b34a20528703e7f7">testing::internal::CmpHelperEQFailure</a></div><div class="ttdeci">AssertionResult CmpHelperEQFailure(const char *lhs_expression, const char *rhs_expression, const T1 &lhs, const T2 &rhs)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l16092">gtest.h:16092</a></div></div>
- <div class="ttc" id="classtesting_1_1_with_param_interface_html_a4e170bd42fa5e8ce48b80cee6bb52e26"><div class="ttname"><a href="classtesting_1_1_with_param_interface.html#a4e170bd42fa5e8ce48b80cee6bb52e26">testing::WithParamInterface::~WithParamInterface</a></div><div class="ttdeci">virtual ~WithParamInterface()</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l16473">gtest.h:16473</a></div></div>
- <div class="ttc" id="classtesting_1_1_test_info_html_a63e7042028b0b846f4b5a1e5bcffc079"><div class="ttname"><a href="classtesting_1_1_test_info.html#a63e7042028b0b846f4b5a1e5bcffc079">testing::TestInfo::is_reportable</a></div><div class="ttdeci">bool is_reportable() const</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l15353">gtest.h:15353</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_floating_point_html_ab819d2e8f93e9e482373999f0f8d71b9"><div class="ttname"><a href="classtesting_1_1internal_1_1_floating_point.html#ab819d2e8f93e9e482373999f0f8d71b9">testing::internal::FloatingPoint::kBitCount</a></div><div class="ttdeci">static const size_t kBitCount</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l06696">gtest.h:6696</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a513107ff8defa97d949937fc1350a56c"><div class="ttname"><a href="namespacetesting_1_1internal.html#a513107ff8defa97d949937fc1350a56c">testing::internal::DiffStrings</a></div><div class="ttdeci">GTEST_API_ std::string DiffStrings(const std::string &left, const std::string &right, size_t *total_line_count)</div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_r_e_html_ab215dbc2565fce641e1746ca43e9d68a"><div class="ttname"><a href="classtesting_1_1internal_1_1_r_e.html#ab215dbc2565fce641e1746ca43e9d68a">testing::internal::RE::RE</a></div><div class="ttdeci">RE(const RE &other)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l01140">gtest.h:1140</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_floating_point_html_a0b756a6d2a4f5f5b41ca79651c06c043"><div class="ttname"><a href="classtesting_1_1internal_1_1_floating_point.html#a0b756a6d2a4f5f5b41ca79651c06c043">testing::internal::FloatingPoint::kFractionBitCount</a></div><div class="ttdeci">static const size_t kFractionBitCount</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l06699">gtest.h:6699</a></div></div>
- <div class="ttc" id="classtesting_1_1_test_info_html_a8621f2cf7623fd1609db8e324f0c2fec"><div class="ttname"><a href="classtesting_1_1_test_info.html#a8621f2cf7623fd1609db8e324f0c2fec">testing::TestInfo::is_in_another_shard</a></div><div class="ttdeci">bool is_in_another_shard() const</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l15332">gtest.h:15332</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a648c1bc94c2ef9e868ff3f9dff0f9c4ea9ebb3ddab9391781f6ee5021e1e443c3"><div class="ttname"><a href="namespacetesting_1_1internal.html#a648c1bc94c2ef9e868ff3f9dff0f9c4ea9ebb3ddab9391781f6ee5021e1e443c3">testing::internal::COLOR_RED</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l16427">gtest.h:16427</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_native_array_html_af96a4a5ca0cdd5d163c47a081f08bd89"><div class="ttname"><a href="classtesting_1_1internal_1_1_native_array.html#af96a4a5ca0cdd5d163c47a081f08bd89">testing::internal::NativeArray::size</a></div><div class="ttdeci">size_t size() const</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l07607">gtest.h:7607</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_param_generator_interface_html_ac2767cb9ad2e292e291c4903323c6eff"><div class="ttname"><a href="classtesting_1_1internal_1_1_param_generator_interface.html#ac2767cb9ad2e292e291c4903323c6eff">testing::internal::ParamGeneratorInterface::~ParamGeneratorInterface</a></div><div class="ttdeci">virtual ~ParamGeneratorInterface()</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l10706">gtest.h:10706</a></div></div>
- <div class="ttc" id="structtesting_1_1internal_1_1_enable_if_html"><div class="ttname"><a href="structtesting_1_1internal_1_1_enable_if.html">testing::internal::EnableIf</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l07491">gtest.h:7491</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a5d3e97443d23bf1824f87feb172efd39"><div class="ttname"><a href="namespacetesting_1_1internal.html#a5d3e97443d23bf1824f87feb172efd39">testing::internal::ReportInvalidTestSuiteType</a></div><div class="ttdeci">GTEST_API_ void ReportInvalidTestSuiteType(const char *test_suite_name, CodeLocation code_location)</div></div>
- <div class="ttc" id="classtesting_1_1_test_suite_html"><div class="ttname"><a href="classtesting_1_1_test_suite.html">testing::TestSuite</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l15429">gtest.h:15429</a></div></div>
- <div class="ttc" id="structtesting_1_1internal_1_1_remove_reference_html_a9ca4f6499579225f7986b789ee4b2895"><div class="ttname"><a href="structtesting_1_1internal_1_1_remove_reference.html#a9ca4f6499579225f7986b789ee4b2895">testing::internal::RemoveReference::type</a></div><div class="ttdeci">T type</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l07306">gtest.h:7306</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_af69e146a989e8d48def39a0cc59461c9"><div class="ttname"><a href="namespacetesting_1_1internal.html#af69e146a989e8d48def39a0cc59461c9">testing::internal::AppendUserMessage</a></div><div class="ttdeci">GTEST_API_ std::string AppendUserMessage(const std::string &gtest_msg, const Message &user_msg)</div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_cartesian_product_holder8_html_adacdd7a2e15963d1b2f559d65f6b2aac"><div class="ttname"><a href="classtesting_1_1internal_1_1_cartesian_product_holder8.html#adacdd7a2e15963d1b2f559d65f6b2aac">testing::internal::CartesianProductHolder8::CartesianProductHolder8</a></div><div class="ttdeci">CartesianProductHolder8(const Generator1 &g1, const Generator2 &g2, const Generator3 &g3, const Generator4 &g4, const Generator5 &g5, const Generator6 &g6, const Generator7 &g7, const Generator8 &g8)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l13214">gtest.h:13214</a></div></div>
- <div class="ttc" id="structtesting_1_1internal_1_1_flat_tuple_elem_base_3_01_flat_tuple_3_01_t_8_8_8_01_4_00_01_i_01_4_html_a153da382b00977dfb5974f85dd31ea58"><div class="ttname"><a href="structtesting_1_1internal_1_1_flat_tuple_elem_base_3_01_flat_tuple_3_01_t_8_8_8_01_4_00_01_i_01_4.html#a153da382b00977dfb5974f85dd31ea58">testing::internal::FlatTupleElemBase< FlatTuple< T... >, I >::FlatTupleElemBase</a></div><div class="ttdeci">FlatTupleElemBase(value_type t)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l07704">gtest.h:7704</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_param_iterator_html_ac96f133ffa06fc0f9faff5a1c7954382"><div class="ttname"><a href="classtesting_1_1internal_1_1_param_iterator.html#ac96f133ffa06fc0f9faff5a1c7954382">testing::internal::ParamIterator::reference</a></div><div class="ttdeci">const T & reference</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l10662">gtest.h:10662</a></div></div>
- <div class="ttc" id="classtesting_1_1_empty_test_event_listener_html_a709d7077c086c877d214231bc520ef90"><div class="ttname"><a href="classtesting_1_1_empty_test_event_listener.html#a709d7077c086c877d214231bc520ef90">testing::EmptyTestEventListener::OnTestEnd</a></div><div class="ttdeci">void OnTestEnd(const TestInfo &) override</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l15749">gtest.h:15749</a></div></div>
- <div class="ttc" id="gtest_8h_html_a8e5aab8276b2645f64f41c9e3021b935"><div class="ttname"><a href="gtest_8h.html#a8e5aab8276b2645f64f41c9e3021b935">GTEST_MUST_USE_RESULT_</a></div><div class="ttdeci">#define GTEST_MUST_USE_RESULT_</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l00939">gtest.h:939</a></div></div>
- <div class="ttc" id="structtesting_1_1internal_1_1_suite_api_resolver_html"><div class="ttname"><a href="structtesting_1_1internal_1_1_suite_api_resolver.html">testing::internal::SuiteApiResolver</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l06952">gtest.h:6952</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_ac1b876a8133895bd553d4780ecaa1e3a"><div class="ttname"><a href="namespacetesting_1_1internal.html#ac1b876a8133895bd553d4780ecaa1e3a">testing::internal::ToUpper</a></div><div class="ttdeci">char ToUpper(char ch)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02262">gtest.h:2262</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_cartesian_product_generator6_html_a6d59c2e75fd2a0a042ee102e08956f7f"><div class="ttname"><a href="classtesting_1_1internal_1_1_cartesian_product_generator6.html#a6d59c2e75fd2a0a042ee102e08956f7f">testing::internal::CartesianProductGenerator6::~CartesianProductGenerator6</a></div><div class="ttdeci">~CartesianProductGenerator6() override</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l11941">gtest.h:11941</a></div></div>
- <div class="ttc" id="structtesting_1_1internal_1_1_code_location_html_a38118056ad3c11359920274e393bc6b3"><div class="ttname"><a href="structtesting_1_1internal_1_1_code_location.html#a38118056ad3c11359920274e393bc6b3">testing::internal::CodeLocation::file</a></div><div class="ttdeci">std::string file</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l06933">gtest.h:6933</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_cartesian_product_generator7_html_ac8b315cd7dbe5566d5ff98b04921b815"><div class="ttname"><a href="classtesting_1_1internal_1_1_cartesian_product_generator7.html#ac8b315cd7dbe5566d5ff98b04921b815">testing::internal::CartesianProductGenerator7::Begin</a></div><div class="ttdeci">ParamIteratorInterface< ParamType > * Begin() const override</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l12129">gtest.h:12129</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_floating_point_html_aac498b3714d93f8e88cdc30e4c5935f6"><div class="ttname"><a href="classtesting_1_1internal_1_1_floating_point.html#aac498b3714d93f8e88cdc30e4c5935f6">testing::internal::FloatingPoint::kMaxUlps</a></div><div class="ttdeci">static const size_t kMaxUlps</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l06727">gtest.h:6727</a></div></div>
- <div class="ttc" id="namespacetesting_html_a69106491c2e7f50e50da0ce5e8ae4374"><div class="ttname"><a href="namespacetesting.html#a69106491c2e7f50e50da0ce5e8ae4374">testing::FloatLE</a></div><div class="ttdeci">GTEST_API_ AssertionResult FloatLE(const char *expr1, const char *expr2, float val1, float val2)</div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a8ec00d458d0d442bd64af7b5f9c22dda"><div class="ttname"><a href="namespacetesting_1_1internal.html#a8ec00d458d0d442bd64af7b5f9c22dda">testing::internal::CaptureStderr</a></div><div class="ttdeci">void CaptureStderr()</div><div class="ttdef"><b>Definition:</b> <a href="gtest-all_8cc_source.html#l10784">gtest-all.cc:10784</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_floating_point_html_a460027cc19cf01ae8e09cc3796b2b575"><div class="ttname"><a href="classtesting_1_1internal_1_1_floating_point.html#a460027cc19cf01ae8e09cc3796b2b575">testing::internal::FloatingPoint::Infinity</a></div><div class="ttdeci">static RawType Infinity()</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l06749">gtest.h:6749</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_cartesian_product_holder8_html"><div class="ttname"><a href="classtesting_1_1internal_1_1_cartesian_product_holder8.html">testing::internal::CartesianProductHolder8</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l13212">gtest.h:13212</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_parameterized_test_factory_html"><div class="ttname"><a href="classtesting_1_1internal_1_1_parameterized_test_factory.html">testing::internal::ParameterizedTestFactory</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l10943">gtest.h:10943</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_1_1posix_html_a69b8278c59359dd6a6f941b4643db9fb"><div class="ttname"><a href="namespacetesting_1_1internal_1_1posix.html#a69b8278c59359dd6a6f941b4643db9fb">testing::internal::posix::Abort</a></div><div class="ttdeci">void Abort()</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02392">gtest.h:2392</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_thread_local_html"><div class="ttname"><a href="classtesting_1_1internal_1_1_thread_local.html">testing::internal::ThreadLocal</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02165">gtest.h:2165</a></div></div>
- <div class="ttc" id="classtesting_1_1_test_info_html_af5931cfc594b5d660c56b3c61c41ea13"><div class="ttname"><a href="classtesting_1_1_test_info.html#af5931cfc594b5d660c56b3c61c41ea13">testing::TestInfo::line</a></div><div class="ttdeci">int line() const</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l15329">gtest.h:15329</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_eq_helper_html_ae3572c7374534a916b9117efaa89f33f"><div class="ttname"><a href="classtesting_1_1internal_1_1_eq_helper.html#ae3572c7374534a916b9117efaa89f33f">testing::internal::EqHelper::Compare</a></div><div class="ttdeci">static AssertionResult Compare(const char *lhs_expression, const char *rhs_expression, const T1 &lhs, const T2 &rhs)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l16139">gtest.h:16139</a></div></div>
- <div class="ttc" id="structtesting_1_1internal_1_1_iterator_traits_3_01_t_01_5_01_4_html_a7e46869ed36cc5aea898e243d270a8be"><div class="ttname"><a href="structtesting_1_1internal_1_1_iterator_traits_3_01_t_01_5_01_4.html#a7e46869ed36cc5aea898e243d270a8be">testing::internal::IteratorTraits< T * >::value_type</a></div><div class="ttdeci">T value_type</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02207">gtest.h:2207</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_format_for_comparison_html_a2aeb688fc55b57abd3021d82eccad896"><div class="ttname"><a href="classtesting_1_1internal_1_1_format_for_comparison.html#a2aeb688fc55b57abd3021d82eccad896">testing::internal::FormatForComparison::Format</a></div><div class="ttdeci">::std::string Format(const ToPrint &value)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l08342">gtest.h:8342</a></div></div>
- <div class="ttc" id="classtesting_1_1_test_event_listener_html"><div class="ttname"><a href="classtesting_1_1_test_event_listener.html">testing::TestEventListener</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l15669">gtest.h:15669</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_cartesian_product_holder9_html_a692a537863ab6adfc4001564887a3bc7"><div class="ttname"><a href="classtesting_1_1internal_1_1_cartesian_product_holder9.html#a692a537863ab6adfc4001564887a3bc7">testing::internal::CartesianProductHolder9::CartesianProductHolder9</a></div><div class="ttdeci">CartesianProductHolder9(const Generator1 &g1, const Generator2 &g2, const Generator3 &g3, const Generator4 &g4, const Generator5 &g5, const Generator6 &g6, const Generator7 &g7, const Generator8 &g8, const Generator9 &g9)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l13254">gtest.h:13254</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_floating_point_html_a965214c1af2f9ac5adb1393794aa81e5"><div class="ttname"><a href="classtesting_1_1internal_1_1_floating_point.html#a965214c1af2f9ac5adb1393794aa81e5">testing::internal::FloatingPoint::AlmostEquals</a></div><div class="ttdeci">bool AlmostEquals(const FloatingPoint &rhs) const</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l06783">gtest.h:6783</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a648c1bc94c2ef9e868ff3f9dff0f9c4eafcd8803dc9e37e374d5a4486afc230b7"><div class="ttname"><a href="namespacetesting_1_1internal.html#a648c1bc94c2ef9e868ff3f9dff0f9c4eafcd8803dc9e37e374d5a4486afc230b7">testing::internal::COLOR_DEFAULT</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l16427">gtest.h:16427</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a2135f223bf6b527729aeaa651115183b"><div class="ttname"><a href="namespacetesting_1_1internal.html#a2135f223bf6b527729aeaa651115183b">testing::internal::FlushInfoLog</a></div><div class="ttdeci">void FlushInfoLog()</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l01251">gtest.h:1251</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_1_1posix_html_a36fca815713332e5c6dc92c98b6b2574"><div class="ttname"><a href="namespacetesting_1_1internal_1_1posix.html#a36fca815713332e5c6dc92c98b6b2574">testing::internal::posix::StrNCpy</a></div><div class="ttdeci">const char * StrNCpy(char *dest, const char *src, size_t n)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02338">gtest.h:2338</a></div></div>
- <div class="ttc" id="gtest_8h_html_a69abff5a4efdd07bd5faebe3dd318d06"><div class="ttname"><a href="gtest_8h.html#a69abff5a4efdd07bd5faebe3dd318d06">GTEST_LOCK_EXCLUDED_</a></div><div class="ttdeci">#define GTEST_LOCK_EXCLUDED_(locks)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02515">gtest.h:2515</a></div></div>
- <div class="ttc" id="gtest_8h_html_a853a3792807489591d3d4a2f2ff9359f"><div class="ttname"><a href="gtest_8h.html#a853a3792807489591d3d4a2f2ff9359f">RUN_ALL_TESTS</a></div><div class="ttdeci">int RUN_ALL_TESTS() GTEST_MUST_USE_RESULT_</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l17097">gtest.h:17097</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_aa6a1ac454e6d7e550fa4925c62c35caa"><div class="ttname"><a href="namespacetesting_1_1internal.html#aa6a1ac454e6d7e550fa4925c62c35caa">testing::internal::UInt64</a></div><div class="ttdeci">TypeWithSize< 8 >::UInt UInt64</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02478">gtest.h:2478</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a1edf90480571c0659a39d13e3777d9ce"><div class="ttname"><a href="namespacetesting_1_1internal.html#a1edf90480571c0659a39d13e3777d9ce">testing::internal::CmpHelperEQ</a></div><div class="ttdeci">GTEST_API_ AssertionResult CmpHelperEQ(const char *lhs_expression, const char *rhs_expression, BiggestInt lhs, BiggestInt rhs)</div></div>
- <div class="ttc" id="classtesting_1_1_empty_test_event_listener_html_aaa9d683e8e0c850af67a0b92d785ddb9"><div class="ttname"><a href="classtesting_1_1_empty_test_event_listener.html#aaa9d683e8e0c850af67a0b92d785ddb9">testing::EmptyTestEventListener::OnTestProgramEnd</a></div><div class="ttdeci">void OnTestProgramEnd(const UnitTest &) override</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l15759">gtest.h:15759</a></div></div>
- <div class="ttc" id="namespacetesting_html_a661e70fc6afeb5c085eed3716aa45059"><div class="ttname"><a href="namespacetesting.html#a661e70fc6afeb5c085eed3716aa45059">testing::StaticAssertTypeEq</a></div><div class="ttdeci">bool StaticAssertTypeEq()</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l16927">gtest.h:16927</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_ac46308aa3c0294ae446a40115aeb32c6"><div class="ttname"><a href="namespacetesting_1_1internal.html#ac46308aa3c0294ae446a40115aeb32c6">testing::internal::PrintWideStringTo</a></div><div class="ttdeci">void PrintWideStringTo(const ::std::wstring &s, ostream *os)</div><div class="ttdef"><b>Definition:</b> <a href="gtest-all_8cc_source.html#l11448">gtest-all.cc:11448</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_parameterized_test_suite_info_base_html"><div class="ttname"><a href="classtesting_1_1internal_1_1_parameterized_test_suite_info_base.html">testing::internal::ParameterizedTestSuiteInfoBase</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l11005">gtest.h:11005</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_cartesian_product_holder6_html_a7bb6f9224a1a6766e3634eb392e1b5f6"><div class="ttname"><a href="classtesting_1_1internal_1_1_cartesian_product_holder6.html#a7bb6f9224a1a6766e3634eb392e1b5f6">testing::internal::CartesianProductHolder6::CartesianProductHolder6</a></div><div class="ttdeci">CartesianProductHolder6(const Generator1 &g1, const Generator2 &g2, const Generator3 &g3, const Generator4 &g4, const Generator5 &g5, const Generator6 &g6)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l13145">gtest.h:13145</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_ignored_value_html_a6c72839c07a9da8d027efb253144bd91"><div class="ttname"><a href="classtesting_1_1internal_1_1_ignored_value.html#a6c72839c07a9da8d027efb253144bd91">testing::internal::IgnoredValue::IgnoredValue</a></div><div class="ttdeci">IgnoredValue(const T &)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l06552">gtest.h:6552</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a84f3baa379fec6bf5947cb5165aa8cc9"><div class="ttname"><a href="namespacetesting_1_1internal.html#a84f3baa379fec6bf5947cb5165aa8cc9">testing::internal::IsUpper</a></div><div class="ttdeci">bool IsUpper(char ch)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02248">gtest.h:2248</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_universal_printer_3_01_t[_n]_4_html_a1cf0e7c8db59c090f769116c6421b212"><div class="ttname"><a href="classtesting_1_1internal_1_1_universal_printer_3_01_t[_n]_4.html#a1cf0e7c8db59c090f769116c6421b212">testing::internal::UniversalPrinter< T[N]>::Print</a></div><div class="ttdeci">static void Print(const T(&a)[N], ::std::ostream *os)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l08818">gtest.h:8818</a></div></div>
- <div class="ttc" id="structtesting_1_1internal_1_1_remove_const_html_a1be32027ea4edcc0d15abd59aba4a97f"><div class="ttname"><a href="structtesting_1_1internal_1_1_remove_const.html#a1be32027ea4edcc0d15abd59aba4a97f">testing::internal::RemoveConst::type</a></div><div class="ttdeci">T type</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l07319">gtest.h:7319</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_g_test_mutex_lock_html_a77e3cba326d5356b4a1dea3790559c26"><div class="ttname"><a href="classtesting_1_1internal_1_1_g_test_mutex_lock.html#a77e3cba326d5356b4a1dea3790559c26">testing::internal::GTestMutexLock::GTestMutexLock</a></div><div class="ttdeci">GTestMutexLock(Mutex *)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02159">gtest.h:2159</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a6300aa1440d0019cf08d9a1f6efd4382"><div class="ttname"><a href="namespacetesting_1_1internal.html#a6300aa1440d0019cf08d9a1f6efd4382">testing::internal::TersePrintPrefixToStrings</a></div><div class="ttdeci">void TersePrintPrefixToStrings(const Tuple &, std::integral_constant< size_t, 0 >, Strings *)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l08931">gtest.h:8931</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_test_meta_factory_base_html_a853daab362740bcac55e180128d564ef"><div class="ttname"><a href="classtesting_1_1internal_1_1_test_meta_factory_base.html#a853daab362740bcac55e180128d564ef">testing::internal::TestMetaFactoryBase::CreateTestFactory</a></div><div class="ttdeci">virtual TestFactoryBase * CreateTestFactory(ParamType parameter)=0</div></div>
- <div class="ttc" id="classtesting_1_1_test_event_listener_html_a468b5e6701bcb86cb2c956caadbba5e4"><div class="ttname"><a href="classtesting_1_1_test_event_listener.html#a468b5e6701bcb86cb2c956caadbba5e4">testing::TestEventListener::OnEnvironmentsTearDownStart</a></div><div class="ttdeci">virtual void OnEnvironmentsTearDownStart(const UnitTest &unit_test)=0</div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_random_html_a6e112be5e7cce00551f6383025f69460"><div class="ttname"><a href="classtesting_1_1internal_1_1_random.html#a6e112be5e7cce00551f6383025f69460">testing::internal::Random::Random</a></div><div class="ttdeci">Random(UInt32 seed)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l07280">gtest.h:7280</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_cartesian_product_generator3_html"><div class="ttname"><a href="classtesting_1_1internal_1_1_cartesian_product_generator3.html">testing::internal::CartesianProductGenerator3</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l11480">gtest.h:11480</a></div></div>
- <div class="ttc" id="gtest_8h_html_ac33e7cdfb5d44a7a0f0ab552eb5c3c6a"><div class="ttname"><a href="gtest_8h.html#ac33e7cdfb5d44a7a0f0ab552eb5c3c6a">EXPECT_TRUE</a></div><div class="ttdeci">#define EXPECT_TRUE(condition)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l16584">gtest.h:16584</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_afb1b9728aaaf6d9fe6246a19cfe3f7f5"><div class="ttname"><a href="namespacetesting_1_1internal.html#afb1b9728aaaf6d9fe6246a19cfe3f7f5">testing::internal::CopyArray</a></div><div class="ttdeci">void CopyArray(const T *from, size_t size, U *to)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l07557">gtest.h:7557</a></div></div>
- <div class="ttc" id="namespacetesting_html_a7f73180474723be6e92185d6fa9e7c9f"><div class="ttname"><a href="namespacetesting.html#a7f73180474723be6e92185d6fa9e7c9f">testing::AssertPred1Helper</a></div><div class="ttdeci">AssertionResult AssertPred1Helper(const char *pred_text, const char *e1, Pred pred, const T1 &v1)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l14715">gtest.h:14715</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_param_iterator_html_a8019f54ea1c66ca39ffdec47acfabfe6"><div class="ttname"><a href="classtesting_1_1internal_1_1_param_iterator.html#a8019f54ea1c66ca39ffdec47acfabfe6">testing::internal::ParamIterator::operator=</a></div><div class="ttdeci">ParamIterator & operator=(const ParamIterator &other)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l10667">gtest.h:10667</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_cartesian_product_generator8_html_a707b5a6f598da1f6b997e3b1ad771aca"><div class="ttname"><a href="classtesting_1_1internal_1_1_cartesian_product_generator8.html#a707b5a6f598da1f6b997e3b1ad771aca">testing::internal::CartesianProductGenerator8::Begin</a></div><div class="ttdeci">ParamIteratorInterface< ParamType > * Begin() const override</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l12334">gtest.h:12334</a></div></div>
- <div class="ttc" id="namespacetesting_html_aa09221196f0a830d5bf1c63ffce69dc3"><div class="ttname"><a href="namespacetesting.html#aa09221196f0a830d5bf1c63ffce69dc3">testing::GTEST_ATTRIBUTE_UNUSED_</a></div><div class="ttdeci">class GTEST_API_ testing::ScopedTrace GTEST_ATTRIBUTE_UNUSED_</div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a3682f962ae0ec1c0eca6444ca0a09e91"><div class="ttname"><a href="namespacetesting_1_1internal.html#a3682f962ae0ec1c0eca6444ca0a09e91">testing::internal::GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_</a></div><div class="ttdeci">GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(char)</div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_r_e_html_a8840bd639642f3d4769a94a68ce463c2"><div class="ttname"><a href="classtesting_1_1internal_1_1_r_e.html#a8840bd639642f3d4769a94a68ce463c2">testing::internal::RE::RE</a></div><div class="ttdeci">RE(const ::std::string &regex)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l01143">gtest.h:1143</a></div></div>
- <div class="ttc" id="classtesting_1_1_with_param_interface_html"><div class="ttname"><a href="classtesting_1_1_with_param_interface.html">testing::WithParamInterface</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l16470">gtest.h:16470</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_floating_point_html_a1973d843c00781053d3073daa8a40119"><div class="ttname"><a href="classtesting_1_1internal_1_1_floating_point.html#a1973d843c00781053d3073daa8a40119">testing::internal::FloatingPoint::kExponentBitCount</a></div><div class="ttdeci">static const size_t kExponentBitCount</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l06703">gtest.h:6703</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_eq_helper_html"><div class="ttname"><a href="classtesting_1_1internal_1_1_eq_helper.html">testing::internal::EqHelper</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l16135">gtest.h:16135</a></div></div>
- <div class="ttc" id="gtest_8h_html_aab2ee98cb616054b1d3a7dc71efe81fc"><div class="ttname"><a href="gtest_8h.html#aab2ee98cb616054b1d3a7dc71efe81fc">GTEST_DECLARE_int32_</a></div><div class="ttdeci">#define GTEST_DECLARE_int32_(name)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02497">gtest.h:2497</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_mutex_html"><div class="ttname"><a href="classtesting_1_1internal_1_1_mutex.html">testing::internal::Mutex</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02139">gtest.h:2139</a></div></div>
- <div class="ttc" id="classtesting_1_1_with_param_interface_html_a1078d4493d7aa4d3e50d1d6c661bee4d"><div class="ttname"><a href="classtesting_1_1_with_param_interface.html#a1078d4493d7aa4d3e50d1d6c661bee4d">testing::WithParamInterface::GetParam</a></div><div class="ttdeci">static const ParamType & GetParam()</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l16477">gtest.h:16477</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_test_meta_factory_html_a1a48d63fbff650741c8f718af5c373d2"><div class="ttname"><a href="classtesting_1_1internal_1_1_test_meta_factory.html#a1a48d63fbff650741c8f718af5c373d2">testing::internal::TestMetaFactory::TestMetaFactory</a></div><div class="ttdeci">TestMetaFactory()</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l10985">gtest.h:10985</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_universal_printer_html"><div class="ttname"><a href="classtesting_1_1internal_1_1_universal_printer.html">testing::internal::UniversalPrinter</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l08429">gtest.h:8429</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a94a857fe6ff32cf4fdc4769a4071f239"><div class="ttname"><a href="namespacetesting_1_1internal.html#a94a857fe6ff32cf4fdc4769a4071f239">testing::internal::ArrayAwareFind</a></div><div class="ttdeci">Iter ArrayAwareFind(Iter begin, Iter end, const Element &elem)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l07528">gtest.h:7528</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_cartesian_product_generator6_html_a952895ad20d5a89b913f80ad2f54391b"><div class="ttname"><a href="classtesting_1_1internal_1_1_cartesian_product_generator6.html#a952895ad20d5a89b913f80ad2f54391b">testing::internal::CartesianProductGenerator6::End</a></div><div class="ttdeci">ParamIteratorInterface< ParamType > * End() const override</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l11947">gtest.h:11947</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_cartesian_product_generator4_html_a4e4512b35f0d71f7a718ded6fe829296"><div class="ttname"><a href="classtesting_1_1internal_1_1_cartesian_product_generator4.html#a4e4512b35f0d71f7a718ded6fe829296">testing::internal::CartesianProductGenerator4::CartesianProductGenerator4</a></div><div class="ttdeci">CartesianProductGenerator4(const ParamGenerator< T1 > &g1, const ParamGenerator< T2 > &g2, const ParamGenerator< T3 > &g3, const ParamGenerator< T4 > &g4)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l11617">gtest.h:11617</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_cartesian_product_generator10_html_ac9f50e9b6fff8dad968c5b98989752f9"><div class="ttname"><a href="classtesting_1_1internal_1_1_cartesian_product_generator10.html#ac9f50e9b6fff8dad968c5b98989752f9">testing::internal::CartesianProductGenerator10::ParamType</a></div><div class="ttdeci">::std::tuple< T1, T2, T3, T4, T5, T6, T7, T8, T9, T10 > ParamType</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l12784">gtest.h:12784</a></div></div>
- <div class="ttc" id="structtesting_1_1internal_1_1_const_char_ptr_html_adba40d23d5986904b605946f643cf26e"><div class="ttname"><a href="structtesting_1_1internal_1_1_const_char_ptr.html#adba40d23d5986904b605946f643cf26e">testing::internal::ConstCharPtr::value</a></div><div class="ttdeci">const char * value</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l07268">gtest.h:7268</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_floating_point_html_a0ac75d4ffd24f14bca452abe8a718da1"><div class="ttname"><a href="classtesting_1_1internal_1_1_floating_point.html#a0ac75d4ffd24f14bca452abe8a718da1">testing::internal::FloatingPoint::kFractionBitMask</a></div><div class="ttdeci">static const Bits kFractionBitMask</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l06709">gtest.h:6709</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_param_iterator_interface_html_a600dbd35fcb551463e379516a1abea48"><div class="ttname"><a href="classtesting_1_1internal_1_1_param_iterator_interface.html#a600dbd35fcb551463e379516a1abea48">testing::internal::ParamIteratorInterface::Advance</a></div><div class="ttdeci">virtual void Advance()=0</div></div>
- <div class="ttc" id="namespacetesting_html_addcf52b273ce17269cbf4956cfe600a6"><div class="ttname"><a href="namespacetesting.html#addcf52b273ce17269cbf4956cfe600a6">testing::AssertPred5Helper</a></div><div class="ttdeci">AssertionResult AssertPred5Helper(const char *pred_text, const char *e1, const char *e2, const char *e3, const char *e4, const char *e5, Pred pred, const T1 &v1, const T2 &v2, const T3 &v3, const T4 &v4, const T5 &v5)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l14926">gtest.h:14926</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_native_array_html_a55ab5948d473a487303dcf6e02ad1f60"><div class="ttname"><a href="classtesting_1_1internal_1_1_native_array.html#a55ab5948d473a487303dcf6e02ad1f60">testing::internal::NativeArray::~NativeArray</a></div><div class="ttdeci">~NativeArray()</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l07601">gtest.h:7601</a></div></div>
- <div class="ttc" id="classtesting_1_1_test_suite_html_adec55446c23dc2d0bfea91c6125a1047"><div class="ttname"><a href="classtesting_1_1_test_suite.html#adec55446c23dc2d0bfea91c6125a1047">testing::TestSuite::Failed</a></div><div class="ttdeci">bool Failed() const</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l15491">gtest.h:15491</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_1_1edit__distance_html_a48cffebc6d3169ad1df7849b5f7fb5ff"><div class="ttname"><a href="namespacetesting_1_1internal_1_1edit__distance.html#a48cffebc6d3169ad1df7849b5f7fb5ff">testing::internal::edit_distance::CreateUnifiedDiff</a></div><div class="ttdeci">GTEST_API_ std::string CreateUnifiedDiff(const std::vector< std::string > &left, const std::vector< std::string > &right, size_t context=2)</div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_cartesian_product_generator9_html_a86742cdf8f015ff11f7a40f0b66179c7"><div class="ttname"><a href="classtesting_1_1internal_1_1_cartesian_product_generator9.html#a86742cdf8f015ff11f7a40f0b66179c7">testing::internal::CartesianProductGenerator9::ParamType</a></div><div class="ttdeci">::std::tuple< T1, T2, T3, T4, T5, T6, T7, T8, T9 > ParamType</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l12545">gtest.h:12545</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a271c563fec38b804ddab0677f51f70a8"><div class="ttname"><a href="namespacetesting_1_1internal.html#a271c563fec38b804ddab0677f51f70a8">testing::internal::Int64</a></div><div class="ttdeci">TypeWithSize< 8 >::Int Int64</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02477">gtest.h:2477</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_type_with_size_3_014_01_4_html_a80351860c00ed665e73f952143f4484a"><div class="ttname"><a href="classtesting_1_1internal_1_1_type_with_size_3_014_01_4.html#a80351860c00ed665e73f952143f4484a">testing::internal::TypeWithSize< 4 >::Int</a></div><div class="ttdeci">int Int</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02457">gtest.h:2457</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_mutex_html_af45bf1660ac4110338a02a8680b2f486"><div class="ttname"><a href="classtesting_1_1internal_1_1_mutex.html#af45bf1660ac4110338a02a8680b2f486">testing::internal::Mutex::AssertHeld</a></div><div class="ttdeci">void AssertHeld() const</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02144">gtest.h:2144</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_test_factory_base_html"><div class="ttname"><a href="classtesting_1_1internal_1_1_test_factory_base.html">testing::internal::TestFactoryBase</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l06889">gtest.h:6889</a></div></div>
- <div class="ttc" id="structtesting_1_1internal_1_1_iterator_traits_html_a29de4320a9c53ce438d3561b94e515bb"><div class="ttname"><a href="structtesting_1_1internal_1_1_iterator_traits.html#a29de4320a9c53ce438d3561b94e515bb">testing::internal::IteratorTraits::value_type</a></div><div class="ttdeci">Iterator::value_type value_type</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02201">gtest.h:2201</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_cartesian_product_generator2_html_aa68e7d9334ba6318bc17ccb0669767fe"><div class="ttname"><a href="classtesting_1_1internal_1_1_cartesian_product_generator2.html#aa68e7d9334ba6318bc17ccb0669767fe">testing::internal::CartesianProductGenerator2::Begin</a></div><div class="ttdeci">ParamIteratorInterface< ParamType > * Begin() const override</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l11375">gtest.h:11375</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a04786aa10f8b0bf38a5ead94d00475f4"><div class="ttname"><a href="namespacetesting_1_1internal.html#a04786aa10f8b0bf38a5ead94d00475f4">testing::internal::SetUpTearDownSuiteFuncType</a></div><div class="ttdeci">void(*)() SetUpTearDownSuiteFuncType</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l06941">gtest.h:6941</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_universal_terse_printer_3_01_t[_n]_4_html_a9e0ceb62fda7dc46ebcf5f911e459a49"><div class="ttname"><a href="classtesting_1_1internal_1_1_universal_terse_printer_3_01_t[_n]_4.html#a9e0ceb62fda7dc46ebcf5f911e459a49">testing::internal::UniversalTersePrinter< T[N]>::Print</a></div><div class="ttdeci">static void Print(const T(&value)[N], ::std::ostream *os)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l08864">gtest.h:8864</a></div></div>
- <div class="ttc" id="classtesting_1_1_message_html_ac126e24804817a053bebba0920d94a11"><div class="ttname"><a href="classtesting_1_1_message.html#ac126e24804817a053bebba0920d94a11">testing::Message::Message</a></div><div class="ttdeci">Message(const Message &msg)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02655">gtest.h:2655</a></div></div>
- <div class="ttc" id="structtesting_1_1internal_1_1_suite_api_resolver_html_a460c8a0039577824e9170e6c332b530f"><div class="ttname"><a href="structtesting_1_1internal_1_1_suite_api_resolver.html#a460c8a0039577824e9170e6c332b530f">testing::internal::SuiteApiResolver::GetSetUpCaseOrSuite</a></div><div class="ttdeci">static SetUpTearDownSuiteFuncType GetSetUpCaseOrSuite()</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l06958">gtest.h:6958</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_cartesian_product_holder2_html_a504471500c3171f7efee84b830004ff9"><div class="ttname"><a href="classtesting_1_1internal_1_1_cartesian_product_holder2.html#a504471500c3171f7efee84b830004ff9">testing::internal::CartesianProductHolder2::CartesianProductHolder2</a></div><div class="ttdeci">CartesianProductHolder2(const Generator1 &g1, const Generator2 &g2)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l13043">gtest.h:13043</a></div></div>
- <div class="ttc" id="structtesting_1_1_test_param_info_html_ad4d7bc02cbcc571eb3c1d2ec3ba5bb53"><div class="ttname"><a href="structtesting_1_1_test_param_info.html#ad4d7bc02cbcc571eb3c1d2ec3ba5bb53">testing::TestParamInfo::index</a></div><div class="ttdeci">size_t index</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l10599">gtest.h:10599</a></div></div>
- <div class="ttc" id="namespaceutl_html_ae0f873b4883af7cc18cb23dd2810f4e6"><div class="ttname"><a href="namespaceutl.html#ae0f873b4883af7cc18cb23dd2810f4e6">utl::swap</a></div><div class="ttdeci">void swap(array< _Tp, _Nm > &lhs, array< _Tp, _Nm > &rhs) noexcept(noexcept(lhs.swap(rhs)))</div><div class="ttdef"><b>Definition:</b> <a href="array_8h_source.html#l00214">array.h:214</a></div></div>
- <div class="ttc" id="classtesting_1_1_test_property_html_ad423a07af33c88b0c9ed33ee74815a63"><div class="ttname"><a href="classtesting_1_1_test_property.html#ad423a07af33c88b0c9ed33ee74815a63">testing::TestProperty::value</a></div><div class="ttdeci">const char * value() const</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l15148">gtest.h:15148</a></div></div>
- <div class="ttc" id="classtesting_1_1_test_event_listener_html_a841e522e537bb858d21eb75d0228d3b5"><div class="ttname"><a href="classtesting_1_1_test_event_listener.html#a841e522e537bb858d21eb75d0228d3b5">testing::TestEventListener::OnTestSuiteEnd</a></div><div class="ttdeci">virtual void OnTestSuiteEnd(const TestSuite &test_suite)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l15708">gtest.h:15708</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_type_with_size_3_018_01_4_html_a36d5697e5f5254b0495f13c97d747e36"><div class="ttname"><a href="classtesting_1_1internal_1_1_type_with_size_3_018_01_4.html#a36d5697e5f5254b0495f13c97d747e36">testing::internal::TypeWithSize< 8 >::Int</a></div><div class="ttdeci">long long Int</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02469">gtest.h:2469</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_thread_local_html_a106f3a3ad15d08f95f9887105d2a1af5"><div class="ttname"><a href="classtesting_1_1internal_1_1_thread_local.html#a106f3a3ad15d08f95f9887105d2a1af5">testing::internal::ThreadLocal::ThreadLocal</a></div><div class="ttdeci">ThreadLocal()</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02167">gtest.h:2167</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_1_1posix_html_af7c268eba32d5a718b36b6b3801302e0"><div class="ttname"><a href="namespacetesting_1_1internal_1_1posix.html#af7c268eba32d5a718b36b6b3801302e0">testing::internal::posix::FDOpen</a></div><div class="ttdeci">FILE * FDOpen(int fd, const char *mode)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02356">gtest.h:2356</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_values_in_iterator_range_generator_html_a298cfb66a90b1a39c0cea3ca7ae1ece1"><div class="ttname"><a href="classtesting_1_1internal_1_1_values_in_iterator_range_generator.html#a298cfb66a90b1a39c0cea3ca7ae1ece1">testing::internal::ValuesInIteratorRangeGenerator::End</a></div><div class="ttdeci">ParamIteratorInterface< T > * End() const override</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l10838">gtest.h:10838</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_ad901880198832bc166d2493096b451f7"><div class="ttname"><a href="namespacetesting_1_1internal.html#ad901880198832bc166d2493096b451f7">testing::internal::kMaxBiggestInt</a></div><div class="ttdeci">const BiggestInt kMaxBiggestInt</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02420">gtest.h:2420</a></div></div>
- <div class="ttc" id="classtesting_1_1_unit_test_html_af254e2e695471eb9f128bc556bae3668"><div class="ttname"><a href="classtesting_1_1_unit_test.html#af254e2e695471eb9f128bc556bae3668">testing::UnitTest::GetInstance</a></div><div class="ttdeci">static UnitTest * GetInstance()</div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_parameterized_test_suite_info_html_a07445ac68713383f38747e1c56c6a04a"><div class="ttname"><a href="classtesting_1_1internal_1_1_parameterized_test_suite_info.html#a07445ac68713383f38747e1c56c6a04a">testing::internal::ParameterizedTestSuiteInfo::AddTestPattern</a></div><div class="ttdeci">void AddTestPattern(const char *test_suite_name, const char *test_base_name, TestMetaFactoryBase< ParamType > *meta_factory)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l11060">gtest.h:11060</a></div></div>
- <div class="ttc" id="structtesting_1_1internal_1_1_is_hash_table_html"><div class="ttname"><a href="structtesting_1_1internal_1_1_is_hash_table.html">testing::internal::IsHashTable</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l07442">gtest.h:7442</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_cartesian_product_holder4_html"><div class="ttname"><a href="classtesting_1_1internal_1_1_cartesian_product_holder4.html">testing::internal::CartesianProductHolder4</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l13087">gtest.h:13087</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_parameterized_test_suite_info_html_a10761bd750a6820a8d8d2c654b10fe54"><div class="ttname"><a href="classtesting_1_1internal_1_1_parameterized_test_suite_info.html#a10761bd750a6820a8d8d2c654b10fe54">testing::internal::ParameterizedTestSuiteInfo::ParamType</a></div><div class="ttdeci">typename TestSuite::ParamType ParamType</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l11039">gtest.h:11039</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_param_generator_interface_html_ab33d2ea424c50beaf503cb125b3cd003"><div class="ttname"><a href="classtesting_1_1internal_1_1_param_generator_interface.html#ab33d2ea424c50beaf503cb125b3cd003">testing::internal::ParamGeneratorInterface::ParamType</a></div><div class="ttdeci">T ParamType</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l10704">gtest.h:10704</a></div></div>
- <div class="ttc" id="namespacetesting_html_ac92dcbd00a0ffb2913e65d286e321a22"><div class="ttname"><a href="namespacetesting.html#ac92dcbd00a0ffb2913e65d286e321a22">testing::AssertPred3Helper</a></div><div class="ttdeci">AssertionResult AssertPred3Helper(const char *pred_text, const char *e1, const char *e2, const char *e3, Pred pred, const T1 &v1, const T2 &v2, const T3 &v3)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l14808">gtest.h:14808</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal2_html"><div class="ttname"><a href="namespacetesting_1_1internal2.html">testing::internal2</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest-all_8cc_source.html#l11105">gtest-all.cc:11105</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_1_1posix_html_a8e352884793a65ae8be144676f1a9136"><div class="ttname"><a href="namespacetesting_1_1internal_1_1posix.html#a8e352884793a65ae8be144676f1a9136">testing::internal::posix::StrDup</a></div><div class="ttdeci">char * StrDup(const char *src)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02328">gtest.h:2328</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_1_1posix_html_a4b77b14af6f4d18f83d303b98e9349c4"><div class="ttname"><a href="namespacetesting_1_1internal_1_1posix.html#a4b77b14af6f4d18f83d303b98e9349c4">testing::internal::posix::StrError</a></div><div class="ttdeci">const char * StrError(int errnum)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02367">gtest.h:2367</a></div></div>
- <div class="ttc" id="classtesting_1_1_test_info_html_ac2581b45eccc9a3b94cb41c4807d0e34"><div class="ttname"><a href="classtesting_1_1_test_info.html#ac2581b45eccc9a3b94cb41c4807d0e34">testing::TestInfo::name</a></div><div class="ttdeci">const char * name() const</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l15309">gtest.h:15309</a></div></div>
- <div class="ttc" id="classtesting_1_1_test_info_html_a9b74d79cf618ce5bb0d0b1da75ee8b35"><div class="ttname"><a href="classtesting_1_1_test_info.html#a9b74d79cf618ce5bb0d0b1da75ee8b35">testing::TestInfo::file</a></div><div class="ttdeci">const char * file() const</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l15326">gtest.h:15326</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_abfe9bfb020d38aa4e0e12c001911b22b"><div class="ttname"><a href="namespacetesting_1_1internal.html#abfe9bfb020d38aa4e0e12c001911b22b">testing::internal::CheckedDowncastToActualType</a></div><div class="ttdeci">Derived * CheckedDowncastToActualType(Base *base)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l01391">gtest.h:1391</a></div></div>
- <div class="ttc" id="classtesting_1_1_test_info_html_a82a84ffd0e4d18eb5a3f97a2077e12cc"><div class="ttname"><a href="classtesting_1_1_test_info.html#a82a84ffd0e4d18eb5a3f97a2077e12cc">testing::TestInfo::test_suite_name</a></div><div class="ttdeci">const char * test_suite_name() const</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l15301">gtest.h:15301</a></div></div>
- <div class="ttc" id="structtesting_1_1internal_1_1_flat_tuple_elem_base_3_01_flat_tuple_3_01_t_8_8_8_01_4_00_01_i_01_4_html_ac175518e7807c0b49c0ba8c1c78269ec"><div class="ttname"><a href="structtesting_1_1internal_1_1_flat_tuple_elem_base_3_01_flat_tuple_3_01_t_8_8_8_01_4_00_01_i_01_4.html#ac175518e7807c0b49c0ba8c1c78269ec">testing::internal::FlatTupleElemBase< FlatTuple< T... >, I >::value</a></div><div class="ttdeci">value_type value</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l07705">gtest.h:7705</a></div></div>
- <div class="ttc" id="structtesting_1_1internal_1_1_remove_const_html"><div class="ttname"><a href="structtesting_1_1internal_1_1_remove_const.html">testing::internal::RemoveConst</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l07319">gtest.h:7319</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_test_meta_factory_html"><div class="ttname"><a href="classtesting_1_1internal_1_1_test_meta_factory.html">testing::internal::TestMetaFactory</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l10980">gtest.h:10980</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_parameterized_test_suite_info_html_af488d1d7c1889a250acff2ea6eba4c84"><div class="ttname"><a href="classtesting_1_1internal_1_1_parameterized_test_suite_info.html#af488d1d7c1889a250acff2ea6eba4c84">testing::internal::ParameterizedTestSuiteInfo::GetTestSuiteTypeId</a></div><div class="ttdeci">TypeId GetTestSuiteTypeId() const override</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l11053">gtest.h:11053</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_eq_helper_html_aaa42c0059bb3dcc43d556243febb5f1c"><div class="ttname"><a href="classtesting_1_1internal_1_1_eq_helper.html#aaa42c0059bb3dcc43d556243febb5f1c">testing::internal::EqHelper::Compare</a></div><div class="ttdeci">static AssertionResult Compare(const char *lhs_expression, const char *rhs_expression, BiggestInt lhs, BiggestInt rhs)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l16152">gtest.h:16152</a></div></div>
- <div class="ttc" id="classtesting_1_1_test_event_listener_html_a96693881a1872657b4683e2f0a236ca5"><div class="ttname"><a href="classtesting_1_1_test_event_listener.html#a96693881a1872657b4683e2f0a236ca5">testing::TestEventListener::OnTestCaseStart</a></div><div class="ttdeci">virtual void OnTestCaseStart(const TestCase &test_case)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l15693">gtest.h:15693</a></div></div>
- <div class="ttc" id="structtesting_1_1internal_1_1_is_recursive_container_impl_3_01_c_00_01true_01_4_html_a5e8e2cf58f0d2581e9e3ab5f5630cd61"><div class="ttname"><a href="structtesting_1_1internal_1_1_is_recursive_container_impl_3_01_c_00_01true_01_4.html#a5e8e2cf58f0d2581e9e3ab5f5630cd61">testing::internal::IsRecursiveContainerImpl< C, true >::value_type</a></div><div class="ttdeci">decltype(*std::declval< typename C::const_iterator >()) value_type</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l07471">gtest.h:7471</a></div></div>
- <div class="ttc" id="structtesting_1_1internal_1_1_flat_tuple_base_3_01_flat_tuple_3_01_t_8_8_8_01_4_00_01_index_sequence_3_01_idx_8_8_8_01_4_01_4_html_ac515eec5c0647748bf8fa4ff553c706e"><div class="ttname"><a href="structtesting_1_1internal_1_1_flat_tuple_base_3_01_flat_tuple_3_01_t_8_8_8_01_4_00_01_index_sequence_3_01_idx_8_8_8_01_4_01_4.html#ac515eec5c0647748bf8fa4ff553c706e">testing::internal::FlatTupleBase< FlatTuple< T... >, IndexSequence< Idx... > >::FlatTupleBase</a></div><div class="ttdeci">FlatTupleBase(T... t)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l07716">gtest.h:7716</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_native_array_html_a81b90f5739ed812610e68dc34c9e3850"><div class="ttname"><a href="classtesting_1_1internal_1_1_native_array.html#a81b90f5739ed812610e68dc34c9e3850">testing::internal::NativeArray::operator==</a></div><div class="ttdeci">bool operator==(const NativeArray &rhs) const</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l07610">gtest.h:7610</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a0c793c6d84760d900299916c077a1af4"><div class="ttname"><a href="namespacetesting_1_1internal.html#a0c793c6d84760d900299916c077a1af4">testing::internal::OutputFlagAlsoCheckEnvVar</a></div><div class="ttdeci">std::string OutputFlagAlsoCheckEnvVar()</div><div class="ttdef"><b>Definition:</b> <a href="gtest-all_8cc_source.html#l10980">gtest-all.cc:10980</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a1e85cf16bb95b60f879d48ba1fbfc1c9"><div class="ttname"><a href="namespacetesting_1_1internal.html#a1e85cf16bb95b60f879d48ba1fbfc1c9">testing::internal::GetTestTypeId</a></div><div class="ttdeci">GTEST_API_ TypeId GetTestTypeId()</div></div>
- <div class="ttc" id="namespacetesting_html_ae90c778d69db4682e8fd8baaa0a9f9cd"><div class="ttname"><a href="namespacetesting.html#ae90c778d69db4682e8fd8baaa0a9f9cd">testing::AssertPred4Helper</a></div><div class="ttdeci">AssertionResult AssertPred4Helper(const char *pred_text, const char *e1, const char *e2, const char *e3, const char *e4, Pred pred, const T1 &v1, const T2 &v2, const T3 &v3, const T4 &v4)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l14864">gtest.h:14864</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a17fb8f0125fa92404a249ed38a43faa4a5a066cde30e276c6460ba10d123d0c2c"><div class="ttname"><a href="namespacetesting_1_1internal.html#a17fb8f0125fa92404a249ed38a43faa4a5a066cde30e276c6460ba10d123d0c2c">testing::internal::kPrintFunctionPointer</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l08437">gtest.h:8437</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_param_iterator_html_a6c37240a04ba3fc4c56f6c413cf4771d"><div class="ttname"><a href="classtesting_1_1internal_1_1_param_iterator.html#a6c37240a04ba3fc4c56f6c413cf4771d">testing::internal::ParamIterator::difference_type</a></div><div class="ttdeci">ptrdiff_t difference_type</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l10663">gtest.h:10663</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_aa6afda12e567c353e2e9b9c2e8cae14f"><div class="ttname"><a href="namespacetesting_1_1internal.html#aa6afda12e567c353e2e9b9c2e8cae14f">testing::internal::StripTrailingSpaces</a></div><div class="ttdeci">std::string StripTrailingSpaces(std::string str)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02266">gtest.h:2266</a></div></div>
- <div class="ttc" id="classtesting_1_1_message_html"><div class="ttname"><a href="classtesting_1_1_message.html">testing::Message</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02644">gtest.h:2644</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_random_html"><div class="ttname"><a href="classtesting_1_1internal_1_1_random.html">testing::internal::Random</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l07276">gtest.h:7276</a></div></div>
- <div class="ttc" id="classtesting_1_1_test_html_ae173b07a0fdd09fc1d417a2bb6cbdd76"><div class="ttname"><a href="classtesting_1_1_test.html#ae173b07a0fdd09fc1d417a2bb6cbdd76">testing::Test::SetUpTestSuite</a></div><div class="ttdeci">static void SetUpTestSuite()</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l15027">gtest.h:15027</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_universal_terse_printer_3_01char_01_5_01_4_html_aa9ef95587c1461fe33e254af52401a43"><div class="ttname"><a href="classtesting_1_1internal_1_1_universal_terse_printer_3_01char_01_5_01_4.html#aa9ef95587c1461fe33e254af52401a43">testing::internal::UniversalTersePrinter< char * >::Print</a></div><div class="ttdeci">static void Print(char *str, ::std::ostream *os)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l08882">gtest.h:8882</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a30708fa2bacf11895b03bdb21eb72309"><div class="ttname"><a href="namespacetesting_1_1internal.html#a30708fa2bacf11895b03bdb21eb72309">testing::internal::UniversalPrint</a></div><div class="ttdeci">void UniversalPrint(const T &value, ::std::ostream *os)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l08919">gtest.h:8919</a></div></div>
- <div class="ttc" id="classtesting_1_1_message_html_a2cdc4df62bdcc9df37651a1cf527704e"><div class="ttname"><a href="classtesting_1_1_message.html#a2cdc4df62bdcc9df37651a1cf527704e">testing::Message::GetString</a></div><div class="ttdeci">std::string GetString() const</div></div>
- <div class="ttc" id="structtesting_1_1internal_1_1_code_location_html_a323a11851c81629d632c47b9b767b8ac"><div class="ttname"><a href="structtesting_1_1internal_1_1_code_location.html#a323a11851c81629d632c47b9b767b8ac">testing::internal::CodeLocation::CodeLocation</a></div><div class="ttdeci">CodeLocation(const std::string &a_file, int a_line)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l06930">gtest.h:6930</a></div></div>
- <div class="ttc" id="classtesting_1_1_test_result_html"><div class="ttname"><a href="classtesting_1_1_test_result.html">testing::TestResult</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l15170">gtest.h:15170</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_param_iterator_interface_html_a9d811697a752d46f7bd6a0082f9040a3"><div class="ttname"><a href="classtesting_1_1internal_1_1_param_iterator_interface.html#a9d811697a752d46f7bd6a0082f9040a3">testing::internal::ParamIteratorInterface::Equals</a></div><div class="ttdeci">virtual bool Equals(const ParamIteratorInterface &other) const =0</div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_range_generator_html"><div class="ttname"><a href="classtesting_1_1internal_1_1_range_generator.html">testing::internal::RangeGenerator</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l10743">gtest.h:10743</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_cartesian_product_generator7_html"><div class="ttname"><a href="classtesting_1_1internal_1_1_cartesian_product_generator7.html">testing::internal::CartesianProductGenerator7</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l12116">gtest.h:12116</a></div></div>
- <div class="ttc" id="classtesting_1_1_test_result_html_a717e05e00d4af5cb809433e343ab63af"><div class="ttname"><a href="classtesting_1_1_test_result.html#a717e05e00d4af5cb809433e343ab63af">testing::TestResult::elapsed_time</a></div><div class="ttdeci">TimeInMillis elapsed_time() const</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l15201">gtest.h:15201</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_cartesian_product_generator7_html_aafc9c559223d3a685028ec98aa727818"><div class="ttname"><a href="classtesting_1_1internal_1_1_cartesian_product_generator7.html#aafc9c559223d3a685028ec98aa727818">testing::internal::CartesianProductGenerator7::CartesianProductGenerator7</a></div><div class="ttdeci">CartesianProductGenerator7(const ParamGenerator< T1 > &g1, const ParamGenerator< T2 > &g2, const ParamGenerator< T3 > &g3, const ParamGenerator< T4 > &g4, const ParamGenerator< T5 > &g5, const ParamGenerator< T6 > &g6, const ParamGenerator< T7 > &g7)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l12122">gtest.h:12122</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_thread_local_html_a882f57fed4b074de83693c0c0fe62858"><div class="ttname"><a href="classtesting_1_1internal_1_1_thread_local.html#a882f57fed4b074de83693c0c0fe62858">testing::internal::ThreadLocal::pointer</a></div><div class="ttdeci">T * pointer()</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02169">gtest.h:2169</a></div></div>
- <div class="ttc" id="gtest_8h_html_a874567b176266188fabfffb8393267ce"><div class="ttname"><a href="gtest_8h.html#a874567b176266188fabfffb8393267ce">GTEST_REMOVE_REFERENCE_AND_CONST_</a></div><div class="ttdeci">#define GTEST_REMOVE_REFERENCE_AND_CONST_(T)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l07337">gtest.h:7337</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_parameterized_test_suite_info_html_a4a5ddc2cd0404438c2b4d405cd0e706c"><div class="ttname"><a href="classtesting_1_1internal_1_1_parameterized_test_suite_info.html#a4a5ddc2cd0404438c2b4d405cd0e706c">testing::internal::ParameterizedTestSuiteInfo::GetTestSuiteName</a></div><div class="ttdeci">const std::string & GetTestSuiteName() const override</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l11049">gtest.h:11049</a></div></div>
- <div class="ttc" id="classtesting_1_1_scoped_trace_html_accd2a06cc941ffd7d6fe109adfdb4f19"><div class="ttname"><a href="classtesting_1_1_scoped_trace.html#accd2a06cc941ffd7d6fe109adfdb4f19">testing::ScopedTrace::ScopedTrace</a></div><div class="ttdeci">ScopedTrace(const char *file, int line, const char *message)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l16848">gtest.h:16848</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_floating_point_html_a1fc654fd206efa98e480aa1e034f30d5"><div class="ttname"><a href="classtesting_1_1internal_1_1_floating_point.html#a1fc654fd206efa98e480aa1e034f30d5">testing::internal::FloatingPoint::is_nan</a></div><div class="ttdeci">bool is_nan() const</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l06771">gtest.h:6771</a></div></div>
- <div class="ttc" id="classtesting_1_1_empty_test_event_listener_html_ac3f5033fcd82080edb45f546ce9854fe"><div class="ttname"><a href="classtesting_1_1_empty_test_event_listener.html#ac3f5033fcd82080edb45f546ce9854fe">testing::EmptyTestEventListener::OnTestProgramStart</a></div><div class="ttdeci">void OnTestProgramStart(const UnitTest &) override</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l15736">gtest.h:15736</a></div></div>
- <div class="ttc" id="structtesting_1_1internal_1_1_code_location_html_a01c977c7e8834a05a6d6c40b0c416045"><div class="ttname"><a href="structtesting_1_1internal_1_1_code_location.html#a01c977c7e8834a05a6d6c40b0c416045">testing::internal::CodeLocation::line</a></div><div class="ttdeci">int line</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l06934">gtest.h:6934</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_cartesian_product_holder7_html"><div class="ttname"><a href="classtesting_1_1internal_1_1_cartesian_product_holder7.html">testing::internal::CartesianProductHolder7</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l13176">gtest.h:13176</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal2_html_aeb8161b0b3ee503347b0662d7028fd57a14aaf98a2547ecf43eef0868d54b1383"><div class="ttname"><a href="namespacetesting_1_1internal2.html#aeb8161b0b3ee503347b0662d7028fd57a14aaf98a2547ecf43eef0868d54b1383">testing::internal2::kProtobuf</a></div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l08165">gtest.h:8165</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_test_meta_factory_html_a392ebab15dfdcfa1b54bbe15878aa9cd"><div class="ttname"><a href="classtesting_1_1internal_1_1_test_meta_factory.html#a392ebab15dfdcfa1b54bbe15878aa9cd">testing::internal::TestMetaFactory::ParamType</a></div><div class="ttdeci">typename TestSuite::ParamType ParamType</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l10983">gtest.h:10983</a></div></div>
- <div class="ttc" id="classtesting_1_1_test_suite_html_a2ede69fa37985ab8b21128955c56d6d7"><div class="ttname"><a href="classtesting_1_1_test_suite.html#a2ede69fa37985ab8b21128955c56d6d7">testing::TestSuite::elapsed_time</a></div><div class="ttdeci">TimeInMillis elapsed_time() const</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l15494">gtest.h:15494</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_cartesian_product_generator7_html_a452dadb9cedbc18f539cfc98eb6e5b88"><div class="ttname"><a href="classtesting_1_1internal_1_1_cartesian_product_generator7.html#a452dadb9cedbc18f539cfc98eb6e5b88">testing::internal::CartesianProductGenerator7::End</a></div><div class="ttdeci">ParamIteratorInterface< ParamType > * End() const override</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l12134">gtest.h:12134</a></div></div>
- <div class="ttc" id="namespacetesting_html_a374d4e5fbb4c938058fbe81d4c7ff6a6"><div class="ttname"><a href="namespacetesting.html#a374d4e5fbb4c938058fbe81d4c7ff6a6">testing::Values</a></div><div class="ttdeci">internal::ValueArray< T... > Values(T... v)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l13496">gtest.h:13496</a></div></div>
- <div class="ttc" id="classtesting_1_1internal_1_1_cartesian_product_generator6_html_ae9a8a36d7d4a5270a21ffd38744bbfce"><div class="ttname"><a href="classtesting_1_1internal_1_1_cartesian_product_generator6.html#ae9a8a36d7d4a5270a21ffd38744bbfce">testing::internal::CartesianProductGenerator6::Begin</a></div><div class="ttdeci">ParamIteratorInterface< ParamType > * Begin() const override</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l11943">gtest.h:11943</a></div></div>
- <div class="ttc" id="namespaceutl_html_a29057d2e164fe6dd3f3095f0d69c6546"><div class="ttname"><a href="namespaceutl.html#a29057d2e164fe6dd3f3095f0d69c6546">utl::get</a></div><div class="ttdeci">constexpr _Tp & get(array< _Tp, _Nm > &arr) noexcept</div><div class="ttdef"><b>Definition:</b> <a href="array_8h_source.html#l00220">array.h:220</a></div></div>
- <div class="ttc" id="namespacetesting_1_1internal_html_a83802e7f23324cd512232203662e1a98"><div class="ttname"><a href="namespacetesting_1_1internal.html#a83802e7f23324cd512232203662e1a98">testing::internal::IsAlNum</a></div><div class="ttdeci">bool IsAlNum(char ch)</div><div class="ttdef"><b>Definition:</b> <a href="gtest_8h_source.html#l02236">gtest.h:2236</a></div></div>
- </div><!-- fragment --></div><!-- contents -->
- </div><!-- doc-content -->
- <!-- start footer part -->
- <div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
- <ul>
- <li class="navelem"><a class="el" href="dir_13e138d54eb8818da29c3992edef070a.html">test</a></li><li class="navelem"><a class="el" href="dir_aaec33bad2bb7a5d6c86281ead709be5.html">eclipse-cygwin</a></li><li class="navelem"><a class="el" href="dir_c2811dd2f770757e67563302be4130d6.html">lib</a></li><li class="navelem"><a class="el" href="dir_a96de09a69cea6234edc1a1514d133f0.html">gtest</a></li><li class="navelem"><a class="el" href="gtest_8h.html">gtest.h</a></li>
- <li class="footer">Generated by
- <a href="http://www.doxygen.org/index.html">
- <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.14 </li>
- </ul>
- </div>
- </body>
- </html>
|