diff -r 820b22e13ff1 -r 39c28ec933dd imgtools/imglib/boostlibrary/boost/range/concepts.hpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/imgtools/imglib/boostlibrary/boost/range/concepts.hpp Mon May 10 19:54:49 2010 +0100 @@ -0,0 +1,140 @@ +// Boost.Range library concept checks +// +// Copyright Daniel Walker 2006. Use, modification and distribution +// are subject to 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) +// +// For more information, see http://www.boost.org/libs/range/ +// + +#ifndef BOOST_RANGE_CONCEPTS_HPP +#define BOOST_RANGE_CONCEPTS_HPP + +#include +#include +#include +#include + +/*! + * \file + * \brief Concept checks for the Boost Range library. + * + * The structures in this file may be used in conjunction with the + * Boost Concept Check library to insure that the type of a function + * parameter is compatible with a range concept. If not, a meaningful + * compile time error is generated. Checks are provided for the range + * concepts related to iterator traversal categories. For example, the + * following line checks that the type T models the ForwardRange + * concept. + * + * \code + * function_requires >(); + * \endcode + * + * An additional concept check is required for the value access + * property of the range. For example to check for a + * ForwardReadableRange, the following code is required. + * + * \code + * function_requires >(); + * function_requires< + * ReadableIteratorConcept< + * typename range_iterator::type + * > + * >(); + * \endcode + * + * \see http://www.boost.org/libs/range/doc/range.html for details + * about range concepts. + * \see http://www.boost.org/libs/iterator/doc/iterator_concepts.html + * for details about iterator concepts. + * \see http://www.boost.org/libs/concept_check/concept_check.htm for + * details about concept checks. + */ + +namespace boost { + + //! Check if a type T models the SinglePassRange range concept. + template + struct SinglePassRangeConcept + { + typedef typename range_iterator::type range_const_iterator; + typedef typename range_iterator::type range_iterator; + + void constraints() + { + function_requires< + boost_concepts::SinglePassIteratorConcept< + range_iterator + > + >(); + i = boost::begin(a); + i = boost::end(a); + const_constraints(a); + } + + void const_constraints(const T& a) + { + ci = boost::begin(a); + ci = boost::end(a); + } + T a; + range_iterator i; + range_const_iterator ci; + }; + + //! Check if a type T models the ForwardRange range concept. + template + struct ForwardRangeConcept + { + void constraints() + { + function_requires< + SinglePassRangeConcept + >(); + function_requires< + boost_concepts::ForwardTraversalConcept< + typename range_iterator::type + > + >(); + } + }; + + //! Check if a type T models the BidirectionalRange range concept. + template + struct BidirectionalRangeConcept + { + void constraints() + { + function_requires< + ForwardRangeConcept + >(); + function_requires< + boost_concepts::BidirectionalTraversalConcept< + typename range_iterator::type + > + >(); + } + }; + + //! Check if a type T models the RandomAccessRange range concept. + template + struct RandomAccessRangeConcept + { + void constraints() + { + function_requires< + BidirectionalRangeConcept + >(); + function_requires< + boost_concepts::RandomAccessTraversalConcept< + typename range_iterator::type + > + >(); + } + }; + +} // namespace boost + +#endif // BOOST_RANGE_CONCEPTS_HPP