index.html 143 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
  5. <title>Boost.Assignment Documentation </title>
  6. <link rel="stylesheet" href="style.css" type="text/css">
  7. </head>
  8. <body>
  9. <table border="0" >
  10. <tr>
  11. <td ><img src="../../../boost.png" border="0" ></td>
  12. <td >
  13. <h1 align="center">Assignment Library</h1>
  14. </td>
  15. </tr>
  16. </table>
  17. <p>
  18. Copyright © 2003-2006 Thorsten Ottosen
  19. </p>
  20. <p>
  21. Use, modification and distribution is subject to the Boost Software License, Version 1.0
  22. (see <a href="http://www.boost.org/LICENSE_1_0.txt">
  23. http://www.boost.org/LICENSE_1_0.txt</a>).
  24. </p>
  25. <h3>Table of Contents</h3>
  26. <ul>
  27. <li><a href="#intro">Introduction</a></li>
  28. <li>
  29. <a href="#tutorial" >Tutorial</a>
  30. <ul>
  31. <li>Function <a href="#operator+="><code>operator+=()</code></a>
  32. <li>Function <a href="#operator()"><code>operator()()</code></a>
  33. <li>Function <a href="#list_of"><code>list_of()</code></a>
  34. <li>Function <a href="#map_list_of"><code>map_list_of()</code></a>
  35. <li>Function <a href="#tuple_list_of"><code>tuple_list_of()</code></a>
  36. <li>Functions <a href="#repeat"><code>repeat()</code>, <code>repeat_fun()</code> and <code>range()</code> </a>
  37. <li>Functions <a href="#ref_list_of"><code>ref_list_of()</code> and <code>cref_list_of()</code></a>
  38. <li>A <a href="#complicated">"complicated"</a> example
  39. <li>Functions <a href="#ptr_push_back"><code>ptr_push_back(), ptr_push_front()</code>,
  40. <code>ptr_insert()</code> and <code>ptr_map_insert()</code></a>
  41. <li>Function <a href="#ptr_list_of"><code>ptr_list_of()</code></a>
  42. </ul> <li>
  43. <a href="#reference">Reference</a>
  44. <ul>
  45. <li><a href="#headers">Headers</a> </li>
  46. <li><a href="#std">Standard containers</a> </li>
  47. <li>Functions <a href="#list_of_ref"><code>list_of()</code> and <code>map_list_of()</code></a></li>
  48. <li>Functions <a href="#repeat_ref"><code>repeat()</code>,
  49. <code>repeat_fun()</code> and <code>range()</code> </a> </li>
  50. <li>Class <a href="#list_inserter"><code>list_inserter</code></a></li>
  51. <li>Function <a href="#make_list_inserter"><code>make_list_inserter()</code></a></li>
  52. <li><a href="#limit"> Customizing</a> argument list sizes</li>
  53. </ul>
  54. <li> <a href="#exceptions">Exceptions and exception-safety </a></li>
  55. <li> <a href="#extensions">Extending the library</a>
  56. <li> <a href="#boost_libs">Supported libraries </a>
  57. <li> <a href="#examples">Examples</a></li> <ul></ul>
  58. <li><a href="#portability">Portability</a></li>
  59. <li><a href="#history">History and Acknowledgment</a>
  60. <li><a href="#ref">References</a></li>
  61. </ul>
  62. <hr>
  63. <h2><a name="intro">Introduction</a></h2> <p> <i>There appear to be few
  64. practical uses of <code>operator,()</code></i>. <!-- p. 247 --> <br><b>Bjarne
  65. Stroustrup</b>, The Design and Evolution of C++ </p> <p> The purpose of this
  66. library is to make it easy to fill containers with data by overloading
  67. <code>operator,()</code> and <code>operator()()</code>. These two operators
  68. make it possible to construct lists of values that are then copied into a
  69. container: </p> <ul> <li> A comma-separated list: <p>
  70. <!-- vector< int > v; v += 1,2,3,4,5,6,7,8,9; -->
  71. <pre><span
  72. class=identifier>vector</span><span class=special><</span><span
  73. class=keyword>int</span><span class=special>></span><span
  74. class=identifier> v</span><span class=special>; </span>
  75. <span class=identifier>v </span><span class=special>+= </span><span
  76. class=number>1</span><span
  77. class=special>,</span><span class=number>2</span><span
  78. class=special>,</span><span class=number>3</span><span
  79. class=special>,</span><span class=number>4</span><span
  80. class=special>,</span><span class=number>5</span><span
  81. class=special>,</span><span class=number>6</span><span
  82. class=special>,</span><span class=number>7</span><span
  83. class=special>,</span><span class=number>8</span><span
  84. class=special>,</span><span class=number>9</span><span class=special>;</span></pre></p>
  85. <li> A parenthesis-separated list:
  86. <p>
  87. <pre>
  88. <span class=identifier>map</span><span class=special><</span><span
  89. class=identifier>string</span><span class=special>,</span><span class=keyword>int</span><span class=special>> </span><span class=identifier>m</span><span class=special>; </span>
  90. <span class=identifier>insert</span><span class=special>( </span><span class=identifier>m </span><span class=special>)( </span><span class=string>&quot;Bar&quot;</span><span class=special>, </span><span class=number>1 </span><span class=special>)( </span><span class=string>&quot;Foo&quot;</span><span class=special>, </span><span class=number>2 </span><span class=special>);</span></pre>
  91. </ul>
  92. <p>
  93. These lists are particularly useful in
  94. learning, testing, and prototyping situations, but can also be handy otherwise.
  95. The library comes with predefined operators for the containers of the
  96. standard library, but most functionality will work with any standard
  97. compliant container. The library also makes it possible to extend user
  98. defined types so for example a member function can be called for a list of
  99. values instead of its normal arguments. </p>
  100. <hr>
  101. <a name="tutorial"></a>
  102. <h2>Tutorial</h2>
  103. <p>
  104. Within two minutes you should be able to use this library. The main
  105. components are explained in these sections:
  106. <ul>
  107. <li>Function <a href="#operator+="><code>operator+=()</code></a>
  108. <li>Function <a href="#operator()"><code>operator()()</code></a>
  109. <li>Function <a href="#list_of"><code>list_of()</code></a>
  110. <li>Function <a href="#map_list_of"><code>map_list_of()</code></a>
  111. <li>Function <a href="#tuple_list_of"><code>tuple_list_of()</code></a>
  112. <li>Functions <a href="#repeat"><code>repeat()</code>, <code>repeat_fun()</code> and <code>range()</code> </a>
  113. <li>Functions <a href="#ref_list_of"><code>ref_list_of()</code> and <code>cref_list_of()</code></a>
  114. <li>A <a href="#complicated">"complicated"</a> example
  115. <li>Functions <a href="#ptr_push_back"><code>ptr_push_back(), ptr_push_front()</code>, <code>ptr_insert()</code> and <code>ptr_map_insert()</code></a>
  116. <li>Function <a href="#ptr_list_of"><code>ptr_list_of()</code></a>
  117. </ul>
  118. The two first functions are used for adding elements after a container object
  119. has been created whereas the next two is used when we need to initialize an
  120. object. </p>
  121. <h3>Function <code>operator+=()</code><a name="operator+="></h3>
  122. <p>
  123. To fill a vector (or any standard container) with values using
  124. <code>operator+=()</code> you write
  125. <blockquote><pre>
  126. <span class=preprocessor>#include </span><span class=special>&lt;</span><span class=identifier>boost</span><span class=special>/</span><span class=identifier>assign</span><span class=special>/</span><span class=identifier>std</span><span class=special>/</span><span class=identifier>vector</span><span class=special>.</span><span class=identifier>hpp</span><span class=special>&gt; </span><span class=comment>// for 'operator+=()'
  127. </span><span class=preprocessor>#include </span><span class=special>&lt;</span><span class=identifier>boost</span><span class=special>/</span><span class=identifier>assert</span><span class=special>.</span><span class=identifier>hpp</span><span class=special>&gt;
  128. </span><span class=keyword>using </span><span class=keyword>namespace </span><span class=identifier>std</span><span class=special>;
  129. </span><span class=keyword>using </span><span class=keyword>namespace </span><span class=identifier>boost</span><span class=special>::</span><span class=identifier>assign</span><span class=special>; </span><span class=comment>// bring 'operator+=()' into scope
  130. </span><span class=special>
  131. </span><span class=special>{
  132. </span><span class=identifier>vector</span><span class=special>&lt;</span><span class=keyword>int</span><span class=special>&gt; </span><span class=identifier>values</span><span class=special>;
  133. </span><span class=identifier>values </span><span class=special>+= </span><span class=number>1</span><span class=special>,</span><span class=number>2</span><span class=special>,</span><span class=number>3</span><span class=special>,</span><span class=number>4</span><span class=special>,</span><span class=number>5</span><span class=special>,</span><span class=number>6</span><span class=special>,</span><span class=number>7</span><span class=special>,</span><span class=number>8</span><span class=special>,</span><span class=number>9</span><span class=special>; </span><span class=comment>// insert values at the end of the container
  134. </span><span class=identifier>BOOST_ASSERT</span><span class=special>( </span><span class=identifier>values</span><span class=special>.</span><span class=identifier>size</span><span class=special>() </span><span class=special>== </span><span class=number>9 </span><span class=special>);
  135. </span><span class=identifier>BOOST_ASSERT</span><span class=special>( </span><span class=identifier>values</span><span class=special>[</span><span class=number>0</span><span class=special>] </span><span class=special>== </span><span class=number>1 </span><span class=special>);
  136. </span><span class=identifier>BOOST_ASSERT</span><span class=special>( </span><span class=identifier>values</span><span class=special>[</span><span class=number>8</span><span class=special>] </span><span class=special>== </span><span class=number>9 </span><span class=special>);
  137. </span><span class=special>}</span></pre></blockquote>
  138. Here we only stuffed constants into the container, but the list can
  139. consists of arbitrary expressions as long as the result of each
  140. expression is convertible to the <code>value_type</code> of the container.
  141. </p>
  142. <h3>Function <code>operator()()</code> <a name="operator()"></h3>
  143. <p>
  144. We do not call <code>operator()()</code> directly, but instead we call a
  145. function that returns a proxy-object that defines <code>operator()()</code>.
  146. The function that returns the proxy object is always named after the member
  147. function that is used to copy the values in the list into the container.
  148. So to fill a map with pairs of values you write
  149. <blockquote><pre>
  150. <span class=preprocessor>#include </span><span class=special>&lt;</span><span
  151. class=identifier>boost</span><span class=special>/</span><span
  152. class=identifier>assign</span><span class=special>/</span><span
  153. class=identifier>list_inserter</span><span class=special>.</span><span
  154. class=identifier>hpp</span><span class=special>&gt; </span><span class=comment>// for 'insert()'
  155. </span><span class=preprocessor>#include </span><span class=special>&lt;</span><span class=identifier>boost</span><span class=special>/</span><span class=identifier>assert</span><span class=special>.</span><span class=identifier>hpp</span><span class=special>&gt;
  156. </span><span class=preprocessor>#include </span><span class=special>&lt;</span><span class=identifier>string</span><span class=special>&gt;
  157. </span><span class=keyword>using </span><span class=keyword>namespace </span><span class=identifier>std</span><span class=special>;
  158. </span><span class=keyword>using </span><span class=keyword>namespace </span><span class=identifier>boost</span><span class=special>::</span><span class=identifier>assign</span><span class=special>; </span><span class=comment>// bring 'insert()' into scope
  159. </span><span class=special>
  160. </span><span class=special>{
  161. </span><span class=identifier>map</span><span class=special>&lt;</span><span class=identifier>string</span><span class=special>,</span><span class=keyword>int</span><span class=special>&gt; </span><span class=identifier>months</span><span class=special>;
  162. </span><span class=identifier>insert</span><span class=special>( </span><span class=identifier>months </span><span class=special>)
  163. </span><span class=special>( </span><span class=string>&quot;january&quot;</span><span class=special>, </span><span class=number>31 </span><span class=special>)( </span><span class=string>&quot;february&quot;</span><span class=special>, </span><span class=number>28 </span><span class=special>)
  164. </span><span class=special>( </span><span class=string>&quot;march&quot;</span><span class=special>, </span><span class=number>31 </span><span class=special>)( </span><span class=string>&quot;april&quot;</span><span class=special>, </span><span class=number>30 </span><span class=special>)
  165. </span><span class=special>( </span><span class=string>&quot;may&quot;</span><span class=special>, </span><span class=number>31 </span><span class=special>)( </span><span class=string>&quot;june&quot;</span><span class=special>, </span><span class=number>30 </span><span class=special>)
  166. </span><span class=special>( </span><span class=string>&quot;july&quot;</span><span class=special>, </span><span class=number>31 </span><span class=special>)( </span><span class=string>&quot;august&quot;</span><span class=special>, </span><span class=number>31 </span><span class=special>)
  167. </span><span class=special>( </span><span class=string>&quot;september&quot;</span><span class=special>, </span><span class=number>30 </span><span class=special>)( </span><span class=string>&quot;october&quot;</span><span class=special>, </span><span class=number>31 </span><span class=special>)
  168. </span><span class=special>( </span><span class=string>&quot;november&quot;</span><span class=special>, </span><span class=number>30 </span><span class=special>)( </span><span class=string>&quot;december&quot;</span><span class=special>, </span><span class=number>31 </span><span class=special>);
  169. </span><span class=identifier>BOOST_ASSERT</span><span class=special>( </span><span class=identifier>months</span><span class=special>.</span><span
  170. class=identifier>size</span><span class=special>() </span><span class=special>== </span><span class=number>12 </span><span class=special>);
  171. </span><span class=identifier>BOOST_ASSERT</span><span class=special>( </span><span class=identifier>months</span><span class=special>[</span><span class=string>&quot;january&quot;</span><span class=special>] </span><span class=special>== </span><span class=number>31 </span><span class=special>);
  172. </span><span class=special>}</span> </pre></blockquote>
  173. Note that <code>operator()()</code> is much more handy when
  174. we need to construct objects using several arguments
  175. (up to five arguments are supported by default, but the limit can be <a href="#limit">customized</a>).
  176. This is also true for sequences:
  177. <blockquote><pre>
  178. <span class=preprocessor>#include </span><span class=special>&lt;</span><span
  179. class=identifier>boost</span><span class=special>/</span><span
  180. class=identifier>assign</span><span class=special>/</span>list_inserter</span><span class=special>.</span><span class=identifier>hpp</span><span class=special>&gt; </span><span class=comment>// for 'push_front()'
  181. </span><span class=preprocessor>#include </span><span class=special>&lt;</span><span class=identifier>boost</span><span class=special>/</span><span class=identifier>assert</span><span class=special>.</span><span class=identifier>hpp</span><span class=special>&gt;
  182. </span><span class=preprocessor>#include </span><span class=special>&lt;</span><span class=identifier>string</span><span class=special>&gt;
  183. </span><span class=preprocessor>#include </span><span class=special>&lt;</span><span class=identifier>utility</span><span class=special>&gt;
  184. </span><span class=keyword>using </span><span class=keyword>namespace </span><span class=identifier>std</span><span class=special>;
  185. </span><span class=keyword>using </span><span class=keyword>namespace </span><span class=identifier>boost</span><span class=special>::</span><span class=identifier>assign</span><span class=special>; </span><span class=comment>// bring 'push_front()' into scope
  186. </span><span class=special>
  187. </span><span class=special>{
  188. </span><span class=keyword>typedef </span><span class=identifier>pair</span><span class=special>&lt; </span><span class=identifier>string</span><span class=special>,</span><span class=identifier>string </span><span class=special>&gt; </span><span class=identifier>str_pair</span><span class=special>;
  189. </span><span class=identifier>deque</span><span class=special>&lt;</span><span class=identifier>str_pair</span><span class=special>&gt; </span><span class=identifier>deq</span><span class=special>;
  190. </span><span class=identifier>push_front</span><span class=special>( </span><span class=identifier>deq </span><span class=special>)( </span><span class=string>&quot;foo&quot;</span><span class=special>, </span><span class=string>&quot;bar&quot;</span><span class=special>)( </span><span class=string>&quot;boo&quot;</span><span class=special>, </span><span class=string>&quot;far&quot; </span><span class=special>);
  191. </span><span class=identifier>BOOST_ASSERT</span><span class=special>( </span><span class=identifier>deq</span><span class=special>.</span><span class=identifier>size</span><span class=special>() </span><span class=special>== </span><span class=number>2 </span><span class=special>);
  192. </span><span class=identifier>BOOST_ASSERT</span><span class=special>( </span><span class=identifier>deq</span><span class=special>.</span><span class=identifier>front</span><span class=special>().</span><span class=identifier>first </span><span class=special>== </span><span class=string>&quot;boo&quot; </span><span class=special>);
  193. </span><span class=identifier>BOOST_ASSERT</span><span class=special>( </span><span class=identifier>deq</span><span class=special>.</span><span class=identifier>back</span><span class=special>().</span><span class=identifier>second </span><span class=special>== </span><span class=string>&quot;bar&quot; </span><span class=special>);
  194. </span><span class=special>} </span></pre></blockquote>
  195. Besides <code>push_front()</code> we could also have used
  196. <code>push_back()</code> if the container has a corresponding member
  197. function. Empty parentheses can be used to insert default-constructed
  198. objects, for example,
  199. <code>push_front( deq )()()</code> will insert two default-constructed
  200. <code>str_pair</code> objects. </p>
  201. <p>
  202. If <code>operator()()</code> is too cumbersome to use with eg.
  203. <code>push_front()</code>we can also say </p>
  204. <blockquote>
  205. <pre>
  206. <span class=identifier>deque</span><span class=special>&lt;</span><span class=keyword>int</span><span class=special>&gt; </span><span class=identifier>di</span><span class=special>; </span>
  207. <span class=identifier>push_front</span><span class=special>( </span><span class=identifier>di </span><span class=special>) </span><span class=special>= </span><span class=number>1</span><span class=special>,</span><span class=number>2</span><span class=special>,</span><span class=number>3</span><span class=special>,</span><span class=number>4</span><span class=special>,</span><span class=number>5</span><span class=special>,</span><span class=number>6</span><span class=special>,</span><span class=number>7</span><span class=special>,</span><span class=number>8</span><span class=special>,</span><span class=number>9</span><span class=special>;</span>
  208. <span class=identifier>BOOST_ASSERT</span><span class=special>( </span><span class=identifier>di</span><span class=special>.</span><span class=identifier>size</span><span class=special>() </span><span class=special>== </span><span class=number>9 </span><span class=special>); </span>
  209. <span class=identifier>BOOST_ASSERT</span><span class=special>( </span><span
  210. class=identifier>di</span><span class=special>[</span><span class=number>0</span><span class=special>] </span><span class=special>== </span><span class=number>9 </span><span class=special>); </span>
  211. </pre>
  212. </blockquote>
  213. <p>
  214. Just to make it perfectly clear, the code above is not restricted to the
  215. standard containers, but will work with all <i>standard compliant</i> containers
  216. with the right member function. It is only <code>operator+=()</code> that has been restricted to
  217. the standard containers. </p>
  218. <h3>Function <code>list_of()</code> <a name="list_of"></h3>
  219. But what if we need to <i>initialize</i> a container? This is where
  220. <code>list_of()</code> comes into play. With <code>list_of()</code>
  221. we can create anonymous lists that automatically converts to
  222. any container:
  223. <blockquote><pre>
  224. <span class=preprocessor>#include </span><span class=special>&lt;</span><span class=identifier>boost</span><span class=special>/</span><span class=identifier>assign</span><span class=special>/</span><span class=identifier>list_of</span><span class=special>.</span><span class=identifier>hpp</span><span class=special>&gt; </span><span class=comment>// for 'list_of()'
  225. </span><span class=preprocessor>#include </span><span class=special>&lt;</span><span class=identifier>boost</span><span class=special>/</span><span class=identifier>assert</span><span class=special>.</span><span class=identifier>hpp</span><span class=special>&gt;
  226. </span><span class=preprocessor>#include </span><span class=special>&lt;</span><span class=identifier>list</span><span class=special>&gt;
  227. </span><span class=preprocessor>#include </span><span class=special>&lt;</span><span class=identifier>stack</span><span class=special>&gt;
  228. </span><span class=preprocessor>#include </span><span class=special>&lt;</span><span class=identifier>string</span><span class=special>&gt;
  229. </span><span class=keyword>using </span><span class=keyword>namespace </span><span class=identifier>std</span><span class=special>;
  230. </span><span class=keyword>using </span><span class=keyword>namespace </span><span class=identifier>boost</span><span class=special>::</span><span class=identifier>assign</span><span class=special>; </span><span class=comment>// bring 'list_of()' into scope
  231. </span><span class=special>
  232. </span><span class=special>{
  233. </span><span class=keyword>const </span><span class=identifier>list</span><span class=special>&lt;</span><span class=keyword>int</span><span class=special>&gt; </span><span class=identifier>primes </span><span class=special>= </span><span class=identifier>list_of</span><span class=special>(</span><span class=number>2</span><span class=special>)(</span><span class=number>3</span><span class=special>)(</span><span class=number>5</span><span class=special>)(</span><span class=number>7</span><span class=special>)(</span><span class=number>11</span><span class=special>);
  234. </span><span class=identifier>BOOST_ASSERT</span><span class=special>( </span><span class=identifier>primes</span><span class=special>.</span><span class=identifier>size</span><span class=special>() </span><span class=special>== </span><span class=number>5 </span><span class=special>);
  235. </span><span class=identifier>BOOST_ASSERT</span><span class=special>( </span><span class=identifier>primes</span><span class=special>.</span><span class=identifier>back</span><span class=special>() </span><span class=special>== </span><span class=number>11 </span><span class=special>);
  236. </span><span class=identifier>BOOST_ASSERT</span><span class=special>( </span><span class=identifier>primes</span><span class=special>.</span><span class=identifier>front</span><span class=special>() </span><span class=special>== </span><span class=number>2 </span><span class=special>);
  237. </span><span class=keyword>const </span><span
  238. class=identifier>stack</span><span class=special>&lt;</span><span
  239. class=identifier>string</span><span class=special>&gt; </span><span
  240. class=identifier>names </span><span class=special>= </span><span
  241. class=special></span><span class=identifier>list_of</span><span class=special>( </span><span class=string>&quot;Mr. Foo&quot; </span><span class=special>)( </span><span class=string>&quot;Mr. Bar&quot;</span><span class=special>)( </span><span class=string>&quot;Mrs. FooBar&quot; </span><span
  242. class=special>).</span><span class=identifier>to_adapter();
  243. </span><span class=keyword>const </span><span
  244. class=identifier>stack</span><span class=special>&lt;</span><span
  245. class=identifier>string</span><span class=special>&gt; </span><span
  246. class=identifier>names2 </span><span class=special>= </span><span
  247. class=special>(</span><span class=identifier>list_of</span><span class=special>( </span><span class=string>&quot;Mr. Foo&quot; </span><span class=special>), </span><span class=string>&quot;Mr. Bar&quot;</span><span class=special>, </span><span class=string>&quot;Mrs. FooBar&quot; </span><span
  248. class=special>).</span><span class=identifier>to_adapter();
  249. </span><span class=identifier>BOOST_ASSERT</span><span class=special>( </span><span class=identifier>names</span><span class=special>.</span><span class=identifier>size</span><span class=special>() </span><span class=special>== </span><span class=number>3 </span><span class=special>);
  250. </span><span class=identifier>BOOST_ASSERT</span><span class=special>( </span><span class=identifier>names</span><span class=special>.</span><span class=identifier>top</span><span class=special>()</span><span class=special> == </span><span class=string>&quot;Mrs. FooBar&quot; </span><span class=special>);
  251. </span><span class=special>} </span></pre></blockquote>
  252. If we need to initialize a container adapter, we need to help the compiler a
  253. little by calling <code>to_adapter()</code>. As the second example also shows,
  254. we can use a comma-separated
  255. list with <code>list_of()</code> if we add parenthesis around the
  256. entire right hand side. It is worth noticing that the first argument
  257. of <code>list_of()</code> determines the type of the anonymous list.
  258. In case of the stack, the anonymous list consists of
  259. <code>const char*</code> objects which are then converted to
  260. a stack of <code>string</code> objects. The conversion is always
  261. possible as long as the conversion between the stored types is possible.
  262. </p>
  263. <p>
  264. Please notice that <code>list_of()</code> can even convert to a
  265. <code>boost::<a
  266. href="../../array/index.html">array</a>&lt;T,sz></code> and see also the list
  267. of <a href="#boost_libs">supported libraries </a>. </p>
  268. <p>
  269. Note that the type returned by
  270. <code>list_of()</code> (and its variants) has overloaded comparison operators. This allows you to
  271. write test code such as
  272. <code>
  273. BOOST_CHECK_EQUAL( my_container, list_of(2)(3)(4)(5) );.
  274. </code>
  275. </p>
  276. <h3>Function <code>map_list_of()</code> <a name="map_list_of"></h3>
  277. This function is defined for pure convenience when working with
  278. maps. Its usage is simple:
  279. <blockquote><pre>
  280. <span class=preprocessor>#include </span><span class=special>&lt;</span><span class=identifier>boost</span><span class=special>/</span><span class=identifier>assign</span><span class=special>/</span><span class=identifier>list_of</span><span class=special>.</span><span class=identifier>hpp</span><span class=special>&gt; </span><span class=comment>// for 'map_list_of()'
  281. </span><span class=preprocessor>#include </span><span class=special>&lt;</span><span class=identifier>boost</span><span class=special>/</span><span class=identifier>assert</span><span class=special>.</span><span class=identifier>hpp</span><span class=special>&gt;
  282. </span><span class=preprocessor>#include </span><span class=special>&lt;</span><span class=identifier>map</span><span class=special>&gt;
  283. </span><span class=keyword>using </span><span class=keyword>namespace </span><span class=identifier>std</span><span class=special>;
  284. </span><span class=keyword>using </span><span class=keyword>namespace </span><span class=identifier>boost</span><span class=special>::</span><span class=identifier>assign</span><span class=special>; </span><span class=comment>// bring 'map_list_of()' into scope
  285. </span><span class=special>
  286. </span><span class=special>{
  287. </span><span class=identifier>map</span><span class=special>&lt;</span><span class=keyword>int</span><span class=special>,</span><span class=keyword>int</span><span class=special>&gt; </span><span class=identifier>next </span><span class=special>= </span><span class=identifier>map_list_of</span><span class=special>(</span><span class=number>1</span><span class=special>,</span><span class=number>2</span><span class=special>)(</span><span class=number>2</span><span class=special>,</span><span class=number>3</span><span class=special>)(</span><span class=number>3</span><span class=special>,</span><span class=number>4</span><span class=special>)(</span><span class=number>4</span><span class=special>,</span><span class=number>5</span><span class=special>)(</span><span class=number>5</span><span class=special>,</span><span class=number>6</span><span class=special>);
  288. </span><span class=identifier>BOOST_ASSERT</span><span class=special>( </span><span class=identifier>next</span><span class=special>.</span><span class=identifier>size</span><span class=special>() </span><span class=special>== </span><span class=number>5 </span><span class=special>);
  289. </span><span class=identifier>BOOST_ASSERT</span><span class=special>( </span><span class=identifier>next</span><span class=special>[ </span><span class=number>1 </span><span class=special>] </span><span class=special>== </span><span class=number>2 </span><span class=special>);
  290. </span><span class=identifier>BOOST_ASSERT</span><span class=special>( </span><span class=identifier>next</span><span class=special>[ </span><span class=number>5 </span><span class=special>] </span><span class=special>== </span><span class=number>6 </span><span class=special>);
  291. </span><span class=comment>// or we can use 'list_of()' by specifying what type
  292. // the list consists of
  293. </span><span class=identifier>next </span><span class=special>= </span><span class=identifier>list_of</span><span class=special>&lt; </span><span class=identifier>pair</span><span class=special>&lt;</span><span class=keyword>int</span><span class=special>,</span><span class=keyword>int</span><span class=special>&gt; </span><span class=special>&gt;(</span><span class=number>6</span><span class=special>,</span><span class=number>7</span><span class=special>)(</span><span class=number>7</span><span class=special>,</span><span class=number>8</span><span class=special>)(</span><span class=number>8</span><span class=special>,</span><span class=number>9</span><span class=special>);
  294. </span><span class=identifier>BOOST_ASSERT</span><span class=special>( </span><span class=identifier>next</span><span class=special>.</span><span class=identifier>size</span><span class=special>() </span><span class=special>== </span><span class=number>3 </span><span class=special>);
  295. </span><span class=identifier>BOOST_ASSERT</span><span class=special>( </span><span class=identifier>next</span><span class=special>[ </span><span class=number>6 </span><span class=special>] </span><span class=special>== </span><span class=number>7 </span><span class=special>);
  296. </span><span class=identifier>BOOST_ASSERT</span><span class=special>( </span><span class=identifier>next</span><span class=special>[ </span><span class=number>8 </span><span class=special>] </span><span class=special>== </span><span class=number>9 </span><span class=special>);
  297. </span><span class=special>} </span></pre></blockquote>
  298. The function <code>pair_list_of()</code> may also be used.
  299. <h3>Function <code>tuple_list_of()</code> <a name="tuple_list_of"></h3>
  300. If you are working with tuples, it might be convenient to use
  301. <code>tuple_list_of()</code>:
  302. <blockquote>
  303. <pre>
  304. <span class=preprocessor>#include </span><span class=special>&lt;</span><span class=identifier>boost</span><span class=special>/</span><span class=identifier>assign</span><span class=special>/</span><span class=identifier>list_of</span><span class=special>.</span><span class=identifier>hpp</span><span class=special>&gt;</span>
  305. <span class=preprocessor>#include </span><span class=special>&lt;</span><span class=identifier>vector</span><span class=special>&gt;
  306. </span>
  307. <span class=keyword>using </span><span class=keyword>namespace </span><span class=identifier>std</span><span class=special>;</span>
  308. <span class=keyword>using </span><span class=keyword>namespace </span><span class=identifier>boost</span><span class=special>::</span><span class=identifier>assign</span><span class=special>;
  309. </span>
  310. <span class=special>{
  311. </span><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=keyword>int</span><span class=special>,</span><span class=identifier>std</span><span class=special>::</span><span class=identifier>string</span><span class=special>,</span><span class=keyword>int</span><span class=special>&gt; </span><span class=identifier>tuple</span><span class=special>;
  312. </span><span class=identifier>vector</span><span class=special>&lt;</span><span class=identifier>tuple</span><span class=special>&gt; </span><span class=identifier>v </span><span class=special>= </span><span class=identifier>tuple_list_of</span><span class=special>( </span><span class=number>1</span><span class=special>, </span><span class=string>&quot;foo&quot;</span><span class=special>, </span><span class=number>2 </span><span class=special>)( </span><span class=number>3</span><span class=special>, </span><span class=string>&quot;bar&quot;</span><span class=special>, </span><span class=number>4 </span><span class=special>);
  313. </span><span class=identifier>BOOST_CHECK</span><span class=special>( </span><span class=identifier>v</span><span class=special>.</span><span class=identifier>size</span><span class=special>() </span><span class=special>== </span><span class=number>2 </span><span class=special>);
  314. </span><span class=identifier>BOOST_CHECK</span><span class=special>( </span><span class=identifier>boost</span><span class=special>::</span><span class=identifier>get</span><span class=special>&lt;</span><span class=number>0</span><span class=special>&gt;( </span><span class=identifier>v</span><span class=special>[</span><span class=number>1</span><span class=special>] </span><span class=special>) </span><span class=special>== </span><span class=number>3 </span><span class=special>);</span>
  315. <span class=special>}</span>
  316. </pre>
  317. </blockquote>
  318. <h3>Functions <code>repeat()</code>, <code>repeat_fun()</code> and <code>range()</code> <a name="repeat"></h3>
  319. <p>
  320. Sometimes it is too irritating to repeat the same value many times. This is
  321. where <code>repeat()</code> can be handy:
  322. <blockquote>
  323. <pre>
  324. <span class=preprocessor>#include </span><span class=special>&lt;</span><span class=identifier>boost</span><span class=special>/</span><span class=identifier>assign</span><span class=special>/</span><span class=identifier>list_of</span><span class=special>.</span><span class=identifier>hpp</span><span class=special>&gt;</span>
  325. <span class=preprocessor>#include </span><span class=special>&lt;</span><span class=identifier>boost</span><span class=special>/</span><span class=identifier>assign</span><span class=special>/</span><span class=identifier>std</span><span class=special>/</span><span class=identifier>vector</span><span class=special>.</span><span class=identifier>hpp</span><span class=special>&gt;</span>
  326. <span class=preprocessor>#include </span><span class=special>&lt;</span><span class=identifier>boost</span><span class=special>/</span><span class=identifier>assert</span><span class=special>.</span><span class=identifier>hpp</span><span class=special>&gt;
  327. </span>
  328. <span class=keyword>using </span><span class=keyword>namespace </span><span class=identifier>std</span><span class=special>;</span>
  329. <span class=keyword>using </span><span class=keyword>namespace </span><span class=identifier>boost</span><span class=special>::</span><span class=identifier>assign</span><span class=special>;</span>
  330. <span class=special> </span>
  331. <span class=special>{
  332. </span><span class=identifier>vector</span><span class=special>&lt;</span><span class=keyword>int</span><span class=special>&gt; </span><span class=identifier>v</span><span class=special>;
  333. </span><span class=identifier>v </span><span class=special>+= </span><span class=number>1</span><span class=special>,</span><span class=number>2</span><span class=special>,</span><span class=number>3</span><span class=special>,</span><span class=identifier>repeat</span><span class=special>(</span><span class=number>10</span><span class=special>,</span><span class=number>4</span><span class=special>),</span><span class=number>5</span><span class=special>,</span><span class=number>6</span><span class=special>,</span><span class=number>7</span><span class=special>,</span><span class=number>8</span><span class=special>,</span><span class=number>9</span><span class=special>;
  334. </span><span class=comment>// v = [1,2,3,4,4,4,4,4,4,4,4,4,4,5,6,7,8,9]
  335. </span><span class=identifier>BOOST_ASSERT</span><span class=special>( </span><span class=identifier>v</span><span class=special>.</span><span class=identifier>size</span><span class=special>() </span><span class=special>== </span><span class=number>3 </span><span class=special>+ </span><span class=number>10 </span><span class=special>+ </span><span class=number>5 </span><span class=special>);
  336. </span><span class=identifier>v </span><span class=special>= </span><span class=identifier>list_of</span><span class=special>(</span><span class=number>1</span><span class=special>).</span><span class=identifier>repeat</span><span class=special>(</span><span class=number>5</span><span class=special>,</span><span class=number>2</span><span class=special>)(</span><span class=number>3</span><span class=special>);
  337. </span><span class=comment>// v = [1,2,2,2,2,2,3]
  338. </span><span class=identifier>BOOST_ASSERT</span><span class=special>( </span><span class=identifier>v</span><span class=special>.</span><span class=identifier>size</span><span class=special>() </span><span class=special>== </span><span class=number>1 </span><span class=special>+ </span><span class=number>5 </span><span class=special>+ </span><span class=number>1 </span><span class=special>);
  339. </span><span class=identifier>push_back</span><span class=special>( </span><span class=identifier>v </span><span class=special>)(</span><span class=number>1</span><span class=special>).</span><span class=identifier>repeat</span><span class=special>(</span><span class=number>1</span><span class=special>,</span><span class=number>2</span><span class=special>)(</span><span class=number>3</span><span class=special>);
  340. </span><span class=comment>// v = old v + [1,2,3]
  341. </span><span class=identifier>BOOST_ASSERT</span><span class=special>( </span><span class=identifier>v</span><span class=special>.</span><span class=identifier>size</span><span class=special>() </span><span class=special>== </span><span class=number>10 </span><span class=special>);</span>
  342. <span class=special>}</span></pre>
  343. </blockquote>
  344. As we can see, then the first argument to <code>repeat()</code> is the number
  345. of times to repeat the second argument.
  346. </p>
  347. <p>
  348. A more general list can be constructed with <code>repeat_fun()</code>:
  349. <blockquote>
  350. <pre>
  351. <span class=preprocessor>#include </span><span class=special>&lt;</span><span class=identifier>boost</span><span class=special>/</span><span class=identifier>assign</span><span class=special>/</span><span class=identifier>std</span><span class=special>/</span><span class=identifier>vector</span><span class=special>.</span><span class=identifier>hpp</span><span class=special>&gt;</span>
  352. <span class=preprocessor>#include </span><span class=special>&lt;</span><span class=identifier>boost</span><span class=special>/</span><span class=identifier>assert</span><span class=special>.</span><span class=identifier>hpp</span><span class=special>&gt;</span>
  353. <span class=preprocessor>#include </span><span class=special>&lt;</span><span class=identifier>cstdlib</span><span class=special>&gt; </span><span class=comment>// for 'rand()'
  354. </span>
  355. <span class=keyword>using </span><span class=keyword>namespace </span><span class=identifier>std</span><span class=special>;</span>
  356. <span class=keyword>using </span><span class=keyword>namespace </span><span class=identifier>boost</span><span class=special>::</span><span class=identifier>assign</span><span class=special>;</span>
  357. <span class=special> </span>
  358. <span class=keyword>template</span><span class=special>&lt; </span><span class=keyword>class </span><span class=identifier>T </span><span class=special>&gt;</span>
  359. <span class=keyword>struct </span><span class=identifier>next </span>
  360. <span class=special>{
  361. </span><span class=identifier>T </span><span class=identifier>seed</span><span class=special>;
  362. </span><span class=identifier>next</span><span class=special>( </span><span class=identifier>T </span><span class=identifier>seed </span><span class=special>) </span><span class=special>: </span><span class=identifier>seed</span><span class=special>(</span><span class=identifier>seed</span><span class=special>)
  363. </span><span class=special>{ </span><span class=special>}
  364. </span><span class=identifier>T </span><span class=keyword>operator</span><span class=special>()() </span><span class=keyword>
  365. </span><span class=special>{
  366. </span><span class=keyword>return </span><span class=identifier>seed</span><span class=special>++;
  367. </span><span class=special>}</span>
  368. <span class=special>};</span>
  369. <span class=special> </span>
  370. <span class=special>{
  371. </span><span class=identifier>vector</span><span class=special>&lt;</span><span class=keyword>int</span><span class=special>&gt; </span><span class=identifier>v</span><span class=special>;
  372. </span><span class=identifier>v </span><span class=special>+= </span><span class=number>1</span><span class=special>,</span><span class=number>2</span><span class=special>,</span><span class=identifier>repeat_fun</span><span class=special>(</span><span class=number>4</span><span class=special>,&amp;</span><span class=identifier>rand</span><span class=special>),</span><span class=number>4</span><span class=special>;
  373. </span><span class=comment>// v = [1,2,?,?,?,?,4]
  374. </span><span class=identifier>BOOST_ASSERT</span><span class=special>( </span><span class=identifier>v</span><span class=special>.</span><span class=identifier>size</span><span class=special>() </span><span class=special>== </span><span class=number>7 </span><span class=special>);
  375. </span><span class=identifier>push_back</span><span class=special>( </span><span class=identifier>v </span><span class=special>).</span><span class=identifier>repeat_fun</span><span class=special>(</span><span class=number>4</span><span class=special>,</span><span class=identifier>next</span><span class=special>&lt;</span><span class=keyword>int</span><span class=special>&gt;(</span><span class=number>0</span><span class=special>))(</span><span class=number>4</span><span class=special>).</span><span class=identifier>repeat_fun</span><span class=special>(</span><span class=number>4</span><span class=special>,</span><span class=identifier>next</span><span class=special>&lt;</span><span class=keyword>int</span><span class=special>&gt;(</span><span class=number>5</span><span class=special>));
  376. </span><span class=comment>// v = old v + [0,1,2,3,4,5,6,7,8]
  377. </span><span class=identifier>BOOST_ASSERT</span><span class=special>( </span><span class=identifier>v</span><span class=special>.</span><span class=identifier>size</span><span class=special>() </span><span class=special>== </span><span class=number>16 </span><span class=special>);</span>
  378. <span class=special>}</span> </pre>
  379. </blockquote>
  380. The only requirement of the second argument to <code>repeat_fun()</code> is that
  381. it is a nullary function. </p>
  382. <p>
  383. If you just need to insert an iterator-range somewhere in the list, the member function <code>range()</code> provides just what you want.
  384. It is based on <a href="../../range/index.html">Boost.Range</a>, so you can pass all the ranges supported by that library. For example
  385. <blockquote><pre><span class=preprocessor>#include</span> <span class=special>&lt;</span><span class=identifier>boost</span><span class=special>/</span><span class=identifier>assign</span><span class=special>/</span><span class=identifier>list_inserter</span><span class=special>.</span><span class=identifier>hpp</span><span class=special>&gt;</span> <span class=comment>// for 'push_back()'</span>
  386. <span class=preprocessor>#include</span> <span class=special>&lt;</span><span class=identifier>boost</span><span class=special>/</span><span class=identifier>assign</span><span class=special>/</span><span class=identifier>list_of</span><span class=special>.</span><span class=identifier>hpp</span><span class=special>&gt;</span> <span class=comment>// for 'list_of()' and 'ref_list_of()'</span>
  387. <span class=preprocessor>#include</span> <span class=special>&lt;</span><span class=identifier>boost</span><span class=special>/</span><span class=identifier>assert</span><span class=special>.</span><span class=identifier>hpp</span><span class=special>&gt;</span>
  388. <span class=keyword>using</span> <span class=keyword>namespace</span> <span class=identifier>std</span><span class=special>;</span>
  389. <span class=keyword>using</span> <span class=keyword>namespace</span> <span class=identifier>boost</span><span class=special>::</span><span class=identifier>assign</span><span class=special>;</span>
  390. <span class=special>{</span>
  391. <span class=identifier>vector</span><span class=special>&lt;</span><span class=keyword>int</span><span class=special>&gt;</span> <span class=identifier>v</span><span class=special>,</span> <span class=identifier>v2</span><span class=special>;</span>
  392. <span class=identifier>v</span> <span class=special>=</span> <span class=identifier>list_of</span><span class=special>(</span><span class=number>1</span><span class=special>)(</span><span class=number>2</span><span class=special>)(</span><span class=number>3</span><span class=special>);</span>
  393. <span class=identifier>v2</span> <span class=special>=</span> <span class=identifier>list_of</span><span class=special>(</span><span class=number>0</span><span class=special>).</span><span class=identifier>range</span><span class=special>(</span><span class=identifier>v</span><span class=special>).</span><span class=identifier>range</span><span class=special>(</span><span class=identifier>v</span><span class=special>.</span><span class=identifier>begin</span><span class=special>(),</span><span class=identifier>v</span><span class=special>.</span><span class=identifier>end</span><span class=special>())(</span><span class=number>4</span><span class=special>);</span>
  394. <span class=comment>// v2 = [0,1,2,3,1,2,3,4]</span>
  395. <span class=identifier>BOOST_ASSERT</span><span class=special>(</span> <span class=identifier>v2</span><span class=special>.</span><span class=identifier>size</span><span class=special>()</span> <span class=special>==</span> <span class=number>8u</span> <span class=special>);</span>
  396. <span class=identifier>push_back</span><span class=special>(</span> <span class=identifier>v</span> <span class=special>).</span><span class=identifier>range</span><span class=special>(</span><span class=identifier>v2</span><span class=special>)(</span><span class=number>5</span><span class=special>);</span>
  397. <span class=comment>// v = [1,2,3,0,1,2,3,1,2,3,4,5]</span>
  398. <span class=identifier>BOOST_ASSERT</span><span class=special>(</span> <span class=identifier>v</span><span class=special>.</span><span class=identifier>size</span><span class=special>()</span> <span class=special>==</span> <span class=number>12u</span> <span class=special>);</span>
  399. <span class=comment>//
  400. // create a list of references, some coming from a container, others from the stack
  401. //</span>
  402. <span class=keyword>int</span> <span class=identifier>x</span> <span class=special>=</span> <span class=number>0</span><span class=special>;</span>
  403. <span class=keyword>int</span> <span class=identifier>y</span> <span class=special>=</span> <span class=number>1</span><span class=special>;</span>
  404. <span class=identifier>BOOST_ASSERT</span><span class=special>(</span> <span class=identifier>ref_list_of</span><span class=special>&lt;</span><span class=number>10</span><span class=special>&gt;(</span><span class=identifier>x</span><span class=special>).</span><span class=identifier>range</span><span class=special>(</span><span class=identifier>v2</span><span class=special>)(</span><span class=identifier>y</span><span class=special>).</span><span class=identifier>size</span><span class=special>()</span> <span class=special>==</span> <span class=number>10u</span> <span class=special>);</span>
  405. <span class=special>}</span></pre>
  406. </blockquote>
  407. As you can see, one can also pass two iterators if that is more appropriate.
  408. The last example also introduces list of references. More about that below.
  409. </p>
  410. <h3>Functions <code>ref_list_of()</code> and <code>cref_list_of()</code> <a name="ref_list_of"></h3>
  411. When you need to create an anonymous range of values and speed is essential,
  412. these two functions provide what you want. <blockquote>
  413. <pre>
  414. <span class=preprocessor>#include </span><span class=special>&lt;</span><span class=identifier>boost</span><span class=special>/</span><span class=identifier>assign</span><span class=special>/</span><span class=identifier>list_of</span><span class=special>.</span><span class=identifier>hpp</span><span class=special>&gt;</span>
  415. <span class=preprocessor>#include </span><span class=special>&lt;</span><span class=identifier>algorithm</span><span class=special>&gt;
  416. </span>
  417. <span class=comment>//
  418. // Define Range algorithm
  419. //</span>
  420. <span class=keyword>template</span><span class=special>&lt; </span><span class=keyword>class </span><span class=identifier>Range </span><span class=special>&gt;</span>
  421. <span class=keyword>typename </span><span class=identifier>Range</span><span class=special>::</span><span class=identifier>const_iterator </span><span class=identifier>max_element</span><span class=special>( </span><span class=keyword>const </span><span class=identifier>Range</span><span class=special>&amp; </span><span class=identifier>r </span><span class=special>)</span>
  422. <span class=special>{
  423. </span><span class=keyword>return </span><span class=identifier>std</span><span class=special>::</span><span class=identifier>max_element</span><span class=special>( </span><span class=identifier>r</span><span class=special>.</span><span class=identifier>begin</span><span class=special>(), </span><span class=identifier>r</span><span class=special>.</span><span class=identifier>end</span><span class=special>() </span><span class=special>);</span>
  424. <span class=special>}
  425. </span>
  426. <span class=keyword>using </span><span class=keyword>namespace </span><span class=identifier>boost</span><span class=special>::</span><span class=identifier>assign</span><span class=special>;
  427. </span>
  428. <span class=special>{
  429. </span><span class=keyword>int </span><span class=identifier>a</span><span class=special>=</span><span class=number>1</span><span class=special>,</span><span class=identifier>b</span><span class=special>=</span><span class=number>5</span><span class=special>,</span><span class=identifier>c</span><span class=special>=</span><span class=number>3</span><span class=special>,</span><span class=identifier>d</span><span class=special>=</span><span class=number>4</span><span class=special>,</span><span class=identifier>e</span><span class=special>=</span><span class=number>2</span><span class=special>,</span><span class=identifier>f</span><span class=special>=</span><span class=number>9</span><span class=special>,</span><span class=identifier>g</span><span class=special>=</span><span class=number>0</span><span class=special>,</span><span class=identifier>h</span><span class=special>=</span><span class=number>7</span><span class=special>;
  430. </span><span class=keyword>int</span><span class=special>&amp; </span><span class=identifier>max </span><span class=special>= </span><span class=special>*</span><span class=identifier>max_element</span><span class=special>( </span><span class=identifier>ref_list_of</span><span class=special>&lt;</span><span class=number>8</span><span class=special>&gt;(</span><span class=identifier>a</span><span class=special>)(</span><span class=identifier>b</span><span class=special>)(</span><span class=identifier>c</span><span class=special>)(</span><span class=identifier>d</span><span class=special>)(</span><span class=identifier>e</span><span class=special>)(</span><span class=identifier>f</span><span class=special>)(</span><span class=identifier>g</span><span class=special>)(</span><span class=identifier>h</span><span class=special>) </span><span class=special>);
  431. </span><span class=identifier>BOOST_CHECK_EQUAL</span><span class=special>( </span><span class=identifier>max</span><span class=special>, </span><span class=identifier>f </span><span class=special>);
  432. </span><span class=identifier>max </span><span class=special>= </span><span class=number>8</span><span class=special>;
  433. </span><span class=identifier>BOOST_CHECK_EQUAL</span><span class=special>( </span><span class=identifier>f</span><span class=special>, </span><span class=number>8 </span><span class=special>);
  434. </span><span class=keyword>const </span><span class=keyword>int</span><span
  435. class=special>&amp; </span><span class=identifier>const_max </span><span class=special>= </span><span class=special>*</span><span class=identifier>max_element</span><span class=special>(</span><span class=identifier>cref_list_of</span><span class=special>&lt;</span><span class=number>8</span><span class=special>&gt;(</span><span class=identifier>a</span><span class=special>)(</span><span class=identifier>b</span><span class=special>)(</span><span class=identifier>c</span><span class=special>)(</span><span class=identifier>d</span><span class=special>)(</span><span class=identifier>e</span><span class=special>)(</span><span class=identifier>f</span><span class=special>)(</span><span class=identifier>g</span><span class=special>)(</span><span class=identifier>h</span><span class=special>) </span><span class=special>);
  436. </span><span class=identifier>BOOST_CHECK_EQUAL</span><span class=special>( </span><span class=identifier>max</span><span class=special>, </span><span class=identifier>const_max </span><span class=special>);</span>
  437. <span class=special>}</span>
  438. </pre>
  439. </blockquote>
  440. You can only use lvalues with <code>ref_list_of()</code> while
  441. <code>cref_list_of()</code> accepts rvalues too. Do not worry about not
  442. specifying exactly the right size; the extra space used is minimal and there
  443. is no runtime overhead associated with it.
  444. You may also use these functions instead of <code>list_of()</code> if speed is
  445. essential.
  446. <h3>A "complicated" example <a name="complicated"></h3>
  447. <p>
  448. As a last example, let us assume that we need to keep track of the
  449. result of soccer matches. A team will get one point if it wins
  450. and zero otherwise. If there has been played three games in each group, the code might look
  451. like this:
  452. <blockquote>
  453. <pre>
  454. <span class=preprocessor>#include </span><span class=special>&lt;</span><span class=identifier>boost</span><span class=special>/</span><span class=identifier>assign</span><span class=special>/</span><span class=identifier>list_of</span><span class=special>.</span><span class=identifier>hpp</span><span class=special>&gt;</span>
  455. <span class=preprocessor>#include </span><span class=special>&lt;</span><span
  456. class=identifier>boost</span><span class=special>/</span><span
  457. class=identifier>assign</span><span class=special>/</span><span
  458. class=identifier>list_inserter</span><span class=special>.</span><span
  459. class=identifier>hpp</span><span class=special>&gt;</span>
  460. <span class=preprocessor>#include </span><span class=special>&lt;</span><span class=identifier>boost</span><span class=special>/</span><span class=identifier>assert</span><span class=special>.</span><span class=identifier>hpp</span><span class=special>&gt;</span>
  461. <span class=preprocessor>#include </span><span class=special>&lt;</span><span class=identifier>string</span><span class=special>&gt;</span>
  462. <span class=preprocessor>#include </span><span class=special>&lt;</span><span class=identifier>vector</span><span class=special>&gt;
  463. </span>
  464. <span class=keyword>using </span><span class=keyword>namespace </span><span class=identifier>std</span><span class=special>;</span>
  465. <span class=keyword>using </span><span class=keyword>namespace </span><span class=identifier>boost</span><span class=special>::</span><span class=identifier>assign</span><span class=special>;
  466. </span>
  467. <span class=special>{
  468. </span><span class=keyword>typedef </span><span class=identifier>vector</span><span class=special>&lt;</span><span class=keyword>int</span><span class=special>&gt; </span><span class=identifier>score_type</span><span class=special>;
  469. </span><span class=keyword>typedef </span><span class=identifier>map</span><span class=special>&lt;</span><span class=identifier>string</span><span class=special>,</span><span class=identifier>score_type</span><span class=special>&gt; </span><span class=identifier>team_score_map</span><span class=special>;
  470. </span><span class=keyword>typedef </span><span class=identifier>pair</span><span class=special>&lt;</span><span class=identifier>string</span><span class=special>,</span><span class=identifier>score_type</span><span class=special>&gt; </span><span class=identifier>score_pair</span><span class=special>;
  471. </span><span class=identifier>team_score_map </span><span class=identifier>group1</span><span class=special>, </span><span class=identifier>group2</span><span class=special>;
  472. </span><span class=comment>//
  473. // method 1: using 'insert()'
  474. //
  475. </span><span class=identifier>insert</span><span class=special>( </span><span class=identifier>group1 </span><span class=special>)( </span><span class=string>&quot;Denmark&quot;</span><span class=special>, </span><span class=identifier>list_of</span><span class=special>(</span><span class=number>1</span><span class=special>)(</span><span class=number>1</span><span class=special>) </span><span class=special>)
  476. </span><span class=special>( </span><span class=string>&quot;Germany&quot;</span><span class=special>, </span><span class=identifier>list_of</span><span class=special>(</span><span class=number>0</span><span class=special>)(</span><span class=number>0</span><span class=special>) </span><span class=special>)
  477. </span><span class=special>( </span><span class=string>&quot;England&quot;</span><span class=special>, </span><span class=identifier>list_of</span><span class=special>(</span><span class=number>0</span><span class=special>)(</span><span class=number>1</span><span class=special>) </span><span class=special>);
  478. </span><span class=identifier>BOOST_ASSERT</span><span class=special>( </span><span class=identifier>group1</span><span class=special>.</span><span class=identifier>size</span><span class=special>() </span><span class=special>== </span><span class=number>3 </span><span class=special>);
  479. </span><span class=identifier>BOOST_ASSERT</span><span class=special>( </span><span class=identifier>group1</span><span class=special>[ </span><span class=string>&quot;Denmark&quot; </span><span class=special>][</span><span class=number>1</span><span class=special>] </span><span class=special>== </span><span class=number>1 </span><span class=special>);
  480. </span><span class=identifier>BOOST_ASSERT</span><span class=special>( </span><span class=identifier>group1</span><span class=special>[ </span><span class=string>&quot;Germany&quot; </span><span class=special>][</span><span class=number>0</span><span class=special>] </span><span class=special>== </span><span class=number>0 </span><span class=special>);
  481. </span><span class=comment>//
  482. // method 2: using 'list_of()'
  483. //
  484. </span><span class=identifier>group2 </span><span class=special>= </span><span class=identifier>list_of</span><span class=special>&lt; </span><span class=identifier>score_pair </span><span class=special>&gt;
  485. </span><span class=special>( </span><span class=string>&quot;Norway&quot;</span><span class=special>, </span><span class=identifier>list_of</span><span class=special>(</span><span class=number>1</span><span class=special>)(</span><span class=number>0</span><span class=special>) </span><span class=special>)
  486. </span><span class=special>( </span><span class=string>&quot;USA&quot;</span><span class=special>, </span><span class=identifier>list_of</span><span class=special>(</span><span class=number>0</span><span class=special>)(</span><span class=number>0</span><span class=special>) </span><span class=special>)
  487. </span><span class=special>( </span><span class=string>&quot;Andorra&quot;</span><span class=special>, </span><span class=identifier>list_of</span><span class=special>(</span><span class=number>1</span><span class=special>)(</span><span class=number>1</span><span class=special>) </span><span class=special>);
  488. </span><span class=identifier>BOOST_ASSERT</span><span class=special>( </span><span class=identifier>group2</span><span class=special>.</span><span class=identifier>size</span><span class=special>() </span><span class=special>== </span><span class=number>3 </span><span class=special>);
  489. </span><span class=identifier>BOOST_ASSERT</span><span class=special>( </span><span class=identifier>group2</span><span class=special>[ </span><span class=string>&quot;Norway&quot; </span><span class=special>][</span><span class=number>0</span><span class=special>] </span><span class=special>== </span><span class=number>1 </span><span class=special>);
  490. </span><span class=identifier>BOOST_ASSERT</span><span class=special>( </span><span class=identifier>group2</span><span class=special>[ </span><span class=string>&quot;USA&quot; </span><span class=special>][</span><span class=number>0</span><span class=special>] </span><span class=special>== </span><span class=number>0 </span><span class=special>);</span>
  491. <span class=special>}</span>
  492. </pre>
  493. </blockquote>
  494. In the first example, notice how the result of <code>list_of()</code>
  495. can be converted automatically to a <code>vector&lt;int></code> because
  496. <code>insert()</code> knows it expects a <code>vector&lt;int></code>.
  497. In the second example we can see that <code>list_of()</code> is somewhat
  498. less intelligent since here it needs to be told explicitly what arguments to
  499. expect. (In the future it might be possible to introduce a more intelligent
  500. conversion layer in <code>list_of()</code>.)
  501. </p>
  502. <h3>Functions <code>ptr_push_back(),
  503. ptr_push_front()</code>, <code>ptr_insert()</code> and <code>ptr_map_insert()</code> <a name="ptr_push_back"></h3>
  504. For use with <a href="../../ptr_container/index.html">Boost.Pointer Container</a>
  505. a few special exception-safe functions are provided. Using these function you
  506. do not need to call <code>new</code> manually:
  507. <blockquote>
  508. <pre>
  509. <span class=preprocessor>#include</span> <span class=special>&lt;</span><span class=identifier>boost</span><span class=special>/</span><span class=identifier>assign</span><span class=special>/</span><span class=identifier>ptr_list_inserter</span><span class=special>.</span><span class=identifier>hpp</span><span class=special>&gt;</span> <span class=comment>// for 'ptr_push_back()', 'ptr_insert()' and 'ptr_push_front()'</span>
  510. <span class=preprocessor>#include</span> <span class=special>&lt;</span><span class=identifier>boost</span><span class=special>/</span><span class=identifier>assign</span><span class=special>/</span><span class=identifier>ptr_map_inserter</span><span class=special>.</span><span class=identifier>hpp</span><span class=special>&gt;</span> <span class=comment>// for 'ptr_map_insert()'</span>
  511. <span class=preprocessor>#include</span> <span class=special>&lt;</span><span class=identifier>boost</span><span class=special>/</span><span class=identifier>ptr_container</span><span class=special>/</span><span class=identifier>ptr_deque</span><span class=special>.</span><span class=identifier>hpp</span><span class=special>&gt;</span>
  512. <span class=preprocessor>#include</span> <span class=special>&lt;</span><span class=identifier>boost</span><span class=special>/</span><span class=identifier>ptr_container</span><span class=special>/</span><span class=identifier>ptr_set</span><span class=special>.</span><span class=identifier>hpp</span><span class=special>&gt;</span>
  513. <span class=preprocessor>#include</span> <span class=special>&lt;</span><span class=identifier>boost</span><span class=special>/</span><span class=identifier>ptr_container</span><span class=special>/</span><span class=identifier>ptr_map</span><span class=special>.</span><span class=identifier>hpp</span><span class=special>&gt;</span>
  514. <span class=comment>//
  515. // Example class
  516. //</span>
  517. <span class=keyword>struct</span> <span class=identifier>Foo</span>
  518. <span class=special>{</span>
  519. <span class=keyword>int</span> <span class=identifier>i</span><span class=special>;</span>
  520. <span class=identifier>Foo</span><span class=special>()</span> <span class=special>:</span> <span class=identifier>i</span><span class=special>(</span><span class=number>0</span><span class=special>)</span>
  521. <span class=special>{</span> <span class=special>}</span>
  522. <span class=identifier>Foo</span><span class=special>(</span> <span class=keyword>int</span> <span class=identifier>i</span> <span class=special>)</span> <span class=special>:</span> <span class=identifier>i</span><span class=special>(</span><span class=identifier>i</span><span class=special>)</span>
  523. <span class=special>{</span> <span class=special>}</span>
  524. <span class=identifier>Foo</span><span class=special>(</span> <span class=keyword>int</span> <span class=identifier>i</span><span class=special>,</span> <span class=keyword>int</span> <span class=special>)</span> <span class=special>:</span> <span class=identifier>i</span><span class=special>(</span><span class=identifier>i</span><span class=special>)</span>
  525. <span class=special>{</span> <span class=special>}</span>
  526. <span class=identifier>Foo</span><span class=special>(</span> <span class=keyword>const</span> <span class=keyword>char</span><span class=special>*,</span> <span class=keyword>int</span> <span class=identifier>i</span><span class=special>,</span> <span class=keyword>int</span> <span class=special>)</span> <span class=special>:</span> <span class=identifier>i</span><span class=special>(</span><span class=identifier>i</span><span class=special>)</span>
  527. <span class=special>{</span> <span class=special>}</span>
  528. <span class=keyword>virtual</span> <span class=special>~</span><span class=identifier>Foo</span><span class=special>()</span>
  529. <span class=special>{}</span>
  530. <span class=special>};</span>
  531. <span class=keyword>struct</span> <span class=identifier>Bar</span> <span class=special>:</span> <span class=identifier>Foo</span>
  532. <span class=special>{</span>
  533. <span class=identifier>Bar</span><span class=special>()</span>
  534. <span class=special>{</span> <span class=special>}</span>
  535. <span class=identifier>Bar</span><span class=special>(</span> <span class=keyword>int</span> <span class=identifier>i</span> <span class=special>)</span> <span class=special>:</span> <span class=identifier>Foo</span><span class=special>(</span> <span class=number>42</span> <span class=special>)</span>
  536. <span class=special>{</span> <span class=special>}</span>
  537. <span class=special>};</span>
  538. <span class=comment>//
  539. // Required by ptr_set&lt;Foo&gt;
  540. //</span>
  541. <span class=keyword>inline</span> <span class=keyword>bool</span> <span class=keyword>operator</span><span class=special>&lt;(</span> <span class=identifier>Foo</span> <span class=identifier>l</span><span class=special>,</span> <span class=identifier>Foo</span> <span class=identifier>r</span> <span class=special>)</span>
  542. <span class=special>{</span>
  543. <span class=keyword>return</span> <span class=identifier>l</span><span class=special>.</span><span class=identifier>i</span> <span class=special>&lt;</span> <span class=identifier>r</span><span class=special>.</span><span class=identifier>i</span><span class=special>;</span>
  544. <span class=special>}</span>
  545. <span class=keyword>using</span> <span class=keyword>namespace</span> <span class=identifier>boost</span><span class=special>;</span>
  546. <span class=keyword>using</span> <span class=keyword>namespace</span> <span class=identifier>boost</span><span class=special>::</span><span class=identifier>assign</span><span class=special>;</span>
  547. <span class=keyword>int</span> <span class=identifier>main</span><span class=special>()</span>
  548. <span class=special>{</span>
  549. <span class=identifier>ptr_deque</span><span class=special>&lt;</span><span class=identifier>Foo</span><span class=special>&gt;</span> <span class=identifier>deq</span><span class=special>;</span>
  550. <span class=identifier>ptr_push_back</span><span class=special>(</span> <span class=identifier>deq</span> <span class=special>)()();</span>
  551. <span class=identifier>BOOST_ASSERT</span><span class=special>(</span> <span class=identifier>deq</span><span class=special>.</span><span class=identifier>size</span><span class=special>()</span> <span class=special>==</span> <span class=number>2u</span> <span class=special>);</span>
  552. <span class=identifier>ptr_push_back</span><span class=special>&lt;</span><span class=identifier>Bar</span><span class=special>&gt;(</span> <span class=identifier>deq</span> <span class=special>)()();</span> <span class=comment>// insert 'Bar' objects</span>
  553. <span class=identifier>BOOST_ASSERT</span><span class=special>(</span> <span class=identifier>deq</span><span class=special>.</span><span class=identifier>size</span><span class=special>()</span> <span class=special>==</span> <span class=number>4u</span> <span class=special>);</span>
  554. <span class=identifier>ptr_push_front</span><span class=special>(</span> <span class=identifier>deq</span> <span class=special>)(</span> <span class=number>3</span> <span class=special>)(</span> <span class=number>42</span><span class=special>,</span> <span class=number>42</span> <span class=special>)(</span> <span class=string>&quot;foo&quot;</span><span class=special>,</span> <span class=number>42</span><span class=special>,</span> <span class=number>42</span> <span class=special>);</span>
  555. <span class=identifier>BOOST_ASSERT</span><span class=special>(</span> <span class=identifier>deq</span><span class=special>.</span><span class=identifier>size</span><span class=special>()</span> <span class=special>==</span> <span class=number>7u</span> <span class=special>);</span>
  556. <span class=identifier>ptr_set</span><span class=special>&lt;</span><span class=identifier>Foo</span><span class=special>&gt;</span> <span class=identifier>a_set</span><span class=special>;</span>
  557. <span class=identifier>ptr_insert</span><span class=special>(</span> <span class=identifier>a_set</span> <span class=special>)()(</span> <span class=number>1</span> <span class=special>)(</span> <span class=number>2</span><span class=special>,</span> <span class=number>2</span> <span class=special>)(</span> <span class=string>&quot;foo&quot;</span><span class=special>,</span> <span class=number>3</span><span class=special>,</span> <span class=number>3</span> <span class=special>);</span>
  558. <span class=identifier>BOOST_ASSERT</span><span class=special>(</span> <span class=identifier>a_set</span><span class=special>.</span><span class=identifier>size</span><span class=special>()</span> <span class=special>==</span> <span class=number>4u</span> <span class=special>);</span>
  559. <span class=identifier>ptr_insert</span><span class=special>(</span> <span class=identifier>a_set</span> <span class=special>)()()()();</span>
  560. <span class=identifier>BOOST_ASSERT</span><span class=special>(</span> <span class=identifier>a_set</span><span class=special>.</span><span class=identifier>size</span><span class=special>()</span> <span class=special>==</span> <span class=number>4u</span> <span class=special>);</span> <span class=comment>// duplicates not inserted</span>
  561. <span class=identifier>ptr_insert</span><span class=special>&lt;</span><span class=identifier>Bar</span><span class=special>&gt;(</span> <span class=identifier>a_set</span> <span class=special>)(</span> <span class=number>42</span> <span class=special>);</span> <span class=comment>// insert a 'Bar' object</span>
  562. <span class=identifier>BOOST_ASSERT</span><span class=special>(</span> <span class=identifier>a_set</span><span class=special>.</span><span class=identifier>size</span><span class=special>()</span> <span class=special>==</span> <span class=number>5u</span> <span class=special>);</span>
  563. <span class=identifier>ptr_map</span><span class=special>&lt;</span><span class=keyword>int</span><span class=special>,</span><span class=identifier>Foo</span><span class=special>&gt;</span> <span class=identifier>a_map</span><span class=special>;</span>
  564. <span class=identifier>ptr_map_insert</span><span class=special>(</span> <span class=identifier>a_map</span> <span class=special>)(</span> <span class=number>1</span> <span class=special>)(</span> <span class=number>2</span><span class=special>,</span> <span class=number>2</span> <span class=special>)(</span> <span class=number>3</span><span class=special>,</span> <span class=number>3</span><span class=special>,</span> <span class=number>3</span> <span class=special>)(</span> <span class=number>4</span><span class=special>,</span> <span class=string>&quot;foo&quot;</span><span class=special>,</span> <span class=number>4</span><span class=special>,</span> <span class=number>4</span> <span class=special>);</span>
  565. <span class=identifier>ptr_map_insert</span><span class=special>&lt;</span><span class=identifier>Bar</span><span class=special>&gt;(</span> <span class=identifier>a_map</span> <span class=special>)(</span> <span class=number>42</span><span class=special>,</span> <span class=number>42</span> <span class=special>);</span> <span class=comment>// insert a 'Bar' object</span>
  566. <span class=special>}</span>
  567. </pre>
  568. </blockquote>
  569. Notice how you may provide a template argument to these functions. This argument determines the type to allocate with <code>new</code>.
  570. You have to specify this argument when the container is based on an abstract type (because one cannot create objects of such a type).
  571. <p>
  572. For <code>ptr_map_insert()</code> the first argument <code>arg1</code> in an argument tuple <code>(arg1,arg2,...,argN)</code> is used to
  573. construct a key; this means that the first argument need only be convertible to the <code>key_type</code> of the container.
  574. The rest of the arguments are used to construct the mapped object.
  575. </p>
  576. <h3>Function <code>ptr_list_of()</code> <a name="ptr_list_of"></h3>
  577. Just like you can use <code>list_of()</code> to initialize containers, you can
  578. use <code>ptr_list_of()</code> to initialize a <a href="../../ptr_container/index.html">pointer container</a>.
  579. Here is a small example:
  580. <blockquote>
  581. <pre>
  582. <span class=preprocessor>#include </span><span class=special>&lt;</span><span class=identifier>boost</span><span class=special>/</span><span class=identifier>assign</span><span class=special>/</span><span class=identifier>ptr_list_of</span><span class=special>.</span><span class=identifier>hpp</span><span class=special>&gt;</span>
  583. <span class=preprocessor>#include </span><span class=special>&lt;</span><span class=identifier>boost</span><span class=special>/</span><span class=identifier>ptr_container</span><span class=special>/</span><span class=identifier>ptr_deque</span><span class=special>.</span><span class=identifier>hpp</span><span class=special>&gt;
  584. </span>
  585. <span class=keyword>using </span><span class=keyword>namespace </span><span class=identifier>boost</span><span class=special>;</span>
  586. <span class=keyword>using </span><span class=keyword>namespace </span><span class=identifier>boost</span><span class=special>::</span><span class=identifier>assign</span><span class=special>;
  587. </span>
  588. <span class=special>{
  589. </span><span class=identifier>ptr_deque</span><span class=special>&lt;</span><span class=identifier>Foo</span><span class=special>&gt; </span><span class=identifier>deq</span><span class=special>;
  590. </span><span class=identifier>deq </span><span class=special>= </span><span class=identifier>ptr_list_of</span><span class=special>&lt;</span><span class=identifier>Foo</span><span class=special>&gt;( </span><span class=number>42 </span><span class=special>)()()( </span><span class=number>3</span><span class=special>, </span><span class=number>3 </span><span class=special>)( </span><span class=string>&quot;foo&quot;</span><span class=special>, </span><span class=number>2</span><span class=special>, </span><span class=number>1 </span><span class=special>);
  591. </span><span class=identifier>BOOST_CHECK</span><span class=special>( </span><span class=identifier>deq</span><span class=special>.</span><span class=identifier>size</span><span class=special>() </span><span class=special>== </span><span class=number>5 </span><span class=special>);</span>
  592. <span class=special>}</span>
  593. </pre>
  594. </blockquote>
  595. Notice that a trailing <code>.to_container(deq)</code> may be added to help many poor
  596. compilers to figure out the conversion (a few get it right).
  597. Notice also that pointer maps are
  598. not supported.
  599. <p>
  600. That is all; now you are ready to use this library.
  601. </p>
  602. <hr>
  603. <h2><a name="reference">Reference</a></h2>
  604. <p>
  605. It is worth noticing the way the library is implemented.
  606. A free-standing function (eg. <code>push_back()</code>
  607. or <code>operator+=()</code>) returns a proxy
  608. object which is responsible for the insertion or the assignment. The proxy
  609. object does the insertion or assignment by overloading <code>operator,()</code>
  610. and <code>operator()()</code> and by calling the "insert" function from within
  611. those operators. The "insert" function is typically stored in the proxy object
  612. by using <code>boost::<a href="../../function/index.html">function</a></code>. </p>
  613. <p>
  614. Often overloading
  615. of <code>operator,()</code> is discouraged because it can lead to surprising
  616. results, but the approach taken in this library is safe since the
  617. user never deals with objects that have overloaded <code>operator,()</code>
  618. directly. However, you should be aware of this:
  619. </p>
  620. <p><i>
  621. The
  622. expressions in a comma-separated list no longer follow the rules of the
  623. built-in comma-operator. This means that the order of evaluation of
  624. expressions in a comma-separated list is undefined like when one specifies
  625. a list of function arguments.
  626. </i></p>
  627. <p>
  628. Most of the code in this document use <code>int</code> in the examples,
  629. but of course it works for arbitrary types as long as they are
  630. Copy Constructible. The inserted data need not be constant data,
  631. but can be variables or data returned from functions; the only requirement
  632. is that the type of the data is convertible to the type stored in the
  633. container.
  634. </p>
  635. <p>
  636. All forwarding is done by passing objects by <code>const</code> reference.
  637. Originally arguments were passed by value (and still is in
  638. <code>tuple_list_of()</code>). One thing to remember is that references
  639. can be passed by using <code>boost::<a href="http://www.boost.org/doc/html/ref.html">ref</a></code>.
  640. </p>
  641. <p>
  642. Everything is put in namespace
  643. <code>boost::assign</code>. </p>
  644. <p> More details can be found below: </p>
  645. <ul>
  646. <li><a href="#headers">Headers</a> </li>
  647. <li><a href="#std">Standard containers</a> </li>
  648. <li>Functions <a href="#list_of_ref"><code>list_of()</code> and <code>map_list_of()</code></a></li>
  649. <li>Functions <a href="#repeat_ref"><code>repeat()</code>,<code>repeat_fun()</code> and
  650. <code>range()</code>
  651. </a></li>
  652. <li>Class <a href="#list_inserter"><code>list_inserter</code></a></li>
  653. <li>Function <a href="#make_list_inserter"><code>make_list_inserter()</code></a></li>
  654. <li><a href="#limit">Customizing</a> argument list sizes </li>
  655. </ul>
  656. <h3>Headers <a name="headers"></h3>
  657. <p>
  658. An overview of the headers in this library
  659. is given below. Please notice <code>&lt;boost/assign/list_inserter.hpp></code>
  660. is included for each header that defines <code>operator+=()</code>.</p>
  661. <table cellpadding=5 border=1 > <tr>
  662. <th> Header </th>
  663. <th> Includes </th>
  664. <tr>
  665. <td> &lt;boost/assign.hpp> </td>
  666. <td> everything except support for pointer containers </td>
  667. <tr>
  668. <td> &lt;boost/assign/list_of.hpp> </td>
  669. <td> <a href="#list_of"><code>list_of()</a>, <a
  670. href="#map_list_of">map_list_of()</code></a>,
  671. <a href="#tuple_list_of">tuple_list_of()</code></a>,
  672. <a href="#ref_list_of">ref_list_of()</code> and
  673. <code>cref_list_of()</code></a>
  674. </td> <tr>
  675. <td> &lt;boost/assign/std.hpp> </td>
  676. <td> <a href="#operator+="><code>operator+=()</code></a> for all
  677. standard
  678. containers (see below)</td> <tr> <td> &lt;boost/assign/std/deque.hpp> </td>
  679. <td> <code>operator+=()</code> for
  680. <code>std::deque</code>, <code>&lt;deque></code>
  681. <tr>
  682. <td> &lt;boost/assign/std/list.hpp> </td>
  683. <td> <code>operator+=()</code> for
  684. <code>std::list</code>, <code>&lt;list></code>
  685. <tr>
  686. <td> &lt;boost/assign/std/map.hpp> </td>
  687. <td> <code>operator+=()</code> for
  688. <code>std::map</code> and <code>std::multimap</code> ,
  689. <code>&lt;map></code> <tr>
  690. <td> &lt;boost/assign/std/queue.hpp> </td>
  691. <td> <code>operator+=()</code> for
  692. <code>std::queue</code> and <code>std::priority_queue</code>,
  693. <code>&lt;queue></code> <tr>
  694. <td> &lt;boost/assign/std/set.hpp> </td>
  695. <td> <code>operator+=()</code> for
  696. <code>std::set</code> and <code>std::multiset</code>,
  697. <code>&lt;set></code> <tr>
  698. <td> &lt;boost/assign/std/slist.hpp> </td>
  699. <td> <code>operator+=()</code> for
  700. <code>std::slist</code> if the class is available ,
  701. <code>&lt;slist></code> <tr>
  702. <td> &lt;boost/assign/std/stack.hpp> </td>
  703. <td> <code>operator+=()</code> for
  704. <code>std::stack</code>, <code>&lt;stack></code>
  705. <tr>
  706. <td> &lt;boost/assign/std/vector.hpp> </td>
  707. <td> <code>operator+=()</code> for
  708. <code>std::vector</code>, <code>&lt;vector></code>
  709. <tr>
  710. <td> &lt;boost/assign/assignment_exception.hpp> </td>
  711. <td> Class <a
  712. href="#assignment_exception"><code>assignment_exception</code></a> which might
  713. be thrown by the proxy returned by <code>list_of()</code>
  714. <tr>
  715. <td> &lt;boost/assign/list_inserter.hpp> </td>
  716. <td>Functions <a
  717. href="#make_list_inserter"><code>make_list_inserter()</code></a>, <code>push_back()</code>,
  718. <code>push_front()</code>,<code>insert()</code>,
  719. <code>
  720. push()</code> and class <a href="#list_inserter"><code>list_inserter</code></a>
  721. which is the back-bone of this entire library.
  722. <tr>
  723. <td> &lt;boost/assign/ptr_list_inserter.hpp> </td>
  724. <td>Functions <a href="#ptr_push_back"><code>ptr_push_back()</code></a>,
  725. <code>ptr_push_front()</code> and <code>ptr_insert()</code>
  726. <tr>
  727. <td> &lt;boost/assign/ptr_map_inserter.hpp> </td>
  728. <td>Functions <a href="#ptr_push_back"><code>ptr_map_insert()</code></a>
  729. <tr>
  730. <td> &lt;boost/assign/ptr_list_of.hpp> </td>
  731. <td>Function <a href="#ptr_list_of"><code>ptr_list_of()</code></a>
  732. </table>
  733. <h3>Standard containers <a name="std"> </h3>
  734. <p> In the following three dots (...) will mean
  735. implementation defined.
  736. <code>operator+=()</code> returns a proxy that forwards calls to either
  737. <code>push_back()</code>,<code>insert()</code>, or <code>push()</code>
  738. depending on which operation the container supports. </p> <b>Synopsis</b>
  739. <p>
  740. <blockquote>
  741. <pre>
  742. <span class=keyword>namespace </span><span class=identifier>boost</span>
  743. <span class=special>{</span>
  744. <span class=keyword>namespace </span><span class=identifier>assign</span>
  745. <span class=special>{
  746. </span><span class=keyword>template</span><span class=special>&lt; </span><span class=keyword>class </span><span class=identifier>V</span><span class=special>, </span><span class=keyword>class </span><span class=identifier>A</span><span class=special>, </span><span class=keyword>class </span><span class=identifier>V2 </span><span class=special>&gt;
  747. </span><span class=identifier>list_inserter</span><span class=special>&lt; </span><span class=special>... </span><span class=special>&gt; </span><span class=keyword>operator</span><span class=special>+=( </span><span class=identifier>std</span><span class=special>::</span><span class=identifier>deque</span><span class=special>&lt;</span><span class=identifier>V</span><span class=special>,</span><span class=identifier>A</span><span class=special>&gt;&amp; </span><span class=identifier>c</span><span class=special>, </span><span class=identifier>V2 </span><span class=identifier>v </span><span class=special>);
  748. </span><span class=keyword>template</span><span class=special>&lt; </span><span class=keyword>class </span><span class=identifier>V</span><span class=special>, </span><span class=keyword>class </span><span class=identifier>A</span><span class=special>, </span><span class=keyword>class </span><span class=identifier>V2 </span><span class=special>&gt;
  749. </span><span class=identifier>list_inserter</span><span class=special>&lt; </span><span class=special>... </span><span class=special>&gt; </span><span class=keyword>operator</span><span class=special>+=( </span><span class=identifier>std</span><span class=special>::</span><span class=identifier>list</span><span class=special>&lt;</span><span class=identifier>V</span><span class=special>,</span><span class=identifier>A</span><span class=special>&gt;&amp; </span><span class=identifier>c</span><span class=special>, </span><span class=identifier>V2 </span><span class=identifier>v </span><span class=special>);
  750. </span><span class=keyword>template</span><span class=special>&lt; </span><span class=keyword>class </span><span class=identifier>K</span><span class=special>, </span><span class=keyword>class </span><span class=identifier>V</span><span class=special>, </span><span class=keyword>class </span><span class=identifier>C</span><span class=special>, </span><span class=keyword>class </span><span class=identifier>A</span><span class=special>, </span><span class=keyword>class </span><span class=identifier>P </span><span class=special>&gt;
  751. </span><span class=identifier>list_inserter</span><span class=special>&lt; </span><span class=special>... </span><span class=special>&gt; </span><span class=keyword>operator</span><span class=special>+=( </span><span class=identifier>std</span><span class=special>::</span><span class=identifier>map</span><span class=special>&lt;</span><span class=identifier>K</span><span class=special>,</span><span class=identifier>V</span><span class=special>,</span><span class=identifier>C</span><span class=special>,</span><span class=identifier>A</span><span class=special>&gt;&amp; </span><span class=identifier>m</span><span class=special>, </span><span class=keyword>const </span><span class=identifier>P</span><span class=special>&amp; </span><span class=identifier>p </span><span class=special>);
  752. </span><span class=keyword>template</span><span class=special>&lt; </span><span class=keyword>class </span><span class=identifier>K</span><span class=special>, </span><span class=keyword>class </span><span class=identifier>V</span><span class=special>, </span><span class=keyword>class </span><span class=identifier>C</span><span class=special>, </span><span class=keyword>class </span><span class=identifier>A</span><span class=special>, </span><span class=keyword>class </span><span class=identifier>P </span><span class=special>&gt;
  753. </span><span class=identifier>list_inserter</span><span class=special>&lt; </span><span class=special>... </span><span class=special>&gt; </span><span class=keyword>operator</span><span class=special>+=( </span><span class=identifier>std</span><span class=special>::</span><span class=identifier>multimap</span><span class=special>&lt;</span><span class=identifier>K</span><span class=special>,</span><span class=identifier>V</span><span class=special>,</span><span class=identifier>C</span><span class=special>,</span><span class=identifier>A</span><span class=special>&gt;&amp; </span><span class=identifier>m</span><span class=special>, </span><span class=keyword>const </span><span class=identifier>P</span><span class=special>&amp; </span><span class=identifier>p </span><span class=special>);
  754. </span><span class=keyword>template</span><span class=special>&lt; </span><span class=keyword>class </span><span class=identifier>V</span><span class=special>, </span><span class=keyword>class </span><span class=identifier>C</span><span class=special>, </span><span class=keyword>class </span><span class=identifier>V2 </span><span class=special>&gt;
  755. </span><span class=identifier>list_inserter</span><span class=special>&lt; </span><span class=special>... </span><span class=special>&gt; </span><span class=keyword>operator</span><span class=special>+=( </span><span class=identifier>std</span><span class=special>::</span><span class=identifier>queue</span><span class=special>&lt;</span><span class=identifier>V</span><span class=special>,</span><span class=identifier>C</span><span class=special>&gt;&amp; </span><span class=identifier>c</span><span class=special>, </span><span class=identifier>V2 </span><span class=identifier>v </span><span class=special>);
  756. </span><span class=keyword>template</span><span class=special>&lt; </span><span class=keyword>class </span><span class=identifier>V</span><span class=special>, </span><span class=keyword>class </span><span class=identifier>C</span><span class=special>, </span><span class=keyword>class </span><span class=identifier>V2 </span><span class=special>&gt;
  757. </span><span class=identifier>list_inserter</span><span class=special>&lt; </span><span class=special>... </span><span class=special>&gt; </span><span class=keyword>operator</span><span class=special>+=( </span><span class=identifier>std</span><span class=special>::</span><span class=identifier>priority_queue</span><span class=special>&lt;</span><span class=identifier>V</span><span class=special>,</span><span class=identifier>C</span><span class=special>&gt;&amp; </span><span class=identifier>c</span><span class=special>, </span><span class=identifier>V2 </span><span class=identifier>v </span><span class=special>);
  758. </span><span class=keyword>template</span><span class=special>&lt; </span><span class=keyword>class </span><span class=identifier>K</span><span class=special>, </span><span class=keyword>class </span><span class=identifier>C</span><span class=special>, </span><span class=keyword>class </span><span class=identifier>A</span><span class=special>, </span><span class=keyword>class </span><span class=identifier>K2 </span><span class=special>&gt;
  759. </span><span class=identifier>list_inserter</span><span class=special>&lt; </span><span class=special>... </span><span class=special>&gt; </span><span class=keyword>operator</span><span class=special>+=( </span><span class=identifier>std</span><span class=special>::</span><span class=identifier>set</span><span class=special>&lt;</span><span class=identifier>K</span><span class=special>,</span><span class=identifier>C</span><span class=special>,</span><span class=identifier>A</span><span class=special>&gt;&amp; </span><span class=identifier>c</span><span class=special>, </span><span class=identifier>K2 </span><span class=identifier>k </span><span class=special>);
  760. </span><span class=keyword>template</span><span class=special>&lt; </span><span class=keyword>class </span><span class=identifier>K</span><span class=special>, </span><span class=keyword>class </span><span class=identifier>C</span><span class=special>, </span><span class=keyword>class </span><span class=identifier>A</span><span class=special>, </span><span class=keyword>class </span><span class=identifier>K2 </span><span class=special>&gt;
  761. </span><span class=identifier>list_inserter</span><span class=special>&lt; </span><span class=special>... </span><span class=special>&gt; </span><span class=keyword>operator</span><span class=special>+=( </span><span class=identifier>std</span><span class=special>::</span><span class=identifier>multiset</span><span class=special>&lt;</span><span class=identifier>K</span><span class=special>,</span><span class=identifier>C</span><span class=special>,</span><span class=identifier>A</span><span class=special>&gt;&amp; </span><span class=identifier>c</span><span class=special>, </span><span class=identifier>K2 </span><span class=identifier>k </span><span class=special>);
  762. </span><span class=preprocessor>#ifdef </span><span class=identifier>BOOST_HAS_SLIST
  763. </span><span class=keyword>template</span><span class=special>&lt; </span><span class=keyword>class </span><span class=identifier>V</span><span class=special>, </span><span class=keyword>class </span><span class=identifier>A</span><span class=special>, </span><span class=keyword>class </span><span class=identifier>V2 </span><span class=special>&gt;
  764. </span><span class=identifier>list_inserter</span><span class=special>&lt; </span><span class=special>... </span><span class=special>&gt; </span><span class=keyword>operator</span><span class=special>+=( </span><span class=identifier>std</span><span class=special>::</span><span class=identifier>slist</span><span class=special>&lt;</span><span class=identifier>V</span><span class=special>,</span><span class=identifier>A</span><span class=special>&gt;&amp; </span><span class=identifier>c</span><span class=special>, </span><span class=identifier>V2 </span><span class=identifier>v </span><span class=special>);
  765. </span><span class=preprocessor>#endif
  766. </span><span class=keyword>template</span><span class=special>&lt; </span><span class=keyword>class </span><span class=identifier>V</span><span class=special>, </span><span class=keyword>class </span><span class=identifier>C</span><span class=special>, </span><span class=keyword>class </span><span class=identifier>V2 </span><span class=special>&gt;
  767. </span><span class=identifier>list_inserter</span><span class=special>&lt; </span><span class=special>... </span><span class=special>&gt; </span><span class=keyword>operator</span><span class=special>+=( </span><span class=identifier>std</span><span class=special>::</span><span class=identifier>stack</span><span class=special>&lt;</span><span class=identifier>V</span><span class=special>,</span><span class=identifier>C</span><span class=special>&gt;&amp; </span><span class=identifier>c</span><span class=special>, </span><span class=identifier>V2 </span><span class=identifier>v </span><span class=special>);
  768. </span><span class=keyword>template</span><span class=special>&lt; </span><span class=keyword>class </span><span class=identifier>V</span><span class=special>, </span><span class=keyword>class </span><span class=identifier>A</span><span class=special>, </span><span class=keyword>class </span><span class=identifier>V2 </span><span class=special>&gt;
  769. </span><span class=identifier>list_inserter</span><span class=special>&lt; </span><span class=special>... </span><span class=special>&gt; </span><span class=keyword>operator</span><span class=special>+=( </span><span class=identifier>std</span><span class=special>::</span><span class=identifier>vector</span><span class=special>&lt;</span><span class=identifier>V</span><span class=special>,</span><span class=identifier>A</span><span class=special>&gt;&amp; </span><span class=identifier>c</span><span class=special>, </span><span class=identifier>V2 </span><span class=identifier>v </span><span class=special>); </span>
  770. <span class=special>} </span><span class=comment>// namespace 'assign'</span>
  771. <span class=special>} </span><span class=comment>// namespace 'boost'</span> </pre></blockquote>
  772. Note that the extra template argument <code>V2</code> etc. is
  773. necessary to allow for types convertible to <code>V</code>.
  774. <h3>Functions <code>list_of()</code> and
  775. <code>map_list_of()</code> <a name="list_of_ref"> </h3>
  776. <p>
  777. These two functions are used to construct anonymous
  778. list which can be converted to any standard container
  779. and <code>boost::<a href="../../array/index.html">array</a>&lt;T,sz>.</code>
  780. The object returned by the two
  781. functions is guaranteed to have the interface described below.
  782. </p>
  783. <b>Synopsis</b>
  784. <blockquote>
  785. <pre><span class=keyword>namespace </span><span class=identifier>boost </span>
  786. <span class=special>{</span>
  787. <span class=keyword>namespace </span><span class=identifier>assign</span>
  788. <span class=special>{
  789. </span><span class=keyword>template</span><span class=special>&lt; </span><span class=keyword>class </span><span class=identifier>T </span><span class=special>&gt;
  790. </span><span class=keyword>class </span><span class=identifier>Implementation</span><span class=special>-</span><span class=identifier>defined</span>
  791. </span><span class=special>{
  792. </span><span class=keyword>public</span><span class=special>:
  793. </span><span class=identifier>const_iterator </span><span class=identifier>begin</span><span class=special>() <span class=keyword>const</span>;
  794. </span><span class=identifier>const_iterator </span><span class=identifier>end</span><span class=special>() <span class=keyword>const</span>;
  795. </span><span class=keyword>template</span><span class=special>&lt; </span><span class=keyword>class </span><span class=identifier>U </span><span class=special>&gt;
  796. </span><span class=identifier>Implementation</span><span class=special>-</span><span class=identifier>defined</span>&amp; </span><span class=keyword>operator</span><span class=special>,( </span><span class=identifier>U </span><span class=identifier>u </span><span class=special>);
  797. </span><span class=comment>// inserts default-constructed object
  798. </span><span class=identifier>Implementation</span><span class=special>-</span><span class=identifier>defined</span>&amp; </span><span class=keyword>operator</span><span class=special>()();
  799. </span><span class=keyword>template</span><span class=special>&lt; </span><span class=keyword>class </span><span class=identifier>U </span><span class=special>&gt;
  800. </span><span class=identifier>Implementation</span><span class=special>-</span><span class=identifier>defined</span>&amp; </span><span class=keyword>operator</span><span class=special>()( </span><span class=identifier>U </span><span class=identifier>u </span><span class=special>);
  801. </span><span class=keyword>template</span><span class=special>&lt; </span><span class=keyword>class </span><span class=identifier>U</span><span class=special>, </span><span class=keyword>class </span><span class=identifier>U2 </span><span class=special>&gt;
  802. </span><span class=identifier>Implementation</span><span class=special>-</span><span class=identifier>defined</span>&amp; </span><span class=keyword>operator</span><span class=special>()( </span><span class=identifier>U </span><span class=identifier>u</span><span class=special>, </span><span class=identifier>U2 </span><span class=identifier>u2 </span><span class=special>);
  803. </span><span class=comment>//
  804. // and similarly up to 5 arguments
  805. //
  806. //
  807. // Convert to a 'Container'. 'Container' must have a constructor
  808. // which takes two iterators.
  809. //
  810. </span><span class=keyword>template</span><span class=special>&lt; </span><span class=keyword>class </span><span class=identifier>Container </span><span class=special>&gt;
  811. </span><span class=keyword>operator </span><span class=identifier>Container</span><span class=special>() </span><span class=keyword>const</span><span class=special>;
  812. </span><span class=comment>//
  813. // Convert to a container adapter like 'std::stack&lt;&gt;'.
  814. //
  815. </span><span class=identifier>Convertible</span><span class=special>-</span><span class=identifier>to</span><span class=special>-</span><span class=identifier>adapter</span> </span><span class=identifier>to_adapter</span><span class=special>() </span><span class=keyword>const</span><span class=special>;
  816. </span><span class=comment>//
  817. //
  818. // Convert to eg. 'boost::array&lt;T,std::size_t&gt;'. If the
  819. // assigned variable is too small,
  820. // a <a href="#assignment_exception">assignment_exception</a> is thrown.
  821. // If the assigned variable it is too big, the rest of the
  822. // values are default-constructed.
  823. //
  824. </span><span class=keyword>template</span><span class=special>&lt; </span><span class=keyword>template </span><span class=special>&lt;</span><span class=keyword>class</span><span class=special>,</span><span class=identifier>std</span><span class=special>::</span><span class=identifier>size_t</span><span class=special>&gt; </span><span class=keyword>class </span><span class=identifier>Array</span><span class=special>, </span><span class=keyword>class </span><span class=identifier>U</span><span class=special>, </span><span class=identifier>std</span><span class=special>::</span><span class=identifier>size_t </span><span class=identifier>sz </span><span class=special>&gt;
  825. </span><span class=keyword>operator </span><span class=identifier>Array</span><span class=special>&lt;</span><span class=identifier>U</span><span class=special>,</span><span class=identifier>sz</span><span class=special>&gt;() </span><span class=keyword>const</span><span class=special>;
  826. </span><span class=special>};</span>
  827. <span class=comment>//
  828. // Comparison operators. 'op' can be &lt;,&gt;,&lt;=,&gt;=,==,!=
  829. //</span>
  830. <span class=keyword>template</span><span class=special>&lt;</span> <span class=keyword>class</span> <span class=identifier>Range</span> <span class=special>&gt;</span>
  831. <span class=keyword>bool</span> <span class=identifier>op</span><span class=special>(</span> <span class=keyword>const</span> <span class=identifier>Implementation</span><span class=special>-</span><span class=identifier>defined</span><span class=special>&amp;,</span> <span class=keyword>const</span> <span class=identifier>Range</span><span class=special>&amp;</span> <span class=special>);</span>
  832. <span class=keyword>template</span><span class=special>&lt;</span> <span class=keyword>class</span> <span class=identifier>Range</span> <span class=special>&gt;</span>
  833. <span class=keyword>bool</span> <span class=identifier>op</span><span class=special>(</span> <span class=keyword>const</span> <span class=identifier>Range</span><span class=special>&amp;,</span> <span class=keyword>const</span> <span class=identifier>Implementation</span><span class=special>-</span><span class=identifier>defined</span><span class=special>&amp;</span> <span class=special>);</span>
  834. <span class=keyword>template</span><span class=special>&lt; </span><span class=keyword>class </span><span class=identifier>T </span><span class=special>&gt;
  835. </span><span class=identifier>Implementation</span><span class=special>-</span><span class=identifier>defined</span> </span><span class=identifier>list_of</span><span class=special>(</span><span class=special>);
  836. </span><span class=keyword>template</span><span class=special>&lt; </span><span class=keyword>class </span><span class=identifier>T </span><span class=special>&gt;
  837. </span><span class=identifier>Implementation</span><span class=special>-</span><span class=identifier>defined</span> </span><span class=identifier>list_of</span><span class=special>( </span><span class=identifier>T </span><span class=identifier>t </span><span class=special>);
  838. </span><span class=keyword>template</span><span class=special>&lt; </span><span class=keyword>class </span><span class=identifier>T</span><span class=special>, </span><span class=keyword>class </span><span class=identifier>U</span><span class=special>, </span><span class=keyword>class </span><span class=identifier>U2 </span><span class=special>&gt;
  839. </span><span class=identifier>Implementation</span><span class=special>-</span><span class=identifier>defined</span> </span><span class=identifier>list_of</span><span class=special>( </span><span class=identifier>U </span><span class=identifier>u</span><span class=special>, </span><span class=identifier>U2 </span><span class=identifier>u2 </span><span class=special>);
  840. </span><span class=keyword>template</span><span class=special>&lt; </span><span class=keyword>class </span><span class=identifier>T</span><span class=special>, </span><span class=keyword>class </span><span class=identifier>U</span><span class=special>, </span><span class=keyword>class </span><span class=identifier>U2</span><span class=special>, </span><span class=keyword>class </span><span class=identifier>U3 </span><span class=special>&gt;
  841. </span><span class=identifier>Implementation</span><span class=special>-</span><span class=identifier>defined</span> </span><span class=identifier>list_of</span><span class=special>( </span><span class=identifier>U </span><span class=identifier>u</span><span class=special>, </span><span class=identifier>U2 </span><span class=identifier>u2</span><span class=special>, </span><span class=identifier>U3 </span><span class=identifier>u3 </span><span class=special>);
  842. </span><span class=keyword>template</span><span class=special>&lt; </span><span class=keyword>class </span><span class=identifier>T</span><span class=special>, </span><span class=keyword>class </span><span class=identifier>U</span><span class=special>, </span><span class=keyword>class </span><span class=identifier>U2</span><span class=special>, </span><span class=keyword>class </span><span class=identifier>U3</span><span class=special>, </span><span class=keyword>class </span><span class=identifier>U4 </span><span class=special>&gt;
  843. </span><span class=identifier>Implementation</span><span class=special>-</span><span class=identifier>defined</span> </span><span class=identifier>list_of</span><span class=special>( </span><span class=identifier>U </span><span class=identifier>u</span><span class=special>, </span><span class=identifier>U2 </span><span class=identifier>u2</span><span class=special>, </span><span class=identifier>U3 </span><span class=identifier>u3</span><span class=special>, </span><span class=identifier>U4 </span><span class=identifier>u4 </span><span class=special>);
  844. </span><span class=keyword>template</span><span class=special>&lt; </span><span class=keyword>class </span><span class=identifier>T</span><span class=special>, </span><span class=keyword>class </span><span class=identifier>U</span><span class=special>, </span><span class=keyword>class </span><span class=identifier>U2</span><span class=special>, </span><span class=keyword>class </span><span class=identifier>U3</span><span class=special>, </span><span class=keyword>class </span><span class=identifier>U4</span><span class=special>, </span><span class=keyword>class </span><span class=identifier>U5 </span><span class=special>&gt;
  845. </span><span class=identifier>Implementation</span><span class=special>-</span><span class=identifier>defined</span> </span><span class=identifier>list_of</span><span class=special>( </span><span class=identifier>U </span><span class=identifier>u</span><span class=special>, </span><span class=identifier>U2 </span><span class=identifier>u2</span><span class=special>, </span><span class=identifier>U3 </span><span class=identifier>u3</span><span class=special>, </span><span class=identifier>U4 </span><span class=identifier>u4</span><span class=special>, </span><span class=identifier>U5 </span><span class=identifier>u5 </span><span class=special>);
  846. </span><span class=keyword>template</span><span class=special>&lt; </span><span class=keyword>class </span><span class=identifier>Key</span><span class=special>, </span><span class=keyword>class </span><span class=identifier>T </span><span class=special>&gt;
  847. </span><span class=identifier>Implementation</span><span class=special>-</span><span class=identifier>defined</span> </span><span class=identifier>map_list_of</span><span class=special>( </span><span class=identifier>Key </span><span class=identifier>k</span><span class=special>, </span><span class=identifier>T </span><span class=identifier>t </span><span class=special>)
  848. </span><span class=special>{
  849. </span><span class=keyword>return </span><span class=identifier>list_of</span><span class=special>&lt; </span><span class=identifier>std</span><span class=special>::</span><span class=identifier>pair</span><span class=special>&lt;</span><span class=identifier>Key</span><span class=special>,</span><span class=identifier>T</span><span class=special>&gt; </span><span class=special>&gt;()( </span><span class=identifier>k</span><span class=special>, </span><span class=identifier>t </span><span class=special>);
  850. </span><span class=special>}</span>
  851. <span class=special>} </span><span class=comment>// namespace 'assign'</span>
  852. <span class=special>} </span><span class=comment>// namespace 'boost'</span> </pre></blockquote>
  853. <h3>Functions <code>repeat()</code>,
  854. <code>repeat_fun()</code> and <code>range()</code> <a name="repeat_ref"> </h3>
  855. <p>
  856. These first two function exist both as free-standing functions and as member functions of the object returned by
  857. <code>list_of()</code> and of <code>list_inserter</code>.
  858. The free-standing versions are used to create a
  859. hook for <code>operator,()</code> so we can call the functions in the middle of a comma-list. The member functions
  860. are used when we need to call the functions in the middle of a parenthesis-list. In both cases we have that
  861. <ul>
  862. <li> the return type is always implementation defined for both functions,
  863. <li> the argument list of <code>repeat()</code> is <code>(std::size_t,T)</code>, and
  864. <li> the argument list of <code>repeat_fun()</code> is <code>(std::size_t,Nullary_function)</code>
  865. </ul>
  866. </p>
  867. <p>
  868. The function <code>range()</code> only exists as a member function. The following two overloads are provided:
  869. <blockquote>
  870. <pre><span class=keyword>template</span><span class=special>&lt;</span> <span class=keyword>class</span> <span class=identifier>SinglePassIterator</span> <span class=special>&gt;</span>
  871. <span class=identifier>Implementation</span><span class=special>-</span><span class=identifier>defined</span> <span class=identifier>range</span><span class=special>(</span> <span class=identifier>SinglePassIterator</span> <span class=identifier>first</span><span class=special>,</span> <span class=identifier>SinglePassIterator</span> <span class=identifier>last</span> <span class=special>);</span>
  872. <span class=keyword>template</span><span class=special>&lt;</span> <span class=keyword>class</span> <span class=identifier>SinglePassRange</span> <span class=special>&gt;</span>
  873. <span class=identifier>Implementation</span><span class=special>-</span><span class=identifier>defined</span> <span class=identifier>range</span><span class=special>(</span> <span class=keyword>const</span> <span class=identifier>SinglePassRange</span><span class=special>&amp;</span> <span class=identifier>rng</span> <span class=special>);</span></pre>
  874. </blockquote>
  875. </p>
  876. <h3><a name="list_inserter">Class <code>list_inserter</code></a></h3>
  877. This class is responsible for inserting elements into containers and
  878. it is the key to extending the library to support your favourite class.
  879. <p>
  880. <b>Synopsis</b>
  881. </p>
  882. <blockquote><pre>
  883. <span class=keyword>namespace </span><span class=identifier>boost</span>
  884. <span class=special>{</span>
  885. <span class=keyword>namespace </span><span class=identifier>assign</span>
  886. <span class=special>{
  887. </span><span class=keyword>template</span><span class=special>&lt; </span><span class=identifier>Function</span><span class=special>, </span><span class=identifier>Argument </span><span class=special>= </span><span class=keyword>void </span><span class=special>&gt;
  888. </span><span class=keyword>class </span><span class=identifier>list_inserter
  889. </span><span class=special>{
  890. </span><span class=identifier>Function </span><span class=identifier>fun</span><span class=special>;
  891. </span><span class=keyword>public</span><span class=special>:
  892. </span><span class=keyword>explicit </span><span class=identifier>list_inserter</span><span class=special>( </span><span class=identifier>Function </span><span class=identifier>fun </span><span class=special>);
  893. </span><span class=comment>// conversion constructor
  894. </span><span class=keyword>template</span><span class=special>&lt; </span><span class=keyword>class </span><span class=identifier>Function2</span><span class=special>, </span><span class=keyword>class </span><span class=identifier>Arg </span><span class=special>&gt;
  895. </span><span class=identifier>list_inserter</span><span class=special>( </span><span class=keyword>const </span><span class=identifier>list_inserter</span><span class=special>&lt;</span><span class=identifier>Function2</span><span class=special>,</span><span class=identifier>Arg</span><span class=special>&gt;&amp; </span><span class=special>);
  896. </span><span class=keyword>public</span><span class=special>:
  897. </span><span class=keyword>template</span><span class=special>&lt; </span><span class=keyword>class </span><span class=identifier>U </span><span class=special>&gt;
  898. </span><span class=identifier>list_inserter</span><span class=special>&amp; </span><span class=keyword>operator</span><span class=special>,( </span><span class=identifier>U </span><span class=identifier>u </span><span class=special>);
  899. </span><span class=keyword>template</span><span class=special>&lt; </span><span class=keyword>class </span><span class=identifier>U </span><span class=special>&gt;
  900. </span><span class=identifier>list_inserter</span><span class=special>&amp; </span><span class=keyword>operator</span><span class=special>=( </span><span class=identifier>U </span><span class=identifier>u </span><span class=special>);
  901. </span><span class=comment>// calls 'fun()' with default-constructed object
  902. </span><span class=identifier>list_inserter</span><span class=special>&amp; </span><span class=keyword>operator</span><span class=special>()();
  903. </span><span class=keyword>template</span><span class=special>&lt; </span><span class=keyword>class </span><span class=identifier>U </span><span class=special>&gt;
  904. </span><span class=identifier>list_inserter</span><span class=special>&amp; </span><span class=keyword>operator</span><span class=special>()( </span><span class=identifier>U </span><span class=identifier>u </span><span class=special>);
  905. </span><span class=keyword>template</span><span class=special>&lt; </span><span class=keyword>class </span><span class=identifier>U</span><span class=special>, </span><span class=keyword>class </span><span class=identifier>U2 </span><span class=special>&gt;
  906. </span><span class=identifier>list_inserter</span><span class=special>&amp; </span><span class=keyword>operator</span><span class=special>()( </span><span class=identifier>U </span><span class=identifier>u</span><span class=special>, </span><span class=identifier>U2 </span><span class=identifier>u2 </span><span class=special>)
  907. </span><span class=special>{
  908. </span><span class=comment>//
  909. // if 'Argument' is 'void'
  910. // fun( u, u2 );
  911. // else
  912. // fun( Argument( u, u2 ) );
  913. //
  914. </span><span class=keyword>return </span><span class=special>*</span><span class=keyword>this</span><span class=special>;
  915. </span><span class=special>}
  916. </span><span class=comment>//
  917. // similarly up to 5 arguments
  918. //
  919. </span><span class=special>};</span>
  920. <span class=keyword>template</span><span class=special>&lt; </span><span
  921. class=keyword>class </span><span class=identifier>C </span><span class=special>&gt;
  922. </span><span class=identifier>list_inserter</span><span class=special>&lt; </span><span class=special>... </span><span class=special>&gt; </span><span class=identifier>push_back</span><span class=special>( </span><span class=identifier>C</span><span class=special>&amp; </span><span class=special>);
  923. </span><span class=keyword>template</span><span class=special>&lt; </span><span class=keyword>class </span><span class=identifier>C </span><span class=special>&gt;
  924. </span><span class=identifier>list_inserter</span><span class=special>&lt; </span><span class=special>... </span><span class=special>&gt; </span><span class=identifier>push_front</span><span class=special>( </span><span class=identifier>C</span><span class=special>&amp; </span><span class=special>);
  925. </span><span class=keyword>template</span><span class=special>&lt; </span><span class=keyword>class </span><span class=identifier>C </span><span class=special>&gt;
  926. </span><span class=identifier>list_inserter</span><span class=special>&lt; </span><span class=special>... </span><span class=special>&gt; </span><span class=identifier>insert</span><span class=special>( </span><span class=identifier>C</span><span class=special>&amp; </span><span class=special>);
  927. </span><span class=keyword>template</span><span class=special>&lt; </span><span class=keyword>class </span><span class=identifier>C </span><span class=special>&gt;
  928. </span><span class=identifier>list_inserter</span><span class=special>&lt; </span><span class=special>... </span><span class=special>&gt; </span><span class=identifier>push</span><span class=special>( </span><span class=identifier>C</span><span class=special>&amp; </span><span class=special>);</span>
  929. <span class=special>} </span><span class=comment>// namespace 'assign'</span>
  930. <span class=special>} </span><span class=comment>// namespace 'boost'</span></pre></blockquote>
  931. <p>
  932. Notice how the arguments to <code>operator,()</code> and
  933. <code>operator()()</code> are passed differently to
  934. <code>fun</code> depending of the type of <code>Argument</code>.
  935. So if we only pass one template argument to <code>list_inserter,</code>
  936. we can forward "arbitrary" argument lists of functions. If we pass
  937. two template arguments to <code>list_inserter</code> we can
  938. construct types with "arbitrary" constructors.
  939. </p>
  940. <p>
  941. And because
  942. a reference to <code>list_inserter</code> is returned, we can
  943. chain argument list together in a very space-efficient manner.
  944. </p>
  945. <h3><a name="make_list_inserter">Function <code>make_list_inserter()</code></a></h3>
  946. <p>
  947. A simple "constructor" function for <code>list_inserter</code>. A typical
  948. use of this function is to call it with the result of
  949. <code>boost::bind()</code>
  950. which in general returns some unreadable and weird class template.
  951. </p>
  952. <b>Synopsis</b>
  953. <blockquote><pre>
  954. <span class=keyword>namespace </span><span class=identifier>boost </span>
  955. <span class=special>{</span>
  956. <span class=keyword>namespace </span><span class=identifier>assign</span>
  957. <span class=special>{
  958. </span><span class=keyword>template</span><span class=special>&lt; </span><span class=keyword>class </span><span class=identifier>Function </span><span class=special>&gt;
  959. </span><span class=identifier>list_inserter</span><span class=special>&lt;</span><span class=identifier>Function</span><span class=special>&gt; </span><span class=identifier>make_list_inserter</span><span class=special>( </span><span class=identifier>Function </span><span class=identifier>fun </span><span class=special>)
  960. </span><span class=special>{
  961. </span><span class=keyword>return </span><span class=identifier>list_inserter</span><span class=special>&lt;</span><span class=identifier>Function</span><span class=special>&gt;( </span><span class=identifier>fun </span><span class=special>);
  962. </span><span class=special>} </span>
  963. <span class=special>}</span>
  964. <span class=special>} </span> </pre></blockquote>
  965. <a name="limit"></a>
  966. <h3>Customizing argument list sizes</h3>
  967. <p>
  968. This library uses the boost Preprocessor Library to implement overloaded
  969. versions of <code>operator()()</code> and <code>list_of()</code>. By default you
  970. can call these functions with five arguments, but you can also customize this
  971. number by defining a macros before including a header from this library:
  972. <blockquote>
  973. <pre>
  974. <span class=preprocessor>#define </span><span class=identifier>BOOST_ASSIGN_MAX_PARAMS </span><span class=number>10
  975. </span><span class=preprocessor>#include </span><span class=special>&lt;</span><span class=identifier>boost</span><span class=special>/</span><span class=identifier>assign</span><span class=special>.</span><span class=identifier>hpp</span><span class=special>&gt;</span>
  976. </pre>
  977. </blockquote>
  978. </p>
  979. <hr>
  980. <h2><a name="exceptions">Exceptions and exception-safety</a></h2>
  981. <p>
  982. The exception guarantees by the library is the same as guarantee as the
  983. guarantee of the function that is forwarded to. For standard
  984. containers this means that the
  985. strong guarantee is given for a single insertions and that the basic guarantee
  986. is given for many insertions (provided that the object being copied
  987. gives the basic guarantee).
  988. </p>
  989. <p>
  990. The functions may throw standard exceptions
  991. like <code>std::bad_alloc</code>. Note however that, unfortunately, the standard does not guarantee allocation-failures
  992. in standard containers to be reported by <code>std::bad_alloc</code> or exceptions derived from <code>std::exception</code>.
  993. </p>
  994. <h3><a name="assignment_exception">Class
  995. <code>assignment_exception</code></a></h3>
  996. <p>
  997. The exception is thrown by the conversion operator in the proxy object
  998. returned from <code>list_of()</code>.
  999. </p>
  1000. <blockquote><pre>
  1001. <span class=keyword>namespace </span><span class=identifier>boost </span>
  1002. <span class=special>{</span>
  1003. <span class=keyword>namespace </span><span class=identifier>assign</span>
  1004. <span class=special>{
  1005. </span><span class=keyword>class </span><span class=identifier>assignment_exception </span><span class=special>: </span><span class=keyword>public </span><span class=identifier>std</span><span class=special>::</span><span class=identifier>exception
  1006. </span><span class=special>{
  1007. </span><span class=keyword>public</span><span class=special>:
  1008. </span><span class=keyword>explicit </span><span class=identifier>assignment_exception</span><span class=special>( </span><span class=keyword>const </span><span class=keyword>char</span><span class=special>* </span><span class=identifier>what </span><span class=special>);
  1009. </span><span class=keyword>virtual </span><span class=keyword>const </span><span class=keyword>char</span><span class=special>* </span><span class=identifier>what</span><span class=special>() </span><span class=keyword>const </span><span class=keyword>throw</span><span class=special>();
  1010. </span><span class=special>};</span>
  1011. <span class=special>} </span>
  1012. <span class=special>}</span> </pre></blockquote>
  1013. <hr>
  1014. <h2><a name="extensions">Extending the library</a></h2>
  1015. <p>
  1016. It is very simple to make the library work with new classes.
  1017. This code shows how to use <code>operator+=()</code> with
  1018. a container:
  1019. <blockquote><pre>
  1020. <span class=keyword>template</span><span class=special>&lt; </span><span class=keyword>class </span><span class=identifier>V</span><span class=special>, </span><span class=keyword>class </span><span class=identifier>A</span><span class=special>, </span><span class=keyword>class </span><span class=identifier>V2 </span><span class=special>&gt;
  1021. </span><span class=keyword>inline </span><span class=identifier>list_inserter</span><span class=special>&lt; </span><span class=identifier>assign_detail</span><span class=special>::</span><span class=identifier>call_push_back</span><span class=special>&lt; </span><span class=identifier>std</span><span class=special>::</span><span class=identifier>vector</span><span class=special>&lt;</span><span class=identifier>V</span><span class=special>,</span><span class=identifier>A</span><span class=special>&gt; </span><span class=special>&gt;, </span><span class=identifier>V </span><span class=special>&gt;
  1022. </span><span class=keyword>operator</span><span class=special>+=( </span><span class=identifier>std</span><span class=special>::</span><span class=identifier>vector</span><span class=special>&lt;</span><span class=identifier>V</span><span class=special>,</span><span class=identifier>A</span><span class=special>&gt;&amp; </span><span class=identifier>c</span><span class=special>, </span><span class=identifier>V2 </span><span class=identifier>v </span><span class=special>)
  1023. </span><span class=special>{
  1024. </span><span class=keyword>return </span><span class=identifier>make_list_inserter</span><span class=special>( </span><span class=identifier>assign_detail</span><span class=special>::</span><span class=identifier>call_push_back</span><span class=special>&lt; </span><span class=identifier>std</span><span class=special>::</span><span class=identifier>vector</span><span class=special>&lt;</span><span class=identifier>V</span><span class=special>,</span><span class=identifier>A</span><span class=special>&gt; </span><span class=special>&gt;( </span><span class=identifier>c </span><span class=special>) </span><span class=special>)( </span><span class=identifier>v </span><span class=special>);
  1025. </span><span class=special>}
  1026. </span></pre>
  1027. </blockquote>
  1028. where <code>call_push_back</code> is defined as
  1029. <blockquote>
  1030. <pre>
  1031. <span class=keyword>template</span><span class=special>&lt; </span><span class=keyword>class </span><span class=identifier>C </span><span class=special>&gt;
  1032. </span><span class=keyword>class </span><span class=identifier>call_push_back
  1033. </span><span class=special>{
  1034. </span><span class=identifier>C</span><span class=special>&amp; </span><span class=identifier>c_</span><span class=special>;
  1035. </span><span class=keyword>public</span><span class=special>:
  1036. </span><span class=identifier>call_push_back</span><span class=special>( </span><span class=identifier>C</span><span class=special>&amp; </span><span class=identifier>c </span><span class=special>) </span><span class=special>: </span><span class=identifier>c_</span><span class=special>( </span><span class=identifier>c </span><span class=special>)
  1037. </span><span class=special>{ </span><span class=special>}
  1038. </span><span class=keyword>template</span><span class=special>&lt; </span><span class=keyword>class </span><span class=identifier>T </span><span class=special>&gt;
  1039. </span><span class=keyword>void </span><span class=keyword>operator</span><span class=special>()( </span><span class=identifier>T </span><span class=identifier>r </span><span class=special>)
  1040. </span><span class=special>{
  1041. </span><span class=identifier>c_</span><span class=special>.</span><span class=identifier>push_back</span><span class=special>( </span><span class=identifier>r </span><span class=special>);
  1042. </span><span class=special>}
  1043. </span><span class=special>};</span></pre>
  1044. </blockquote>
  1045. Note that we pass
  1046. a second template argument to <code>list_inserter</code> so argument
  1047. lists will be used to construct a <code>V</code> object. Otherwise we
  1048. could end up trying to call <code>push_back()</code> with <i>n</i> arguments
  1049. instead of one.
  1050. </p>
  1051. <p>
  1052. An alternative way would be to use <code>boost::function</code> and
  1053. <code>boost::bind()</code> in combination. However, in this case one must
  1054. remember that it is illegal to take the address of a function in
  1055. the standard library.
  1056. </p>
  1057. <p>
  1058. Calling a function with more that one argument can be
  1059. very useful too. This small example shows how we take advantage of this
  1060. functionality:
  1061. </p>
  1062. <blockquote><pre>
  1063. <span class=comment>//
  1064. // A class representing emails
  1065. //</span>
  1066. <span class=keyword>class </span><span class=identifier>email</span>
  1067. <span class=special>{</span>
  1068. <span class=keyword>public</span><span class=special>:
  1069. </span><span class=keyword>enum </span><span class=identifier>address_option
  1070. </span><span class=special>{
  1071. </span><span class=identifier>check_addr_book</span><span class=special>,
  1072. </span><span class=identifier>dont_check_addr_book
  1073. </span><span class=special>};
  1074. </span>
  1075. <span class=keyword>private</span><span class=special>:
  1076. </span><span class=keyword>typedef </span><span class=identifier>std</span><span class=special>::</span><span class=identifier>map</span><span class=special>&lt; </span><span class=identifier>std</span><span class=special>::</span><span class=identifier>string</span><span class=special>,</span><span class=identifier>address_option </span><span class=special>&gt; </span><span class=identifier>address_map</span><span class=special>;
  1077. </span><span class=comment>//
  1078. // Store list of persons that must be cc'ed
  1079. //
  1080. </span><span class=keyword>mutable </span><span class=identifier>address_map </span><span class=identifier>cc_list</span><span class=special>;
  1081. </span><span class=comment>//
  1082. // This extra function-object will take care of the
  1083. // insertion for us. It stores a reference to a
  1084. // map and 'operator()()' does the work.
  1085. //
  1086. </span><span class=keyword>struct </span><span class=identifier>add_to_map
  1087. </span><span class=special>{
  1088. </span><span class=identifier>address_map</span><span class=special>&amp; </span><span class=identifier>m</span><span class=special>;
  1089. </span><span class=identifier>add_to_map</span><span class=special>( </span><span class=identifier>address_map</span><span class=special>&amp; </span><span class=identifier>m </span><span class=special>) </span><span class=special>: </span><span class=identifier>m</span><span class=special>(</span><span class=identifier>m</span><span class=special>)
  1090. </span><span class=special>{}
  1091. </span><span class=keyword>void </span><span class=keyword>operator</span><span class=special>()( </span><span class=keyword>const </span><span class=identifier>std</span><span class=special>::</span><span class=identifier>string</span><span class=special>&amp; </span><span class=identifier>name</span><span class=special>, </span><span class=identifier>address_option </span><span class=identifier>ao </span><span class=special>)
  1092. </span><span class=special>{
  1093. </span><span class=identifier>m</span><span class=special>[ </span><span class=identifier>name </span><span class=special>] </span><span class=special>= </span><span class=identifier>ao</span><span class=special>;
  1094. </span><span class=special>}
  1095. </span><span class=special>};
  1096. </span>
  1097. <span class=keyword>public</span><span class=special>:
  1098. </span><span class=comment>//
  1099. // This function constructs the appropriate 'list_inserter'.
  1100. // Again we could have use 'boost::function', but it is
  1101. // trivial to use a function object.
  1102. //
  1103. // Notice that we do not specify an extra template
  1104. // parameter to 'list_inserter'; this means we forward
  1105. // all parameters directly to the function without
  1106. // calling any constructor.
  1107. //
  1108. </span><span class=identifier>list_inserter</span><span class=special>&lt; </span><span class=identifier>add_to_map </span><span class=special>&gt;
  1109. </span><span class=identifier>add_cc</span><span class=special>( </span><span class=identifier>std</span><span class=special>::</span><span class=identifier>string </span><span class=identifier>name</span><span class=special>, </span><span class=identifier>address_option </span><span class=identifier>ao </span><span class=special>)
  1110. </span><span class=special>{
  1111. </span><span class=comment>//
  1112. // Notice how we pass the arguments 'name' and 'ao' to
  1113. // the 'list_inserter'.
  1114. //
  1115. </span><span class=keyword>return </span><span class=identifier>make_list_inserter</span><span class=special>( </span><span class=identifier>add_to_map</span><span class=special>( </span><span class=identifier>cc_list </span><span class=special>) </span><span class=special>)( </span><span class=identifier>name</span><span class=special>, </span><span class=identifier>ao </span><span class=special>);
  1116. </span><span class=special>}</span>
  1117. <span class=special>};
  1118. </span>
  1119. <span class=comment>//
  1120. // Now we can use the class like this:
  1121. //</span>
  1122. <span class=identifier>email </span><span class=identifier>e</span><span class=special>;</span>
  1123. <span class=identifier>e</span><span class=special>.</span><span class=identifier>add_cc</span><span class=special>( </span><span class=string>&quot;Mr. Foo&quot;</span><span class=special>, </span><span class=identifier>email</span><span class=special>::</span><span class=identifier>dont_check_addr_book </span><span class=special>)
  1124. </span><span class=special>( </span><span class=string>&quot;Mr. Bar&quot;</span><span class=special>, </span><span class=identifier>email</span><span class=special>::</span><span class=identifier>check_addr_book </span><span class=special>)
  1125. </span><span class=special>( </span><span class=string>&quot;Mrs. FooBar&quot;</span><span class=special>, </span><span class=identifier>email</span><span class=special>::</span><span class=identifier>check_addr_book </span><span class=special>); </span>
  1126. </pre></blockquote>
  1127. The full example can be seen in <a href="email_example.html">email_example.cpp</a> </p>
  1128. <hr>
  1129. <h2>Examples <a name="examples"></h2>
  1130. <p>
  1131. Additional examples can be found in the test files:
  1132. <ul>
  1133. <li> <a href="email_example.html">email_example.cpp</a>
  1134. <li> <a href="my_vector_example.html">my_vector_example.cpp</a>
  1135. <li> <a href="multi_index_container.html">multi_index_container.cpp</a>
  1136. <li> <a href="../test/array.cpp">array.cpp</a>
  1137. <li> <a href="../test/list_of.cpp">list_of.cpp</a>
  1138. <li> <a href="../test/std.cpp">std.cpp</a>
  1139. <li> <a href="../test/list_inserter.cpp">list_inserter.cpp</a>
  1140. <li> <a href="../test/list_of_workaround.cpp">list_of_work_around.cpp</a>
  1141. </ul> </p>
  1142. <hr>
  1143. <h2><a name="boost_libs">Supported libraries</a></h2>
  1144. Here is a list libraries has been tested with Boost.Assign:
  1145. <ol>
  1146. <li> <code>boost::<a href="../../array/index.html">array</a></code>
  1147. <li> <code>boost::<a href="../../multi_index/index.html">multi_index_container</a></code>
  1148. <li> <code>Boost.<a href="../../ptr_container/index.html">Pointer Container</code> </ol> <p>
  1149. </p>
  1150. <hr>
  1151. <h2><a name="portability">Portability</a></h2>
  1152. <p>
  1153. Library has been successfully compiled and tested with
  1154. MVC++ 7.1, GCC 3.2 (under Cygwin) Comeau 4.3.3
  1155. </p>
  1156. <p>
  1157. There are known limitation on platforms not supporting templated
  1158. conversion operators. The solution is to call certain member functions on
  1159. the object returned by <code>list_of()</code>: </p>
  1160. <blockquote>
  1161. <pre>
  1162. <span class=special>{
  1163. </span><span class=keyword>using </span><span class=keyword>namespace </span><span class=identifier>std</span><span class=special>;
  1164. </span><span class=keyword>using </span><span class=keyword>namespace </span><span class=identifier>boost</span><span class=special>;
  1165. </span><span class=keyword>using </span><span class=keyword>namespace </span><span class=identifier>boost</span><span class=special>::</span><span class=identifier>assign</span><span class=special>;
  1166. </span><span class=keyword></span><span
  1167. class=identifier>vector</span><span
  1168. class=special>&lt;</span><span class=keyword>int</span><span
  1169. class=special>&gt;</span> <span class=identifier>v </span><span
  1170. class=special>= </span><span class=identifier>list_of</span><span class=special>(</span><span class=number>1</span><span class=special>)(</span><span class=number>2</span><span class=special>)(</span><span class=number>3</span><span class=special>)(</span><span class=number>4</span><span class=special>).</span><span class=identifier>to_container</span><span class=special>( </span><span class=identifier>v </span><span class=special>);
  1171. </span><span class=identifier>set</span><span class=special>&lt;</span><span class=keyword>int</span><span class=special>&gt; </span><span class=identifier>s </span><span class=special>= </span><span class=identifier>list_of</span><span class=special>(</span><span class=number>1</span><span class=special>)(</span><span class=number>2</span><span class=special>)(</span><span class=number>3</span><span class=special>)(</span><span class=number>4</span><span class=special>).</span><span class=identifier>to_container</span><span class=special>( </span><span class=identifier>s </span><span class=special>);
  1172. </span><span class=identifier>map</span><span class=special>&lt;</span><span class=keyword>int</span><span class=special>,</span><span class=keyword>int</span><span class=special>&gt; </span><span class=identifier>m </span><span class=special>= </span><span class=identifier>map_list_of</span><span class=special>(</span><span class=number>1</span><span class=special>,</span><span class=number>2</span><span class=special>)(</span><span class=number>2</span><span class=special>,</span><span class=number>3</span><span class=special>).</span><span class=identifier>to_container</span><span class=special>( </span><span class=identifier>m </span><span class=special>);
  1173. </span><span class=identifier>stack</span><span class=special>&lt;</span><span class=keyword>int</span><span class=special>&gt; </span><span class=identifier>st </span><span class=special>= </span><span class=identifier>list_of</span><span class=special>(</span><span class=number>1</span><span class=special>)(</span><span class=number>2</span><span class=special>)(</span><span class=number>3</span><span class=special>)(</span><span class=number>4</span><span class=special>).</span><span class=identifier>to_adapter</span><span class=special>( </span><span class=identifier>st </span><span class=special>);
  1174. </span><span class=identifier>queue</span><span class=special>&lt;</span><span class=keyword>int</span><span class=special>&gt; </span><span class=identifier>q </span><span class=special>= </span><span class=identifier>list_of</span><span class=special>(</span><span class=number>1</span><span class=special>)(</span><span class=number>2</span><span class=special>)(</span><span class=number>3</span><span class=special>)(</span><span class=number>4</span><span class=special>).</span><span class=identifier>to_adapter</span><span class=special>( </span><span class=identifier>q </span><span class=special>);
  1175. </span><span class=identifier>array</span><span class=special>&lt;</span><span class=keyword>int</span><span class=special>,</span><span class=number>4</span><span class=special>&gt; </span><span class=identifier>a </span><span class=special>= </span><span class=identifier>list_of</span><span class=special>(</span><span class=number>1</span><span class=special>)(</span><span class=number>2</span><span class=special>)(</span><span class=number>3</span><span class=special>)(</span><span class=number>4</span><span class=special>).</span><span class=identifier>to_array</span><span class=special>( </span><span class=identifier>a </span><span class=special>);</span>
  1176. <span class=special>}</span> </pre>
  1177. </blockquote>
  1178. <p>
  1179. Notice how one must supply the functions with an argument so the right
  1180. return type can be deduced.
  1181. </p>
  1182. <p>Some standard libraries are also broken. One problem is that
  1183. <code>insert()</code> might not work:
  1184. <blockquote>
  1185. <pre>
  1186. <span class=identifier>map</span><span class=special>&lt;</span><span class=keyword>int</span><span class=special>,</span><span class=keyword>int</span><span class=special>&gt; </span><span class=identifier>next</span><span class=special>;
  1187. </span><span class=identifier>insert</span><span class=special>( </span><span class=identifier>next </span><span class=special>)(</span><span class=number>1</span><span class=special>,</span><span class=number>2</span><span class=special>)(</span><span class=number>2</span><span class=special>,</span><span class=number>3</span><span class=special>); </span><span class=comment>// compile-time error</span> </pre>
  1188. </blockquote>
  1189. The solution is to use <code>map_list_of()</code> instead:
  1190. <blockquote>
  1191. <pre>
  1192. <span class=identifier>map</span><span class=special>&lt;</span><span class=keyword>int</span><span class=special>,</span><span class=keyword>int</span><span class=special>&gt; </span><span class=identifier>next </span><span class=special>= </span><span class=identifier>map_list_of</span><span class=special>(</span><span class=number>1</span><span class=special>,</span><span class=number>2</span><span class=special>)(</span><span class=number>2</span><span class=special>,</span><span class=number>3</span><span class=special>);</span></pre></blockquote>
  1193. </p>
  1194. <hr>
  1195. <h2><a name="history">History and Acknowledgment</a></h2>
  1196. <p>
  1197. The idea for an assignment/initialization library is not new. The
  1198. functionality of this
  1199. library resembles Leor Zolman's STL Container Initialization Library a great
  1200. deal, but it does not rely on string parsing to achieve its goals.
  1201. </p>
  1202. <p>
  1203. The
  1204. library is non-intrusive and puts only a minimum of requirements
  1205. on its supported classes.
  1206. Overloading operator comma is sometimes viewed as a bad practice <a
  1207. href="#meyers">[1]</A>. However, it has been done
  1208. with success in eg. the Generative Matrix Computation Library and Blitz to initialize matrices
  1209. (see <a href="#gmcl">[2]</A>) and <a href="#blitz">[3]</A>). The
  1210. Initialization Library overloads
  1211. the comma operator in a safe manner by letting free standing functions
  1212. return an object that is responsible for the initialization. Therefore it takes
  1213. explicit
  1214. action from the programmer to begin using the overloaded <code>operator,()</CODE>.
  1215. </p>
  1216. <p>
  1217. There has recently been some discussion about enhancing the language to
  1218. support better initialization (see <a href="#initializer">[4]</a>).
  1219. </p>
  1220. <p>
  1221. Special thanks goes to
  1222. <ul>
  1223. <li> Leor Zolman for our many discussion that eventually led to this library.
  1224. <li> Tom Brinkman for being review manager.
  1225. <li> Joaquín Muñoz for vc6/vc7 portability.
  1226. <li> Pavel Vozenilek for his countless suggestions, improvements and
  1227. portability fixes.
  1228. <li> Rene Rivera for Code Warrior portability.
  1229. </ul>
  1230. </p>
  1231. <hr>
  1232. <h2><a name="ref">References</a></h2>
  1233. <p>
  1234. <ol>
  1235. <li> <a name="meyers"> Scott. Meyers, "More Effective C++", Item 7, Addison Wesley, 1996
  1236. <li> <a name="gmcl"> K. Czarnecki and U.W. Eisenecker, "Generative programming", Addison-Wesley, 2000
  1237. <li> <a name="blitz"> <a href="http://www.oonumerics.org/blitz/"> http://www.oonumerics.org/blitz/ </A>
  1238. <li> <a name="initializer">
  1239. Gabriel Dos Reis and Bjarne Stroustrup,
  1240. <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1509.pdf"> "Generalized Initializer
  1241. Lists"</a>, 2003 </a>
  1242. </OL>
  1243. </p>
  1244. <hr>
  1245. <p>
  1246. (C) Copyright Thorsten Ottosen 2003-2006
  1247. </p>
  1248. <br>
  1249. <br>
  1250. <br>
  1251. <br>
  1252. <br>
  1253. <br>
  1254. <br>
  1255. <br>
  1256. <br>
  1257. <br>
  1258. <br>
  1259. <br>
  1260. </body>
  1261. </html>