is_segmented_impl.hpp 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. /*=============================================================================
  2. Copyright (c) 2011 Eric Niebler
  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. ==============================================================================*/
  6. #if !defined(BOOST_FUSION_ITERATOR_RANGE_IS_SEGMENTED_HPP_INCLUDED)
  7. #define BOOST_FUSION_ITERATOR_RANGE_IS_SEGMENTED_HPP_INCLUDED
  8. #include <boost/fusion/support/config.hpp>
  9. #include <boost/mpl/assert.hpp>
  10. #include <boost/mpl/bool.hpp>
  11. namespace boost { namespace fusion
  12. {
  13. struct iterator_range_tag;
  14. template <typename Context>
  15. struct segmented_iterator;
  16. namespace extension
  17. {
  18. template <typename Tag>
  19. struct is_segmented_impl;
  20. // An iterator_range of segmented_iterators is segmented
  21. template <>
  22. struct is_segmented_impl<iterator_range_tag>
  23. {
  24. private:
  25. template <typename Iterator>
  26. struct is_segmented_iterator
  27. : mpl::false_
  28. {};
  29. template <typename Iterator>
  30. struct is_segmented_iterator<Iterator &>
  31. : is_segmented_iterator<Iterator>
  32. {};
  33. template <typename Iterator>
  34. struct is_segmented_iterator<Iterator const>
  35. : is_segmented_iterator<Iterator>
  36. {};
  37. template <typename Context>
  38. struct is_segmented_iterator<segmented_iterator<Context> >
  39. : mpl::true_
  40. {};
  41. public:
  42. template <typename Sequence>
  43. struct apply
  44. : is_segmented_iterator<typename Sequence::begin_type>
  45. {
  46. BOOST_MPL_ASSERT_RELATION(
  47. is_segmented_iterator<typename Sequence::begin_type>::value
  48. , ==
  49. , is_segmented_iterator<typename Sequence::end_type>::value);
  50. };
  51. };
  52. }
  53. }}
  54. #endif