Skip to content

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: 上面这段话揭示了rangeiterator之间的关系,理解上面这段话是快速理解后面内容的关键所在。

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'

Semantics

Metafunctions