diff --git a/doc/Jamfile.v2 b/doc/Jamfile.v2
index 4f7b44b..0fafdd7 100644
--- a/doc/Jamfile.v2
+++ b/doc/Jamfile.v2
@@ -2,7 +2,7 @@
use-project boost : $(BOOST_ROOT) ;
-#import boostbook : boostbook ;
+import boostbook : boostbook ;
import quickbook ;
xml boost_range : boost_range.qbk ;
@@ -11,8 +11,12 @@ boostbook standalone
:
boost_range
:
-
- Four types of objects are currently supported by the library:
-
- Warning: support for null-terminated strings is deprecated and will
- disappear in the next Boost release (1.34).
-
- Please also see Range concepts for more details.
-
-
+ Three types of objects are currently supported by the library:
+
+ Please also see Range concepts for more details.
+
+
-
-
-
-
-
-
-
-
- Boost.Range
- Synopsis and Reference
-
-
-
-
-
- Overview
-
-
- Even though the behavior of the primary templates are exactly such that
- standard containers will be supported by default, the requirements are much
- lower than the standard container requirements. For example, the utility class
- std::pair<iterator,iterator>
- char[]
,wchar_t[]
,
- char*
, and wchar_t*
)
- iterator_range
implements the minimal
- interface required to make the class a Forward
- Range
- .
-
- Synopsis
-
+
+
+
+
+
+
+
+
+
+ Boost.Range
+ Synopsis and Reference
+
+
+
+
+
+ Overview
+
+
+ Even though the behavior of the primary templates are exactly such that
+ standard containers will be supported by default, the requirements are much
+ lower than the standard container requirements. For example, the utility class
+ std::pair<iterator,iterator>
+ iterator_range
implements the minimal
+ interface required to make the class a Forward
+ Range
+ .
+
+ Synopsis
+
namespace boost
{
//
// Single Pass Range metafunctions
//
-
- template< class T >
- struct range_value;
-
+
template< class T >
struct range_iterator;
template< class T >
- struct range_const_iterator;
+ struct range_value;
+
+ template< class T >
+ struct range_pointer;
+ template< class T >
+ struct range_category;
+
//
// Forward Range metafunctions
//
@@ -89,10 +86,6 @@ class=identifier>range_const_iterator;
struct range_difference;
- template< class T >
- struct range_size;
-
//
// Bidirectional Range metafunctions
//
@@ -102,24 +95,14 @@ class=identifier>range_size;
href="#range_reverse_iterator">range_reverse_iterator;
- template< class T >
- struct range_const_reverse_iterator;
-
//
- // Special metafunctions
+ // Random Access Range metafunctions
//
template< class T >
- struct range_result_iterator;
-
- template< class T >
- struct range_reverse_result_iterator;
-
+ struct range_size;
+
//
// Single Pass Range functions
//
@@ -129,7 +112,7 @@ class=identifier>range_reverse_result_iterator;
begin( T& c );
template< class T >
- typename range_const_iterator<T>::type
+ typename range_iterator<T>::type
begin( const T& c );
template< class T >
@@ -137,7 +120,7 @@ class=identifier>range_reverse_result_iterator;
end( T& c );
template< class T >
- typename range_const_iterator<T>::type
+ typename range_iterator<T>::type
end( const T& c );
template< class T >
@@ -149,8 +132,8 @@ class=identifier>range_reverse_result_iterator;
//
template< class T >
- typename range_size<T>::type
- size( const T& c );
+ typename range_difference<T>::type
+ distance( const T& c );
//
// Bidirectional Range functions
@@ -161,7 +144,7 @@ class=identifier>range_reverse_result_iterator;
rbegin( T& c );
template< class T >
- typename range_const_reverse_iterator<T>::type
+ typename range_reverse_iterator<T>::type
rbegin( const T& c );
template< class T >
@@ -169,535 +152,544 @@ class=identifier>range_reverse_result_iterator;
rend( T& c );
template< class T >
- typename range_const_reverse_iterator<T>::type
+ typename range_reverse_iterator<T>::type
rend( const T& c );
+
+ //
+ // Random Access Range functions
+ //
+
+ template< class T >
+ typename range_size<T>::type
+ size( const T& c );
+
//
// Special const Range functions
//
template< class T >
- typename range_const_iterator<T>::type
+ typename range_iterator<const T>::type
const_begin( const T& r );
template< class T >
- typename range_const_iterator<T>::type
+ typename range_iterator<const T>::type
const_end( const T& r );
template< class T >
- typename range_const_reverse_iterator<T>::type
+ typename range_reverse_iterator<const T>::type
const_rbegin( const T& r );
template< class T >
- typename range_const_reverse_iterator<T>::type
+ typename range_reverse_iterator<const T>::type
const_rend( const T& r );
} // namespace 'boost'
-
-
- Semantics
- notation
-
-
-
-
-
- Type
-
- Object
-
- Describes
-
- X
- x
- any type
-
-
-
- T
- t
- denotes behavior of the primary templates
-
- P
- p
- denotes
- std::pair<iterator,iterator>
- A[sz]
- a
- denotes an array of type A
of size sz
-
-
-
- Char*
- s
- denotes either
- char*
or wchar_t*
- Please notice in tables below that when four lines appear in a cell, the first - line will describe the primary template, the second line pairs of iterators, - the third line arrays and the last line null-terminated strings. -
--
- The special metafunctions range_result_iterator
and range_reverse_result_iterator
- are not part of any Range concept, but they are very useful when implementing
- certain Range classes like sub_range
- because of their ability to select iterators based on constness.
-
-
- Expression | -- Return type | -- Returns | -- Complexity | -||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
begin(x) |
- range_result_iterator<X>::type |
-
- p.first if p is of type std::pair<T> | |||||||||||||||||||
end(x) |
+ range_result_iterator<X>::type |
+
+ p.second if p is of type std::pair<T> | |||||||||||||||||||
empty(x) |
+ bool |
+ begin(x) == end( x ) + | linear if X is Char*
+ + constant time otherwise + |
+ ||||||||||||||||||
size(x) |
+ range_size<X>::type |
+
+ std::distance(p.first,p.second) if p is of type std::pair<T> | |||||||||||||||||||
rbegin(x) |
+ range_reverse_result_iterator<X>::type |
+ range_reverse_result_iterator<X>::type( end(x) )
+ + | same as end(x)
+ |
+ ||||||||||||||||||
rend(x) |
+ range_reverse_result_iterator<X>::type |
+ range_reverse_result_iterator<X>::type( begin(x) )
+ | same as begin(x) |
+ ||||||||||||||||||
const_begin(x) |
+ range_const_iterator<X>::type |
+ range_const_iterator<X>::type( begin(x) )
+ + | same as begin(x)
+ |
+ ||||||||||||||||||
const_end(x) |
+ range_const_iterator<X>::type |
+ range_const_iterator<X>::type( end(x) )
+ | same as end(x) |
+ ||||||||||||||||||
const_rbegin(x) |
+ range_const_reverse_iterator<X>::type |
+ range_const_reverse_iterator<X>::type( rbegin(x) )
+ + | same as rbegin(x)
+ |
+ ||||||||||||||||||
const_rend(x) |
+ range_const_reverse_iterator<X>::type |
+ range_const_reverse_iterator<X>::type( rend(x) )
+ | same as rend(x) |
+
+ The special const
functions are not part of any Range concept, but
+ are very useful when you want to document clearly that your code is read-only.
+
- This procedure assumes that you have control over the types that should be made - conformant to a Range concept. If not, see method 2. -
- -
- The primary templates in this library are implemented such that standard
- containers will work automatically and so will boost::array
.
- Below is given an overview of which member functions and member types a class
- must specify to be useable as a certain Range concept.
-
-
- Member function | -- Related concept | -
---|---|
begin() |
- Single Pass Range | -
end()
- |
- Single Pass Range | -
size() |
- Forward Range | -
- Notice that rbegin()
and rend()
member functions are
- not needed even though the container can support bidirectional iteration.
-
- The required member types are: -
--
- Member type | -- Related concept | -
---|---|
iterator |
- Single Pass Range | -
const_iterator |
- Single Pass Range | -
size_type |
- Forward Range | -
- Again one should notice that member types reverse_iterator
and const_reverse_iterator
- are not needed.
-
+ This procedure assumes that you have control over the types that should be made + conformant to a Range concept. If not, see method 2. +
+ +
+ The primary templates in this library are implemented such that standard
+ containers will work automatically and so will boost::array
.
+ Below is given an overview of which member functions and member types a class
+ must specify to be useable as a certain Range concept.
+
+
+ Member function | ++ Related concept | +
---|---|
begin() |
+ Single Pass Range | +
end()
+ |
+ Single Pass Range | +
size() |
+ Forward Range | +
+ Notice that rbegin()
and rend()
member functions are
+ not needed even though the container can support bidirectional iteration.
+
+ The required member types are: +
++
+ Member type | ++ Related concept | +
---|---|
iterator |
+ Single Pass Range | +
const_iterator |
+ Single Pass Range | +
size_type |
+ Forward Range | +
+ Again one should notice that member types reverse_iterator
and const_reverse_iterator
+ are not needed.
+
- This procedure assumes that you cannot (or do not wish to) change the types that should be made - conformant to a Range concept. If this is not true, see method 1. -
- -
- The primary templates in this library are implemented such that
- certain functions are found via argument-dependent-lookup (ADL).
- Below is given an overview of which free-standing functions a class
- must specify to be useable as a certain Range concept.
- Let x
be a variable (const
or mutable)
- of the class in question.
-
-
- Function | -- Related concept | -
---|---|
boost_range_begin(x) |
- Single Pass Range | -
boost_range_end(x)
- |
- Single Pass Range | -
boost_range_size(x) |
- Forward Range | -
boost_range_begin()
and boost_range_end()
must be
- overloaded for both const
and mutable reference arguments.
-
- You must also specialize 3 metafunctions for your type X
:
-
-
- Metafunction | -- Related concept | -
---|---|
boost::range_iterator |
- Single Pass Range | -
boost::range_const_iterator |
- Single Pass Range | -
boost::range_size |
- Forward Range | -
- A complete example is given here: -
--++ This procedure assumes that you cannot (or do not wish to) change the types that should be made + conformant to a Range concept. If this is not true, see method 1. +
+ ++ The primary templates in this library are implemented such that + certain functions are found via argument-dependent-lookup (ADL). + Below is given an overview of which free-standing functions a class + must specify to be useable as a certain Range concept. + Let
+x
be a variable (const
or mutable) + of the class in question. ++
+
+ ++ + Function ++ Related concept ++ ++ boost_range_begin(x)
Single Pass Range ++ ++ boost_range_end(x)
+Single Pass Range ++ ++ boost_range_size(x)
Forward Range ++ +
boost_range_begin()
andboost_range_end()
must be + overloaded for bothconst
and mutable reference arguments. ++ You must also specialize 3 metafunctions for your type
+X
: ++
+
+ ++ + Metafunction ++ Related concept ++ ++ boost::range_iterator
Single Pass Range ++ ++ boost::range_const_iterator
Single Pass Range ++ ++ boost::range_size
Forward Range ++ A complete example is given here: +
++- -#include <boost/range.hpp> #include <iterator> // for std::iterator_traits, std::distance() namespace Foo { - // - // Our sample UDT. A 'Pair' - // will work as a range when the stored - // elements are iterators. - // - template< class T > - struct Pair - { - T first, last; - }; + // + // Our sample UDT. A 'Pair' + // will work as a range when the stored + // elements are iterators. + // + template< class T > + struct Pair + { + T first, last; + }; } // namespace 'Foo' namespace boost { - // - // Specialize metafunctions. We must include the range.hpp header. - // We must open the 'boost' namespace. - // + // + // Specialize metafunctions. We must include the range.hpp header. + // We must open the 'boost' namespace. + // - template< class T > - struct range_iterator< Foo::Pair<T> > - { - typedef T type; - }; + template< class T > + struct range_iterator< Foo::Pair<T> > + { + typedef T type; + }; - template< class T > - struct range_const_iterator< Foo::Pair<T> > - { - // - // Remark: this is defined similar to 'range_iterator' - // because the 'Pair' type does not distinguish - // between an iterator and a const_iterator. - // - typedef T type; - }; + template< class T > + struct range_const_iterator< Foo::Pair<T> > + { + // + // Remark: this is defined similar to 'range_iterator' + // because the 'Pair' type does not distinguish + // between an iterator and a const_iterator. + // + typedef T type; + }; - template< class T > - struct range_size< Foo::Pair<T> > - { + template< class T > + struct range_size< Foo::Pair<T> > + { - typedef std::size_t type; - }; + typedef std::size_t type; + }; } // namespace 'boost' namespace Foo { - // - // The required functions. These should be defined in - // the same namespace as 'Pair', in this case - // in namespace 'Foo'. - // - - template< class T > - inline T boost_range_begin( Pair<T>& x ) - { - return x.first; - } + // + // The required functions. These should be defined in + // the same namespace as 'Pair', in this case + // in namespace 'Foo'. + // + + template< class T > + inline T boost_range_begin( Pair<T>& x ) + { + return x.first; + } - template< class T > - inline T boost_range_begin( const Pair<T>& x ) - { - return x.first; - } + template< class T > + inline T boost_range_begin( const Pair<T>& x ) + { + return x.first; + } - template< class T > - inline T boost_range_end( Pair<T>& x ) - { - return x.last; - } + template< class T > + inline T boost_range_end( Pair<T>& x ) + { + return x.last; + } - template< class T > - inline T boost_range_end( const Pair<T>& x ) - { - return x.last; - } + template< class T > + inline T boost_range_end( const Pair<T>& x ) + { + return x.last; + } - template< class T > - inline typename boost::range_size< Pair<T> >::type - boost_range_size( const Pair<T>& x ) - { - return std::distance(x.first,x.last); - } + template< class T > + inline typename boost::range_size< Pair<T> >::type + boost_range_size( const Pair<T>& x ) + { + return std::distance(x.first,x.last); + } } // namespace 'Foo' @@ -705,41 +697,41 @@ class=identifier>T& int main() { - typedef std::vector<int>::iterator iter; - std::vector<int> vec; - Foo::Pair<iter> pair = { vec.begin(), vec.end() }; - const Foo::Pair<iter>& cpair = pair; - // - // Notice that we call 'begin' etc with qualification. - // - iter i = boost::begin( pair ); - iter e = boost::end( pair ); - i = boost::begin( cpair ); - e = boost::end( cpair ); - boost::range_size< Foo::Pair<iter> >::type s = boost::size( pair ); - s = boost::size( cpair ); - boost::range_const_reverse_iterator< Foo::Pair<iter> >::type - ri = boost::rbegin( cpair ), - re = boost::rend( cpair ); -} + typedef std::vector<int>::iterator iter; + std::vector<int> vec; + Foo::Pair<iter> pair = { vec.begin(), vec.end() }; + const Foo::Pair<iter>& cpair = pair; + // + // Notice that we call 'begin' etc with qualification. + // + iter i = boost::begin( pair ); + iter e = boost::end( pair ); + i = boost::begin( cpair ); + e = boost::end( cpair ); + boost::range_size< Foo::Pair<iter> >::type s = boost::size( pair ); + s = boost::size( cpair ); + boost::range_const_reverse_iterator< Foo::Pair<iter> >::type + ri = boost::rbegin( cpair ), + re = boost::rend( cpair ); +}
-- (C) Copyright Thorsten Ottosen 2003-2004 -
-
-
-
-
-
-
-
-
-
-
-
-
- + +
++ (C) Copyright Thorsten Ottosen 2003-2004 +
+
+
+
+
+
+
+
+
+
+
+
+
+ diff --git a/doc/headers.html b/doc/headers.html index f8b12a3..1539ae8 100755 --- a/doc/headers.html +++ b/doc/headers.html @@ -49,6 +49,12 @@range_iterator Single Pass Range + ++ + <boost/range/mutable_iterator.hpp>
range_mutable_iterator +Single Pass Range - @@ -67,27 +73,24 @@ <boost/range/const_iterator.hpp>
range_size Forward Range - - <boost/range/result_iterator.hpp>
range_result_iterator ++ ++ <boost/range/pointer.hpp>
range_pointer - + ++ <boost/range/category.hpp>
range_category +- +- <boost/range/reverse_iterator.hpp>
range_reverse_iterator Bidirectional Range - -- <boost/range/const_reverse_iterator.hpp>
range_const_reverse_iterator -Bidirectional Range -- - <boost/range/reverse_result_iterator.hpp>
range_reverse_result_iterator -- -+ <boost/range/begin.hpp>
@@ -108,11 +111,17 @@ <boost/range/empty.hpp>
empty Single Pass Range ++ + <boost/range/distance.hpp>
distance +Forward Range <boost/range/size.hpp>
size -Forward Range +Random Access Range + + @@ -130,6 +139,21 @@ <boost/range/rbegin.hpp>
Bidirectional Range + ++ <boost/range/as_array.hpp>
+ as_array + +- ++ ++ <boost/range/as_literal.hpp>
+ as_literal + +- +<boost/range/iterator_range.hpp>
- correct handling of null-terminated strings - -- Warning: support for null-terminated strings is deprecated and will - disappear in the next Boost release (1.34). -
+ safe use of built-in arrays- safe use of built-in arrays (for legacy code; why else would you use - built-in arrays?) - Below are given a small example (the complete example can be found here - ): -
+ Below are given a small example (the complete example can be found here):// @@ -89,7 +81,7 @@ free-standing functions so syntactic and/or semantic differences can be removed. } template< class ForwardReadableRange, class T > - inline typename boost::range_const_iterator< inline typename boost::range_iterator< const ForwardReadableRange >::type find( const ForwardReadableRange& c, const T& value ) { @@ -100,7 +92,7 @@ class=identifier>ForwardReadableRange >::template< class ForwardReadableWriteableRange, class T > - inline typename boost::range_size< ForwardReadableWriteableRange >::type + inline typename boost::range_difference< ForwardReadableWriteableRange >::type my_generic_replace( ForwardReadableWriteableRange& c, const T& value, const T& replacement ) { typename boost::range_iterator< ForwardReadableWriteableRange >::type found = find( c, value ); @@ -146,7 +138,7 @@ Notice that we have toForwardTraversalIterator End ); template< class ForwardRange > - iterator_range< typename iterator_of<ForwardRange>::type > + iterator_range< typename iterator<ForwardRange>::type > make_iterator_range( ForwardRange& r ); template< class ForwardRange > - iterator_range< typename const_iterator_of<ForwardRange>::type > + iterator_range< typename const_iterator<ForwardRange>::type > make_iterator_range( const ForwardRange& r ); template< class Range > @@ -305,7 +305,7 @@ class can propagate constness since it knows what a corresponding sub_range( ForwardRange2& r ); template< class ForwardRange2 > - sub_range( const Range2& r ); + sub_range( const ForwardRange2& r ); template< class ForwardRange2 > sub_range& operator=( ForwardRange2& r );
- (C) Copyright Thorsten Ottosen 2003-2004 + (C) Copyright Thorsten Ottosen 2003-2007
diff --git a/doc/utility_class.html b/doc/utility_class.html index 33c95ae..57bf5dc 100644 --- a/doc/utility_class.html +++ b/doc/utility_class.html @@ -173,11 +173,11 @@ class=keyword>const;