diff --git a/development/boost/iterator_categories.hpp b/development/boost/iterator_categories.hpp new file mode 100644 index 0000000..138a5be --- /dev/null +++ b/development/boost/iterator_categories.hpp @@ -0,0 +1,159 @@ +#ifndef BOOST_ITERATOR_CATEGORIES_HPP +#define BOOST_ITERATOR_CATEGORIES_HPP + +#include +#include +#include +#include +#include + +namespace boost { + + // Return Type Categories + struct readable_iterator_tag { }; + struct writable_iterator_tag { }; + struct swappable_iterator_tag { }; + struct mutable_lvalue_iterator_tag : + virtual public writable_iterator_tag, + virtual public readable_iterator_tag { }; + struct constant_lvalue_iterator_tag : + virtual public readable_iterator_tag { }; + + // Traversal Categories + struct forward_traversal_tag { }; + struct bidirectional_traversal_tag : public forward_traversal_tag { }; + struct random_access_traversal_tag : public bidirectional_traversal_tag { }; + + struct error_iterator_tag { }; + + // Inherit from iterator_base if your iterator defines its own + // return_category and traversal_category. Otherwise, the "old style" + // iterator category will be mapped to the return_category and + // traversal_category. + struct new_iterator_base { }; + + namespace detail { + + struct return_category_from_nested_type { + template struct bind { + typedef typename Iterator::return_category type; + }; + }; + + struct traversal_category_from_nested_type { + template struct bind { + typedef typename Iterator::traversal_category type; + }; + }; + + template + struct choose_lvalue_return { + typedef typename ct_if::value, + boost::constant_lvalue_iterator_tag, + boost::mutable_lvalue_iterator_tag>::type type; + }; + + + template + struct iter_category_to_return { + typedef typename ct_if< + is_convertible::value, + typename choose_lvalue_return::type, + typename ct_if< + is_convertible::value, + boost::readable_iterator_tag, + typename ct_if< + is_convertible::value, + boost::writable_iterator_tag, + boost::error_iterator_tag + >::type + >::type + >::type type; + }; + + template + struct iter_category_to_traversal { + typedef typename ct_if< + is_convertible::value, + random_access_traversal_tag, + typename ct_if< + is_convertible::value, + bidirectional_traversal_tag, + forward_traversal_tag + >::type + >::type type; + }; + + struct return_category_from_old_traits { + template class bind { + typedef boost::detail::iterator_traits OldTraits; + typedef typename OldTraits::iterator_category Cat; + typedef typename OldTraits::value_type value_type; + public: + typedef iter_category_to_return::type type; + }; + }; + + struct traversal_category_from_old_traits { + template class bind { + typedef boost::detail::iterator_traits OldTraits; + typedef typename OldTraits::iterator_category Cat; + public: + typedef iter_category_to_traversal::type type; + }; + }; + + template + class choose_return_category { + typedef typename ct_if::value, + return_category_from_nested_type, + return_category_from_old_traits>::type Choice; + public: + typedef typename Choice:: template bind::type type; + }; + + template + class choose_traversal_category { + typedef typename ct_if::value, + traversal_category_from_nested_type, + traversal_category_from_old_traits>::type Choice; + public: + typedef typename Choice:: template bind::type type; + }; + + } // namespace detail + + template + struct return_category { + typedef typename detail::choose_return_category::type type; + }; + + + template + struct traversal_category { + typedef typename detail::choose_traversal_category::type type; + }; + +#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) + + template + struct return_category + { + typedef typename ct_if::value, + constant_lvalue_iterator_tag, + mutable_lvalue_iterator_tag>::type type; + }; + + template + struct traversal_category + { + typedef random_access_traversal_tag type; + }; + +#endif + +} // namespace boost + +#endif // BOOST_ITERATOR_CATEGORIES_HPP diff --git a/development/boost/iterator_concepts.hpp b/development/boost/iterator_concepts.hpp index a3ddc8b..a30ff17 100644 --- a/development/boost/iterator_concepts.hpp +++ b/development/boost/iterator_concepts.hpp @@ -2,7 +2,7 @@ #define BOOST_ITERATOR_CONCEPTS_HPP #include -#include +#include #include #include @@ -18,10 +18,9 @@ namespace boost_concepts { template class ReadableIteratorConcept { public: - typedef typename boost::iterator_traits::value_type value_type; - typedef typename boost::iterator_traits::reference reference; - typedef typename boost::iterator_traits::return_category - return_category; + typedef typename std::iterator_traits::value_type value_type; + typedef typename std::iterator_traits::reference reference; + typedef typename boost::return_category::type return_category; void constraints() { boost::function_requires< boost::SGIAssignableConcept >(); @@ -42,8 +41,7 @@ namespace boost_concepts { template class WritableIteratorConcept { public: - typedef typename boost::iterator_traits::return_category - return_category; + typedef typename boost::return_category::type return_category; void constraints() { boost::function_requires< boost::SGIAssignableConcept >(); @@ -54,7 +52,7 @@ namespace boost_concepts { BOOST_STATIC_ASSERT((boost::is_convertible::value)); - *i = v; // an alternative could be something like write(x, v) + *i = v; // a good alternative could be something like write(x, v) } ValueType v; Iterator i; @@ -63,10 +61,9 @@ namespace boost_concepts { template class ConstantLvalueIteratorConcept { public: - typedef typename boost::iterator_traits::value_type value_type; - typedef typename boost::iterator_traits::reference reference; - typedef typename boost::iterator_traits::return_category - return_category; + typedef typename std::iterator_traits::value_type value_type; + typedef typename std::iterator_traits::reference reference; + typedef typename boost::return_category::type return_category; void constraints() { boost::function_requires< ReadableIteratorConcept >(); @@ -86,10 +83,9 @@ namespace boost_concepts { template class MutableLvalueIteratorConcept { public: - typedef typename boost::iterator_traits::value_type value_type; - typedef typename boost::iterator_traits::reference reference; - typedef typename boost::iterator_traits::return_category - return_category; + typedef typename std::iterator_traits::value_type value_type; + typedef typename std::iterator_traits::reference reference; + typedef typename boost::return_category::type return_category; void constraints() { boost::function_requires< ReadableIteratorConcept >(); @@ -111,12 +107,9 @@ namespace boost_concepts { // Iterator Traversal Concepts template - class SinglePassIteratorConcept { + class ForwardIteratorConcept { public: - typedef typename boost::iterator_traits::traversal_category - traversal_category; - typedef typename boost::iterator_traits::difference_type - difference_type; + typedef typename boost::traversal_category::type traversal_category; void constraints() { boost::function_requires< boost::SGIAssignableConcept >(); @@ -125,42 +118,23 @@ namespace boost_concepts { boost::DefaultConstructibleConcept >(); BOOST_STATIC_ASSERT((boost::is_convertible::value)); - - // difference_type must be a signed integral type - + boost::forward_traversal_tag*>::value)); ++i; (void)i++; } - Iterator i; }; - template - class ForwardIteratorConcept { - public: - typedef typename boost::iterator_traits::traversal_category - traversal_category; - - void constraints() { - boost::function_requires< SinglePassIteratorConcept >(); - - BOOST_STATIC_ASSERT((boost::is_convertible::value)); - } - }; - template class BidirectionalIteratorConcept { public: - typedef typename boost::iterator_traits::traversal_category - traversal_category; + typedef typename boost::traversal_category::type traversal_category; void constraints() { boost::function_requires< ForwardIteratorConcept >(); BOOST_STATIC_ASSERT((boost::is_convertible::value)); + boost::bidirectional_traversal_tag*>::value)); --i; (void)i--; @@ -171,16 +145,15 @@ namespace boost_concepts { template class RandomAccessIteratorConcept { public: - typedef typename boost::iterator_traits::traversal_category - traversal_category; - typedef typename boost::iterator_traits::difference_type + typedef typename boost::traversal_category::type traversal_category; + typedef typename std::iterator_traits::difference_type difference_type; void constraints() { boost::function_requires< BidirectionalIteratorConcept >(); BOOST_STATIC_ASSERT((boost::is_convertible::value)); + boost::random_access_traversal_tag*>::value)); i += n; i = i + n; diff --git a/development/boost/iterator_traits.hpp b/development/boost/iterator_traits.hpp deleted file mode 100644 index 6f5d9b2..0000000 --- a/development/boost/iterator_traits.hpp +++ /dev/null @@ -1,137 +0,0 @@ -#ifndef BOOST_ITERATOR_TRAITS_HPP -#define BOOST_ITERATOR_TRAITS_HPP - -#include -#include -#include -#include -#include - -namespace boost { - - // Traversal Categories - struct single_pass_iterator_tag { }; - struct forward_iterator_tag : public single_pass_iterator_tag { }; - struct bidirectional_iterator_tag : public forward_iterator_tag { }; - struct random_access_iterator_tag : public bidirectional_iterator_tag { }; - - // Return Type Categories - struct readable_iterator_tag { }; - struct writable_iterator_tag { }; - struct mutable_lvalue_iterator_tag : virtual public writable_iterator_tag, - virtual public readable_iterator_tag { }; - struct constant_lvalue_iterator_tag : public readable_iterator_tag { }; - - struct error_iterator_tag { }; - - // Inherit from iterator_base if your iterator defines its own - // return_category and traversal_category. Otherwise, the "old style" - // iterator category will be mapped to the return_category and - // traversal_category. - struct new_iterator_base { }; - - namespace detail { - - struct iter_traits_from_nested_types { - template struct bind { - typedef typename Iterator::value_type value_type; - typedef typename Iterator::reference reference; - typedef typename Iterator::pointer pointer; - typedef typename Iterator::difference_type difference_type; - typedef typename Iterator::return_category return_category; - typedef typename Iterator::traversal_category traversal_category; - }; - }; - - template - struct choose_lvalue_return { - typedef typename ct_if::value, - boost::constant_lvalue_iterator_tag, - boost::mutable_lvalue_iterator_tag>::type type; - }; - - - template - struct iter_category_to_return { - typedef typename ct_if< - is_convertible::value, - typename choose_lvalue_return::type, - typename ct_if< - is_convertible::value, - boost::readable_iterator_tag, - typename ct_if< - is_convertible::value, - boost::writable_iterator_tag, - boost::error_iterator_tag - >::type - >::type - >::type type; - }; - - template - struct iter_category_to_traversal { - typedef typename ct_if< - is_convertible::value, - boost::random_access_iterator_tag, - typename ct_if< - is_convertible::value, - boost::bidirectional_iterator_tag, - typename ct_if< - is_convertible::value, - boost::forward_iterator_tag, - boost::single_pass_iterator_tag>::type - >::type - >::type type; - }; - - struct iter_traits_from_old_traits { - template class bind { - typedef boost::detail::iterator_traits OldTraits; - typedef typename OldTraits::iterator_category Cat; - public: - typedef typename OldTraits::value_type value_type; - typedef typename OldTraits::reference reference; - typedef typename OldTraits::pointer pointer; - typedef typename OldTraits::difference_type difference_type; - typedef iter_category_to_return::type return_category; - typedef iter_category_to_traversal::type traversal_category; - }; - }; - - template - class choose_iter_traits { - typedef typename ct_if::value, - iter_traits_from_nested_types, - iter_traits_from_old_traits>::type Choice; - public: - typedef typename Choice:: template bind type; - }; - - } // namespace detail - - template - class iterator_traits - : public detail::choose_iter_traits::type { }; - -#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) - - template - struct iterator_traits - { - typedef T value_type; - typedef T& reference; - typedef T* pointer; - typedef std::ptrdiff_t difference_type; - typedef typename ct_if::value, - boost::constant_lvalue_iterator_tag, - boost::mutable_lvalue_iterator_tag>::type - return_category; - typedef boost::random_access_iterator_tag traversal_category; - }; - -#endif - -} // namespace boost - -#endif // BOOST_ITERATOR_TRAITS_HPP