//===- IndexedAccessorTest.cpp - Indexed Accessor Tests -------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/STLExtras.h" #include "gmock/gmock.h" using namespace llvm; using namespace llvm::detail; namespace { /// Simple indexed accessor range that wraps an array. template struct ArrayIndexedAccessorRange : public indexed_accessor_range, T *, T> { ArrayIndexedAccessorRange(T *data, ptrdiff_t start, ptrdiff_t numElements) : indexed_accessor_range, T *, T>( data, start, numElements) {} using indexed_accessor_range, T *, T>::indexed_accessor_range; /// See `llvm::indexed_accessor_range` for details. static T &dereference(T *data, ptrdiff_t index) { return data[index]; } }; } // end anonymous namespace template static void compareData(ArrayIndexedAccessorRange range, ArrayRef referenceData) { ASSERT_EQ(referenceData.size(), range.size()); ASSERT_TRUE(std::equal(range.begin(), range.end(), referenceData.begin())); } namespace { TEST(AccessorRange, SliceTest) { int rawData[] = {0, 1, 2, 3, 4}; ArrayRef data = llvm::ArrayRef(rawData); ArrayIndexedAccessorRange range(rawData, /*start=*/0, /*numElements=*/5); compareData(range, data); compareData(range.slice(2, 3), data.slice(2, 3)); compareData(range.slice(0, 5), data.slice(0, 5)); } TEST(AccessorRange, EqualTest) { int32_t rawData1[] = {0, 1, 2, 3, 4}; uint64_t rawData2[] = {0, 1, 2, 3, 4}; ArrayIndexedAccessorRange range1(rawData1, /*start=*/0, /*numElements=*/5); ArrayIndexedAccessorRange range2(rawData2, /*start=*/0, /*numElements=*/5); EXPECT_TRUE(range1 == range2); EXPECT_FALSE(range1 != range2); EXPECT_TRUE(range2 == range1); EXPECT_FALSE(range2 != range1); } } // end anonymous namespace