.. Sequences/Classes//range_c |60

.. Copyright Aleksey Gurtovoy, David Abrahams 2007.
.. Distributed under 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)

range_c
=======

Synopsis
--------

.. parsed-literal::
    
    template<
          typename T
        , T Start
        , T Finish
        >
    struct range_c
    {
        typedef integral_c<T,Start> start;
        typedef integral_c<T,Finish> finish;
        // |unspecified|
        // |...|
    };


Description
-----------

``range_c`` is a sorted |Random Access Sequence| of |Integral Constant|\ s. Note 
that because it is not an |Extensible Sequence|, sequence-building 
intrinsic metafunctions such as ``push_front`` and transformation algorithms
such as ``replace`` are not directly applicable |--| to be able to use
them, you'd first need to copy the content of the range into a more suitable
sequence.


Header
------

.. parsed-literal::
    
    #include <boost/mpl/range_c.hpp>


Model of
--------

|Random Access Sequence|


Expression semantics
--------------------

In the following table, ``r`` is an instance of ``range_c``, ``n`` is an |Integral Constant|,
``T`` is an arbitrary integral type, and ``n`` and ``m`` are integral constant values of type ``T``.

+-------------------------------+-----------------------------------------------------------+
| Expression                    | Semantics                                                 |
+===============================+===========================================================+
| .. parsed-literal::           | A sorted |Random Access Sequence| of integral constant    |
|                               | wrappers for the half-open range of values [\ ``n``,      |
|    ``range_c<T,n,m>``         | ``m``): ``integral_c<T,n>``, ``integral_c<T,n+1>``,...    |
|    ``range_c<T,n,m>::type``   | ``integral_c<T,m-1>``.                                    |
|                               |                                                           |
+-------------------------------+-----------------------------------------------------------+
| ``begin<r>::type``            | An iterator pointing to the beginning of ``r``;           |
|                               | see |Random Access Sequence|.                             |
+-------------------------------+-----------------------------------------------------------+
| ``end<r>::type``              | An iterator pointing to the end of ``r``;                 |
|                               | see |Random Access Sequence|.                             |
+-------------------------------+-----------------------------------------------------------+
| ``size<r>::type``             | The size of ``r``; see |Random Access Sequence|.          |
+-------------------------------+-----------------------------------------------------------+
| ``empty<r>::type``            | |true if and only if| ``r`` is empty; see                 |
|                               | |Random Access Sequence|.                                 |
+-------------------------------+-----------------------------------------------------------+
| ``front<r>::type``            | The first element in ``r``; see                           |
|                               | |Random Access Sequence|.                                 |
+-------------------------------+-----------------------------------------------------------+
| ``back<r>::type``             | The last element in ``r``; see                            |
|                               | |Random Access Sequence|.                                 |
+-------------------------------+-----------------------------------------------------------+
| ``at<r,n>::type``             | The ``n``\ th element from the beginning of ``r``; see    |
|                               | |Random Access Sequence|.                                 |
+-------------------------------+-----------------------------------------------------------+


Example
-------

.. parsed-literal::
    
    typedef range_c<int,0,0> range0;
    typedef range_c<int,0,1> range1;
    typedef range_c<int,0,10> range10;
    
    BOOST_MPL_ASSERT_RELATION( size<range0>::value, ==, 0 );
    BOOST_MPL_ASSERT_RELATION( size<range1>::value, ==, 1 );
    BOOST_MPL_ASSERT_RELATION( size<range10>::value, ==, 10 );
    
    BOOST_MPL_ASSERT(( empty<range0> ));
    BOOST_MPL_ASSERT_NOT(( empty<range1> ));
    BOOST_MPL_ASSERT_NOT(( empty<range10> ));
    
    BOOST_MPL_ASSERT(( is_same< begin<range0>::type, end<range0>::type > ));
    BOOST_MPL_ASSERT_NOT(( is_same< begin<range1>::type, end<range1>::type > ));
    BOOST_MPL_ASSERT_NOT(( is_same< begin<range10>::type, end<range10>::type > ));
    
    BOOST_MPL_ASSERT_RELATION( front<range1>::type::value, ==, 0 );
    BOOST_MPL_ASSERT_RELATION( back<range1>::type::value, ==, 0 );
    BOOST_MPL_ASSERT_RELATION( front<range10>::type::value, ==, 0 );
    BOOST_MPL_ASSERT_RELATION( back<range10>::type::value, ==, 9 );


See also
--------

|Sequences|, |Random Access Sequence|, |vector_c|, |set_c|, |list_c|
