boost-react-native-bundle
Version:
Boost library as in https://sourceforge.net/projects/boost/files/boost/1.57.0/
449 lines (408 loc) • 147 kB
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Boost.Assignment Documentation </title>
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body>
<table border="0" >
<tr>
<td ><img src="../../../boost.png" border="0" ></td>
<td >
<h1 align="center">Assignment Library</h1>
</td>
</tr>
</table>
<p>
Copyright � 2003-2006 Thorsten Ottosen
</p>
<p>
Use, modification and distribution is subject to the Boost Software License, Version 1.0
(see <a href="http://www.boost.org/LICENSE_1_0.txt">
http://www.boost.org/LICENSE_1_0.txt</a>).
</p>
<h3>Table of Contents</h3>
<ul>
<li><a href="#intro">Introduction</a></li>
<li>
<a href="#tutorial" >Tutorial</a>
<ul>
<li>Function <a href="#operator+="><code>operator+=()</code></a>
<li>Function <a href="#operator()"><code>operator()()</code></a>
<li>Function <a href="#list_of"><code>list_of()</code></a>
<li>Function <a href="#map_list_of"><code>map_list_of()</code></a>
<li>Function <a href="#tuple_list_of"><code>tuple_list_of()</code></a>
<li>Functions <a href="#repeat"><code>repeat()</code>, <code>repeat_fun()</code> and <code>range()</code> </a>
<li>Functions <a href="#ref_list_of"><code>ref_list_of()</code> and <code>cref_list_of()</code></a>
<li>A <a href="#complicated">"complicated"</a> example
<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>
<li>Function <a href="#ptr_list_of"><code>ptr_list_of()</code></a>
</ul> <li>
<a href="#reference">Reference</a>
<ul>
<li><a href="#headers">Headers</a> </li>
<li><a href="#std">Standard containers</a> </li>
<li>Functions <a href="#list_of_ref"><code>list_of()</code> and <code>map_list_of()</code></a></li>
<li>Functions <a href="#repeat_ref"><code>repeat()</code>,
<code>repeat_fun()</code> and <code>range()</code> </a> </li>
<li>Class <a href="#list_inserter"><code>list_inserter</code></a></li>
<li>Function <a href="#make_list_inserter"><code>make_list_inserter()</code></a></li>
<li><a href="#limit"> Customizing</a> argument list sizes</li>
</ul>
<li> <a href="#exceptions">Exceptions and exception-safety </a></li>
<li> <a href="#extensions">Extending the library</a>
<li> <a href="#boost_libs">Supported libraries </a>
<li> <a href="#examples">Examples</a></li> <ul></ul>
<li><a href="#portability">Portability</a></li>
<li><a href="#history">History and Acknowledgment</a>
<li><a href="#ref">References</a></li>
</ul>
<hr>
<h2><a name="intro">Introduction</a></h2> <p> <i>There appear to be few
practical uses of <code>operator,()</code></i>. <!-- p. 247 --> <br><b>Bjarne
Stroustrup</b>, The Design and Evolution of C++ </p> <p> The purpose of this
library is to make it easy to fill containers with data by overloading
<code>operator,()</code> and <code>operator()()</code>. These two operators
make it possible to construct lists of values that are then copied into a
container: </p> <ul> <li> A comma-separated list: <p>
<!-- vector< int > v; v += 1,2,3,4,5,6,7,8,9; -->
<pre><span
class=identifier>vector</span><span class=special><</span><span
class=keyword>int</span><span class=special>></span><span
class=identifier> v</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=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></pre></p>
<li> A parenthesis-separated list:
<p>
<pre>
<span class=identifier>map</span><span class=special><</span><span
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>
<span class=identifier>insert</span><span class=special>( </span><span class=identifier>m </span><span class=special>)( </span><span class=string>"Bar"</span><span class=special>, </span><span class=number>1 </span><span class=special>)( </span><span class=string>"Foo"</span><span class=special>, </span><span class=number>2 </span><span class=special>);</span></pre>
</ul>
<p>
These lists are particularly useful in
learning, testing, and prototyping situations, but can also be handy otherwise.
The library comes with predefined operators for the containers of the
standard library, but most functionality will work with any standard
compliant container. The library also makes it possible to extend user
defined types so for example a member function can be called for a list of
values instead of its normal arguments. </p>
<hr>
<a name="tutorial"></a>
<h2>Tutorial</h2>
<p>
Within two minutes you should be able to use this library. The main
components are explained in these sections:
<ul>
<li>Function <a href="#operator+="><code>operator+=()</code></a>
<li>Function <a href="#operator()"><code>operator()()</code></a>
<li>Function <a href="#list_of"><code>list_of()</code></a>
<li>Function <a href="#map_list_of"><code>map_list_of()</code></a>
<li>Function <a href="#tuple_list_of"><code>tuple_list_of()</code></a>
<li>Functions <a href="#repeat"><code>repeat()</code>, <code>repeat_fun()</code> and <code>range()</code> </a>
<li>Functions <a href="#ref_list_of"><code>ref_list_of()</code> and <code>cref_list_of()</code></a>
<li>A <a href="#complicated">"complicated"</a> example
<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>
<li>Function <a href="#ptr_list_of"><code>ptr_list_of()</code></a>
</ul>
The two first functions are used for adding elements after a container object
has been created whereas the next two is used when we need to initialize an
object. </p>
<h3>Function <code>operator+=()</code><a name="operator+="></h3>
<p>
To fill a vector (or any standard container) with values using
<code>operator+=()</code> you write
<blockquote><pre>
<span class=preprocessor>#include </span><span class=special><</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>> </span><span class=comment>// for 'operator+=()'
</span><span class=preprocessor>#include </span><span class=special><</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>>;
</span><span class=keyword>using </span><span class=keyword>namespace </span><span class=identifier>std</span><span class=special>;
</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
</span><span class=special>
</span><span class=special>{
</span><span class=identifier>vector</span><span class=special><</span><span class=keyword>int</span><span class=special>> </span><span class=identifier>values</span><span class=special>;
</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
</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>);
</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>);
</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>);
</span><span class=special>}</span></pre></blockquote>
Here we only stuffed constants into the container, but the list can
consists of arbitrary expressions as long as the result of each
expression is convertible to the <code>value_type</code> of the container.
</p>
<h3>Function <code>operator()()</code> <a name="operator()"></h3>
<p>
We do not call <code>operator()()</code> directly, but instead we call a
function that returns a proxy-object that defines <code>operator()()</code>.
The function that returns the proxy object is always named after the member
function that is used to copy the values in the list into the container.
So to fill a map with pairs of values you write
<blockquote><pre>
<span class=preprocessor>#include </span><span class=special><</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>> </span><span class=comment>// for 'insert()'
</span><span class=preprocessor>#include </span><span class=special><</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>>
</span><span class=preprocessor>#include </span><span class=special><</span><span class=identifier>string</span><span class=special>>
</span><span class=keyword>using </span><span class=keyword>namespace </span><span class=identifier>std</span><span class=special>;
</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
</span><span class=special>
</span><span class=special>{
</span><span class=identifier>map</span><span class=special><</span><span class=identifier>string</span><span class=special>,</span><span class=keyword>int</span><span class=special>> </span><span class=identifier>months</span><span class=special>;
</span><span class=identifier>insert</span><span class=special>( </span><span class=identifier>months </span><span class=special>)
</span><span class=special>( </span><span class=string>"january"</span><span class=special>, </span><span class=number>31 </span><span class=special>)( </span><span class=string>"february"</span><span class=special>, </span><span class=number>28 </span><span class=special>)
</span><span class=special>( </span><span class=string>"march"</span><span class=special>, </span><span class=number>31 </span><span class=special>)( </span><span class=string>"april"</span><span class=special>, </span><span class=number>30 </span><span class=special>)
</span><span class=special>( </span><span class=string>"may"</span><span class=special>, </span><span class=number>31 </span><span class=special>)( </span><span class=string>"june"</span><span class=special>, </span><span class=number>30 </span><span class=special>)
</span><span class=special>( </span><span class=string>"july"</span><span class=special>, </span><span class=number>31 </span><span class=special>)( </span><span class=string>"august"</span><span class=special>, </span><span class=number>31 </span><span class=special>)
</span><span class=special>( </span><span class=string>"september"</span><span class=special>, </span><span class=number>30 </span><span class=special>)( </span><span class=string>"october"</span><span class=special>, </span><span class=number>31 </span><span class=special>)
</span><span class=special>( </span><span class=string>"november"</span><span class=special>, </span><span class=number>30 </span><span class=special>)( </span><span class=string>"december"</span><span class=special>, </span><span class=number>31 </span><span class=special>);
</span><span class=identifier>BOOST_ASSERT</span><span class=special>( </span><span class=identifier>months</span><span class=special>.</span><span
class=identifier>size</span><span class=special>() </span><span class=special>== </span><span class=number>12 </span><span class=special>);
</span><span class=identifier>BOOST_ASSERT</span><span class=special>( </span><span class=identifier>months</span><span class=special>[</span><span class=string>"january"</span><span class=special>] </span><span class=special>== </span><span class=number>31 </span><span class=special>);
</span><span class=special>}</span> </pre></blockquote>
Note that <code>operator()()</code> is much more handy when
we need to construct objects using several arguments
(up to five arguments are supported by default, but the limit can be <a href="#limit">customized</a>).
This is also true for sequences:
<blockquote><pre>
<span class=preprocessor>#include </span><span class=special><</span><span
class=identifier>boost</span><span class=special>/</span><span
class=identifier>assign</span><span class=special>/</span>list_inserter</span><span class=special>.</span><span class=identifier>hpp</span><span class=special>> </span><span class=comment>// for 'push_front()'
</span><span class=preprocessor>#include </span><span class=special><</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>>
</span><span class=preprocessor>#include </span><span class=special><</span><span class=identifier>string</span><span class=special>>
</span><span class=preprocessor>#include </span><span class=special><</span><span class=identifier>utility</span><span class=special>>
</span><span class=keyword>using </span><span class=keyword>namespace </span><span class=identifier>std</span><span class=special>;
</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
</span><span class=special>
</span><span class=special>{
</span><span class=keyword>typedef </span><span class=identifier>pair</span><span class=special>< </span><span class=identifier>string</span><span class=special>,</span><span class=identifier>string </span><span class=special>> </span><span class=identifier>str_pair</span><span class=special>;
</span><span class=identifier>deque</span><span class=special><</span><span class=identifier>str_pair</span><span class=special>> </span><span class=identifier>deq</span><span class=special>;
</span><span class=identifier>push_front</span><span class=special>( </span><span class=identifier>deq </span><span class=special>)( </span><span class=string>"foo"</span><span class=special>, </span><span class=string>"bar"</span><span class=special>)( </span><span class=string>"boo"</span><span class=special>, </span><span class=string>"far" </span><span class=special>);
</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>);
</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>"boo" </span><span class=special>);
</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>"bar" </span><span class=special>);
</span><span class=special>} </span></pre></blockquote>
Besides <code>push_front()</code> we could also have used
<code>push_back()</code> if the container has a corresponding member
function. Empty parentheses can be used to insert default-constructed
objects, for example,
<code>push_front( deq )()()</code> will insert two default-constructed
<code>str_pair</code> objects. </p>
<p>
If <code>operator()()</code> is too cumbersome to use with eg.
<code>push_front()</code>we can also say </p>
<blockquote>
<pre>
<span class=identifier>deque</span><span class=special><</span><span class=keyword>int</span><span class=special>> </span><span class=identifier>di</span><span class=special>; </span>
<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>
<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>
<span class=identifier>BOOST_ASSERT</span><span class=special>( </span><span
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>
</pre>
</blockquote>
<p>
Just to make it perfectly clear, the code above is not restricted to the
standard containers, but will work with all <i>standard compliant</i> containers
with the right member function. It is only <code>operator+=()</code> that has been restricted to
the standard containers. </p>
<h3>Function <code>list_of()</code> <a name="list_of"></h3>
But what if we need to <i>initialize</i> a container? This is where
<code>list_of()</code> comes into play. With <code>list_of()</code>
we can create anonymous lists that automatically converts to
any container:
<blockquote><pre>
<span class=preprocessor>#include </span><span class=special><</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>> </span><span class=comment>// for 'list_of()'
</span><span class=preprocessor>#include </span><span class=special><</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>>
</span><span class=preprocessor>#include </span><span class=special><</span><span class=identifier>list</span><span class=special>>
</span><span class=preprocessor>#include </span><span class=special><</span><span class=identifier>stack</span><span class=special>>
</span><span class=preprocessor>#include </span><span class=special><</span><span class=identifier>string</span><span class=special>>
</span><span class=keyword>using </span><span class=keyword>namespace </span><span class=identifier>std</span><span class=special>;
</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
</span><span class=special>
</span><span class=special>{
</span><span class=keyword>const </span><span class=identifier>list</span><span class=special><</span><span class=keyword>int</span><span class=special>> </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>);
</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>);
</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>);
</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>);
</span><span class=keyword>const </span><span
class=identifier>stack</span><span class=special><</span><span
class=identifier>string</span><span class=special>> </span><span
class=identifier>names </span><span class=special>= </span><span
class=special></span><span class=identifier>list_of</span><span class=special>( </span><span class=string>"Mr. Foo" </span><span class=special>)( </span><span class=string>"Mr. Bar"</span><span class=special>)( </span><span class=string>"Mrs. FooBar" </span><span
class=special>).</span><span class=identifier>to_adapter();
</span><span class=keyword>const </span><span
class=identifier>stack</span><span class=special><</span><span
class=identifier>string</span><span class=special>> </span><span
class=identifier>names2 </span><span class=special>= </span><span
class=special>(</span><span class=identifier>list_of</span><span class=special>( </span><span class=string>"Mr. Foo" </span><span class=special>), </span><span class=string>"Mr. Bar"</span><span class=special>, </span><span class=string>"Mrs. FooBar" </span><span
class=special>).</span><span class=identifier>to_adapter();
</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>);
</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>"Mrs. FooBar" </span><span class=special>);
</span><span class=special>} </span></pre></blockquote>
If we need to initialize a container adapter, we need to help the compiler a
little by calling <code>to_adapter()</code>. As the second example also shows,
we can use a comma-separated
list with <code>list_of()</code> if we add parenthesis around the
entire right hand side. It is worth noticing that the first argument
of <code>list_of()</code> determines the type of the anonymous list.
In case of the stack, the anonymous list consists of
<code>const char*</code> objects which are then converted to
a stack of <code>string</code> objects. The conversion is always
possible as long as the conversion between the stored types is possible.
</p>
<p>
Please notice that <code>list_of()</code> can even convert to a
<code>boost::<a
href="../../array/index.html">array</a><T,sz></code> and see also the list
of <a href="#boost_libs">supported libraries </a>. </p>
<p>
Note that the type returned by
<code>list_of()</code> (and its variants) has overloaded comparison operators. This allows you to
write test code such as
<code>
BOOST_CHECK_EQUAL( my_container, list_of(2)(3)(4)(5) );.
</code>
</p>
<h3>Function <code>map_list_of()</code> <a name="map_list_of"></h3>
This function is defined for pure convenience when working with
maps. Its usage is simple:
<blockquote><pre>
<span class=preprocessor>#include </span><span class=special><</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>> </span><span class=comment>// for 'map_list_of()'
</span><span class=preprocessor>#include </span><span class=special><</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>>
</span><span class=preprocessor>#include </span><span class=special><</span><span class=identifier>map</span><span class=special>>
</span><span class=keyword>using </span><span class=keyword>namespace </span><span class=identifier>std</span><span class=special>;
</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
</span><span class=special>
</span><span class=special>{
</span><span class=identifier>map</span><span class=special><</span><span class=keyword>int</span><span class=special>,</span><span class=keyword>int</span><span class=special>> </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>);
</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>);
</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>);
</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>);
</span><span class=comment>// or we can use 'list_of()' by specifying what type
// the list consists of
</span><span class=identifier>next </span><span class=special>= </span><span class=identifier>list_of</span><span class=special>< </span><span class=identifier>pair</span><span class=special><</span><span class=keyword>int</span><span class=special>,</span><span class=keyword>int</span><span class=special>> </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>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>);
</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>);
</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>);
</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>);
</span><span class=special>} </span></pre></blockquote>
The function <code>pair_list_of()</code> may also be used.
<h3>Function <code>tuple_list_of()</code> <a name="tuple_list_of"></h3>
If you are working with tuples, it might be convenient to use
<code>tuple_list_of()</code>:
<blockquote>
<pre>
<span class=preprocessor>#include </span><span class=special><</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>></span>
<span class=preprocessor>#include </span><span class=special><</span><span class=identifier>vector</span><span class=special>>
</span>
<span class=keyword>using </span><span class=keyword>namespace </span><span class=identifier>std</span><span class=special>;</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=special>{
</span><span class=keyword>typedef </span><span class=identifier>boost</span><span class=special>::</span><span class=identifier>tuple</span><span class=special><</span><span class=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>> </span><span class=identifier>tuple</span><span class=special>;
</span><span class=identifier>vector</span><span class=special><</span><span class=identifier>tuple</span><span class=special>> </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>"foo"</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>"bar"</span><span class=special>, </span><span class=number>4 </span><span class=special>);
</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>);
</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><</span><span class=number>0</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=special>) </span><span class=special>== </span><span class=number>3 </span><span class=special>);</span>
<span class=special>}</span>
</pre>
</blockquote>
<h3>Functions <code>repeat()</code>, <code>repeat_fun()</code> and <code>range()</code> <a name="repeat"></h3>
<p>
Sometimes it is too irritating to repeat the same value many times. This is
where <code>repeat()</code> can be handy:
<blockquote>
<pre>
<span class=preprocessor>#include </span><span class=special><</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>></span>
<span class=preprocessor>#include </span><span class=special><</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>></span>
<span class=preprocessor>#include </span><span class=special><</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>>
</span>
<span class=keyword>using </span><span class=keyword>namespace </span><span class=identifier>std</span><span class=special>;</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=special> </span>
<span class=special>{
</span><span class=identifier>vector</span><span class=special><</span><span class=keyword>int</span><span class=special>> </span><span class=identifier>v</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=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>;
</span><span class=comment>// v = [1,2,3,4,4,4,4,4,4,4,4,4,4,5,6,7,8,9]
</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>);
</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>);
</span><span class=comment>// v = [1,2,2,2,2,2,3]
</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>);
</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>);
</span><span class=comment>// v = old v + [1,2,3]
</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>
<span class=special>}</span></pre>
</blockquote>
As we can see, then the first argument to <code>repeat()</code> is the number
of times to repeat the second argument.
</p>
<p>
A more general list can be constructed with <code>repeat_fun()</code>:
<blockquote>
<pre>
<span class=preprocessor>#include </span><span class=special><</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>></span>
<span class=preprocessor>#include </span><span class=special><</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>></span>
<span class=preprocessor>#include </span><span class=special><</span><span class=identifier>cstdlib</span><span class=special>> </span><span class=comment>// for 'rand()'
</span>
<span class=keyword>using </span><span class=keyword>namespace </span><span class=identifier>std</span><span class=special>;</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=special> </span>
<span class=keyword>template</span><span class=special>< </span><span class=keyword>class </span><span class=identifier>T </span><span class=special>></span>
<span class=keyword>struct </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=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>)
</span><span class=special>{ </span><span class=special>}
</span><span class=identifier>T </span><span class=keyword>operator</span><span class=special>()() </span><span class=keyword>
</span><span class=special>{
</span><span class=keyword>return </span><span class=identifier>seed</span><span class=special>++;
</span><span class=special>}</span>
<span class=special>};</span>
<span class=special> </span>
<span class=special>{
</span><span class=identifier>vector</span><span class=special><</span><span class=keyword>int</span><span class=special>> </span><span class=identifier>v</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=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>,&</span><span class=identifier>rand</span><span class=special>),</span><span class=number>4</span><span class=special>;
</span><span class=comment>// v = [1,2,?,?,?,?,4]
</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>);
</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><</span><span class=keyword>int</span><span class=special>>(</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><</span><span class=keyword>int</span><span class=special>>(</span><span class=number>5</span><span class=special>));
</span><span class=comment>// v = old v + [0,1,2,3,4,5,6,7,8]
</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>
<span class=special>}</span> </pre>
</blockquote>
The only requirement of the second argument to <code>repeat_fun()</code> is that
it is a nullary function. </p>
<p>
If you just need to insert an iterator-range somewhere in the list, the member function <code>range()</code> provides just what you want.
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
<blockquote><pre><span class=preprocessor>#include</span> <span class=special><</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>></span> <span class=comment>// for 'push_back()'</span>
<span class=preprocessor>#include</span> <span class=special><</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>></span> <span class=comment>// for 'list_of()' and 'ref_list_of()'</span>
<span class=preprocessor>#include</span> <span class=special><</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>></span>
<span class=keyword>using</span> <span class=keyword>namespace</span> <span class=identifier>std</span><span class=special>;</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=special>{</span>
<span class=identifier>vector</span><span class=special><</span><span class=keyword>int</span><span class=special>></span> <span class=identifier>v</span><span class=special>,</span> <span class=identifier>v2</span><span class=special>;</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=number>2</span><span class=special>)(</span><span class=number>3</span><span class=special>);</span>
<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>
<span class=comment>// v2 = [0,1,2,3,1,2,3,4]</span>
<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>
<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>
<span class=comment>// v = [1,2,3,0,1,2,3,1,2,3,4,5]</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>12u</span> <span class=special>);</span>
<span class=comment>//
// create a list of references, some coming from a container, others from the stack
//</span>
<span class=keyword>int</span> <span class=identifier>x</span> <span class=special>=</span> <span class=number>0</span><span class=special>;</span>
<span class=keyword>int</span> <span class=identifier>y</span> <span class=special>=</span> <span class=number>1</span><span class=special>;</span>
<span class=identifier>BOOST_ASSERT</span><span class=special>(</span> <span class=identifier>ref_list_of</span><span class=special><</span><span class=number>10</span><span class=special>>(</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>
<span class=special>}</span></pre>
</blockquote>
As you can see, one can also pass two iterators if that is more appropriate.
The l