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 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 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 November
24th
2015</p>
2074 <p>© Copyright
2003-
2015 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>)