Mercurial > hg > vamp-build-and-test
diff DEPENDENCIES/generic/include/boost/icl/iterator.hpp @ 16:2665513ce2d3
Add boost headers
author | Chris Cannam |
---|---|
date | Tue, 05 Aug 2014 11:11:38 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DEPENDENCIES/generic/include/boost/icl/iterator.hpp Tue Aug 05 11:11:38 2014 +0100 @@ -0,0 +1,103 @@ +/*-----------------------------------------------------------------------------+ +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 + +