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