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