forked from boostorg/iterator
Added first (rough) draft of quickbook documentation
[SVN r30962]
This commit is contained in:
248
doc/quickbook/shared_container_iterator.qbk
Normal file
248
doc/quickbook/shared_container_iterator.qbk
Normal file
@ -0,0 +1,248 @@
|
||||
|
||||
[section:shared_container Shared Container Iterator]
|
||||
|
||||
Defined in header [@../../../boost/shared_container_iterator.hpp `boost/shared_container_iterator.hpp`].
|
||||
|
||||
The purpose of the shared container iterator is to attach the lifetime
|
||||
of a container to the lifetime of its iterators. In other words, the
|
||||
container will not be deleted until after all its iterators are
|
||||
destroyed. The shared container iterator is typically used to
|
||||
implement functions that return iterators over a range of objects that
|
||||
only need to exist for the lifetime of the iterators. By returning a
|
||||
pair of shared iterators from a function, the callee can return a
|
||||
heap-allocated range of objects whose lifetime is automatically
|
||||
managed.
|
||||
|
||||
The shared container iterator augments an iterator over a shared
|
||||
container. It maintains a reference count on the shared container. If
|
||||
only shared container iterators hold references to the container, the
|
||||
container's lifetime will end when the last shared container iterator
|
||||
over it is destroyed. In any case, the shared container is guaranteed
|
||||
to persist beyond the lifetime of all the iterators. In all other
|
||||
ways, the shared container iterator behaves the same as its base
|
||||
iterator.
|
||||
|
||||
[h2 Synopsis]
|
||||
|
||||
namespace boost {
|
||||
template <typename Container>
|
||||
class shared_container_iterator;
|
||||
|
||||
template <typename Container>
|
||||
shared_container_iterator<Container>
|
||||
make_shared_container_iterator(typename Container::iterator base,
|
||||
boost::shared_ptr<Container> const& container);
|
||||
|
||||
std::pair<
|
||||
typename shared_container_iterator<Container>,
|
||||
typename shared_container_iterator<Container>
|
||||
>
|
||||
make_shared_container_range(boost::shared_ptr<Container> const& container);
|
||||
}
|
||||
|
||||
[section:shared_container_type The Shared Container Iterator Type]
|
||||
|
||||
template <typename Container> class shared_container_iterator;
|
||||
|
||||
The class template `shared_container_iterator` is the shared container
|
||||
iterator type. The `Container` template type argument must model the
|
||||
[@http://www.sgi.com/tech/stl/Container.html Container] concept.
|
||||
|
||||
[h2 Example]
|
||||
|
||||
The following example illustrates how to create an iterator that
|
||||
regulates the lifetime of a reference counted `std::vector`. Though the
|
||||
original shared pointer `ints` ceases to exist after `set_range()`
|
||||
returns, the `shared_counter_iterator` objects maintain references to
|
||||
the underlying vector and thereby extend the container's lifetime.
|
||||
|
||||
[@../../../libs/utility/shared_iterator_example1.cpp `shared_iterator_example1.cpp`]:
|
||||
|
||||
#include "shared_container_iterator.hpp"
|
||||
#include "boost/shared_ptr.hpp"
|
||||
#include <algorithm>
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
|
||||
typedef boost::shared_container_iterator< std::vector<int> > iterator;
|
||||
|
||||
|
||||
void set_range(iterator& i, iterator& end) {
|
||||
|
||||
boost::shared_ptr< std::vector<int> > ints(new std::vector<int>());
|
||||
|
||||
ints->push_back(0);
|
||||
ints->push_back(1);
|
||||
ints->push_back(2);
|
||||
ints->push_back(3);
|
||||
ints->push_back(4);
|
||||
ints->push_back(5);
|
||||
|
||||
i = iterator(ints->begin(),ints);
|
||||
end = iterator(ints->end(),ints);
|
||||
}
|
||||
|
||||
|
||||
int main() {
|
||||
|
||||
iterator i,end;
|
||||
|
||||
set_range(i,end);
|
||||
|
||||
std::copy(i,end,std::ostream_iterator<int>(std::cout,","));
|
||||
std::cout.put('\n');
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
The output from this part is:
|
||||
|
||||
0,1,2,3,4,5,
|
||||
|
||||
[table Template Parameters
|
||||
[[Parameter][Description]]
|
||||
[[Container][The type of the container that we wish to iterate over. It must be a model of the Container concept.]]
|
||||
]
|
||||
|
||||
[h2 Concepts]
|
||||
|
||||
The `shared_container_iterator` type models the same iterator concept
|
||||
as the base iterator (`Container::iterator`).
|
||||
|
||||
[h2 Operations]
|
||||
|
||||
The `shared_container_iterator` type implements the member functions
|
||||
and operators required of the
|
||||
[@http://www.sgi.com/tech/stl/RandomAccessIterator.html Random Access
|
||||
Iterator] concept, though only operations defined for the base
|
||||
iterator will be valid. In addition it has the following constructor:
|
||||
|
||||
shared_container_iterator(Container::iterator const& it,
|
||||
boost::shared_ptr<Container> const& container)
|
||||
|
||||
[endsect]
|
||||
|
||||
[section:shared_container_object_generator The Shared Container Iterator Object Generator]
|
||||
|
||||
template <typename Container>
|
||||
shared_container_iterator<Container>
|
||||
make_shared_container_iterator(Container::iterator base,
|
||||
boost::shared_ptr<Container> const& container)
|
||||
|
||||
This function provides an alternative to directly constructing a
|
||||
`shared_container_iterator`. Using the object generator, a
|
||||
`shared_container_iterator` can be created and passed to a function without
|
||||
explicitly specifying its type.
|
||||
|
||||
[h2 Example]
|
||||
|
||||
This example, similar to the previous,
|
||||
uses `make_shared_container_iterator()` to create the iterators.
|
||||
|
||||
[@../../../libs/utility/shared_iterator_example2.cpp `shared_iterator_example2.cpp`]:
|
||||
|
||||
#include "shared_container_iterator.hpp"
|
||||
#include "boost/shared_ptr.hpp"
|
||||
#include <algorithm>
|
||||
#include <iterator>
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
|
||||
|
||||
template <typename Iterator>
|
||||
void print_range_nl (Iterator begin, Iterator end) {
|
||||
typedef typename std::iterator_traits<Iterator>::value_type val;
|
||||
std::copy(begin,end,std::ostream_iterator<val>(std::cout,","));
|
||||
std::cout.put('\n');
|
||||
}
|
||||
|
||||
|
||||
int main() {
|
||||
|
||||
typedef boost::shared_ptr< std::vector<int> > ints_t;
|
||||
{
|
||||
ints_t ints(new std::vector<int>());
|
||||
|
||||
ints->push_back(0);
|
||||
ints->push_back(1);
|
||||
ints->push_back(2);
|
||||
ints->push_back(3);
|
||||
ints->push_back(4);
|
||||
ints->push_back(5);
|
||||
|
||||
print_range_nl(boost::make_shared_container_iterator(ints->begin(),ints),
|
||||
boost::make_shared_container_iterator(ints->end(),ints));
|
||||
}
|
||||
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
Observe that the `shared_container_iterator` type is never explicitly
|
||||
named. The output from this example is the same as the previous.
|
||||
|
||||
[endsect]
|
||||
|
||||
[section:shared_container_generator The Shared Container Iterator Range Generator]
|
||||
|
||||
template <typename Container>
|
||||
std::pair<
|
||||
shared_container_iterator<Container>,
|
||||
shared_container_iterator<Container>
|
||||
>
|
||||
make_shared_container_range(boost::shared_ptr<Container> const& container);
|
||||
Class shared_container_iterator is meant primarily to return, using iterators, a range of values that we can guarantee will be alive as long as the iterators are. This is a convenience function to do just that. It is equivalent to
|
||||
std::make_pair(make_shared_container_iterator(container->begin(),container),
|
||||
make_shared_container_iterator(container->end(),container));
|
||||
|
||||
[h2 Example]
|
||||
|
||||
In the following example, a range of values is returned as a pair of shared_container_iterator objects.
|
||||
|
||||
[@../../../libs/utility/shared_iterator_example3.cpp `shared_iterator_example3.cpp`]:
|
||||
|
||||
#include "shared_container_iterator.hpp"
|
||||
#include "boost/shared_ptr.hpp"
|
||||
#include "boost/tuple/tuple.hpp" // for boost::tie
|
||||
#include <algorithm> // for std::copy
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
|
||||
|
||||
typedef boost::shared_container_iterator< std::vector<int> > iterator;
|
||||
|
||||
std::pair<iterator,iterator>
|
||||
return_range() {
|
||||
boost::shared_ptr< std::vector<int> > range(new std::vector<int>());
|
||||
range->push_back(0);
|
||||
range->push_back(1);
|
||||
range->push_back(2);
|
||||
range->push_back(3);
|
||||
range->push_back(4);
|
||||
range->push_back(5);
|
||||
return boost::make_shared_container_range(range);
|
||||
}
|
||||
|
||||
|
||||
int main() {
|
||||
|
||||
|
||||
iterator i,end;
|
||||
|
||||
boost::tie(i,end) = return_range();
|
||||
|
||||
std::copy(i,end,std::ostream_iterator<int>(std::cout,","));
|
||||
std::cout.put('\n');
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
Though the range object only lives for the duration of the
|
||||
`return_range` call, the reference counted `std::vector` will live
|
||||
until `i` and `end` are both destroyed. The output from this example is
|
||||
the same as the previous two.
|
||||
|
||||
[endsect]
|
||||
|
||||
[endsect]
|
Reference in New Issue
Block a user