creation.html 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0.1 Transitional//EN">
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
  5. <title>Boost.MultiIndex Documentation - Tutorial - Container creation</title>
  6. <link rel="stylesheet" href="../style.css" type="text/css">
  7. <link rel="start" href="../index.html">
  8. <link rel="prev" href="key_extraction.html">
  9. <link rel="up" href="index.html">
  10. <link rel="next" href="debug.html">
  11. </head>
  12. <body>
  13. <h1><img src="../../../../boost.png" alt="boost.png (6897 bytes)" align=
  14. "middle" width="277" height="86">Boost.MultiIndex Tutorial: Container creation</h1>
  15. <div class="prev_link"><a href="key_extraction.html"><img src="../prev.gif" alt="key extraction" border="0"><br>
  16. Key extraction
  17. </a></div>
  18. <div class="up_link"><a href="index.html"><img src="../up.gif" alt="Boost.MultiIndex tutorial" border="0"><br>
  19. Boost.MultiIndex tutorial
  20. </a></div>
  21. <div class="next_link"><a href="debug.html"><img src="../next.gif" alt="debugging support" border="0"><br>
  22. Debugging support
  23. </a></div><br clear="all" style="clear: all;">
  24. <hr>
  25. <h2>Contents</h2>
  26. <ul>
  27. <li><a href="#value_semantics">Value semantics</a></li>
  28. <li><a href="#ctor_args_list">Use of <code>ctor_args_list</code></a></li>
  29. <li><a href="#special_allocator">Special allocator support</a></li>
  30. <li><a href="#serialization">Serialization</a></li>
  31. </ul>
  32. <h2><a name="value_semantics">Value semantics</a></h2>
  33. <p>
  34. <code>multi_index_container</code>s have the usual value semantics associated
  35. to copy construction and assignment, i.e. copies of the elements from the source
  36. container are created and inserted into the destination container.
  37. More interestingly, copying also recreates the original order in which
  38. elements are arranged for <i>every index</i> of the container.
  39. This implies that equality of all indices is preserved under copying
  40. or assignment, for those index types where equality is defined. This behavior
  41. can be regarded as a natural extension to the general rule on copy semantics
  42. stating that if <code>y</code> is a copy of <code>x</code>, then
  43. <code>y==x</code>.
  44. </p>
  45. <h2><a name="ctor_args_list">Use of <code>ctor_args_list</code></a></h2>
  46. <p>
  47. Although in most cases <code>multi_index_container</code>s will be default constructed
  48. (or copied from a preexisting <code>multi_index_container</code>), sometimes it is
  49. necessary to specify particular values for the internal objects used (key extractors,
  50. comparison predicates, allocator), for instance if some of these objects do not have
  51. a default constructor. The same situation can arise with standard STL containers,
  52. which allow for the optional specification of such objects:
  53. </p>
  54. <blockquote><pre>
  55. <span class=comment>// example of non-default constructed std::set</span>
  56. <span class=keyword>template</span><span class=special>&lt;</span><span class=keyword>typename</span> <span class=identifier>IntegralType</span><span class=special>&gt;</span>
  57. <span class=keyword>struct</span> <span class=identifier>modulo_less</span>
  58. <span class=special>{</span>
  59. <span class=identifier>modulo_less</span><span class=special>(</span><span class=identifier>IntegralType</span> <span class=identifier>m</span><span class=special>):</span><span class=identifier>modulo</span><span class=special>(</span><span class=identifier>m</span><span class=special>){}</span>
  60. <span class=keyword>bool</span> <span class=keyword>operator</span><span class=special>()(</span><span class=identifier>IntegralType</span> <span class=identifier>x</span><span class=special>,</span><span class=identifier>IntegralType</span> <span class=identifier>y</span><span class=special>)</span><span class=keyword>const</span>
  61. <span class=special>{</span>
  62. <span class=keyword>return</span> <span class=special>(</span><span class=identifier>x</span><span class=special>%</span><span class=identifier>modulo</span><span class=special>)&lt;(</span><span class=identifier>y</span><span class=special>%</span><span class=identifier>modulo</span><span class=special>);</span>
  63. <span class=special>}</span>
  64. <span class=keyword>private</span><span class=special>:</span>
  65. <span class=identifier>IntegralType</span> <span class=identifier>modulo</span><span class=special>;</span>
  66. <span class=special>};</span>
  67. <span class=keyword>typedef</span> <span class=identifier>std</span><span class=special>::</span><span class=identifier>set</span><span class=special>&lt;</span><span class=keyword>unsigned</span> <span class=keyword>int</span><span class=special>,</span><span class=identifier>modulo_less</span><span class=special>&lt;</span><span class=keyword>unsigned</span> <span class=keyword>int</span><span class=special>&gt;</span> <span class=special>&gt;</span> <span class=identifier>modulo_set</span><span class=special>;</span>
  68. <span class=identifier>modulo_set</span> <span class=identifier>m</span><span class=special>(</span><span class=identifier>modulo_less</span><span class=special>&lt;</span><span class=keyword>unsigned</span> <span class=keyword>int</span><span class=special>&gt;(</span><span class=number>10</span><span class=special>));</span>
  69. </pre></blockquote>
  70. <p>
  71. <code>multi_index_container</code> does also provide this functionality, though in a
  72. considerably more complex fashion, due to the fact that the constructor
  73. of a <code>multi_index_container</code> has to accept values for all the internal
  74. objects of its indices. The full form of <code>multi_index_container</code> constructor
  75. is
  76. </p>
  77. <blockquote><pre>
  78. <span class=keyword>explicit</span> <span class=identifier>multi_index_container</span><span class=special>(</span>
  79. <span class=keyword>const</span> <span class=identifier>ctor_args_list</span><span class=special>&amp;</span> <span class=identifier>args_list</span><span class=special>=</span><span class=identifier>ctor_args_list</span><span class=special>(),</span>
  80. <span class=keyword>const</span> <span class=identifier>allocator_type</span><span class=special>&amp;</span> <span class=identifier>al</span><span class=special>=</span><span class=identifier>allocator_type</span><span class=special>());</span>
  81. </pre></blockquote>
  82. <p>
  83. The specification of the allocator object poses no particular problems;
  84. as for the <code>ctor_args_list</code>, this object is designed so as to hold
  85. the necessary construction values for every index in the <code>multi_index_container</code>.
  86. From the point of view of the user, <code>ctor_args_list</code> is equivalent
  87. to the type
  88. </p>
  89. <blockquote><pre>
  90. <span class=identifier>boost</span><span class=special>::</span><span class=identifier>tuple</span><span class=special>&lt;</span><span class=identifier>C<sub>0</sub></span><span class=special>,...,</span><span class=identifier>C<sub>I-1</sub></span><span class=special>&gt;</span>
  91. </pre></blockquote>
  92. <p>
  93. where <code>I</code> is the number of indices, and <code>C<sub>i</sub></code> is
  94. </p>
  95. <blockquote><pre>
  96. <span class=identifier>nth_index</span><span class=special>&lt;</span><span class=identifier>i</span><span class=special>&gt;::</span><span class=identifier>type</span><span class=special>::</span><span class=identifier>ctor_args</span>
  97. </pre></blockquote>
  98. <p>
  99. that is, the nested type <code>ctor_args</code> of the <code>i</code>-th index. Each
  100. <code>ctor_args</code> type is in turn a tuple holding values for constructor
  101. arguments of the associated index: so, ordered indices demand a key extractor object
  102. and a comparison predicate, hashed indices take an initial number of buckets,
  103. a key extractor, a hash function and an equality predicate; while sequenced
  104. and random access indices do not need any construction argument. For instance,
  105. given the definition
  106. </p>
  107. <blockquote><pre>
  108. <span class=keyword>typedef</span> <span class=identifier>multi_index_container</span><span class=special>&lt;</span>
  109. <span class=keyword>unsigned</span> <span class=keyword>int</span><span class=special>,</span>
  110. <span class=identifier>indexed_by</span><span class=special>&lt;</span>
  111. <span class=identifier>hashed_unique</span><span class=special>&lt;</span><span class=identifier>identity</span><span class=special>&lt;</span><span class=keyword>unsigned</span> <span class=keyword>int</span><span class=special>&gt;</span> <span class=special>&gt;,</span>
  112. <span class=identifier>ordered_non_unique</span><span class=special>&lt;</span><span class=identifier>identity</span><span class=special>&lt;</span><span class=keyword>unsigned</span> <span class=keyword>int</span><span class=special>&gt;,</span> <span class=identifier>modulo_less</span><span class=special>&lt;</span><span class=keyword>unsigned</span> <span class=keyword>int</span><span class=special>&gt;</span> <span class=special>&gt;,</span>
  113. <span class=identifier>sequenced</span><span class=special>&lt;&gt;,</span>
  114. <span class=identifier>random_access</span><span class=special>&lt;&gt;</span>
  115. <span class=special>&gt;</span>
  116. <span class=special>&gt;</span> <span class=identifier>modulo_indexed_set</span><span class=special>;</span>
  117. </pre></blockquote>
  118. <p>
  119. the corresponding <code>ctor_args_list</code> type is equivalent to
  120. </p>
  121. <blockquote><pre>
  122. <span class=identifier>boost</span><span class=special>::</span><span class=identifier>tuple</span><span class=special>&lt;</span>
  123. <span class=comment>// ctr_args of index #0</span>
  124. <span class=identifier>boost</span><span class=special>::</span><span class=identifier>tuple</span><span class=special>&lt;</span>
  125. <span class=identifier>std</span><span class=special>::</span><span class=identifier>size_t</span><span class=special>,</span> <span class=comment>// initial number of buckets; 0 if unspecified</span>
  126. <span class=identifier>identity</span><span class=special>&lt;</span><span class=keyword>unsigned</span> <span class=keyword>int</span><span class=special>&gt;,</span>
  127. <span class=identifier>boost</span><span class=special>::</span><span class=identifier>hash</span><span class=special>&lt;</span><span class=keyword>unsigned</span> <span class=keyword>int</span><span class=special>&gt;,</span>
  128. <span class=identifier>std</span><span class=special>::</span><span class=identifier>equal_to</span><span class=special>&lt;</span><span class=keyword>unsigned</span> <span class=keyword>int</span><span class=special>&gt;</span> <span class=special>&gt;,</span>
  129. <span class=comment>// ctr_args of index #1</span>
  130. <span class=identifier>boost</span><span class=special>::</span><span class=identifier>tuple</span><span class=special>&lt;</span>
  131. <span class=identifier>identity</span><span class=special>&lt;</span><span class=keyword>unsigned</span> <span class=keyword>int</span><span class=special>&gt;,</span>
  132. <span class=identifier>modulo_less</span><span class=special>&lt;</span><span class=keyword>unsigned</span> <span class=keyword>int</span><span class=special>&gt;</span> <span class=special>&gt;,</span>
  133. <span class=comment>// sequenced indices do not have any construction argument</span>
  134. <span class=identifier>boost</span><span class=special>::</span><span class=identifier>tuple</span><span class=special>&lt;&gt;,</span>
  135. <span class=comment>// neither do random access indices</span>
  136. <span class=identifier>boost</span><span class=special>::</span><span class=identifier>tuple</span><span class=special>&lt;&gt;</span>
  137. <span class=special>&gt;</span>
  138. </pre></blockquote>
  139. <p>
  140. Such a <code>modulo_indexed_set</code> cannot be default constructed, because
  141. <code>modulo_less</code> does not provide a default constructor. The following shows
  142. how the construction can be done:
  143. </p>
  144. <blockquote><pre>
  145. <span class=identifier>modulo_indexed_set</span><span class=special>::</span><span class=identifier>ctor_args_list</span> <span class=identifier>args_list</span><span class=special>=</span>
  146. <span class=identifier>boost</span><span class=special>::</span><span class=identifier>make_tuple</span><span class=special>(</span>
  147. <span class=comment>// ctor_args for index #0 is default constructible</span>
  148. <span class=identifier>modulo_indexed_set</span><span class=special>::</span><span class=identifier>nth_index</span><span class=special>&lt;</span><span class=number>0</span><span class=special>&gt;::</span><span class=identifier>type</span><span class=special>::</span><span class=identifier>ctor_args</span><span class=special>(),</span>
  149. <span class=identifier>boost</span><span class=special>::</span><span class=identifier>make_tuple</span><span class=special>(</span><span class=identifier>identity</span><span class=special>&lt;</span><span class=keyword>unsigned</span> <span class=keyword>int</span><span class=special>&gt;(),</span><span class=identifier>modulo_less</span><span class=special>&lt;</span><span class=keyword>unsigned</span> <span class=keyword>int</span><span class=special>&gt;(</span><span class=number>10</span><span class=special>)),</span>
  150. <span class=comment>// these are also default constructible (actually, empty tuples)</span>
  151. <span class=identifier>modulo_indexed_set</span><span class=special>::</span><span class=identifier>nth_index</span><span class=special>&lt;</span><span class=number>2</span><span class=special>&gt;::</span><span class=identifier>type</span><span class=special>::</span><span class=identifier>ctor_args</span><span class=special>(),</span>
  152. <span class=identifier>modulo_indexed_set</span><span class=special>::</span><span class=identifier>nth_index</span><span class=special>&lt;</span><span class=number>3</span><span class=special>&gt;::</span><span class=identifier>type</span><span class=special>::</span><span class=identifier>ctor_args</span><span class=special>()</span>
  153. <span class=special>);</span>
  154. <span class=identifier>modulo_indexed_set</span> <span class=identifier>m</span><span class=special>(</span><span class=identifier>args_list</span><span class=special>);</span>
  155. </pre></blockquote>
  156. <p>
  157. A program is provided in the <a href="../examples.html#example3">examples section</a> that
  158. puts in practise these concepts.
  159. </p>
  160. <h2><a name="special_allocator">Special allocator support</a></h2>
  161. <p>
  162. Boost.MultiIndex allows for a slightly more general class of allocators
  163. than strictly required by the C++ standard, as explained in detail in the
  164. <a href="../reference/multi_index_container.html#instantiation_types">reference</a>.
  165. An important type of non-standard allocators supported are those provided by the
  166. <a href="../../../interprocess/index.html">Boost Interprocess Library</a>;
  167. this opens up the possibility of placing <code>multi_index_container</code>s
  168. in shared memory.
  169. </p>
  170. <blockquote><pre>
  171. <span class=preprocessor>#include</span> <span class=special>&lt;</span><span class=identifier>boost</span><span class=special>/</span><span class=identifier>interprocess</span><span class=special>/</span><span class=identifier>allocators</span><span class=special>/</span><span class=identifier>allocator</span><span class=special>.</span><span class=identifier>hpp</span><span class=special>&gt;</span>
  172. <span class=preprocessor>#include</span> <span class=special>&lt;</span><span class=identifier>boost</span><span class=special>/</span><span class=identifier>interprocess</span><span class=special>/</span><span class=identifier>managed_shared_memory</span><span class=special>.</span><span class=identifier>hpp</span><span class=special>&gt;</span>
  173. <span class=keyword>namespace</span> <span class=identifier>bip</span><span class=special>=</span><span class=identifier>boost</span><span class=special>::</span><span class=identifier>interprocess</span><span class=special>;</span>
  174. <span class=comment>// a shared memory compatible allocator of ints</span>
  175. <span class=keyword>typedef</span> <span class=identifier>bip</span><span class=special>::</span><span class=identifier>allocator</span><span class=special>&lt;</span>
  176. <span class=keyword>int</span><span class=special>,</span><span class=identifier>bip</span><span class=special>::</span><span class=identifier>managed_shared_memory</span><span class=special>::</span><span class=identifier>segment_manager</span>
  177. <span class=special>&gt;</span> <span class=identifier>shared_int_allocator</span><span class=special>;</span>
  178. <span class=comment>// define a shared memory compatible multi_index_container
  179. // using shared_int_allocator</span>
  180. <span class=keyword>typedef</span> <span class=identifier>multi_index_container</span><span class=special>&lt;</span>
  181. <span class=keyword>int</span><span class=special>,</span>
  182. <span class=identifier>indexed_by</span><span class=special>&lt;</span>
  183. <span class=identifier>sequenced</span><span class=special>&lt;&gt;,</span>
  184. <span class=identifier>ordered_unique</span><span class=special>&lt;</span><span class=identifier>identity</span><span class=special>&lt;</span><span class=keyword>int</span><span class=special>&gt;</span> <span class=special>&gt;</span>
  185. <span class=special>&gt;,</span>
  186. <span class=identifier>shared_int_allocator</span>
  187. <span class=special>&gt;</span> <span class=identifier>unique_int_list</span><span class=special>;</span>
  188. <span class=special>...</span>
  189. <span class=comment>// create a managed memory segment</span>
  190. <span class=identifier>bip</span><span class=special>::</span><span class=identifier>managed_shared_memory</span> <span class=identifier>seg</span><span class=special>(</span>
  191. <span class=identifier>bip</span><span class=special>::</span><span class=identifier>create_only</span><span class=special>,</span><span class=string>&quot;SharedMemoryID&quot;</span><span class=special>,</span><span class=number>65536</span><span class=special>);</span>
  192. <span class=comment>// construct a unique_int_list into the segment</span>
  193. <span class=identifier>unique_int_list</span><span class=special>*</span> <span class=identifier>puil</span><span class=special>=</span><span class=identifier>seg</span><span class=special>.</span><span class=identifier>construct</span><span class=special>&lt;</span><span class=identifier>unique_int_list</span><span class=special>&gt;</span>
  194. <span class=special>(</span><span class=string>&quot;UniqueIntListID&quot;</span><span class=special>)</span> <span class=comment>// object identifier within the segment
  195. // Construction args: first a ctor arg list, then a
  196. // shared memory allocator obtained from the segment object.</span>
  197. <span class=special>(</span><span class=identifier>unique_int_list</span><span class=special>::</span><span class=identifier>ctor_args_list</span><span class=special>(),</span>
  198. <span class=identifier>unique_int_list</span><span class=special>::</span><span class=identifier>allocator_type</span><span class=special>(</span><span class=identifier>seg</span><span class=special>.</span><span class=identifier>get_segment_manager</span><span class=special>()));</span>
  199. </pre></blockquote>
  200. <p>
  201. The examples section includes a <a href="../examples.html#example12">program</a>
  202. that further explores this capability.
  203. </p>
  204. <h2><a name="serialization">Serialization</a></h2>
  205. <p>
  206. <code>multi_index_container</code>s can be archived and retrieved by means of the
  207. <a href="../../../serialization/index.html">Boost Serialization Library</a>. Both regular
  208. and XML archives are supported. The usage is straightforward and does not
  209. differ from that of any other serializable type. For instance:
  210. </p>
  211. <blockquote><pre>
  212. <span class=preprocessor>#include</span> <span class=special>&lt;</span><span class=identifier>boost</span><span class=special>/</span><span class=identifier>archive</span><span class=special>/</span><span class=identifier>text_oarchive</span><span class=special>.</span><span class=identifier>hpp</span><span class=special>&gt;</span>
  213. <span class=preprocessor>#include</span> <span class=special>&lt;</span><span class=identifier>boost</span><span class=special>/</span><span class=identifier>archive</span><span class=special>/</span><span class=identifier>text_iarchive</span><span class=special>.</span><span class=identifier>hpp</span><span class=special>&gt;</span>
  214. <span class=preprocessor>#include</span> <span class=special>&lt;</span><span class=identifier>fstream</span><span class=special>&gt;</span>
  215. <span class=special>...</span>
  216. <span class=keyword>void</span> <span class=identifier>save</span><span class=special>(</span><span class=keyword>const</span> <span class=identifier>employee_set</span><span class=special>&amp;</span> <span class=identifier>es</span><span class=special>)</span>
  217. <span class=special>{</span>
  218. <span class=identifier>std</span><span class=special>::</span><span class=identifier>ofstream</span> <span class=identifier>ofs</span><span class=special>(</span><span class=string>&quot;data&quot;</span><span class=special>);</span>
  219. <span class=identifier>boost</span><span class=special>::</span><span class=identifier>archive</span><span class=special>::</span><span class=identifier>text_oarchive</span> <span class=identifier>oa</span><span class=special>(</span><span class=identifier>ofs</span><span class=special>);</span>
  220. <span class=identifier>oa</span><span class=special>&lt;&lt;</span><span class=identifier>es</span><span class=special>;</span>
  221. <span class=special>}</span>
  222. <span class=keyword>void</span> <span class=identifier>load</span><span class=special>(</span><span class=identifier>employee_set</span><span class=special>&amp;</span> <span class=identifier>es</span><span class=special>)</span>
  223. <span class=special>{</span>
  224. <span class=identifier>std</span><span class=special>::</span><span class=identifier>ifstream</span> <span class=identifier>ifs</span><span class=special>(</span><span class=string>&quot;data&quot;</span><span class=special>);</span>
  225. <span class=identifier>boost</span><span class=special>::</span><span class=identifier>archive</span><span class=special>::</span><span class=identifier>text_iarchive</span> <span class=identifier>ia</span><span class=special>(</span><span class=identifier>ifs</span><span class=special>);</span>
  226. <span class=identifier>ia</span><span class=special>&gt;&gt;</span><span class=identifier>es</span><span class=special>;</span>
  227. <span class=special>}</span>
  228. <span class=special>...</span>
  229. <span class=identifier>employee_set</span> <span class=identifier>es</span><span class=special>;</span>
  230. <span class=special>...</span> <span class=comment>// fill it with data</span>
  231. <span class=identifier>save</span><span class=special>(</span><span class=identifier>es</span><span class=special>);</span>
  232. <span class=special>...</span>
  233. <span class=identifier>employee_set</span> <span class=identifier>restored_es</span><span class=special>;</span>
  234. <span class=identifier>load</span><span class=special>(</span><span class=identifier>restored_es</span><span class=special>);</span>
  235. </pre></blockquote>
  236. <p>
  237. Serialization capabilities are automatically provided by just linking with
  238. the appropriate Boost.Serialization library module: it is not necessary
  239. to explicitly include any header from Boost.Serialization,
  240. apart from those declaring the type of archive used in the process. If not used,
  241. however, serialization support can be disabled by globally defining the macro
  242. <code>BOOST_MULTI_INDEX_DISABLE_SERIALIZATION</code>. Disabling serialization
  243. for Boost.MultiIndex can yield a small improvement in build times, and may
  244. be necessary in those defective compilers that fail to correctly process
  245. Boost.Serialization headers.
  246. </p>
  247. <p>
  248. In accordance with Boost.MultiIndex
  249. <a href="#value_semantics">value semantics</a>, retrieving an
  250. archived <code>multi_index_container</code> restores not only
  251. the elements, but also the order they were arranged into for
  252. every index of the container. There is an exception to this rule,
  253. though: for <a href="indices.html#hashed_indices">hashed
  254. indices</a>, no guarantee is made about the order in which elements will
  255. be iterated in the restored container; in general, it is unwise to rely on
  256. the ordering of elements of a hashed index, since it can change in arbitrary
  257. ways during insertion or rehashing --this is precisely the reason why
  258. hashed indices and TR1 unordered associative containers do not define
  259. an equality operator.
  260. </p>
  261. <p>
  262. Iterators to indices of a <code>multi_index_container</code> can also be
  263. serialized. Serialization of iterators must be done only after serializing
  264. their corresponding container.
  265. </p>
  266. <p>
  267. <a href="../examples.html#example9">Example 9</a> in the examples section shows
  268. the serialization capabilities of Boost.MultiIndex.
  269. </p>
  270. <hr>
  271. <div class="prev_link"><a href="key_extraction.html"><img src="../prev.gif" alt="key extraction" border="0"><br>
  272. Key extraction
  273. </a></div>
  274. <div class="up_link"><a href="index.html"><img src="../up.gif" alt="Boost.MultiIndex tutorial" border="0"><br>
  275. Boost.MultiIndex tutorial
  276. </a></div>
  277. <div class="next_link"><a href="debug.html"><img src="../next.gif" alt="debugging support" border="0"><br>
  278. Debugging support
  279. </a></div><br clear="all" style="clear: all;">
  280. <br>
  281. <p>Revised July 17th 2007</p>
  282. <p>&copy; Copyright 2003-2007 Joaqu&iacute;n M L&oacute;pez Mu&ntilde;oz.
  283. Distributed under the Boost Software
  284. License, Version 1.0. (See accompanying file <a href="../../../../LICENSE_1_0.txt">
  285. LICENSE_1_0.txt</a> or copy at <a href="http://www.boost.org/LICENSE_1_0.txt">
  286. http://www.boost.org/LICENSE_1_0.txt</a>)
  287. </p>
  288. </body>
  289. </html>