indirect_iterator.hpp 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. // Copyright (c) 2001-2011 Hartmut Kaiser
  2. //
  3. // Distributed under the Boost Software License, Version 1.0. (See accompanying
  4. // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  5. #if !defined(SPIRIT_KARMA_INDIRECT_ITERATOR_JAN_19_2011_0814PM)
  6. #define SPIRIT_KARMA_INDIRECT_ITERATOR_JAN_19_2011_0814PM
  7. #if defined(_MSC_VER)
  8. #pragma once
  9. #endif
  10. #include <boost/spirit/home/support/unused.hpp>
  11. #include <boost/iterator/iterator_facade.hpp>
  12. #include <iterator> // for std::iterator_traits
  13. ///////////////////////////////////////////////////////////////////////////////
  14. namespace boost { namespace spirit { namespace karma { namespace detail
  15. {
  16. ///////////////////////////////////////////////////////////////////////
  17. // This is a wrapper for any iterator allowing to pass a reference of it
  18. // to the components of the sequence
  19. template <typename Iterator>
  20. class indirect_iterator
  21. : public boost::iterator_facade<
  22. indirect_iterator<Iterator>
  23. , typename std::iterator_traits<Iterator>::value_type
  24. , boost::forward_traversal_tag
  25. , typename std::iterator_traits<Iterator>::reference>
  26. {
  27. typedef typename std::iterator_traits<Iterator>::value_type
  28. base_value_type;
  29. typedef typename std::iterator_traits<Iterator>::reference
  30. base_reference_type;
  31. typedef boost::iterator_facade<
  32. indirect_iterator<Iterator>, base_value_type
  33. , boost::forward_traversal_tag, base_reference_type
  34. > base_type;
  35. public:
  36. indirect_iterator(Iterator& iter)
  37. : iter_(&iter)
  38. {}
  39. indirect_iterator(indirect_iterator const& iter)
  40. : iter_(iter.iter_)
  41. {}
  42. private:
  43. friend class boost::iterator_core_access;
  44. void increment()
  45. {
  46. ++*iter_;
  47. }
  48. bool equal(indirect_iterator const& other) const
  49. {
  50. return *iter_ == *other.iter_;
  51. }
  52. base_reference_type dereference() const
  53. {
  54. return **iter_;
  55. }
  56. private:
  57. Iterator* iter_;
  58. };
  59. }}}}
  60. ///////////////////////////////////////////////////////////////////////////////
  61. namespace boost { namespace spirit { namespace traits
  62. {
  63. template <typename Iterator>
  64. struct make_indirect_iterator
  65. {
  66. typedef karma::detail::indirect_iterator<Iterator> type;
  67. };
  68. template <typename Iterator>
  69. struct make_indirect_iterator<karma::detail::indirect_iterator<Iterator> >
  70. {
  71. typedef karma::detail::indirect_iterator<Iterator> type;
  72. };
  73. template <>
  74. struct make_indirect_iterator<unused_type const*>
  75. {
  76. typedef unused_type const* type;
  77. };
  78. template <typename Iterator>
  79. struct make_indirect_iterator<Iterator const&>
  80. : make_indirect_iterator<Iterator const>
  81. {};
  82. }}}
  83. #endif