/Src/Dependencies/Boost/boost/fusion/algorithm/transformation/erase.hpp

http://hadesmem.googlecode.com/ · C++ Header · 108 lines · 89 code · 13 blank · 6 comment · 0 complexity · ef8e35ebfef3e9c305d82ca4dd691bb9 MD5 · raw file

  1. /*=============================================================================
  2. Copyright (c) 2001-2006 Joel de Guzman
  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(FUSION_ERASE_07232005_0534)
  7. #define FUSION_ERASE_07232005_0534
  8. #include <boost/fusion/iterator/equal_to.hpp>
  9. #include <boost/fusion/iterator/mpl/convert_iterator.hpp>
  10. #include <boost/fusion/container/vector/vector10.hpp>
  11. #include <boost/fusion/view/joint_view/joint_view.hpp>
  12. #include <boost/fusion/view/iterator_range/iterator_range.hpp>
  13. #include <boost/fusion/support/detail/as_fusion_element.hpp>
  14. #include <boost/fusion/sequence/intrinsic/begin.hpp>
  15. #include <boost/fusion/sequence/intrinsic/end.hpp>
  16. #include <boost/fusion/adapted/mpl/mpl_iterator.hpp>
  17. namespace boost { namespace fusion
  18. {
  19. namespace result_of
  20. {
  21. template <typename Sequence, typename First>
  22. struct compute_erase_last // put this in detail!!!
  23. {
  24. typedef typename result_of::end<Sequence>::type seq_last_type;
  25. typedef typename convert_iterator<First>::type first_type;
  26. typedef typename
  27. mpl::if_<
  28. result_of::equal_to<first_type, seq_last_type>
  29. , first_type
  30. , typename result_of::next<first_type>::type
  31. >::type
  32. type;
  33. static type
  34. call(First const& first, mpl::false_)
  35. {
  36. return fusion::next(convert_iterator<First>::call(first));
  37. }
  38. static type
  39. call(First const& first, mpl::true_)
  40. {
  41. return convert_iterator<First>::call(first);
  42. }
  43. static type
  44. call(First const& first)
  45. {
  46. return call(first, result_of::equal_to<first_type, seq_last_type>());
  47. }
  48. };
  49. template <
  50. typename Sequence
  51. , typename First
  52. , typename Last = typename compute_erase_last<Sequence, First>::type>
  53. struct erase
  54. {
  55. typedef typename result_of::begin<Sequence>::type seq_first_type;
  56. typedef typename result_of::end<Sequence>::type seq_last_type;
  57. BOOST_STATIC_ASSERT((!result_of::equal_to<seq_first_type, seq_last_type>::value));
  58. typedef typename convert_iterator<First>::type first_type;
  59. typedef typename convert_iterator<Last>::type last_type;
  60. typedef iterator_range<seq_first_type, first_type> left_type;
  61. typedef iterator_range<last_type, seq_last_type> right_type;
  62. typedef joint_view<left_type, right_type> type;
  63. };
  64. }
  65. template <typename Sequence, typename First>
  66. typename result_of::erase<Sequence const, First>::type
  67. erase(Sequence const& seq, First const& first)
  68. {
  69. typedef result_of::erase<Sequence const, First> result_of;
  70. typedef typename result_of::left_type left_type;
  71. typedef typename result_of::right_type right_type;
  72. typedef typename result_of::type result_type;
  73. left_type left(
  74. fusion::begin(seq)
  75. , convert_iterator<First>::call(first));
  76. right_type right(
  77. fusion::result_of::compute_erase_last<Sequence const, First>::call(first)
  78. , fusion::end(seq));
  79. return result_type(left, right);
  80. }
  81. template <typename Sequence, typename First, typename Last>
  82. typename result_of::erase<Sequence const, First, Last>::type
  83. erase(Sequence const& seq, First const& first, Last const& last)
  84. {
  85. typedef result_of::erase<Sequence const, First, Last> result_of;
  86. typedef typename result_of::left_type left_type;
  87. typedef typename result_of::right_type right_type;
  88. typedef typename result_of::type result_type;
  89. left_type left(fusion::begin(seq), first);
  90. right_type right(last, fusion::end(seq));
  91. return result_type(left, right);
  92. }
  93. }}
  94. #endif