group__group-EuclideanRing.html 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. <!--
  2. Copyright Louis Dionne 2013-2017
  3. Distributed under the Boost Software License, Version 1.0.
  4. (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
  5. -->
  6. <!-- boost-no-inspect -->
  7. <!-- HTML header for doxygen 1.8.9.1-->
  8. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  9. <html xmlns="http://www.w3.org/1999/xhtml">
  10. <head>
  11. <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
  12. <meta http-equiv="X-UA-Compatible" content="IE=9"/>
  13. <meta name="generator" content="Doxygen 1.8.15"/>
  14. <title>Boost.Hana: Euclidean Ring</title>
  15. <link href="tabs.css" rel="stylesheet" type="text/css"/>
  16. <script type="text/javascript" src="jquery.js"></script>
  17. <script type="text/javascript" src="dynsections.js"></script>
  18. <link href="navtree.css" rel="stylesheet" type="text/css"/>
  19. <script type="text/javascript" src="resize.js"></script>
  20. <script type="text/javascript" src="navtreedata.js"></script>
  21. <script type="text/javascript" src="navtree.js"></script>
  22. <script type="text/javascript">
  23. /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
  24. $(document).ready(initResizable);
  25. /* @license-end */</script>
  26. <link href="search/search.css" rel="stylesheet" type="text/css"/>
  27. <script type="text/javascript" src="search/searchdata.js"></script>
  28. <script type="text/javascript" src="search/search.js"></script>
  29. <script type="text/javascript">
  30. /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
  31. $(document).ready(function() { init_search(); });
  32. /* @license-end */
  33. </script>
  34. <script type="text/x-mathjax-config">
  35. MathJax.Hub.Config({
  36. extensions: ["tex2jax.js"],
  37. jax: ["input/TeX","output/HTML-CSS"],
  38. });
  39. // Copyright Louis Dionne 2013-2017
  40. // Distributed under the Boost Software License, Version 1.0.
  41. // (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
  42. MathJax.Hub.Config({
  43. "HTML-CSS": {
  44. linebreaks: {
  45. automatic: true,
  46. width: "75% container"
  47. }
  48. }
  49. });
  50. </script><script type="text/javascript" async="async" src="https://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
  51. <link href="doxygen.css" rel="stylesheet" type="text/css" />
  52. <!-- Additional javascript for drawing charts. -->
  53. <script type="text/javascript" src="highcharts.js"></script>
  54. <script type="text/javascript" src="highcharts-data.js"></script>
  55. <script type="text/javascript" src="highcharts-exporting.js"></script>
  56. <script type="text/javascript" src="chart.js"></script>
  57. <script type="text/javascript" src="hana.js"></script>
  58. </head>
  59. <body>
  60. <div id="top"><!-- do not remove this div, it is closed by doxygen! -->
  61. <div id="titlearea">
  62. <table cellspacing="0" cellpadding="0">
  63. <tbody>
  64. <tr style="height: 56px;">
  65. <td id="projectlogo"><img alt="Logo" src="Boost.png"/></td>
  66. <td style="padding-left: 0.5em;">
  67. <div id="projectname">Boost.Hana
  68. &#160;<span id="projectnumber">1.6.0</span>
  69. </div>
  70. <div id="projectbrief">Your standard library for metaprogramming</div>
  71. </td>
  72. <td> <div id="MSearchBox" class="MSearchBoxInactive">
  73. <span class="left">
  74. <img id="MSearchSelect" src="search/mag_sel.png"
  75. onmouseover="return searchBox.OnSearchSelectShow()"
  76. onmouseout="return searchBox.OnSearchSelectHide()"
  77. alt=""/>
  78. <input type="text" id="MSearchField" value="Search" accesskey="S"
  79. onfocus="searchBox.OnSearchFieldFocus(true)"
  80. onblur="searchBox.OnSearchFieldFocus(false)"
  81. onkeyup="searchBox.OnSearchFieldChange(event)"/>
  82. </span><span class="right">
  83. <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
  84. </span>
  85. </div>
  86. </td>
  87. </tr>
  88. </tbody>
  89. </table>
  90. </div>
  91. <!-- end header part -->
  92. <!-- Generated by Doxygen 1.8.15 -->
  93. <script type="text/javascript">
  94. /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
  95. var searchBox = new SearchBox("searchBox", "search",false,'Search');
  96. /* @license-end */
  97. </script>
  98. </div><!-- top -->
  99. <div id="side-nav" class="ui-resizable side-nav-resizable">
  100. <div id="nav-tree">
  101. <div id="nav-tree-contents">
  102. <div id="nav-sync" class="sync"></div>
  103. </div>
  104. </div>
  105. <div id="splitbar" style="-moz-user-select:none;"
  106. class="ui-resizable-handle">
  107. </div>
  108. </div>
  109. <script type="text/javascript">
  110. /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
  111. $(document).ready(function(){initNavTree('group__group-EuclideanRing.html','');});
  112. /* @license-end */
  113. </script>
  114. <div id="doc-content">
  115. <!-- window showing the filter options -->
  116. <div id="MSearchSelectWindow"
  117. onmouseover="return searchBox.OnSearchSelectShow()"
  118. onmouseout="return searchBox.OnSearchSelectHide()"
  119. onkeydown="return searchBox.OnSearchSelectKey(event)">
  120. </div>
  121. <!-- iframe showing the search results (closed by default) -->
  122. <div id="MSearchResultsWindow">
  123. <iframe src="javascript:void(0)" frameborder="0"
  124. name="MSearchResults" id="MSearchResults">
  125. </iframe>
  126. </div>
  127. <div class="header">
  128. <div class="summary">
  129. <a href="#var-members">Variables</a> </div>
  130. <div class="headertitle">
  131. <div class="title">Euclidean Ring<div class="ingroups"><a class="el" href="group__group-concepts.html">Concepts</a></div></div> </div>
  132. </div><!--header-->
  133. <div class="contents">
  134. <a name="details" id="details"></a><h2 class="groupheader">Description</h2>
  135. <p>The <code>EuclideanRing</code> concept represents a commutative <code>Ring</code> that can also be endowed with a division algorithm. </p>
  136. <p>A Ring defines a binary operation often called <em>multiplication</em> that can be used to combine two elements of the ring into a new element of the ring. An <a href="https://en.wikipedia.org/wiki/Euclidean_domain">Euclidean ring</a>, also called an Euclidean domain, adds the ability to define a special function that generalizes the Euclidean division of integers.</p>
  137. <p>However, an Euclidean ring must also satisfy one more property, which is that of having no non-zero zero divisors. In a Ring <code>(R, +, *)</code>, it follows quite easily from the axioms that <code>x * 0 == 0</code> for any ring element <code>x</code>. However, there is nothing that mandates <code>0</code> to be the only ring element sending other elements to <code>0</code>. Hence, in some Rings, it is possible to have elements <code>x</code> and <code>y</code> such that <code>x * y == 0</code> while not having <code>x == 0</code> nor <code>y == 0</code>. We call these elements divisors of zero, or zero divisors. For example, this situation arises in the Ring of integers modulo 4 (the set <code>{0, 1, 2, 3}</code>) with addition and multiplication <code>mod 4</code> as binary operations. In this case, we have that </p><div class="fragment"><div class="line">2 * 2 == 4</div><div class="line"> == 0 (<a class="code" href="group__group-EuclideanRing.html#ga9b47b223d5b02db933b3c93b5bd1a062">mod</a> 4)</div></div><!-- fragment --><p> even though <code>2 != 0 (mod 4)</code>.</p>
  138. <p>Following this line of thought, an Euclidean ring requires its only zero divisor is zero itself. In other words, the multiplication in an Euclidean won't send two non-zero elements to zero. Also note that since multiplication in a <code>Ring</code> is not necessarily commutative, it is not always the case that </p><div class="fragment"><div class="line">x * y == 0 implies y * x == 0</div></div><!-- fragment --><p> To be rigorous, we should then distinguish between elements that are zero divisors when multiplied to the right and to the left. Fortunately, the concept of an Euclidean ring requires the Ring multiplication to be commutative. Hence, </p><div class="fragment"><div class="line">x * y == y * x</div></div><!-- fragment --><p> and we do not have to distinguish between left and right zero divisors.</p>
  139. <p>Typical examples of Euclidean rings include integers and polynomials over a field. The method names used here refer to the Euclidean ring of integers under the usual addition, multiplication and division operations.</p>
  140. <h2>Minimal complete definition </h2>
  141. <p><code>div</code> and <code>mod</code> satisfying the laws below</p>
  142. <h2>Laws </h2>
  143. <p>To simplify the reading, we will use the <code>+</code>, <code>*</code>, <code>/</code> and <code>%</code> operators with infix notation to denote the application of the corresponding methods in Monoid, Group, Ring and EuclideanRing. For all objects <code>a</code> and <code>b</code> of an <code>EuclideanRing</code> <code>R</code>, the following laws must be satisfied: </p><div class="fragment"><div class="line">a * b == b * a <span class="comment">// commutativity</span></div><div class="line">(a / b) * b + a % b == a <span class="keywordflow">if</span> b is non-<a class="code" href="group__group-Monoid.html#gad459ac17b6bab8ead1cae7de0032f3c6">zero</a></div><div class="line">zero&lt;R&gt;() % b == zero&lt;R&gt;() if b is non-<a class="code" href="group__group-Monoid.html#gad459ac17b6bab8ead1cae7de0032f3c6">zero</a></div></div><!-- fragment --><h2>Refined concepts </h2>
  144. <p><code>Monoid</code>, <code>Group</code>, <code>Ring</code></p>
  145. <h2>Concrete models </h2>
  146. <p><code><a class="el" href="structboost_1_1hana_1_1integral__constant.html" title="Compile-time value of an integral type.">hana::integral_constant</a></code></p>
  147. <h2>Free model for non-boolean integral data types </h2>
  148. <p>A data type <code>T</code> is integral if <code>std::is_integral&lt;T&gt;::value</code> is true. For a non-boolean integral data type <code>T</code>, a model of <code>EuclideanRing</code> is automatically defined by using the <code>Ring</code> model provided for arithmetic data types and setting </p><div class="fragment"><div class="line"><a class="code" href="group__group-EuclideanRing.html#ga4225a7988ce98903228913dde53762df">div</a>(x, y) = (x / y)</div><div class="line"><a class="code" href="group__group-EuclideanRing.html#ga9b47b223d5b02db933b3c93b5bd1a062">mod</a>(x, y) = (x % y)</div></div><!-- fragment --><dl class="section note"><dt>Note</dt><dd>The rationale for not providing an EuclideanRing model for <code>bool</code> is the same as for not providing Monoid, Group and Ring models. </dd></dl>
  149. <table class="memberdecls">
  150. <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
  151. Variables</h2></td></tr>
  152. <tr class="memitem:ga4225a7988ce98903228913dde53762df"><td class="memItemLeft" align="right" valign="top">constexpr auto&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__group-EuclideanRing.html#ga4225a7988ce98903228913dde53762df">boost::hana::div</a></td></tr>
  153. <tr class="memdesc:ga4225a7988ce98903228913dde53762df"><td class="mdescLeft">&#160;</td><td class="mdescRight">Generalized integer division. <a href="group__group-EuclideanRing.html#ga4225a7988ce98903228913dde53762df">More...</a><br /></td></tr>
  154. <tr class="separator:ga4225a7988ce98903228913dde53762df"><td class="memSeparator" colspan="2">&#160;</td></tr>
  155. <tr class="memitem:ga9b47b223d5b02db933b3c93b5bd1a062"><td class="memItemLeft" align="right" valign="top">constexpr auto&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__group-EuclideanRing.html#ga9b47b223d5b02db933b3c93b5bd1a062">boost::hana::mod</a></td></tr>
  156. <tr class="memdesc:ga9b47b223d5b02db933b3c93b5bd1a062"><td class="mdescLeft">&#160;</td><td class="mdescRight">Generalized integer modulus.Given two elements of an EuclideanRing <code>x</code> and <code>y</code>, with <code>y</code> nonzero, <code>mod</code> returns the modulus of the division of <code>x</code> by <code>y</code>. In other words, <code>mod</code> can be seen as an equivalent to <code>%</code>. <a href="group__group-EuclideanRing.html#ga9b47b223d5b02db933b3c93b5bd1a062">More...</a><br /></td></tr>
  157. <tr class="separator:ga9b47b223d5b02db933b3c93b5bd1a062"><td class="memSeparator" colspan="2">&#160;</td></tr>
  158. </table>
  159. <h2 class="groupheader">Variable Documentation</h2>
  160. <a id="ga4225a7988ce98903228913dde53762df"></a>
  161. <h2 class="memtitle"><span class="permalink"><a href="#ga4225a7988ce98903228913dde53762df">&#9670;&nbsp;</a></span>div</h2>
  162. <div class="memitem">
  163. <div class="memproto">
  164. <table class="memname">
  165. <tr>
  166. <td class="memname">constexpr auto boost::hana::div</td>
  167. </tr>
  168. </table>
  169. </div><div class="memdoc">
  170. <p><code>#include &lt;<a class="el" href="fwd_2div_8hpp.html">boost/hana/fwd/div.hpp</a>&gt;</code></p>
  171. <b>Initial value:</b><div class="fragment"><div class="line">= [](<span class="keyword">auto</span>&amp;&amp; x, <span class="keyword">auto</span>&amp;&amp; y) -&gt; decltype(<span class="keyword">auto</span>) {</div><div class="line"> <span class="keywordflow">return</span> tag-dispatched;</div><div class="line"> }</div></div><!-- fragment -->
  172. <p>Generalized integer division. </p>
  173. <h2>Cross-type version of the method </h2>
  174. <p>The <code>div</code> method is "overloaded" to handle distinct data types with certain properties. Specifically, <code>div</code> is defined for <em>distinct</em> data types <code>A</code> and <code>B</code> such that</p><ol type="1">
  175. <li><code>A</code> and <code>B</code> share a common data type <code>C</code>, as determined by the <code>common</code> metafunction</li>
  176. <li><code>A</code>, <code>B</code> and <code>C</code> are all <code>EuclideanRing</code>s when taken individually</li>
  177. <li><code>to&lt;C&gt; : A -&gt; B</code> and <code>to&lt;C&gt; : B -&gt; C</code> are <code>Ring</code>-embeddings, as determined by the <code>is_embedding</code> metafunction.</li>
  178. </ol>
  179. <p>In that case, the <code>div</code> method is defined as </p><div class="fragment"><div class="line"><a class="code" href="group__group-EuclideanRing.html#ga4225a7988ce98903228913dde53762df">div</a>(x, y) = <a class="code" href="group__group-EuclideanRing.html#ga4225a7988ce98903228913dde53762df">div</a>(to&lt;C&gt;(x), to&lt;C&gt;(y))</div></div><!-- fragment --><h2>Example </h2>
  180. <div class="fragment"><div class="line"><span class="comment">// Copyright Louis Dionne 2013-2017</span></div><div class="line"><span class="comment">// Distributed under the Boost Software License, Version 1.0.</span></div><div class="line"><span class="comment">// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)</span></div><div class="line"></div><div class="line"><span class="preprocessor">#include &lt;<a class="code" href="assert_8hpp.html">boost/hana/assert.hpp</a>&gt;</span></div><div class="line"><span class="preprocessor">#include &lt;<a class="code" href="div_8hpp.html">boost/hana/div.hpp</a>&gt;</span></div><div class="line"><span class="preprocessor">#include &lt;<a class="code" href="equal_8hpp.html">boost/hana/equal.hpp</a>&gt;</span></div><div class="line"><span class="preprocessor">#include &lt;<a class="code" href="integral__constant_8hpp.html">boost/hana/integral_constant.hpp</a>&gt;</span></div><div class="line"><span class="keyword">namespace </span>hana = <a class="code" href="namespaceboost_1_1hana.html">boost::hana</a>;</div><div class="line"></div><div class="line"></div><div class="line"><a class="code" href="group__group-assertions.html#ga2c5006540936d9f8880e3a39f4fcc035">BOOST_HANA_CONSTANT_CHECK</a>(<a class="code" href="group__group-EuclideanRing.html#ga4225a7988ce98903228913dde53762df">hana::div</a>(hana::int_c&lt;6&gt;, hana::int_c&lt;3&gt;) == hana::int_c&lt;2&gt;);</div><div class="line"><a class="code" href="group__group-assertions.html#ga2c5006540936d9f8880e3a39f4fcc035">BOOST_HANA_CONSTANT_CHECK</a>(<a class="code" href="group__group-EuclideanRing.html#ga4225a7988ce98903228913dde53762df">hana::div</a>(hana::int_c&lt;6&gt;, hana::int_c&lt;4&gt;) == hana::int_c&lt;1&gt;);</div><div class="line"></div><div class="line">static_assert(<a class="code" href="group__group-EuclideanRing.html#ga4225a7988ce98903228913dde53762df">hana::div</a>(6, 3) == 2, <span class="stringliteral">&quot;&quot;</span>);</div><div class="line">static_assert(<a class="code" href="group__group-EuclideanRing.html#ga4225a7988ce98903228913dde53762df">hana::div</a>(6, 4) == 1, <span class="stringliteral">&quot;&quot;</span>);</div><div class="line"></div><div class="line"><span class="keywordtype">int</span> main() { }</div></div><!-- fragment -->
  181. </div>
  182. </div>
  183. <a id="ga9b47b223d5b02db933b3c93b5bd1a062"></a>
  184. <h2 class="memtitle"><span class="permalink"><a href="#ga9b47b223d5b02db933b3c93b5bd1a062">&#9670;&nbsp;</a></span>mod</h2>
  185. <div class="memitem">
  186. <div class="memproto">
  187. <table class="memname">
  188. <tr>
  189. <td class="memname">constexpr auto boost::hana::mod</td>
  190. </tr>
  191. </table>
  192. </div><div class="memdoc">
  193. <p><code>#include &lt;<a class="el" href="fwd_2mod_8hpp.html">boost/hana/fwd/mod.hpp</a>&gt;</code></p>
  194. <b>Initial value:</b><div class="fragment"><div class="line">= [](<span class="keyword">auto</span>&amp;&amp; x, <span class="keyword">auto</span>&amp;&amp; y) -&gt; decltype(<span class="keyword">auto</span>) {</div><div class="line"> <span class="keywordflow">return</span> tag-dispatched;</div><div class="line"> }</div></div><!-- fragment -->
  195. <p>Generalized integer modulus.Given two elements of an EuclideanRing <code>x</code> and <code>y</code>, with <code>y</code> nonzero, <code>mod</code> returns the modulus of the division of <code>x</code> by <code>y</code>. In other words, <code>mod</code> can be seen as an equivalent to <code>%</code>. </p>
  196. <h2>Cross-type version of the method </h2>
  197. <p>The <code>mod</code> method is "overloaded" to handle distinct data types with certain properties. Specifically, <code>mod</code> is defined for <em>distinct</em> data types <code>A</code> and <code>B</code> such that</p><ol type="1">
  198. <li><code>A</code> and <code>B</code> share a common data type <code>C</code>, as determined by the <code>common</code> metafunction</li>
  199. <li><code>A</code>, <code>B</code> and <code>C</code> are all <code>EuclideanRing</code>s when taken individually</li>
  200. <li><code>to&lt;C&gt; : A -&gt; B</code> and <code>to&lt;C&gt; : B -&gt; C</code> are <code>Ring</code>-embeddings, as determined by the <code>is_embedding</code> metafunction.</li>
  201. </ol>
  202. <p>In that case, <code>mod</code> is defined as </p><div class="fragment"><div class="line"><a class="code" href="group__group-EuclideanRing.html#ga9b47b223d5b02db933b3c93b5bd1a062">mod</a>(x, y) = <a class="code" href="group__group-EuclideanRing.html#ga9b47b223d5b02db933b3c93b5bd1a062">mod</a>(to&lt;C&gt;(x), to&lt;C&gt;(y))</div></div><!-- fragment --><h2>Example </h2>
  203. <div class="fragment"><div class="line"><span class="comment">// Copyright Louis Dionne 2013-2017</span></div><div class="line"><span class="comment">// Distributed under the Boost Software License, Version 1.0.</span></div><div class="line"><span class="comment">// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)</span></div><div class="line"></div><div class="line"><span class="preprocessor">#include &lt;<a class="code" href="assert_8hpp.html">boost/hana/assert.hpp</a>&gt;</span></div><div class="line"><span class="preprocessor">#include &lt;<a class="code" href="equal_8hpp.html">boost/hana/equal.hpp</a>&gt;</span></div><div class="line"><span class="preprocessor">#include &lt;<a class="code" href="integral__constant_8hpp.html">boost/hana/integral_constant.hpp</a>&gt;</span></div><div class="line"><span class="preprocessor">#include &lt;<a class="code" href="mod_8hpp.html">boost/hana/mod.hpp</a>&gt;</span></div><div class="line"><span class="keyword">namespace </span>hana = <a class="code" href="namespaceboost_1_1hana.html">boost::hana</a>;</div><div class="line"></div><div class="line"></div><div class="line"><a class="code" href="group__group-assertions.html#ga2c5006540936d9f8880e3a39f4fcc035">BOOST_HANA_CONSTANT_CHECK</a>(<a class="code" href="group__group-EuclideanRing.html#ga9b47b223d5b02db933b3c93b5bd1a062">hana::mod</a>(hana::int_c&lt;6&gt;, hana::int_c&lt;4&gt;) == hana::int_c&lt;2&gt;);</div><div class="line"><a class="code" href="group__group-assertions.html#ga2c5006540936d9f8880e3a39f4fcc035">BOOST_HANA_CONSTANT_CHECK</a>(<a class="code" href="group__group-EuclideanRing.html#ga9b47b223d5b02db933b3c93b5bd1a062">hana::mod</a>(hana::int_c&lt;-6&gt;, hana::int_c&lt;4&gt;) == hana::int_c&lt;-2&gt;);</div><div class="line">static_assert(<a class="code" href="group__group-EuclideanRing.html#ga9b47b223d5b02db933b3c93b5bd1a062">hana::mod</a>(6, 4) == 2, <span class="stringliteral">&quot;&quot;</span>);</div><div class="line"></div><div class="line"><span class="keywordtype">int</span> main() { }</div></div><!-- fragment -->
  204. </div>
  205. </div>
  206. </div><!-- contents -->
  207. </div><!-- doc-content -->
  208. <!--
  209. Copyright Louis Dionne 2013-2017
  210. Distributed under the Boost Software License, Version 1.0.
  211. (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
  212. -->
  213. <!-- boost-no-inspect -->
  214. <!-- HTML footer for doxygen 1.8.9.1-->
  215. <!-- start footer part -->
  216. <div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
  217. <ul>
  218. </ul>
  219. </div>
  220. </body>
  221. </html>