future_work.html 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  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 - Future work</title>
  6. <link rel="stylesheet" href="style.css" type="text/css">
  7. <link rel="start" href="index.html">
  8. <link rel="prev" href="tests.html">
  9. <link rel="up" href="index.html">
  10. <link rel="next" href="release_notes.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 Future work</h1>
  15. <div class="prev_link"><a href="tests.html"><img src="prev.gif" alt="tests" border="0"><br>
  16. Tests
  17. </a></div>
  18. <div class="up_link"><a href="index.html"><img src="up.gif" alt="index" border="0"><br>
  19. Index
  20. </a></div>
  21. <div class="next_link"><a href="release_notes.html"><img src="next.gif" alt="release notes" border="0"><br>
  22. Release notes
  23. </a></div><br clear="all" style="clear: all;">
  24. <hr>
  25. <p>
  26. A number of new functionalities are considered for inclusion into
  27. future releases of Boost.MultiIndex. Some of them depend on the
  28. potential for extensibility of the library, which has been a guiding
  29. principle driving the current internal design of <code>multi_index_container</code>.
  30. </p>
  31. <h2>Contents</h2>
  32. <ul>
  33. <li><a href="#notifying">Notifying indices</a></li>
  34. <li><a href="#constraints">Constraints</a></li>
  35. <li><a href="#user_defined_indices">User-defined indices</a></li>
  36. <li><a href="#indexed_maps">Indexed maps</a></li>
  37. </ul>
  38. <h2><a name="notifying">Notifying indices</a></h2>
  39. <p>
  40. <i>Notifying indices</i> can be implemented as decorators over
  41. preexistent index types, with the added functionality that internal
  42. events of the index (insertion, erasing, modifying of elements) are
  43. signalled to an external entity --for instance, by means of the
  44. <a href="../../../doc/html/signals.html">Boost.Signals</a>
  45. library. This functionality can have applications for:
  46. <ol>
  47. <li>Logging,</li>
  48. <li>interfacing to GUI-based applications,</li>
  49. <li>synchronization between separate data structures.</li>
  50. </ol>
  51. </p>
  52. <p>
  53. The following is a sketch of a possible realization of notifying
  54. indices:
  55. </p>
  56. <blockquote><pre>
  57. <span class=keyword>struct</span> <span class=identifier>insert_log</span>
  58. <span class=special>{</span>
  59. <span class=keyword>void</span> <span class=keyword>operator</span><span class=special>()(</span><span class=keyword>int</span> <span class=identifier>x</span><span class=special>)</span>
  60. <span class=special>{</span>
  61. <span class=identifier>std</span><span class=special>::</span><span class=identifier>clog</span><span class=special>&lt;&lt;</span><span class=string>&quot;insert: &quot;</span><span class=special>&lt;&lt;</span><span class=identifier>x</span><span class=special>&lt;&lt;</span><span class=identifier>std</span><span class=special>::</span><span class=identifier>endl</span><span class=special>;</span>
  62. <span class=special>}</span>
  63. <span class=special>};</span>
  64. <span class=keyword>int</span> <span class=identifier>main</span><span class=special>()</span>
  65. <span class=special>{</span>
  66. <span class=keyword>typedef</span> <span class=identifier>multi_index_container</span><span class=special>&lt;</span>
  67. <span class=keyword>int</span><span class=special>,</span>
  68. <span class=identifier>indexed_by</span><span class=special>&lt;</span>
  69. <span class=identifier>notifying</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=special>&gt;,</span> <span class=comment>// notifying index</span>
  70. <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>int</span><span class=special>&gt;</span> <span class=special>&gt;</span>
  71. <span class=special>&gt;</span>
  72. <span class=special>&gt;</span> <span class=identifier>indexed_t</span><span class=special>;</span>
  73. <span class=identifier>indexed_t</span> <span class=identifier>t</span><span class=special>;</span>
  74. <span class=comment>// on_insert is the signal associated to insertions</span>
  75. <span class=identifier>t</span><span class=special>.</span><span class=identifier>on_insert</span><span class=special>.</span><span class=identifier>connect</span><span class=special>(</span><span class=identifier>insert_log</span><span class=special>());</span>
  76. <span class=identifier>t</span><span class=special>.</span><span class=identifier>insert</span><span class=special>(</span><span class=number>0</span><span class=special>);</span>
  77. <span class=identifier>t</span><span class=special>.</span><span class=identifier>insert</span><span class=special>(</span><span class=number>1</span><span class=special>);</span>
  78. <span class=keyword>return</span> <span class=number>0</span><span class=special>;</span>
  79. <span class=special>}</span>
  80. <span class=comment>// output:
  81. // insert: 0
  82. // insert: 1</span>
  83. </pre></blockquote>
  84. <h2><a name="constraints">Constraints</a></h2>
  85. <p>
  86. The notifying indices functionality described above exploits a powerful
  87. design pattern based on <i>index adaptors</i>, decorators over preexistent
  88. indices which add some functionality or somehow change the semantics of
  89. the underlying index. This pattern can be used for the implementation
  90. of <i>constraints</i>, adaptors that restrict the elements accepted by an
  91. index according to some validation predicate. The following is a possible
  92. realization of how constraints syntax may look like:
  93. </p>
  94. <blockquote><pre>
  95. <span class=keyword>struct</span> <span class=identifier>is_even</span>
  96. <span class=special>{</span>
  97. <span class=keyword>bool</span> <span class=keyword>operator</span><span class=special>()(</span><span class=keyword>int</span> <span class=identifier>x</span><span class=special>)</span><span class=keyword>const</span><span class=special>{</span><span class=keyword>return</span> <span class=identifier>x</span><span class=special>%</span><span class=number>2</span><span class=special>==</span><span class=number>0</span><span class=special>;}</span>
  98. <span class=special>};</span>
  99. <span class=keyword>typedef</span> <span class=identifier>multi_index_container</span><span class=special>&lt;</span>
  100. <span class=keyword>int</span><span class=special>,</span>
  101. <span class=identifier>indexed_by</span><span class=special>&lt;</span>
  102. <span class=identifier>constrained</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>is_even</span><span class=special>&gt;</span>
  103. <span class=special>&gt;</span>
  104. <span class=special>&gt;</span> <span class=identifier>indexed_t</span><span class=special>;</span>
  105. </pre></blockquote>
  106. <h2><a name="user_defined_indices">User-defined indices</a></h2>
  107. <p>
  108. The mechanisms by which Boost.MultiIndex orchestrates the
  109. operations of the indices held by a <code>multi_index_container</code> are
  110. simple enough to make them worth documenting so that the (bold)
  111. user can write implementations for her own indices.
  112. </p>
  113. <h2><a name="indexed_maps">Indexed maps</a></h2>
  114. <p>
  115. <code>multi_index_container</code> is rich enough to provide the basis
  116. for implementation of <i>indexed maps</i>, i.e. maps which
  117. can be looked upon several different keys. The motivation for having
  118. such a container is mainly aesthetic convenience, since it
  119. would not provide any additional feature to similar constructs
  120. based directly on <code>multi_index_container</code>.
  121. </p>
  122. <p>
  123. The main challenge in writing an indexed map lies in the design of a
  124. reasonable interface that resembles that of <code>std::map</code> as
  125. much as possible. There seem to be fundamental difficulties in extending
  126. the syntax of a <code>std::map</code> to multiple keys. For one example,
  127. consider the situation:
  128. </p>
  129. <blockquote><pre>
  130. <span class=identifier>indexed_map</span><span class=special>&lt;</span><span class=keyword>int</span><span class=special>,</span><span class=identifier>string</span><span class=special>,</span><span class=keyword>double</span><span class=special>&gt;</span> <span class=identifier>m</span><span class=special>;</span>
  131. <span class=comment>// keys are int and string, double is the mapped to value</span>
  132. <span class=special>...</span>
  133. <span class=identifier>cout</span><span class=special>&lt;&lt;</span><span class=identifier>m</span><span class=special>[</span><span class=number>0</span><span class=special>]&lt;&lt;</span><span class=identifier>endl</span><span class=special>;</span> <span class=comment>// OK</span>
  134. <span class=identifier>cout</span><span class=special>&lt;&lt;</span><span class=identifier>m</span><span class=special>[</span><span class=string>&quot;zero&quot;</span><span class=special>]&lt;&lt;</span><span class=identifier>endl</span><span class=special>;</span> <span class=comment>// OK</span>
  135. <span class=identifier>m</span><span class=special>[</span><span class=number>1</span><span class=special>]=</span><span class=number>1.0</span><span class=special>;</span> <span class=comment>// !!</span>
  136. </pre></blockquote>
  137. <p>
  138. In the last sentence of the example, the user has no way of
  139. providing the <code>string</code> key mapping to the same value
  140. as <code>m[1]</code>. This and similar problems have to be devoted
  141. a careful study when designing the interface of a potential
  142. indexed map.
  143. </p>
  144. <hr>
  145. <div class="prev_link"><a href="tests.html"><img src="prev.gif" alt="tests" border="0"><br>
  146. Tests
  147. </a></div>
  148. <div class="up_link"><a href="index.html"><img src="up.gif" alt="index" border="0"><br>
  149. Index
  150. </a></div>
  151. <div class="next_link"><a href="release_notes.html"><img src="next.gif" alt="release notes" border="0"><br>
  152. Release notes
  153. </a></div><br clear="all" style="clear: all;">
  154. <br>
  155. <p>Revised April 19th 2015</p>
  156. <p>&copy; Copyright 2003-2015 Joaqu&iacute;n M L&oacute;pez Mu&ntilde;oz.
  157. Distributed under the Boost Software
  158. License, Version 1.0. (See accompanying file <a href="../../../LICENSE_1_0.txt">
  159. LICENSE_1_0.txt</a> or copy at <a href="http://www.boost.org/LICENSE_1_0.txt">
  160. http://www.boost.org/LICENSE_1_0.txt</a>)
  161. </p>
  162. </body>
  163. </html>