uniqued.hpp 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. // Boost.Range library
  2. //
  3. // Copyright Thorsten Ottosen, Neil Groves 2006 - 2008. Use, modification and
  4. // distribution is subject to the Boost Software License, Version
  5. // 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  6. // http://www.boost.org/LICENSE_1_0.txt)
  7. //
  8. // For more information, see http://www.boost.org/libs/range/
  9. //
  10. #ifndef BOOST_RANGE_ADAPTOR_UNIQUED_IMPL_HPP
  11. #define BOOST_RANGE_ADAPTOR_UNIQUED_IMPL_HPP
  12. #include <boost/range/adaptor/adjacent_filtered.hpp>
  13. namespace boost
  14. {
  15. namespace range_detail
  16. {
  17. struct unique_forwarder { };
  18. struct unique_not_equal_to
  19. {
  20. typedef bool result_type;
  21. template< class T >
  22. bool operator()( const T& l, const T& r ) const
  23. {
  24. return !(l == r);
  25. }
  26. };
  27. template<class ForwardRng>
  28. class uniqued_range : public adjacent_filtered_range<unique_not_equal_to, ForwardRng, true>
  29. {
  30. typedef adjacent_filtered_range<unique_not_equal_to, ForwardRng, true> base;
  31. public:
  32. explicit uniqued_range(ForwardRng& rng)
  33. : base(unique_not_equal_to(), rng)
  34. {
  35. }
  36. };
  37. template< class ForwardRng >
  38. inline uniqued_range<ForwardRng>
  39. operator|( ForwardRng& r,
  40. unique_forwarder )
  41. {
  42. return uniqued_range<ForwardRng>(r);
  43. }
  44. template< class ForwardRng >
  45. inline uniqued_range<const ForwardRng>
  46. operator|( const ForwardRng& r,
  47. unique_forwarder )
  48. {
  49. return uniqued_range<const ForwardRng>(r);
  50. }
  51. } // 'range_detail'
  52. using range_detail::uniqued_range;
  53. namespace adaptors
  54. {
  55. namespace
  56. {
  57. const range_detail::unique_forwarder uniqued =
  58. range_detail::unique_forwarder();
  59. }
  60. template<class ForwardRange>
  61. inline uniqued_range<ForwardRange>
  62. unique(ForwardRange& rng)
  63. {
  64. return uniqued_range<ForwardRange>(rng);
  65. }
  66. template<class ForwardRange>
  67. inline uniqued_range<const ForwardRange>
  68. unique(const ForwardRange& rng)
  69. {
  70. return uniqued_range<const ForwardRange>(rng);
  71. }
  72. } // 'adaptors'
  73. }
  74. #endif