1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0.1 Transitional//EN">
5 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
6 <title>Boost.MultiIndex Documentation - Key extraction reference</title>
7 <link rel="stylesheet" href="../style.css" type="text/css">
8 <link rel="start" href="../index.html">
9 <link rel="prev" href="rnd_indices.html">
10 <link rel="up" href="index.html">
11 <link rel="next" href="../compiler_specifics.html">
15 <h1><img src="../../../../boost.png" alt="boost.png (6897 bytes)" align=
16 "middle" width="277" height="86">Boost.MultiIndex Key extraction reference</h1>
18 <div class="prev_link"><a href="rnd_indices.html"><img src="../prev.gif" alt="random access indices" border="0"><br>
21 <div class="up_link"><a href="index.html"><img src="../up.gif" alt="Boost.MultiIndex reference" border="0"><br>
22 Boost.MultiIndex reference
24 <div class="next_link"><a href="../compiler_specifics.html"><img src="../next.gif" alt="compiler specifics" border="0"><br>
26 </a></div><br clear="all" style="clear: all;">
33 <li><a href="#key_extractors">Key Extractors</a>
35 <li><a href="#chained_pointers">Chained pointers</a></li>
38 <li><a href="#synopsis">Header
39 <code>"boost/multi_index/key_extractors.hpp"</code> synopsis</a>
41 <li><a href="#identity_synopsis">Header
42 <code>"boost/multi_index/identity.hpp"</code> synopsis</a>
44 <li><a href="#identity">Class template <code>identity</code></a></li>
47 <li><a href="#member_synopsis">Header
48 <code>"boost/multi_index/member.hpp"</code> synopsis</a>
50 <li><a href="#member">Class template <code>member</code></a></li>
51 <li><a href="#member_offset">Class template <code>member_offset</code></a></li>
52 <li><a href="#boost_multi_index_member">Macro <code>BOOST_MULTI_INDEX_MEMBER</code></a></li>
55 <li><a href="#mem_fun_synopsis">Header
56 <code>"boost/multi_index/mem_fun.hpp"</code> synopsis</a>
58 <li><a href="#const_mem_fun">Class template <code>const_mem_fun</code></a></li>
59 <li><a href="#mem_fun">Class template <code>mem_fun</code></a></li>
60 <li><a href="#const_mem_fun_explicit">Class templates <code>const_mem_fun_explicit</code> and <code>mem_fun_explicit</code></a></li>
61 <li><a href="#boost_multi_index_const_mem_fun">Macros <code>BOOST_MULTI_INDEX_CONST_MEM_FUN</code> and <code>BOOST_MULTI_INDEX_MEM_FUN</code></a></li>
64 <li><a href="#global_fun_synopsis">Header
65 <code>"boost/multi_index/global_fun.hpp"</code> synopsis</a>
67 <li><a href="#global_fun">Class template <code>global_fun</code></a></li>
70 <li><a href="#composite_key_synopsis">Header
71 <code>"boost/multi_index/composite_key.hpp"</code> synopsis</a>
73 <li><a href="#composite_key">Class template <code>composite_key</code></a></li>
74 <li><a href="#composite_key_result">Class template <code>composite_key_result</code></a></li>
75 <li><a href="#ckey_result_equality">Equality</a>
77 <li><a href="#composite_key_equal_to">Class template <code>composite_key_equal_to</code></a></li>
78 <li><a href="#composite_key_result_equal_to">Class template <code>composite_key_result_equal_to</code></a></li>
79 <li><a href="#equal_to_composite_key_result">Specialization of <code>std::equal_to</code> for <code>composite_key</code> results</a></li>
82 <li><a href="#ckey_result_comparison">Comparison</a>
84 <li><a href="#composite_key_compare">Class template <code>composite_key_compare</code></a></li>
85 <li><a href="#composite_key_result_less">Class template <code>composite_key_result_less</code></a></li>
86 <li><a href="#composite_key_result_greater">Class template <code>composite_key_result_greater</code></a></li>
87 <li><a href="#less_composite_key_result">Specialization of <code>std::less</code> for <code>composite_key</code> results</a></li>
88 <li><a href="#greater_composite_key_result">Specialization of <code>std::greater</code> for <code>composite_key</code> results</a></li>
91 <li><a href="#ckey_result_hashing">Hashing</a>
93 <li><a href="#composite_key_hash">Class template <code>composite_key_hash</code></a></li>
94 <li><a href="#composite_key_result_hash">Class template <code>composite_key_result_hash</code></a></li>
95 <li><a href="#hash_composite_key_result">Specialization of <code>boost::hash</code> for <code>composite_key</code> results</a></li>
98 <li><a href="#ckey_result_semantics">Semantics of <code>composite_key_result</code></a></li>
103 <h2><a name="key_extractors">Key Extractors</a></h2>
106 Key extraction classes are used by
107 <a href="indices.html#key_based_indices">key-based indices</a> to
108 obtain the indexing keys from the elements of a <code>multi_index_container</code>.
109 A <code>CopyConstructible</code> and <code>CopyAssignable</code>
110 class <code>KeyFromValue</code> is said to be a key extractor from a
111 type <code>Type</code> if
113 <li>the type <code>KeyFromValue::result_type</code> is defined,</li>
114 <li><code>k1(ca)</code> is defined and returns a value convertible
115 to <code>const KeyFromValue::result_type&</code>,</li>
116 <li>if <code>k2</code> is a copy of <code>k1</code>, <code>k1(ca)</code> is the
117 same value as <code>k2(ca)</code>,</li>
119 for every <code>k1</code>, <code>k2</code> of type <code>const KeyFromValue</code>,
120 and <code>ca</code> of type <code>const Type&</code>.
124 Additionally, <code>KeyFromValue</code> is a <i>read/write</i> key extractor
125 if the following extra conditions are met:
127 <li><code>k1(a)</code> is defined and returns a value convertible
128 to <code>KeyFromValue::result_type&</code>,</li>
129 <li><code>const_cast<const KeyFromValue::result_type&>(k1(a))</code>
131 <code>k1(const_cast<const Type&>(a))</code>,</li>
133 for every <code>k1</code> of type <code>const KeyFromValue</code> and
134 <code>a</code> of type <code>Type&</code>.
138 Boost.MultiIndex provides six general-purpose key extractors:
140 <li><a href="#identity"><code>identity</code></a>,</li>
141 <li><a href="#member"><code>member</code></a>,</li>
142 <li><a href="#const_mem_fun"><code>const_mem_fun</code></a>,</li>
143 <li><a href="#mem_fun"><code>mem_fun</code></a>,</li>
144 <li><a href="#global_fun"><code>global_fun</code></a> and</li>
145 <li><a href="#composite_key"><code>composite_key</code></a>.</li>
149 <h3><a name="chained_pointers">Chained pointers</a></h3>
152 The key extractors provided by Boost.MultiIndex are templatized according
153 to the type <code>Type</code> and serve to extract keys not only from objects
154 of type <code>Type</code>, but also from reference wrappers provided by
155 <a href="../../../../doc/html/ref.html">Boost.Ref</a> and from <i>chained pointers</i>
156 to <code>Type</code> (or to reference wrappers of <code>Type</code>): a chained pointer
157 is any type <code>P</code> such that, for an object <code>p</code> of type
160 <li><code>*p</code> yields an object of type <code>Type&</code> or
161 <code>boost::reference_wrapper<Type></code>, OR</li>
162 <li><code>*p</code> yields a chained pointer to <code>Type</code>,</li>
164 that is, chained pointers are arbitrary compositions of pointer-like objects
165 ultimately dereferencing to values of <code>Type&</code> or
166 <code>boost::reference_wrapper<Type></code>.
169 <h2><a name="synopsis">Header
170 <a href="../../../../boost/multi_index/key_extractors.hpp">
171 <code>"boost/multi_index/key_extractors.hpp"</code></a> synopsis</a>
175 <span class=preprocessor>#include</span> <span class=special><</span><span class=identifier>boost</span><span class=special>/</span><span class=identifier>multi_index</span><span class=special>/</span><span class=identifier>identity</span><span class=special>.</span><span class=identifier>hpp</span><span class=special>></span>
176 <span class=preprocessor>#include</span> <span class=special><</span><span class=identifier>boost</span><span class=special>/</span><span class=identifier>multi_index</span><span class=special>/</span><span class=identifier>member</span><span class=special>.</span><span class=identifier>hpp</span><span class=special>></span>
177 <span class=preprocessor>#include</span> <span class=special><</span><span class=identifier>boost</span><span class=special>/</span><span class=identifier>multi_index</span><span class=special>/</span><span class=identifier>mem_fun</span><span class=special>.</span><span class=identifier>hpp</span><span class=special>></span>
178 <span class=preprocessor>#include</span> <span class=special><</span><span class=identifier>boost</span><span class=special>/</span><span class=identifier>multi_index</span><span class=special>/</span><span class=identifier>global_fun</span><span class=special>.</span><span class=identifier>hpp</span><span class=special>></span>
179 <span class=preprocessor>#include</span> <span class=special><</span><span class=identifier>boost</span><span class=special>/</span><span class=identifier>multi_index</span><span class=special>/</span><span class=identifier>composite_key</span><span class=special>.</span><span class=identifier>hpp</span><span class=special>></span>
183 This header includes all the key extractors provided by Boost.MultiIndex.
187 <a name="identity_synopsis">Header
188 <a href="../../../../boost/multi_index/identity.hpp">
189 <code>"boost/multi_index/identity.hpp"</code></a> synopsis</a></h2>
192 <span class=keyword>namespace</span> <span class=identifier>boost</span><span class=special>{</span>
194 <span class=keyword>namespace</span> <span class=identifier>multi_index</span><span class=special>{</span>
196 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>T</span><span class=special>></span> <span class=keyword>struct</span> <span class=identifier>identity</span><span class=special>;</span>
198 <span class=special>}</span> <span class=comment>// namespace boost::multi_index</span>
200 <span class=special>}</span> <span class=comment>// namespace boost</span>
203 <h3><a name="identity">Class template <code>identity</code></a></h3>
206 <code>identity</code> is a <a href="#key_extractors"><code>Key Extractor</code></a>
207 that acts as a do-nothing identity functor.
211 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>Type</span><span class=special>></span>
212 <span class=keyword>struct</span> <span class=identifier>identity</span>
213 <span class=special>{</span>
214 <span class=keyword>typedef</span> <span class=identifier>Type</span> <span class=identifier>result_type</span><span class=special>;</span>
216 <span class=comment>// only provided if const ChainedPtr& is not convertible to const Type&</span>
217 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>ChainedPtr</span><span class=special>></span> <span class=identifier>Type</span><span class=special>&</span> <span class=keyword>operator</span><span class=special>()(</span><span class=keyword>const</span> <span class=identifier>ChainedPtr</span><span class=special>&</span> <span class=identifier>x</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
219 <span class=keyword>const</span> <span class=identifier>Type</span><span class=special>&</span> <span class=keyword>operator</span><span class=special>()(</span><span class=keyword>const</span> <span class=identifier>Type</span><span class=special>&</span> <span class=identifier>x</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
220 <span class=identifier>Type</span><span class=special>&</span> <span class=keyword>operator</span><span class=special>()(</span><span class=identifier>Type</span><span class=special>&</span> <span class=identifier>x</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span> <span class=comment>// only provided if Type is non-const
222 // only provided if Type is non-const</span>
223 <span class=keyword>const</span> <span class=identifier>Type</span><span class=special>&</span> <span class=keyword>operator</span><span class=special>()(</span><span class=keyword>const</span> <span class=identifier>reference_wrapper</span><span class=special><</span><span class=keyword>const</span> <span class=identifier>Type</span><span class=special>>&</span> <span class=identifier>x</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
225 <span class=comment>// only provided if Type is const</span>
226 <span class=identifier>Type</span><span class=special>&</span> <span class=keyword>operator</span><span class=special>()(</span>
227 <span class=keyword>const</span> <span class=identifier>reference_wrapper</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>remove_const</span><span class=special><</span><span class=identifier>Type</span><span class=special>>::</span><span class=identifier>type</span><span class=special>>&</span> <span class=identifier>x</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
229 <span class=identifier>Type</span><span class=special>&</span> <span class=keyword>operator</span><span class=special>()(</span><span class=keyword>const</span> <span class=identifier>reference_wrapper</span><span class=special><</span><span class=identifier>Type</span><span class=special>>&</span> <span class=identifier>x</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
230 <span class=special>};</span>
234 <code>identity<Type></code> is a model of:
236 <li>read/write <a href="#key_extractors"><code>Key Extractor</code></a>
237 from <code>Type</code>,</li>
238 <li><a href="#key_extractors"><code>Key Extractor</code></a>
239 from <code>reference_wrapper<const Type></code>,</li>
240 <li>read/write <a href="#key_extractors"><code>Key Extractor</code></a>
241 from <code>reference_wrapper<Type></code>,</li>
242 <li><a href="#key_extractors"><code>Key Extractor</code></a>
243 from any <a href="#chained_pointers">chained pointer</a> to
244 <code>const Type</code>,</li>
245 <li>read/write <a href="#key_extractors"><code>Key Extractor</code></a>
246 from any <a href="#chained_pointers">chained pointer</a>
247 to <code>Type</code>.</li>
251 <h4><code>identity</code> members</h4>
253 <code>template<typename ChainedPtr> Type& operator()(const ChainedPtr& x)const;</code>
256 <b>Requires:</b> <code>ChainedPtr</code> is a <a href="#chained_pointers">chained pointer</a>
257 type to <code>Type</code>.<br>
258 <b>Returns:</b> a reference to the object chained-pointed to by <code>x</code>.
261 <code>const Type& operator()(const Type& x)const;</code>
264 <b>Returns:</b> <code>x</code>.
267 <code>Type& operator()(Type& x)const;</code>
270 <b>Returns:</b> <code>x</code>.
273 <code>const Type& operator()(const reference_wrapper<const Type>& x)const;</code>
275 <b>Returns:</b> <code>x.get()</code>.
278 <code>Type& operator()(const reference_wrapper<typename remove_const<Type>::type>& x)const;</code>
280 <b>Returns:</b> <code>x.get()</code>.
283 <code>Type& operator()(const reference_wrapper<Type>& x)const;</code>
285 <b>Returns:</b> <code>x.get()</code>.
290 <a name="member_synopsis">Header
291 <a href="../../../../boost/multi_index/member.hpp">
292 <code>"boost/multi_index/member.hpp"</code></a> synopsis</a></h2>
295 <span class=keyword>namespace</span> <span class=identifier>boost</span><span class=special>{</span>
297 <span class=keyword>namespace</span> <span class=identifier>multi_index</span><span class=special>{</span>
299 <span class=keyword>template</span><span class=special><</span><span class=keyword>class</span> <span class=identifier>Class</span><span class=special>,</span><span class=keyword>typename</span> <span class=identifier>Type</span><span class=special>,</span><span class=identifier>Type</span> <span class=identifier>Class</span><span class=special>::*</span><span class=identifier>PtrToMember</span><span class=special>></span>
300 <span class=keyword>struct</span> <span class=identifier>member</span><span class=special>;</span>
302 <span class=keyword>template</span><span class=special><</span><span class=keyword>class</span> <span class=identifier>Class</span><span class=special>,</span><span class=keyword>typename</span> <span class=identifier>Type</span><span class=special>,</span><span class=identifier>std</span><span class=special>::</span><span class=identifier>size_t</span> <span class=identifier>OffsetOfMember</span><span class=special>></span>
303 <span class=keyword>struct</span> <span class=identifier>member_offset</span><span class=special>;</span> <span class=comment><b>// deprecated</b></span>
305 <span class=preprocessor>#define</span> <span class=identifier>BOOST_MULTI_INDEX_MEMBER</span><span class=special>(</span><span class=identifier>Class</span><span class=special>,</span><span class=identifier>Type</span><span class=special>,</span><span class=identifier>MemberName</span><span class=special>)</span> <b>implementation defined</b>
307 <span class=special>}</span> <span class=comment>// namespace boost::multi_index</span>
309 <span class=special>}</span> <span class=comment>// namespace boost</span>
312 <h3><a name="member">Class template <code>member</code></a></h3>
315 <code>member</code> is a <a href="#key_extractors"><code>Key Extractor</code></a>
316 aimed at accessing a given member of a class.
320 <span class=keyword>template</span><span class=special><</span><span class=keyword>class</span> <span class=identifier>Class</span><span class=special>,</span><span class=keyword>typename</span> <span class=identifier>Type</span><span class=special>,</span><span class=identifier>Type</span> <span class=identifier>Class</span><span class=special>::*</span><span class=identifier>PtrToMember</span><span class=special>></span>
321 <span class=keyword>struct</span> <span class=identifier>member</span>
322 <span class=special>{</span>
323 <span class=keyword>typedef</span> <span class=identifier>Type</span> <span class=identifier>result_type</span><span class=special>;</span>
325 <span class=comment>// only provided if const ChainedPtr& is not convertible to const Class&</span>
326 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>ChainedPtr</span><span class=special>></span> <span class=identifier>Type</span><span class=special>&</span> <span class=keyword>operator</span><span class=special>()(</span><span class=keyword>const</span> <span class=identifier>ChainedPtr</span><span class=special>&</span> <span class=identifier>x</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
328 <span class=keyword>const</span> <span class=identifier>Type</span><span class=special>&</span> <span class=keyword>operator</span><span class=special>()(</span><span class=keyword>const</span> <span class=identifier>Class</span><span class=special>&</span> <span class=identifier>x</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
329 <span class=identifier>Type</span><span class=special>&</span> <span class=keyword>operator</span><span class=special>()(</span><span class=identifier>Class</span><span class=special>&</span> <span class=identifier>x</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span> <span class=comment>// only provided if Type is non-const</span>
330 <span class=keyword>const</span> <span class=identifier>Type</span><span class=special>&</span> <span class=keyword>operator</span><span class=special>()(</span><span class=keyword>const</span> <span class=identifier>reference_wrapper</span><span class=special><</span><span class=keyword>const</span> <span class=identifier>Class</span><span class=special>>&</span> <span class=identifier>x</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
331 <span class=identifier>Type</span><span class=special>&</span> <span class=keyword>operator</span><span class=special>()(</span><span class=keyword>const</span> <span class=identifier>reference_wrapper</span><span class=special><</span><span class=identifier>Class</span><span class=special>>&</span> <span class=identifier>x</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
332 <span class=special>};</span>
336 The <code>PtrToMember</code> template argument specifies the particular
337 <code>Type Class::*</code> pointer to the member to be extracted.
338 <code>member<Class,Type,PtrToMember></code> is a model of:
340 <li>read/write <a href="#key_extractors"><code>Key Extractor</code></a>
341 from <code>Class</code>,</li>
342 <li><a href="#key_extractors"><code>Key Extractor</code></a>
343 from <code>reference_wrapper<const Class></code>,</li>
344 <li>read/write <a href="#key_extractors"><code>Key Extractor</code></a>
345 from <code>reference_wrapper<Class></code>,</li>
346 <li><a href="#key_extractors"><code>Key Extractor</code></a>
347 from any <a href="#chained_pointers">chained pointer</a>
348 to <code>const Class</code>,</li>
349 <li>read/write <a href="#key_extractors"><code>Key Extractor</code></a>
350 from any <a href="#chained_pointers">chained pointer</a>
351 to <code>Class</code>.</li>
355 <h4><code>member</code> members</h4>
357 <code>template<typename ChainedPtr> Type& operator()(const ChainedPtr& x)const;</code>
360 <b>Requires:</b> <code>ChainedPtr</code> is a <a href="#chained_pointers">chained pointer</a>
361 type to <code>Type</code>.<br>
362 <b>Returns:</b> a reference to the object chained-pointed to by <code>x</code>.
365 <code>const Type& operator()(const Class& x)const;</code>
368 <b>Returns:</b> <code>x.*PtrToMember</code>.
371 <code>Type& operator()(Class& x)const;</code>
374 <b>Returns:</b> <code>x.*PtrToMember</code>.
377 <code>const Type& operator()(const reference_wrapper<const Class>& x)const;</code>
380 <b>Returns:</b> <code>x.get().*PtrToMember</code>.
383 <code>Type& operator()(const reference_wrapper<Class>& x)const;</code>
386 <b>Returns:</b> <code>x.get().*PtrToMember</code>.
389 <h3><a name="member_offset">Class template <code>member_offset</code></a></h3>
392 <code>member_offset</code> was designed to overcome limitations of some legacy
393 compilers and its use is currently deprecated. Refer to a
394 <a href="http://www.boost.org/doc/libs/1_54_0/libs/multi_index/doc/reference/key_extraction.html#member_offset">former version</a>
395 of Boost.MultiIndex for further information.
398 <h3><a name="boost_multi_index_member">Macro <code>BOOST_MULTI_INDEX_MEMBER</code></a></h3>
401 <span class=identifier>BOOST_MULTI_INDEX_MEMBER</span><span class=special>(</span><span class=identifier>Class</span><span class=special>,</span><span class=identifier>Type</span><span class=special>,</span><span class=identifier>MemberName</span><span class=special>)</span>
405 This macro was designed as a portability mechanism for legacy compilers where <code>member</code>
406 could not be supported.
407 As such it is no longer needed in modern environments, though some users might still prefer it
408 to plain <code>member</code> because it provides a slightly more concise syntax.
412 <a name="mem_fun_synopsis">Header
413 <a href="../../../../boost/multi_index/mem_fun.hpp">
414 <code>"boost/multi_index/mem_fun.hpp"</code></a> synopsis</a></h2>
417 <span class=keyword>namespace</span> <span class=identifier>boost</span><span class=special>{</span>
419 <span class=keyword>namespace</span> <span class=identifier>multi_index</span><span class=special>{</span>
421 <span class=keyword>template</span><span class=special><</span><span class=keyword>class</span> <span class=identifier>Class</span><span class=special>,</span><span class=keyword>typename</span> <span class=identifier>Type</span><span class=special>,</span><span class=identifier>Type</span> <span class=special>(</span><span class=identifier>Class</span><span class=special>::*</span><span class=identifier>PtrToMemberFunction</span><span class=special>)()</span><span class=keyword>const</span><span class=special>></span>
422 <span class=keyword>struct</span> <span class=identifier>const_mem_fun</span><span class=special>;</span>
424 <span class=keyword>template</span><span class=special><</span><span class=keyword>class</span> <span class=identifier>Class</span><span class=special>,</span><span class=keyword>typename</span> <span class=identifier>Type</span><span class=special>,</span><span class=identifier>Type</span> <span class=special>(</span><span class=identifier>Class</span><span class=special>::*</span><span class=identifier>PtrToMemberFunction</span><span class=special>)()></span>
425 <span class=keyword>struct</span> <span class=identifier>mem_fun</span><span class=special>;</span>
427 <span class=keyword>template</span><span class=special><</span>
428 <span class=keyword>class</span> <span class=identifier>Class</span><span class=special>,</span><span class=keyword>typename</span> <span class=identifier>Type</span><span class=special>,</span>
429 <span class=keyword>typename</span> <span class=identifier>PtrToMemberFunctionType</span><span class=special>,</span><span class=identifier>PtrToMemberFunctionType</span> <span class=identifier>PtrToMemberFunction</span>
430 <span class=special>></span>
431 <span class=keyword>struct</span> <span class=identifier>const_mem_fun_explicit</span><span class=special>;</span> <span class=comment><b>// deprecated</b></span>
433 <span class=keyword>template</span><span class=special><</span>
434 <span class=keyword>class</span> <span class=identifier>Class</span><span class=special>,</span><span class=keyword>typename</span> <span class=identifier>Type</span><span class=special>,</span>
435 <span class=keyword>typename</span> <span class=identifier>PtrToMemberFunctionType</span><span class=special>,</span><span class=identifier>PtrToMemberFunctionType</span> <span class=identifier>PtrToMemberFunction</span>
436 <span class=special>></span>
437 <span class=keyword>struct</span> <span class=identifier>mem_fun_explicit</span><span class=special>;</span> <span class=comment><b>// deprecated</b></span>
439 <span class=preprocessor>#define</span> <span class=identifier>BOOST_MULTI_INDEX_CONST_MEM_FUN</span><span class=special>(</span><span class=identifier>Class</span><span class=special>,</span><span class=identifier>Type</span><span class=special>,</span><span class=identifier>MemberFunName</span><span class=special>)</span> <span class=special>\</span>
440 <b>implementation defined</b>
441 <span class=preprocessor>#define</span> <span class=identifier>BOOST_MULTI_INDEX_MEM_FUN</span><span class=special>(</span><span class=identifier>Class</span><span class=special>,</span><span class=identifier>Type</span><span class=special>,</span><span class=identifier>MemberFunName</span><span class=special>)</span> <span class=special>\</span>
442 <b>implementation defined</b>
444 <span class=special>}</span> <span class=comment>// namespace boost::multi_index</span>
446 <span class=special>}</span> <span class=comment>// namespace boost</span>
449 <h3><a name="const_mem_fun">Class template <code>const_mem_fun</code></a></h3>
452 <code>const_mem_fun</code> is a <a href="#key_extractors"><code>Key Extractor</code></a>
453 returning as key the result of invoking a given constant member function of a class.
457 <span class=keyword>template</span><span class=special><</span><span class=keyword>class</span> <span class=identifier>Class</span><span class=special>,</span><span class=keyword>typename</span> <span class=identifier>Type</span><span class=special>,</span><span class=identifier>Type</span> <span class=special>(</span><span class=identifier>Class</span><span class=special>::*</span><span class=identifier>PtrToMemberFunction</span><span class=special>)()</span><span class=keyword>const</span><span class=special>></span>
458 <span class=keyword>struct</span> <span class=identifier>const_mem_fun</span>
459 <span class=special>{</span>
460 <span class=keyword>typedef</span> <span class=keyword>typename</span> <span class=identifier>remove_reference</span><span class=special><</span><span class=identifier>Type</span><span class=special>>::</span><span class=identifier>type</span> <span class=identifier>result_type</span><span class=special>;</span>
462 <span class=comment>// only provided if const ChainedPtr& is not convertible to const Class&</span>
463 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>ChainedPtr</span><span class=special>></span> <span class=identifier>Type</span> <span class=keyword>operator</span><span class=special>()(</span><span class=keyword>const</span> <span class=identifier>ChainedPtr</span><span class=special>&</span> <span class=identifier>x</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
465 <span class=identifier>Type</span> <span class=keyword>operator</span><span class=special>()(</span><span class=keyword>const</span> <span class=identifier>Class</span><span class=special>&</span> <span class=identifier>x</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
466 <span class=identifier>Type</span> <span class=keyword>operator</span><span class=special>()(</span><span class=keyword>const</span> <span class=identifier>reference_wrapper</span><span class=special><</span><span class=keyword>const</span> <span class=identifier>Class</span><span class=special>>&</span> <span class=identifier>x</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
467 <span class=identifier>Type</span> <span class=keyword>operator</span><span class=special>()(</span><span class=keyword>const</span> <span class=identifier>reference_wrapper</span><span class=special><</span><span class=identifier>Class</span><span class=special>>&</span> <span class=identifier>x</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
468 <span class=special>};</span>
472 The <code>PtrToMemberFunction</code> template argument specifies the particular
473 <code>Type (Class::*PtrToMemberFunction)()const</code> pointer to the the constant
474 member function used in the extraction.
475 <code>const_mem_fun<Class,Type,PtrToMemberFunction></code> is a model of:
477 <li><a href="#key_extractors"><code>Key Extractor</code></a>
478 from <code>Class</code>,</li>
479 <li><a href="#key_extractors"><code>Key Extractor</code></a>
480 from <code>reference_wrapper<const Class></code>,</li>
481 <li><a href="#key_extractors"><code>Key Extractor</code></a>
482 from <code>reference_wrapper<Class></code>,</li>
483 <li><a href="#key_extractors"><code>Key Extractor</code></a>
484 from any <a href="#chained_pointers">chained pointer</a>
485 to <code>const Class</code>,</li>
486 <li><a href="#key_extractors"><code>Key Extractor</code></a>
487 from any <a href="#chained_pointers">chained pointer</a>
488 to <code>Class</code>.</li>
492 <h4><code>const_mem_fun</code> members</h4>
494 <code>template<typename ChainedPtr> Type operator()(const ChainedPtr& x)const;</code>
497 <b>Requires:</b> <code>ChainedPtr</code> is a <a href="#chained_pointers">chained pointer</a>
498 type to <code>Type</code>.<br>
499 <b>Returns:</b> <code>(y.*PtrToMemberFunction)()</code>, where <code>y</code> is the
500 object chained-pointed to by <code>x</code>.
503 <code>Type operator()(const Class& x)const;</code>
506 <b>Returns:</b> <code>(x.*PtrToMemberFunction)()</code>.
509 <code>Type operator()(const reference_wrapper<const Class>& x)const;</code>
512 <b>Returns:</b> <code>(x.get().*PtrToMemberFunction)()</code>.
515 <code>Type operator()(const reference_wrapper<Class>& x)const;</code>
518 <b>Returns:</b> <code>(x.get().*PtrToMemberFunction)()</code>.
521 <h3><a name="mem_fun">Class template <code>mem_fun</code></a></h3>
524 <code>mem_fun</code> is a <a href="#key_extractors"><code>Key Extractor</code></a>
525 returning as key the result of invoking a given member function of a class.
529 <span class=keyword>template</span><span class=special><</span><span class=keyword>class</span> <span class=identifier>Class</span><span class=special>,</span><span class=keyword>typename</span> <span class=identifier>Type</span><span class=special>,</span><span class=identifier>Type</span> <span class=special>(</span><span class=identifier>Class</span><span class=special>::*</span><span class=identifier>PtrToMemberFunction</span><span class=special>)()></span>
530 <span class=keyword>struct</span> <span class=identifier>mem_fun</span>
531 <span class=special>{</span>
532 <span class=keyword>typedef</span> <span class=keyword>typename</span> <span class=identifier>remove_reference</span><span class=special><</span><span class=identifier>Type</span><span class=special>>::</span><span class=identifier>type</span> <span class=identifier>result_type</span><span class=special>;</span>
534 <span class=comment>// only provided if ChainedPtr& is not convertible to Class&</span>
535 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>ChainedPtr</span><span class=special>></span> <span class=identifier>Type</span> <span class=keyword>operator</span><span class=special>()(</span><span class=keyword>const</span> <span class=identifier>ChainedPtr</span><span class=special>&</span> <span class=identifier>x</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
537 <span class=identifier>Type</span> <span class=keyword>operator</span><span class=special>()(</span><span class=identifier>Class</span><span class=special>&</span> <span class=identifier>x</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
538 <span class=identifier>Type</span> <span class=keyword>operator</span><span class=special>()(</span><span class=keyword>const</span> <span class=identifier>reference_wrapper</span><span class=special><</span><span class=identifier>Class</span><span class=special>>&</span> <span class=identifier>x</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
539 <span class=special>};</span>
543 The <code>PtrToMemberFunction</code> template argument specifies the particular
544 <code>Type (Class::*PtrToMemberFunction)()</code> pointer to the the member
545 function used in the extraction.
546 <code>mem_fun<Class,Type,PtrToMemberFunction></code> is a model of:
548 <li><a href="#key_extractors"><code>Key Extractor</code></a>
549 from <code>reference_wrapper<Class></code>,</li>
550 <li><a href="#key_extractors"><code>Key Extractor</code></a>
551 from any <a href="#chained_pointers">chained pointer</a>
552 to <code>Class</code>.</li>
556 <h4><code>mem_fun</code> members</h4>
558 <code>template<typename ChainedPtr> Type operator()(const ChainedPtr& x)const;</code>
561 <b>Requires:</b> <code>ChainedPtr</code> is a <a href="#chained_pointers">chained pointer</a>
562 type to <code>Type</code>.<br>
563 <b>Returns:</b> <code>(y.*PtrToMemberFunction)()</code>, where <code>y</code> is the
564 object chained-pointed to by <code>x</code>.
567 <code>Type operator()(Class& x)const;</code>
570 <b>Returns:</b> <code>(x.*PtrToMemberFunction)()</code>.
573 <code>Type operator()(const reference_wrapper<Class>& x)const;</code>
576 <b>Returns:</b> <code>(x.get().*PtrToMemberFunction)()</code>.
579 <h3><a name="const_mem_fun_explicit">Class templates <code>const_mem_fun_explicit</code> and <code>mem_fun_explicit</code></a></h3>
582 These extractors were provided as a workaround for MSVC++ 6.0 and are now deprecated.
584 <a href="http://www.boost.org/doc/libs/1_54_0/libs/multi_index/doc/reference/key_extraction.html#const_mem_fun_explicit">former version</a>
585 of Boost.MultiIndex for further information.
588 <h3><a name="boost_multi_index_const_mem_fun">Macros
589 <code>BOOST_MULTI_INDEX_CONST_MEM_FUN</code>
590 and <code>BOOST_MULTI_INDEX_MEM_FUN</code></a></h3>
593 <span class=identifier>BOOST_MULTI_INDEX_CONST_MEM_FUN</span><span class=special>(</span><span class=identifier>Class</span><span class=special>,</span><span class=identifier>Type</span><span class=special>,</span><span class=identifier>MemberFunName</span><span class=special>)</span>
594 <span class=identifier>BOOST_MULTI_INDEX_MEM_FUN</span><span class=special>(</span><span class=identifier>Class</span><span class=special>,</span><span class=identifier>Type</span><span class=special>,</span><span class=identifier>MemberFunName</span><span class=special>)</span>
598 Portability macros for usage of <code>const_mem_fun</code> and <code>mem_fun</code>.
599 Although no longer needed in modern compilers, some users might still decide to
600 resort to them as they provide a slightly more concise syntax.
604 <a name="global_fun_synopsis">Header
605 <a href="../../../../boost/multi_index/global_fun.hpp">
606 <code>"boost/multi_index/global_fun.hpp"</code></a> synopsis</a></h2>
609 <span class=keyword>namespace</span> <span class=identifier>boost</span><span class=special>{</span>
611 <span class=keyword>namespace</span> <span class=identifier>multi_index</span><span class=special>{</span>
613 <span class=keyword>template</span><span class=special><</span><span class=keyword>class</span> <span class=identifier>Value</span><span class=special>,</span><span class=keyword>typename</span> <span class=identifier>Type</span><span class=special>,</span><span class=identifier>Type</span> <span class=special>(*</span><span class=identifier>PtrToFunction</span><span class=special>)(</span><span class=identifier>Value</span><span class=special>)></span>
614 <span class=keyword>struct</span> <span class=identifier>global_fun</span><span class=special>;</span>
616 <span class=special>}</span> <span class=comment>// namespace boost::multi_index</span>
618 <span class=special>}</span> <span class=comment>// namespace boost</span>
621 <h3><a name="global_fun">Class template <code>global_fun</code></a></h3>
624 <code>global_fun</code> is a <a href="#key_extractors"><code>Key Extractor</code></a>
625 based on a given global or static member function accepting the base type as argument
626 and returning the associated key.
630 <span class=keyword>template</span><span class=special><</span><span class=keyword>class</span> <span class=identifier>Value</span><span class=special>,</span><span class=keyword>typename</span> <span class=identifier>Type</span><span class=special>,</span><span class=identifier>Type</span> <span class=special>(*</span><span class=identifier>PtrToFunction</span><span class=special>)(</span><span class=identifier>Value</span><span class=special>)></span>
631 <span class=keyword>struct</span> <span class=identifier>global_fun</span>
632 <span class=special>{</span>
633 <span class=keyword>typedef</span> <span class=keyword>typename</span> <span class=identifier>remove_reference</span><span class=special><</span><span class=identifier>Type</span><span class=special>>::</span><span class=identifier>type</span> <span class=identifier>result_type</span><span class=special>;</span>
635 <span class=comment>// Only provided under the following circumstances:
636 // - If Value is a reference to a constant type, only provided
637 // when const ChainedPtr& is not convertible to Value;
638 // - if Value is a reference to a non-const type, only provided
639 // when ChainedPtr& is not convertible to Value;
640 // - else, only provided when const ChainedPtr& is not
641 // convertible to const Value&.</span>
642 <span class=identifier>Type</span> <span class=keyword>operator</span><span class=special>()(</span><span class=keyword>const</span> <span class=identifier>ChainedPtr</span><span class=special>&</span> <span class=identifier>x</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
644 <span class=comment>// only provided if Value is a reference type</span>
645 <span class=identifier>Type</span> <span class=keyword>operator</span><span class=special>()(</span><span class=identifier>Value</span> <span class=identifier>x</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
647 <span class=comment>// only provided if Value is not a reference type</span>
648 <span class=identifier>Type</span> <span class=keyword>operator</span><span class=special>()(</span><span class=keyword>const</span> <span class=identifier>Value</span><span class=special>&</span> <span class=identifier>x</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
650 <span class=comment>// only provided if Value is not a reference type</span>
651 <span class=identifier>Type</span> <span class=keyword>operator</span><span class=special>()(</span><span class=keyword>const</span> <span class=identifier>reference_wrapper</span><span class=special><</span><span class=keyword>const</span> <span class=identifier>Value</span><span class=special>>&</span> <span class=identifier>x</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
653 <span class=comment>// only provided if Value is a reference type</span>
654 <span class=identifier>Type</span> <span class=keyword>operator</span><span class=special>()(</span>
655 <span class=keyword>const</span> <span class=identifier>reference_wrapper</span><span class=special><</span>
656 <span class=identifier>remove_reference</span><span class=special><</span><span class=identifier>Value</span><span class=special>>::</span><span class=identifier>type</span><span class=special>>&</span> <span class=identifier>x</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
658 <span class=comment>// only provided if Value is not a reference type or is
659 // a reference to a constant type</span>
660 <span class=identifier>Type</span> <span class=keyword>operator</span><span class=special>()(</span>
661 <span class=keyword>const</span> <span class=identifier>reference_wrapper</span><span class=special><</span>
662 <span class=keyword>typename</span> <span class=identifier>remove_const</span><span class=special><</span>
663 <span class=keyword>typename</span> <span class=identifier>remove_reference</span><span class=special><</span><span class=identifier>Value</span><span class=special>>::</span><span class=identifier>type</span><span class=special>>::</span><span class=identifier>type</span><span class=special>>&</span> <span class=identifier>x</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
664 <span class=special>};</span>
668 <code>PtrToFunction</code> specifies the particular function used to extract
669 the key of type <code>Type</code> from some <code>BaseType</code>.
670 <code>global_fun</code> supports the following function signatures:
672 <li><code>Type f(BaseType)</code> (<code>Value</code> is <code>BaseType</code>),</li>
673 <li><code>Type f(const BaseType&)</code> (<code>Value</code> is <code>const BaseType&</code>),</li>
674 <li><code>Type f(BaseType&)</code> (<code>Value</code> is <code>BaseType&</code>).</li>
676 <code>global_fun<Type,Value,PtrToFunction></code> is a model of:
678 <li><a href="#key_extractors"><code>Key Extractor</code></a>
679 from <code>reference_wrapper<BaseType></code>,</li>
680 <li><a href="#key_extractors"><code>Key Extractor</code></a>
681 from any <a href="#chained_pointers">chained pointer</a>
682 to <code>BaseType</code>.</li>
684 When <code>Value</code> is <code>BaseType</code> or
685 <code>const BaseType&</code>,
686 <code>global_fun<Type,Value,PtrToFunction></code> is also a model of:
688 <li><a href="#key_extractors"><code>Key Extractor</code></a>
689 from <code>BaseType</code>,</li>
690 <li><a href="#key_extractors"><code>Key Extractor</code></a>
691 from <code>reference_wrapper<const BaseType></code>,</li>
692 <li><a href="#key_extractors"><code>Key Extractor</code></a>
693 from any <a href="#chained_pointers">chained pointer</a>
694 to <code>const BaseType</code>.</li>
698 <h4><code>global_fun</code> members</h4>
700 <code>template<typename ChainedPtr> Type operator()(const ChainedPtr& x)const;</code>
703 <b>Requires:</b> <code>ChainedPtr</code> is a <a href="#chained_pointers">chained pointer</a>
704 type to <code>Value</code>.<br>
705 <b>Returns:</b> <code>PtrToFunction)(y)</code>, where <code>y</code> is the
706 object chained-pointed to by <code>x</code>.
709 <code>Type operator()(Value x)const;</code>
712 <b>Returns:</b> <code>PtrToFunction(x)</code>.
715 <code>Type operator()(const Value& x)const;</code>
718 <b>Returns:</b> <code>PtrToFunction(x)</code>.
721 <code>Type operator()(const reference_wrapper<const Value>& x)const;</code>
724 <b>Returns:</b> <code>PtrToFunction(x.get())</code>.
729 const reference_wrapper<remove_reference<Value>::type>& x)const;</code>
732 <b>Returns:</b> <code>PtrToFunction(x.get())</code>.
735 <code>Type operator()(<br>
736 const reference_wrapper<<br>
737 typename remove_const<<br>
738 typename remove_reference<Value>::type>::type>& x)const;</code>
741 <b>Returns:</b> <code>PtrToFunction(x.get())</code>.
745 <a name="composite_key_synopsis">Header
746 <a href="../../../../boost/multi_index/composite_key.hpp">
747 <code>"boost/multi_index/composite_key.hpp"</code></a> synopsis</a></h2>
750 <span class=keyword>namespace</span> <span class=identifier>boost</span><span class=special>{</span>
752 <span class=keyword>namespace</span> <span class=identifier>multi_index</span><span class=special>{</span>
754 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>Value</span><span class=special>,</span><span class=keyword>typename</span> <span class=identifier>KeyFromValue0</span><span class=special>,...,</span><span class=keyword>typename</span> <span class=identifier>KeyFromValuen</span><span class=special>></span>
755 <span class=keyword>struct</span> <span class=identifier>composite_key</span><span class=special>;</span>
757 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>CompositeKey</span><span class=special>></span>
758 <span class=keyword>struct</span> <span class=identifier>composite_key_result</span><span class=special>;</span>
760 <span class=comment>// comparison operators for composite_key_result:</span>
762 <span class=comment>// <b>OP</b> is any of ==,<,!=,>,>=,<=</span>
764 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>CompositeKey1</span><span class=special>,</span><span class=keyword>typename</span> <span class=identifier>CompositeKey2</span><span class=special>></span>
765 <span class=keyword>bool</span> <span class=keyword>operator</span> <b><i>OP</i></b><span class=special>(</span>
766 <span class=keyword>const</span> <span class=identifier>composite_key_result</span><span class=special><</span><span class=identifier>CompositeKey1</span><span class=special>>&</span> <span class=identifier>x</span><span class=special>,</span>
767 <span class=keyword>const</span> <span class=identifier>composite_key_result</span><span class=special><</span><span class=identifier>CompositeKey2</span><span class=special>>&</span> <span class=identifier>y</span><span class=special>);</span>
769 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>CompositeKey</span><span class=special>,</span><span class=keyword>typename</span><span class=special>...</span> <span class=identifier>Values</span><span class=special>></span>
770 <span class=keyword>bool</span> <span class=keyword>operator</span> <b><i>OP</i></b><span class=special>(</span>
771 <span class=keyword>const</span> <span class=identifier>composite_key_result</span><span class=special><</span><span class=identifier>CompositeKey</span><span class=special>>&</span> <span class=identifier>x</span><span class=special>,</span>
772 <span class=keyword>const</span> <span class=identifier>std</span><span class=special>::</span><span class=identifier>tuple</span><span class=special><</span><span class=identifier>Values</span><span class=special>...>&</span> <span class=identifier>y</span><span class=special>);</span>
774 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>CompositeKey</span><span class=special>,</span><span class=keyword>typename</span><span class=special>...</span> <span class=identifier>Values</span><span class=special>></span>
775 <span class=keyword>bool</span> <span class=keyword>operator</span> <b><i>OP</i></b><span class=special>(</span>
776 <span class=keyword>const</span> <span class=identifier>std</span><span class=special>::</span><span class=identifier>tuple</span><span class=special><</span><span class=identifier>Values</span><span class=special>...>&</span> <span class=identifier>x</span><span class=special>,</span>
777 <span class=keyword>const</span> <span class=identifier>composite_key_result</span><span class=special><</span><span class=identifier>CompositeKey</span><span class=special>>&</span> <span class=identifier>y</span><span class=special>);</span>
779 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>CompositeKey</span><span class=special>,</span><span class=keyword>typename</span> <span class=identifier>Value0</span><span class=special>,...,</span><span class=keyword>typename</span> <span class=identifier>Valuen</span><span class=special>></span>
780 <span class=keyword>bool</span> <span class=keyword>operator</span> <b><i>OP</i></b><span class=special>(</span>
781 <span class=keyword>const</span> <span class=identifier>composite_key_result</span><span class=special><</span><span class=identifier>CompositeKey</span><span class=special>>&</span> <span class=identifier>x</span><span class=special>,</span>
782 <span class=keyword>const</span> <span class=identifier>boost</span><span class=special>::</span><span class=identifier>tuple</span><span class=special><</span><span class=identifier>Value0</span><span class=special>,...,</span><span class=identifier>Valuen</span><span class=special>>&</span> <span class=identifier>y</span><span class=special>);</span>
784 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>Value0</span><span class=special>,...,</span><span class=keyword>typename</span> <span class=identifier>Valuen</span><span class=special>,</span><span class=keyword>typename</span> <span class=identifier>CompositeKey</span><span class=special>></span>
785 <span class=keyword>bool</span> <span class=keyword>operator</span> <b><i>OP</i></b><span class=special>(</span>
786 <span class=keyword>const</span> <span class=identifier>boost</span><span class=special>::</span><span class=identifier>tuple</span><span class=special><</span><span class=identifier>Value0</span><span class=special>,...,</span><span class=identifier>Valuen</span><span class=special>>&</span> <span class=identifier>x</span><span class=special>,</span>
787 <span class=keyword>const</span> <span class=identifier>composite_key_result</span><span class=special><</span><span class=identifier>CompositeKey</span><span class=special>>&</span> <span class=identifier>y</span><span class=special>);</span>
789 <span class=comment>// equality functors:</span>
791 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>Pred0</span><span class=special>,...,</span><span class=keyword>typename</span> <span class=identifier>Predn</span><span class=special>></span>
792 <span class=keyword>struct</span> <span class=identifier>composite_key_equal_to</span><span class=special>;</span>
794 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>CompositeKeyResult</span><span class=special>></span>
795 <span class=keyword>struct</span> <span class=identifier>composite_key_result_equal_to</span><span class=special>;</span> <span class=comment><b>// deprecated</b></span>
797 <span class=comment>// comparison functors:</span>
799 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>Compare0</span><span class=special>,...,</span><span class=keyword>typename</span> <span class=identifier>Comparen</span><span class=special>></span>
800 <span class=keyword>struct</span> <span class=identifier>composite_key_compare</span><span class=special>;</span>
802 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>CompositeKeyResult</span><span class=special>></span>
803 <span class=keyword>struct</span> <span class=identifier>composite_key_result_less</span><span class=special>;</span> <span class=comment><b>// deprecated</b></span>
805 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>CompositeKeyResult</span><span class=special>></span>
806 <span class=keyword>struct</span> <span class=identifier>composite_key_result_greater</span><span class=special>;</span> <span class=comment><b>// deprecated</b></span>
808 <span class=comment>// hash functors:</span>
810 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>Hash0</span><span class=special>,...,</span><span class=keyword>typename</span> <span class=identifier>Hashn</span><span class=special>></span>
811 <span class=keyword>struct</span> <span class=identifier>composite_key_hash</span><span class=special>;</span>
813 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>CompositeKeyResult</span><span class=special>></span>
814 <span class=keyword>struct</span> <span class=identifier>composite_key_result_hash</span><span class=special>;</span> <span class=comment><b>// deprecated</b></span>
816 <span class=special>}</span> <span class=comment>// namespace boost::multi_index</span>
818 <span class=special>}</span> <span class=comment>// namespace boost</span>
820 <span class=comment>// specializations of external functors for composite_key_result:</span>
822 <span class=keyword>namespace</span> <span class=identifier>std</span><span class=special>{</span>
824 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>CompositeKey</span><span class=special>></span>
825 <span class=keyword>struct</span> <span class=identifier>equal_to</span><span class=special><</span><span class=identifier>boost</span><span class=special>::</span><span class=identifier>multi_index</span><span class=special>::</span><span class=identifier>composite_key_result</span><span class=special><</span><span class=identifier>CompositeKey</span><span class=special>></span> <span class=special>>;</span>
827 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>CompositeKey</span><span class=special>></span>
828 <span class=keyword>struct</span> <span class=identifier>less</span><span class=special><</span><span class=identifier>boost</span><span class=special>::</span><span class=identifier>multi_index</span><span class=special>::</span><span class=identifier>composite_key_result</span><span class=special><</span><span class=identifier>CompositeKey</span><span class=special>></span> <span class=special>>;</span>
830 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>CompositeKey</span><span class=special>></span>
831 <span class=keyword>struct</span> <span class=identifier>greater</span><span class=special><</span><span class=identifier>boost</span><span class=special>::</span><span class=identifier>multi_index</span><span class=special>::</span><span class=identifier>composite_key_result</span><span class=special><</span><span class=identifier>CompositeKey</span><span class=special>></span> <span class=special>>;</span>
833 <span class=special>}</span> <span class=comment>// namespace std</span>
835 <span class=keyword>namespace</span> <span class=identifier>boost</span><span class=special>{</span>
837 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>CompositeKey</span><span class=special>></span>
838 <span class=keyword>struct</span> <span class=identifier>hash</span><span class=special><</span><span class=identifier>boost</span><span class=special>::</span><span class=identifier>multi_index</span><span class=special>::</span><span class=identifier>composite_key_result</span><span class=special><</span><span class=identifier>CompositeKey</span><span class=special>></span> <span class=special>>;</span>
840 <span class=special>}</span> <span class=comment>// namespace boost</span>
843 <h3><a name="composite_key">Class template <code>composite_key</code></a></h3>
846 <code>composite_key</code> is a <a href="#key_extractors"><code>Key Extractor</code></a>
847 returning the combined value of several key extractors whose type is specified
848 at compile time. The returned object is of type
849 <a href="#composite_key_result">
850 <code>composite_key_result</code></a><code><composite_key></code>.
854 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>Value</span><span class=special>,</span><span class=keyword>typename</span> <span class=identifier>KeyFromValue0</span><span class=special>,...,</span><span class=keyword>typename</span> <span class=identifier>KeyFromValuen</span><span class=special>></span>
855 <span class=keyword>struct</span> <span class=identifier>composite_key</span>
856 <span class=special>{</span>
857 <span class=keyword>typedef</span> <span class=identifier>boost</span><span class=special>::</span><span class=identifier>tuple</span><span class=special><</span><span class=identifier>KeyFromValue0</span><span class=special>,...,</span><span class=identifier>KeyFromValuen</span><span class=special>></span> <span class=identifier>key_extractor_tuple</span><span class=special>;</span>
858 <span class=keyword>typedef</span> <span class=identifier>Value</span> <span class=identifier>value_type</span><span class=special>;</span>
859 <span class=keyword>typedef</span> <span class=identifier>composite_key_result</span><span class=special><</span><span class=identifier>composite_key</span><span class=special>></span> <span class=identifier>result_type</span><span class=special>;</span>
861 <span class=identifier>composite_key</span><span class=special>(</span>
862 <span class=keyword>const</span> <span class=identifier>KeyFromValue0</span><span class=special>&</span> <span class=identifier>k0</span><span class=special>=</span><span class=identifier>KeyFromValue0</span><span class=special>(),</span>
863 <span class=special>...</span>
864 <span class=keyword>const</span> <span class=identifier>KeyFromValuen</span><span class=special>&</span> <span class=identifier>kn</span><span class=special>=</span><span class=identifier>KeyFromValuen</span><span class=special>());</span>
866 <span class=identifier>composite_key</span><span class=special>(</span><span class=keyword>const</span> <span class=identifier>key_extractor_tuple</span><span class=special>&</span> <span class=identifier>x</span><span class=special>);</span>
868 <span class=keyword>const</span> <span class=identifier>key_extractor_tuple</span><span class=special>&</span> <span class=identifier>key_extractors</span><span class=special>()</span><span class=keyword>const</span><span class=special>;</span>
869 <span class=identifier>key_extractor_tuple</span><span class=special>&</span> <span class=identifier>key_extractors</span><span class=special>()</span>
871 <span class=comment>// only provided if const ChainedPtr& is not convertible to const value_type&</span>
872 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>ChainedPtr</span><span class=special>></span>
873 <span class=identifier>result_type</span> <span class=keyword>operator</span><span class=special>()(</span><span class=keyword>const</span> <span class=identifier>ChainedPtr</span><span class=special>&</span> <span class=identifier>x</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
875 <span class=identifier>result_type</span> <span class=keyword>operator</span><span class=special>()(</span><span class=keyword>const</span> <span class=identifier>value_type</span><span class=special>&</span> <span class=identifier>x</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
876 <span class=identifier>result_type</span> <span class=keyword>operator</span><span class=special>()(</span><span class=keyword>const</span> <span class=identifier>reference_wrapper</span><span class=special><</span><span class=keyword>const</span> <span class=identifier>value_type</span><span class=special>>&</span> <span class=identifier>x</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
877 <span class=identifier>result_type</span> <span class=keyword>operator</span><span class=special>()(</span><span class=keyword>const</span> <span class=identifier>reference_wrapper</span><span class=special><</span><span class=identifier>value_type</span><span class=special>>&</span> <span class=identifier>x</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
878 <span class=special>};</span>
882 <code>KeyFromValue0</code>, ... , <code>KeyFromValuen</code> are the types of
883 the key extractors combined into the composite key. Each of these types
884 must be a <a href="#key_extractors"><code>Key Extractor</code></a> from
885 <code>Value</code>. At least a key extractor must be provided. The maximum
886 number of key extractors of a <code>composite_key</code> instantiation is
887 implementation defined. <code>composite_key</code> internally stores an
888 object of every constituent key extractor type.
889 <code>composite_key<Value,KeyFromValue0,...,KeyFromValuen></code> is a model
892 <li><a href="#key_extractors"><code>Key Extractor</code></a>
893 from <code>Value</code>,</li>
894 <li><a href="#key_extractors"><code>Key Extractor</code></a>
895 from <code>reference_wrapper<const Value></code>,</li>
896 <li><a href="#key_extractors"><code>Key Extractor</code></a>
897 from <code>reference_wrapper<Value></code>,</li>
898 <li><a href="#key_extractors"><code>Key Extractor</code></a>
899 from any <a href="#chained_pointers">chained pointer</a>
900 to <code>const Value</code>,</li>
901 <li><a href="#key_extractors"><code>Key Extractor</code></a>
902 from any <a href="#chained_pointers">chained pointer</a>
903 to <code>Value</code>.</li>
907 <h4><code>composite_key</code> members</h4>
909 <code>composite_key(<br>
910 const KeyFromValue0& k0=KeyFromValue0(),<br>
912 const KeyFromValuen& kn=KeyFromValuen());
916 <b>Effects:</b> Constructs a <code>composite_key</code> that stores
917 copies of the key extractor objects supplied.
920 <code>composite_key(const key_extractor_tuple& x);</code>
923 <b>Effects:</b> Constructs a <code>composite_key</code> that stores
924 copies of the key extractor objects supplied in <code>x</code>.
927 <code>const key_extractor_tuple& key_extractors()const;</code>
930 <b>Returns:</b> a constant reference to a tuple holding the
931 key extractors internally stored by the <code>composite_key</code>.
934 <code>key_extractor_tuple& key_extractors();</code>
937 <b>Returns:</b> a reference to a tuple holding the
938 key extractors internally stored by the <code>composite_key</code>.
941 <code>template<typename ChainedPtr><br>
942 result_type operator()(const ChainedPtr& x)const;</code>
945 <b>Requires:</b> <code>ChainedPtr</code> is a <a href="#chained_pointers">chained pointer</a>
946 type to <code>result_type</code>.<br>
947 <b>Returns:</b> a <code>result_type</code> object dependent on
948 <code>*this</code> and <code>y</code>, where <code>y</code> is the
949 object chained-pointed to by <code>x</code>.
952 <code>result_type operator()(const value_type& x)const;</code>
955 <b>Returns:</b> a <code>result_type</code> object dependent on
956 <code>*this</code> and <code>x</code>.
959 <code>result_type operator()(const reference_wrapper<const value_type>& x)const;</code>
962 <b>Returns:</b> a <code>result_type</code> object dependent on
963 <code>*this</code> and <code>x.get()</code>.
966 <code>result_type operator()(const reference_wrapper<value_type>& x)const;</code>
969 <b>Returns:</b> a <code>result_type</code> object dependent on
970 <code>*this</code> and <code>x.get()</code>.
973 <h3><a name="composite_key_result">Class template
974 <code>composite_key_result</code></a></h3>
977 This is an opaque type returned by <code>composite_key</code>
978 instantiations as their extracted key.
982 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>CompositeKey</span><span class=special>></span>
983 <span class=keyword>struct</span> <span class=identifier>composite_key_result</span>
984 <span class=special>{</span>
985 <b>no public interface available</b>
986 <span class=special>};</span>
988 <span class=comment>// comparison:</span>
990 <span class=comment>// <b>OP</b> is any of ==,<,!=,>,>=,<=</span>
992 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>CompositeKey1</span><span class=special>,</span><span class=keyword>typename</span> <span class=identifier>CompositeKey2</span><span class=special>></span>
993 <span class=keyword>bool</span> <span class=keyword>operator</span> <b><i>OP</i></b><span class=special>(</span>
994 <span class=keyword>const</span> <span class=identifier>composite_key_result</span><span class=special><</span><span class=identifier>CompositeKey1</span><span class=special>>&</span> <span class=identifier>x</span><span class=special>,</span>
995 <span class=keyword>const</span> <span class=identifier>composite_key_result</span><span class=special><</span><span class=identifier>CompositeKey2</span><span class=special>>&</span> <span class=identifier>y</span><span class=special>);</span>
997 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>CompositeKey</span><span class=special>,</span><span class=keyword>typename</span><span class=special>...</span> <span class=identifier>Values</span><span class=special>></span>
998 <span class=keyword>bool</span> <span class=keyword>operator</span> <b><i>OP</i></b><span class=special>(</span>
999 <span class=keyword>const</span> <span class=identifier>composite_key_result</span><span class=special><</span><span class=identifier>CompositeKey</span><span class=special>>&</span> <span class=identifier>x</span><span class=special>,</span>
1000 <span class=keyword>const</span> <span class=identifier>std</span><span class=special>::</span><span class=identifier>tuple</span><span class=special><</span><span class=identifier>Values</span><span class=special>...>&</span> <span class=identifier>y</span><span class=special>);</span>
1002 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>CompositeKey</span><span class=special>,</span><span class=keyword>typename</span><span class=special>...</span> <span class=identifier>Values</span><span class=special>></span>
1003 <span class=keyword>bool</span> <span class=keyword>operator</span> <b><i>OP</i></b><span class=special>(</span>
1004 <span class=keyword>const</span> <span class=identifier>std</span><span class=special>::</span><span class=identifier>tuple</span><span class=special><</span><span class=identifier>Values</span><span class=special>...>&</span> <span class=identifier>x</span><span class=special>,</span>
1005 <span class=keyword>const</span> <span class=identifier>composite_key_result</span><span class=special><</span><span class=identifier>CompositeKey</span><span class=special>>&</span> <span class=identifier>y</span><span class=special>);</span>
1007 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>CompositeKey</span><span class=special>,</span><span class=keyword>typename</span> <span class=identifier>Value0</span><span class=special>,...,</span><span class=keyword>typename</span> <span class=identifier>Valuen</span><span class=special>></span>
1008 <span class=keyword>bool</span> <span class=keyword>operator</span> <b><i>OP</i></b><span class=special>(</span>
1009 <span class=keyword>const</span> <span class=identifier>composite_key_result</span><span class=special><</span><span class=identifier>CompositeKey</span><span class=special>>&</span> <span class=identifier>x</span><span class=special>,</span>
1010 <span class=keyword>const</span> <span class=identifier>boost</span><span class=special>::</span><span class=identifier>tuple</span><span class=special><</span><span class=identifier>Value0</span><span class=special>,...,</span><span class=identifier>Valuen</span><span class=special>>&</span> <span class=identifier>y</span><span class=special>);</span>
1012 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>Value0</span><span class=special>,...,</span><span class=keyword>typename</span> <span class=identifier>Valuen</span><span class=special>,</span><span class=keyword>typename</span> <span class=identifier>CompositeKey</span><span class=special>></span>
1013 <span class=keyword>bool</span> <span class=keyword>operator</span> <b><i>OP</i></b><span class=special>(</span>
1014 <span class=keyword>const</span> <span class=identifier>boost</span><span class=special>::</span><span class=identifier>tuple</span><span class=special><</span><span class=identifier>Value0</span><span class=special>,...,</span><span class=identifier>Valuen</span><span class=special>>&</span> <span class=identifier>x</span><span class=special>,</span>
1015 <span class=keyword>const</span> <span class=identifier>composite_key_result</span><span class=special><</span><span class=identifier>CompositeKey</span><span class=special>>&</span> <span class=identifier>y</span><span class=special>);</span>
1018 <code>CompositeKey</code> is the <code>composite_key</code> instantiation to
1019 which the <code>composite_key_result</code> type is associated. Objects of type
1020 <code>composite_key_result</code> returned by a composite key must be always treated
1021 as <i>temporary</i>, i.e. they should not be stored or copied.
1022 <code>composite_key_result</code> is <i>not</i> guaranteed to be
1023 <code>DefaultConstructible</code> or <code>CopyAssignable</code>.
1024 Every object of type <code>composite_key_result<CompositeKey></code> is
1025 internally associated to the <code>CompositeKey</code> from which it is returned
1026 and the object of type <code>CompositeKey::value_type</code> to which the
1027 composite key was applied.
1030 <h4><a name="ckey_result_notation">Notation</a></h4>
1033 Given an <code>x</code> of type <code>composite_key_result<CompositeKey></code>,
1034 we use the following notation:
1036 <li><code>ck(x)</code> is the <code>CompositeKey</code> object associated to
1037 <code>x</code>,</li>
1038 <li><code>v(x)</code> is the object of type <code>CompositeKey::value_type</code>
1039 associated to <code>x</code>,</li>
1040 <li><code>k<sub>i</sub>(x) = ck(x).key_extractors().get<i>()</code>,
1041 that is, is the <code>i</code>-th key extractor of <code>ck(x)</code>,</li>
1042 <li><code>x<sub>i</sub> = k<sub>i</sub>(x)(v(x))</code>, that is, the
1043 key extracted from <code>v(x)</code> by the <code>i</code>-th key extractor,</li>
1044 <li><code>length(x)</code> is the number of key extractors of <code>ck(x)</code>.</li>
1046 Also, if <code>y</code> is an <code>std::tuple</code> or <code>boost::tuple</code> of values, we define:
1048 <li><code>y<sub>i</sub>=get<i>(y)</code>,</li>
1049 <li><code>length(y)</code> is the number of elements of <code>y</code>.</li>
1053 <h4>Comparison operators</h4>
1055 <code>template<typename CompositeKey1,typename CompositeKey2><br>
1056 bool operator==(<br>
1057 const composite_key_result<CompositeKey1>& x,<br>
1058 const composite_key_result<CompositeKey2>& y);<br>
1059 template<typename CompositeKey,typename... Values><br>
1060 bool operator==(<br>
1061 const composite_key_result<CompositeKey>& x,<br>
1062 const std::tuple<Values...>& y);<br>
1063 template<typename CompositeKey,typename... Values><br>
1064 bool operator==(<br>
1065 const std::tuple<Values...>& x,<br>
1066 const composite_key_result<CompositeKey>& y);<br>
1067 template<typename CompositeKey,typename Value0,...,typename Valuen><br>
1068 bool operator==(<br>
1069 const composite_key_result<CompositeKey>& x,<br>
1070 const boost::tuple<Value0,...,Valuen>& y);<br>
1071 template<typename Value0,...,typename Valuen,typename CompositeKey><br>
1072 bool operator==(<br>
1073 const boost::tuple<Value0,...,Valuen>& x,<br>
1074 const composite_key_result<CompositeKey>& y);
1078 <b>Requires:</b> <code>length(x)==length(y)</code>. The expression
1079 <code>x<sub>i</sub>==y<sub>i</sub></code> is valid for all <code>i</code>
1080 in <code>[0,length(x))</code>.<br>
1081 <b>Returns:</b> <code>true</code> if and only if
1083 <code>x<sub>i</sub>==y<sub>i</sub></code> for all <code>i</code>
1084 in <code>[0,length(x))</code>.
1086 <b>Complexity:</b> No more key extraction operations and comparisons
1087 are performed than those necessary for the evaluation of the expression above,
1088 starting at <code>i==0</code>. The evaluation is short-circuited as soon as
1089 the result is determined to be <code>false</code>.
1092 <code>template<typename CompositeKey1,typename CompositeKey2><br>
1094 const composite_key_result<CompositeKey1>& x,<br>
1095 const composite_key_result<CompositeKey2>& y);<br>
1096 template<typename CompositeKey,typename... Values><br>
1098 const composite_key_result<CompositeKey>& x,<br>
1099 const std::tuple<Values...>& y);<br>
1100 template<typename CompositeKey,typename... Values><br>
1102 const std::tuple<Values...>& x,<br>
1103 const composite_key_result<CompositeKey>& y);<br>
1104 template<typename CompositeKey,typename Value0,...,typename Valuen><br>
1106 const composite_key_result<CompositeKey>& x,<br>
1107 const boost::tuple<Value0,...,Valuen>& y);<br>
1108 template<typename Value0,...,typename Valuen,typename CompositeKey><br>
1110 const boost::tuple<Value0,...,Valuen>& x,<br>
1111 const composite_key_result<CompositeKey>& y);
1115 <b>Requires:</b> The expressions
1116 <code>x<sub>i</sub><y<sub>i</sub></code> and
1117 <code>y<sub>i</sub><x<sub>i</sub></code> are valid for all <code>i</code>
1118 in <code>[0,min(length(x),length(y)))</code>.<br>
1119 <b>Returns:</b> <code>true</code> if and only if there exists some
1120 <code>j</code> in the range <code>[0,min(length(x),length(y)))</code>
1123 <code>!(x<sub>i</sub><y<sub>i</sub>) && !(y<sub>i</sub><x<sub>i</sub>)</code>
1124 for all <code>i</code> in <code>[0,j)</code>,<br>
1125 <code> x<sub>j</sub><y<sub>j</sub></code>.
1127 <b>Complexity:</b> No more key extraction operations and comparisons
1128 are performed than those necessary for the evaluation of the expression above,
1129 starting at <code>i==0</code>. The evaluation is short-circuited as soon as
1130 the result is determined to be <code>false</code>.
1133 <code>template<typename CompositeKey1,typename CompositeKey2><br>
1134 bool operator <b><i>OP</i></b>(<br>
1135 const composite_key_result<CompositeKey1>& x,<br>
1136 const composite_key_result<CompositeKey2>& y);<br>
1137 template<typename CompositeKey,typename... Values><br>
1138 bool operator <b><i>OP</i></b>(<br>
1139 const composite_key_result<CompositeKey>& x,<br>
1140 const std::tuple<Values...>& y);<br>
1141 template<typename CompositeKey,typename... Values><br>
1142 bool operator <b><i>OP</i></b>(<br>
1143 const std::tuple<Values...>& x,<br>
1144 const composite_key_result<CompositeKey>& y);<br>
1145 template<typename CompositeKey,typename Value0,...,typename Valuen><br>
1146 bool operator <b><i>OP</i></b>(<br>
1147 const composite_key_result<CompositeKey>& x,<br>
1148 const boost::tuple<Value0,...,Valuen>& y);<br>
1149 template<typename Value0,...,typename Valuen,typename CompositeKey><br>
1150 bool operator <b><i>OP</i></b>(<br>
1151 const boost::tuple<Value0,...,Valuen>& x,<br>
1152 const composite_key_result<CompositeKey>& y);
1156 (<code><b><i>OP</i></b></code> is any of <code>!=</code>, <code>></code>,
1157 <code>>=</code>, <code><=</code>.)
1161 <b>Requires:</b> The expressions given below are valid (for the particular
1162 <code><b><i>OP</i></b></code> considered.)<br>
1163 <b>Returns:</b> <code>true</code> if and only if
1165 <code>!(x==y)</code> (<code><b><i>OP</i></b></code> is <code>!=</code>),<br>
1166 <code> y< x </code> (<code><b><i>OP</i></b></code> is <code>> </code>),<br>
1167 <code>!(x< y)</code> (<code><b><i>OP</i></b></code> is <code>>=</code>),<br>
1168 <code>!(y< x)</code> (<code><b><i>OP</i></b></code> is <code><=</code>).
1172 <h3><a name="ckey_result_equality">Equality</a></h3>
1174 <h4><a name="composite_key_equal_to">Class template
1175 <code>composite_key_equal_to</code></a></h4>
1178 <code>composite_key_equal_to</code> tests for equality between
1179 <code>composite_key_result</code> instantiations and between
1180 these and tuples of values, using an internally stored
1181 collection of elementary equality predicates.
1185 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>Pred0</span><span class=special>,...,</span><span class=keyword>typename</span> <span class=identifier>Predn</span><span class=special>></span>
1186 <span class=keyword>struct</span> <span class=identifier>composite_key_equal_to</span>
1187 <span class=special>{</span>
1188 <span class=keyword>typedef</span> <span class=identifier>boost</span><span class=special>::</span><span class=identifier>tuple</span><span class=special><</span><span class=identifier>Pred0</span><span class=special>,...,</span><span class=identifier>Predn</span><span class=special>></span> <span class=identifier>key_eq_tuple</span><span class=special>;</span>
1190 <span class=identifier>composite_key_equal_to</span><span class=special>(</span>
1191 <span class=keyword>const</span> <span class=identifier>Pred0</span><span class=special>&</span> <span class=identifier>p0</span><span class=special>=</span><span class=identifier>Pred0</span><span class=special>(),</span>
1192 <span class=special>...</span>
1193 <span class=keyword>const</span> <span class=identifier>Predn</span><span class=special>&</span> <span class=identifier>pn</span><span class=special>=</span><span class=identifier>Predn</span><span class=special>());</span>
1195 <span class=identifier>composite_key_equal_to</span><span class=special>(</span><span class=keyword>const</span> <span class=identifier>key_eq_tuple</span><span class=special>&</span> <span class=identifier>x</span><span class=special>);</span>
1197 <span class=keyword>const</span> <span class=identifier>key_eq_tuple</span><span class=special>&</span> <span class=identifier>key_eqs</span><span class=special>()</span><span class=keyword>const</span><span class=special>;</span>
1198 <span class=identifier>key_eq_tuple</span><span class=special>&</span> <span class=identifier>key_eqs</span><span class=special>()</span><span class=special>;</span>
1200 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>CompositeKey1</span><span class=special>,</span><span class=keyword>typename</span> <span class=identifier>CompositeKey2</span><span class=special>></span>
1201 <span class=keyword>bool</span> <span class=keyword>operator</span><span class=special>()(</span>
1202 <span class=keyword>const</span> <span class=identifier>composite_key_result</span><span class=special><</span><span class=identifier>CompositeKey1</span><span class=special>></span> <span class=special>&</span> <span class=identifier>x</span><span class=special>,</span>
1203 <span class=keyword>const</span> <span class=identifier>composite_key_result</span><span class=special><</span><span class=identifier>CompositeKey2</span><span class=special>></span> <span class=special>&</span> <span class=identifier>y</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
1205 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>CompositeKey</span><span class=special>,</span><span class=keyword>typename</span><span class=special>...</span> <span class=identifier>Values</span><span class=special>></span>
1206 <span class=keyword>bool</span> <span class=keyword>operator</span><span class=special>()(</span>
1207 <span class=keyword>const</span> <span class=identifier>composite_key_result</span><span class=special><</span><span class=identifier>CompositeKey</span><span class=special>>&</span> <span class=identifier>x</span><span class=special>,</span>
1208 <span class=keyword>const</span> <span class=identifier>std</span><span class=special>::</span><span class=identifier>tuple</span><span class=special><</span><span class=identifier>Values</span><span class=special>...>&</span> <span class=identifier>y</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
1210 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>CompositeKey</span><span class=special>,</span><span class=keyword>typename</span><span class=special>...</span> <span class=identifier>Values</span><span class=special>></span>
1211 <span class=keyword>bool</span> <span class=keyword>operator</span><span class=special>()(</span>
1212 <span class=keyword>const</span> <span class=identifier>std</span><span class=special>::</span><span class=identifier>tuple</span><span class=special><</span><span class=identifier>Values</span><span class=special>...>&</span> <span class=identifier>x</span><span class=special>,</span>
1213 <span class=keyword>const</span> <span class=identifier>composite_key_result</span><span class=special><</span><span class=identifier>CompositeKey</span><span class=special>>&</span> <span class=identifier>y</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
1215 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>CompositeKey</span><span class=special>,</span><span class=keyword>typename</span> <span class=identifier>Value0</span><span class=special>,...,</span><span class=keyword>typename</span> <span class=identifier>Valuen</span><span class=special>></span>
1216 <span class=keyword>bool</span> <span class=keyword>operator</span><span class=special>()(</span>
1217 <span class=keyword>const</span> <span class=identifier>composite_key_result</span><span class=special><</span><span class=identifier>CompositeKey</span><span class=special>>&</span> <span class=identifier>x</span><span class=special>,</span>
1218 <span class=keyword>const</span> <span class=identifier>boost</span><span class=special>::</span><span class=identifier>tuple</span><span class=special><</span><span class=identifier>Value0</span><span class=special>,...,</span><span class=identifier>Valuen</span><span class=special>>&</span> <span class=identifier>y</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
1220 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>Value0</span><span class=special>,...,</span><span class=keyword>typename</span> <span class=identifier>Valuen</span><span class=special>,</span><span class=keyword>typename</span> <span class=identifier>CompositeKey</span><span class=special>></span>
1221 <span class=keyword>bool</span> <span class=keyword>operator</span><span class=special>()(</span>
1222 <span class=keyword>const</span> <span class=identifier>boost</span><span class=special>::</span><span class=identifier>tuple</span><span class=special><</span><span class=identifier>Value0</span><span class=special>,...,</span><span class=identifier>Valuen</span><span class=special>>&</span> <span class=identifier>x</span><span class=special>,</span>
1223 <span class=keyword>const</span> <span class=identifier>composite_key_result</span><span class=special><</span><span class=identifier>CompositeKey</span><span class=special>>&</span> <span class=identifier>y</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
1224 <span class=special>};</span>
1228 <code>Pred0</code>, ... , <code>Predn</code> are the types of the equality
1229 binary predicates stored by <code>composite_key_equal_to</code>. Each of these predicates
1230 must be <code>CopyConstructible</code> and <code>CopyAssignable</code>. At least an
1231 equality predicate must be provided. The maximum number of equality predicates of
1232 a <code>composite_key_equal_to</code> instantiation is implementation defined.
1233 <code>composite_key_equal_to</code> is
1234 <code>CopyConstructible</code> and <code>CopyAssignable</code>.
1235 It is also <code>DefaultConstructible</code>
1236 if each <code>Predi</code> is <code>DefaultConstructible</code> in its turn.
1240 Note that formally it is not required that the <code>Predi</code> types
1241 behave as equality predicates in any definite way. However, the
1242 semantics of <code>composite_key_equal_to</code> is well defined if this
1243 is the case, as explained in the section on the
1244 <a href="#ckey_result_semantics">semantics of <code>composite_key_result</code></a>.
1250 In what follows we use the same <a href="#ckey_result_notation">notation</a>
1251 introduced for <code>composite_key_result</code>.
1253 <h4><code>composite_key_equal_to</code> members</h4>
1255 <code>composite_key_equal_to(<br>
1256 const Pred0& p0=Pred0(),<br>
1258 const Predn& pn=Predn());
1262 <b>Effects:</b> Constructs a <code>composite_key_equal_to</code> that stores
1263 copies of the equality predicates supplied.
1266 <code>composite_key_equal_to(const key_eq_tuple& x);</code>
1269 <b>Effects:</b> Constructs a <code>composite_key_equal_to</code> that stores
1270 copies of the equality predicate objects supplied in <code>x</code>.
1273 <code>const key_eq_tuple& key_eqs()const;</code>
1276 <b>Returns:</b> a constant reference to a tuple holding the
1277 equality predicate objects internally stored by the
1278 <code>composite_key_equal_to</code>.
1281 <code>key_eq_tuple& key_eqs();</code>
1284 <b>Returns:</b> a reference to a tuple holding the
1285 equality predicate objects internally stored by the
1286 <code>composite_key_equal_to</code>.
1290 template<typename CompositeKey1,typename CompositeKey2><br>
1291 bool operator()(<br>
1292 const composite_key_result<CompositeKey1> & x,<br>
1293 const composite_key_result<CompositeKey2> & y)const;<br>
1294 template<typename CompositeKey,typename Values...><br>
1295 bool operator()(<br>
1296 const composite_key_result<CompositeKey>& x,<br>
1297 const std::tuple<Values...>& y)const;<br>
1298 template<typename CompositeKey,typename Values...><br>
1299 bool operator()(<br>
1300 const std::tuple<Values...>& x,<br>
1301 const composite_key_result<CompositeKey>& y)const;<br>
1302 template<typename CompositeKey,typename Value0,...,typename Valuen><br>
1303 bool operator()(<br>
1304 const composite_key_result<CompositeKey>& x,<br>
1305 const boost::tuple<Value0,...,Valuen>& y)const;<br>
1306 template<typename Value0,...,typename Valuen,typename CompositeKey><br>
1307 bool operator()(<br>
1308 const boost::tuple<Value0,...,Valuen>& x,<br>
1309 const composite_key_result<CompositeKey>& y)const;<br>
1313 <b>Requires:</b> <code>length(x)==length(y)</code>. The expressions
1314 <code>key_eqs().get<i>()(x<sub>i</sub>,y<sub>i</sub>)</code> and
1315 <code>key_eqs().get<i>()(y<sub>i</sub>,x<sub>i</sub>)</code>
1316 are valid for all <code>i</code> in <code>[0,length(x))</code>.<br>
1317 <b>Returns:</b> <code>true</code> if and only
1319 <code>key_eqs().get<i>()(x<sub>i</sub>,y<sub>i</sub>)</code>
1320 for all <code>i</code> in <code>[0,length(x))</code>.<br>
1322 <b>Complexity:</b> No more key extraction operations and comparisons
1323 are performed than those necessary for the evaluation of the expression above,
1324 starting at <code>i==0</code>. The evaluation is short-circuited as soon as
1325 the result is determined to be <code>false</code>.
1328 <h4><a name="composite_key_result_equal_to">Class template
1329 <code>composite_key_result_equal_to</code></a></h4>
1332 Deprecated. Use <code>std::equal_to<CompositeKeyResult></code> instead.
1335 <h4><a name="equal_to_composite_key_result">Specialization of
1336 <code>std::equal_to</code> for <code>composite_key</code> results</a></h4>
1339 <code>std::equal_to<CompositeKeyResult></code>, with <code>CompositeKeyResult</code>
1340 an instantiation of <code>composite_key_result</code>,
1341 behaves as a particularization of
1342 <code>composite_key_equal_to</code> where all the comparison predicates supplied
1343 are instantiations of <code>std::equal_to</code>.
1347 <span class=keyword>namespace</span> <span class=identifier>std</span><span class=special>{</span>
1349 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>CompositeKey</span><span class=special>></span>
1350 <span class=keyword>struct</span> <span class=identifier>equal_to</span><span class=special><</span><span class=identifier>boost</span><span class=special>::</span><span class=identifier>multi_index</span><span class=special>::</span><span class=identifier>composite_key_result</span><span class=special><</span><span class=identifier>CompositeKey</span><span class=special>></span> <span class=special>></span>
1351 <span class=special>{</span>
1352 <span class=keyword>typedef</span>
1353 <span class=identifier>boost</span><span class=special>::</span><span class=identifier>multi_index</span><span class=special>::</span><span class=identifier>composite_key_result</span><span class=special><</span>
1354 <span class=identifier>CompositeKey</span><span class=special>></span> <span class=identifier>first_argument_type</span><span class=special>;</span>
1355 <span class=keyword>typedef</span> <span class=identifier>first_argument_type</span> <span class=identifier>second_argument_type</span><span class=special>;</span>
1356 <span class=keyword>typedef</span> <span class=keyword>bool</span> <span class=identifier>result_type</span><span class=special>;</span>
1358 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>CompositeKey1</span><span class=special>,</span><span class=keyword>typename</span> <span class=identifier>CompositeKey2</span><span class=special>></span>
1359 <span class=keyword>bool</span> <span class=keyword>operator</span><span class=special>()(</span>
1360 <span class=keyword>const</span> <span class=identifier>boost</span><span class=special>::</span><span class=identifier>multi_index</span><span class=special>::</span><span class=identifier>composite_key_result</span><span class=special><</span><span class=identifier>CompositeKey1</span><span class=special>></span> <span class=special>&</span> <span class=identifier>x</span><span class=special>,</span>
1361 <span class=keyword>const</span> <span class=identifier>boost</span><span class=special>::</span><span class=identifier>multi_index</span><span class=special>::</span><span class=identifier>composite_key_result</span><span class=special><</span><span class=identifier>CompositeKey2</span><span class=special>></span> <span class=special>&</span> <span class=identifier>y</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
1363 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>CompositeKey</span><span class=special>,</span><span class=keyword>typename</span><span class=special>...</span> <span class=identifier>Values</span><span class=special>></span>
1364 <span class=keyword>bool</span> <span class=keyword>operator</span><span class=special>()(</span>
1365 <span class=keyword>const</span> <span class=identifier>boost</span><span class=special>::</span><span class=identifier>multi_index</span><span class=special>::</span><span class=identifier>composite_key_result</span><span class=special><</span><span class=identifier>CompositeKey</span><span class=special>>&</span> <span class=identifier>x</span><span class=special>,</span>
1366 <span class=keyword>const</span> <span class=identifier>std</span><span class=special>::</span><span class=identifier>tuple</span><span class=special><</span><span class=identifier>Values</span><span class=special>...>&</span> <span class=identifier>y</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
1368 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>CompositeKey</span><span class=special>,</span><span class=keyword>typename</span><span class=special>...</span> <span class=identifier>Values</span><span class=special>></span>
1369 <span class=keyword>bool</span> <span class=keyword>operator</span><span class=special>()(</span>
1370 <span class=keyword>const</span> <span class=identifier>std</span><span class=special>::</span><span class=identifier>tuple</span><span class=special><</span><span class=identifier>Values</span><span class=special>...>&</span> <span class=identifier>x</span><span class=special>,</span>
1371 <span class=keyword>const</span> <span class=identifier>boost</span><span class=special>::</span><span class=identifier>multi_index</span><span class=special>::</span><span class=identifier>composite_key_result</span><span class=special><</span><span class=identifier>CompositeKey</span><span class=special>>&</span> <span class=identifier>y</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
1373 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>CompositeKey</span><span class=special>,</span><span class=keyword>typename</span> <span class=identifier>Value0</span><span class=special>,...,</span><span class=keyword>typename</span> <span class=identifier>Valuen</span><span class=special>></span>
1374 <span class=keyword>bool</span> <span class=keyword>operator</span><span class=special>()(</span>
1375 <span class=keyword>const</span> <span class=identifier>boost</span><span class=special>::</span><span class=identifier>multi_index</span><span class=special>::</span><span class=identifier>composite_key_result</span><span class=special><</span><span class=identifier>CompositeKey</span><span class=special>>&</span> <span class=identifier>x</span><span class=special>,</span>
1376 <span class=keyword>const</span> <span class=identifier>boost</span><span class=special>::</span><span class=identifier>tuple</span><span class=special><</span><span class=identifier>Value0</span><span class=special>,...,</span><span class=identifier>Valuen</span><span class=special>>&</span> <span class=identifier>y</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
1378 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>Value0</span><span class=special>,...,</span><span class=keyword>typename</span> <span class=identifier>Valuen</span><span class=special>,</span><span class=keyword>typename</span> <span class=identifier>CompositeKey</span><span class=special>></span>
1379 <span class=keyword>bool</span> <span class=keyword>operator</span><span class=special>()(</span>
1380 <span class=keyword>const</span> <span class=identifier>boost</span><span class=special>::</span><span class=identifier>tuple</span><span class=special><</span><span class=identifier>Value0</span><span class=special>,...,</span><span class=identifier>Valuen</span><span class=special>>&</span> <span class=identifier>x</span><span class=special>,</span>
1381 <span class=keyword>const</span> <span class=identifier>boost</span><span class=special>::</span><span class=identifier>multi_index</span><span class=special>::</span><span class=identifier>composite_key_result</span><span class=special><</span><span class=identifier>CompositeKey</span><span class=special>>&</span> <span class=identifier>y</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
1382 <span class=special>};</span>
1384 <span class=special>}</span> <span class=comment>// namespace std</span>
1388 <code>CompositeKeyResult</code> must be an instantiation of
1389 <code>composite_key_result</code> for some type
1390 <code>composite_key<KeyFromValue0,...,KeyFromValuen></code>.
1391 <code>std::equal:to<CompositeKeyResult>::operator()</code> is
1393 <code>composite_key_equal_to<Pred0,...,Predn>::operator()</code>, taking
1395 <code>Predi = std::equal_to<KeyFromValuei::result_type></code> for all
1396 <code>i = 0,...,n</code>.
1401 In addition to the requirements on <code>Predi</code> imposed by
1402 <code>composite_key_equal_to</code>, each of these types must be
1403 <code>DefaultConstructible</code>. <code>std::equal_to<CompositeKeyResult></code>
1404 is <code>DefaultConstructible</code>, <code>CopyConstructible</code> and
1405 <code>CopyAssignable</code>.
1408 <h3><a name="ckey_result_comparison">Comparison</a></h3>
1410 <h4><a name="composite_key_compare">Class template
1411 <code>composite_key_compare</code></a></h4>
1414 <code>composite_key_compare</code> compares <code>composite_key_result</code>
1415 instantiations between them and with tuples of values using an internally stored
1416 collection of elementary comparison predicates.
1420 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>Compare0</span><span class=special>,...,</span><span class=keyword>typename</span> <span class=identifier>Comparen</span><span class=special>></span>
1421 <span class=keyword>struct</span> <span class=identifier>composite_key_compare</span>
1422 <span class=special>{</span>
1423 <span class=keyword>typedef</span> <span class=identifier>boost</span><span class=special>::</span><span class=identifier>tuple</span><span class=special><</span><span class=identifier>Compare0</span><span class=special>,...,</span><span class=identifier>Comparen</span><span class=special>></span> <span class=identifier>key_comp_tuple</span><span class=special>;</span>
1425 <span class=identifier>composite_key_compare</span><span class=special>(</span>
1426 <span class=keyword>const</span> <span class=identifier>Compare0</span><span class=special>&</span> <span class=identifier>c0</span><span class=special>=</span><span class=identifier>Compare0</span><span class=special>(),</span>
1427 <span class=special>...</span>
1428 <span class=keyword>const</span> <span class=identifier>Comparen</span><span class=special>&</span> <span class=identifier>cn</span><span class=special>=</span><span class=identifier>Comparen</span><span class=special>());</span>
1430 <span class=identifier>composite_key_compare</span><span class=special>(</span><span class=keyword>const</span> <span class=identifier>key_comp_tuple</span><span class=special>&</span> <span class=identifier>x</span><span class=special>);</span>
1432 <span class=keyword>const</span> <span class=identifier>key_comp_tuple</span><span class=special>&</span> <span class=identifier>key_comps</span><span class=special>()</span><span class=keyword>const</span><span class=special>;</span>
1433 <span class=identifier>key_comp_tuple</span><span class=special>&</span> <span class=identifier>key_comps</span><span class=special>()</span><span class=special>;</span>
1435 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>CompositeKey1</span><span class=special>,</span><span class=keyword>typename</span> <span class=identifier>CompositeKey2</span><span class=special>></span>
1436 <span class=keyword>bool</span> <span class=keyword>operator</span><span class=special>()(</span>
1437 <span class=keyword>const</span> <span class=identifier>composite_key_result</span><span class=special><</span><span class=identifier>CompositeKey1</span><span class=special>></span> <span class=special>&</span> <span class=identifier>x</span><span class=special>,</span>
1438 <span class=keyword>const</span> <span class=identifier>composite_key_result</span><span class=special><</span><span class=identifier>CompositeKey2</span><span class=special>></span> <span class=special>&</span> <span class=identifier>y</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
1440 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>CompositeKey</span><span class=special>,</span><span class=keyword>typename</span><span class=special>...</span> <span class=identifier>Values</span><span class=special>></span>
1441 <span class=keyword>bool</span> <span class=keyword>operator</span><span class=special>()(</span>
1442 <span class=keyword>const</span> <span class=identifier>composite_key_result</span><span class=special><</span><span class=identifier>CompositeKey</span><span class=special>>&</span> <span class=identifier>x</span><span class=special>,</span>
1443 <span class=keyword>const</span> <span class=identifier>std</span><span class=special>::</span><span class=identifier>tuple</span><span class=special><</span><span class=identifier>Values</span><span class=special>...>&</span> <span class=identifier>y</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
1445 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>CompositeKey</span><span class=special>,</span><span class=keyword>typename</span><span class=special>...</span> <span class=identifier>Values</span><span class=special>></span>
1446 <span class=keyword>bool</span> <span class=keyword>operator</span><span class=special>()(</span>
1447 <span class=keyword>const</span> <span class=identifier>std</span><span class=special>::</span><span class=identifier>tuple</span><span class=special><</span><span class=identifier>Values</span><span class=special>...>&</span> <span class=identifier>x</span><span class=special>,</span>
1448 <span class=keyword>const</span> <span class=identifier>composite_key_result</span><span class=special><</span><span class=identifier>CompositeKey</span><span class=special>>&</span> <span class=identifier>y</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
1450 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>CompositeKey</span><span class=special>,</span><span class=keyword>typename</span> <span class=identifier>Value0</span><span class=special>,...,</span><span class=keyword>typename</span> <span class=identifier>Valuen</span><span class=special>></span>
1451 <span class=keyword>bool</span> <span class=keyword>operator</span><span class=special>()(</span>
1452 <span class=keyword>const</span> <span class=identifier>composite_key_result</span><span class=special><</span><span class=identifier>CompositeKey</span><span class=special>>&</span> <span class=identifier>x</span><span class=special>,</span>
1453 <span class=keyword>const</span> <span class=identifier>boost</span><span class=special>::</span><span class=identifier>tuple</span><span class=special><</span><span class=identifier>Value0</span><span class=special>,...,</span><span class=identifier>Valuen</span><span class=special>>&</span> <span class=identifier>y</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
1455 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>Value0</span><span class=special>,...,</span><span class=keyword>typename</span> <span class=identifier>Valuen</span><span class=special>,</span><span class=keyword>typename</span> <span class=identifier>CompositeKey</span><span class=special>></span>
1456 <span class=keyword>bool</span> <span class=keyword>operator</span><span class=special>()(</span>
1457 <span class=keyword>const</span> <span class=identifier>boost</span><span class=special>::</span><span class=identifier>tuple</span><span class=special><</span><span class=identifier>Value0</span><span class=special>,...,</span><span class=identifier>Valuen</span><span class=special>>&</span> <span class=identifier>x</span><span class=special>,</span>
1458 <span class=keyword>const</span> <span class=identifier>composite_key_result</span><span class=special><</span><span class=identifier>CompositeKey</span><span class=special>>&</span> <span class=identifier>y</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
1460 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>CompositeKey</span><span class=special>,</span><span class=keyword>typename</span> <span class=identifier>Value</span><span class=special>></span>
1461 <span class=keyword>bool</span> <span class=keyword>operator</span><span class=special>()(</span>
1462 <span class=keyword>const</span> <span class=identifier>composite_key_result</span><span class=special><</span><span class=identifier>CompositeKey</span><span class=special>>&</span> <span class=identifier>x</span><span class=special>,</span><span class=keyword>const</span> <span class=identifier>Value</span><span class=special>&</span> <span class=identifier>y</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
1464 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>Value</span><span class=special>,</span><span class=keyword>typename</span> <span class=identifier>CompositeKey</span><span class=special>></span>
1465 <span class=keyword>bool</span> <span class=keyword>operator</span><span class=special>()(</span>
1466 <span class=keyword>const</span> <span class=identifier>Value</span><span class=special>&</span> <span class=identifier>x</span><span class=special>,</span><span class=keyword>const</span> <span class=identifier>composite_key_result</span><span class=special><</span><span class=identifier>CompositeKey</span><span class=special>>&</span> <span class=identifier>y</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
1467 <span class=special>};</span>
1471 <code>Compare0</code>, ... , <code>Comparen</code> are the types of the comparison
1472 binary predicates stored by <code>composite_key_compare</code>. Each of these predicates must be
1473 <code>CopyConstructible</code> and <code>CopyAssignable</code>. At least a
1474 comparison predicate must be provided. The maximum number of comparison predicates of
1475 a <code>composite_key_compare</code> instantiation is implementation defined.
1476 <code>composite_key_compare</code> is
1477 <code>CopyConstructible</code> and <code>CopyAssignable</code>.
1479 <code>DefaultConstructible</code>
1480 if each <code>Comparei</code> is <code>DefaultConstructible</code> in its turn.
1484 Note that formally it is not required that the <code>Comparei</code> types
1485 behave as comparison predicates in any definite way. However, the
1486 semantics of <code>composite_key_compare</code> is well defined if this
1487 is the case, as explained in the section on the
1488 <a href="#ckey_result_semantics">semantics of <code>composite_key_result</code></a>.
1494 In what follows we use the same <a href="#ckey_result_notation">notation</a>
1495 introduced for <code>composite_key_result</code>.
1497 <h4><code>composite_key_compare</code> members</h4>
1499 <code>composite_key_compare(<br>
1500 const Compare0& c0=Compare0(),<br>
1502 const Comparen& cn=Comparen());
1506 <b>Effects:</b> Constructs a <code>composite_key_compare</code> that stores
1507 copies of the comparison predicates supplied.
1510 <code>composite_key_compare(const key_comp_tuple& x);</code>
1513 <b>Effects:</b> Constructs a <code>composite_key_compare</code> that stores
1514 copies of the comparison predicate objects supplied in <code>x</code>.
1517 <code>const key_comp_tuple& key_comps()const;</code>
1520 <b>Returns:</b> a constant reference to a tuple holding the
1521 comparison predicate objects internally stored by the
1522 <code>composite_key_compare</code>.
1525 <code>key_comp_tuple& key_comps();</code>
1528 <b>Returns:</b> a reference to a tuple holding the
1529 comparison predicate objects internally stored by the
1530 <code>composite_key_compare</code>.
1534 template<typename CompositeKey1,typename CompositeKey2><br>
1535 bool operator()(<br>
1536 const composite_key_result<CompositeKey1> & x,<br>
1537 const composite_key_result<CompositeKey2> & y)const;<br>
1538 template<typename CompositeKey,typename... Values><br>
1539 bool operator()(<br>
1540 const composite_key_result<CompositeKey>& x,<br>
1541 const std::tuple<Values...>& y)const;<br>
1542 template<typename CompositeKey,typename... Values><br>
1543 bool operator()(<br>
1544 const std::tuple<Values...>& x,<br>
1545 const composite_key_result<CompositeKey>& y)const;<br>
1546 template<typename CompositeKey,typename Value0,...,typename Valuen><br>
1547 bool operator()(<br>
1548 const composite_key_result<CompositeKey>& x,<br>
1549 const boost::tuple<Value0,...,Valuen>& y)const;<br>
1550 template<typename Value0,...,typename Valuen,typename CompositeKey><br>
1551 bool operator()(<br>
1552 const boost::tuple<Value0,...,Valuen>& x,<br>
1553 const composite_key_result<CompositeKey>& y)const;<br>
1557 <b>Requires:</b> The expressions
1558 <code>key_comps().get<i>()(x<sub>i</sub>,y<sub>i</sub>)</code> and
1559 <code>key_comps().get<i>()(y<sub>i</sub>,x<sub>i</sub>)</code>
1560 are valid for all <code>i</code>
1561 in <code>[0,min(length(x),length(y)))</code>.<br>
1562 <b>Returns:</b> <code>true</code> if and only if there exists some
1563 <code>j</code> in the range <code>[0,min(length(x),length(y)))</code>
1566 <code>!key_comps().get<i>()(x<sub>i</sub>,y<sub>i</sub>) && !key_comps().get<i>()(y<sub>i</sub>,x<sub>i</sub>)</code>
1567 for all <code>i</code> in <code>[0,j)</code>,<br>
1568 <code> key_comps().get<j>()(x<sub>j</sub>,y<sub>j</sub>)</code>.
1570 <b>Complexity:</b> No more key extraction operations and comparisons
1571 are performed than those necessary for the evaluation of the expression above,
1572 starting at <code>i==0</code>. The evaluation is short-circuited as soon as
1573 the result is determined to be <code>false</code>.
1577 template<typename CompositeKey,typename Value><br>
1578 bool operator()(<br>
1579 const composite_key_result<CompositeKey>& x,const Value& y)const;
1585 <span class=keyword>return</span> <span class=keyword>operator</span><span class=special>()(</span><span class=identifier>x</span><span class=special>,</span><span class=identifier>boost</span><span class=special>::</span><span class=identifier>make_tuple</span><span class=special>(</span><span class=identifier>boost</span><span class=special>::</span><span class=identifier>cref</span><span class=special>(</span><span class=identifier>y</span><span class=special>)));</span>
1586 </pre></blockquote><br>
1590 template<typename Value,typename CompositeKey><br>
1591 bool operator()(<br>
1592 const Value& x,const composite_key_result<CompositeKey>& y)const;
1598 <span class=keyword>return</span> <span class=keyword>operator</span><span class=special>()(</span><span class=identifier>boost</span><span class=special>::</span><span class=identifier>make_tuple</span><span class=special>(</span><span class=identifier>boost</span><span class=special>::</span><span class=identifier>cref</span><span class=special>(</span><span class=identifier>x</span><span class=special>)),</span><span class=identifier>y</span><span class=special>);</span>
1599 </pre></blockquote><br>
1602 <h4><a name="composite_key_result_less">Class template
1603 <code>composite_key_result_less</code></a></h4>
1606 Deprecated. Use <code>std::less<CompositeKeyResult></code> instead.
1609 <h4><a name="composite_key_result_greater">Class template
1610 <code>composite_key_result_greater</code></a></h4>
1613 Deprecated. Use <code>std::greater<CompositeKeyResult></code> instead.
1616 <h4><a name="less_composite_key_result">Specialization of <code>std::less</code> for
1617 <code>composite_key</code> results</a></h4>
1620 <code>std::less<CompositeKeyResult></code>, with <code>CompositeKeyResult</code>
1621 an instantiation of <code>composite_key_result</code>, behaves as a particularization of
1622 <code>composite_key_compare</code> where all the comparison predicates supplied are
1623 instantiations of <code>std::less</code>.
1627 <span class=keyword>namespace</span> <span class=identifier>std</span><span class=special>{</span>
1629 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>CompositeKey</span><span class=special>></span>
1630 <span class=keyword>struct</span> <span class=identifier>less</span><span class=special><</span><span class=identifier>boost</span><span class=special>::</span><span class=identifier>multi_index</span><span class=special>::</span><span class=identifier>composite_key_result</span><span class=special><</span><span class=identifier>CompositeKey</span><span class=special>></span> <span class=special>></span>
1631 <span class=special>{</span>
1632 <span class=keyword>typedef</span>
1633 <span class=identifier>boost</span><span class=special>::</span><span class=identifier>multi_index</span><span class=special>::</span><span class=identifier>composite_key_result</span><span class=special><</span>
1634 <span class=identifier>CompositeKey</span><span class=special>></span> <span class=identifier>first_argument_type</span><span class=special>;</span>
1635 <span class=keyword>typedef</span> <span class=identifier>first_argument_type</span> <span class=identifier>second_argument_type</span><span class=special>;</span>
1636 <span class=keyword>typedef</span> <span class=keyword>bool</span> <span class=identifier>result_type</span><span class=special>;</span>
1638 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>CompositeKey1</span><span class=special>,</span><span class=keyword>typename</span> <span class=identifier>CompositeKey2</span><span class=special>></span>
1639 <span class=keyword>bool</span> <span class=keyword>operator</span><span class=special>()(</span>
1640 <span class=keyword>const</span> <span class=identifier>boost</span><span class=special>::</span><span class=identifier>multi_index</span><span class=special>::</span><span class=identifier>composite_key_result</span><span class=special><</span><span class=identifier>CompositeKey1</span><span class=special>></span> <span class=special>&</span> <span class=identifier>x</span><span class=special>,</span>
1641 <span class=keyword>const</span> <span class=identifier>boost</span><span class=special>::</span><span class=identifier>multi_index</span><span class=special>::</span><span class=identifier>composite_key_result</span><span class=special><</span><span class=identifier>CompositeKey2</span><span class=special>></span> <span class=special>&</span> <span class=identifier>y</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
1643 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>CompositeKey</span><span class=special>,</span><span class=keyword>typename</span><span class=special>...</span> <span class=identifier>Values</span><span class=special>></span>
1644 <span class=keyword>bool</span> <span class=keyword>operator</span><span class=special>()(</span>
1645 <span class=keyword>const</span> <span class=identifier>boost</span><span class=special>::</span><span class=identifier>multi_index</span><span class=special>::</span><span class=identifier>composite_key_result</span><span class=special><</span><span class=identifier>CompositeKey</span><span class=special>>&</span> <span class=identifier>x</span><span class=special>,</span>
1646 <span class=keyword>const</span> <span class=identifier>std</span><span class=special>::</span><span class=identifier>tuple</span><span class=special><</span><span class=identifier>Values</span><span class=special>...>&</span> <span class=identifier>y</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
1648 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>CompositeKey</span><span class=special>,</span><span class=keyword>typename</span><span class=special>...</span> <span class=identifier>Values</span><span class=special>></span>
1649 <span class=keyword>bool</span> <span class=keyword>operator</span><span class=special>()(</span>
1650 <span class=keyword>const</span> <span class=identifier>std</span><span class=special>::</span><span class=identifier>tuple</span><span class=special><</span><span class=identifier>Values</span><span class=special>...>&</span> <span class=identifier>x</span><span class=special>,</span>
1651 <span class=keyword>const</span> <span class=identifier>boost</span><span class=special>::</span><span class=identifier>multi_index</span><span class=special>::</span><span class=identifier>composite_key_result</span><span class=special><</span><span class=identifier>CompositeKey</span><span class=special>>&</span> <span class=identifier>y</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
1653 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>CompositeKey</span><span class=special>,</span><span class=keyword>typename</span> <span class=identifier>Value0</span><span class=special>,...,</span><span class=keyword>typename</span> <span class=identifier>Valuen</span><span class=special>></span>
1654 <span class=keyword>bool</span> <span class=keyword>operator</span><span class=special>()(</span>
1655 <span class=keyword>const</span> <span class=identifier>boost</span><span class=special>::</span><span class=identifier>multi_index</span><span class=special>::</span><span class=identifier>composite_key_result</span><span class=special><</span><span class=identifier>CompositeKey</span><span class=special>>&</span> <span class=identifier>x</span><span class=special>,</span>
1656 <span class=keyword>const</span> <span class=identifier>boost</span><span class=special>::</span><span class=identifier>tuple</span><span class=special><</span><span class=identifier>Value0</span><span class=special>,...,</span><span class=identifier>Valuen</span><span class=special>>&</span> <span class=identifier>y</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
1658 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>Value0</span><span class=special>,...,</span><span class=keyword>typename</span> <span class=identifier>Valuen</span><span class=special>,</span><span class=keyword>typename</span> <span class=identifier>CompositeKey</span><span class=special>></span>
1659 <span class=keyword>bool</span> <span class=keyword>operator</span><span class=special>()(</span>
1660 <span class=keyword>const</span> <span class=identifier>boost</span><span class=special>::</span><span class=identifier>tuple</span><span class=special><</span><span class=identifier>Value0</span><span class=special>,...,</span><span class=identifier>Valuen</span><span class=special>>&</span> <span class=identifier>x</span><span class=special>,</span>
1661 <span class=keyword>const</span> <span class=identifier>boost</span><span class=special>::</span><span class=identifier>multi_index</span><span class=special>::</span><span class=identifier>composite_key_result</span><span class=special><</span><span class=identifier>CompositeKey</span><span class=special>>&</span> <span class=identifier>y</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
1663 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>CompositeKey</span><span class=special>,</span><span class=keyword>typename</span> <span class=identifier>Value</span><span class=special>></span>
1664 <span class=keyword>bool</span> <span class=keyword>operator</span><span class=special>()(</span>
1665 <span class=keyword>const</span> <span class=identifier>boost</span><span class=special>::</span><span class=identifier>multi_index</span><span class=special>::</span><span class=identifier>composite_key_result</span><span class=special><</span><span class=identifier>CompositeKey</span><span class=special>>&</span> <span class=identifier>x</span><span class=special>,</span>
1666 <span class=keyword>const</span> <span class=identifier>Value</span><span class=special>&</span> <span class=identifier>y</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
1668 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>Value</span><span class=special>,</span><span class=keyword>typename</span> <span class=identifier>CompositeKey</span><span class=special>></span>
1669 <span class=keyword>bool</span> <span class=keyword>operator</span><span class=special>()(</span>
1670 <span class=keyword>const</span> <span class=identifier>Value</span><span class=special>&</span> <span class=identifier>x</span><span class=special>,</span>
1671 <span class=keyword>const</span> <span class=identifier>boost</span><span class=special>::</span><span class=identifier>multi_index</span><span class=special>::</span><span class=identifier>composite_key_result</span><span class=special><</span><span class=identifier>CompositeKey</span><span class=special>>&</span> <span class=identifier>y</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
1672 <span class=special>};</span>
1674 <span class=special>}</span> <span class=comment>// namespace std</span>
1678 <code>CompositeKeyResult</code> must be an instantiation of
1679 <code>composite_key_result</code> for some type
1680 <code>composite_key<KeyFromValue0,...,KeyFromValuen></code>.
1681 <code>std::less<CompositeKeyResult>::operator()</code> is
1683 <code>composite_key_compare<Compare0,...,Comparen>::operator()</code>, taking
1685 <code>Comparei = std::less<KeyFromValuei::result_type></code> for all
1686 <code>i = 0,...,n</code>.
1691 In addition to the requirements on <code>Comparei</code> imposed by
1692 <code>composite_key_compare</code>, each of these types must be
1693 <code>DefaultConstructible</code>. <code>std::less<CompositeKeyResult></code>
1694 is <code>CopyConstructible</code>, <code>CopyConstructible</code>
1695 and <code>CopyAssignable</code>.
1698 <h4><a name="greater_composite_key_result">Specialization of <code>std::greater</code> for
1699 <code>composite_key</code> results</a></h4>
1702 <code>std::greater<CompositeKeyResult></code>, with <code>CompositeKeyResult</code>
1703 an instantiation of <code>composite_key_result</code>, behaves as a particularization of
1704 <code>composite_key_compare</code> where all the comparison predicates supplied
1705 are instantiations of <code>std::greater</code>.
1710 <span class=keyword>namespace</span> <span class=identifier>std</span><span class=special>{</span>
1712 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>CompositeKey</span><span class=special>></span>
1713 <span class=keyword>struct</span> <span class=identifier>greater</span><span class=special><</span><span class=identifier>boost</span><span class=special>::</span><span class=identifier>multi_index</span><span class=special>::</span><span class=identifier>composite_key_result</span><span class=special><</span><span class=identifier>CompositeKey</span><span class=special>></span> <span class=special>></span>
1714 <span class=special>{</span>
1715 <span class=keyword>typedef</span>
1716 <span class=identifier>boost</span><span class=special>::</span><span class=identifier>multi_index</span><span class=special>::</span><span class=identifier>composite_key_result</span><span class=special><</span>
1717 <span class=identifier>CompositeKey</span><span class=special>></span> <span class=identifier>first_argument_type</span><span class=special>;</span>
1718 <span class=keyword>typedef</span> <span class=identifier>first_argument_type</span> <span class=identifier>second_argument_type</span><span class=special>;</span>
1719 <span class=keyword>typedef</span> <span class=keyword>bool</span> <span class=identifier>result_type</span><span class=special>;</span>
1721 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>CompositeKey1</span><span class=special>,</span><span class=keyword>typename</span> <span class=identifier>CompositeKey2</span><span class=special>></span>
1722 <span class=keyword>bool</span> <span class=keyword>operator</span><span class=special>()(</span>
1723 <span class=keyword>const</span> <span class=identifier>boost</span><span class=special>::</span><span class=identifier>multi_index</span><span class=special>::</span><span class=identifier>composite_key_result</span><span class=special><</span><span class=identifier>CompositeKey1</span><span class=special>></span> <span class=special>&</span> <span class=identifier>x</span><span class=special>,</span>
1724 <span class=keyword>const</span> <span class=identifier>boost</span><span class=special>::</span><span class=identifier>multi_index</span><span class=special>::</span><span class=identifier>composite_key_result</span><span class=special><</span><span class=identifier>CompositeKey2</span><span class=special>></span> <span class=special>&</span> <span class=identifier>y</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
1726 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>CompositeKey</span><span class=special>,</span><span class=keyword>typename</span><span class=special>...</span> <span class=identifier>Values</span><span class=special>></span>
1727 <span class=keyword>bool</span> <span class=keyword>operator</span><span class=special>()(</span>
1728 <span class=keyword>const</span> <span class=identifier>boost</span><span class=special>::</span><span class=identifier>multi_index</span><span class=special>::</span><span class=identifier>composite_key_result</span><span class=special><</span><span class=identifier>CompositeKey</span><span class=special>>&</span> <span class=identifier>x</span><span class=special>,</span>
1729 <span class=keyword>const</span> <span class=identifier>std</span><span class=special>::</span><span class=identifier>tuple</span><span class=special><</span><span class=identifier>Values</span><span class=special>...>&</span> <span class=identifier>y</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
1731 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>CompositeKey</span><span class=special>,</span><span class=keyword>typename</span><span class=special>...</span> <span class=identifier>Values</span><span class=special>></span>
1732 <span class=keyword>bool</span> <span class=keyword>operator</span><span class=special>()(</span>
1733 <span class=keyword>const</span> <span class=identifier>std</span><span class=special>::</span><span class=identifier>tuple</span><span class=special><</span><span class=identifier>Values</span><span class=special>...>&</span> <span class=identifier>x</span><span class=special>,</span>
1734 <span class=keyword>const</span> <span class=identifier>boost</span><span class=special>::</span><span class=identifier>multi_index</span><span class=special>::</span><span class=identifier>composite_key_result</span><span class=special><</span><span class=identifier>CompositeKey</span><span class=special>>&</span> <span class=identifier>y</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
1736 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>CompositeKey</span><span class=special>,</span><span class=keyword>typename</span> <span class=identifier>Value0</span><span class=special>,...,</span><span class=keyword>typename</span> <span class=identifier>Valuen</span><span class=special>></span>
1737 <span class=keyword>bool</span> <span class=keyword>operator</span><span class=special>()(</span>
1738 <span class=keyword>const</span> <span class=identifier>boost</span><span class=special>::</span><span class=identifier>multi_index</span><span class=special>::</span><span class=identifier>composite_key_result</span><span class=special><</span><span class=identifier>CompositeKey</span><span class=special>>&</span> <span class=identifier>x</span><span class=special>,</span>
1739 <span class=keyword>const</span> <span class=identifier>boost</span><span class=special>::</span><span class=identifier>tuple</span><span class=special><</span><span class=identifier>Value0</span><span class=special>,...,</span><span class=identifier>Valuen</span><span class=special>>&</span> <span class=identifier>y</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
1741 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>Value0</span><span class=special>,...,</span><span class=keyword>typename</span> <span class=identifier>Valuen</span><span class=special>,</span><span class=keyword>typename</span> <span class=identifier>CompositeKey</span><span class=special>></span>
1742 <span class=keyword>bool</span> <span class=keyword>operator</span><span class=special>()(</span>
1743 <span class=keyword>const</span> <span class=identifier>boost</span><span class=special>::</span><span class=identifier>tuple</span><span class=special><</span><span class=identifier>Value0</span><span class=special>,...,</span><span class=identifier>Valuen</span><span class=special>>&</span> <span class=identifier>x</span><span class=special>,</span>
1744 <span class=keyword>const</span> <span class=identifier>boost</span><span class=special>::</span><span class=identifier>multi_index</span><span class=special>::</span><span class=identifier>composite_key_result</span><span class=special><</span><span class=identifier>CompositeKey</span><span class=special>>&</span> <span class=identifier>y</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
1746 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>CompositeKey</span><span class=special>,</span><span class=keyword>typename</span> <span class=identifier>Value</span><span class=special>></span>
1747 <span class=keyword>bool</span> <span class=keyword>operator</span><span class=special>()(</span>
1748 <span class=keyword>const</span> <span class=identifier>boost</span><span class=special>::</span><span class=identifier>multi_index</span><span class=special>::</span><span class=identifier>composite_key_result</span><span class=special><</span><span class=identifier>CompositeKey</span><span class=special>>&</span> <span class=identifier>x</span><span class=special>,</span>
1749 <span class=keyword>const</span> <span class=identifier>Value</span><span class=special>&</span> <span class=identifier>y</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
1751 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>Value</span><span class=special>,</span><span class=keyword>typename</span> <span class=identifier>CompositeKey</span><span class=special>></span>
1752 <span class=keyword>bool</span> <span class=keyword>operator</span><span class=special>()(</span>
1753 <span class=keyword>const</span> <span class=identifier>Value</span><span class=special>&</span> <span class=identifier>x</span><span class=special>,</span>
1754 <span class=keyword>const</span> <span class=identifier>boost</span><span class=special>::</span><span class=identifier>multi_index</span><span class=special>::</span><span class=identifier>composite_key_result</span><span class=special><</span><span class=identifier>CompositeKey</span><span class=special>>&</span> <span class=identifier>y</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
1755 <span class=special>};</span>
1757 <span class=special>}</span> <span class=comment>// namespace std</span>
1761 <code>CompositeKeyResult</code> must be an instantiation of
1762 <code>composite_key_result</code> for some type
1763 <code>composite_key<KeyFromValue0,...,KeyFromValuen></code>.
1764 <code>std::greater<CompositeKeyResult>::operator()</code> is
1766 <code>composite_key_compare<Compare0,...,Comparen>::operator()</code>, taking
1768 <code>Comparei = std::greater<KeyFromValuei::result_type></code> for all
1769 <code>i = 0,...,n</code>.
1774 In addition to the requirements on <code>Comparei</code> imposed by
1775 <code>composite_key_compare</code>, each of these types must be
1776 <code>DefaultConstructible</code>. <code>std::greater<CompositeKeyResult></code>
1777 is <code>CopyConstructible</code>, <code>CopyConstructible</code>
1778 and <code>CopyAssignable</code>.
1781 <h3><a name="ckey_result_hashing">Hashing</a></h3>
1783 <h4><a name="composite_key_hash">Class template
1784 <code>composite_key_hash</code></a></h4>
1787 <code>composite_key_hash</code> produces hash values for <code>composite_key_result</code>
1788 instantiations based on a collection of elementary hash functors.
1792 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>Hash0</span><span class=special>,...,</span><span class=keyword>typename</span> <span class=identifier>Hashn</span><span class=special>></span>
1793 <span class=keyword>struct</span> <span class=identifier>composite_key_hash</span>
1794 <span class=special>{</span>
1795 <span class=keyword>typedef</span> <span class=identifier>boost</span><span class=special>::</span><span class=identifier>tuple</span><span class=special><</span><span class=identifier>Hash0</span><span class=special>,...,</span><span class=identifier>Hashn</span><span class=special>></span> <span class=identifier>key_hasher_tuple</span><span class=special>;</span>
1797 <span class=identifier>composite_key_hash</span><span class=special>(</span>
1798 <span class=keyword>const</span> <span class=identifier>Hash0</span><span class=special>&</span> <span class=identifier>h0</span><span class=special>=</span><span class=identifier>Hash0</span><span class=special>(),</span>
1799 <span class=special>...</span>
1800 <span class=keyword>const</span> <span class=identifier>Hashn</span><span class=special>&</span> <span class=identifier>hn</span><span class=special>=</span><span class=identifier>Hashn</span><span class=special>());</span>
1802 <span class=identifier>composite_key_hash</span><span class=special>(</span><span class=keyword>const</span> <span class=identifier>key_hasher_tuple</span><span class=special>&</span> <span class=identifier>x</span><span class=special>);</span>
1804 <span class=keyword>const</span> <span class=identifier>key_hasher_tuple</span><span class=special>&</span> <span class=identifier>key_hash_functions</span><span class=special>()</span><span class=keyword>const</span><span class=special>;</span>
1805 <span class=identifier>key_hasher_tuple</span><span class=special>&</span> <span class=identifier>key_hash_functions</span><span class=special>()</span><span class=special>;</span>
1807 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>CompositeKey</span><span class=special>></span>
1808 <span class=identifier>std</span><span class=special>::</span><span class=identifier>size_t</span> <span class=keyword>operator</span><span class=special>()(</span>
1809 <span class=keyword>const</span> <span class=identifier>composite_key_result</span><span class=special><</span><span class=identifier>CompositeKey</span><span class=special>>&</span> <span class=identifier>x</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
1811 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span><span class=special>...</span> <span class=identifier>Values</span><span class=special>></span>
1812 <span class=identifier>std</span><span class=special>::</span><span class=identifier>size_t</span> <span class=keyword>operator</span><span class=special>()(</span>
1813 <span class=keyword>const</span> <span class=identifier>std</span><span class=special>::</span><span class=identifier>tuple</span><span class=special><</span><span class=identifier>Values</span><span class=special>...>&</span> <span class=identifier>x</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
1815 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>Value0</span><span class=special>,...,</span><span class=keyword>typename</span> <span class=identifier>Valuen</span><span class=special>></span>
1816 <span class=identifier>std</span><span class=special>::</span><span class=identifier>size_t</span> <span class=keyword>operator</span><span class=special>()(</span>
1817 <span class=keyword>const</span> <span class=identifier>boost</span><span class=special>::</span><span class=identifier>tuple</span><span class=special><</span><span class=identifier>Value0</span><span class=special>,...,</span><span class=identifier>Valuen</span><span class=special>>&</span> <span class=identifier>x</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
1818 <span class=special>};</span>
1822 <code>Hash0</code>, ... , <code>Hashn</code> are the types of the hash unary function objects
1823 stored by <code>composite_key_hash</code>. Each of these objects
1824 must be <code>CopyConstructible</code> and <code>CopyAssignable</code>
1825 and return a value of type <code>std::size_t</code> in the range
1826 [0, <code>std::numeric_limits<std::size_t>::max())</code>).
1827 At least a hash functor must be provided. The maximum number of hash functors of
1828 a <code>composite_key_hash</code> instantiation is implementation defined.
1829 <code>composite_key_hash</code> is
1830 <code>CopyConstructible</code> and <code>CopyAssignable</code>.
1831 It is also <code>DefaultConstructible</code>
1832 if each <code>Hashi</code> is <code>DefaultConstructible</code> in its turn.
1838 In what follows we use the same <a href="#ckey_result_notation">notation</a>
1839 introduced for <code>composite_key_result</code>.
1841 <h4><code>composite_key_hash</code> members</h4>
1843 <code>composite_key_hash(<br>
1844 const Hash0& h0=Hash0(),<br>
1846 const Hashn& hn=Hashn());
1850 <b>Effects:</b> Constructs a <code>composite_key_hash</code> that stores
1851 copies of the hash functors supplied.
1854 <code>composite_key_hash(const key_hasher_tuple& x);</code>
1857 <b>Effects:</b> Constructs a <code>composite_key_hash</code> that stores
1858 copies of the hash functors supplied in <code>x</code>.
1861 <code>const key_hasher_tuple& key_hash_functions()const;</code>
1864 <b>Returns:</b> a constant reference to a tuple holding the
1865 hash functors internally stored by the
1866 <code>composite_key_hash</code>.
1869 <code>key_hasher_tuple& key_hash_functions();</code>
1872 <b>Returns:</b> a reference to a tuple holding the
1873 hash functors internally stored by the
1874 <code>composite_key_hash</code>.
1878 template<typename CompositeKey><br>
1879 bool operator()(<br>
1880 const composite_key_result<CompositeKey>& x)const;<br>
1881 template<typename... Values><br>
1882 bool operator()(<br>
1883 const std::tuple<Values...>& x)const;<br>
1884 template<typename Value0,...,typename Valuen><br>
1885 bool operator()(<br>
1886 const boost::tuple<Value0,...,Valuen>& x)const;
1890 <b>Requires:</b> <code>length(x)==length(key_hash_functions())</code>.
1892 <code>key_hash_functions().get<i>()(x<sub>i</sub>)</code>
1893 is valid for all <code>i</code> in <code>[0,length(x))</code>.
1895 <b>Returns:</b> A value in the range
1896 <code>[0, std::numeric_limits<std::size_t>::max())</code> that
1897 solely depends on the numerical tuple
1899 (<code>key_hash_functions().get<0>()(x<sub>0</sub>)</code>, ... ,
1900 <code>key_hash_functions().get<N>()(x<sub>N</sub>)</code>),
1901 with <code>N=length(x)-1</code>.
1905 <h4><a name="composite_key_result_hash">Class template
1906 <code>composite_key_result_hash</code></a></h4>
1909 Deprecated. Use <code>boost::hash<CompositeKeyResult></code> instead.
1912 <h4><a name="hash_composite_key_result">Specialization of
1913 <a href="../../../functional/hash/index.html"><code>boost::hash</code></a>
1914 for <code>composite_key</code> results</a></h4>
1917 <code>boost::hash<CompositeKeyResult></code>, with <code>CompositeKeyResult</code>
1918 an instantiation of <code>composite_key_result</code>, behaves as a particularization of
1919 <code>composite_key_hash</code> where all the hash functors supplied
1920 are instantiations of
1921 <a href="../../../functional/hash/index.html"><code>boost::hash</code></a>.
1925 <span class=keyword>namespace</span> <span class=identifier>boost</span><span class=special>{</span>
1927 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>CompositeKey</span><span class=special>></span>
1928 <span class=keyword>struct</span> <span class=identifier>hash</span><span class=special><</span><span class=identifier>multi_index</span><span class=special>::</span><span class=identifier>composite_key_result</span><span class=special><</span><span class=identifier>CompositeKey</span><span class=special>></span> <span class=special>></span>
1929 <span class=special>{</span>
1930 <span class=keyword>typedef</span> <span class=identifier>multi_index</span><span class=special>::</span><span class=identifier>composite_key_result</span><span class=special><</span><span class=identifier>CompositeKey</span><span class=special>></span> <span class=identifier>argument_type</span><span class=special>;</span>
1931 <span class=keyword>typedef</span> <span class=identifier>std</span><span class=special>::</span><span class=identifier>size_t</span> <span class=identifier>result_type</span><span class=special>;</span>
1933 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>CompositeKey</span><span class=special>></span>
1934 <span class=identifier>std</span><span class=special>::</span><span class=identifier>size_t</span> <span class=keyword>operator</span><span class=special>()(</span>
1935 <span class=keyword>const</span> <span class=identifier>multi_index</span><span class=special>::</span><span class=identifier>composite_key_result</span><span class=special><</span><span class=identifier>CompositeKey</span><span class=special>>&</span> <span class=identifier>x</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
1937 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span><span class=special>...</span> <span class=identifier>Values</span><span class=special>></span>
1938 <span class=identifier>std</span><span class=special>::</span><span class=identifier>size_t</span> <span class=keyword>operator</span><span class=special>()(</span>
1939 <span class=keyword>const</span> <span class=identifier>std</span><span class=special>::</span><span class=identifier>tuple</span><span class=special><</span><span class=identifier>Values</span><span class=special>...>&</span> <span class=identifier>x</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
1941 <span class=keyword>template</span><span class=special><</span><span class=keyword>typename</span> <span class=identifier>Value0</span><span class=special>,...,</span><span class=keyword>typename</span> <span class=identifier>Valuen</span><span class=special>></span>
1942 <span class=identifier>std</span><span class=special>::</span><span class=identifier>size_t</span> <span class=keyword>operator</span><span class=special>()(</span>
1943 <span class=keyword>const</span> <span class=identifier>boost</span><span class=special>::</span><span class=identifier>tuple</span><span class=special><</span><span class=identifier>Value0</span><span class=special>,...,</span><span class=identifier>Valuen</span><span class=special>>&</span> <span class=identifier>x</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
1944 <span class=special>};</span>
1946 <span class=special>}</span> <span class=comment>// namespace boost</span>
1950 <code>CompositeKeyResult</code> must be an instantiation of
1951 <code>composite_key_result</code> for some type
1952 <code>composite_key<KeyFromValue0,...,KeyFromValuen></code>.
1953 <code>boost::hash<CompositeKeyResult>::operator()</code> is
1955 <code>composite_key_hash<Hash0,...,Hashn>::operator()</code>, taking
1957 <code>Hashi = boost::hash<KeyFromValuei::result_type></code> for all
1958 <code>i = 0,...,n</code>.
1963 In addition to the requirements on <code>Hashi</code> imposed by
1964 <code>composite_key_hash</code>, each of these types must be
1965 <code>DefaultConstructible</code>. <code>boost::hash<CompositeKeyResult></code> is
1966 <code>DefaultConstructible</code>, <code>CopyConstructible</code>
1967 and <code>CopyAssignable</code>.
1970 <h3><a name="ckey_result_semantics">Semantics of
1971 <code>composite_key_result</code></a></h3>
1974 The design of equality, comparison and hash operations for
1975 <code>composite_key_result</code> objects is based on the following rationale:
1976 a <code>composite_key_result</code> is regarded as a "virtual" tuple, each
1977 of its elements being the result of the corresponding elementary
1978 key extractor. Accordingly, any given operation resolves to a
1979 combination of the corresponding elementwise operations.
1980 This mapping preserves the fundamental properties of the elementary operations
1981 involved; for instance, it defines a true equivalence relation if the
1982 basic predicates induce equivalence relations themselves.
1983 We can state these facts in a formal way as follows.
1987 Consider an instantiation of <code>composite_key_equal_to</code>
1988 with types <code>Pred0</code>, ... , <code>Predn</code> such that each
1989 <code>Predi</code> induces an equivalence relation on a certain type <code>Ti</code>,
1990 and let <code>CompositeKey</code> be a type of the form
1991 <code>composite_key<Value,KeyFromValue0,...,KeyFromValuej></code>,
1992 with <code>j <= n</code>, such that
1994 <code>KeyFromValuei::result_type = Ti</code>, for all <code>i = 0,...,j</code>.
1996 Then, <code>composite_key_equal_to</code> induces an equivalence relation
1997 on elements of type <code>composite_key_result<CompositeKey></code>;
1998 such two objects are equivalent if all its elementary key extractor values
1999 are also equivalent. Additionally, given an instantiation
2000 <code>composite_key_hash<Hash0,...,Hashj></code>, the following types are
2001 <a href="hash_indices.html#lookup"><code>Compatible Keys</code></a> of
2002 (<code>composite_key_hash</code>, <code>composite_key_equal_to</code>)
2003 with respect to <code>composite_key_result<CompositeKey></code>:
2005 <code>tuple<Q0,...,Qj></code>,<br>
2006 <code>composite_key_result<composite_key<K0,...,Kj> ></code>, with
2007 <code>Ki::result_type = Qi</code> for all <code>i = 0,...,j</code>.
2009 provided that each <code>Qi</code> is either <code>Ti</code> or a
2010 <a href="hash_indices.html#lookup"><code>Compatible Key</code></a>
2011 of (<code>Hashi</code>, <code>Predi</code>).</p>
2014 As for comparison, consider an instantiation of <code>composite_key_compare</code>
2015 with types <code>Compare0</code>, ... , <code>Comparen</code> such that each
2016 <code>Comparei</code> induces a strict weak ordering
2017 on the type <code>Ti</code>. Then, for a
2018 <code>CompositeKey</code> type defined in the same manner as above,
2019 <code>composite_key_compare</code> induces a strict weak ordering on elements of type
2020 <code>composite_key_result<CompositeKey></code>, and the order induced
2021 is lexicographical. Also, the following types are
2022 <a href="ord_indices.html#set_operations"><code>Compatible Keys</code></a> of
2023 <code>composite_key_compare</code> with respect to
2024 <code>composite_key_result<CompositeKey></code>:
2026 <code>tuple<Q0,...,Qk></code>, <code>k <= n</code><br>
2027 <code>composite_key_result<composite_key<K0,...,Kk> ></code>, with
2028 <code>Ki::result_type = Qi</code> for all <code>i = 0,...,k</code>.
2032 <li>for <code>i = 0,...,min(j,k)-1</code>, <code>Qi</code> is either <code>Ti</code>
2033 or <i>not coarser</i> than <code>Ti</code> (<code>Qi</code> is a
2034 <a href="ord_indices.html#set_operations"><code>Compatible Key</code></a>
2035 of <code>Comparei</code> and there are no two distinct elements of
2036 <code>Ti</code> equivalent to one single element of <code>Qi</code>);
2039 <code>Qm</code> (with <code>m = min(j,k)</code>) is either <code>Tm</code> or a
2040 <a href="ord_indices.html#set_operations"><code>Compatible Key</code></a>
2041 of <code>Comparem</code>.
2045 In this case, the comparison is done
2046 lexicographically only on the first <code>1+min(j,k)</code> elements.
2050 Analogous properties hold for the equality and comparison operators
2051 of <code>composite_key_result</code>. Note, however,
2052 that equality is only defined for objects of the same length, whilst
2053 comparison takes the minimum length of the operands considered.
2054 Therefore, the equivalence classes induced by <code>x==y</code> are
2055 subsets of those associated to <code>!(x<y)&&!(y<x)</code>.
2060 <div class="prev_link"><a href="rnd_indices.html"><img src="../prev.gif" alt="random access indices" border="0"><br>
2061 Random access indices
2063 <div class="up_link"><a href="index.html"><img src="../up.gif" alt="Boost.MultiIndex reference" border="0"><br>
2064 Boost.MultiIndex reference
2066 <div class="next_link"><a href="../compiler_specifics.html"><img src="../next.gif" alt="compiler specifics" border="0"><br>
2068 </a></div><br clear="all" style="clear: all;">
2072 <p>Revised August 20th 2014</p>
2074 <p>© Copyright 2003-2014 Joaquín M López Muñoz.
2075 Distributed under the Boost Software
2076 License, Version 1.0. (See accompanying file <a href="../../../../LICENSE_1_0.txt">
2077 LICENSE_1_0.txt</a> or copy at <a href="http://www.boost.org/LICENSE_1_0.txt">
2078 http://www.boost.org/LICENSE_1_0.txt</a>)