2
0
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:
Thorsten Jørgen Ottosen
2007-11-05 13:54:23 +00:00
parent 8cf96a7956
commit 38f95ec3e8
4 changed files with 77 additions and 50 deletions

View File

@@ -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>&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>
<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>
<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>
<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>&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>
<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>&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>
<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>&lt;</span><span class=identifier>Foo</span><span class=special>&gt; </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>&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>).</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>&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>);
</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>&lt;</span> <span class=keyword>class</span> <span class=identifier>SinglePassIterator</span> <span class=special>&gt;</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>&lt;</span> <span class=keyword>class</span> <span class=identifier>SinglePassRange</span> <span class=special>&gt;</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>&amp;</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>

View File

@@ -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;

View File

@@ -10,11 +10,15 @@
<body>
Automatic redirection failed, please go to
<a href="doc/index.html">doc/index.html</a> &nbsp;<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>

View File

@@ -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