Chris@16: /*-----------------------------------------------------------------------------+ Chris@16: Copyright (c) 2009-2009: Joachim Faulhaber Chris@16: +------------------------------------------------------------------------------+ Chris@16: Distributed under the Boost Software License, Version 1.0. Chris@16: (See accompanying file LICENCE.txt or copy at Chris@16: http://www.boost.org/LICENSE_1_0.txt) Chris@16: +-----------------------------------------------------------------------------*/ Chris@16: #ifndef BOOST_ICL_ITERATOR_HPP_JOFA_091003 Chris@16: #define BOOST_ICL_ITERATOR_HPP_JOFA_091003 Chris@16: Chris@16: #include Chris@16: #include Chris@16: Chris@16: namespace boost{namespace icl Chris@16: { Chris@16: Chris@16: /** \brief Performes an addition using a container's memberfunction add, when operator= is called. */ Chris@16: template class add_iterator Chris@16: : public std::iterator Chris@16: { Chris@16: public: Chris@16: /// The container's type. Chris@16: typedef ContainerT container_type; Chris@16: typedef std::output_iterator_tag iterator_category; Chris@16: Chris@16: /** An add_iterator is constructed with a container and a position Chris@16: that has to be maintained. */ Chris@16: add_iterator(ContainerT& cont, typename ContainerT::iterator iter) Chris@16: : _cont(&cont), _iter(iter) {} Chris@16: Chris@16: /** This assignment operator adds the \c value before the current position. Chris@16: It maintains it's position by incrementing after addition. */ Chris@16: add_iterator& operator=(typename ContainerT::const_reference value) Chris@16: { Chris@16: _iter = icl::add(*_cont, _iter, value); Chris@16: if(_iter != _cont->end()) Chris@16: ++_iter; Chris@16: return *this; Chris@16: } Chris@16: Chris@16: add_iterator& operator*() { return *this; } Chris@16: add_iterator& operator++() { return *this; } Chris@16: add_iterator& operator++(int){ return *this; } Chris@16: Chris@16: private: Chris@16: ContainerT* _cont; Chris@16: typename ContainerT::iterator _iter; Chris@16: }; Chris@16: Chris@16: Chris@16: /** Function adder creates and initializes an add_iterator */ Chris@16: template Chris@16: inline add_iterator adder(ContainerT& cont, IteratorT iter_) Chris@16: { Chris@16: return add_iterator(cont, typename ContainerT::iterator(iter_)); Chris@16: } Chris@16: Chris@16: /** \brief Performes an insertion using a container's memberfunction add, when operator= is called. */ Chris@16: template class insert_iterator Chris@16: : public std::iterator Chris@16: { Chris@16: public: Chris@16: /// The container's type. Chris@16: typedef ContainerT container_type; Chris@16: typedef std::output_iterator_tag iterator_category; Chris@16: Chris@16: /** An insert_iterator is constructed with a container and a position Chris@16: that has to be maintained. */ Chris@16: insert_iterator(ContainerT& cont, typename ContainerT::iterator iter) Chris@16: : _cont(&cont), _iter(iter) {} Chris@16: Chris@16: /** This assignment operator adds the \c value before the current position. Chris@16: It maintains it's position by incrementing after addition. */ Chris@16: insert_iterator& operator=(typename ContainerT::const_reference value) Chris@16: { Chris@16: _iter = _cont->insert(_iter, value); Chris@16: if(_iter != _cont->end()) Chris@16: ++_iter; Chris@16: return *this; Chris@16: } Chris@16: Chris@16: insert_iterator& operator*() { return *this; } Chris@16: insert_iterator& operator++() { return *this; } Chris@16: insert_iterator& operator++(int){ return *this; } Chris@16: Chris@16: private: Chris@16: ContainerT* _cont; Chris@16: typename ContainerT::iterator _iter; Chris@16: }; Chris@16: Chris@16: Chris@16: /** Function inserter creates and initializes an insert_iterator */ Chris@16: template Chris@16: inline insert_iterator inserter(ContainerT& cont, IteratorT iter_) Chris@16: { Chris@16: return insert_iterator(cont, typename ContainerT::iterator(iter_)); Chris@16: } Chris@16: Chris@16: }} // namespace icl boost Chris@16: Chris@16: #endif // BOOST_ICL_ITERATOR_HPP_JOFA_091003 Chris@16: Chris@16: