You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
103 lines
3.6 KiB
103 lines
3.6 KiB
/*-----------------------------------------------------------------------------+ |
|
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 |
|
|
|
|
|
|