for_each.cpp 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. // Range v3 library
  2. //
  3. // Copyright Eric Niebler 2014-present
  4. //
  5. // Use, modification and distribution is subject to the
  6. // Boost Software License, Version 1.0. (See accompanying
  7. // file LICENSE_1_0.txt or copy at
  8. // http://www.boost.org/LICENSE_1_0.txt)
  9. //
  10. // Project home: https://github.com/ericniebler/range-v3
  11. #include <vector>
  12. #include <range/v3/core.hpp>
  13. #include <range/v3/algorithm/for_each.hpp>
  14. #include "../array.hpp"
  15. #include "../simple_test.hpp"
  16. #include "../test_iterators.hpp"
  17. struct S
  18. {
  19. void p() const { *p_ += i_; }
  20. int *p_;
  21. int i_;
  22. };
  23. constexpr int void_f(int const &)
  24. {
  25. return 3;
  26. }
  27. int main()
  28. {
  29. int sum = 0;
  30. auto fun = [&](int i){sum += i; };
  31. std::vector<int> v1 { 0, 2, 4, 6 };
  32. CHECK(ranges::for_each(v1.begin(), v1.end(), fun).in == v1.end());
  33. CHECK(ranges::for_each(v1, fun).in == v1.end());
  34. CHECK(sum == 24);
  35. sum = 0;
  36. auto rfun = [&](int & i){sum += i; };
  37. CHECK(ranges::for_each(v1.begin(), v1.end(), rfun).in == v1.end());
  38. CHECK(ranges::for_each(v1, rfun).in == v1.end());
  39. CHECK(sum == 24);
  40. sum = 0;
  41. std::vector<S> v2{{&sum, 0}, {&sum, 2}, {&sum, 4}, {&sum, 6}};
  42. CHECK(ranges::for_each(v2.begin(), v2.end(), &S::p).in == v2.end());
  43. CHECK(ranges::for_each(v2, &S::p).in == v2.end());
  44. CHECK(sum == 24);
  45. sum = 0;
  46. CHECK(::is_dangling(ranges::for_each(::MakeTestRange(v1.begin(), v1.end()), fun).in));
  47. CHECK(sum == 12);
  48. {
  49. constexpr auto rng = test::array<int, 4>{{0, 2, 4, 6}};
  50. STATIC_CHECK(ranges::for_each(rng, void_f).in == ranges::end(rng));
  51. }
  52. return ::test_result();
  53. }