Boost range
Therefore we would like to raise the abstraction level for algorithms so they specify their interface in terms of Ranges as much as possible.
NOTE: range其实是一个abstraction layer,或者说是***layer of indirection***,或者说是adapter。
Overview
A Range is a concept similar to the STL Container concept.
The motivation for the Range concept is that there are many useful Container-like types that do not meet the full requirements of Container, and many algorithms that can be written with this reduced set of requirements. In particular, a Range does not necessarily
- own the elements that can be accessed through it,
- have copy semantics,
NOTE:
range
是对container概念的推广
The operations that can be performed on a Range is dependent on the traversal category of the underlying iterator type. Therefore the range concepts are named to reflect which traversal category its iterators support. See also terminology and style guidelines. for more information about naming of ranges.
NOTE: 上面这段话揭示了
range
和iterator
之间的关系,理解上面这段话是快速理解后面内容的关键所在。
Single Pass Range
NOTE: 对应的iterator是Single Pass Iterator.
Forward Range
NOTE: 对应的iterator是Forward Traversal Iterator.
Bidirectional Range
NOTE: 对应的iterator是Bidirectional Range.
Random Access Range
对应的iterator是Random Access Traversal Iterator.
Concept Checking
NOTE: concept checking其实就是就是c++20的concept特性。
Reference
Overview
Synopsis
namespace boost
{
//
// Single Pass Range metafunctions
//
template< class T, class Enabler=void >
struct range_iterator;
template< class T >
struct range_value;
template< class T >
struct range_reference;
template< class T >
struct range_pointer;
template< class T >
struct range_category;
//
// Forward Range metafunctions
//
template< class T >
struct range_difference;
//
// Bidirectional Range metafunctions
//
template< class T >
struct range_reverse_iterator;
//
// Single Pass Range functions
//
template< class T >
typename range_iterator<T>::type
begin( T& r );
template< class T >
typename range_iterator<const T>::type
begin( const T& r );
template< class T >
typename range_iterator<T>::type
end( T& r );
template< class T >
typename range_iterator<const T>::type
end( const T& r );
template< class T >
bool
empty( const T& r );
//
// Forward Range functions
//
template< class T >
typename range_difference<T>::type
distance( const T& r );
template< class T >
typename range_size<T>::type
size( const T& r );
//
// Bidirectional Range functions
//
template< class T >
typename range_reverse_iterator<T>::type
rbegin( T& r );
template< class T >
typename range_reverse_iterator<const T>::type
rbegin( const T& r );
template< class T >
typename range_reverse_iterator<T>::type
rend( T& r );
template< class T >
typename range_reverse_iterator<const T>::type
rend( const T& r );
//
// Special const Range functions
//
template< class T >
typename range_iterator<const T>::type
const_begin( const T& r );
template< class T >
typename range_iterator<const T>::type
const_end( const T& r );
template< class T >
typename range_reverse_iterator<const T>::type
const_rbegin( const T& r );
template< class T >
typename range_reverse_iterator<const T>::type
const_rend( const T& r );
//
// String utilities
//
template< class T >
iterator_range< ... see below ... >
as_literal( T& r );
template< class T >
iterator_range< ... see below ... >
as_literal( const T& r );
template< class T >
iterator_range< typename range_iterator<T>::type >
as_array( T& r );
template< class T >
iterator_range< typename range_iterator<const T>::type >
as_array( const T& r );
} // namespace 'boost'