iterator.hpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  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. #include <iterator>
  11. #include <boost/config/warning_disable.hpp>
  12. namespace boost{namespace icl
  13. {
  14. /** \brief Performes an addition using a container's memberfunction add, when operator= is called. */
  15. template<class ContainerT> class add_iterator
  16. : public std::iterator<std::output_iterator_tag, void, void, void, void>
  17. {
  18. public:
  19. /// The container's type.
  20. typedef ContainerT container_type;
  21. typedef std::output_iterator_tag iterator_category;
  22. /** An add_iterator is constructed with a container and a position
  23. that has to be maintained. */
  24. add_iterator(ContainerT& cont, typename ContainerT::iterator iter)
  25. : _cont(&cont), _iter(iter) {}
  26. /** This assignment operator adds the \c value before the current position.
  27. It maintains it's position by incrementing after addition. */
  28. add_iterator& operator=(typename ContainerT::const_reference value)
  29. {
  30. _iter = icl::add(*_cont, _iter, value);
  31. if(_iter != _cont->end())
  32. ++_iter;
  33. return *this;
  34. }
  35. add_iterator& operator*() { return *this; }
  36. add_iterator& operator++() { return *this; }
  37. add_iterator& operator++(int){ return *this; }
  38. private:
  39. ContainerT* _cont;
  40. typename ContainerT::iterator _iter;
  41. };
  42. /** Function adder creates and initializes an add_iterator */
  43. template<class ContainerT, typename IteratorT>
  44. inline add_iterator<ContainerT> adder(ContainerT& cont, IteratorT iter_)
  45. {
  46. return add_iterator<ContainerT>(cont, typename ContainerT::iterator(iter_));
  47. }
  48. /** \brief Performes an insertion using a container's memberfunction add, when operator= is called. */
  49. template<class ContainerT> class insert_iterator
  50. : public std::iterator<std::output_iterator_tag, void, void, void, void>
  51. {
  52. public:
  53. /// The container's type.
  54. typedef ContainerT container_type;
  55. typedef std::output_iterator_tag iterator_category;
  56. /** An insert_iterator is constructed with a container and a position
  57. that has to be maintained. */
  58. insert_iterator(ContainerT& cont, typename ContainerT::iterator iter)
  59. : _cont(&cont), _iter(iter) {}
  60. /** This assignment operator adds the \c value before the current position.
  61. It maintains it's position by incrementing after addition. */
  62. insert_iterator& operator=(typename ContainerT::const_reference value)
  63. {
  64. _iter = _cont->insert(_iter, value);
  65. if(_iter != _cont->end())
  66. ++_iter;
  67. return *this;
  68. }
  69. insert_iterator& operator*() { return *this; }
  70. insert_iterator& operator++() { return *this; }
  71. insert_iterator& operator++(int){ return *this; }
  72. private:
  73. ContainerT* _cont;
  74. typename ContainerT::iterator _iter;
  75. };
  76. /** Function inserter creates and initializes an insert_iterator */
  77. template<class ContainerT, typename IteratorT>
  78. inline insert_iterator<ContainerT> inserter(ContainerT& cont, IteratorT iter_)
  79. {
  80. return insert_iterator<ContainerT>(cont, typename ContainerT::iterator(iter_));
  81. }
  82. }} // namespace icl boost
  83. #endif // BOOST_ICL_ITERATOR_HPP_JOFA_091003