xref: /llvm-project/mlir/unittests/Support/StorageUniquerTest.cpp (revision 31bb8efd698304a8385ff79229ffbaa5613efdfb)
1*31bb8efdSRiver Riddle //===- StorageUniquerTest.cpp - StorageUniquer Tests ----------------------===//
2*31bb8efdSRiver Riddle //
3*31bb8efdSRiver Riddle // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*31bb8efdSRiver Riddle // See https://llvm.org/LICENSE.txt for license information.
5*31bb8efdSRiver Riddle // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*31bb8efdSRiver Riddle //
7*31bb8efdSRiver Riddle //===----------------------------------------------------------------------===//
8*31bb8efdSRiver Riddle 
9*31bb8efdSRiver Riddle #include "mlir/Support/StorageUniquer.h"
10*31bb8efdSRiver Riddle #include "gmock/gmock.h"
11*31bb8efdSRiver Riddle 
12*31bb8efdSRiver Riddle using namespace mlir;
13*31bb8efdSRiver Riddle 
14*31bb8efdSRiver Riddle namespace {
15*31bb8efdSRiver Riddle /// Simple storage class used for testing.
16*31bb8efdSRiver Riddle template <typename ConcreteT, typename... Args>
17*31bb8efdSRiver Riddle struct SimpleStorage : public StorageUniquer::BaseStorage {
18*31bb8efdSRiver Riddle   using Base = SimpleStorage<ConcreteT, Args...>;
19*31bb8efdSRiver Riddle   using KeyTy = std::tuple<Args...>;
20*31bb8efdSRiver Riddle 
SimpleStorage__anon4a5492a20111::SimpleStorage21*31bb8efdSRiver Riddle   SimpleStorage(KeyTy key) : key(key) {}
22*31bb8efdSRiver Riddle 
23*31bb8efdSRiver Riddle   /// Get an instance of this storage instance.
24*31bb8efdSRiver Riddle   template <typename... ParamsT>
get__anon4a5492a20111::SimpleStorage25*31bb8efdSRiver Riddle   static ConcreteT *get(StorageUniquer &uniquer, ParamsT &&...params) {
26*31bb8efdSRiver Riddle     return uniquer.get<ConcreteT>(
27*31bb8efdSRiver Riddle         /*initFn=*/{}, std::make_tuple(std::forward<ParamsT>(params)...));
28*31bb8efdSRiver Riddle   }
29*31bb8efdSRiver Riddle 
30*31bb8efdSRiver Riddle   /// Construct an instance with the given storage allocator.
construct__anon4a5492a20111::SimpleStorage31*31bb8efdSRiver Riddle   static ConcreteT *construct(StorageUniquer::StorageAllocator &alloc,
32*31bb8efdSRiver Riddle                               KeyTy key) {
33*31bb8efdSRiver Riddle     return new (alloc.allocate<ConcreteT>())
34*31bb8efdSRiver Riddle         ConcreteT(std::forward<KeyTy>(key));
35*31bb8efdSRiver Riddle   }
operator ==__anon4a5492a20111::SimpleStorage36*31bb8efdSRiver Riddle   bool operator==(const KeyTy &key) const { return this->key == key; }
37*31bb8efdSRiver Riddle 
38*31bb8efdSRiver Riddle   KeyTy key;
39*31bb8efdSRiver Riddle };
40*31bb8efdSRiver Riddle } // namespace
41*31bb8efdSRiver Riddle 
TEST(StorageUniquerTest,NonTrivialDestructor)42*31bb8efdSRiver Riddle TEST(StorageUniquerTest, NonTrivialDestructor) {
43*31bb8efdSRiver Riddle   struct NonTrivialStorage : public SimpleStorage<NonTrivialStorage, bool *> {
44*31bb8efdSRiver Riddle     using Base::Base;
45*31bb8efdSRiver Riddle     ~NonTrivialStorage() {
46*31bb8efdSRiver Riddle       bool *wasDestructed = std::get<0>(key);
47*31bb8efdSRiver Riddle       *wasDestructed = true;
48*31bb8efdSRiver Riddle     }
49*31bb8efdSRiver Riddle   };
50*31bb8efdSRiver Riddle 
51*31bb8efdSRiver Riddle   // Verify that the storage instance destructor was properly called.
52*31bb8efdSRiver Riddle   bool wasDestructed = false;
53*31bb8efdSRiver Riddle   {
54*31bb8efdSRiver Riddle     StorageUniquer uniquer;
55*31bb8efdSRiver Riddle     uniquer.registerParametricStorageType<NonTrivialStorage>();
56*31bb8efdSRiver Riddle     NonTrivialStorage::get(uniquer, &wasDestructed);
57*31bb8efdSRiver Riddle   }
58*31bb8efdSRiver Riddle 
59*31bb8efdSRiver Riddle   EXPECT_TRUE(wasDestructed);
60*31bb8efdSRiver Riddle }
61