blob: baa4bb18754b5ff9233d3bbc9d606849cc8f8166 [file] [log] [blame]
Austin Engcc2516a2023-10-17 20:57:54 +00001// Copyright 2020 The Dawn & Tint Authors
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002//
Austin Engcc2516a2023-10-17 20:57:54 +00003// Redistribution and use in source and binary forms, with or without
4// modification, are permitted provided that the following conditions are met:
Ryan Harrisondbc13af2022-02-21 15:19:07 +00005//
Austin Engcc2516a2023-10-17 20:57:54 +00006// 1. Redistributions of source code must retain the above copyright notice, this
7// list of conditions and the following disclaimer.
Ryan Harrisondbc13af2022-02-21 15:19:07 +00008//
Austin Engcc2516a2023-10-17 20:57:54 +00009// 2. Redistributions in binary form must reproduce the above copyright notice,
10// this list of conditions and the following disclaimer in the documentation
11// and/or other materials provided with the distribution.
12//
13// 3. Neither the name of the copyright holder nor the names of its
14// contributors may be used to endorse or promote products derived from
15// this software without specific prior written permission.
16//
17// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
21// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
23// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
24// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
25// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Ryan Harrisondbc13af2022-02-21 15:19:07 +000027
dan sinclair22b4dd22023-07-21 00:40:07 +000028#include "src/tint/utils/rtti/castable.h"
Ryan Harrisondbc13af2022-02-21 15:19:07 +000029
30#include <memory>
31#include <string>
32
33#include "gtest/gtest.h"
34
dan sinclairbae54e72023-07-28 15:01:54 +000035namespace tint {
Ben Clayton23946b32023-03-09 16:50:19 +000036namespace {
Ryan Harrisondbc13af2022-02-21 15:19:07 +000037
dan sinclairbae54e72023-07-28 15:01:54 +000038struct Animal : public Castable<Animal> {};
39struct Amphibian : public Castable<Amphibian, Animal> {};
40struct Mammal : public Castable<Mammal, Animal> {};
41struct Reptile : public Castable<Reptile, Animal> {};
42struct Frog : public Castable<Frog, Amphibian> {};
43struct Bear : public Castable<Bear, Mammal> {};
44struct Lizard : public Castable<Lizard, Reptile> {};
45struct Gecko : public Castable<Gecko, Lizard> {};
46struct Iguana : public Castable<Iguana, Lizard> {};
Ryan Harrisondbc13af2022-02-21 15:19:07 +000047
Ryan Harrisondbc13af2022-02-21 15:19:07 +000048TEST(CastableBase, Is) {
dan sinclair41e4d9a2022-05-01 14:40:55 +000049 std::unique_ptr<CastableBase> frog = std::make_unique<Frog>();
50 std::unique_ptr<CastableBase> bear = std::make_unique<Bear>();
51 std::unique_ptr<CastableBase> gecko = std::make_unique<Gecko>();
Ryan Harrisondbc13af2022-02-21 15:19:07 +000052
dan sinclair41e4d9a2022-05-01 14:40:55 +000053 ASSERT_TRUE(frog->Is<Animal>());
54 ASSERT_TRUE(bear->Is<Animal>());
55 ASSERT_TRUE(gecko->Is<Animal>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +000056
dan sinclair41e4d9a2022-05-01 14:40:55 +000057 ASSERT_TRUE(frog->Is<Amphibian>());
58 ASSERT_FALSE(bear->Is<Amphibian>());
59 ASSERT_FALSE(gecko->Is<Amphibian>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +000060
dan sinclair41e4d9a2022-05-01 14:40:55 +000061 ASSERT_FALSE(frog->Is<Mammal>());
62 ASSERT_TRUE(bear->Is<Mammal>());
63 ASSERT_FALSE(gecko->Is<Mammal>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +000064
dan sinclair41e4d9a2022-05-01 14:40:55 +000065 ASSERT_FALSE(frog->Is<Reptile>());
66 ASSERT_FALSE(bear->Is<Reptile>());
67 ASSERT_TRUE(gecko->Is<Reptile>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +000068}
69
70TEST(CastableBase, Is_kDontErrorOnImpossibleCast) {
dan sinclair41e4d9a2022-05-01 14:40:55 +000071 // Unlike TEST(CastableBase, Is), we're dynamically querying [A -> B] without
72 // going via CastableBase.
73 auto frog = std::make_unique<Frog>();
74 auto bear = std::make_unique<Bear>();
75 auto gecko = std::make_unique<Gecko>();
Ryan Harrisondbc13af2022-02-21 15:19:07 +000076
dan sinclair41e4d9a2022-05-01 14:40:55 +000077 ASSERT_TRUE((frog->Is<Animal, kDontErrorOnImpossibleCast>()));
78 ASSERT_TRUE((bear->Is<Animal, kDontErrorOnImpossibleCast>()));
79 ASSERT_TRUE((gecko->Is<Animal, kDontErrorOnImpossibleCast>()));
Ryan Harrisondbc13af2022-02-21 15:19:07 +000080
dan sinclair41e4d9a2022-05-01 14:40:55 +000081 ASSERT_TRUE((frog->Is<Amphibian, kDontErrorOnImpossibleCast>()));
82 ASSERT_FALSE((bear->Is<Amphibian, kDontErrorOnImpossibleCast>()));
83 ASSERT_FALSE((gecko->Is<Amphibian, kDontErrorOnImpossibleCast>()));
Ryan Harrisondbc13af2022-02-21 15:19:07 +000084
dan sinclair41e4d9a2022-05-01 14:40:55 +000085 ASSERT_FALSE((frog->Is<Mammal, kDontErrorOnImpossibleCast>()));
86 ASSERT_TRUE((bear->Is<Mammal, kDontErrorOnImpossibleCast>()));
87 ASSERT_FALSE((gecko->Is<Mammal, kDontErrorOnImpossibleCast>()));
Ryan Harrisondbc13af2022-02-21 15:19:07 +000088
dan sinclair41e4d9a2022-05-01 14:40:55 +000089 ASSERT_FALSE((frog->Is<Reptile, kDontErrorOnImpossibleCast>()));
90 ASSERT_FALSE((bear->Is<Reptile, kDontErrorOnImpossibleCast>()));
91 ASSERT_TRUE((gecko->Is<Reptile, kDontErrorOnImpossibleCast>()));
Ryan Harrisondbc13af2022-02-21 15:19:07 +000092}
93
94TEST(CastableBase, IsWithPredicate) {
dan sinclair41e4d9a2022-05-01 14:40:55 +000095 std::unique_ptr<CastableBase> frog = std::make_unique<Frog>();
Ryan Harrisondbc13af2022-02-21 15:19:07 +000096
dan sinclair41e4d9a2022-05-01 14:40:55 +000097 frog->Is<Animal>([&frog](const Animal* a) {
98 EXPECT_EQ(a, frog.get());
99 return true;
100 });
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000101
dan sinclair41e4d9a2022-05-01 14:40:55 +0000102 ASSERT_TRUE((frog->Is<Animal>([](const Animal*) { return true; })));
103 ASSERT_FALSE((frog->Is<Animal>([](const Animal*) { return false; })));
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000104
dan sinclair41e4d9a2022-05-01 14:40:55 +0000105 // Predicate not called if cast is invalid
106 auto expect_not_called = [] { FAIL() << "Should not be called"; };
107 ASSERT_FALSE((frog->Is<Bear>([&](const Animal*) {
108 expect_not_called();
109 return true;
110 })));
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000111}
112
113TEST(CastableBase, IsAnyOf) {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000114 std::unique_ptr<CastableBase> frog = std::make_unique<Frog>();
115 std::unique_ptr<CastableBase> bear = std::make_unique<Bear>();
116 std::unique_ptr<CastableBase> gecko = std::make_unique<Gecko>();
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000117
dan sinclair41e4d9a2022-05-01 14:40:55 +0000118 ASSERT_TRUE((frog->IsAnyOf<Animal, Mammal, Amphibian, Reptile>()));
119 ASSERT_TRUE((frog->IsAnyOf<Mammal, Amphibian>()));
120 ASSERT_TRUE((frog->IsAnyOf<Amphibian, Reptile>()));
121 ASSERT_FALSE((frog->IsAnyOf<Mammal, Reptile>()));
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000122
dan sinclair41e4d9a2022-05-01 14:40:55 +0000123 ASSERT_TRUE((bear->IsAnyOf<Animal, Mammal, Amphibian, Reptile>()));
124 ASSERT_TRUE((bear->IsAnyOf<Mammal, Amphibian>()));
125 ASSERT_TRUE((bear->IsAnyOf<Mammal, Reptile>()));
126 ASSERT_FALSE((bear->IsAnyOf<Amphibian, Reptile>()));
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000127
dan sinclair41e4d9a2022-05-01 14:40:55 +0000128 ASSERT_TRUE((gecko->IsAnyOf<Animal, Mammal, Amphibian, Reptile>()));
129 ASSERT_TRUE((gecko->IsAnyOf<Mammal, Reptile>()));
130 ASSERT_TRUE((gecko->IsAnyOf<Amphibian, Reptile>()));
131 ASSERT_FALSE((gecko->IsAnyOf<Mammal, Amphibian>()));
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000132}
133
134TEST(CastableBase, As) {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000135 std::unique_ptr<CastableBase> frog = std::make_unique<Frog>();
136 std::unique_ptr<CastableBase> bear = std::make_unique<Bear>();
137 std::unique_ptr<CastableBase> gecko = std::make_unique<Gecko>();
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000138
dan sinclair41e4d9a2022-05-01 14:40:55 +0000139 ASSERT_EQ(frog->As<Animal>(), static_cast<Animal*>(frog.get()));
140 ASSERT_EQ(bear->As<Animal>(), static_cast<Animal*>(bear.get()));
141 ASSERT_EQ(gecko->As<Animal>(), static_cast<Animal*>(gecko.get()));
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000142
dan sinclair41e4d9a2022-05-01 14:40:55 +0000143 ASSERT_EQ(frog->As<Amphibian>(), static_cast<Amphibian*>(frog.get()));
144 ASSERT_EQ(bear->As<Amphibian>(), nullptr);
145 ASSERT_EQ(gecko->As<Amphibian>(), nullptr);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000146
dan sinclair41e4d9a2022-05-01 14:40:55 +0000147 ASSERT_EQ(frog->As<Mammal>(), nullptr);
148 ASSERT_EQ(bear->As<Mammal>(), static_cast<Mammal*>(bear.get()));
149 ASSERT_EQ(gecko->As<Mammal>(), nullptr);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000150
dan sinclair41e4d9a2022-05-01 14:40:55 +0000151 ASSERT_EQ(frog->As<Reptile>(), nullptr);
152 ASSERT_EQ(bear->As<Reptile>(), nullptr);
153 ASSERT_EQ(gecko->As<Reptile>(), static_cast<Reptile*>(gecko.get()));
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000154}
155
156TEST(CastableBase, As_kDontErrorOnImpossibleCast) {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000157 // Unlike TEST(CastableBase, As), we're dynamically casting [A -> B] without
158 // going via CastableBase.
159 auto frog = std::make_unique<Frog>();
160 auto bear = std::make_unique<Bear>();
161 auto gecko = std::make_unique<Gecko>();
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000162
dan sinclair41e4d9a2022-05-01 14:40:55 +0000163 ASSERT_EQ((frog->As<Animal, kDontErrorOnImpossibleCast>()), static_cast<Animal*>(frog.get()));
164 ASSERT_EQ((bear->As<Animal, kDontErrorOnImpossibleCast>()), static_cast<Animal*>(bear.get()));
165 ASSERT_EQ((gecko->As<Animal, kDontErrorOnImpossibleCast>()), static_cast<Animal*>(gecko.get()));
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000166
dan sinclair41e4d9a2022-05-01 14:40:55 +0000167 ASSERT_EQ((frog->As<Amphibian, kDontErrorOnImpossibleCast>()),
168 static_cast<Amphibian*>(frog.get()));
169 ASSERT_EQ((bear->As<Amphibian, kDontErrorOnImpossibleCast>()), nullptr);
170 ASSERT_EQ((gecko->As<Amphibian, kDontErrorOnImpossibleCast>()), nullptr);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000171
dan sinclair41e4d9a2022-05-01 14:40:55 +0000172 ASSERT_EQ((frog->As<Mammal, kDontErrorOnImpossibleCast>()), nullptr);
173 ASSERT_EQ((bear->As<Mammal, kDontErrorOnImpossibleCast>()), static_cast<Mammal*>(bear.get()));
174 ASSERT_EQ((gecko->As<Mammal, kDontErrorOnImpossibleCast>()), nullptr);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000175
dan sinclair41e4d9a2022-05-01 14:40:55 +0000176 ASSERT_EQ((frog->As<Reptile, kDontErrorOnImpossibleCast>()), nullptr);
177 ASSERT_EQ((bear->As<Reptile, kDontErrorOnImpossibleCast>()), nullptr);
178 ASSERT_EQ((gecko->As<Reptile, kDontErrorOnImpossibleCast>()),
179 static_cast<Reptile*>(gecko.get()));
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000180}
181
182TEST(Castable, Is) {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000183 std::unique_ptr<Animal> frog = std::make_unique<Frog>();
184 std::unique_ptr<Animal> bear = std::make_unique<Bear>();
185 std::unique_ptr<Animal> gecko = std::make_unique<Gecko>();
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000186
dan sinclair41e4d9a2022-05-01 14:40:55 +0000187 ASSERT_TRUE(frog->Is<Animal>());
188 ASSERT_TRUE(bear->Is<Animal>());
189 ASSERT_TRUE(gecko->Is<Animal>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000190
dan sinclair41e4d9a2022-05-01 14:40:55 +0000191 ASSERT_TRUE(frog->Is<Amphibian>());
192 ASSERT_FALSE(bear->Is<Amphibian>());
193 ASSERT_FALSE(gecko->Is<Amphibian>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000194
dan sinclair41e4d9a2022-05-01 14:40:55 +0000195 ASSERT_FALSE(frog->Is<Mammal>());
196 ASSERT_TRUE(bear->Is<Mammal>());
197 ASSERT_FALSE(gecko->Is<Mammal>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000198
dan sinclair41e4d9a2022-05-01 14:40:55 +0000199 ASSERT_FALSE(frog->Is<Reptile>());
200 ASSERT_FALSE(bear->Is<Reptile>());
201 ASSERT_TRUE(gecko->Is<Reptile>());
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000202}
203
204TEST(Castable, IsWithPredicate) {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000205 std::unique_ptr<Animal> frog = std::make_unique<Frog>();
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000206
dan sinclair41e4d9a2022-05-01 14:40:55 +0000207 frog->Is([&frog](const Animal* a) {
208 EXPECT_EQ(a, frog.get());
209 return true;
210 });
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000211
dan sinclair41e4d9a2022-05-01 14:40:55 +0000212 ASSERT_TRUE((frog->Is([](const Animal*) { return true; })));
213 ASSERT_FALSE((frog->Is([](const Animal*) { return false; })));
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000214
dan sinclair41e4d9a2022-05-01 14:40:55 +0000215 // Predicate not called if cast is invalid
216 auto expect_not_called = [] { FAIL() << "Should not be called"; };
217 ASSERT_FALSE((frog->Is([&](const Bear*) {
218 expect_not_called();
219 return true;
220 })));
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000221}
222
223TEST(Castable, As) {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000224 std::unique_ptr<Animal> frog = std::make_unique<Frog>();
225 std::unique_ptr<Animal> bear = std::make_unique<Bear>();
226 std::unique_ptr<Animal> gecko = std::make_unique<Gecko>();
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000227
dan sinclair41e4d9a2022-05-01 14:40:55 +0000228 ASSERT_EQ(frog->As<Animal>(), static_cast<Animal*>(frog.get()));
229 ASSERT_EQ(bear->As<Animal>(), static_cast<Animal*>(bear.get()));
230 ASSERT_EQ(gecko->As<Animal>(), static_cast<Animal*>(gecko.get()));
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000231
dan sinclair41e4d9a2022-05-01 14:40:55 +0000232 ASSERT_EQ(frog->As<Amphibian>(), static_cast<Amphibian*>(frog.get()));
233 ASSERT_EQ(bear->As<Amphibian>(), nullptr);
234 ASSERT_EQ(gecko->As<Amphibian>(), nullptr);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000235
dan sinclair41e4d9a2022-05-01 14:40:55 +0000236 ASSERT_EQ(frog->As<Mammal>(), nullptr);
237 ASSERT_EQ(bear->As<Mammal>(), static_cast<Mammal*>(bear.get()));
238 ASSERT_EQ(gecko->As<Mammal>(), nullptr);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000239
dan sinclair41e4d9a2022-05-01 14:40:55 +0000240 ASSERT_EQ(frog->As<Reptile>(), nullptr);
241 ASSERT_EQ(bear->As<Reptile>(), nullptr);
242 ASSERT_EQ(gecko->As<Reptile>(), static_cast<Reptile*>(gecko.get()));
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000243}
244
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000245// IsCastable static tests
246static_assert(IsCastable<CastableBase>);
247static_assert(IsCastable<Animal>);
248static_assert(IsCastable<Ignore, Frog, Bear>);
249static_assert(IsCastable<Mammal, Ignore, Amphibian, Gecko>);
250static_assert(!IsCastable<Mammal, int, Amphibian, Ignore, Gecko>);
251static_assert(!IsCastable<bool>);
252static_assert(!IsCastable<int, float>);
253static_assert(!IsCastable<Ignore>);
254
255// CastableCommonBase static tests
256static_assert(std::is_same_v<Animal, CastableCommonBase<Animal>>);
257static_assert(std::is_same_v<Amphibian, CastableCommonBase<Amphibian>>);
258static_assert(std::is_same_v<Mammal, CastableCommonBase<Mammal>>);
259static_assert(std::is_same_v<Reptile, CastableCommonBase<Reptile>>);
260static_assert(std::is_same_v<Frog, CastableCommonBase<Frog>>);
261static_assert(std::is_same_v<Bear, CastableCommonBase<Bear>>);
262static_assert(std::is_same_v<Lizard, CastableCommonBase<Lizard>>);
263static_assert(std::is_same_v<Gecko, CastableCommonBase<Gecko>>);
264static_assert(std::is_same_v<Iguana, CastableCommonBase<Iguana>>);
265
266static_assert(std::is_same_v<Animal, CastableCommonBase<Animal, Animal>>);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000267static_assert(std::is_same_v<Amphibian, CastableCommonBase<Amphibian, Amphibian>>);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000268static_assert(std::is_same_v<Mammal, CastableCommonBase<Mammal, Mammal>>);
269static_assert(std::is_same_v<Reptile, CastableCommonBase<Reptile, Reptile>>);
270static_assert(std::is_same_v<Frog, CastableCommonBase<Frog, Frog>>);
271static_assert(std::is_same_v<Bear, CastableCommonBase<Bear, Bear>>);
272static_assert(std::is_same_v<Lizard, CastableCommonBase<Lizard, Lizard>>);
273static_assert(std::is_same_v<Gecko, CastableCommonBase<Gecko, Gecko>>);
274static_assert(std::is_same_v<Iguana, CastableCommonBase<Iguana, Iguana>>);
275
dan sinclair41e4d9a2022-05-01 14:40:55 +0000276static_assert(std::is_same_v<CastableBase, CastableCommonBase<CastableBase, Animal>>);
277static_assert(std::is_same_v<CastableBase, CastableCommonBase<Animal, CastableBase>>);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000278static_assert(std::is_same_v<Amphibian, CastableCommonBase<Amphibian, Frog>>);
279static_assert(std::is_same_v<Amphibian, CastableCommonBase<Frog, Amphibian>>);
280static_assert(std::is_same_v<Animal, CastableCommonBase<Reptile, Frog>>);
281static_assert(std::is_same_v<Animal, CastableCommonBase<Frog, Reptile>>);
282static_assert(std::is_same_v<Animal, CastableCommonBase<Bear, Frog>>);
283static_assert(std::is_same_v<Animal, CastableCommonBase<Frog, Bear>>);
284static_assert(std::is_same_v<Lizard, CastableCommonBase<Gecko, Iguana>>);
285
286static_assert(std::is_same_v<Animal, CastableCommonBase<Bear, Frog, Iguana>>);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000287static_assert(std::is_same_v<Lizard, CastableCommonBase<Lizard, Gecko, Iguana>>);
288static_assert(std::is_same_v<Lizard, CastableCommonBase<Gecko, Iguana, Lizard>>);
289static_assert(std::is_same_v<Lizard, CastableCommonBase<Gecko, Lizard, Iguana>>);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000290static_assert(std::is_same_v<Animal, CastableCommonBase<Frog, Gecko, Iguana>>);
291static_assert(std::is_same_v<Animal, CastableCommonBase<Gecko, Iguana, Frog>>);
292static_assert(std::is_same_v<Animal, CastableCommonBase<Gecko, Frog, Iguana>>);
293
dan sinclair41e4d9a2022-05-01 14:40:55 +0000294static_assert(std::is_same_v<CastableBase, CastableCommonBase<Bear, Frog, Iguana, CastableBase>>);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000295
296} // namespace
297
298TINT_INSTANTIATE_TYPEINFO(Animal);
299TINT_INSTANTIATE_TYPEINFO(Amphibian);
300TINT_INSTANTIATE_TYPEINFO(Mammal);
301TINT_INSTANTIATE_TYPEINFO(Reptile);
302TINT_INSTANTIATE_TYPEINFO(Frog);
303TINT_INSTANTIATE_TYPEINFO(Bear);
304TINT_INSTANTIATE_TYPEINFO(Lizard);
305TINT_INSTANTIATE_TYPEINFO(Gecko);
306
dan sinclairbae54e72023-07-28 15:01:54 +0000307} // namespace tint