123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388 |
- #ifndef BOOST_RANGE_CONCEPTS_HPP
- #define BOOST_RANGE_CONCEPTS_HPP
- #include <boost/concept_check.hpp>
- #include <boost/iterator/iterator_concepts.hpp>
- #include <boost/range/begin.hpp>
- #include <boost/range/end.hpp>
- #include <boost/range/iterator.hpp>
- #include <boost/range/value_type.hpp>
- #include <boost/range/detail/misc_concept.hpp>
- #include <boost/type_traits/remove_reference.hpp>
- #include <iterator>
- namespace boost {
- namespace range_detail {
- #ifndef BOOST_RANGE_ENABLE_CONCEPT_ASSERT
- #ifndef __clang__
- #ifdef __GNUC__
-
-
-
- #if __GNUC__ == 4 && __GNUC_MINOR__ == 2
- #define BOOST_RANGE_ENABLE_CONCEPT_ASSERT 0
- #endif
- #endif
- #ifdef __GCCXML__
-
- #if __GCCXML_GNUC__ == 4 && __GCCXML_GNUC_MINOR__ == 2
- #define BOOST_RANGE_ENABLE_CONCEPT_ASSERT 0
- #endif
- #endif
- #endif
- #ifdef BOOST_BORLANDC
- #define BOOST_RANGE_ENABLE_CONCEPT_ASSERT 0
- #endif
- #ifdef __PATHCC__
- #define BOOST_RANGE_ENABLE_CONCEPT_ASSERT 0
- #endif
- #ifndef BOOST_RANGE_ENABLE_CONCEPT_ASSERT
- #define BOOST_RANGE_ENABLE_CONCEPT_ASSERT 1
- #endif
- #endif
- #if BOOST_RANGE_ENABLE_CONCEPT_ASSERT
- #define BOOST_RANGE_CONCEPT_ASSERT( x ) BOOST_CONCEPT_ASSERT( x )
- #else
- #define BOOST_RANGE_CONCEPT_ASSERT( x )
- #endif
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- template<class Iterator>
- struct IncrementableIteratorConcept : CopyConstructible<Iterator>
- {
- #if BOOST_RANGE_ENABLE_CONCEPT_ASSERT
- typedef BOOST_DEDUCED_TYPENAME iterator_traversal<Iterator>::type traversal_category;
- BOOST_RANGE_CONCEPT_ASSERT((
- Convertible<
- traversal_category,
- incrementable_traversal_tag
- >));
- BOOST_CONCEPT_USAGE(IncrementableIteratorConcept)
- {
- ++i;
- (void)i++;
- }
- private:
- Iterator i;
- #endif
- };
- template<class Iterator>
- struct SinglePassIteratorConcept
- : IncrementableIteratorConcept<Iterator>
- , EqualityComparable<Iterator>
- {
- #if BOOST_RANGE_ENABLE_CONCEPT_ASSERT
- BOOST_RANGE_CONCEPT_ASSERT((
- Convertible<
- BOOST_DEDUCED_TYPENAME SinglePassIteratorConcept::traversal_category,
- single_pass_traversal_tag
- >));
- BOOST_CONCEPT_USAGE(SinglePassIteratorConcept)
- {
- Iterator i2(++i);
- boost::ignore_unused_variable_warning(i2);
-
-
-
-
- (void)(i++);
- BOOST_DEDUCED_TYPENAME std::iterator_traits<Iterator>::reference r1(*i);
- boost::ignore_unused_variable_warning(r1);
- BOOST_DEDUCED_TYPENAME std::iterator_traits<Iterator>::reference r2(*(++i));
- boost::ignore_unused_variable_warning(r2);
- }
- private:
- Iterator i;
- #endif
- };
- template<class Iterator>
- struct ForwardIteratorConcept
- : SinglePassIteratorConcept<Iterator>
- , DefaultConstructible<Iterator>
- {
- #if BOOST_RANGE_ENABLE_CONCEPT_ASSERT
- typedef BOOST_DEDUCED_TYPENAME std::iterator_traits<Iterator>::difference_type difference_type;
- BOOST_MPL_ASSERT((is_integral<difference_type>));
- BOOST_MPL_ASSERT_RELATION(std::numeric_limits<difference_type>::is_signed, ==, true);
- BOOST_RANGE_CONCEPT_ASSERT((
- Convertible<
- BOOST_DEDUCED_TYPENAME ForwardIteratorConcept::traversal_category,
- forward_traversal_tag
- >));
- BOOST_CONCEPT_USAGE(ForwardIteratorConcept)
- {
-
-
-
-
- Iterator i2(i++);
- boost::ignore_unused_variable_warning(i2);
- BOOST_DEDUCED_TYPENAME std::iterator_traits<Iterator>::reference r(*(i++));
- boost::ignore_unused_variable_warning(r);
- }
- private:
- Iterator i;
- #endif
- };
- template<class Iterator>
- struct BidirectionalIteratorConcept
- : ForwardIteratorConcept<Iterator>
- {
- #if BOOST_RANGE_ENABLE_CONCEPT_ASSERT
- BOOST_RANGE_CONCEPT_ASSERT((
- Convertible<
- BOOST_DEDUCED_TYPENAME BidirectionalIteratorConcept::traversal_category,
- bidirectional_traversal_tag
- >));
- BOOST_CONCEPT_USAGE(BidirectionalIteratorConcept)
- {
- --i;
- (void)i--;
- }
- private:
- Iterator i;
- #endif
- };
- template<class Iterator>
- struct RandomAccessIteratorConcept
- : BidirectionalIteratorConcept<Iterator>
- {
- #if BOOST_RANGE_ENABLE_CONCEPT_ASSERT
- BOOST_RANGE_CONCEPT_ASSERT((
- Convertible<
- BOOST_DEDUCED_TYPENAME RandomAccessIteratorConcept::traversal_category,
- random_access_traversal_tag
- >));
- BOOST_CONCEPT_USAGE(RandomAccessIteratorConcept)
- {
- i += n;
- i = i + n;
- i = n + i;
- i -= n;
- i = i - n;
- n = i - j;
- }
- private:
- BOOST_DEDUCED_TYPENAME BidirectionalIteratorConcept<Iterator>::difference_type n;
- Iterator i;
- Iterator j;
- #endif
- };
- }
-
- template<class T>
- struct SinglePassRangeConcept
- {
- #if BOOST_RANGE_ENABLE_CONCEPT_ASSERT
-
-
- typedef BOOST_DEDUCED_TYPENAME remove_reference<T>::type Rng;
- typedef BOOST_DEDUCED_TYPENAME range_iterator<
- Rng const
- >::type const_iterator;
- typedef BOOST_DEDUCED_TYPENAME range_iterator<Rng>::type iterator;
- BOOST_RANGE_CONCEPT_ASSERT((
- range_detail::SinglePassIteratorConcept<iterator>));
- BOOST_RANGE_CONCEPT_ASSERT((
- range_detail::SinglePassIteratorConcept<const_iterator>));
- BOOST_CONCEPT_USAGE(SinglePassRangeConcept)
- {
-
-
-
- iterator i1 = boost::begin(*m_range);
- iterator i2 = boost::end(*m_range);
- boost::ignore_unused_variable_warning(i1);
- boost::ignore_unused_variable_warning(i2);
- const_constraints(*m_range);
- }
- private:
- void const_constraints(const Rng& const_range)
- {
- const_iterator ci1 = boost::begin(const_range);
- const_iterator ci2 = boost::end(const_range);
- boost::ignore_unused_variable_warning(ci1);
- boost::ignore_unused_variable_warning(ci2);
- }
-
-
-
-
- Rng* m_range;
- #endif
- };
-
- template<class T>
- struct ForwardRangeConcept : SinglePassRangeConcept<T>
- {
- #if BOOST_RANGE_ENABLE_CONCEPT_ASSERT
- BOOST_RANGE_CONCEPT_ASSERT((range_detail::ForwardIteratorConcept<BOOST_DEDUCED_TYPENAME ForwardRangeConcept::iterator>));
- BOOST_RANGE_CONCEPT_ASSERT((range_detail::ForwardIteratorConcept<BOOST_DEDUCED_TYPENAME ForwardRangeConcept::const_iterator>));
- #endif
- };
- template<class T>
- struct WriteableRangeConcept
- {
- #if BOOST_RANGE_ENABLE_CONCEPT_ASSERT
- typedef BOOST_DEDUCED_TYPENAME range_iterator<T>::type iterator;
- BOOST_CONCEPT_USAGE(WriteableRangeConcept)
- {
- *i = v;
- }
- private:
- iterator i;
- BOOST_DEDUCED_TYPENAME range_value<T>::type v;
- #endif
- };
-
- template<class T>
- struct WriteableForwardRangeConcept
- : ForwardRangeConcept<T>
- , WriteableRangeConcept<T>
- {
- };
-
- template<class T>
- struct BidirectionalRangeConcept : ForwardRangeConcept<T>
- {
- #if BOOST_RANGE_ENABLE_CONCEPT_ASSERT
- BOOST_RANGE_CONCEPT_ASSERT((range_detail::BidirectionalIteratorConcept<BOOST_DEDUCED_TYPENAME BidirectionalRangeConcept::iterator>));
- BOOST_RANGE_CONCEPT_ASSERT((range_detail::BidirectionalIteratorConcept<BOOST_DEDUCED_TYPENAME BidirectionalRangeConcept::const_iterator>));
- #endif
- };
-
- template<class T>
- struct WriteableBidirectionalRangeConcept
- : BidirectionalRangeConcept<T>
- , WriteableRangeConcept<T>
- {
- };
-
- template<class T>
- struct RandomAccessRangeConcept : BidirectionalRangeConcept<T>
- {
- #if BOOST_RANGE_ENABLE_CONCEPT_ASSERT
- BOOST_RANGE_CONCEPT_ASSERT((range_detail::RandomAccessIteratorConcept<BOOST_DEDUCED_TYPENAME RandomAccessRangeConcept::iterator>));
- BOOST_RANGE_CONCEPT_ASSERT((range_detail::RandomAccessIteratorConcept<BOOST_DEDUCED_TYPENAME RandomAccessRangeConcept::const_iterator>));
- #endif
- };
-
- template<class T>
- struct WriteableRandomAccessRangeConcept
- : RandomAccessRangeConcept<T>
- , WriteableRangeConcept<T>
- {
- };
- }
- #endif
|