summaryrefslogtreecommitdiff
path: root/boost/interprocess/detail/transform_iterator.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/interprocess/detail/transform_iterator.hpp')
-rw-r--r--boost/interprocess/detail/transform_iterator.hpp164
1 files changed, 4 insertions, 160 deletions
diff --git a/boost/interprocess/detail/transform_iterator.hpp b/boost/interprocess/detail/transform_iterator.hpp
index 1c4dcd3aeb..d409b52362 100644
--- a/boost/interprocess/detail/transform_iterator.hpp
+++ b/boost/interprocess/detail/transform_iterator.hpp
@@ -27,170 +27,14 @@
// interprocess
#include <boost/interprocess/interprocess_fwd.hpp>
-// interprocess/detail
-#include <boost/interprocess/detail/type_traits.hpp>
-// move/detail
-#include <boost/container/detail/iterator.hpp>
+// container/detail
+#include <boost/container/detail/transform_iterator.hpp>
namespace boost {
namespace interprocess {
-template <class PseudoReference>
-struct operator_arrow_proxy
-{
- operator_arrow_proxy(const PseudoReference &px)
- : m_value(px)
- {}
-
- PseudoReference* operator->() const { return &m_value; }
- // This function is needed for MWCW and BCC, which won't call operator->
- // again automatically per 13.3.1.2 para 8
-// operator T*() const { return &m_value; }
- mutable PseudoReference m_value;
-};
-
-template <class T>
-struct operator_arrow_proxy<T&>
-{
- operator_arrow_proxy(T &px)
- : m_value(px)
- {}
-
- T* operator->() const { return const_cast<T*>(&m_value); }
- // This function is needed for MWCW and BCC, which won't call operator->
- // again automatically per 13.3.1.2 para 8
-// operator T*() const { return &m_value; }
- T &m_value;
-};
-
-template <class Iterator, class UnaryFunction>
-class transform_iterator
- : public UnaryFunction
-{
- public:
- typedef typename ::boost::container::iterator_traits<Iterator>::iterator_category iterator_category;
- typedef typename ipcdetail::remove_reference<typename UnaryFunction::result_type>::type value_type;
- typedef typename ::boost::container::iterator_traits<Iterator>::difference_type difference_type;
- typedef operator_arrow_proxy<typename UnaryFunction::result_type> pointer;
- typedef typename UnaryFunction::result_type reference;
-
- explicit transform_iterator(const Iterator &it, const UnaryFunction &f = UnaryFunction())
- : UnaryFunction(f), m_it(it)
- {}
-
- explicit transform_iterator()
- : UnaryFunction(), m_it()
- {}
-
- //Constructors
- transform_iterator& operator++()
- { increment(); return *this; }
-
- transform_iterator operator++(int)
- {
- transform_iterator result (*this);
- increment();
- return result;
- }
-
- transform_iterator& operator--()
- { decrement(); return *this; }
-
- transform_iterator operator--(int)
- {
- transform_iterator result (*this);
- decrement();
- return result;
- }
-
- friend bool operator== (const transform_iterator& i, const transform_iterator& i2)
- { return i.equal(i2); }
-
- friend bool operator!= (const transform_iterator& i, const transform_iterator& i2)
- { return !(i == i2); }
-
- friend bool operator< (const transform_iterator& i, const transform_iterator& i2)
- { return i < i2; }
-
- friend bool operator> (const transform_iterator& i, const transform_iterator& i2)
- { return i2 < i; }
-
- friend bool operator<= (const transform_iterator& i, const transform_iterator& i2)
- { return !(i > i2); }
-
- friend bool operator>= (const transform_iterator& i, const transform_iterator& i2)
- { return !(i < i2); }
-
- friend difference_type operator- (const transform_iterator& i, const transform_iterator& i2)
- { return i2.distance_to(i); }
-
- //Arithmetic
- transform_iterator& operator+=(difference_type off)
- { this->advance(off); return *this; }
-
- transform_iterator operator+(difference_type off) const
- {
- transform_iterator other(*this);
- other.advance(off);
- return other;
- }
-
- friend transform_iterator operator+(difference_type off, const transform_iterator& right)
- { return right + off; }
-
- transform_iterator& operator-=(difference_type off)
- { this->advance(-off); return *this; }
-
- transform_iterator operator-(difference_type off) const
- { return *this + (-off); }
-
- typename UnaryFunction::result_type operator*() const
- { return dereference(); }
-
- typename UnaryFunction::result_type operator[](difference_type off) const
- { return UnaryFunction::operator()(m_it[off]); }
-
- operator_arrow_proxy<typename UnaryFunction::result_type>
- operator->() const
- { return operator_arrow_proxy<typename UnaryFunction::result_type>(dereference()); }
-
- Iterator & base()
- { return m_it; }
-
- const Iterator & base() const
- { return m_it; }
-
- private:
- Iterator m_it;
-
- void increment()
- { ++m_it; }
-
- void decrement()
- { --m_it; }
-
- bool equal(const transform_iterator &other) const
- { return m_it == other.m_it; }
-
- bool less(const transform_iterator &other) const
- { return other.m_it < m_it; }
-
- typename UnaryFunction::result_type dereference() const
- { return UnaryFunction::operator()(*m_it); }
-
- void advance(difference_type n)
- { ::boost::container::iterator_advance(m_it, n); }
-
- difference_type distance_to(const transform_iterator &other)const
- { return ::boost::container::iterator_distance(other.m_it, m_it); }
-};
-
-template <class Iterator, class UnaryFunc>
-transform_iterator<Iterator, UnaryFunc>
-make_transform_iterator(Iterator it, UnaryFunc fun)
-{
- return transform_iterator<Iterator, UnaryFunc>(it, fun);
-}
+using boost::container::make_transform_iterator;
+using boost::container::transform_iterator;
} //namespace interprocess {
} //namespace boost {