test_indexing_iterator.cpp
Go to the documentation of this file.
1 // Copyright 2024 Ekumen, Inc.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #include <gmock/gmock.h>
16 #include <gtest/gtest.h>
17 
18 #include <algorithm>
19 #include <cstdlib>
20 #include <functional>
21 #include <iterator>
22 #include <type_traits>
23 #include <vector>
24 
25 #include <range/v3/iterator/concepts.hpp>
26 
28 
29 namespace {
30 
31 TEST(IndexingIterator, IteratorTraits) {
33  static_assert(ranges::random_access_iterator<Iterator>);
34  static_assert(std::is_signed_v<typename Iterator::difference_type>);
35  static_assert(std::is_same_v<typename Iterator::value_type, int>);
36  static_assert(std::is_same_v<typename Iterator::reference, int&>);
37  static_assert(std::is_same_v<typename Iterator::pointer, int*>);
38  using ssize_type = std::make_signed_t<typename std::vector<int>::size_type>;
39  static_assert(std::is_same_v<typename Iterator::difference_type, ssize_type>);
40 }
41 
42 TEST(IndexingIterator, ConstIteratorTraits) {
44  static_assert(ranges::random_access_iterator<Iterator>);
45  static_assert(std::is_same_v<typename Iterator::value_type, int>);
46  static_assert(std::is_same_v<typename Iterator::reference, const int&>);
47  static_assert(std::is_same_v<typename Iterator::pointer, const int*>);
48  using ssize_type = std::make_signed_t<typename std::vector<int>::size_type>;
49  static_assert(std::is_same_v<typename Iterator::difference_type, ssize_type>);
50 }
51 
52 TEST(IndexingIterator, Arithmetic) {
53  const auto sequence = std::vector{0, 1};
54  auto begin = beluga::IndexingIterator(sequence);
55  auto end = beluga::IndexingIterator(sequence, sequence.size());
56  EXPECT_EQ(std::next(begin, std::distance(begin, end)), end);
57  EXPECT_EQ(std::prev(end, std::distance(begin, end)), begin);
58  EXPECT_EQ(std::abs(end - begin), std::abs(begin - end));
59 }
60 
61 TEST(IndexingIterator, EqualityPreserving) {
62  const auto sequence = std::vector{0, 1};
63  auto begin = beluga::IndexingIterator(sequence);
64  auto end = beluga::IndexingIterator(sequence, sequence.size());
65  EXPECT_EQ(begin, --(begin + 1));
66  EXPECT_EQ(end, ++(end - 1));
67 }
68 
69 TEST(IndexingIterator, Iterate) {
70  const auto expected_sequence = std::vector{3, 0, -1, 5, 8, -2};
71  const auto sequence = std::vector(
72  beluga::IndexingIterator(expected_sequence),
73  beluga::IndexingIterator(expected_sequence, expected_sequence.size()));
74  ASSERT_THAT(sequence, ::testing::ContainerEq(expected_sequence));
75 }
76 
77 TEST(IndexingIterator, IterateAndMutate) {
78  const auto input_sequence = std::vector{1, 2, 3, 4, 5, 6};
79  auto output_sequence = std::vector<int>(input_sequence.size());
80  std::transform(
81  input_sequence.begin(), input_sequence.end(), input_sequence.rbegin(), beluga::IndexingIterator(output_sequence),
82  std::plus<>{});
83  ASSERT_THAT(output_sequence, ::testing::Each(::testing::Eq(7)));
84 }
85 
86 TEST(IndexingIterator, IterateAndMove) {
87  const auto expected_sequence = std::vector{std::vector{1, 3, 2, 4, 3, 5}, std::vector{1, -1, 0, 1, -1}};
88  auto input_sequence = expected_sequence;
89  const auto output_sequence = std::vector(
90  std::make_move_iterator(beluga::IndexingIterator(input_sequence)),
91  std::make_move_iterator(beluga::IndexingIterator(input_sequence, input_sequence.size())));
92  EXPECT_THAT(input_sequence, ::testing::Each(::testing::IsEmpty()));
93  ASSERT_THAT(output_sequence, ::testing::ContainerEq(expected_sequence));
94 }
95 
96 } // namespace
beluga::IndexingIterator
A random access iterator for any indexable container.
Definition: indexing_iterator.hpp:38
indexing_iterator.hpp
Implementation of a random access iterator for indexable containers.
beluga::TEST
TEST(Bresenham, MultiPassGuarantee)
Definition: test_bresenham.cpp:27


beluga
Author(s):
autogenerated on Tue Jul 16 2024 02:59:53