/Src/Dependencies/Boost/boost/spirit/home/karma/detail/indirect_iterator.hpp

http://hadesmem.googlecode.com/ · C++ Header · 96 lines · 71 code · 16 blank · 9 comment · 1 complexity · c5432bf420c11e17248e3a822fa496e4 MD5 · raw file

  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. ///////////////////////////////////////////////////////////////////////////////
  13. namespace boost { namespace spirit { namespace karma { namespace detail
  14. {
  15. ///////////////////////////////////////////////////////////////////////
  16. // This is a wrapper for any iterator allowing to pass a reference of it
  17. // to the components of the sequence
  18. template <typename Iterator>
  19. class indirect_iterator
  20. : public boost::iterator_facade<
  21. indirect_iterator<Iterator>
  22. , typename boost::detail::iterator_traits<Iterator>::value_type
  23. , boost::forward_traversal_tag
  24. , typename boost::detail::iterator_traits<Iterator>::value_type const&>
  25. {
  26. typedef typename boost::detail::iterator_traits<Iterator>::value_type
  27. base_value_type;
  28. typedef boost::iterator_facade<
  29. indirect_iterator<Iterator>, base_value_type
  30. , boost::forward_traversal_tag, base_value_type const&
  31. > base_type;
  32. public:
  33. indirect_iterator(Iterator& iter)
  34. : iter_(&iter)
  35. {}
  36. indirect_iterator(indirect_iterator const& iter)
  37. : iter_(iter.iter_)
  38. {}
  39. private:
  40. friend class boost::iterator_core_access;
  41. void increment()
  42. {
  43. ++*iter_;
  44. }
  45. bool equal(indirect_iterator const& other) const
  46. {
  47. return *iter_ == *other.iter_;
  48. }
  49. typename base_type::reference dereference() const
  50. {
  51. return **iter_;
  52. }
  53. private:
  54. Iterator* iter_;
  55. };
  56. }}}}
  57. ///////////////////////////////////////////////////////////////////////////////
  58. namespace boost { namespace spirit { namespace traits
  59. {
  60. template <typename Iterator>
  61. struct make_indirect_iterator
  62. {
  63. typedef karma::detail::indirect_iterator<Iterator> type;
  64. };
  65. template <typename Iterator>
  66. struct make_indirect_iterator<karma::detail::indirect_iterator<Iterator> >
  67. {
  68. typedef karma::detail::indirect_iterator<Iterator> type;
  69. };
  70. template <>
  71. struct make_indirect_iterator<unused_type const*>
  72. {
  73. typedef unused_type const* type;
  74. };
  75. template <typename Iterator>
  76. struct make_indirect_iterator<Iterator const&>
  77. : make_indirect_iterator<Iterator const>
  78. {};
  79. }}}
  80. #endif