annotate DEPENDENCIES/generic/include/boost/iterator/transform_iterator.hpp @ 133:4acb5d8d80b6 tip

Don't fail environmental check if README.md exists (but .txt and no-suffix don't)
author Chris Cannam
date Tue, 30 Jul 2019 12:25:44 +0100
parents c530137014c0
children
rev   line source
Chris@16 1 // (C) Copyright David Abrahams 2002.
Chris@16 2 // (C) Copyright Jeremy Siek 2002.
Chris@16 3 // (C) Copyright Thomas Witt 2002.
Chris@16 4 // Distributed under the Boost Software License, Version 1.0. (See
Chris@16 5 // accompanying file LICENSE_1_0.txt or copy at
Chris@16 6 // http://www.boost.org/LICENSE_1_0.txt)
Chris@16 7 #ifndef BOOST_TRANSFORM_ITERATOR_23022003THW_HPP
Chris@16 8 #define BOOST_TRANSFORM_ITERATOR_23022003THW_HPP
Chris@16 9
Chris@16 10 #include <boost/iterator.hpp>
Chris@16 11 #include <boost/iterator/detail/enable_if.hpp>
Chris@16 12 #include <boost/iterator/iterator_adaptor.hpp>
Chris@16 13 #include <boost/iterator/iterator_categories.hpp>
Chris@16 14 #include <boost/mpl/not.hpp>
Chris@16 15 #include <boost/mpl/bool.hpp>
Chris@16 16 #include <boost/type_traits/function_traits.hpp>
Chris@16 17 #include <boost/type_traits/is_const.hpp>
Chris@16 18 #include <boost/type_traits/is_class.hpp>
Chris@16 19 #include <boost/type_traits/is_function.hpp>
Chris@16 20 #include <boost/type_traits/is_reference.hpp>
Chris@16 21 #include <boost/type_traits/remove_const.hpp>
Chris@16 22 #include <boost/type_traits/remove_reference.hpp>
Chris@16 23 #include <boost/utility/result_of.hpp>
Chris@16 24
Chris@16 25
Chris@16 26 #if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1310))
Chris@16 27 # include <boost/type_traits/is_base_and_derived.hpp>
Chris@16 28
Chris@101 29 #endif
Chris@16 30 #include <boost/iterator/detail/config_def.hpp>
Chris@16 31
Chris@16 32
Chris@101 33 namespace boost {
Chris@101 34 namespace iterators {
Chris@101 35
Chris@16 36 template <class UnaryFunction, class Iterator, class Reference = use_default, class Value = use_default>
Chris@16 37 class transform_iterator;
Chris@16 38
Chris@101 39 namespace detail
Chris@16 40 {
Chris@16 41 // Compute the iterator_adaptor instantiation to be used for transform_iterator
Chris@16 42 template <class UnaryFunc, class Iterator, class Reference, class Value>
Chris@16 43 struct transform_iterator_base
Chris@16 44 {
Chris@16 45 private:
Chris@16 46 // By default, dereferencing the iterator yields the same as
Chris@16 47 // the function.
Chris@16 48 typedef typename ia_dflt_help<
Chris@16 49 Reference
Chris@16 50 , result_of<const UnaryFunc(typename std::iterator_traits<Iterator>::reference)>
Chris@16 51 >::type reference;
Chris@16 52
Chris@16 53 // To get the default for Value: remove any reference on the
Chris@16 54 // result type, but retain any constness to signal
Chris@16 55 // non-writability. Note that if we adopt Thomas' suggestion
Chris@16 56 // to key non-writability *only* on the Reference argument,
Chris@16 57 // we'd need to strip constness here as well.
Chris@16 58 typedef typename ia_dflt_help<
Chris@16 59 Value
Chris@16 60 , remove_reference<reference>
Chris@16 61 >::type cv_value_type;
Chris@16 62
Chris@16 63 public:
Chris@16 64 typedef iterator_adaptor<
Chris@16 65 transform_iterator<UnaryFunc, Iterator, Reference, Value>
Chris@16 66 , Iterator
Chris@16 67 , cv_value_type
Chris@16 68 , use_default // Leave the traversal category alone
Chris@16 69 , reference
Chris@16 70 > type;
Chris@16 71 };
Chris@16 72 }
Chris@16 73
Chris@16 74 template <class UnaryFunc, class Iterator, class Reference, class Value>
Chris@16 75 class transform_iterator
Chris@101 76 : public boost::iterators::detail::transform_iterator_base<UnaryFunc, Iterator, Reference, Value>::type
Chris@16 77 {
Chris@16 78 typedef typename
Chris@101 79 boost::iterators::detail::transform_iterator_base<UnaryFunc, Iterator, Reference, Value>::type
Chris@16 80 super_t;
Chris@16 81
Chris@16 82 friend class iterator_core_access;
Chris@16 83
Chris@16 84 public:
Chris@16 85 transform_iterator() { }
Chris@16 86
Chris@16 87 transform_iterator(Iterator const& x, UnaryFunc f)
Chris@16 88 : super_t(x), m_f(f) { }
Chris@16 89
Chris@16 90 explicit transform_iterator(Iterator const& x)
Chris@16 91 : super_t(x)
Chris@16 92 {
Chris@16 93 // Pro8 is a little too aggressive about instantiating the
Chris@16 94 // body of this function.
Chris@16 95 #if !BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3003))
Chris@16 96 // don't provide this constructor if UnaryFunc is a
Chris@16 97 // function pointer type, since it will be 0. Too dangerous.
Chris@16 98 BOOST_STATIC_ASSERT(is_class<UnaryFunc>::value);
Chris@101 99 #endif
Chris@16 100 }
Chris@16 101
Chris@16 102 template <
Chris@16 103 class OtherUnaryFunction
Chris@16 104 , class OtherIterator
Chris@16 105 , class OtherReference
Chris@16 106 , class OtherValue>
Chris@16 107 transform_iterator(
Chris@16 108 transform_iterator<OtherUnaryFunction, OtherIterator, OtherReference, OtherValue> const& t
Chris@16 109 , typename enable_if_convertible<OtherIterator, Iterator>::type* = 0
Chris@16 110 #if !BOOST_WORKAROUND(BOOST_MSVC, == 1310)
Chris@16 111 , typename enable_if_convertible<OtherUnaryFunction, UnaryFunc>::type* = 0
Chris@101 112 #endif
Chris@16 113 )
Chris@16 114 : super_t(t.base()), m_f(t.functor())
Chris@16 115 {}
Chris@16 116
Chris@16 117 UnaryFunc functor() const
Chris@16 118 { return m_f; }
Chris@16 119
Chris@16 120 private:
Chris@16 121 typename super_t::reference dereference() const
Chris@16 122 { return m_f(*this->base()); }
Chris@16 123
Chris@16 124 // Probably should be the initial base class so it can be
Chris@16 125 // optimized away via EBO if it is an empty class.
Chris@16 126 UnaryFunc m_f;
Chris@16 127 };
Chris@16 128
Chris@16 129 template <class UnaryFunc, class Iterator>
Chris@101 130 inline transform_iterator<UnaryFunc, Iterator>
Chris@16 131 make_transform_iterator(Iterator it, UnaryFunc fun)
Chris@16 132 {
Chris@16 133 return transform_iterator<UnaryFunc, Iterator>(it, fun);
Chris@16 134 }
Chris@16 135
Chris@16 136 // Version which allows explicit specification of the UnaryFunc
Chris@16 137 // type.
Chris@16 138 //
Chris@16 139 // This generator is not provided if UnaryFunc is a function
Chris@16 140 // pointer type, because it's too dangerous: the default-constructed
Chris@16 141 // function pointer in the iterator be 0, leading to a runtime
Chris@16 142 // crash.
Chris@16 143 template <class UnaryFunc, class Iterator>
Chris@101 144 inline typename iterators::enable_if<
Chris@16 145 is_class<UnaryFunc> // We should probably find a cheaper test than is_class<>
Chris@16 146 , transform_iterator<UnaryFunc, Iterator>
Chris@16 147 >::type
Chris@16 148 make_transform_iterator(Iterator it)
Chris@16 149 {
Chris@16 150 return transform_iterator<UnaryFunc, Iterator>(it, UnaryFunc());
Chris@16 151 }
Chris@16 152
Chris@16 153 #if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION ) && !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING)
Chris@16 154 template <class Return, class Argument, class Iterator>
Chris@101 155 inline transform_iterator< Return (*)(Argument), Iterator, Return>
Chris@16 156 make_transform_iterator(Iterator it, Return (*fun)(Argument))
Chris@16 157 {
Chris@16 158 return transform_iterator<Return (*)(Argument), Iterator, Return>(it, fun);
Chris@16 159 }
Chris@16 160 #endif
Chris@16 161
Chris@101 162 } // namespace iterators
Chris@101 163
Chris@101 164 using iterators::transform_iterator;
Chris@101 165 using iterators::make_transform_iterator;
Chris@101 166
Chris@16 167 } // namespace boost
Chris@16 168
Chris@16 169 #include <boost/iterator/detail/config_undef.hpp>
Chris@16 170
Chris@16 171 #endif // BOOST_TRANSFORM_ITERATOR_23022003THW_HPP