techniques.html 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405
  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 - Techniques</title>
  6. <link rel="stylesheet" href="../style.css" type="text/css">
  7. <link rel="start" href="../index.html">
  8. <link rel="prev" href="debug.html">
  9. <link rel="up" href="index.html">
  10. <link rel="next" href="../reference/index.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: Techniques</h1>
  15. <div class="prev_link"><a href="debug.html"><img src="../prev.gif" alt="debugging support" border="0"><br>
  16. Debugging support
  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="../reference/index.html"><img src="../next.gif" alt="Boost.MultiIndex reference" border="0"><br>
  22. Boost.MultiIndex reference
  23. </a></div><br clear="all" style="clear: all;">
  24. <hr>
  25. <h2>Contents</h2>
  26. <ul>
  27. <li><a href="#emulate_std_containers">Emulating standard containers with
  28. <code>multi_index_container</code></a>
  29. <ul>
  30. <li><a href="#emulate_assoc_containers">Emulation of associative
  31. containers</a></li>
  32. <li><a href="#emulate_std_list">Emulation of <code>std::list</code></a></li>
  33. </ul>
  34. </li>
  35. <li><a href="#metaprogrammming">Metaprogramming and <code>multi_index_container</code></a>
  36. <ul>
  37. <li><a href="#mpl_analysis">MPL analysis</a></li>
  38. <li><a href="#mpl_synthesis">MPL synthesis</a></li>
  39. </ul>
  40. </li>
  41. </ul>
  42. <h2><a name="emulate_std_containers">Emulating standard containers with
  43. <code>multi_index_container</code></a></h2>
  44. <h3><a name="emulate_assoc_containers">Emulation of associative
  45. containers</a></h3>
  46. <p>
  47. Academic movitations aside, there is a practical interest in emulating standard
  48. associative containers by means of <code>multi_index_container</code>, namely to take
  49. advantage of extended functionalities provided by <code>multi_index_container</code> for
  50. lookup, range querying and updating.
  51. </p>
  52. <p>
  53. In order to emulate a <code>std::set</code> one can follow the substitution
  54. rule:
  55. </p>
  56. <blockquote><pre>
  57. <span class=identifier>std</span><span class=special>::</span><span class=identifier>set</span><span class=special>&lt;</span><span class=identifier>Key</span><span class=special>,</span><span class=identifier>Compare</span><span class=special>,</span><span class=identifier>Allocator</span><span class=special>&gt;</span> <span class=special>-&gt;</span>
  58. <span class=identifier>multi_index_container</span><span class=special>&lt;</span>
  59. <span class=identifier>Key</span><span class=special>,</span>
  60. <span class=identifier>indexed_by</span><span class=special>&lt;</span><span class=identifier>ordered_unique</span><span class=special>&lt;</span><span class=identifier>identity</span><span class=special>&lt;</span><span class=identifier>Key</span><span class=special>&gt;,</span><span class=identifier>Compare</span><span class=special>&gt;</span> <span class=special>&gt;,</span>
  61. <span class=identifier>Allocator</span>
  62. <span class=special>&gt;</span>
  63. </pre></blockquote>
  64. <p>
  65. In the default case where <code>Compare=std::less&lt;Key></code> and
  66. <code>Allocator=std::allocator&lt;Key></code>, the substitution rule is
  67. simplified as
  68. </p>
  69. <blockquote><pre>
  70. <span class=identifier>std</span><span class=special>::</span><span class=identifier>set</span><span class=special>&lt;</span><span class=identifier>Key</span><span class=special>&gt;</span> <span class=special>-&gt;</span> <span class=identifier>multi_index_container</span><span class=special>&lt;</span><span class=identifier>Key</span><span class=special>&gt;</span>
  71. </pre></blockquote>
  72. <p>
  73. The substitution of <code>multi_index_container</code> for <code>std::set</code> keeps
  74. the whole set of functionality provided by <code>std::set</code>, so in
  75. principle it is a drop-in replacement needing no further adjustments.
  76. </p>
  77. <p>
  78. <code>std::multiset</code> can be emulated in a similar manner, according to the
  79. following rule:
  80. </p>
  81. <blockquote><pre>
  82. <span class=identifier>std</span><span class=special>::</span><span class=identifier>multiset</span><span class=special>&lt;</span><span class=identifier>Key</span><span class=special>,</span><span class=identifier>Compare</span><span class=special>,</span><span class=identifier>Allocator</span><span class=special>&gt;</span> <span class=special>-&gt;</span>
  83. <span class=identifier>multi_index_container</span><span class=special>&lt;</span>
  84. <span class=identifier>Key</span><span class=special>,</span>
  85. <span class=identifier>indexed_by</span><span class=special>&lt;</span><span class=identifier>ordered_non_unique</span><span class=special>&lt;</span><span class=identifier>identity</span><span class=special>&lt;</span><span class=identifier>Key</span><span class=special>&gt;,</span><span class=identifier>Compare</span><span class=special>&gt;</span> <span class=special>&gt;,</span>
  86. <span class=identifier>Allocator</span>
  87. <span class=special>&gt;</span>
  88. </pre></blockquote>
  89. <p>
  90. When default values are taken into consideration, the rule takes the form
  91. </p>
  92. <blockquote><pre>
  93. <span class=identifier>std</span><span class=special>::</span><span class=identifier>multiset</span><span class=special>&lt;</span><span class=identifier>Key</span><span class=special>&gt;</span> <span class=special>-&gt;</span>
  94. <span class=identifier>multi_index_container</span><span class=special>&lt;</span>
  95. <span class=identifier>Key</span><span class=special>,</span>
  96. <span class=identifier>indexed_by</span><span class=special>&lt;</span><span class=identifier>ordered_non_unique</span><span class=special>&lt;</span><span class=identifier>identity</span><span class=special>&lt;</span><span class=identifier>Key</span><span class=special>&gt;</span> <span class=special>&gt;</span> <span class=special>&gt;</span>
  97. <span class=special>&gt;</span>
  98. </pre></blockquote>
  99. <p>
  100. The emulation of <code>std::multiset</code>s with <code>multi_index_container</code>
  101. results in a slight difference with respect to the interface offered: the member
  102. function <code>insert(const value_type&amp;)</code> does not return an
  103. <code>iterator</code> as in <code>std::multiset</code>s, but rather a
  104. <code>std::pair&lt;iterator,bool></code> in the spirit of <code>std::set</code>s.
  105. In this particular case, however, the <code>bool</code> member of the returned
  106. pair is always <code>true</code>.
  107. </p>
  108. <p>
  109. The case of <code>std::map</code>s and <code>std::multimap</code>s does not lend
  110. itself to such a direct emulation by means of <code>multi_index_container</code>. The main
  111. problem lies in the fact that elements of a <code>multi_index_container</code> are treated
  112. as constant, while the <code>std::map</code> and <code>std::multimap</code> handle
  113. objects of type <code>std::pair&lt;const Key,T></code>, thus allowing for free
  114. modification of the value part. To overcome this difficulty we need to create an ad
  115. hoc pair class:
  116. </p>
  117. <blockquote><pre>
  118. <span class=keyword>template</span> <span class=special>&lt;</span><span class=keyword>typename</span> <span class=identifier>T1</span><span class=special>,</span><span class=keyword>typename</span> <span class=identifier>T2</span><span class=special>&gt;</span>
  119. <span class=keyword>struct</span> <span class=identifier>mutable_pair</span>
  120. <span class=special>{</span>
  121. <span class=keyword>typedef</span> <span class=identifier>T1</span> <span class=identifier>first_type</span><span class=special>;</span>
  122. <span class=keyword>typedef</span> <span class=identifier>T2</span> <span class=identifier>second_type</span><span class=special>;</span>
  123. <span class=identifier>mutable_pair</span><span class=special>():</span><span class=identifier>first</span><span class=special>(</span><span class=identifier>T1</span><span class=special>()),</span><span class=identifier>second</span><span class=special>(</span><span class=identifier>T2</span><span class=special>()){}</span>
  124. <span class=identifier>mutable_pair</span><span class=special>(</span><span class=keyword>const</span> <span class=identifier>T1</span><span class=special>&amp;</span> <span class=identifier>f</span><span class=special>,</span><span class=keyword>const</span> <span class=identifier>T2</span><span class=special>&amp;</span> <span class=identifier>s</span><span class=special>):</span><span class=identifier>first</span><span class=special>(</span><span class=identifier>f</span><span class=special>),</span><span class=identifier>second</span><span class=special>(</span><span class=identifier>s</span><span class=special>){}</span>
  125. <span class=identifier>mutable_pair</span><span class=special>(</span><span class=keyword>const</span> <span class=identifier>std</span><span class=special>::</span><span class=identifier>pair</span><span class=special>&lt;</span><span class=identifier>T1</span><span class=special>,</span><span class=identifier>T2</span><span class=special>&gt;&amp;</span> <span class=identifier>p</span><span class=special>):</span><span class=identifier>first</span><span class=special>(</span><span class=identifier>p</span><span class=special>.</span><span class=identifier>first</span><span class=special>),</span><span class=identifier>second</span><span class=special>(</span><span class=identifier>p</span><span class=special>.</span><span class=identifier>second</span><span class=special>){}</span>
  126. <span class=identifier>T1</span> <span class=identifier>first</span><span class=special>;</span>
  127. <span class=keyword>mutable</span> <span class=identifier>T2</span> <span class=identifier>second</span><span class=special>;</span>
  128. <span class=special>};</span>
  129. </pre></blockquote>
  130. <p>
  131. and so the substitution rules are:
  132. </p>
  133. <blockquote><pre>
  134. <span class=identifier>std</span><span class=special>::</span><span class=identifier>map</span><span class=special>&lt;</span><span class=identifier>Key</span><span class=special>,</span><span class=identifier>T</span><span class=special>,</span><span class=identifier>Compare</span><span class=special>,</span><span class=identifier>Allocator</span><span class=special>&gt;</span> <span class=special>-&gt;</span>
  135. <span class=identifier>multi_index_container</span><span class=special>&lt;</span>
  136. <span class=identifier>Element</span><span class=special>,</span>
  137. <span class=identifier>indexed_by</span><span class=special>&lt;</span>
  138. <span class=identifier>ordered_unique</span><span class=special>&lt;</span><span class=identifier>member</span><span class=special>&lt;</span><span class=identifier>Element</span><span class=special>,</span><span class=identifier>Key</span><span class=special>,&amp;</span><span class=identifier>Element</span><span class=special>::</span><span class=identifier>first</span><span class=special>&gt;,</span><span class=identifier>Compare</span><span class=special>&gt;</span>
  139. <span class=special>&gt;,</span>
  140. <span class=keyword>typename</span> <span class=identifier>Allocator</span><span class=special>::</span><span class=keyword>template</span> <span class=identifier>rebind</span><span class=special>&lt;</span><span class=identifier>Element</span><span class=special>&gt;::</span><span class=identifier>other</span>
  141. <span class=special>&gt;</span>
  142. <span class=identifier>std</span><span class=special>::</span><span class=identifier>multimap</span><span class=special>&lt;</span><span class=identifier>Key</span><span class=special>,</span><span class=identifier>T</span><span class=special>,</span><span class=identifier>Compare</span><span class=special>,</span><span class=identifier>Allocator</span><span class=special>&gt;</span> <span class=special>-&gt;</span>
  143. <span class=identifier>multi_index_container</span><span class=special>&lt;</span>
  144. <span class=identifier>Element</span><span class=special>,</span>
  145. <span class=identifier>indexed_by</span><span class=special>&lt;</span>
  146. <span class=identifier>ordered_non_unique</span><span class=special>&lt;</span><span class=identifier>member</span><span class=special>&lt;</span><span class=identifier>Element</span><span class=special>,</span><span class=identifier>Key</span><span class=special>,&amp;</span><span class=identifier>Element</span><span class=special>::</span><span class=identifier>first</span><span class=special>&gt;,</span><span class=identifier>Compare</span><span class=special>&gt;</span>
  147. <span class=special>&gt;,</span>
  148. <span class=keyword>typename</span> <span class=identifier>Allocator</span><span class=special>::</span><span class=keyword>template</span> <span class=identifier>rebind</span><span class=special>&lt;</span><span class=identifier>Element</span><span class=special>&gt;::</span><span class=identifier>other</span>
  149. <span class=special>&gt;</span>
  150. (<span class=identifier>with</span> <span class=identifier>Element</span><span class=special>=</span><span class=identifier>mutable_pair</span><span class=special>&lt;</span><span class=identifier>Key</span><span class=special>,</span><span class=identifier>T</span><span class=special>&gt;</span>)
  151. </pre></blockquote>
  152. <p>
  153. If default values are considered, the rules take the form:
  154. </p>
  155. <blockquote><pre>
  156. <span class=identifier>std</span><span class=special>::</span><span class=identifier>map</span><span class=special>&lt;</span><span class=identifier>Key</span><span class=special>,</span><span class=identifier>T</span><span class=special>&gt;</span> <span class=special>-&gt;</span>
  157. <span class=identifier>multi_index_container</span><span class=special>&lt;</span>
  158. <span class=identifier>Element</span><span class=special>,
  159. </span><span class=identifier>indexed_by</span><span class=special>&lt;</span><span class=identifier>ordered_unique</span><span class=special>&lt;</span><span class=identifier>member</span><span class=special>&lt;</span><span class=identifier>Element</span><span class=special>,</span><span class=identifier>Key</span><span class=special>,&amp;</span><span class=identifier>Element</span><span class=special>::</span><span class=identifier>first</span><span class=special>&gt;</span> <span class=special>&gt;</span> <span class=special>&gt;</span>
  160. <span class=special>&gt;</span>
  161. <span class=identifier>std</span><span class=special>::</span><span class=identifier>multimap</span><span class=special>&lt;</span><span class=identifier>Key</span><span class=special>,</span><span class=identifier>T</span><span class=special>&gt;</span> <span class=special>-&gt;</span>
  162. <span class=identifier>multi_index_container</span><span class=special>&lt;</span>
  163. <span class=identifier>Element</span><span class=special>,
  164. </span><span class=identifier>indexed_by</span><span class=special>&lt;</span><span class=identifier>ordered_non_unique</span><span class=special>&lt;</span><span class=identifier>member</span><span class=special>&lt;</span><span class=identifier>Element</span><span class=special>,</span><span class=identifier>Key</span><span class=special>,&amp;</span><span class=identifier>Element</span><span class=special>::</span><span class=identifier>first</span><span class=special>&gt;</span> <span class=special>&gt;</span> <span class=special>&gt;</span>
  165. <span class=special>&gt;</span>
  166. (<span class=identifier>with</span> <span class=identifier>Element</span><span class=special>=</span><span class=identifier>mutable_pair</span><span class=special>&lt;</span><span class=identifier>Key</span><span class=special>,</span><span class=identifier>T</span><span class=special>&gt;</span>)
  167. </pre></blockquote>
  168. <p>
  169. Unlike as with standard sets, the interface of these <code>multi_index_container</code>-emulated
  170. maps does not exactly conform to that of <code>std::map</code>s and
  171. <code>std::multimap</code>s. The most obvious difference is the lack of
  172. <code>operator []</code>, either in read or write mode; this, however, can be
  173. emulated with appropriate use of <code>find</code> and <code>insert</code>.
  174. </p>
  175. <p>
  176. These emulations of standard associative containers with <code>multi_index_container</code>
  177. are comparable to the original constructs in terms of space and time efficiency.
  178. See the <a href="../performance.html">performance section</a> for further details.
  179. </p>
  180. <h3><a name="emulate_std_list">Emulation of <code>std::list</code></a></h3>
  181. <p>
  182. Unlike the case of associative containers, emulating <code>std::list</code>
  183. in Boost.MultiIndex does not add any significant functionality, so the following
  184. is presented merely for completeness sake.
  185. </p>
  186. <p>
  187. Much as with standard maps, the main difficulty to overcome when emulating
  188. <code>std::list</code> derives from the constant nature of elements of a
  189. <code>multi_index_container</code>. Again, some sort of adaption class is needed, like
  190. for instance the following:
  191. </p>
  192. <blockquote><pre>
  193. <span class=keyword>template</span> <span class=special>&lt;</span><span class=keyword>typename</span> <span class=identifier>T</span><span class=special>&gt;</span>
  194. <span class=keyword>struct</span> <span class=identifier>mutable_value</span>
  195. <span class=special>{</span>
  196. <span class=identifier>mutable_value</span><span class=special>(</span><span class=keyword>const</span> <span class=identifier>T</span><span class=special>&amp;</span> <span class=identifier>t</span><span class=special>):</span><span class=identifier>t</span><span class=special>(</span><span class=identifier>t</span><span class=special>){}</span>
  197. <span class=keyword>operator</span> <span class=identifier>T</span><span class=special>&amp;()</span><span class=keyword>const</span><span class=special>{</span><span class=keyword>return</span> <span class=identifier>t</span><span class=special>;}</span>
  198. <span class=keyword>private</span><span class=special>:</span>
  199. <span class=keyword>mutable</span> <span class=identifier>T</span> <span class=identifier>t</span><span class=special>;</span>
  200. <span class=special>};</span>
  201. </pre></blockquote>
  202. <p>
  203. which allows us to use the substitution rule:
  204. </p>
  205. <blockquote><pre>
  206. <span class=identifier>std</span><span class=special>::</span><span class=identifier>list</span><span class=special>&lt;</span><span class=identifier>T</span><span class=special>,</span><span class=identifier>Allocator</span><span class=special>&gt;</span> <span class=special>-&gt;</span>
  207. <span class=identifier>multi_index_container</span><span class=special>&lt;</span>
  208. <span class=identifier>Element</span><span class=special>,</span>
  209. <span class=identifier>indexed_by</span><span class=special>&lt;</span><span class=identifier>sequenced</span><span class=special>&lt;&gt;</span> <span class=special>&gt;,</span>
  210. <span class=keyword>typename</span> <span class=identifier>Allocator</span><span class=special>::</span><span class=keyword>template</span> <span class=identifier>rebind</span><span class=special>&lt;</span><span class=identifier>Element</span><span class=special>&gt;::</span><span class=identifier>other</span>
  211. <span class=special>&gt;</span>
  212. (<span class=identifier>with</span> <span class=identifier>Element</span><span class=special>=</span><span class=identifier>mutable_value</span><span class=special>&lt;</span><span class=identifier>T</span><span class=special>&gt;</span>)
  213. </pre></blockquote>
  214. <p>
  215. or, if the default value <code>Allocator=std::allocator&lt;T></code> is used:
  216. </p>
  217. <blockquote><pre>
  218. <span class=identifier>std</span><span class=special>::</span><span class=identifier>list</span><span class=special>&lt;</span><span class=identifier>T</span><span class=special>&gt;</span> <span class=special>-&gt;</span>
  219. <span class=identifier>multi_index_container</span><span class=special>&lt;</span><span class=identifier>mutable_value</span><span class=special>&lt;</span><span class=identifier>T</span><span class=special>&gt;,</span><span class=identifier>indexed_by</span><span class=special>&lt;</span><span class=identifier>sequenced</span><span class=special>&lt;&gt;</span> <span class=special>&gt;</span> <span class=special>&gt;</span>
  220. </pre></blockquote>
  221. <h2><a name="metaprogrammming">Metaprogramming and <code>multi_index_container</code></a></h2>
  222. <p>
  223. Boost.MultiIndex provides a number of facilities intended to allow the analysis and
  224. synthesis of <code>multi_index_container</code> instantiations by
  225. <a href="../../../../libs/mpl/doc/index.html">MPL</a> metaprograms.
  226. </p>
  227. <h3><a name="mpl_analysis">MPL analysis</a></h3>
  228. <p>
  229. Given a <code>multi_index_container</code> instantiation, the following nested types are
  230. provided for compile-time inspection of the various types occurring in the
  231. definition of the <code>multi_index_container</code>:
  232. <ul>
  233. <li><code>index_specifier_type_list</code>,</li>
  234. <li><code>index_type_list</code>,</li>
  235. <li><code>iterator_type_list</code>,</li>
  236. <li><code>const_iterator_type_list</code>.</li>
  237. </ul>
  238. Each of these types is an MPL sequence with as many elements as indices
  239. comprise the <code>multi_index_container</code>: for instance, the <code>n</code>-th
  240. element of <code>iterator_type_list</code> is the same as
  241. <code>nth_index&lt;n>::type::iterator</code>.
  242. </p>
  243. <p>
  244. A subtle but important distinction exists between
  245. <code>index_specifier_type_list</code> and <code>index_type_list</code>:
  246. the former typelist holds the index <i>specifiers</i>
  247. with which the <code>multi_index_container</code> instantiation was defined,
  248. while the latter gives access to the actual implementation classes
  249. corresponding to each specifier. An example will help to clarify
  250. this distinction. Given the instantiation:
  251. </p>
  252. <blockquote><pre>
  253. <span class=keyword>typedef</span> <span class=identifier>multi_index_container</span><span class=special>&lt;</span>
  254. <span class=keyword>int</span><span class=special>,</span>
  255. <span class=identifier>indexed_by</span><span class=special>&lt;</span>
  256. <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>
  257. <span class=identifier>sequenced</span><span class=special>&lt;&gt;</span>
  258. <span class=special>&gt;</span>
  259. <span class=special>&gt;</span> <span class=identifier>indexed_t</span><span class=special>;</span>
  260. </pre></blockquote>
  261. <p>
  262. <code>indexed_t::index_specifier_type_list</code> is a type list with
  263. elements
  264. </p>
  265. <blockquote><pre>
  266. <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>
  267. <span class=identifier>sequenced</span><span class=special>&lt;&gt;</span>
  268. </pre></blockquote>
  269. <p>
  270. while <code>indexed_t::index_type_list</code> holds the types
  271. </p>
  272. <blockquote><pre>
  273. <span class=identifier>multi_index_container</span><span class=special>::</span><span class=identifier>nth_type</span><span class=special>&lt;</span><span class=number>0</span><span class=special>&gt;::</span><span class=identifier>type</span>
  274. <span class=identifier>multi_index_container</span><span class=special>::</span><span class=identifier>nth_type</span><span class=special>&lt;</span><span class=number>1</span><span class=special>&gt;::</span><span class=identifier>type</span>
  275. </pre></blockquote>
  276. <p>
  277. so the typelists are radically different. Check the
  278. <a href="../reference/multi_index_container.html#types">reference</a>
  279. for the exact MPL sequence concepts modeled by these type lists.
  280. </p>
  281. <h3><a name="mpl_synthesis">MPL synthesis</a></h3>
  282. <p>
  283. Although typically indices are specified by means of the
  284. <code>indexed_by</code> construct, actually any MPL sequence of
  285. index specifiers can be provided instead:
  286. </p>
  287. <blockquote><pre>
  288. <span class=keyword>typedef</span> <span class=identifier>mpl</span><span class=special>::</span><span class=identifier>vector</span><span class=special>&lt;</span><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><span class=identifier>sequenced</span><span class=special>&lt;&gt;</span> <span class=special>&gt;</span> <span class=identifier>index_list_t</span><span class=special>;</span>
  289. <span class=keyword>typedef</span> <span class=identifier>multi_index_container</span><span class=special>&lt;</span>
  290. <span class=keyword>int</span><span class=special>,</span>
  291. <span class=identifier>index_list_t</span>
  292. <span class=special>&gt;</span> <span class=identifier>indexed_t</span><span class=special>;</span>
  293. </pre></blockquote>
  294. <p>
  295. This possibility enables the synthesis of instantiations of
  296. <code>multi_index_container</code> through MPL metaprograms, as the following
  297. example shows:
  298. </p>
  299. <blockquote><pre>
  300. <span class=comment>// original multi_index_container instantiation</span>
  301. <span class=keyword>typedef</span> <span class=identifier>multi_index_container</span><span class=special>&lt;</span>
  302. <span class=keyword>int</span><span class=special>,</span>
  303. <span class=identifier>indexed_by</span><span class=special>&lt;</span>
  304. <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>
  305. <span class=special>&gt;</span>
  306. <span class=special>&gt;</span> <span class=identifier>indexed_t1</span><span class=special>;</span>
  307. <span class=comment>// we take its index list and add an index</span>
  308. <span class=keyword>typedef</span> <span class=identifier>boost</span><span class=special>::</span><span class=identifier>mpl</span><span class=special>::</span><span class=identifier>push_front</span><span class=special>&lt;</span>
  309. <span class=identifier>indexed_t1</span><span class=special>::</span><span class=identifier>index_specifier_type_list</span><span class=special>,</span>
  310. <span class=identifier>sequenced</span><span class=special>&lt;&gt;</span>
  311. <span class=special>&gt;::</span><span class=identifier>type</span> <span class=identifier>index_list_t</span><span class=special>;</span>
  312. <span class=comment>// augmented multi_index_container</span>
  313. <span class=keyword>typedef</span> <span class=identifier>multi_index_container</span><span class=special>&lt;</span>
  314. <span class=keyword>int</span><span class=special>,</span>
  315. <span class=identifier>index_list_t</span>
  316. <span class=special>&gt;</span> <span class=identifier>indexed_t2</span><span class=special>;</span>
  317. </pre></blockquote>
  318. <hr>
  319. <div class="prev_link"><a href="debug.html"><img src="../prev.gif" alt="debugging support" border="0"><br>
  320. Debugging support
  321. </a></div>
  322. <div class="up_link"><a href="index.html"><img src="../up.gif" alt="Boost.MultiIndex tutorial" border="0"><br>
  323. Boost.MultiIndex tutorial
  324. </a></div>
  325. <div class="next_link"><a href="../reference/index.html"><img src="../next.gif" alt="Boost.MultiIndex reference" border="0"><br>
  326. Boost.MultiIndex reference
  327. </a></div><br clear="all" style="clear: all;">
  328. <br>
  329. <p>Revised November 7th 2008</p>
  330. <p>&copy; Copyright 2003-2008 Joaqu&iacute;n M L&oacute;pez Mu&ntilde;oz.
  331. Distributed under the Boost Software
  332. License, Version 1.0. (See accompanying file <a href="../../../../LICENSE_1_0.txt">
  333. LICENSE_1_0.txt</a> or copy at <a href="http://www.boost.org/LICENSE_1_0.txt">
  334. http://www.boost.org/LICENSE_1_0.txt</a>)
  335. </p>
  336. </body>
  337. </html>