diff --git a/development/libs/iterator/iterator_traits.htm b/development/libs/iterator/iterator_traits.htm new file mode 100644 index 0000000..5ebc332 --- /dev/null +++ b/development/libs/iterator/iterator_traits.htm @@ -0,0 +1,92 @@ + + +
++namespace boost { + + template <typename Iterator> + struct iterator_traits + { + if (Iterator inherits from new_iterator_base) { + 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; + } else { + typedef std::iterator_traits<Iterator> OldTraits; + 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 typename OldTraits::iterator_category Cat; + + // Determine the traversal_category based on the old iterator_category + if (Cat inherits from std::random_access_iterator_tag) + typedef boost::random_access_iterator_tag traversal_category; + else if (Cat inherits from std::bidirectional_iterator_tag) + typedef boost::bidirectional_iterator_tag traversal_category; + else if (Cat inherits from std::forward_iterator_tag) + typedef boost::forward_iterator_tag traversal_category; + else + typedef boost::single_pass_iterator_tag traversal_category; + + // Determine the return_category based on the old iterator_category and value_type + if (Cat inherits from std::forward_iterator_tag) + if (is-const(T)) + typedef boost::constant_lvalue_iterator_tag return_category; + else + typedef boost::mutable_lvalue_iterator_tag return_category; + else if (Cat inherits from std::input_iterator_tag) + typedef boost::readable_iterator_tag return_category; + else if (Cat inherits from std::output_iterator_tag) + typedef boost::writable_iterator_tag return_category; + else + typedef boost::error_iterator_tag return_category; + } + }; + + template <typename T> + struct iterator_traits<T*> + { + typedef T value_type; + typedef T& reference; + typedef T* pointer; + typedef std::ptrdiff_t difference_type; + if (is-const(T)) + typedef boost::constant_lvalue_iterator_tag return_category; + else + typedef boost::mutable_lvalue_iterator_tag return_category; + typedef boost::random_access_iterator_tag traversal_category; + }; + +} ++ +