| // 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 <cstdint> |
| #include <map> |
| #include <vector> |
| |
| #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<T>(), |
| PRIM_TYPES(A) |
| #undef A |
| #define A(T) bi::FastTypeId<const T>(), |
| PRIM_TYPES(A) |
| #undef A |
| #define A(T) bi::FastTypeId<volatile T>(), |
| PRIM_TYPES(A) |
| #undef A |
| #define A(T) bi::FastTypeId<const volatile T>(), |
| 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<T>(), |
| FIXED_WIDTH_TYPES(A) |
| #undef A |
| #define A(T) bi::FastTypeId<const T>(), |
| FIXED_WIDTH_TYPES(A) |
| #undef A |
| #define A(T) bi::FastTypeId<volatile T>(), |
| FIXED_WIDTH_TYPES(A) |
| #undef A |
| #define A(T) bi::FastTypeId<const volatile T>(), |
| 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<int_alias>(), bi::FastTypeId<int>()); |
| } |
| |
| TEST(FastTypeIdTest, TemplateSpecializations) { |
| EXPECT_NE(bi::FastTypeId<std::vector<int>>(), |
| bi::FastTypeId<std::vector<long>>()); |
| |
| EXPECT_NE((bi::FastTypeId<std::map<int, float>>()), |
| (bi::FastTypeId<std::map<int, double>>())); |
| } |
| |
| struct Base {}; |
| struct Derived : Base {}; |
| struct PDerived : private Base {}; |
| |
| TEST(FastTypeIdTest, Inheritance) { |
| EXPECT_NE(bi::FastTypeId<Base>(), bi::FastTypeId<Derived>()); |
| EXPECT_NE(bi::FastTypeId<Base>(), bi::FastTypeId<PDerived>()); |
| } |
| |
| } // namespace |