iterator_concepts.hpp
来自「CGAL is a collaborative effort of severa」· HPP 代码 · 共 309 行
HPP
309 行
// (C) Copyright Jeremy Siek 2002.// 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)#ifndef BOOST_ITERATOR_CONCEPTS_HPP#define BOOST_ITERATOR_CONCEPTS_HPP// Revision History// 26 Apr 2003 thw// Adapted to new iterator concepts// 22 Nov 2002 Thomas Witt// Added interoperable concept.#include <boost/concept_check.hpp>#include <boost/iterator/iterator_categories.hpp>// Use boost::detail::iterator_traits to work around some MSVC/Dinkumware problems.#include <boost/detail/iterator.hpp>#include <boost/type_traits/is_same.hpp>#include <boost/type_traits/is_integral.hpp>#include <boost/type_traits/is_convertible.hpp>#include <boost/mpl/bool.hpp>#include <boost/mpl/if.hpp>#include <boost/mpl/and.hpp>#include <boost/mpl/or.hpp>#include <boost/static_assert.hpp>// Use boost/limits to work around missing limits headers on some compilers#include <boost/limits.hpp>#include <boost/config.hpp>#include <algorithm>namespace boost_concepts { // Used a different namespace here (instead of "boost") so that the // concept descriptions do not take for granted the names in // namespace boost. // We use this in place of STATIC_ASSERT((is_convertible<...>)) // because some compilers (CWPro7.x) can't detect convertibility. // // Of course, that just gets us a different error at the moment with // some tests, since new iterator category deduction still depends // on convertibility detection. We might need some specializations // to support this compiler. template <class Target, class Source> struct static_assert_base_and_derived { static_assert_base_and_derived(Target* = (Source*)0) {} }; //=========================================================================== // Iterator Access Concepts template <typename Iterator> class ReadableIteratorConcept { public: typedef BOOST_DEDUCED_TYPENAME boost::detail::iterator_traits<Iterator>::value_type value_type; void constraints() { boost::function_requires< boost::AssignableConcept<Iterator> >(); boost::function_requires< boost::CopyConstructibleConcept<Iterator> >(); value_type v = *i; boost::ignore_unused_variable_warning(v); } Iterator i; }; template < typename Iterator , typename ValueType = BOOST_DEDUCED_TYPENAME boost::detail::iterator_traits<Iterator>::value_type > class WritableIteratorConcept { public: void constraints() { boost::function_requires< boost::CopyConstructibleConcept<Iterator> >(); *i = v; } ValueType v; Iterator i; }; template <typename Iterator> class SwappableIteratorConcept { public: void constraints() { std::iter_swap(i1, i2); } Iterator i1; Iterator i2; }; template <typename Iterator> class LvalueIteratorConcept { public: typedef typename boost::detail::iterator_traits<Iterator>::value_type value_type; void constraints() { value_type& r = const_cast<value_type&>(*i); boost::ignore_unused_variable_warning(r); } Iterator i; }; //=========================================================================== // Iterator Traversal Concepts template <typename Iterator> class IncrementableIteratorConcept { public: typedef typename boost::iterator_traversal<Iterator>::type traversal_category; void constraints() { boost::function_requires< boost::AssignableConcept<Iterator> >(); boost::function_requires< boost::CopyConstructibleConcept<Iterator> >(); BOOST_STATIC_ASSERT( (boost::is_convertible< traversal_category , boost::incrementable_traversal_tag >::value )); ++i; (void)i++; } Iterator i; }; template <typename Iterator> class SinglePassIteratorConcept { public: typedef typename boost::iterator_traversal<Iterator>::type traversal_category; typedef typename boost::detail::iterator_traits<Iterator>::difference_type difference_type; void constraints() { boost::function_requires< IncrementableIteratorConcept<Iterator> >(); boost::function_requires< boost::EqualityComparableConcept<Iterator> >(); BOOST_STATIC_ASSERT( (boost::is_convertible< traversal_category , boost::single_pass_traversal_tag >::value )); } }; template <typename Iterator> class ForwardTraversalConcept { public: typedef typename boost::iterator_traversal<Iterator>::type traversal_category; typedef typename boost::detail::iterator_traits<Iterator>::difference_type difference_type; void constraints() { boost::function_requires< SinglePassIteratorConcept<Iterator> >(); boost::function_requires< boost::DefaultConstructibleConcept<Iterator> >(); typedef boost::mpl::and_< boost::is_integral<difference_type>, boost::mpl::bool_< std::numeric_limits<difference_type>::is_signed > > difference_type_is_signed_integral; BOOST_STATIC_ASSERT(difference_type_is_signed_integral::value); BOOST_STATIC_ASSERT( (boost::is_convertible< traversal_category , boost::forward_traversal_tag >::value )); } }; template <typename Iterator> class BidirectionalTraversalConcept { public: typedef typename boost::iterator_traversal<Iterator>::type traversal_category; void constraints() { boost::function_requires< ForwardTraversalConcept<Iterator> >(); BOOST_STATIC_ASSERT( (boost::is_convertible< traversal_category , boost::bidirectional_traversal_tag >::value )); --i; (void)i--; } Iterator i; }; template <typename Iterator> class RandomAccessTraversalConcept { public: typedef typename boost::iterator_traversal<Iterator>::type traversal_category; typedef typename boost::detail::iterator_traits<Iterator>::difference_type difference_type; void constraints() { boost::function_requires< BidirectionalTraversalConcept<Iterator> >(); BOOST_STATIC_ASSERT( (boost::is_convertible< traversal_category , boost::random_access_traversal_tag >::value )); i += n; i = i + n; i = n + i; i -= n; i = i - n; n = i - j; } difference_type n; Iterator i, j; }; //=========================================================================== // Iterator Interoperability Concept namespace detail { template <typename Iterator1, typename Iterator2> void interop_single_pass_constraints(Iterator1 const& i1, Iterator2 const& i2) { bool b; b = i1 == i2; b = i1 != i2; b = i2 == i1; b = i2 != i1; } template <typename Iterator1, typename Iterator2> void interop_rand_access_constraints(Iterator1 const& i1, Iterator2 const& i2, boost::random_access_traversal_tag, boost::random_access_traversal_tag) { bool b; typename boost::detail::iterator_traits<Iterator2>::difference_type n; b = i1 < i2; b = i1 <= i2; b = i1 > i2; b = i1 >= i2; n = i1 - i2; b = i2 < i1; b = i2 <= i1; b = i2 > i1; b = i2 >= i1; n = i2 - i1; } template <typename Iterator1, typename Iterator2> void interop_rand_access_constraints(Iterator1 const& i1, Iterator2 const& i2, boost::single_pass_traversal_tag, boost::single_pass_traversal_tag) { } } // namespace detail template <typename Iterator, typename ConstIterator> class InteroperableIteratorConcept { public: typedef typename boost::detail::pure_traversal_tag< typename boost::iterator_traversal< Iterator >::type >::type traversal_category; typedef typename boost::detail::pure_traversal_tag< typename boost::iterator_traversal< ConstIterator >::type >::type const_traversal_category; void constraints() { boost::function_requires< SinglePassIteratorConcept<Iterator> >(); boost::function_requires< SinglePassIteratorConcept<ConstIterator> >(); detail::interop_single_pass_constraints(i, ci); detail::interop_rand_access_constraints(i, ci, traversal_category(), const_traversal_category()); ci = i; } Iterator i; ConstIterator ci; };} // namespace boost_concepts#endif // BOOST_ITERATOR_CONCEPTS_HPP
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?