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