1 /*-----------------------------------------------------------------------------+
2 Copyright (c) 2009-2009: Joachim Faulhaber
3 +------------------------------------------------------------------------------+
4    Distributed under the Boost Software License, Version 1.0.
5       (See accompanying file LICENCE.txt or copy at
6            http://www.boost.org/LICENSE_1_0.txt)
7 +-----------------------------------------------------------------------------*/
8 #ifndef BOOST_ICL_ITERATOR_HPP_JOFA_091003
9 #define BOOST_ICL_ITERATOR_HPP_JOFA_091003
10 
11 #include <iterator>
12 #include <boost/config/warning_disable.hpp>
13 
14 namespace boost{namespace icl
15 {
16 
17 /** \brief Performes an addition using a container's memberfunction add, when operator= is called. */
18 template<class ContainerT> class add_iterator
19 {
20 public:
21     /// The container's type.
22     typedef ContainerT container_type;
23     typedef std::output_iterator_tag iterator_category;
24     typedef void value_type;
25     typedef void difference_type;
26     typedef void pointer;
27     typedef void reference;
28 
29     /** An add_iterator is constructed with a container and a position
30         that has to be maintained. */
add_iterator(ContainerT & cont,typename ContainerT::iterator iter)31     add_iterator(ContainerT& cont, typename ContainerT::iterator iter)
32     : _cont(&cont), _iter(iter) {}
33 
34     /** This assignment operator adds the \c value before the current position.
35         It maintains it's position by incrementing after addition.    */
operator =(typename ContainerT::const_reference value)36     add_iterator& operator=(typename ContainerT::const_reference value)
37     {
38         _iter = icl::add(*_cont, _iter, value);
39         if(_iter != _cont->end())
40             ++_iter;
41         return *this;
42     }
43 
operator *()44     add_iterator& operator*()    { return *this; }
operator ++()45     add_iterator& operator++()   { return *this; }
operator ++(int)46     add_iterator& operator++(int){ return *this; }
47 
48 private:
49     ContainerT*                   _cont;
50     typename ContainerT::iterator _iter;
51 };
52 
53 
54 /** Function adder creates and initializes an add_iterator */
55 template<class ContainerT, typename IteratorT>
adder(ContainerT & cont,IteratorT iter_)56 inline add_iterator<ContainerT> adder(ContainerT& cont, IteratorT iter_)
57 {
58     return add_iterator<ContainerT>(cont, typename ContainerT::iterator(iter_));
59 }
60 
61 /** \brief Performes an insertion using a container's memberfunction add, when operator= is called. */
62 template<class ContainerT> class insert_iterator
63 {
64 public:
65     /// The container's type.
66     typedef ContainerT container_type;
67     typedef std::output_iterator_tag iterator_category;
68     typedef void value_type;
69     typedef void difference_type;
70     typedef void pointer;
71     typedef void reference;
72 
73     /** An insert_iterator is constructed with a container and a position
74         that has to be maintained. */
insert_iterator(ContainerT & cont,typename ContainerT::iterator iter)75     insert_iterator(ContainerT& cont, typename ContainerT::iterator iter)
76     : _cont(&cont), _iter(iter) {}
77 
78     /** This assignment operator adds the \c value before the current position.
79         It maintains it's position by incrementing after addition.    */
operator =(typename ContainerT::const_reference value)80     insert_iterator& operator=(typename ContainerT::const_reference value)
81     {
82         _iter = _cont->insert(_iter, value);
83         if(_iter != _cont->end())
84             ++_iter;
85         return *this;
86     }
87 
operator *()88     insert_iterator& operator*()    { return *this; }
operator ++()89     insert_iterator& operator++()   { return *this; }
operator ++(int)90     insert_iterator& operator++(int){ return *this; }
91 
92 private:
93     ContainerT*                   _cont;
94     typename ContainerT::iterator _iter;
95 };
96 
97 
98 /** Function inserter creates and initializes an insert_iterator */
99 template<class ContainerT, typename IteratorT>
inserter(ContainerT & cont,IteratorT iter_)100 inline insert_iterator<ContainerT> inserter(ContainerT& cont, IteratorT iter_)
101 {
102     return insert_iterator<ContainerT>(cont, typename ContainerT::iterator(iter_));
103 }
104 
105 }} // namespace icl boost
106 
107 #endif // BOOST_ICL_ITERATOR_HPP_JOFA_091003
108 
109 
110