1872f689dSMandeep Singh Grang //===- llvm/unittest/Support/ReverseIterationTest.cpp ---------------------===//
2872f689dSMandeep Singh Grang //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6872f689dSMandeep Singh Grang //
7872f689dSMandeep Singh Grang //===---------------------------------------------------------------------===//
8872f689dSMandeep Singh Grang //
9872f689dSMandeep Singh Grang // Reverse Iteration unit tests.
10872f689dSMandeep Singh Grang //
11872f689dSMandeep Singh Grang //===---------------------------------------------------------------------===//
12872f689dSMandeep Singh Grang
13872f689dSMandeep Singh Grang #include "llvm/Support/ReverseIteration.h"
14f887406aSDavide Italiano #include "llvm/ADT/DenseMap.h"
15f887406aSDavide Italiano #include "llvm/ADT/DenseMapInfo.h"
16*5f290c09Sserge-sans-paille #include "llvm/ADT/STLExtras.h"
17872f689dSMandeep Singh Grang #include "gtest/gtest.h"
18872f689dSMandeep Singh Grang
19872f689dSMandeep Singh Grang using namespace llvm;
20872f689dSMandeep Singh Grang
TEST(ReverseIterationTest,DenseMapTest1)21872f689dSMandeep Singh Grang TEST(ReverseIterationTest, DenseMapTest1) {
22872f689dSMandeep Singh Grang static_assert(detail::IsPointerLike<int *>::value,
23872f689dSMandeep Singh Grang "int * is pointer-like");
24872f689dSMandeep Singh Grang static_assert(detail::IsPointerLike<uintptr_t>::value,
25872f689dSMandeep Singh Grang "uintptr_t is pointer-like");
2612bd3293SMandeep Singh Grang static_assert(!detail::IsPointerLike<int>::value,
2712bd3293SMandeep Singh Grang "int is not pointer-like");
2812bd3293SMandeep Singh Grang static_assert(detail::IsPointerLike<void *>::value,
2912bd3293SMandeep Singh Grang "void * is pointer-like");
30872f689dSMandeep Singh Grang struct IncompleteType;
31872f689dSMandeep Singh Grang static_assert(detail::IsPointerLike<IncompleteType *>::value,
32872f689dSMandeep Singh Grang "incomplete * is pointer-like");
33872f689dSMandeep Singh Grang
34872f689dSMandeep Singh Grang // For a DenseMap with non-pointer-like keys, forward iteration equals
35872f689dSMandeep Singh Grang // reverse iteration.
36872f689dSMandeep Singh Grang DenseMap<int, int> Map;
37872f689dSMandeep Singh Grang int Keys[] = { 1, 2, 3, 4 };
38872f689dSMandeep Singh Grang
39872f689dSMandeep Singh Grang // Insert keys into the DenseMap.
40872f689dSMandeep Singh Grang for (auto Key: Keys)
41872f689dSMandeep Singh Grang Map[Key] = 0;
42872f689dSMandeep Singh Grang
43872f689dSMandeep Singh Grang // Note: This is the observed order of keys in the DenseMap.
44872f689dSMandeep Singh Grang // If there is any change in the behavior of the DenseMap, this order
45872f689dSMandeep Singh Grang // would need to be adjusted accordingly.
46872f689dSMandeep Singh Grang int IterKeys[] = { 2, 4, 1, 3 };
47872f689dSMandeep Singh Grang
48872f689dSMandeep Singh Grang // Check that the DenseMap is iterated in the expected order.
495e0e0e3fSMark de Wever for (auto Tuple : zip(Map, IterKeys))
50872f689dSMandeep Singh Grang ASSERT_EQ(std::get<0>(Tuple).first, std::get<1>(Tuple));
51872f689dSMandeep Singh Grang
52872f689dSMandeep Singh Grang // Check operator++ (post-increment).
53872f689dSMandeep Singh Grang int i = 0;
54872f689dSMandeep Singh Grang for (auto iter = Map.begin(), end = Map.end(); iter != end; iter++, ++i)
55872f689dSMandeep Singh Grang ASSERT_EQ(iter->first, IterKeys[i]);
56872f689dSMandeep Singh Grang }
579837e994SMandeep Singh Grang
589837e994SMandeep Singh Grang // Define a pointer-like int.
599837e994SMandeep Singh Grang struct PtrLikeInt { int value; };
609837e994SMandeep Singh Grang
61f887406aSDavide Italiano namespace llvm {
62f887406aSDavide Italiano
639837e994SMandeep Singh Grang template<> struct DenseMapInfo<PtrLikeInt *> {
getEmptyKeyllvm::DenseMapInfo649837e994SMandeep Singh Grang static PtrLikeInt *getEmptyKey() {
659837e994SMandeep Singh Grang static PtrLikeInt EmptyKey;
669837e994SMandeep Singh Grang return &EmptyKey;
679837e994SMandeep Singh Grang }
689837e994SMandeep Singh Grang
getTombstoneKeyllvm::DenseMapInfo699837e994SMandeep Singh Grang static PtrLikeInt *getTombstoneKey() {
709837e994SMandeep Singh Grang static PtrLikeInt TombstoneKey;
719837e994SMandeep Singh Grang return &TombstoneKey;
729837e994SMandeep Singh Grang }
739837e994SMandeep Singh Grang
getHashValuellvm::DenseMapInfo749837e994SMandeep Singh Grang static int getHashValue(const PtrLikeInt *P) {
759837e994SMandeep Singh Grang return P->value;
769837e994SMandeep Singh Grang }
779837e994SMandeep Singh Grang
isEqualllvm::DenseMapInfo789837e994SMandeep Singh Grang static bool isEqual(const PtrLikeInt *LHS, const PtrLikeInt *RHS) {
799837e994SMandeep Singh Grang return LHS == RHS;
809837e994SMandeep Singh Grang }
819837e994SMandeep Singh Grang };
829837e994SMandeep Singh Grang
83f887406aSDavide Italiano } // end namespace llvm
84f887406aSDavide Italiano
TEST(ReverseIterationTest,DenseMapTest2)859837e994SMandeep Singh Grang TEST(ReverseIterationTest, DenseMapTest2) {
869837e994SMandeep Singh Grang static_assert(detail::IsPointerLike<PtrLikeInt *>::value,
879837e994SMandeep Singh Grang "PtrLikeInt * is pointer-like");
889837e994SMandeep Singh Grang
899837e994SMandeep Singh Grang PtrLikeInt a = {4}, b = {8}, c = {12}, d = {16};
909837e994SMandeep Singh Grang PtrLikeInt *Keys[] = { &a, &b, &c, &d };
919837e994SMandeep Singh Grang
929837e994SMandeep Singh Grang // Insert keys into the DenseMap.
939837e994SMandeep Singh Grang DenseMap<PtrLikeInt *, int> Map;
949837e994SMandeep Singh Grang for (auto *Key : Keys)
959837e994SMandeep Singh Grang Map[Key] = Key->value;
969837e994SMandeep Singh Grang
979837e994SMandeep Singh Grang // Note: If there is any change in the behavior of the DenseMap,
989837e994SMandeep Singh Grang // the observed order of keys would need to be adjusted accordingly.
999837e994SMandeep Singh Grang if (shouldReverseIterate<PtrLikeInt *>())
1009837e994SMandeep Singh Grang std::reverse(&Keys[0], &Keys[4]);
1019837e994SMandeep Singh Grang
1029837e994SMandeep Singh Grang // Check that the DenseMap is iterated in the expected order.
1035e0e0e3fSMark de Wever for (auto Tuple : zip(Map, Keys))
1049837e994SMandeep Singh Grang ASSERT_EQ(std::get<0>(Tuple).second, std::get<1>(Tuple)->value);
1059837e994SMandeep Singh Grang
1069837e994SMandeep Singh Grang // Check operator++ (post-increment).
1079837e994SMandeep Singh Grang int i = 0;
1089837e994SMandeep Singh Grang for (auto iter = Map.begin(), end = Map.end(); iter != end; iter++, ++i)
1099837e994SMandeep Singh Grang ASSERT_EQ(iter->second, Keys[i]->value);
1109837e994SMandeep Singh Grang }
111