// Copyright 2020 The Abseil Authors. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "absl/base/internal/fast_type_id.h" #include #include #include #include "gtest/gtest.h" namespace { namespace bi = absl::base_internal; // NOLINTNEXTLINE #define PRIM_TYPES(A) \ A(bool) \ A(short) \ A(unsigned short) \ A(int) \ A(unsigned int) \ A(long) \ A(unsigned long) \ A(long long) \ A(unsigned long long) \ A(float) \ A(double) \ A(long double) TEST(FastTypeIdTest, PrimitiveTypes) { bi::FastTypeIdType type_ids[] = { #define A(T) bi::FastTypeId(), PRIM_TYPES(A) #undef A #define A(T) bi::FastTypeId(), PRIM_TYPES(A) #undef A #define A(T) bi::FastTypeId(), PRIM_TYPES(A) #undef A #define A(T) bi::FastTypeId(), PRIM_TYPES(A) #undef A }; size_t total_type_ids = sizeof(type_ids) / sizeof(bi::FastTypeIdType); for (int i = 0; i < total_type_ids; ++i) { EXPECT_EQ(type_ids[i], type_ids[i]); for (int j = 0; j < i; ++j) { EXPECT_NE(type_ids[i], type_ids[j]); } } } #define FIXED_WIDTH_TYPES(A) \ A(int8_t) \ A(uint8_t) \ A(int16_t) \ A(uint16_t) \ A(int32_t) \ A(uint32_t) \ A(int64_t) \ A(uint64_t) TEST(FastTypeIdTest, FixedWidthTypes) { bi::FastTypeIdType type_ids[] = { #define A(T) bi::FastTypeId(), FIXED_WIDTH_TYPES(A) #undef A #define A(T) bi::FastTypeId(), FIXED_WIDTH_TYPES(A) #undef A #define A(T) bi::FastTypeId(), FIXED_WIDTH_TYPES(A) #undef A #define A(T) bi::FastTypeId(), FIXED_WIDTH_TYPES(A) #undef A }; size_t total_type_ids = sizeof(type_ids) / sizeof(bi::FastTypeIdType); for (int i = 0; i < total_type_ids; ++i) { EXPECT_EQ(type_ids[i], type_ids[i]); for (int j = 0; j < i; ++j) { EXPECT_NE(type_ids[i], type_ids[j]); } } } TEST(FastTypeIdTest, AliasTypes) { using int_alias = int; EXPECT_EQ(bi::FastTypeId(), bi::FastTypeId()); } TEST(FastTypeIdTest, TemplateSpecializations) { EXPECT_NE(bi::FastTypeId>(), bi::FastTypeId>()); EXPECT_NE((bi::FastTypeId>()), (bi::FastTypeId>())); } struct Base {}; struct Derived : Base {}; struct PDerived : private Base {}; TEST(FastTypeIdTest, Inheritance) { EXPECT_NE(bi::FastTypeId(), bi::FastTypeId()); EXPECT_NE(bi::FastTypeId(), bi::FastTypeId()); } } // namespace