From ea27eb8c93d1ee500751934c421af6671d5ba3e3 Mon Sep 17 00:00:00 2001 From: Thomas Witt Date: Fri, 22 Nov 2002 08:04:08 +0000 Subject: [PATCH] InteroperableConcept added. [SVN r701] --- include/boost/iterator/iterator_concepts.hpp | 114 +++++++++++++++++++ 1 file changed, 114 insertions(+) diff --git a/include/boost/iterator/iterator_concepts.hpp b/include/boost/iterator/iterator_concepts.hpp index 910ac3d..361fa8b 100644 --- a/include/boost/iterator/iterator_concepts.hpp +++ b/include/boost/iterator/iterator_concepts.hpp @@ -7,6 +7,10 @@ #ifndef BOOST_ITERATOR_CONCEPTS_HPP #define BOOST_ITERATOR_CONCEPTS_HPP +// Revision History +// 22 Nov 2002 Thomas Witt +// Added interoperable concept. + #include #include #include @@ -182,6 +186,116 @@ namespace boost_concepts { Iterator i, j; }; + //=========================================================================== + // Iterator Interoperability Concept + + namespace detail { + + template + struct Operations; + + template <> + struct Operations + { + template + static void constraints(Iterator1 const& i1, Iterator2 const& i2) + { + i1 == i2; + i1 != i2; + + i2 == i1; + i2 != i1; + } + }; + + template <> + struct Operations + { + template + static void constraints(Iterator1 const& i1, Iterator2 const& i2) + { + Operations::constraints(i1, i2); + } + }; + + template <> + struct Operations + { + template + static void constraints(Iterator1 const& i1, Iterator2 const& i2) + { + Operations::constraints(i1, i2); + } + }; + + template <> + struct Operations + { + template + static void constraints(Iterator1 const& i1, Iterator2 const& i2) + { + Operations::constraints(i1, i2); + } + }; + + template <> + struct Operations + { + template + static void constraints(Iterator1 const& i1, Iterator2 const& i2) + { + Operations::constraints(i1, i2); + + i1 < i2; + i1 <= i2; + i1 > i2; + i1 >= i2; + i1 - i2; + + i2 < i1; + i2 <= i1; + i2 > i1; + i2 >= i1; + i2 - i1; + } + }; + + }; + + template + class InteroperableConcept + { + public: + typedef typename boost::traversal_category::type traversal_category; + typedef typename boost::detail::iterator_traits::difference_type + difference_type; + + typedef typename boost::traversal_category::type + const_traversal_category; + typedef typename boost::detail::iterator_traits::difference_type + const_difference_type; + + void constraints() { + BOOST_STATIC_ASSERT((boost::is_same< difference_type, + const_difference_type>::value)); + BOOST_STATIC_ASSERT((boost::is_same< traversal_category, + const_traversal_category>::value)); + + detail::Operations::constraints(i, ci); + + ci = i; + + } + Iterator i; + ConstIterator ci; + }; + } // namespace boost_concepts