mirror of
https://github.com/boostorg/assign.git
synced 2026-01-19 04:02:09 +00:00
added lost changes from 1.34 branch
[SVN r40785]
This commit is contained in:
@@ -37,7 +37,7 @@
|
||||
<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> and <code>repeat_fun()</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>,
|
||||
@@ -50,7 +50,8 @@
|
||||
<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> and <code>repeat_fun()</code> </a>
|
||||
<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>
|
||||
@@ -118,7 +119,7 @@ components are explained in these sections:
|
||||
<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> and <code>repeat_fun()</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>
|
||||
@@ -336,7 +337,7 @@ If you are working with tuples, it might be convenient to use
|
||||
</pre>
|
||||
</blockquote>
|
||||
|
||||
<h3>Functions <code>repeat()</code> and <code>repeat_fun()</code> <a name="repeat"></h3>
|
||||
<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:
|
||||
@@ -406,6 +407,40 @@ A more general list can be constructed with <code>repeat_fun()</code>:
|
||||
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 last example also introduces list of references. More about that below.
|
||||
</p>
|
||||
|
||||
<h3>Functions <code>ref_list_of()</code> and <code>cref_list_of()</code> <a name="ref_list_of"></h3>
|
||||
|
||||
When you need to create an anonymous range of values and speed is essential,
|
||||
@@ -615,13 +650,13 @@ Here is a small example:
|
||||
</span>
|
||||
<span class=special>{
|
||||
</span><span class=identifier>ptr_deque</span><span class=special><</span><span class=identifier>Foo</span><span class=special>> </span><span class=identifier>deq</span><span class=special>;
|
||||
</span><span class=identifier>deq </span><span class=special>= </span><span class=identifier>ptr_list_of</span><span class=special><</span><span class=identifier>Foo</span><span class=special>>( </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>"foo"</span><span class=special>, </span><span class=number>2</span><span class=special>, </span><span class=number>1 </span><span class=special>).</span><span class=identifier>to_container</span><span class=special>( </span><span class=identifier>deq </span><span class=special>);
|
||||
</span><span class=identifier>deq </span><span class=special>= </span><span class=identifier>ptr_list_of</span><span class=special><</span><span class=identifier>Foo</span><span class=special>>( </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>"foo"</span><span class=special>, </span><span class=number>2</span><span class=special>, </span><span class=number>1 </span><span class=special>);
|
||||
</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>
|
||||
<span class=special>}</span>
|
||||
</pre>
|
||||
</blockquote>
|
||||
|
||||
Notice the trailing <code>.to_container(deq)</code> which helps many poor
|
||||
Notice that a trailing <code>.to_container(deq)</code> may be added to help many poor
|
||||
compilers to figure out the conversion (a few get it right).
|
||||
Notice also that pointer maps are
|
||||
not supported.
|
||||
@@ -684,7 +719,9 @@ Originally arguments were passed by value (and still is in
|
||||
<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> and <code>repeat_fun()</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>
|
||||
@@ -917,11 +954,13 @@ The object returned by the two
|
||||
<span class=special>} </span><span class=comment>// namespace 'assign'</span>
|
||||
<span class=special>} </span><span class=comment>// namespace 'boost'</span> </pre></blockquote>
|
||||
|
||||
<h3>Functions <code>repeat()</code> and
|
||||
<code>repeat_fun()</code> <a name="repeat_ref"> </h3>
|
||||
|
||||
<h3>Functions <code>repeat()</code>,
|
||||
<code>repeat_fun()</code> and <code>range()</code> <a name="repeat_ref"> </h3>
|
||||
<p>
|
||||
These two function exist both as free-standing functions and as member functions of the object returned by
|
||||
<code>list_of()</code> and of <code>list_inserter</code>. The free-standing versions are used to create a
|
||||
These first two function exist both as free-standing functions and as member functions of the object returned by
|
||||
<code>list_of()</code> and of <code>list_inserter</code>.
|
||||
The free-standing versions are used to create a
|
||||
hook for <code>operator,()</code> so we can call the functions in the middle of a comma-list. The member functions
|
||||
are used when we need to call the functions in the middle of a parenthesis-list. In both cases we have that
|
||||
<ul>
|
||||
@@ -930,6 +969,17 @@ The object returned by the two
|
||||
<li> the argument list of <code>repeat_fun()</code> is <code>(std::size_t,Nullary_function)</code>
|
||||
</ul>
|
||||
|
||||
</p>
|
||||
<p>
|
||||
The function <code>range()</code> only exists as a member function. The following two overloads are provided:
|
||||
<blockquote>
|
||||
<pre><span class=keyword>template</span><span class=special><</span> <span class=keyword>class</span> <span class=identifier>SinglePassIterator</span> <span class=special>></span>
|
||||
<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>
|
||||
|
||||
<span class=keyword>template</span><span class=special><</span> <span class=keyword>class</span> <span class=identifier>SinglePassRange</span> <span class=special>></span>
|
||||
<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>&</span> <span class=identifier>rng</span> <span class=special>);</span></pre>
|
||||
</blockquote>
|
||||
|
||||
</p>
|
||||
|
||||
<h3><a name="list_inserter">Class <code>list_inserter</code></a></h3>
|
||||
|
||||
@@ -1,3 +1,10 @@
|
||||
/*
|
||||
#// Copyright Thorsten Ottosen 2003-2005. Use, modification and
|
||||
#// distribution is subject to the Boost Software License, Version
|
||||
#// 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
||||
#// http://www.boost.org/LICENSE_1_0.txt)
|
||||
*/
|
||||
|
||||
pre{
|
||||
BORDER-RIGHT: gray 1pt solid;
|
||||
PADDING-RIGHT: 2pt;
|
||||
|
||||
14
index.html
14
index.html
@@ -10,11 +10,15 @@
|
||||
|
||||
<body>
|
||||
Automatic redirection failed, please go to
|
||||
<a href="doc/index.html">doc/index.html</a> <hr>
|
||||
<p>© Copyright Beman Dawes, 2001</p>
|
||||
<p>Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
<a href="doc/index.html">doc/index.html</a>
|
||||
<p>
|
||||
Copyright © 2003-2007 Thorsten Ottosen. Use, modification and distribution is
|
||||
subject to the Boost Software License, Version 1.0 (see LICENSE_1_0.txt)
|
||||
(See accompanying
|
||||
file <a href="../../LICENSE_1_0.txt">LICENSE_1_0.txt</a> or copy
|
||||
at <a href="http://www.boost.org/LICENSE_1_0.txt">www.boost.org/LICENSE_1_0.txt</a>)</p>
|
||||
at <a href="http://www.boost.org/LICENSE_1_0.txt">www.boost.org/LICENSE_1_0.txt</a>)
|
||||
</p>
|
||||
</body>
|
||||
</html></body>
|
||||
</html>
|
||||
|
||||
</html>
|
||||
|
||||
34
test/TODO
34
test/TODO
@@ -1,34 +0,0 @@
|
||||
0. add description of empty () for list_of(), list_inserter.
|
||||
1. add repeat description
|
||||
|
||||
3. docs may mention whether hash_map/set can be used
|
||||
as well as upcoming boost::unordered_map/set.
|
||||
|
||||
Maybe exotic containers as circular_buffer and/or
|
||||
multi index container can be shown in example as well.
|
||||
|
||||
4. update docs wrt member function addresses + std namespace
|
||||
5. update email example to use a local functor
|
||||
|
||||
6: find conversion problem in g++ with nested list_of().
|
||||
7. add repeat etc to header overview.
|
||||
|
||||
8. Consider optimising generic_list to store only references
|
||||
to the object in the list. Even if compound objects are
|
||||
stored, then maybe tuples of opetional<T&> can be stored
|
||||
and construction deferred until the conversion to a
|
||||
container is needed. A special iterator could construct
|
||||
the objects on demand
|
||||
|
||||
9. The decay problem should be solved once and for all by something like
|
||||
|
||||
template< class T >
|
||||
generic_list< decay_array<T>::type > list_of( const T& );
|
||||
|
||||
or decay_traits<T>::type
|
||||
|
||||
10. Consider adding list_of and iterable_list_of to complement each other.
|
||||
However, for tight code, list_of<7> works pretty well and provides
|
||||
random_access iterators. recursive_list_of(2)(6);
|
||||
|
||||
11. make begin()/end() const members
|
||||
Reference in New Issue
Block a user