key_extraction.html 167 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0.1 Transitional//EN">
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
  5. <title>Boost.MultiIndex Documentation - Key extraction reference</title>
  6. <link rel="stylesheet" href="../style.css" type="text/css">
  7. <link rel="start" href="../index.html">
  8. <link rel="prev" href="rnd_indices.html">
  9. <link rel="up" href="index.html">
  10. <link rel="next" href="../compiler_specifics.html">
  11. </head>
  12. <body>
  13. <h1><img src="../../../../boost.png" alt="boost.png (6897 bytes)" align=
  14. "middle" width="277" height="86">Boost.MultiIndex Key extraction reference</h1>
  15. <div class="prev_link"><a href="rnd_indices.html"><img src="../prev.gif" alt="random access indices" border="0"><br>
  16. Random access indices
  17. </a></div>
  18. <div class="up_link"><a href="index.html"><img src="../up.gif" alt="Boost.MultiIndex reference" border="0"><br>
  19. Boost.MultiIndex reference
  20. </a></div>
  21. <div class="next_link"><a href="../compiler_specifics.html"><img src="../next.gif" alt="compiler specifics" border="0"><br>
  22. Compiler specifics
  23. </a></div><br clear="all" style="clear: all;">
  24. <hr>
  25. <h2>Contents</h2>
  26. <ul>
  27. <li><a href="#key_extractors">Key Extractors</a>
  28. <ul>
  29. <li><a href="#chained_pointers">Chained pointers</a></li>
  30. </ul>
  31. </li>
  32. <li><a href="#synopsis">Header
  33. <code>"boost/multi_index/key_extractors.hpp"</code> synopsis</a>
  34. </li>
  35. <li><a href="#identity_synopsis">Header
  36. <code>"boost/multi_index/identity.hpp"</code> synopsis</a>
  37. <ul>
  38. <li><a href="#identity">Class template <code>identity</code></a></li>
  39. </ul>
  40. </li>
  41. <li><a href="#member_synopsis">Header
  42. <code>"boost/multi_index/member.hpp"</code> synopsis</a>
  43. <ul>
  44. <li><a href="#member">Class template <code>member</code></a></li>
  45. <li><a href="#member_offset">Class template <code>member_offset</code></a></li>
  46. <li><a href="#boost_multi_index_member">Macro <code>BOOST_MULTI_INDEX_MEMBER</code></a></li>
  47. </ul>
  48. </li>
  49. <li><a href="#mem_fun_synopsis">Header
  50. <code>"boost/multi_index/mem_fun.hpp"</code> synopsis</a>
  51. <ul>
  52. <li><a href="#const_mem_fun">Class template <code>const_mem_fun</code></a></li>
  53. <li><a href="#cv_mem_fun">Class templates <code>cv_mem_fun</code>, <code>cref_mem_fun</code> and <code>cvref_mem_fun</code></a></li>
  54. <li><a href="#mem_fun">Class template <code>mem_fun</code></a></li>
  55. <li><a href="#volatile_mem_fun">Class templates <code>volatile_mem_fun</code>, <code>ref_mem_fun</code> and <code>vref_mem_fun</code></a></li>
  56. <li><a href="#const_mem_fun_explicit">Class templates <code>const_mem_fun_explicit</code> and <code>mem_fun_explicit</code></a></li>
  57. <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>
  58. </ul>
  59. </li>
  60. <li><a href="#global_fun_synopsis">Header
  61. <code>"boost/multi_index/global_fun.hpp"</code> synopsis</a>
  62. <ul>
  63. <li><a href="#global_fun">Class template <code>global_fun</code></a></li>
  64. </ul>
  65. </li>
  66. <li><a href="#composite_key_synopsis">Header
  67. <code>"boost/multi_index/composite_key.hpp"</code> synopsis</a>
  68. <ul>
  69. <li><a href="#composite_key">Class template <code>composite_key</code></a></li>
  70. <li><a href="#composite_key_result">Class template <code>composite_key_result</code></a></li>
  71. <li><a href="#ckey_result_equality">Equality</a>
  72. <ul>
  73. <li><a href="#composite_key_equal_to">Class template <code>composite_key_equal_to</code></a></li>
  74. <li><a href="#composite_key_result_equal_to">Class template <code>composite_key_result_equal_to</code></a></li>
  75. <li><a href="#equal_to_composite_key_result">Specialization of <code>std::equal_to</code> for <code>composite_key</code> results</a></li>
  76. </ul>
  77. </li>
  78. <li><a href="#ckey_result_comparison">Comparison</a>
  79. <ul>
  80. <li><a href="#composite_key_compare">Class template <code>composite_key_compare</code></a></li>
  81. <li><a href="#composite_key_result_less">Class template <code>composite_key_result_less</code></a></li>
  82. <li><a href="#composite_key_result_greater">Class template <code>composite_key_result_greater</code></a></li>
  83. <li><a href="#less_composite_key_result">Specialization of <code>std::less</code> for <code>composite_key</code> results</a></li>
  84. <li><a href="#greater_composite_key_result">Specialization of <code>std::greater</code> for <code>composite_key</code> results</a></li>
  85. </ul>
  86. </li>
  87. <li><a href="#ckey_result_hashing">Hashing</a>
  88. <ul>
  89. <li><a href="#composite_key_hash">Class template <code>composite_key_hash</code></a></li>
  90. <li><a href="#composite_key_result_hash">Class template <code>composite_key_result_hash</code></a></li>
  91. <li><a href="#hash_composite_key_result">Specialization of <code>boost::hash</code> for <code>composite_key</code> results</a></li>
  92. </ul>
  93. </li>
  94. <li><a href="#ckey_result_semantics">Semantics of <code>composite_key_result</code></a></li>
  95. </ul>
  96. </li>
  97. <li><a href="#key_synopsis">Header
  98. <code>"boost/multi_index/key.hpp"</code> synopsis</a>
  99. <ul>
  100. <li><a href="#key">Alias template <code>key</code></a></li>
  101. </ul>
  102. </li>
  103. </ul>
  104. <h2><a name="key_extractors">Key Extractors</a></h2>
  105. <p>
  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
  112. <ol>
  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&amp;</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>
  118. </ol>
  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&amp;</code>.
  121. </p>
  122. <p>
  123. Additionally, <code>KeyFromValue</code> is a <i>read/write</i> key extractor
  124. if the following extra conditions are met:
  125. <ol>
  126. <li><code>k1(a)</code> is defined and returns a value convertible
  127. to <code>KeyFromValue::result_type&amp;</code>,</li>
  128. <li><code>const_cast&lt;const KeyFromValue::result_type&amp;>(k1(a))</code>
  129. is the same value as
  130. <code>k1(const_cast&lt;const Type&amp;>(a))</code>,</li>
  131. </ol>
  132. for every <code>k1</code> of type <code>const KeyFromValue</code> and
  133. <code>a</code> of type <code>Type&amp;</code>.
  134. </p>
  135. <p>
  136. Boost.MultiIndex provides twelve general-purpose key extractors:
  137. <ul>
  138. <li><a href="#identity"><code>identity</code></a>,</li>
  139. <li><a href="#member"><code>member</code></a>,</li>
  140. <li><a href="#const_mem_fun"><code>const_mem_fun</code></a>
  141. (and three <a href="#cv_mem_fun">variants</a>),
  142. </li>
  143. <li><a href="#mem_fun"><code>mem_fun</code></a>
  144. (and three <a href="#volatile_mem_fun">variants</a>),
  145. </li>
  146. <li><a href="#global_fun"><code>global_fun</code></a> and</li>
  147. <li><a href="#composite_key"><code>composite_key</code></a>,</li>
  148. </ul>
  149. plus, in C++17 compliant environments, an alias template <a href="#key"><code>key</code></a>
  150. allowing for a very terse specification of the previous extractors
  151. (except <code>identity</code>).
  152. </p>
  153. <h3><a name="chained_pointers">Chained pointers</a></h3>
  154. <p>
  155. The key extractors provided by Boost.MultiIndex are templatized according
  156. to the type <code>Type</code> and serve to extract keys not only from objects
  157. of type <code>Type</code>, but also from reference wrappers provided by
  158. <a href="../../../../doc/html/ref.html">Boost.Ref</a> and from <i>chained pointers</i>
  159. to <code>Type</code> (or to reference wrappers of <code>Type</code>): a chained pointer
  160. is any type <code>P</code> such that, for an object <code>p</code> of type
  161. <code>const P</code>
  162. <ul>
  163. <li><code>*p</code> yields an object of type <code>Type&amp;</code> or
  164. <code>boost::reference_wrapper&lt;Type></code>, OR</li>
  165. <li><code>*p</code> yields a chained pointer to <code>Type</code>,</li>
  166. </ul>
  167. that is, chained pointers are arbitrary compositions of pointer-like objects
  168. ultimately dereferencing to values of <code>Type&amp;</code> or
  169. <code>boost::reference_wrapper&lt;Type></code>.
  170. <p>
  171. <h2><a name="synopsis">Header
  172. <a href="../../../../boost/multi_index/key_extractors.hpp">
  173. <code>"boost/multi_index/key_extractors.hpp"</code></a> synopsis</a>
  174. </h2>
  175. <blockquote><pre>
  176. <span class=preprocessor>#include</span> <span class=special>&lt;</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>&gt;</span>
  177. <span class=preprocessor>#include</span> <span class=special>&lt;</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>&gt;</span>
  178. <span class=preprocessor>#include</span> <span class=special>&lt;</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>&gt;</span>
  179. <span class=preprocessor>#include</span> <span class=special>&lt;</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>&gt;</span>
  180. <span class=preprocessor>#include</span> <span class=special>&lt;</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>&gt;</span>
  181. </pre></blockquote>
  182. <p>
  183. This header includes all the key extractors provided by Boost.MultiIndex.
  184. </p>
  185. <h2>
  186. <a name="identity_synopsis">Header
  187. <a href="../../../../boost/multi_index/identity.hpp">
  188. <code>"boost/multi_index/identity.hpp"</code></a> synopsis</a></h2>
  189. <blockquote><pre>
  190. <span class=keyword>namespace</span> <span class=identifier>boost</span><span class=special>{</span>
  191. <span class=keyword>namespace</span> <span class=identifier>multi_index</span><span class=special>{</span>
  192. <span class=keyword>template</span><span class=special>&lt;</span><span class=keyword>typename</span> <span class=identifier>T</span><span class=special>&gt;</span> <span class=keyword>struct</span> <span class=identifier>identity</span><span class=special>;</span>
  193. <span class=special>}</span> <span class=comment>// namespace boost::multi_index</span>
  194. <span class=special>}</span> <span class=comment>// namespace boost</span>
  195. </pre></blockquote>
  196. <h3><a name="identity">Class template <code>identity</code></a></h3>
  197. <p>
  198. <code>identity</code> is a <a href="#key_extractors"><code>Key Extractor</code></a>
  199. that acts as a do-nothing identity functor.
  200. </p>
  201. <blockquote><pre>
  202. <span class=keyword>template</span><span class=special>&lt;</span><span class=keyword>typename</span> <span class=identifier>Type</span><span class=special>&gt;</span>
  203. <span class=keyword>struct</span> <span class=identifier>identity</span>
  204. <span class=special>{</span>
  205. <span class=keyword>typedef</span> <span class=identifier>Type</span> <span class=identifier>result_type</span><span class=special>;</span>
  206. <span class=comment>// only provided if const ChainedPtr&amp; is not convertible to const Type&amp;</span>
  207. <span class=keyword>template</span><span class=special>&lt;</span><span class=keyword>typename</span> <span class=identifier>ChainedPtr</span><span class=special>&gt;</span> <span class=identifier>Type</span><span class=special>&amp;</span> <span class=keyword>operator</span><span class=special>()(</span><span class=keyword>const</span> <span class=identifier>ChainedPtr</span><span class=special>&amp;</span> <span class=identifier>x</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  208. <span class=keyword>const</span> <span class=identifier>Type</span><span class=special>&amp;</span> <span class=keyword>operator</span><span class=special>()(</span><span class=keyword>const</span> <span class=identifier>Type</span><span class=special>&amp;</span> <span class=identifier>x</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  209. <span class=identifier>Type</span><span class=special>&amp;</span> <span class=keyword>operator</span><span class=special>()(</span><span class=identifier>Type</span><span class=special>&amp;</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
  210. // only provided if Type is non-const</span>
  211. <span class=keyword>const</span> <span class=identifier>Type</span><span class=special>&amp;</span> <span class=keyword>operator</span><span class=special>()(</span><span class=keyword>const</span> <span class=identifier>reference_wrapper</span><span class=special>&lt;</span><span class=keyword>const</span> <span class=identifier>Type</span><span class=special>&gt;&amp;</span> <span class=identifier>x</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  212. <span class=comment>// only provided if Type is const</span>
  213. <span class=identifier>Type</span><span class=special>&amp;</span> <span class=keyword>operator</span><span class=special>()(</span>
  214. <span class=keyword>const</span> <span class=identifier>reference_wrapper</span><span class=special>&lt;</span><span class=keyword>typename</span> <span class=identifier>remove_const</span><span class=special>&lt;</span><span class=identifier>Type</span><span class=special>&gt;::</span><span class=identifier>type</span><span class=special>&gt;&amp;</span> <span class=identifier>x</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  215. <span class=identifier>Type</span><span class=special>&amp;</span> <span class=keyword>operator</span><span class=special>()(</span><span class=keyword>const</span> <span class=identifier>reference_wrapper</span><span class=special>&lt;</span><span class=identifier>Type</span><span class=special>&gt;&amp;</span> <span class=identifier>x</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  216. <span class=special>};</span>
  217. </pre></blockquote>
  218. <p>
  219. <code>identity&lt;Type></code> is a model of:
  220. <ul>
  221. <li>read/write <a href="#key_extractors"><code>Key Extractor</code></a>
  222. from <code>Type</code>,</li>
  223. <li><a href="#key_extractors"><code>Key Extractor</code></a>
  224. from <code>reference_wrapper&lt;const Type></code>,</li>
  225. <li>read/write <a href="#key_extractors"><code>Key Extractor</code></a>
  226. from <code>reference_wrapper&lt;Type></code>,</li>
  227. <li><a href="#key_extractors"><code>Key Extractor</code></a>
  228. from any <a href="#chained_pointers">chained pointer</a> to
  229. <code>const Type</code>,</li>
  230. <li>read/write <a href="#key_extractors"><code>Key Extractor</code></a>
  231. from any <a href="#chained_pointers">chained pointer</a>
  232. to <code>Type</code>.</li>
  233. </ul>
  234. </p>
  235. <h4><code>identity</code> members</h4>
  236. <code>template&lt;typename ChainedPtr> Type&amp; operator()(const ChainedPtr&amp; x)const;</code>
  237. <blockquote>
  238. <b>Requires:</b> <code>ChainedPtr</code> is a <a href="#chained_pointers">chained pointer</a>
  239. type to <code>Type</code>.<br>
  240. <b>Returns:</b> a reference to the object chained-pointed to by <code>x</code>.
  241. </blockquote>
  242. <code>const Type&amp; operator()(const Type&amp; x)const;</code>
  243. <blockquote>
  244. <b>Returns:</b> <code>x</code>.
  245. </blockquote>
  246. <code>Type&amp; operator()(Type&amp; x)const;</code>
  247. <blockquote>
  248. <b>Returns:</b> <code>x</code>.
  249. </blockquote>
  250. <code>const Type&amp; operator()(const reference_wrapper&lt;const Type>&amp; x)const;</code>
  251. <blockquote>
  252. <b>Returns:</b> <code>x.get()</code>.
  253. </blockquote>
  254. <code>Type&amp; operator()(const reference_wrapper&lt;typename remove_const&lt;Type>::type>&amp; x)const;</code>
  255. <blockquote>
  256. <b>Returns:</b> <code>x.get()</code>.
  257. </blockquote>
  258. <code>Type&amp; operator()(const reference_wrapper&lt;Type>&amp; x)const;</code>
  259. <blockquote>
  260. <b>Returns:</b> <code>x.get()</code>.
  261. </blockquote>
  262. <h2>
  263. <a name="member_synopsis">Header
  264. <a href="../../../../boost/multi_index/member.hpp">
  265. <code>"boost/multi_index/member.hpp"</code></a> synopsis</a></h2>
  266. <blockquote><pre>
  267. <span class=keyword>namespace</span> <span class=identifier>boost</span><span class=special>{</span>
  268. <span class=keyword>namespace</span> <span class=identifier>multi_index</span><span class=special>{</span>
  269. <span class=keyword>template</span><span class=special>&lt;</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>&gt;</span>
  270. <span class=keyword>struct</span> <span class=identifier>member</span><span class=special>;</span>
  271. <span class=keyword>template</span><span class=special>&lt;</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>&gt;</span>
  272. <span class=keyword>struct</span> <span class=identifier>member_offset</span><span class=special>;</span> <span class=comment><b>// deprecated</b></span>
  273. <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>
  274. <span class=special>}</span> <span class=comment>// namespace boost::multi_index</span>
  275. <span class=special>}</span> <span class=comment>// namespace boost</span>
  276. </pre></blockquote>
  277. <h3><a name="member">Class template <code>member</code></a></h3>
  278. <p>
  279. <code>member</code> is a <a href="#key_extractors"><code>Key Extractor</code></a>
  280. aimed at accessing a given member of a class.
  281. </p>
  282. <blockquote><pre>
  283. <span class=keyword>template</span><span class=special>&lt;</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>&gt;</span>
  284. <span class=keyword>struct</span> <span class=identifier>member</span>
  285. <span class=special>{</span>
  286. <span class=keyword>typedef</span> <span class=identifier>Type</span> <span class=identifier>result_type</span><span class=special>;</span>
  287. <span class=comment>// only provided if const ChainedPtr&amp; is not convertible to const Class&amp;</span>
  288. <span class=keyword>template</span><span class=special>&lt;</span><span class=keyword>typename</span> <span class=identifier>ChainedPtr</span><span class=special>&gt;</span> <span class=identifier>Type</span><span class=special>&amp;</span> <span class=keyword>operator</span><span class=special>()(</span><span class=keyword>const</span> <span class=identifier>ChainedPtr</span><span class=special>&amp;</span> <span class=identifier>x</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  289. <span class=keyword>const</span> <span class=identifier>Type</span><span class=special>&amp;</span> <span class=keyword>operator</span><span class=special>()(</span><span class=keyword>const</span> <span class=identifier>Class</span><span class=special>&amp;</span> <span class=identifier>x</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  290. <span class=identifier>Type</span><span class=special>&amp;</span> <span class=keyword>operator</span><span class=special>()(</span><span class=identifier>Class</span><span class=special>&amp;</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>
  291. <span class=keyword>const</span> <span class=identifier>Type</span><span class=special>&amp;</span> <span class=keyword>operator</span><span class=special>()(</span><span class=keyword>const</span> <span class=identifier>reference_wrapper</span><span class=special>&lt;</span><span class=keyword>const</span> <span class=identifier>Class</span><span class=special>&gt;&amp;</span> <span class=identifier>x</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  292. <span class=identifier>Type</span><span class=special>&amp;</span> <span class=keyword>operator</span><span class=special>()(</span><span class=keyword>const</span> <span class=identifier>reference_wrapper</span><span class=special>&lt;</span><span class=identifier>Class</span><span class=special>&gt;&amp;</span> <span class=identifier>x</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  293. <span class=special>};</span>
  294. </pre></blockquote>
  295. <p>
  296. The <code>PtrToMember</code> template argument specifies the particular
  297. <code>Type Class::*</code> pointer to the member to be extracted.
  298. <code>member&lt;Class,Type,PtrToMember></code> is a model of:
  299. <ul>
  300. <li>read/write <a href="#key_extractors"><code>Key Extractor</code></a>
  301. from <code>Class</code>,</li>
  302. <li><a href="#key_extractors"><code>Key Extractor</code></a>
  303. from <code>reference_wrapper&lt;const Class></code>,</li>
  304. <li>read/write <a href="#key_extractors"><code>Key Extractor</code></a>
  305. from <code>reference_wrapper&lt;Class></code>,</li>
  306. <li><a href="#key_extractors"><code>Key Extractor</code></a>
  307. from any <a href="#chained_pointers">chained pointer</a>
  308. to <code>const Class</code>,</li>
  309. <li>read/write <a href="#key_extractors"><code>Key Extractor</code></a>
  310. from any <a href="#chained_pointers">chained pointer</a>
  311. to <code>Class</code>.</li>
  312. </ul>
  313. </p>
  314. <h4><code>member</code> members</h4>
  315. <code>template&lt;typename ChainedPtr> Type&amp; operator()(const ChainedPtr&amp; x)const;</code>
  316. <blockquote>
  317. <b>Requires:</b> <code>ChainedPtr</code> is a <a href="#chained_pointers">chained pointer</a>
  318. type to <code>Type</code>.<br>
  319. <b>Returns:</b> a reference to the object chained-pointed to by <code>x</code>.
  320. </blockquote>
  321. <code>const Type&amp; operator()(const Class&amp; x)const;</code>
  322. <blockquote>
  323. <b>Returns:</b> <code>x.*PtrToMember</code>.
  324. </blockquote>
  325. <code>Type&amp; operator()(Class&amp; x)const;</code>
  326. <blockquote>
  327. <b>Returns:</b> <code>x.*PtrToMember</code>.
  328. </blockquote>
  329. <code>const Type&amp; operator()(const reference_wrapper&lt;const Class>&amp; x)const;</code>
  330. <blockquote>
  331. <b>Returns:</b> <code>x.get().*PtrToMember</code>.
  332. </blockquote>
  333. <code>Type&amp; operator()(const reference_wrapper&lt;Class>&amp; x)const;</code>
  334. <blockquote>
  335. <b>Returns:</b> <code>x.get().*PtrToMember</code>.
  336. </blockquote>
  337. <h3><a name="member_offset">Class template <code>member_offset</code></a></h3>
  338. <p>
  339. <code>member_offset</code> was designed to overcome limitations of some legacy
  340. compilers and its use is currently deprecated. Refer to a
  341. <a href="http://www.boost.org/doc/libs/1_54_0/libs/multi_index/doc/reference/key_extraction.html#member_offset">former version</a>
  342. of Boost.MultiIndex for further information.
  343. </p>
  344. <h3><a name="boost_multi_index_member">Macro <code>BOOST_MULTI_INDEX_MEMBER</code></a></h3>
  345. <blockquote><pre>
  346. <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>
  347. </pre></blockquote>
  348. <p>
  349. This macro was designed as a portability mechanism for legacy compilers where <code>member</code>
  350. could not be supported.
  351. As such it is no longer needed in modern environments, though some users might still prefer it
  352. to plain <code>member</code> because it provides a slightly more concise syntax.
  353. </p>
  354. <h2>
  355. <a name="mem_fun_synopsis">Header
  356. <a href="../../../../boost/multi_index/mem_fun.hpp">
  357. <code>"boost/multi_index/mem_fun.hpp"</code></a> synopsis</a></h2>
  358. <blockquote><pre>
  359. <span class=keyword>namespace</span> <span class=identifier>boost</span><span class=special>{</span>
  360. <span class=keyword>namespace</span> <span class=identifier>multi_index</span><span class=special>{</span>
  361. <span class=keyword>template</span><span class=special>&lt;</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>&gt;</span>
  362. <span class=keyword>struct</span> <span class=identifier>const_mem_fun</span><span class=special>;</span>
  363. <span class=keyword>template</span><span class=special>&lt;</span>
  364. <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=keyword>volatile</span>
  365. <span class=special>&gt;</span>
  366. <span class=keyword>struct</span> <span class=identifier>cv_mem_fun</span><span class=special>;</span>
  367. <span class=keyword>template</span><span class=special>&lt;</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>&amp;</span><span class=special>&gt;</span>
  368. <span class=keyword>struct</span> <span class=identifier>cref_mem_fun</span><span class=special>;</span>
  369. <span class=keyword>template</span><span class=special>&lt;</span>
  370. <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=keyword>volatile</span><span class=special>&amp;</span>
  371. <span class=special>&gt;</span>
  372. <span class=keyword>struct</span> <span class=identifier>cvref_mem_fun</span><span class=special>;</span>
  373. <span class=keyword>template</span><span class=special>&lt;</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>)()&gt;</span>
  374. <span class=keyword>struct</span> <span class=identifier>mem_fun</span><span class=special>;</span>
  375. <span class=keyword>template</span><span class=special>&lt;</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>volatile</span><span class=special>&gt;</span>
  376. <span class=keyword>struct</span> <span class=identifier>volatile_mem_fun</span><span class=special>;</span>
  377. <span class=keyword>template</span><span class=special>&lt;</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=special>&amp;</span><span class=special>&gt;</span>
  378. <span class=keyword>struct</span> <span class=identifier>ref_mem_fun</span><span class=special>;</span>
  379. <span class=keyword>template</span><span class=special>&lt;</span>
  380. <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>volatile</span><span class=special>&amp;</span>
  381. <span class=special>&gt;</span>
  382. <span class=keyword>struct</span> <span class=identifier>vref_mem_fun</span><span class=special>;</span>
  383. <span class=keyword>template</span><span class=special>&lt;</span>
  384. <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>
  385. <span class=keyword>typename</span> <span class=identifier>PtrToMemberFunctionType</span><span class=special>,</span><span class=identifier>PtrToMemberFunctionType</span> <span class=identifier>PtrToMemberFunction</span>
  386. <span class=special>&gt;</span>
  387. <span class=keyword>struct</span> <span class=identifier>const_mem_fun_explicit</span><span class=special>;</span> <span class=comment><b>// deprecated</b></span>
  388. <span class=keyword>template</span><span class=special>&lt;</span>
  389. <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>
  390. <span class=keyword>typename</span> <span class=identifier>PtrToMemberFunctionType</span><span class=special>,</span><span class=identifier>PtrToMemberFunctionType</span> <span class=identifier>PtrToMemberFunction</span>
  391. <span class=special>&gt;</span>
  392. <span class=keyword>struct</span> <span class=identifier>mem_fun_explicit</span><span class=special>;</span> <span class=comment><b>// deprecated</b></span>
  393. <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>
  394. <b>implementation defined</b>
  395. <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>
  396. <b>implementation defined</b>
  397. <span class=special>}</span> <span class=comment>// namespace boost::multi_index</span>
  398. <span class=special>}</span> <span class=comment>// namespace boost</span>
  399. </pre></blockquote>
  400. <h3><a name="const_mem_fun">Class template <code>const_mem_fun</code></a></h3>
  401. <p>
  402. <code>const_mem_fun</code> is a <a href="#key_extractors"><code>Key Extractor</code></a>
  403. returning as key the result of invoking a given constant member function of a class.
  404. </p>
  405. <blockquote><pre>
  406. <span class=keyword>template</span><span class=special>&lt;</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>&gt;</span>
  407. <span class=keyword>struct</span> <span class=identifier>const_mem_fun</span>
  408. <span class=special>{</span>
  409. <span class=keyword>typedef</span> <span class=keyword>typename</span> <span class=identifier>remove_reference</span><span class=special>&lt;</span><span class=identifier>Type</span><span class=special>&gt;::</span><span class=identifier>type</span> <span class=identifier>result_type</span><span class=special>;</span>
  410. <span class=comment>// only provided if const ChainedPtr&amp; is not convertible to const Class&amp;</span>
  411. <span class=keyword>template</span><span class=special>&lt;</span><span class=keyword>typename</span> <span class=identifier>ChainedPtr</span><span class=special>&gt;</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>&amp;</span> <span class=identifier>x</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  412. <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>&amp;</span> <span class=identifier>x</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  413. <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>&lt;</span><span class=keyword>const</span> <span class=identifier>Class</span><span class=special>&gt;&amp;</span> <span class=identifier>x</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  414. <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>&lt;</span><span class=identifier>Class</span><span class=special>&gt;&amp;</span> <span class=identifier>x</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  415. <span class=special>};</span>
  416. </pre></blockquote>
  417. <p>
  418. The <code>PtrToMemberFunction</code> template argument specifies the particular
  419. <code>Type (Class::*PtrToMemberFunction)()const</code> pointer to the constant
  420. member function used in the extraction.
  421. <code>const_mem_fun&lt;Class,Type,PtrToMemberFunction></code> is a model of:
  422. <ul>
  423. <li><a href="#key_extractors"><code>Key Extractor</code></a>
  424. from <code>Class</code>,</li>
  425. <li><a href="#key_extractors"><code>Key Extractor</code></a>
  426. from <code>reference_wrapper&lt;const Class></code>,</li>
  427. <li><a href="#key_extractors"><code>Key Extractor</code></a>
  428. from <code>reference_wrapper&lt;Class></code>,</li>
  429. <li><a href="#key_extractors"><code>Key Extractor</code></a>
  430. from any <a href="#chained_pointers">chained pointer</a>
  431. to <code>const Class</code>,</li>
  432. <li><a href="#key_extractors"><code>Key Extractor</code></a>
  433. from any <a href="#chained_pointers">chained pointer</a>
  434. to <code>Class</code>.</li>
  435. </ul>
  436. </p>
  437. <h4><code>const_mem_fun</code> members</h4>
  438. <code>template&lt;typename ChainedPtr> Type operator()(const ChainedPtr&amp; x)const;</code>
  439. <blockquote>
  440. <b>Requires:</b> <code>ChainedPtr</code> is a <a href="#chained_pointers">chained pointer</a>
  441. type to <code>Type</code>.<br>
  442. <b>Returns:</b> <code>(y.*PtrToMemberFunction)()</code>, where <code>y</code> is the
  443. object chained-pointed to by <code>x</code>.
  444. </blockquote>
  445. <code>Type operator()(const Class&amp; x)const;</code>
  446. <blockquote>
  447. <b>Returns:</b> <code>(x.*PtrToMemberFunction)()</code>.
  448. </blockquote>
  449. <code>Type operator()(const reference_wrapper&lt;const Class>&amp; x)const;</code>
  450. <blockquote>
  451. <b>Returns:</b> <code>(x.get().*PtrToMemberFunction)()</code>.
  452. </blockquote>
  453. <code>Type operator()(const reference_wrapper&lt;Class>&amp; x)const;</code>
  454. <blockquote>
  455. <b>Returns:</b> <code>(x.get().*PtrToMemberFunction)()</code>.
  456. </blockquote>
  457. <h3><a name="cv_mem_fun">Class templates <code>cv_mem_fun</code>, <code>cref_mem_fun</code> and <code>cvref_mem_fun</code></a></h3>
  458. <p>
  459. These <a href="#key_extractors"><code>Key Extractors</code></a> are variants of
  460. <a href="#const_mem_fun"><code>const_mem_fun</code></a> used in the case that the
  461. passed member function is:
  462. <ul>
  463. <li><code>const volatile</code> (<code>cv_mem_fun</code>),</li>
  464. <li><code>const &amp;</code>-qualified (<code>cref_mem_fun</code>),</li>
  465. <li><code>const volatile &amp;</code>-qualified (<code>cvref_mem_fun</code>).</li>
  466. </ul>
  467. Other than this, their interface is exactly the same as that of <code>const_mem_fun</code>.
  468. </p>
  469. <h3><a name="mem_fun">Class template <code>mem_fun</code></a></h3>
  470. <p>
  471. <code>mem_fun</code> is a <a href="#key_extractors"><code>Key Extractor</code></a>
  472. returning as key the result of invoking a given member function of a class.
  473. </p>
  474. <blockquote><pre>
  475. <span class=keyword>template</span><span class=special>&lt;</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>)()&gt;</span>
  476. <span class=keyword>struct</span> <span class=identifier>mem_fun</span>
  477. <span class=special>{</span>
  478. <span class=keyword>typedef</span> <span class=keyword>typename</span> <span class=identifier>remove_reference</span><span class=special>&lt;</span><span class=identifier>Type</span><span class=special>&gt;::</span><span class=identifier>type</span> <span class=identifier>result_type</span><span class=special>;</span>
  479. <span class=comment>// only provided if ChainedPtr&amp; is not convertible to Class&amp;</span>
  480. <span class=keyword>template</span><span class=special>&lt;</span><span class=keyword>typename</span> <span class=identifier>ChainedPtr</span><span class=special>&gt;</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>&amp;</span> <span class=identifier>x</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  481. <span class=identifier>Type</span> <span class=keyword>operator</span><span class=special>()(</span><span class=identifier>Class</span><span class=special>&amp;</span> <span class=identifier>x</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  482. <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>&lt;</span><span class=identifier>Class</span><span class=special>&gt;&amp;</span> <span class=identifier>x</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  483. <span class=special>};</span>
  484. </pre></blockquote>
  485. <p>
  486. The <code>PtrToMemberFunction</code> template argument specifies the particular
  487. <code>Type (Class::*PtrToMemberFunction)()</code> pointer to the member
  488. function used in the extraction.
  489. <code>mem_fun&lt;Class,Type,PtrToMemberFunction></code> is a model of:
  490. <ul>
  491. <li><a href="#key_extractors"><code>Key Extractor</code></a>
  492. from <code>reference_wrapper&lt;Class></code>,</li>
  493. <li><a href="#key_extractors"><code>Key Extractor</code></a>
  494. from any <a href="#chained_pointers">chained pointer</a>
  495. to <code>Class</code>.</li>
  496. </ul>
  497. </p>
  498. <h4><code>mem_fun</code> members</h4>
  499. <code>template&lt;typename ChainedPtr> Type operator()(const ChainedPtr&amp; x)const;</code>
  500. <blockquote>
  501. <b>Requires:</b> <code>ChainedPtr</code> is a <a href="#chained_pointers">chained pointer</a>
  502. type to <code>Type</code>.<br>
  503. <b>Returns:</b> <code>(y.*PtrToMemberFunction)()</code>, where <code>y</code> is the
  504. object chained-pointed to by <code>x</code>.
  505. </blockquote>
  506. <code>Type operator()(Class&amp; x)const;</code>
  507. <blockquote>
  508. <b>Returns:</b> <code>(x.*PtrToMemberFunction)()</code>.
  509. </blockquote>
  510. <code>Type operator()(const reference_wrapper&lt;Class>&amp; x)const;</code>
  511. <blockquote>
  512. <b>Returns:</b> <code>(x.get().*PtrToMemberFunction)()</code>.
  513. </blockquote>
  514. <h3><a name="volatile_mem_fun">Class templates <code>volatile_mem_fun</code>, <code>ref_mem_fun</code> and <code>vref_mem_fun</code></a></h3>
  515. <p>
  516. These <a href="#key_extractors"><code>Key Extractors</code></a> are variants of
  517. <a href="#mem_fun"><code>mem_fun</code></a> used in the case that the
  518. passed member function is:
  519. <ul>
  520. <li><code>volatile</code> (<code>volatile_mem_fun</code>),</li>
  521. <li><code>&amp;</code>-qualified (<code>ref_mem_fun</code>),</li>
  522. <li><code>volatile &amp;</code>-qualified (<code>vref_mem_fun</code>).</li>
  523. </ul>
  524. Other than this, their interface is exactly the same as that of <code>mem_fun</code>.
  525. </p>
  526. <h3><a name="const_mem_fun_explicit">Class templates <code>const_mem_fun_explicit</code> and <code>mem_fun_explicit</code></a></h3>
  527. <p>
  528. These extractors were provided as a workaround for MSVC++ 6.0 and are now deprecated.
  529. Refer to a
  530. <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>
  531. of Boost.MultiIndex for further information.
  532. </p>
  533. <h3><a name="boost_multi_index_const_mem_fun">Macros
  534. <code>BOOST_MULTI_INDEX_CONST_MEM_FUN</code>
  535. and <code>BOOST_MULTI_INDEX_MEM_FUN</code></a></h3>
  536. <blockquote><pre>
  537. <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>
  538. <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>
  539. </pre></blockquote>
  540. <p>
  541. Portability macros for usage of <code>const_mem_fun</code> and <code>mem_fun</code>.
  542. Although no longer needed in modern compilers, some users might still decide to
  543. resort to them as they provide a slightly more concise syntax.
  544. </p>
  545. <h2>
  546. <a name="global_fun_synopsis">Header
  547. <a href="../../../../boost/multi_index/global_fun.hpp">
  548. <code>"boost/multi_index/global_fun.hpp"</code></a> synopsis</a></h2>
  549. <blockquote><pre>
  550. <span class=keyword>namespace</span> <span class=identifier>boost</span><span class=special>{</span>
  551. <span class=keyword>namespace</span> <span class=identifier>multi_index</span><span class=special>{</span>
  552. <span class=keyword>template</span><span class=special>&lt;</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>)&gt;</span>
  553. <span class=keyword>struct</span> <span class=identifier>global_fun</span><span class=special>;</span>
  554. <span class=special>}</span> <span class=comment>// namespace boost::multi_index</span>
  555. <span class=special>}</span> <span class=comment>// namespace boost</span>
  556. </pre></blockquote>
  557. <h3><a name="global_fun">Class template <code>global_fun</code></a></h3>
  558. <p>
  559. <code>global_fun</code> is a <a href="#key_extractors"><code>Key Extractor</code></a>
  560. based on a given global or static member function accepting the base type as argument
  561. and returning the associated key.
  562. </p>
  563. <blockquote><pre>
  564. <span class=keyword>template</span><span class=special>&lt;</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>)&gt;</span>
  565. <span class=keyword>struct</span> <span class=identifier>global_fun</span>
  566. <span class=special>{</span>
  567. <span class=keyword>typedef</span> <span class=keyword>typename</span> <span class=identifier>remove_reference</span><span class=special>&lt;</span><span class=identifier>Type</span><span class=special>&gt;::</span><span class=identifier>type</span> <span class=identifier>result_type</span><span class=special>;</span>
  568. <span class=comment>// Only provided under the following circumstances:
  569. // - If Value is a reference to a constant type, only provided
  570. // when const ChainedPtr&amp; is not convertible to Value;
  571. // - if Value is a reference to a non-const type, only provided
  572. // when ChainedPtr&amp; is not convertible to Value;
  573. // - else, only provided when const ChainedPtr&amp; is not
  574. // convertible to const Value&amp;.</span>
  575. <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>&amp;</span> <span class=identifier>x</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  576. <span class=comment>// only provided if Value is a reference type</span>
  577. <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>
  578. <span class=comment>// only provided if Value is not a reference type</span>
  579. <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>&amp;</span> <span class=identifier>x</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  580. <span class=comment>// only provided if Value is not a reference type</span>
  581. <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>&lt;</span><span class=keyword>const</span> <span class=identifier>Value</span><span class=special>&gt;&amp;</span> <span class=identifier>x</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  582. <span class=comment>// only provided if Value is a reference type</span>
  583. <span class=identifier>Type</span> <span class=keyword>operator</span><span class=special>()(</span>
  584. <span class=keyword>const</span> <span class=identifier>reference_wrapper</span><span class=special>&lt;</span>
  585. <span class=identifier>remove_reference</span><span class=special>&lt;</span><span class=identifier>Value</span><span class=special>&gt;::</span><span class=identifier>type</span><span class=special>&gt;&amp;</span> <span class=identifier>x</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  586. <span class=comment>// only provided if Value is not a reference type or is
  587. // a reference to a constant type</span>
  588. <span class=identifier>Type</span> <span class=keyword>operator</span><span class=special>()(</span>
  589. <span class=keyword>const</span> <span class=identifier>reference_wrapper</span><span class=special>&lt;</span>
  590. <span class=keyword>typename</span> <span class=identifier>remove_const</span><span class=special>&lt;</span>
  591. <span class=keyword>typename</span> <span class=identifier>remove_reference</span><span class=special>&lt;</span><span class=identifier>Value</span><span class=special>&gt;::</span><span class=identifier>type</span><span class=special>&gt;::</span><span class=identifier>type</span><span class=special>&gt;&amp;</span> <span class=identifier>x</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  592. <span class=special>};</span>
  593. </pre></blockquote>
  594. <p>
  595. <code>PtrToFunction</code> specifies the particular function used to extract
  596. the key of type <code>Type</code> from some <code>BaseType</code>.
  597. <code>global_fun</code> supports the following function signatures:
  598. <ul>
  599. <li><code>Type f(BaseType)</code> (<code>Value</code> is <code>BaseType</code>),</li>
  600. <li><code>Type f(const BaseType&amp;)</code> (<code>Value</code> is <code>const BaseType&amp;</code>),</li>
  601. <li><code>Type f(BaseType&amp;)</code> (<code>Value</code> is <code>BaseType&amp;</code>).</li>
  602. </ul>
  603. <code>global_fun&lt;Type,Value,PtrToFunction&gt;</code> is a model of:
  604. <ul>
  605. <li><a href="#key_extractors"><code>Key Extractor</code></a>
  606. from <code>reference_wrapper&lt;BaseType></code>,</li>
  607. <li><a href="#key_extractors"><code>Key Extractor</code></a>
  608. from any <a href="#chained_pointers">chained pointer</a>
  609. to <code>BaseType</code>.</li>
  610. </ul>
  611. When <code>Value</code> is <code>BaseType</code> or
  612. <code>const BaseType&amp;</code>,
  613. <code>global_fun&lt;Type,Value,PtrToFunction&gt;</code> is also a model of:
  614. <ul>
  615. <li><a href="#key_extractors"><code>Key Extractor</code></a>
  616. from <code>BaseType</code>,</li>
  617. <li><a href="#key_extractors"><code>Key Extractor</code></a>
  618. from <code>reference_wrapper&lt;const BaseType></code>,</li>
  619. <li><a href="#key_extractors"><code>Key Extractor</code></a>
  620. from any <a href="#chained_pointers">chained pointer</a>
  621. to <code>const BaseType</code>.</li>
  622. </ul>
  623. </p>
  624. <h4><code>global_fun</code> members</h4>
  625. <code>template&lt;typename ChainedPtr> Type operator()(const ChainedPtr&amp; x)const;</code>
  626. <blockquote>
  627. <b>Requires:</b> <code>ChainedPtr</code> is a <a href="#chained_pointers">chained pointer</a>
  628. type to <code>Value</code>.<br>
  629. <b>Returns:</b> <code>PtrToFunction)(y)</code>, where <code>y</code> is the
  630. object chained-pointed to by <code>x</code>.
  631. </blockquote>
  632. <code>Type operator()(Value x)const;</code>
  633. <blockquote>
  634. <b>Returns:</b> <code>PtrToFunction(x)</code>.
  635. </blockquote>
  636. <code>Type operator()(const Value&amp; x)const;</code>
  637. <blockquote>
  638. <b>Returns:</b> <code>PtrToFunction(x)</code>.
  639. </blockquote>
  640. <code>Type operator()(const reference_wrapper&lt;const Value&gt;&amp; x)const;</code>
  641. <blockquote>
  642. <b>Returns:</b> <code>PtrToFunction(x.get())</code>.
  643. </blockquote>
  644. <code>
  645. Type operator()(<br>
  646. &nbsp;&nbsp;const reference_wrapper&lt;remove_reference&lt;Value&gt;::type&gt;&amp; x)const;</code>
  647. <blockquote>
  648. <b>Returns:</b> <code>PtrToFunction(x.get())</code>.
  649. </blockquote>
  650. <code>Type operator()(<br>
  651. &nbsp;&nbsp;const reference_wrapper&lt;<br>
  652. &nbsp;&nbsp;&nbsp;&nbsp;typename remove_const&lt;<br>
  653. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;typename remove_reference&lt;Value&gt;::type&gt;::type&gt;&amp; x)const;</code>
  654. <blockquote>
  655. <b>Returns:</b> <code>PtrToFunction(x.get())</code>.
  656. </blockquote>
  657. <h2>
  658. <a name="composite_key_synopsis">Header
  659. <a href="../../../../boost/multi_index/composite_key.hpp">
  660. <code>"boost/multi_index/composite_key.hpp"</code></a> synopsis</a></h2>
  661. <blockquote><pre>
  662. <span class=keyword>namespace</span> <span class=identifier>boost</span><span class=special>{</span>
  663. <span class=keyword>namespace</span> <span class=identifier>multi_index</span><span class=special>{</span>
  664. <span class=keyword>template</span><span class=special>&lt;</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>&gt;</span>
  665. <span class=keyword>struct</span> <span class=identifier>composite_key</span><span class=special>;</span>
  666. <span class=keyword>template</span><span class=special>&lt;</span><span class=keyword>typename</span> <span class=identifier>CompositeKey</span><span class=special>&gt;</span>
  667. <span class=keyword>struct</span> <span class=identifier>composite_key_result</span><span class=special>;</span>
  668. <span class=comment>// comparison operators for composite_key_result:</span>
  669. <span class=comment>// <b>OP</b> is any of ==,&lt;,!=,&gt;,&gt;=,&lt;=</span>
  670. <span class=keyword>template</span><span class=special>&lt;</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>&gt;</span>
  671. <span class=keyword>bool</span> <span class=keyword>operator</span> <b><i>OP</i></b><span class=special>(</span>
  672. <span class=keyword>const</span> <span class=identifier>composite_key_result</span><span class=special>&lt;</span><span class=identifier>CompositeKey1</span><span class=special>&gt;&amp;</span> <span class=identifier>x</span><span class=special>,</span>
  673. <span class=keyword>const</span> <span class=identifier>composite_key_result</span><span class=special>&lt;</span><span class=identifier>CompositeKey2</span><span class=special>&gt;&amp;</span> <span class=identifier>y</span><span class=special>);</span>
  674. <span class=keyword>template</span><span class=special>&lt;</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>&gt;</span>
  675. <span class=keyword>bool</span> <span class=keyword>operator</span> <b><i>OP</i></b><span class=special>(</span>
  676. <span class=keyword>const</span> <span class=identifier>composite_key_result</span><span class=special>&lt;</span><span class=identifier>CompositeKey</span><span class=special>&gt;&amp;</span> <span class=identifier>x</span><span class=special>,</span>
  677. <span class=keyword>const</span> <span class=identifier>std</span><span class=special>::</span><span class=identifier>tuple</span><span class=special>&lt;</span><span class=identifier>Values</span><span class=special>...&gt;&amp;</span> <span class=identifier>y</span><span class=special>);</span>
  678. <span class=keyword>template</span><span class=special>&lt;</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>&gt;</span>
  679. <span class=keyword>bool</span> <span class=keyword>operator</span> <b><i>OP</i></b><span class=special>(</span>
  680. <span class=keyword>const</span> <span class=identifier>std</span><span class=special>::</span><span class=identifier>tuple</span><span class=special>&lt;</span><span class=identifier>Values</span><span class=special>...&gt;&amp;</span> <span class=identifier>x</span><span class=special>,</span>
  681. <span class=keyword>const</span> <span class=identifier>composite_key_result</span><span class=special>&lt;</span><span class=identifier>CompositeKey</span><span class=special>&gt;&amp;</span> <span class=identifier>y</span><span class=special>);</span>
  682. <span class=keyword>template</span><span class=special>&lt;</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>&gt;</span>
  683. <span class=keyword>bool</span> <span class=keyword>operator</span> <b><i>OP</i></b><span class=special>(</span>
  684. <span class=keyword>const</span> <span class=identifier>composite_key_result</span><span class=special>&lt;</span><span class=identifier>CompositeKey</span><span class=special>&gt;&amp;</span> <span class=identifier>x</span><span class=special>,</span>
  685. <span class=keyword>const</span> <span class=identifier>boost</span><span class=special>::</span><span class=identifier>tuple</span><span class=special>&lt;</span><span class=identifier>Value0</span><span class=special>,...,</span><span class=identifier>Valuen</span><span class=special>&gt;&amp;</span> <span class=identifier>y</span><span class=special>);</span>
  686. <span class=keyword>template</span><span class=special>&lt;</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>&gt;</span>
  687. <span class=keyword>bool</span> <span class=keyword>operator</span> <b><i>OP</i></b><span class=special>(</span>
  688. <span class=keyword>const</span> <span class=identifier>boost</span><span class=special>::</span><span class=identifier>tuple</span><span class=special>&lt;</span><span class=identifier>Value0</span><span class=special>,...,</span><span class=identifier>Valuen</span><span class=special>&gt;&amp;</span> <span class=identifier>x</span><span class=special>,</span>
  689. <span class=keyword>const</span> <span class=identifier>composite_key_result</span><span class=special>&lt;</span><span class=identifier>CompositeKey</span><span class=special>&gt;&amp;</span> <span class=identifier>y</span><span class=special>);</span>
  690. <span class=comment>// equality functors:</span>
  691. <span class=keyword>template</span><span class=special>&lt;</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>&gt;</span>
  692. <span class=keyword>struct</span> <span class=identifier>composite_key_equal_to</span><span class=special>;</span>
  693. <span class=keyword>template</span><span class=special>&lt;</span><span class=keyword>typename</span> <span class=identifier>CompositeKeyResult</span><span class=special>&gt;</span>
  694. <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>
  695. <span class=comment>// comparison functors:</span>
  696. <span class=keyword>template</span><span class=special>&lt;</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>&gt;</span>
  697. <span class=keyword>struct</span> <span class=identifier>composite_key_compare</span><span class=special>;</span>
  698. <span class=keyword>template</span><span class=special>&lt;</span><span class=keyword>typename</span> <span class=identifier>CompositeKeyResult</span><span class=special>&gt;</span>
  699. <span class=keyword>struct</span> <span class=identifier>composite_key_result_less</span><span class=special>;</span> <span class=comment><b>// deprecated</b></span>
  700. <span class=keyword>template</span><span class=special>&lt;</span><span class=keyword>typename</span> <span class=identifier>CompositeKeyResult</span><span class=special>&gt;</span>
  701. <span class=keyword>struct</span> <span class=identifier>composite_key_result_greater</span><span class=special>;</span> <span class=comment><b>// deprecated</b></span>
  702. <span class=comment>// hash functors:</span>
  703. <span class=keyword>template</span><span class=special>&lt;</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>&gt;</span>
  704. <span class=keyword>struct</span> <span class=identifier>composite_key_hash</span><span class=special>;</span>
  705. <span class=keyword>template</span><span class=special>&lt;</span><span class=keyword>typename</span> <span class=identifier>CompositeKeyResult</span><span class=special>&gt;</span>
  706. <span class=keyword>struct</span> <span class=identifier>composite_key_result_hash</span><span class=special>;</span> <span class=comment><b>// deprecated</b></span>
  707. <span class=special>}</span> <span class=comment>// namespace boost::multi_index</span>
  708. <span class=special>}</span> <span class=comment>// namespace boost</span>
  709. <span class=comment>// specializations of external functors for composite_key_result:</span>
  710. <span class=keyword>namespace</span> <span class=identifier>std</span><span class=special>{</span>
  711. <span class=keyword>template</span><span class=special>&lt;</span><span class=keyword>typename</span> <span class=identifier>CompositeKey</span><span class=special>&gt;</span>
  712. <span class=keyword>struct</span> <span class=identifier>equal_to</span><span class=special>&lt;</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>&lt;</span><span class=identifier>CompositeKey</span><span class=special>&gt;</span> <span class=special>&gt;;</span>
  713. <span class=keyword>template</span><span class=special>&lt;</span><span class=keyword>typename</span> <span class=identifier>CompositeKey</span><span class=special>&gt;</span>
  714. <span class=keyword>struct</span> <span class=identifier>less</span><span class=special>&lt;</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>&lt;</span><span class=identifier>CompositeKey</span><span class=special>&gt;</span> <span class=special>&gt;;</span>
  715. <span class=keyword>template</span><span class=special>&lt;</span><span class=keyword>typename</span> <span class=identifier>CompositeKey</span><span class=special>&gt;</span>
  716. <span class=keyword>struct</span> <span class=identifier>greater</span><span class=special>&lt;</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>&lt;</span><span class=identifier>CompositeKey</span><span class=special>&gt;</span> <span class=special>&gt;;</span>
  717. <span class=special>}</span> <span class=comment>// namespace std</span>
  718. <span class=keyword>namespace</span> <span class=identifier>boost</span><span class=special>{</span>
  719. <span class=keyword>template</span><span class=special>&lt;</span><span class=keyword>typename</span> <span class=identifier>CompositeKey</span><span class=special>&gt;</span>
  720. <span class=keyword>struct</span> <span class=identifier>hash</span><span class=special>&lt;</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>&lt;</span><span class=identifier>CompositeKey</span><span class=special>&gt;</span> <span class=special>&gt;;</span>
  721. <span class=special>}</span> <span class=comment>// namespace boost</span>
  722. </pre></blockquote>
  723. <h3><a name="composite_key">Class template <code>composite_key</code></a></h3>
  724. <p>
  725. <code>composite_key</code> is a <a href="#key_extractors"><code>Key Extractor</code></a>
  726. returning the combined value of several key extractors whose type is specified
  727. at compile time. The returned object is of type
  728. <a href="#composite_key_result">
  729. <code>composite_key_result</code></a><code>&lt;composite_key></code>.
  730. </p>
  731. <blockquote><pre>
  732. <span class=keyword>template</span><span class=special>&lt;</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>&gt;</span>
  733. <span class=keyword>struct</span> <span class=identifier>composite_key</span>
  734. <span class=special>{</span>
  735. <span class=keyword>typedef</span> <span class=identifier>boost</span><span class=special>::</span><span class=identifier>tuple</span><span class=special>&lt;</span><span class=identifier>KeyFromValue0</span><span class=special>,...,</span><span class=identifier>KeyFromValuen</span><span class=special>&gt;</span> <span class=identifier>key_extractor_tuple</span><span class=special>;</span>
  736. <span class=keyword>typedef</span> <span class=identifier>Value</span> <span class=identifier>value_type</span><span class=special>;</span>
  737. <span class=keyword>typedef</span> <span class=identifier>composite_key_result</span><span class=special>&lt;</span><span class=identifier>composite_key</span><span class=special>&gt;</span> <span class=identifier>result_type</span><span class=special>;</span>
  738. <span class=identifier>composite_key</span><span class=special>(</span>
  739. <span class=keyword>const</span> <span class=identifier>KeyFromValue0</span><span class=special>&amp;</span> <span class=identifier>k0</span><span class=special>=</span><span class=identifier>KeyFromValue0</span><span class=special>(),</span>
  740. <span class=special>...</span>
  741. <span class=keyword>const</span> <span class=identifier>KeyFromValuen</span><span class=special>&amp;</span> <span class=identifier>kn</span><span class=special>=</span><span class=identifier>KeyFromValuen</span><span class=special>());</span>
  742. <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>&amp;</span> <span class=identifier>x</span><span class=special>);</span>
  743. <span class=keyword>const</span> <span class=identifier>key_extractor_tuple</span><span class=special>&amp;</span> <span class=identifier>key_extractors</span><span class=special>()</span><span class=keyword>const</span><span class=special>;</span>
  744. <span class=identifier>key_extractor_tuple</span><span class=special>&amp;</span> <span class=identifier>key_extractors</span><span class=special>()</span>
  745. <span class=comment>// only provided if const ChainedPtr&amp; is not convertible to const value_type&amp;</span>
  746. <span class=keyword>template</span><span class=special>&lt;</span><span class=keyword>typename</span> <span class=identifier>ChainedPtr</span><span class=special>&gt;</span>
  747. <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>&amp;</span> <span class=identifier>x</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  748. <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>&amp;</span> <span class=identifier>x</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  749. <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>&lt;</span><span class=keyword>const</span> <span class=identifier>value_type</span><span class=special>&gt;&amp;</span> <span class=identifier>x</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  750. <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>&lt;</span><span class=identifier>value_type</span><span class=special>&gt;&amp;</span> <span class=identifier>x</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  751. <span class=special>};</span>
  752. </pre></blockquote>
  753. <p>
  754. <code>KeyFromValue0</code>, ... , <code>KeyFromValuen</code> are the types of
  755. the key extractors combined into the composite key. Each of these types
  756. must be a <a href="#key_extractors"><code>Key Extractor</code></a> from
  757. <code>Value</code>. At least a key extractor must be provided. The maximum
  758. number of key extractors of a <code>composite_key</code> instantiation is
  759. implementation defined. <code>composite_key</code> internally stores an
  760. object of every constituent key extractor type.
  761. <code>composite_key&lt;Value,KeyFromValue0,...,KeyFromValuen></code> is a model
  762. of:
  763. <ul>
  764. <li><a href="#key_extractors"><code>Key Extractor</code></a>
  765. from <code>Value</code>,</li>
  766. <li><a href="#key_extractors"><code>Key Extractor</code></a>
  767. from <code>reference_wrapper&lt;const Value></code>,</li>
  768. <li><a href="#key_extractors"><code>Key Extractor</code></a>
  769. from <code>reference_wrapper&lt;Value></code>,</li>
  770. <li><a href="#key_extractors"><code>Key Extractor</code></a>
  771. from any <a href="#chained_pointers">chained pointer</a>
  772. to <code>const Value</code>,</li>
  773. <li><a href="#key_extractors"><code>Key Extractor</code></a>
  774. from any <a href="#chained_pointers">chained pointer</a>
  775. to <code>Value</code>.</li>
  776. </ul>
  777. </p>
  778. <h4><code>composite_key</code> members</h4>
  779. <code>composite_key(<br>
  780. &nbsp;&nbsp;const KeyFromValue0&amp; k0=KeyFromValue0(),<br>
  781. &nbsp;&nbsp;...<br>
  782. &nbsp;&nbsp;const KeyFromValuen&amp; kn=KeyFromValuen());
  783. </code>
  784. <blockquote>
  785. <b>Effects:</b> Constructs a <code>composite_key</code> that stores
  786. copies of the key extractor objects supplied.
  787. </blockquote>
  788. <code>composite_key(const key_extractor_tuple&amp; x);</code>
  789. <blockquote>
  790. <b>Effects:</b> Constructs a <code>composite_key</code> that stores
  791. copies of the key extractor objects supplied in <code>x</code>.
  792. </blockquote>
  793. <code>const key_extractor_tuple&amp; key_extractors()const;</code>
  794. <blockquote>
  795. <b>Returns:</b> a constant reference to a tuple holding the
  796. key extractors internally stored by the <code>composite_key</code>.
  797. </blockquote>
  798. <code>key_extractor_tuple&amp; key_extractors();</code>
  799. <blockquote>
  800. <b>Returns:</b> a reference to a tuple holding the
  801. key extractors internally stored by the <code>composite_key</code>.
  802. </blockquote>
  803. <code>template&lt;typename ChainedPtr><br>
  804. result_type operator()(const ChainedPtr&amp; x)const;</code>
  805. <blockquote>
  806. <b>Requires:</b> <code>ChainedPtr</code> is a <a href="#chained_pointers">chained pointer</a>
  807. type to <code>result_type</code>.<br>
  808. <b>Returns:</b> a <code>result_type</code> object dependent on
  809. <code>*this</code> and <code>y</code>, where <code>y</code> is the
  810. object chained-pointed to by <code>x</code>.
  811. </blockquote>
  812. <code>result_type operator()(const value_type&amp; x)const;</code>
  813. <blockquote>
  814. <b>Returns:</b> a <code>result_type</code> object dependent on
  815. <code>*this</code> and <code>x</code>.
  816. </blockquote>
  817. <code>result_type operator()(const reference_wrapper&lt;const value_type>&amp; x)const;</code>
  818. <blockquote>
  819. <b>Returns:</b> a <code>result_type</code> object dependent on
  820. <code>*this</code> and <code>x.get()</code>.
  821. </blockquote>
  822. <code>result_type operator()(const reference_wrapper&lt;value_type>&amp; x)const;</code>
  823. <blockquote>
  824. <b>Returns:</b> a <code>result_type</code> object dependent on
  825. <code>*this</code> and <code>x.get()</code>.
  826. </blockquote>
  827. <h3><a name="composite_key_result">Class template
  828. <code>composite_key_result</code></a></h3>
  829. <p>
  830. This is an opaque type returned by <code>composite_key</code>
  831. instantiations as their extracted key.
  832. </p>
  833. <blockquote><pre>
  834. <span class=keyword>template</span><span class=special>&lt;</span><span class=keyword>typename</span> <span class=identifier>CompositeKey</span><span class=special>&gt;</span>
  835. <span class=keyword>struct</span> <span class=identifier>composite_key_result</span>
  836. <span class=special>{</span>
  837. <b>no public interface available</b>
  838. <span class=special>};</span>
  839. <span class=comment>// comparison:</span>
  840. <span class=comment>// <b>OP</b> is any of ==,&lt;,!=,&gt;,&gt;=,&lt;=</span>
  841. <span class=keyword>template</span><span class=special>&lt;</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>&gt;</span>
  842. <span class=keyword>bool</span> <span class=keyword>operator</span> <b><i>OP</i></b><span class=special>(</span>
  843. <span class=keyword>const</span> <span class=identifier>composite_key_result</span><span class=special>&lt;</span><span class=identifier>CompositeKey1</span><span class=special>&gt;&amp;</span> <span class=identifier>x</span><span class=special>,</span>
  844. <span class=keyword>const</span> <span class=identifier>composite_key_result</span><span class=special>&lt;</span><span class=identifier>CompositeKey2</span><span class=special>&gt;&amp;</span> <span class=identifier>y</span><span class=special>);</span>
  845. <span class=keyword>template</span><span class=special>&lt;</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>&gt;</span>
  846. <span class=keyword>bool</span> <span class=keyword>operator</span> <b><i>OP</i></b><span class=special>(</span>
  847. <span class=keyword>const</span> <span class=identifier>composite_key_result</span><span class=special>&lt;</span><span class=identifier>CompositeKey</span><span class=special>&gt;&amp;</span> <span class=identifier>x</span><span class=special>,</span>
  848. <span class=keyword>const</span> <span class=identifier>std</span><span class=special>::</span><span class=identifier>tuple</span><span class=special>&lt;</span><span class=identifier>Values</span><span class=special>...&gt;&amp;</span> <span class=identifier>y</span><span class=special>);</span>
  849. <span class=keyword>template</span><span class=special>&lt;</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>&gt;</span>
  850. <span class=keyword>bool</span> <span class=keyword>operator</span> <b><i>OP</i></b><span class=special>(</span>
  851. <span class=keyword>const</span> <span class=identifier>std</span><span class=special>::</span><span class=identifier>tuple</span><span class=special>&lt;</span><span class=identifier>Values</span><span class=special>...&gt;&amp;</span> <span class=identifier>x</span><span class=special>,</span>
  852. <span class=keyword>const</span> <span class=identifier>composite_key_result</span><span class=special>&lt;</span><span class=identifier>CompositeKey</span><span class=special>&gt;&amp;</span> <span class=identifier>y</span><span class=special>);</span>
  853. <span class=keyword>template</span><span class=special>&lt;</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>&gt;</span>
  854. <span class=keyword>bool</span> <span class=keyword>operator</span> <b><i>OP</i></b><span class=special>(</span>
  855. <span class=keyword>const</span> <span class=identifier>composite_key_result</span><span class=special>&lt;</span><span class=identifier>CompositeKey</span><span class=special>&gt;&amp;</span> <span class=identifier>x</span><span class=special>,</span>
  856. <span class=keyword>const</span> <span class=identifier>boost</span><span class=special>::</span><span class=identifier>tuple</span><span class=special>&lt;</span><span class=identifier>Value0</span><span class=special>,...,</span><span class=identifier>Valuen</span><span class=special>&gt;&amp;</span> <span class=identifier>y</span><span class=special>);</span>
  857. <span class=keyword>template</span><span class=special>&lt;</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>&gt;</span>
  858. <span class=keyword>bool</span> <span class=keyword>operator</span> <b><i>OP</i></b><span class=special>(</span>
  859. <span class=keyword>const</span> <span class=identifier>boost</span><span class=special>::</span><span class=identifier>tuple</span><span class=special>&lt;</span><span class=identifier>Value0</span><span class=special>,...,</span><span class=identifier>Valuen</span><span class=special>&gt;&amp;</span> <span class=identifier>x</span><span class=special>,</span>
  860. <span class=keyword>const</span> <span class=identifier>composite_key_result</span><span class=special>&lt;</span><span class=identifier>CompositeKey</span><span class=special>&gt;&amp;</span> <span class=identifier>y</span><span class=special>);</span>
  861. </pre></blockquote>
  862. <code>CompositeKey</code> is the <code>composite_key</code> instantiation to
  863. which the <code>composite_key_result</code> type is associated. Objects of type
  864. <code>composite_key_result</code> returned by a composite key must be always treated
  865. as <i>temporary</i>, i.e. they should not be stored or copied.
  866. <code>composite_key_result</code> is <i>not</i> guaranteed to be
  867. <code>DefaultConstructible</code> or <code>CopyAssignable</code>.
  868. Every object of type <code>composite_key_result&lt;CompositeKey></code> is
  869. internally associated to the <code>CompositeKey</code> from which it is returned
  870. and the object of type <code>CompositeKey::value_type</code> to which the
  871. composite key was applied.
  872. </p>
  873. <h4><a name="ckey_result_notation">Notation</a></h4>
  874. <p>
  875. Given an <code>x</code> of type <code>composite_key_result&lt;CompositeKey></code>,
  876. we use the following notation:
  877. <ul>
  878. <li><code>ck(x)</code> is the <code>CompositeKey</code> object associated to
  879. <code>x</code>,</li>
  880. <li><code>v(x)</code> is the object of type <code>CompositeKey::value_type</code>
  881. associated to <code>x</code>,</li>
  882. <li><code>k<sub>i</sub>(x) = ck(x).key_extractors().get&lt;i>()</code>,
  883. that is, is the <code>i</code>-th key extractor of <code>ck(x)</code>,</li>
  884. <li><code>x<sub>i</sub> = k<sub>i</sub>(x)(v(x))</code>, that is, the
  885. key extracted from <code>v(x)</code> by the <code>i</code>-th key extractor,</li>
  886. <li><code>length(x)</code> is the number of key extractors of <code>ck(x)</code>.</li>
  887. </ul>
  888. Also, if <code>y</code> is an <code>std::tuple</code> or <code>boost::tuple</code> of values, we define:
  889. <ul>
  890. <li><code>y<sub>i</sub>=get&lt;i>(y)</code>,</li>
  891. <li><code>length(y)</code> is the number of elements of <code>y</code>.</li>
  892. </ul>
  893. </p>
  894. <h4>Comparison operators</h4>
  895. <code>template&lt;typename CompositeKey1,typename CompositeKey2><br>
  896. bool operator==(<br>
  897. &nbsp;&nbsp;const composite_key_result&lt;CompositeKey1>&amp; x,<br>
  898. &nbsp;&nbsp;const composite_key_result&lt;CompositeKey2>&amp; y);<br>
  899. template&lt;typename CompositeKey,typename... Values><br>
  900. bool operator==(<br>
  901. &nbsp;&nbsp;const composite_key_result&lt;CompositeKey>&amp; x,<br>
  902. &nbsp;&nbsp;const std::tuple&lt;Values...>&amp; y);<br>
  903. template&lt;typename CompositeKey,typename... Values><br>
  904. bool operator==(<br>
  905. &nbsp;&nbsp;const std::tuple&lt;Values...>&amp; x,<br>
  906. &nbsp;&nbsp;const composite_key_result&lt;CompositeKey>&amp; y);<br>
  907. template&lt;typename CompositeKey,typename Value0,...,typename Valuen><br>
  908. bool operator==(<br>
  909. &nbsp;&nbsp;const composite_key_result&lt;CompositeKey>&amp; x,<br>
  910. &nbsp;&nbsp;const boost::tuple&lt;Value0,...,Valuen>&amp; y);<br>
  911. template&lt;typename Value0,...,typename Valuen,typename CompositeKey><br>
  912. bool operator==(<br>
  913. &nbsp;&nbsp;const boost::tuple&lt;Value0,...,Valuen>&amp; x,<br>
  914. &nbsp;&nbsp;const composite_key_result&lt;CompositeKey>&amp; y);
  915. </code>
  916. <blockquote>
  917. <b>Requires:</b> <code>length(x)==length(y)</code>. The expression
  918. <code>x<sub>i</sub>==y<sub>i</sub></code> is valid for all <code>i</code>
  919. in <code>[0,length(x))</code>.<br>
  920. <b>Returns:</b> <code>true</code> if and only if
  921. <blockquote>
  922. <code>x<sub>i</sub>==y<sub>i</sub></code> for all <code>i</code>
  923. in <code>[0,length(x))</code>.
  924. </blockquote>
  925. <b>Complexity:</b> No more key extraction operations and comparisons
  926. are performed than those necessary for the evaluation of the expression above,
  927. starting at <code>i==0</code>. The evaluation is short-circuited as soon as
  928. the result is determined to be <code>false</code>.
  929. </blockquote>
  930. <code>template&lt;typename CompositeKey1,typename CompositeKey2><br>
  931. bool operator<(<br>
  932. &nbsp;&nbsp;const composite_key_result&lt;CompositeKey1>&amp; x,<br>
  933. &nbsp;&nbsp;const composite_key_result&lt;CompositeKey2>&amp; y);<br>
  934. template&lt;typename CompositeKey,typename... Values><br>
  935. bool operator<(<br>
  936. &nbsp;&nbsp;const composite_key_result&lt;CompositeKey>&amp; x,<br>
  937. &nbsp;&nbsp;const std::tuple&lt;Values...>&amp; y);<br>
  938. template&lt;typename CompositeKey,typename... Values><br>
  939. bool operator<(<br>
  940. &nbsp;&nbsp;const std::tuple&lt;Values...>&amp; x,<br>
  941. &nbsp;&nbsp;const composite_key_result&lt;CompositeKey>&amp; y);<br>
  942. template&lt;typename CompositeKey,typename Value0,...,typename Valuen><br>
  943. bool operator<(<br>
  944. &nbsp;&nbsp;const composite_key_result&lt;CompositeKey>&amp; x,<br>
  945. &nbsp;&nbsp;const boost::tuple&lt;Value0,...,Valuen>&amp; y);<br>
  946. template&lt;typename Value0,...,typename Valuen,typename CompositeKey><br>
  947. bool operator<(<br>
  948. &nbsp;&nbsp;const boost::tuple&lt;Value0,...,Valuen>&amp; x,<br>
  949. &nbsp;&nbsp;const composite_key_result&lt;CompositeKey>&amp; y);
  950. </code>
  951. <blockquote>
  952. <b>Requires:</b> The expressions
  953. <code>x<sub>i</sub>&lt;y<sub>i</sub></code> and
  954. <code>y<sub>i</sub>&lt;x<sub>i</sub></code> are valid for all <code>i</code>
  955. in <code>[0,min(length(x),length(y)))</code>.<br>
  956. <b>Returns:</b> <code>true</code> if and only if there exists some
  957. <code>j</code> in the range <code>[0,min(length(x),length(y)))</code>
  958. such that
  959. <blockquote>
  960. <code>!(x<sub>i</sub>&lt;y<sub>i</sub>) &amp;&amp; !(y<sub>i</sub>&lt;x<sub>i</sub>)</code>
  961. for all <code>i</code> in <code>[0,j)</code>,<br>
  962. <code>&nbsp;&nbsp;x<sub>j</sub>&lt;y<sub>j</sub></code>.
  963. </blockquote>
  964. <b>Complexity:</b> No more key extraction operations and comparisons
  965. are performed than those necessary for the evaluation of the expression above,
  966. starting at <code>i==0</code>. The evaluation is short-circuited as soon as
  967. the result is determined to be <code>false</code>.
  968. </blockquote>
  969. <code>template&lt;typename CompositeKey1,typename CompositeKey2><br>
  970. bool operator <b><i>OP</i></b>(<br>
  971. &nbsp;&nbsp;const composite_key_result&lt;CompositeKey1>&amp; x,<br>
  972. &nbsp;&nbsp;const composite_key_result&lt;CompositeKey2>&amp; y);<br>
  973. template&lt;typename CompositeKey,typename... Values><br>
  974. bool operator <b><i>OP</i></b>(<br>
  975. &nbsp;&nbsp;const composite_key_result&lt;CompositeKey>&amp; x,<br>
  976. &nbsp;&nbsp;const std::tuple&lt;Values...>&amp; y);<br>
  977. template&lt;typename CompositeKey,typename... Values><br>
  978. bool operator <b><i>OP</i></b>(<br>
  979. &nbsp;&nbsp;const std::tuple&lt;Values...>&amp; x,<br>
  980. &nbsp;&nbsp;const composite_key_result&lt;CompositeKey>&amp; y);<br>
  981. template&lt;typename CompositeKey,typename Value0,...,typename Valuen><br>
  982. bool operator <b><i>OP</i></b>(<br>
  983. &nbsp;&nbsp;const composite_key_result&lt;CompositeKey>&amp; x,<br>
  984. &nbsp;&nbsp;const boost::tuple&lt;Value0,...,Valuen>&amp; y);<br>
  985. template&lt;typename Value0,...,typename Valuen,typename CompositeKey><br>
  986. bool operator <b><i>OP</i></b>(<br>
  987. &nbsp;&nbsp;const boost::tuple&lt;Value0,...,Valuen>&amp; x,<br>
  988. &nbsp;&nbsp;const composite_key_result&lt;CompositeKey>&amp; y);
  989. </code>
  990. <p>
  991. (<code><b><i>OP</i></b></code> is any of <code>!=</code>, <code>></code>,
  992. <code>>=</code>, <code>&lt;=</code>.)
  993. </p>
  994. <blockquote>
  995. <b>Requires:</b> The expressions given below are valid (for the particular
  996. <code><b><i>OP</i></b></code> considered.)<br>
  997. <b>Returns:</b> <code>true</code> if and only if
  998. <blockquote>
  999. <code>!(x==y)</code> (<code><b><i>OP</i></b></code> is <code>!=</code>),<br>
  1000. <code>&nbsp;&nbsp;y&lt;&nbsp;x&nbsp;</code> (<code><b><i>OP</i></b></code> is <code>>&nbsp;</code>),<br>
  1001. <code>!(x&lt;&nbsp;y)</code> (<code><b><i>OP</i></b></code> is <code>>=</code>),<br>
  1002. <code>!(y&lt;&nbsp;x)</code> (<code><b><i>OP</i></b></code> is <code>&lt;=</code>).
  1003. </blockquote>
  1004. </blockquote>
  1005. <h3><a name="ckey_result_equality">Equality</a></h3>
  1006. <h4><a name="composite_key_equal_to">Class template
  1007. <code>composite_key_equal_to</code></a></h4>
  1008. <p>
  1009. <code>composite_key_equal_to</code> tests for equality between
  1010. <code>composite_key_result</code> instantiations and between
  1011. these and tuples of values, using an internally stored
  1012. collection of elementary equality predicates.
  1013. </p>
  1014. <blockquote><pre>
  1015. <span class=keyword>template</span><span class=special>&lt;</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>&gt;</span>
  1016. <span class=keyword>struct</span> <span class=identifier>composite_key_equal_to</span>
  1017. <span class=special>{</span>
  1018. <span class=keyword>typedef</span> <span class=identifier>boost</span><span class=special>::</span><span class=identifier>tuple</span><span class=special>&lt;</span><span class=identifier>Pred0</span><span class=special>,...,</span><span class=identifier>Predn</span><span class=special>&gt;</span> <span class=identifier>key_eq_tuple</span><span class=special>;</span>
  1019. <span class=identifier>composite_key_equal_to</span><span class=special>(</span>
  1020. <span class=keyword>const</span> <span class=identifier>Pred0</span><span class=special>&amp;</span> <span class=identifier>p0</span><span class=special>=</span><span class=identifier>Pred0</span><span class=special>(),</span>
  1021. <span class=special>...</span>
  1022. <span class=keyword>const</span> <span class=identifier>Predn</span><span class=special>&amp;</span> <span class=identifier>pn</span><span class=special>=</span><span class=identifier>Predn</span><span class=special>());</span>
  1023. <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>&amp;</span> <span class=identifier>x</span><span class=special>);</span>
  1024. <span class=keyword>const</span> <span class=identifier>key_eq_tuple</span><span class=special>&amp;</span> <span class=identifier>key_eqs</span><span class=special>()</span><span class=keyword>const</span><span class=special>;</span>
  1025. <span class=identifier>key_eq_tuple</span><span class=special>&amp;</span> <span class=identifier>key_eqs</span><span class=special>()</span><span class=special>;</span>
  1026. <span class=keyword>template</span><span class=special>&lt;</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>&gt;</span>
  1027. <span class=keyword>bool</span> <span class=keyword>operator</span><span class=special>()(</span>
  1028. <span class=keyword>const</span> <span class=identifier>composite_key_result</span><span class=special>&lt;</span><span class=identifier>CompositeKey1</span><span class=special>&gt;</span> <span class=special>&amp;</span> <span class=identifier>x</span><span class=special>,</span>
  1029. <span class=keyword>const</span> <span class=identifier>composite_key_result</span><span class=special>&lt;</span><span class=identifier>CompositeKey2</span><span class=special>&gt;</span> <span class=special>&amp;</span> <span class=identifier>y</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  1030. <span class=keyword>template</span><span class=special>&lt;</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>&gt;</span>
  1031. <span class=keyword>bool</span> <span class=keyword>operator</span><span class=special>()(</span>
  1032. <span class=keyword>const</span> <span class=identifier>composite_key_result</span><span class=special>&lt;</span><span class=identifier>CompositeKey</span><span class=special>&gt;&amp;</span> <span class=identifier>x</span><span class=special>,</span>
  1033. <span class=keyword>const</span> <span class=identifier>std</span><span class=special>::</span><span class=identifier>tuple</span><span class=special>&lt;</span><span class=identifier>Values</span><span class=special>...&gt;&amp;</span> <span class=identifier>y</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  1034. <span class=keyword>template</span><span class=special>&lt;</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>&gt;</span>
  1035. <span class=keyword>bool</span> <span class=keyword>operator</span><span class=special>()(</span>
  1036. <span class=keyword>const</span> <span class=identifier>std</span><span class=special>::</span><span class=identifier>tuple</span><span class=special>&lt;</span><span class=identifier>Values</span><span class=special>...&gt;&amp;</span> <span class=identifier>x</span><span class=special>,</span>
  1037. <span class=keyword>const</span> <span class=identifier>composite_key_result</span><span class=special>&lt;</span><span class=identifier>CompositeKey</span><span class=special>&gt;&amp;</span> <span class=identifier>y</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  1038. <span class=keyword>template</span><span class=special>&lt;</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>&gt;</span>
  1039. <span class=keyword>bool</span> <span class=keyword>operator</span><span class=special>()(</span>
  1040. <span class=keyword>const</span> <span class=identifier>composite_key_result</span><span class=special>&lt;</span><span class=identifier>CompositeKey</span><span class=special>&gt;&amp;</span> <span class=identifier>x</span><span class=special>,</span>
  1041. <span class=keyword>const</span> <span class=identifier>boost</span><span class=special>::</span><span class=identifier>tuple</span><span class=special>&lt;</span><span class=identifier>Value0</span><span class=special>,...,</span><span class=identifier>Valuen</span><span class=special>&gt;&amp;</span> <span class=identifier>y</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  1042. <span class=keyword>template</span><span class=special>&lt;</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>&gt;</span>
  1043. <span class=keyword>bool</span> <span class=keyword>operator</span><span class=special>()(</span>
  1044. <span class=keyword>const</span> <span class=identifier>boost</span><span class=special>::</span><span class=identifier>tuple</span><span class=special>&lt;</span><span class=identifier>Value0</span><span class=special>,...,</span><span class=identifier>Valuen</span><span class=special>&gt;&amp;</span> <span class=identifier>x</span><span class=special>,</span>
  1045. <span class=keyword>const</span> <span class=identifier>composite_key_result</span><span class=special>&lt;</span><span class=identifier>CompositeKey</span><span class=special>&gt;&amp;</span> <span class=identifier>y</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  1046. <span class=special>};</span>
  1047. </pre></blockquote>
  1048. <p>
  1049. <code>Pred0</code>, ... , <code>Predn</code> are the types of the equality
  1050. binary predicates stored by <code>composite_key_equal_to</code>. Each of these predicates
  1051. must be <code>CopyConstructible</code> and <code>CopyAssignable</code>. At least an
  1052. equality predicate must be provided. The maximum number of equality predicates of
  1053. a <code>composite_key_equal_to</code> instantiation is implementation defined.
  1054. <code>composite_key_equal_to</code> is
  1055. <code>CopyConstructible</code> and <code>CopyAssignable</code>.
  1056. It is also <code>DefaultConstructible</code>
  1057. if each <code>Predi</code> is <code>DefaultConstructible</code> in its turn.
  1058. </p>
  1059. <p>
  1060. Note that formally it is not required that the <code>Predi</code> types
  1061. behave as equality predicates in any definite way. However, the
  1062. semantics of <code>composite_key_equal_to</code> is well defined if this
  1063. is the case, as explained in the section on the
  1064. <a href="#ckey_result_semantics">semantics of <code>composite_key_result</code></a>.
  1065. </p>
  1066. <h4>Notation</h4>
  1067. <p>
  1068. In what follows we use the same <a href="#ckey_result_notation">notation</a>
  1069. introduced for <code>composite_key_result</code>.
  1070. <h4><code>composite_key_equal_to</code> members</h4>
  1071. <code>composite_key_equal_to(<br>
  1072. &nbsp;&nbsp;const Pred0&amp; p0=Pred0(),<br>
  1073. &nbsp;&nbsp;...<br>
  1074. &nbsp;&nbsp;const Predn&amp; pn=Predn());
  1075. </code>
  1076. <blockquote>
  1077. <b>Effects:</b> Constructs a <code>composite_key_equal_to</code> that stores
  1078. copies of the equality predicates supplied.
  1079. </blockquote>
  1080. <code>composite_key_equal_to(const key_eq_tuple&amp; x);</code>
  1081. <blockquote>
  1082. <b>Effects:</b> Constructs a <code>composite_key_equal_to</code> that stores
  1083. copies of the equality predicate objects supplied in <code>x</code>.
  1084. </blockquote>
  1085. <code>const key_eq_tuple&amp; key_eqs()const;</code>
  1086. <blockquote>
  1087. <b>Returns:</b> a constant reference to a tuple holding the
  1088. equality predicate objects internally stored by the
  1089. <code>composite_key_equal_to</code>.
  1090. </blockquote>
  1091. <code>key_eq_tuple&amp; key_eqs();</code>
  1092. <blockquote>
  1093. <b>Returns:</b> a reference to a tuple holding the
  1094. equality predicate objects internally stored by the
  1095. <code>composite_key_equal_to</code>.
  1096. </blockquote>
  1097. <code>
  1098. template&lt;typename CompositeKey1,typename CompositeKey2><br>
  1099. bool operator()(<br>
  1100. &nbsp;&nbsp;const composite_key_result&lt;CompositeKey1> &amp; x,<br>
  1101. &nbsp;&nbsp;const composite_key_result&lt;CompositeKey2> &amp; y)const;<br>
  1102. template&lt;typename CompositeKey,typename Values...><br>
  1103. bool operator()(<br>
  1104. &nbsp;&nbsp;const composite_key_result&lt;CompositeKey>&amp; x,<br>
  1105. &nbsp;&nbsp;const std::tuple&lt;Values...>&amp; y)const;<br>
  1106. template&lt;typename CompositeKey,typename Values...><br>
  1107. bool operator()(<br>
  1108. &nbsp;&nbsp;const std::tuple&lt;Values...>&amp; x,<br>
  1109. &nbsp;&nbsp;const composite_key_result&lt;CompositeKey>&amp; y)const;<br>
  1110. template&lt;typename CompositeKey,typename Value0,...,typename Valuen><br>
  1111. bool operator()(<br>
  1112. &nbsp;&nbsp;const composite_key_result&lt;CompositeKey>&amp; x,<br>
  1113. &nbsp;&nbsp;const boost::tuple&lt;Value0,...,Valuen>&amp; y)const;<br>
  1114. template&lt;typename Value0,...,typename Valuen,typename CompositeKey><br>
  1115. bool operator()(<br>
  1116. &nbsp;&nbsp;const boost::tuple&lt;Value0,...,Valuen>&amp; x,<br>
  1117. &nbsp;&nbsp;const composite_key_result&lt;CompositeKey>&amp; y)const;<br>
  1118. </code>
  1119. <blockquote>
  1120. <b>Requires:</b> <code>length(x)==length(y)</code>. The expressions
  1121. <code>key_eqs().get&lt;i>()(x<sub>i</sub>,y<sub>i</sub>)</code> and
  1122. <code>key_eqs().get&lt;i>()(y<sub>i</sub>,x<sub>i</sub>)</code>
  1123. are valid for all <code>i</code> in <code>[0,length(x))</code>.<br>
  1124. <b>Returns:</b> <code>true</code> if and only
  1125. <blockquote>
  1126. <code>key_eqs().get&lt;i>()(x<sub>i</sub>,y<sub>i</sub>)</code>
  1127. for all <code>i</code> in <code>[0,length(x))</code>.<br>
  1128. </blockquote>
  1129. <b>Complexity:</b> No more key extraction operations and comparisons
  1130. are performed than those necessary for the evaluation of the expression above,
  1131. starting at <code>i==0</code>. The evaluation is short-circuited as soon as
  1132. the result is determined to be <code>false</code>.
  1133. </blockquote>
  1134. <h4><a name="composite_key_result_equal_to">Class template
  1135. <code>composite_key_result_equal_to</code></a></h4>
  1136. <p>
  1137. Deprecated. Use <code>std::equal_to&lt;CompositeKeyResult&gt;</code> instead.
  1138. </p>
  1139. <h4><a name="equal_to_composite_key_result">Specialization of
  1140. <code>std::equal_to</code> for <code>composite_key</code> results</a></h4>
  1141. <p>
  1142. <code>std::equal_to&lt;CompositeKeyResult></code>, with <code>CompositeKeyResult</code>
  1143. an instantiation of <code>composite_key_result</code>,
  1144. behaves as a particularization of
  1145. <code>composite_key_equal_to</code> where all the comparison predicates supplied
  1146. are instantiations of <code>std::equal_to</code>.
  1147. </p>
  1148. <blockquote><pre>
  1149. <span class=keyword>namespace</span> <span class=identifier>std</span><span class=special>{</span>
  1150. <span class=keyword>template</span><span class=special>&lt;</span><span class=keyword>typename</span> <span class=identifier>CompositeKey</span><span class=special>&gt;</span>
  1151. <span class=keyword>struct</span> <span class=identifier>equal_to</span><span class=special>&lt;</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>&lt;</span><span class=identifier>CompositeKey</span><span class=special>&gt;</span> <span class=special>&gt;</span>
  1152. <span class=special>{</span>
  1153. <span class=keyword>typedef</span>
  1154. <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>&lt;</span>
  1155. <span class=identifier>CompositeKey</span><span class=special>&gt;</span> <span class=identifier>first_argument_type</span><span class=special>;</span>
  1156. <span class=keyword>typedef</span> <span class=identifier>first_argument_type</span> <span class=identifier>second_argument_type</span><span class=special>;</span>
  1157. <span class=keyword>typedef</span> <span class=keyword>bool</span> <span class=identifier>result_type</span><span class=special>;</span>
  1158. <span class=keyword>template</span><span class=special>&lt;</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>&gt;</span>
  1159. <span class=keyword>bool</span> <span class=keyword>operator</span><span class=special>()(</span>
  1160. <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>&lt;</span><span class=identifier>CompositeKey1</span><span class=special>&gt;</span> <span class=special>&amp;</span> <span class=identifier>x</span><span class=special>,</span>
  1161. <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>&lt;</span><span class=identifier>CompositeKey2</span><span class=special>&gt;</span> <span class=special>&amp;</span> <span class=identifier>y</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  1162. <span class=keyword>template</span><span class=special>&lt;</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>&gt;</span>
  1163. <span class=keyword>bool</span> <span class=keyword>operator</span><span class=special>()(</span>
  1164. <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>&lt;</span><span class=identifier>CompositeKey</span><span class=special>&gt;&amp;</span> <span class=identifier>x</span><span class=special>,</span>
  1165. <span class=keyword>const</span> <span class=identifier>std</span><span class=special>::</span><span class=identifier>tuple</span><span class=special>&lt;</span><span class=identifier>Values</span><span class=special>...&gt;&amp;</span> <span class=identifier>y</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  1166. <span class=keyword>template</span><span class=special>&lt;</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>&gt;</span>
  1167. <span class=keyword>bool</span> <span class=keyword>operator</span><span class=special>()(</span>
  1168. <span class=keyword>const</span> <span class=identifier>std</span><span class=special>::</span><span class=identifier>tuple</span><span class=special>&lt;</span><span class=identifier>Values</span><span class=special>...&gt;&amp;</span> <span class=identifier>x</span><span class=special>,</span>
  1169. <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>&lt;</span><span class=identifier>CompositeKey</span><span class=special>&gt;&amp;</span> <span class=identifier>y</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  1170. <span class=keyword>template</span><span class=special>&lt;</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>&gt;</span>
  1171. <span class=keyword>bool</span> <span class=keyword>operator</span><span class=special>()(</span>
  1172. <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>&lt;</span><span class=identifier>CompositeKey</span><span class=special>&gt;&amp;</span> <span class=identifier>x</span><span class=special>,</span>
  1173. <span class=keyword>const</span> <span class=identifier>boost</span><span class=special>::</span><span class=identifier>tuple</span><span class=special>&lt;</span><span class=identifier>Value0</span><span class=special>,...,</span><span class=identifier>Valuen</span><span class=special>&gt;&amp;</span> <span class=identifier>y</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  1174. <span class=keyword>template</span><span class=special>&lt;</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>&gt;</span>
  1175. <span class=keyword>bool</span> <span class=keyword>operator</span><span class=special>()(</span>
  1176. <span class=keyword>const</span> <span class=identifier>boost</span><span class=special>::</span><span class=identifier>tuple</span><span class=special>&lt;</span><span class=identifier>Value0</span><span class=special>,...,</span><span class=identifier>Valuen</span><span class=special>&gt;&amp;</span> <span class=identifier>x</span><span class=special>,</span>
  1177. <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>&lt;</span><span class=identifier>CompositeKey</span><span class=special>&gt;&amp;</span> <span class=identifier>y</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  1178. <span class=special>};</span>
  1179. <span class=special>}</span> <span class=comment>// namespace std</span>
  1180. </pre></blockquote>
  1181. <p>
  1182. <code>CompositeKeyResult</code> must be an instantiation of
  1183. <code>composite_key_result</code> for some type
  1184. <code>composite_key&lt;KeyFromValue0,...,KeyFromValuen></code>.
  1185. <code>std::equal:to&lt;CompositeKeyResult>::operator()</code> is
  1186. then equivalent to
  1187. <code>composite_key_equal_to&lt;Pred0,...,Predn>::operator()</code>, taking
  1188. <blockquote>
  1189. <code>Predi = std::equal_to&lt;KeyFromValuei::result_type></code> for all
  1190. <code>i = 0,...,n</code>.
  1191. </blockquote>
  1192. </p>
  1193. <p>
  1194. In addition to the requirements on <code>Predi</code> imposed by
  1195. <code>composite_key_equal_to</code>, each of these types must be
  1196. <code>DefaultConstructible</code>. <code>std::equal_to&lt;CompositeKeyResult></code>
  1197. is <code>DefaultConstructible</code>, <code>CopyConstructible</code> and
  1198. <code>CopyAssignable</code>.
  1199. </p>
  1200. <h3><a name="ckey_result_comparison">Comparison</a></h3>
  1201. <h4><a name="composite_key_compare">Class template
  1202. <code>composite_key_compare</code></a></h4>
  1203. <p>
  1204. <code>composite_key_compare</code> compares <code>composite_key_result</code>
  1205. instantiations between them and with tuples of values using an internally stored
  1206. collection of elementary comparison predicates.
  1207. </p>
  1208. <blockquote><pre>
  1209. <span class=keyword>template</span><span class=special>&lt;</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>&gt;</span>
  1210. <span class=keyword>struct</span> <span class=identifier>composite_key_compare</span>
  1211. <span class=special>{</span>
  1212. <span class=keyword>typedef</span> <span class=identifier>boost</span><span class=special>::</span><span class=identifier>tuple</span><span class=special>&lt;</span><span class=identifier>Compare0</span><span class=special>,...,</span><span class=identifier>Comparen</span><span class=special>&gt;</span> <span class=identifier>key_comp_tuple</span><span class=special>;</span>
  1213. <span class=identifier>composite_key_compare</span><span class=special>(</span>
  1214. <span class=keyword>const</span> <span class=identifier>Compare0</span><span class=special>&amp;</span> <span class=identifier>c0</span><span class=special>=</span><span class=identifier>Compare0</span><span class=special>(),</span>
  1215. <span class=special>...</span>
  1216. <span class=keyword>const</span> <span class=identifier>Comparen</span><span class=special>&amp;</span> <span class=identifier>cn</span><span class=special>=</span><span class=identifier>Comparen</span><span class=special>());</span>
  1217. <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>&amp;</span> <span class=identifier>x</span><span class=special>);</span>
  1218. <span class=keyword>const</span> <span class=identifier>key_comp_tuple</span><span class=special>&amp;</span> <span class=identifier>key_comps</span><span class=special>()</span><span class=keyword>const</span><span class=special>;</span>
  1219. <span class=identifier>key_comp_tuple</span><span class=special>&amp;</span> <span class=identifier>key_comps</span><span class=special>()</span><span class=special>;</span>
  1220. <span class=keyword>template</span><span class=special>&lt;</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>&gt;</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>composite_key_result</span><span class=special>&lt;</span><span class=identifier>CompositeKey1</span><span class=special>&gt;</span> <span class=special>&amp;</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>&lt;</span><span class=identifier>CompositeKey2</span><span class=special>&gt;</span> <span class=special>&amp;</span> <span class=identifier>y</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  1224. <span class=keyword>template</span><span class=special>&lt;</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>&gt;</span>
  1225. <span class=keyword>bool</span> <span class=keyword>operator</span><span class=special>()(</span>
  1226. <span class=keyword>const</span> <span class=identifier>composite_key_result</span><span class=special>&lt;</span><span class=identifier>CompositeKey</span><span class=special>&gt;&amp;</span> <span class=identifier>x</span><span class=special>,</span>
  1227. <span class=keyword>const</span> <span class=identifier>std</span><span class=special>::</span><span class=identifier>tuple</span><span class=special>&lt;</span><span class=identifier>Values</span><span class=special>...&gt;&amp;</span> <span class=identifier>y</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  1228. <span class=keyword>template</span><span class=special>&lt;</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>&gt;</span>
  1229. <span class=keyword>bool</span> <span class=keyword>operator</span><span class=special>()(</span>
  1230. <span class=keyword>const</span> <span class=identifier>std</span><span class=special>::</span><span class=identifier>tuple</span><span class=special>&lt;</span><span class=identifier>Values</span><span class=special>...&gt;&amp;</span> <span class=identifier>x</span><span class=special>,</span>
  1231. <span class=keyword>const</span> <span class=identifier>composite_key_result</span><span class=special>&lt;</span><span class=identifier>CompositeKey</span><span class=special>&gt;&amp;</span> <span class=identifier>y</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  1232. <span class=keyword>template</span><span class=special>&lt;</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>&gt;</span>
  1233. <span class=keyword>bool</span> <span class=keyword>operator</span><span class=special>()(</span>
  1234. <span class=keyword>const</span> <span class=identifier>composite_key_result</span><span class=special>&lt;</span><span class=identifier>CompositeKey</span><span class=special>&gt;&amp;</span> <span class=identifier>x</span><span class=special>,</span>
  1235. <span class=keyword>const</span> <span class=identifier>boost</span><span class=special>::</span><span class=identifier>tuple</span><span class=special>&lt;</span><span class=identifier>Value0</span><span class=special>,...,</span><span class=identifier>Valuen</span><span class=special>&gt;&amp;</span> <span class=identifier>y</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  1236. <span class=keyword>template</span><span class=special>&lt;</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>&gt;</span>
  1237. <span class=keyword>bool</span> <span class=keyword>operator</span><span class=special>()(</span>
  1238. <span class=keyword>const</span> <span class=identifier>boost</span><span class=special>::</span><span class=identifier>tuple</span><span class=special>&lt;</span><span class=identifier>Value0</span><span class=special>,...,</span><span class=identifier>Valuen</span><span class=special>&gt;&amp;</span> <span class=identifier>x</span><span class=special>,</span>
  1239. <span class=keyword>const</span> <span class=identifier>composite_key_result</span><span class=special>&lt;</span><span class=identifier>CompositeKey</span><span class=special>&gt;&amp;</span> <span class=identifier>y</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  1240. <span class=keyword>template</span><span class=special>&lt;</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>&gt;</span>
  1241. <span class=keyword>bool</span> <span class=keyword>operator</span><span class=special>()(</span>
  1242. <span class=keyword>const</span> <span class=identifier>composite_key_result</span><span class=special>&lt;</span><span class=identifier>CompositeKey</span><span class=special>&gt;&amp;</span> <span class=identifier>x</span><span class=special>,</span><span class=keyword>const</span> <span class=identifier>Value</span><span class=special>&amp;</span> <span class=identifier>y</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  1243. <span class=keyword>template</span><span class=special>&lt;</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>&gt;</span>
  1244. <span class=keyword>bool</span> <span class=keyword>operator</span><span class=special>()(</span>
  1245. <span class=keyword>const</span> <span class=identifier>Value</span><span class=special>&amp;</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>&lt;</span><span class=identifier>CompositeKey</span><span class=special>&gt;&amp;</span> <span class=identifier>y</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  1246. <span class=special>};</span>
  1247. </pre></blockquote>
  1248. <p>
  1249. <code>Compare0</code>, ... , <code>Comparen</code> are the types of the comparison
  1250. binary predicates stored by <code>composite_key_compare</code>. Each of these predicates must be
  1251. <code>CopyConstructible</code> and <code>CopyAssignable</code>. At least a
  1252. comparison predicate must be provided. The maximum number of comparison predicates of
  1253. a <code>composite_key_compare</code> instantiation is implementation defined.
  1254. <code>composite_key_compare</code> is
  1255. <code>CopyConstructible</code> and <code>CopyAssignable</code>.
  1256. It is also
  1257. <code>DefaultConstructible</code>
  1258. if each <code>Comparei</code> is <code>DefaultConstructible</code> in its turn.
  1259. </p>
  1260. <p>
  1261. Note that formally it is not required that the <code>Comparei</code> types
  1262. behave as comparison predicates in any definite way. However, the
  1263. semantics of <code>composite_key_compare</code> is well defined if this
  1264. is the case, as explained in the section on the
  1265. <a href="#ckey_result_semantics">semantics of <code>composite_key_result</code></a>.
  1266. </p>
  1267. <h4>Notation</h4>
  1268. <p>
  1269. In what follows we use the same <a href="#ckey_result_notation">notation</a>
  1270. introduced for <code>composite_key_result</code>.
  1271. <h4><code>composite_key_compare</code> members</h4>
  1272. <code>composite_key_compare(<br>
  1273. &nbsp;&nbsp;const Compare0&amp; c0=Compare0(),<br>
  1274. &nbsp;&nbsp;...<br>
  1275. &nbsp;&nbsp;const Comparen&amp; cn=Comparen());
  1276. </code>
  1277. <blockquote>
  1278. <b>Effects:</b> Constructs a <code>composite_key_compare</code> that stores
  1279. copies of the comparison predicates supplied.
  1280. </blockquote>
  1281. <code>composite_key_compare(const key_comp_tuple&amp; x);</code>
  1282. <blockquote>
  1283. <b>Effects:</b> Constructs a <code>composite_key_compare</code> that stores
  1284. copies of the comparison predicate objects supplied in <code>x</code>.
  1285. </blockquote>
  1286. <code>const key_comp_tuple&amp; key_comps()const;</code>
  1287. <blockquote>
  1288. <b>Returns:</b> a constant reference to a tuple holding the
  1289. comparison predicate objects internally stored by the
  1290. <code>composite_key_compare</code>.
  1291. </blockquote>
  1292. <code>key_comp_tuple&amp; key_comps();</code>
  1293. <blockquote>
  1294. <b>Returns:</b> a reference to a tuple holding the
  1295. comparison predicate objects internally stored by the
  1296. <code>composite_key_compare</code>.
  1297. </blockquote>
  1298. <code>
  1299. template&lt;typename CompositeKey1,typename CompositeKey2><br>
  1300. bool operator()(<br>
  1301. &nbsp;&nbsp;const composite_key_result&lt;CompositeKey1> &amp; x,<br>
  1302. &nbsp;&nbsp;const composite_key_result&lt;CompositeKey2> &amp; y)const;<br>
  1303. template&lt;typename CompositeKey,typename... Values><br>
  1304. bool operator()(<br>
  1305. &nbsp;&nbsp;const composite_key_result&lt;CompositeKey>&amp; x,<br>
  1306. &nbsp;&nbsp;const std::tuple&lt;Values...>&amp; y)const;<br>
  1307. template&lt;typename CompositeKey,typename... Values><br>
  1308. bool operator()(<br>
  1309. &nbsp;&nbsp;const std::tuple&lt;Values...>&amp; x,<br>
  1310. &nbsp;&nbsp;const composite_key_result&lt;CompositeKey>&amp; y)const;<br>
  1311. template&lt;typename CompositeKey,typename Value0,...,typename Valuen><br>
  1312. bool operator()(<br>
  1313. &nbsp;&nbsp;const composite_key_result&lt;CompositeKey>&amp; x,<br>
  1314. &nbsp;&nbsp;const boost::tuple&lt;Value0,...,Valuen>&amp; y)const;<br>
  1315. template&lt;typename Value0,...,typename Valuen,typename CompositeKey><br>
  1316. bool operator()(<br>
  1317. &nbsp;&nbsp;const boost::tuple&lt;Value0,...,Valuen>&amp; x,<br>
  1318. &nbsp;&nbsp;const composite_key_result&lt;CompositeKey>&amp; y)const;<br>
  1319. </code>
  1320. <blockquote>
  1321. <b>Requires:</b> The expressions
  1322. <code>key_comps().get&lt;i>()(x<sub>i</sub>,y<sub>i</sub>)</code> and
  1323. <code>key_comps().get&lt;i>()(y<sub>i</sub>,x<sub>i</sub>)</code>
  1324. are valid for all <code>i</code>
  1325. in <code>[0,min(length(x),length(y)))</code>.<br>
  1326. <b>Returns:</b> <code>true</code> if and only if there exists some
  1327. <code>j</code> in the range <code>[0,min(length(x),length(y)))</code>
  1328. such that
  1329. <blockquote>
  1330. <code>!key_comps().get&lt;i>()(x<sub>i</sub>,y<sub>i</sub>) &amp;&amp; !key_comps().get&lt;i>()(y<sub>i</sub>,x<sub>i</sub>)</code>
  1331. for all <code>i</code> in <code>[0,j)</code>,<br>
  1332. <code>&nbsp;key_comps().get&lt;j>()(x<sub>j</sub>,y<sub>j</sub>)</code>.
  1333. </blockquote>
  1334. <b>Complexity:</b> No more key extraction operations and comparisons
  1335. are performed than those necessary for the evaluation of the expression above,
  1336. starting at <code>i==0</code>. The evaluation is short-circuited as soon as
  1337. the result is determined to be <code>false</code>.
  1338. </blockquote>
  1339. <code>
  1340. template&lt;typename CompositeKey,typename Value&gt;<br>
  1341. bool operator()(<br>
  1342. &nbsp;&nbsp;const composite_key_result&lt;CompositeKey&gt;&amp; x,const Value&amp; y)const;
  1343. </code>
  1344. <blockquote>
  1345. <b>Effects:</b>
  1346. <blockquote><pre>
  1347. <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>
  1348. </pre></blockquote><br>
  1349. </blockquote>
  1350. <code>
  1351. template&lt;typename Value,typename CompositeKey&gt;<br>
  1352. bool operator()(<br>
  1353. &nbsp;&nbsp;const Value&amp; x,const composite_key_result&lt;CompositeKey&gt;&amp; y)const;
  1354. </code>
  1355. <blockquote>
  1356. <b>Effects:</b>
  1357. <blockquote><pre>
  1358. <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>
  1359. </pre></blockquote><br>
  1360. </blockquote>
  1361. <h4><a name="composite_key_result_less">Class template
  1362. <code>composite_key_result_less</code></a></h4>
  1363. <p>
  1364. Deprecated. Use <code>std::less&lt;CompositeKeyResult&gt;</code> instead.
  1365. </p>
  1366. <h4><a name="composite_key_result_greater">Class template
  1367. <code>composite_key_result_greater</code></a></h4>
  1368. <p>
  1369. Deprecated. Use <code>std::greater&lt;CompositeKeyResult&gt;</code> instead.
  1370. </p>
  1371. <h4><a name="less_composite_key_result">Specialization of <code>std::less</code> for
  1372. <code>composite_key</code> results</a></h4>
  1373. <p>
  1374. <code>std::less&lt;CompositeKeyResult></code>, with <code>CompositeKeyResult</code>
  1375. an instantiation of <code>composite_key_result</code>, behaves as a particularization of
  1376. <code>composite_key_compare</code> where all the comparison predicates supplied are
  1377. instantiations of <code>std::less</code>.
  1378. </p>
  1379. <blockquote><pre>
  1380. <span class=keyword>namespace</span> <span class=identifier>std</span><span class=special>{</span>
  1381. <span class=keyword>template</span><span class=special>&lt;</span><span class=keyword>typename</span> <span class=identifier>CompositeKey</span><span class=special>&gt;</span>
  1382. <span class=keyword>struct</span> <span class=identifier>less</span><span class=special>&lt;</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>&lt;</span><span class=identifier>CompositeKey</span><span class=special>&gt;</span> <span class=special>&gt;</span>
  1383. <span class=special>{</span>
  1384. <span class=keyword>typedef</span>
  1385. <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>&lt;</span>
  1386. <span class=identifier>CompositeKey</span><span class=special>&gt;</span> <span class=identifier>first_argument_type</span><span class=special>;</span>
  1387. <span class=keyword>typedef</span> <span class=identifier>first_argument_type</span> <span class=identifier>second_argument_type</span><span class=special>;</span>
  1388. <span class=keyword>typedef</span> <span class=keyword>bool</span> <span class=identifier>result_type</span><span class=special>;</span>
  1389. <span class=keyword>template</span><span class=special>&lt;</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>&gt;</span>
  1390. <span class=keyword>bool</span> <span class=keyword>operator</span><span class=special>()(</span>
  1391. <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>&lt;</span><span class=identifier>CompositeKey1</span><span class=special>&gt;</span> <span class=special>&amp;</span> <span class=identifier>x</span><span class=special>,</span>
  1392. <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>&lt;</span><span class=identifier>CompositeKey2</span><span class=special>&gt;</span> <span class=special>&amp;</span> <span class=identifier>y</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  1393. <span class=keyword>template</span><span class=special>&lt;</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>&gt;</span>
  1394. <span class=keyword>bool</span> <span class=keyword>operator</span><span class=special>()(</span>
  1395. <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>&lt;</span><span class=identifier>CompositeKey</span><span class=special>&gt;&amp;</span> <span class=identifier>x</span><span class=special>,</span>
  1396. <span class=keyword>const</span> <span class=identifier>std</span><span class=special>::</span><span class=identifier>tuple</span><span class=special>&lt;</span><span class=identifier>Values</span><span class=special>...&gt;&amp;</span> <span class=identifier>y</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  1397. <span class=keyword>template</span><span class=special>&lt;</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>&gt;</span>
  1398. <span class=keyword>bool</span> <span class=keyword>operator</span><span class=special>()(</span>
  1399. <span class=keyword>const</span> <span class=identifier>std</span><span class=special>::</span><span class=identifier>tuple</span><span class=special>&lt;</span><span class=identifier>Values</span><span class=special>...&gt;&amp;</span> <span class=identifier>x</span><span class=special>,</span>
  1400. <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>&lt;</span><span class=identifier>CompositeKey</span><span class=special>&gt;&amp;</span> <span class=identifier>y</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  1401. <span class=keyword>template</span><span class=special>&lt;</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>&gt;</span>
  1402. <span class=keyword>bool</span> <span class=keyword>operator</span><span class=special>()(</span>
  1403. <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>&lt;</span><span class=identifier>CompositeKey</span><span class=special>&gt;&amp;</span> <span class=identifier>x</span><span class=special>,</span>
  1404. <span class=keyword>const</span> <span class=identifier>boost</span><span class=special>::</span><span class=identifier>tuple</span><span class=special>&lt;</span><span class=identifier>Value0</span><span class=special>,...,</span><span class=identifier>Valuen</span><span class=special>&gt;&amp;</span> <span class=identifier>y</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  1405. <span class=keyword>template</span><span class=special>&lt;</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>&gt;</span>
  1406. <span class=keyword>bool</span> <span class=keyword>operator</span><span class=special>()(</span>
  1407. <span class=keyword>const</span> <span class=identifier>boost</span><span class=special>::</span><span class=identifier>tuple</span><span class=special>&lt;</span><span class=identifier>Value0</span><span class=special>,...,</span><span class=identifier>Valuen</span><span class=special>&gt;&amp;</span> <span class=identifier>x</span><span class=special>,</span>
  1408. <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>&lt;</span><span class=identifier>CompositeKey</span><span class=special>&gt;&amp;</span> <span class=identifier>y</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  1409. <span class=keyword>template</span><span class=special>&lt;</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>&gt;</span>
  1410. <span class=keyword>bool</span> <span class=keyword>operator</span><span class=special>()(</span>
  1411. <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>&lt;</span><span class=identifier>CompositeKey</span><span class=special>&gt;&amp;</span> <span class=identifier>x</span><span class=special>,</span>
  1412. <span class=keyword>const</span> <span class=identifier>Value</span><span class=special>&amp;</span> <span class=identifier>y</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  1413. <span class=keyword>template</span><span class=special>&lt;</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>&gt;</span>
  1414. <span class=keyword>bool</span> <span class=keyword>operator</span><span class=special>()(</span>
  1415. <span class=keyword>const</span> <span class=identifier>Value</span><span class=special>&amp;</span> <span class=identifier>x</span><span class=special>,</span>
  1416. <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>&lt;</span><span class=identifier>CompositeKey</span><span class=special>&gt;&amp;</span> <span class=identifier>y</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  1417. <span class=special>};</span>
  1418. <span class=special>}</span> <span class=comment>// namespace std</span>
  1419. </pre></blockquote>
  1420. <p>
  1421. <code>CompositeKeyResult</code> must be an instantiation of
  1422. <code>composite_key_result</code> for some type
  1423. <code>composite_key&lt;KeyFromValue0,...,KeyFromValuen></code>.
  1424. <code>std::less&lt;CompositeKeyResult>::operator()</code> is
  1425. then equivalent to
  1426. <code>composite_key_compare&lt;Compare0,...,Comparen>::operator()</code>, taking
  1427. <blockquote>
  1428. <code>Comparei = std::less&lt;KeyFromValuei::result_type></code> for all
  1429. <code>i = 0,...,n</code>.
  1430. </blockquote>
  1431. </p>
  1432. <p>
  1433. In addition to the requirements on <code>Comparei</code> imposed by
  1434. <code>composite_key_compare</code>, each of these types must be
  1435. <code>DefaultConstructible</code>. <code>std::less&lt;CompositeKeyResult></code>
  1436. is <code>CopyConstructible</code>, <code>CopyConstructible</code>
  1437. and <code>CopyAssignable</code>.
  1438. </p>
  1439. <h4><a name="greater_composite_key_result">Specialization of <code>std::greater</code> for
  1440. <code>composite_key</code> results</a></h4>
  1441. <p>
  1442. <code>std::greater&lt;CompositeKeyResult></code>, with <code>CompositeKeyResult</code>
  1443. an instantiation of <code>composite_key_result</code>, behaves as a particularization of
  1444. <code>composite_key_compare</code> where all the comparison predicates supplied
  1445. are instantiations of <code>std::greater</code>.
  1446. </p>
  1447. <blockquote><pre>
  1448. <span class=keyword>namespace</span> <span class=identifier>std</span><span class=special>{</span>
  1449. <span class=keyword>template</span><span class=special>&lt;</span><span class=keyword>typename</span> <span class=identifier>CompositeKey</span><span class=special>&gt;</span>
  1450. <span class=keyword>struct</span> <span class=identifier>greater</span><span class=special>&lt;</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>&lt;</span><span class=identifier>CompositeKey</span><span class=special>&gt;</span> <span class=special>&gt;</span>
  1451. <span class=special>{</span>
  1452. <span class=keyword>typedef</span>
  1453. <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>&lt;</span>
  1454. <span class=identifier>CompositeKey</span><span class=special>&gt;</span> <span class=identifier>first_argument_type</span><span class=special>;</span>
  1455. <span class=keyword>typedef</span> <span class=identifier>first_argument_type</span> <span class=identifier>second_argument_type</span><span class=special>;</span>
  1456. <span class=keyword>typedef</span> <span class=keyword>bool</span> <span class=identifier>result_type</span><span class=special>;</span>
  1457. <span class=keyword>template</span><span class=special>&lt;</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>&gt;</span>
  1458. <span class=keyword>bool</span> <span class=keyword>operator</span><span class=special>()(</span>
  1459. <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>&lt;</span><span class=identifier>CompositeKey1</span><span class=special>&gt;</span> <span class=special>&amp;</span> <span class=identifier>x</span><span class=special>,</span>
  1460. <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>&lt;</span><span class=identifier>CompositeKey2</span><span class=special>&gt;</span> <span class=special>&amp;</span> <span class=identifier>y</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  1461. <span class=keyword>template</span><span class=special>&lt;</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>&gt;</span>
  1462. <span class=keyword>bool</span> <span class=keyword>operator</span><span class=special>()(</span>
  1463. <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>&lt;</span><span class=identifier>CompositeKey</span><span class=special>&gt;&amp;</span> <span class=identifier>x</span><span class=special>,</span>
  1464. <span class=keyword>const</span> <span class=identifier>std</span><span class=special>::</span><span class=identifier>tuple</span><span class=special>&lt;</span><span class=identifier>Values</span><span class=special>...&gt;&amp;</span> <span class=identifier>y</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  1465. <span class=keyword>template</span><span class=special>&lt;</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>&gt;</span>
  1466. <span class=keyword>bool</span> <span class=keyword>operator</span><span class=special>()(</span>
  1467. <span class=keyword>const</span> <span class=identifier>std</span><span class=special>::</span><span class=identifier>tuple</span><span class=special>&lt;</span><span class=identifier>Values</span><span class=special>...&gt;&amp;</span> <span class=identifier>x</span><span class=special>,</span>
  1468. <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>&lt;</span><span class=identifier>CompositeKey</span><span class=special>&gt;&amp;</span> <span class=identifier>y</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  1469. <span class=keyword>template</span><span class=special>&lt;</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>&gt;</span>
  1470. <span class=keyword>bool</span> <span class=keyword>operator</span><span class=special>()(</span>
  1471. <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>&lt;</span><span class=identifier>CompositeKey</span><span class=special>&gt;&amp;</span> <span class=identifier>x</span><span class=special>,</span>
  1472. <span class=keyword>const</span> <span class=identifier>boost</span><span class=special>::</span><span class=identifier>tuple</span><span class=special>&lt;</span><span class=identifier>Value0</span><span class=special>,...,</span><span class=identifier>Valuen</span><span class=special>&gt;&amp;</span> <span class=identifier>y</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  1473. <span class=keyword>template</span><span class=special>&lt;</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>&gt;</span>
  1474. <span class=keyword>bool</span> <span class=keyword>operator</span><span class=special>()(</span>
  1475. <span class=keyword>const</span> <span class=identifier>boost</span><span class=special>::</span><span class=identifier>tuple</span><span class=special>&lt;</span><span class=identifier>Value0</span><span class=special>,...,</span><span class=identifier>Valuen</span><span class=special>&gt;&amp;</span> <span class=identifier>x</span><span class=special>,</span>
  1476. <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>&lt;</span><span class=identifier>CompositeKey</span><span class=special>&gt;&amp;</span> <span class=identifier>y</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  1477. <span class=keyword>template</span><span class=special>&lt;</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>&gt;</span>
  1478. <span class=keyword>bool</span> <span class=keyword>operator</span><span class=special>()(</span>
  1479. <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>&lt;</span><span class=identifier>CompositeKey</span><span class=special>&gt;&amp;</span> <span class=identifier>x</span><span class=special>,</span>
  1480. <span class=keyword>const</span> <span class=identifier>Value</span><span class=special>&amp;</span> <span class=identifier>y</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  1481. <span class=keyword>template</span><span class=special>&lt;</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>&gt;</span>
  1482. <span class=keyword>bool</span> <span class=keyword>operator</span><span class=special>()(</span>
  1483. <span class=keyword>const</span> <span class=identifier>Value</span><span class=special>&amp;</span> <span class=identifier>x</span><span class=special>,</span>
  1484. <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>&lt;</span><span class=identifier>CompositeKey</span><span class=special>&gt;&amp;</span> <span class=identifier>y</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  1485. <span class=special>};</span>
  1486. <span class=special>}</span> <span class=comment>// namespace std</span>
  1487. </pre></blockquote>
  1488. <p>
  1489. <code>CompositeKeyResult</code> must be an instantiation of
  1490. <code>composite_key_result</code> for some type
  1491. <code>composite_key&lt;KeyFromValue0,...,KeyFromValuen></code>.
  1492. <code>std::greater&lt;CompositeKeyResult>::operator()</code> is
  1493. then equivalent to
  1494. <code>composite_key_compare&lt;Compare0,...,Comparen>::operator()</code>, taking
  1495. <blockquote>
  1496. <code>Comparei = std::greater&lt;KeyFromValuei::result_type></code> for all
  1497. <code>i = 0,...,n</code>.
  1498. </blockquote>
  1499. </p>
  1500. <p>
  1501. In addition to the requirements on <code>Comparei</code> imposed by
  1502. <code>composite_key_compare</code>, each of these types must be
  1503. <code>DefaultConstructible</code>. <code>std::greater&lt;CompositeKeyResult></code>
  1504. is <code>CopyConstructible</code>, <code>CopyConstructible</code>
  1505. and <code>CopyAssignable</code>.
  1506. </p>
  1507. <h3><a name="ckey_result_hashing">Hashing</a></h3>
  1508. <h4><a name="composite_key_hash">Class template
  1509. <code>composite_key_hash</code></a></h4>
  1510. <p>
  1511. <code>composite_key_hash</code> produces hash values for <code>composite_key_result</code>
  1512. instantiations based on a collection of elementary hash functors.
  1513. </p>
  1514. <blockquote><pre>
  1515. <span class=keyword>template</span><span class=special>&lt;</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>&gt;</span>
  1516. <span class=keyword>struct</span> <span class=identifier>composite_key_hash</span>
  1517. <span class=special>{</span>
  1518. <span class=keyword>typedef</span> <span class=identifier>boost</span><span class=special>::</span><span class=identifier>tuple</span><span class=special>&lt;</span><span class=identifier>Hash0</span><span class=special>,...,</span><span class=identifier>Hashn</span><span class=special>&gt;</span> <span class=identifier>key_hasher_tuple</span><span class=special>;</span>
  1519. <span class=identifier>composite_key_hash</span><span class=special>(</span>
  1520. <span class=keyword>const</span> <span class=identifier>Hash0</span><span class=special>&amp;</span> <span class=identifier>h0</span><span class=special>=</span><span class=identifier>Hash0</span><span class=special>(),</span>
  1521. <span class=special>...</span>
  1522. <span class=keyword>const</span> <span class=identifier>Hashn</span><span class=special>&amp;</span> <span class=identifier>hn</span><span class=special>=</span><span class=identifier>Hashn</span><span class=special>());</span>
  1523. <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>&amp;</span> <span class=identifier>x</span><span class=special>);</span>
  1524. <span class=keyword>const</span> <span class=identifier>key_hasher_tuple</span><span class=special>&amp;</span> <span class=identifier>key_hash_functions</span><span class=special>()</span><span class=keyword>const</span><span class=special>;</span>
  1525. <span class=identifier>key_hasher_tuple</span><span class=special>&amp;</span> <span class=identifier>key_hash_functions</span><span class=special>()</span><span class=special>;</span>
  1526. <span class=keyword>template</span><span class=special>&lt;</span><span class=keyword>typename</span> <span class=identifier>CompositeKey</span><span class=special>&gt;</span>
  1527. <span class=identifier>std</span><span class=special>::</span><span class=identifier>size_t</span> <span class=keyword>operator</span><span class=special>()(</span>
  1528. <span class=keyword>const</span> <span class=identifier>composite_key_result</span><span class=special>&lt;</span><span class=identifier>CompositeKey</span><span class=special>&gt;&amp;</span> <span class=identifier>x</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  1529. <span class=keyword>template</span><span class=special>&lt;</span><span class=keyword>typename</span><span class=special>...</span> <span class=identifier>Values</span><span class=special>&gt;</span>
  1530. <span class=identifier>std</span><span class=special>::</span><span class=identifier>size_t</span> <span class=keyword>operator</span><span class=special>()(</span>
  1531. <span class=keyword>const</span> <span class=identifier>std</span><span class=special>::</span><span class=identifier>tuple</span><span class=special>&lt;</span><span class=identifier>Values</span><span class=special>...&gt;&amp;</span> <span class=identifier>x</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  1532. <span class=keyword>template</span><span class=special>&lt;</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>&gt;</span>
  1533. <span class=identifier>std</span><span class=special>::</span><span class=identifier>size_t</span> <span class=keyword>operator</span><span class=special>()(</span>
  1534. <span class=keyword>const</span> <span class=identifier>boost</span><span class=special>::</span><span class=identifier>tuple</span><span class=special>&lt;</span><span class=identifier>Value0</span><span class=special>,...,</span><span class=identifier>Valuen</span><span class=special>&gt;&amp;</span> <span class=identifier>x</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  1535. <span class=special>};</span>
  1536. </pre></blockquote>
  1537. <p>
  1538. <code>Hash0</code>, ... , <code>Hashn</code> are the types of the hash unary function objects
  1539. stored by <code>composite_key_hash</code>. Each of these objects
  1540. must be <code>CopyConstructible</code> and <code>CopyAssignable</code>
  1541. and return a value of type <code>std::size_t</code> in the range
  1542. [0, <code>std::numeric_limits&lt;std::size_t&gt;::max())</code>).
  1543. At least a hash functor must be provided. The maximum number of hash functors of
  1544. a <code>composite_key_hash</code> instantiation is implementation defined.
  1545. <code>composite_key_hash</code> is
  1546. <code>CopyConstructible</code> and <code>CopyAssignable</code>.
  1547. It is also <code>DefaultConstructible</code>
  1548. if each <code>Hashi</code> is <code>DefaultConstructible</code> in its turn.
  1549. </p>
  1550. <h4>Notation</h4>
  1551. <p>
  1552. In what follows we use the same <a href="#ckey_result_notation">notation</a>
  1553. introduced for <code>composite_key_result</code>.
  1554. <h4><code>composite_key_hash</code> members</h4>
  1555. <code>composite_key_hash(<br>
  1556. &nbsp;&nbsp;const Hash0&amp; h0=Hash0(),<br>
  1557. &nbsp;&nbsp;...<br>
  1558. &nbsp;&nbsp;const Hashn&amp; hn=Hashn());
  1559. </code>
  1560. <blockquote>
  1561. <b>Effects:</b> Constructs a <code>composite_key_hash</code> that stores
  1562. copies of the hash functors supplied.
  1563. </blockquote>
  1564. <code>composite_key_hash(const key_hasher_tuple&amp; x);</code>
  1565. <blockquote>
  1566. <b>Effects:</b> Constructs a <code>composite_key_hash</code> that stores
  1567. copies of the hash functors supplied in <code>x</code>.
  1568. </blockquote>
  1569. <code>const key_hasher_tuple&amp; key_hash_functions()const;</code>
  1570. <blockquote>
  1571. <b>Returns:</b> a constant reference to a tuple holding the
  1572. hash functors internally stored by the
  1573. <code>composite_key_hash</code>.
  1574. </blockquote>
  1575. <code>key_hasher_tuple&amp; key_hash_functions();</code>
  1576. <blockquote>
  1577. <b>Returns:</b> a reference to a tuple holding the
  1578. hash functors internally stored by the
  1579. <code>composite_key_hash</code>.
  1580. </blockquote>
  1581. <code>
  1582. template&lt;typename CompositeKey><br>
  1583. bool operator()(<br>
  1584. &nbsp;&nbsp;const composite_key_result&lt;CompositeKey>&amp; x)const;<br>
  1585. template&lt;typename... Values><br>
  1586. bool operator()(<br>
  1587. &nbsp;&nbsp;const std::tuple&lt;Values...>&amp; x)const;<br>
  1588. template&lt;typename Value0,...,typename Valuen><br>
  1589. bool operator()(<br>
  1590. &nbsp;&nbsp;const boost::tuple&lt;Value0,...,Valuen>&amp; x)const;
  1591. </code>
  1592. <blockquote>
  1593. <b>Requires:</b> <code>length(x)==length(key_hash_functions())</code>.
  1594. The expression
  1595. <code>key_hash_functions().get&lt;i>()(x<sub>i</sub>)</code>
  1596. is valid for all <code>i</code> in <code>[0,length(x))</code>.
  1597. <br>
  1598. <b>Returns:</b> A value in the range
  1599. <code>[0, std::numeric_limits&lt;std::size_t&gt;::max())</code> that
  1600. solely depends on the numerical tuple
  1601. <blockquote>
  1602. (<code>key_hash_functions().get&lt;0>()(x<sub>0</sub>)</code>, ... ,
  1603. <code>key_hash_functions().get&lt;N>()(x<sub>N</sub>)</code>),
  1604. with <code>N=length(x)-1</code>.
  1605. </blockquote>
  1606. </blockquote>
  1607. <h4><a name="composite_key_result_hash">Class template
  1608. <code>composite_key_result_hash</code></a></h4>
  1609. <p>
  1610. Deprecated. Use <code>boost::hash&lt;CompositeKeyResult&gt;</code> instead.
  1611. </p>
  1612. <h4><a name="hash_composite_key_result">Specialization of
  1613. <a href="../../../functional/hash/index.html"><code>boost::hash</code></a>
  1614. for <code>composite_key</code> results</a></h4>
  1615. <p>
  1616. <code>boost::hash&lt;CompositeKeyResult></code>, with <code>CompositeKeyResult</code>
  1617. an instantiation of <code>composite_key_result</code>, behaves as a particularization of
  1618. <code>composite_key_hash</code> where all the hash functors supplied
  1619. are instantiations of
  1620. <a href="../../../functional/hash/index.html"><code>boost::hash</code></a>.
  1621. </p>
  1622. <blockquote><pre>
  1623. <span class=keyword>namespace</span> <span class=identifier>boost</span><span class=special>{</span>
  1624. <span class=keyword>template</span><span class=special>&lt;</span><span class=keyword>typename</span> <span class=identifier>CompositeKey</span><span class=special>&gt;</span>
  1625. <span class=keyword>struct</span> <span class=identifier>hash</span><span class=special>&lt;</span><span class=identifier>multi_index</span><span class=special>::</span><span class=identifier>composite_key_result</span><span class=special>&lt;</span><span class=identifier>CompositeKey</span><span class=special>&gt;</span> <span class=special>&gt;</span>
  1626. <span class=special>{</span>
  1627. <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>&lt;</span><span class=identifier>CompositeKey</span><span class=special>&gt;</span> <span class=identifier>argument_type</span><span class=special>;</span>
  1628. <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>
  1629. <span class=keyword>template</span><span class=special>&lt;</span><span class=keyword>typename</span> <span class=identifier>CompositeKey</span><span class=special>&gt;</span>
  1630. <span class=identifier>std</span><span class=special>::</span><span class=identifier>size_t</span> <span class=keyword>operator</span><span class=special>()(</span>
  1631. <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>&lt;</span><span class=identifier>CompositeKey</span><span class=special>&gt;&amp;</span> <span class=identifier>x</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  1632. <span class=keyword>template</span><span class=special>&lt;</span><span class=keyword>typename</span><span class=special>...</span> <span class=identifier>Values</span><span class=special>&gt;</span>
  1633. <span class=identifier>std</span><span class=special>::</span><span class=identifier>size_t</span> <span class=keyword>operator</span><span class=special>()(</span>
  1634. <span class=keyword>const</span> <span class=identifier>std</span><span class=special>::</span><span class=identifier>tuple</span><span class=special>&lt;</span><span class=identifier>Values</span><span class=special>...&gt;&amp;</span> <span class=identifier>x</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  1635. <span class=keyword>template</span><span class=special>&lt;</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>&gt;</span>
  1636. <span class=identifier>std</span><span class=special>::</span><span class=identifier>size_t</span> <span class=keyword>operator</span><span class=special>()(</span>
  1637. <span class=keyword>const</span> <span class=identifier>boost</span><span class=special>::</span><span class=identifier>tuple</span><span class=special>&lt;</span><span class=identifier>Value0</span><span class=special>,...,</span><span class=identifier>Valuen</span><span class=special>&gt;&amp;</span> <span class=identifier>x</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  1638. <span class=special>};</span>
  1639. <span class=special>}</span> <span class=comment>// namespace boost</span>
  1640. </pre></blockquote>
  1641. <p>
  1642. <code>CompositeKeyResult</code> must be an instantiation of
  1643. <code>composite_key_result</code> for some type
  1644. <code>composite_key&lt;KeyFromValue0,...,KeyFromValuen></code>.
  1645. <code>boost::hash&lt;CompositeKeyResult>::operator()</code> is
  1646. then equivalent to
  1647. <code>composite_key_hash&lt;Hash0,...,Hashn>::operator()</code>, taking
  1648. <blockquote>
  1649. <code>Hashi = boost::hash&lt;KeyFromValuei::result_type></code> for all
  1650. <code>i = 0,...,n</code>.
  1651. </blockquote>
  1652. </p>
  1653. <p>
  1654. In addition to the requirements on <code>Hashi</code> imposed by
  1655. <code>composite_key_hash</code>, each of these types must be
  1656. <code>DefaultConstructible</code>. <code>boost::hash&lt;CompositeKeyResult></code> is
  1657. <code>DefaultConstructible</code>, <code>CopyConstructible</code>
  1658. and <code>CopyAssignable</code>.
  1659. </p>
  1660. <h3><a name="ckey_result_semantics">Semantics of
  1661. <code>composite_key_result</code></a></h3>
  1662. <p>
  1663. The design of equality, comparison and hash operations for
  1664. <code>composite_key_result</code> objects is based on the following rationale:
  1665. a <code>composite_key_result</code> is regarded as a "virtual" tuple, each
  1666. of its elements being the result of the corresponding elementary
  1667. key extractor. Accordingly, any given operation resolves to a
  1668. combination of the corresponding elementwise operations.
  1669. This mapping preserves the fundamental properties of the elementary operations
  1670. involved; for instance, it defines a true equivalence relation if the
  1671. basic predicates induce equivalence relations themselves.
  1672. We can state these facts in a formal way as follows.
  1673. </p>
  1674. <p>
  1675. Consider an instantiation of <code>composite_key_equal_to</code>
  1676. with types <code>Pred0</code>, ... , <code>Predn</code> such that each
  1677. <code>Predi</code> induces an equivalence relation on a certain type <code>Ti</code>,
  1678. and let <code>CompositeKey</code> be a type of the form
  1679. <code>composite_key&lt;Value,KeyFromValue0,...,KeyFromValuej></code>,
  1680. with <code>j &lt;= n</code>, such that
  1681. <blockquote>
  1682. <code>KeyFromValuei::result_type = Ti</code>, for all <code>i = 0,...,j</code>.
  1683. </blockquote>
  1684. Then, <code>composite_key_equal_to</code> induces an equivalence relation
  1685. on elements of type <code>composite_key_result&lt;CompositeKey></code>;
  1686. such two objects are equivalent if all its elementary key extractor values
  1687. are also equivalent. Additionally, given an instantiation
  1688. <code>composite_key_hash&lt;Hash0,...,Hashj></code>, the following types are
  1689. <a href="hash_indices.html#lookup"><code>Compatible Keys</code></a> of
  1690. (<code>composite_key_hash</code>, <code>composite_key_equal_to</code>)
  1691. with respect to <code>composite_key_result&lt;CompositeKey></code>:
  1692. <blockquote>
  1693. <code>tuple&lt;Q0,...,Qj></code>,<br>
  1694. <code>composite_key_result&lt;composite_key&lt;K0,...,Kj> ></code>, with
  1695. <code>Ki::result_type = Qi</code> for all <code>i = 0,...,j</code>.
  1696. </blockquote>
  1697. provided that each <code>Qi</code> is either <code>Ti</code> or a
  1698. <a href="hash_indices.html#lookup"><code>Compatible Key</code></a>
  1699. of (<code>Hashi</code>, <code>Predi</code>).</p>
  1700. <p>
  1701. As for comparison, consider an instantiation of <code>composite_key_compare</code>
  1702. with types <code>Compare0</code>, ... , <code>Comparen</code> such that each
  1703. <code>Comparei</code> induces a strict weak ordering
  1704. on the type <code>Ti</code>. Then, for a
  1705. <code>CompositeKey</code> type defined in the same manner as above,
  1706. <code>composite_key_compare</code> induces a strict weak ordering on elements of type
  1707. <code>composite_key_result&lt;CompositeKey></code>, and the order induced
  1708. is lexicographical. Also, the following types are
  1709. <a href="ord_indices.html#set_operations"><code>Compatible Keys</code></a> of
  1710. <code>composite_key_compare</code> with respect to
  1711. <code>composite_key_result&lt;CompositeKey></code>:
  1712. <blockquote>
  1713. <code>tuple&lt;Q0,...,Qk></code>, <code>k &lt;= n</code><br>
  1714. <code>composite_key_result&lt;composite_key&lt;K0,...,Kk> ></code>, with
  1715. <code>Ki::result_type = Qi</code> for all <code>i = 0,...,k</code>.
  1716. </blockquote>
  1717. provided that
  1718. <ul>
  1719. <li>for <code>i = 0,...,min(j,k)-1</code>, <code>Qi</code> is either <code>Ti</code>
  1720. or <i>not coarser</i> than <code>Ti</code> (<code>Qi</code> is a
  1721. <a href="ord_indices.html#set_operations"><code>Compatible Key</code></a>
  1722. of <code>Comparei</code> and there are no two distinct elements of
  1723. <code>Ti</code> equivalent to one single element of <code>Qi</code>);
  1724. </li>
  1725. <li>
  1726. <code>Qm</code> (with <code>m = min(j,k)</code>) is either <code>Tm</code> or a
  1727. <a href="ord_indices.html#set_operations"><code>Compatible Key</code></a>
  1728. of <code>Comparem</code>.
  1729. </li>
  1730. </ul>
  1731. In this case, the comparison is done
  1732. lexicographically only on the first <code>1+min(j,k)</code> elements.
  1733. </p>
  1734. <p>
  1735. Analogous properties hold for the equality and comparison operators
  1736. of <code>composite_key_result</code>. Note, however,
  1737. that equality is only defined for objects of the same length, whilst
  1738. comparison takes the minimum length of the operands considered.
  1739. Therefore, the equivalence classes induced by <code>x==y</code> are
  1740. subsets of those associated to <code>!(x&lt;y)&amp;&amp;!(y&lt;x)</code>.
  1741. </p>
  1742. <h2>
  1743. <a name="key_synopsis">Header
  1744. <a href="../../../../boost/multi_index/key.hpp">
  1745. <code>"boost/multi_index/key.hpp"</code></a> synopsis</a></h2>
  1746. <blockquote><pre>
  1747. <span class=preprocessor>#include</span> <span class=special>&lt;</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>&gt;</span>
  1748. <span class=preprocessor>#include</span> <span class=special>&lt;</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>&gt;</span>
  1749. <span class=preprocessor>#include</span> <span class=special>&lt;</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>&gt;</span>
  1750. <span class=preprocessor>#include</span> <span class=special>&lt;</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>&gt;</span>
  1751. <span class=preprocessor>#if</span> <b>implementation defined</b> <span class=comment>/* auto non-type template parameters supported */</span>
  1752. <span class=preprocessor>#define</span> <span class=identifier>BOOST_MULTI_INDEX_KEY_SUPPORTED</span>
  1753. <span class=keyword>namespace</span> <span class=identifier>boost</span><span class=special>{</span>
  1754. <span class=keyword>namespace</span> <span class=identifier>multi_index</span><span class=special>{</span>
  1755. <span class=keyword>template</span><span class=special>&lt;</span><span class=keyword>auto</span><span class=special>...</span> <span class=identifier>Keys</span><span class=special>&gt;</span>
  1756. <span class=keyword>using</span> <span class=identifier>key</span><span class=special>=</span><b>implementation defined</b><span class=special>;</span>
  1757. <span class=special>}</span> <span class=comment>/* namespace multi_index */</span>
  1758. <span class=special>}</span> <span class=comment>/* namespace boost */</span>
  1759. <span class=preprocessor>#endif</span>
  1760. </pre></blockquote>
  1761. <h3><a name="key">Alias template <code>key</code></a></h3>
  1762. <p>
  1763. In C++17 compliant environments, <code>key</code> provides a very terse syntax for
  1764. the specification of Boost.MultiIndex predefined key extractors. The number of template
  1765. arguments passed to <code>key</code> must be greater than zero and not exceed the
  1766. maximum number of key extractors accepted by
  1767. <a href="#composite_key"><code>composite_key</code></a>. <code>key&lt;Key&gt;</code>
  1768. resolves to:
  1769. <ul>
  1770. <li><a href="#member"><code>member&lt;Class,Type,Key&gt;</code></a>
  1771. if <code>Key</code> is of type <code>Type Class::*</code>,
  1772. </li>
  1773. <li><a href="#const_mem_fun"><code>const_mem_fun&lt;Class,Type,Key&gt;</code></a>
  1774. if <code>Key</code> is of type <code>Type (Class::*)()const</code>
  1775. (with ot without <code>noexcept</code>-specification),
  1776. </li>
  1777. <li><a href="#cv_mem_fun"><code>cv_mem_fun&lt;Class,Type,Key&gt;</code></a>
  1778. if <code>Key</code> is of type <code>Type (Class::*)()const volatile</code>
  1779. (with ot without <code>noexcept</code>-specification),
  1780. </li>
  1781. <li><a href="#cv_mem_fun"><code>cref_mem_fun&lt;Class,Type,Key&gt;</code></a>
  1782. if <code>Key</code> is of type <code>Type (Class::*)()const&amp;</code>
  1783. (with ot without <code>noexcept</code>-specification),
  1784. </li>
  1785. <li><a href="#cv_mem_fun"><code>cvref_mem_fun&lt;Class,Type,Key&gt;</code></a>
  1786. if <code>Key</code> is of type <code>Type (Class::*)()const volatile&amp;</code>
  1787. (with ot without <code>noexcept</code>-specification),
  1788. </li>
  1789. <li><a href="#mem_fun"><code>mem_fun&lt;Class,Type,Key&gt;</code></a>
  1790. if <code>Key</code> is of type <code>Type (Class::*)()</code>
  1791. (with ot without <code>noexcept</code>-specification),
  1792. </li>
  1793. <li><a href="#volatile_mem_fun"><code>volatile_mem_fun&lt;Class,Type,Key&gt;</code></a>
  1794. if <code>Key</code> is of type <code>Type (Class::*)()volatile</code>
  1795. (with ot without <code>noexcept</code>-specification),
  1796. </li>
  1797. <li><a href="#volatile_mem_fun"><code>ref_mem_fun&lt;Class,Type,Key&gt;</code></a>
  1798. if <code>Key</code> is of type <code>Type (Class::*)()&amp;</code>
  1799. (with ot without <code>noexcept</code>-specification),
  1800. </li>
  1801. <li><a href="#volatile_mem_fun"><code>vref_mem_fun&lt;Class,Type,Key&gt;</code></a>
  1802. if <code>Key</code> is of type <code>Type (Class::*)()volatile&amp;</code>
  1803. (with ot without <code>noexcept</code>-specification),
  1804. </li>
  1805. <li><a href="#global_fun"><code>global_fun&lt;Value,Type,Key&gt;</code></a>
  1806. if <code>Key</code> is of type <code>Type (*)(Value)</code>
  1807. (with ot without <code>noexcept</code>-specification),
  1808. </li>
  1809. </ul>
  1810. and engenders undefined behavior otherwise. When passed two or more arguments,
  1811. <code>key&lt;Key0,...,Keyn&gt;</code> resolves to
  1812. <a href="#composite_key"><code>composite_key&lt;Value,KeyFromValue0,...,KeyFromValuen&gt;</code></a>,
  1813. with:
  1814. <ul>
  1815. <li><code>KeyFromValuei</code> = <code>key&lt;Keyi&gt;</code>
  1816. for all <code>i = 0,...,n</code>
  1817. </li>
  1818. <li><code>Value</code> = <code>std::decay_t&lt;Value0&gt;</code> &#8855;
  1819. <code>std::decay_t&lt;Value1&gt;</code> &#8855; &middot;&middot;&middot; &#8855;
  1820. <code>std::decay_t&lt;Valuen&gt;</code>,
  1821. </li>
  1822. </ul>
  1823. where <code>Valuei</code> corresponds to the associated <code>Class</code> or <code>Value</code>
  1824. type of <code>KeyFromValuei</code>, and <code>T</code> &#8855; <code>Q</code>
  1825. is the <i>least generic type</i> between <code>T</code> and <code>Q</code>, defined as
  1826. <code>T</code> if <code>std::is_convertible_v&lt;const T&amp;,const Q&amp;&gt;</code>,
  1827. <code>Q</code> if <code>std::is_convertible_v&lt;const Q&amp;,const T&amp;&gt;</code>,
  1828. and undefined otherwise.
  1829. </p>
  1830. <hr>
  1831. <div class="prev_link"><a href="rnd_indices.html"><img src="../prev.gif" alt="random access indices" border="0"><br>
  1832. Random access indices
  1833. </a></div>
  1834. <div class="up_link"><a href="index.html"><img src="../up.gif" alt="Boost.MultiIndex reference" border="0"><br>
  1835. Boost.MultiIndex reference
  1836. </a></div>
  1837. <div class="next_link"><a href="../compiler_specifics.html"><img src="../next.gif" alt="compiler specifics" border="0"><br>
  1838. Compiler specifics
  1839. </a></div><br clear="all" style="clear: all;">
  1840. <br>
  1841. <p>Revised June 9th 2019</p>
  1842. <p>&copy; Copyright 2003-2019 Joaqu&iacute;n M L&oacute;pez Mu&ntilde;oz.
  1843. Distributed under the Boost Software
  1844. License, Version 1.0. (See accompanying file <a href="../../../../LICENSE_1_0.txt">
  1845. LICENSE_1_0.txt</a> or copy at <a href="http://www.boost.org/LICENSE_1_0.txt">
  1846. http://www.boost.org/LICENSE_1_0.txt</a>)
  1847. </p>
  1848. </body>
  1849. </html>