indirect.cpp 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  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 <memory>
  13. #include <range/v3/core.hpp>
  14. #include <range/v3/view/indirect.hpp>
  15. #include <range/v3/view/transform.hpp>
  16. #include "../simple_test.hpp"
  17. #include "../test_utils.hpp"
  18. int main()
  19. {
  20. using namespace ranges;
  21. {
  22. std::vector<std::shared_ptr<int>> vp;
  23. for(int i = 0; i < 10; ++i)
  24. vp.push_back(std::make_shared<int>(i));
  25. auto && rng = vp | views::indirect;
  26. CHECK(&*begin(rng) == vp[0].get());
  27. ::check_equal(rng, {0, 1, 2, 3, 4, 5, 6, 7, 8, 9});
  28. }
  29. {
  30. int const some_ints[] = {0,1,2,3};
  31. int const *some_int_pointers[] = {
  32. some_ints + 0, some_ints + 1, some_ints + 2, some_ints + 3
  33. };
  34. auto make_range = [&]{
  35. return debug_input_view<int const *>{some_int_pointers} | views::indirect;
  36. };
  37. auto rng = make_range();
  38. ::check_equal(rng, some_ints);
  39. rng = make_range();
  40. CHECK(&*begin(rng) == some_ints + 0);
  41. }
  42. #if RANGES_CXX_RETURN_TYPE_DEDUCTION >= RANGES_CXX_RETURN_TYPE_DEDUCTION_14
  43. {
  44. // regression test for #946
  45. class Data;
  46. struct Test
  47. {
  48. std::vector<Data*> m_list;
  49. auto list()
  50. {
  51. return m_list | ranges::views::indirect;
  52. }
  53. };
  54. class Data
  55. {};
  56. CHECK(Test{std::vector<Data*>(42)}.list().size() == 42u);
  57. }
  58. #endif // RANGES_CXX_RETURN_TYPE_DEDUCTION
  59. {
  60. // regression test for #952
  61. int some_ints[42]{};
  62. auto a = some_ints | views::transform([](int& i) { return &i; })
  63. | views::indirect;
  64. (void) a.begin();
  65. }
  66. return test_result();
  67. }