1204c3b55SRiver Riddle //===- IndexedAccessorTest.cpp - Indexed Accessor Tests -------------------===//
2204c3b55SRiver Riddle //
3204c3b55SRiver Riddle // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4204c3b55SRiver Riddle // See https://llvm.org/LICENSE.txt for license information.
5204c3b55SRiver Riddle // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6204c3b55SRiver Riddle //
7204c3b55SRiver Riddle //===----------------------------------------------------------------------===//
8204c3b55SRiver Riddle
9204c3b55SRiver Riddle #include "llvm/ADT/ArrayRef.h"
10204c3b55SRiver Riddle #include "llvm/ADT/STLExtras.h"
11204c3b55SRiver Riddle #include "gmock/gmock.h"
12204c3b55SRiver Riddle
13204c3b55SRiver Riddle using namespace llvm;
14204c3b55SRiver Riddle using namespace llvm::detail;
15204c3b55SRiver Riddle
16204c3b55SRiver Riddle namespace {
17204c3b55SRiver Riddle /// Simple indexed accessor range that wraps an array.
18204c3b55SRiver Riddle template <typename T>
19204c3b55SRiver Riddle struct ArrayIndexedAccessorRange
20204c3b55SRiver Riddle : public indexed_accessor_range<ArrayIndexedAccessorRange<T>, T *, T> {
ArrayIndexedAccessorRange__anon39f043bf0111::ArrayIndexedAccessorRange21204c3b55SRiver Riddle ArrayIndexedAccessorRange(T *data, ptrdiff_t start, ptrdiff_t numElements)
22204c3b55SRiver Riddle : indexed_accessor_range<ArrayIndexedAccessorRange<T>, T *, T>(
23204c3b55SRiver Riddle data, start, numElements) {}
24204c3b55SRiver Riddle using indexed_accessor_range<ArrayIndexedAccessorRange<T>, T *,
25204c3b55SRiver Riddle T>::indexed_accessor_range;
26204c3b55SRiver Riddle
27204c3b55SRiver Riddle /// See `llvm::indexed_accessor_range` for details.
dereference__anon39f043bf0111::ArrayIndexedAccessorRange28204c3b55SRiver Riddle static T &dereference(T *data, ptrdiff_t index) { return data[index]; }
29204c3b55SRiver Riddle };
30204c3b55SRiver Riddle } // end anonymous namespace
31204c3b55SRiver Riddle
32204c3b55SRiver Riddle template <typename T>
compareData(ArrayIndexedAccessorRange<T> range,ArrayRef<T> referenceData)33204c3b55SRiver Riddle static void compareData(ArrayIndexedAccessorRange<T> range,
34204c3b55SRiver Riddle ArrayRef<T> referenceData) {
3538ac4093SArchibald Elliott ASSERT_EQ(referenceData.size(), range.size());
36204c3b55SRiver Riddle ASSERT_TRUE(std::equal(range.begin(), range.end(), referenceData.begin()));
37204c3b55SRiver Riddle }
38204c3b55SRiver Riddle
39204c3b55SRiver Riddle namespace {
TEST(AccessorRange,SliceTest)40204c3b55SRiver Riddle TEST(AccessorRange, SliceTest) {
41204c3b55SRiver Riddle int rawData[] = {0, 1, 2, 3, 4};
42*38818b60Sserge-sans-paille ArrayRef<int> data = llvm::ArrayRef(rawData);
43204c3b55SRiver Riddle
44204c3b55SRiver Riddle ArrayIndexedAccessorRange<int> range(rawData, /*start=*/0, /*numElements=*/5);
45204c3b55SRiver Riddle compareData(range, data);
46204c3b55SRiver Riddle compareData(range.slice(2, 3), data.slice(2, 3));
47204c3b55SRiver Riddle compareData(range.slice(0, 5), data.slice(0, 5));
48204c3b55SRiver Riddle }
49c312f025SBenjamin Kramer
TEST(AccessorRange,EqualTest)50c312f025SBenjamin Kramer TEST(AccessorRange, EqualTest) {
51c312f025SBenjamin Kramer int32_t rawData1[] = {0, 1, 2, 3, 4};
52c312f025SBenjamin Kramer uint64_t rawData2[] = {0, 1, 2, 3, 4};
53c312f025SBenjamin Kramer
54c312f025SBenjamin Kramer ArrayIndexedAccessorRange<int32_t> range1(rawData1, /*start=*/0,
55c312f025SBenjamin Kramer /*numElements=*/5);
56c312f025SBenjamin Kramer ArrayIndexedAccessorRange<uint64_t> range2(rawData2, /*start=*/0,
57c312f025SBenjamin Kramer /*numElements=*/5);
58c312f025SBenjamin Kramer EXPECT_TRUE(range1 == range2);
59c312f025SBenjamin Kramer EXPECT_FALSE(range1 != range2);
60c312f025SBenjamin Kramer EXPECT_TRUE(range2 == range1);
61c312f025SBenjamin Kramer EXPECT_FALSE(range2 != range1);
62c312f025SBenjamin Kramer }
63204c3b55SRiver Riddle } // end anonymous namespace
64