blob: d27d9fa4cb95d48b576744004cd85dfd0ec6947d [file] [log] [blame]
// 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/fast_type_id.h"
#include <cstddef>
#include <cstdint>
#include <map>
#include <vector>
#include "gtest/gtest.h"
#include "absl/base/macros.h"
namespace {
// Ensure that absl::bit_cast works between FastTypeIdType and void*.
static_assert(sizeof(absl::FastTypeIdType) == sizeof(void*));
// NOLINTBEGIN(runtime/int)
#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)
// NOLINTEND(runtime/int)
TEST(FastTypeIdTest, PrimitiveTypes) {
// clang-format off
constexpr absl::FastTypeIdType kTypeIds[] = {
#define A(T) absl::FastTypeId<T>(),
PRIM_TYPES(A)
#undef A
#define A(T) absl::FastTypeId<const T>(),
PRIM_TYPES(A)
#undef A
#define A(T) absl::FastTypeId<volatile T>(),
PRIM_TYPES(A)
#undef A
#define A(T) absl::FastTypeId<const volatile T>(),
PRIM_TYPES(A)
#undef A
};
// clang-format on
for (size_t i = 0; i < ABSL_ARRAYSIZE(kTypeIds); ++i) {
EXPECT_EQ(kTypeIds[i], kTypeIds[i]);
for (size_t j = 0; j < i; ++j) {
EXPECT_NE(kTypeIds[i], kTypeIds[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) {
// clang-format off
constexpr absl::FastTypeIdType kTypeIds[] = {
#define A(T) absl::FastTypeId<T>(),
FIXED_WIDTH_TYPES(A)
#undef A
#define A(T) absl::FastTypeId<const T>(),
FIXED_WIDTH_TYPES(A)
#undef A
#define A(T) absl::FastTypeId<volatile T>(),
FIXED_WIDTH_TYPES(A)
#undef A
#define A(T) absl::FastTypeId<const volatile T>(),
FIXED_WIDTH_TYPES(A)
#undef A
};
// clang-format on
for (size_t i = 0; i < ABSL_ARRAYSIZE(kTypeIds); ++i) {
EXPECT_EQ(kTypeIds[i], kTypeIds[i]);
for (size_t j = 0; j < i; ++j) {
EXPECT_NE(kTypeIds[i], kTypeIds[j]);
}
}
}
TEST(FastTypeIdTest, AliasTypes) {
using int_alias = int;
EXPECT_EQ(absl::FastTypeId<int_alias>(), absl::FastTypeId<int>());
}
TEST(FastTypeIdTest, TemplateSpecializations) {
EXPECT_NE(absl::FastTypeId<std::vector<int>>(),
absl::FastTypeId<std::vector<long>>()); // NOLINT(runtime/int)
EXPECT_NE((absl::FastTypeId<std::map<int, float>>()),
(absl::FastTypeId<std::map<int, double>>()));
}
struct Base {};
struct Derived : Base {};
struct PDerived : private Base {};
TEST(FastTypeIdTest, Inheritance) {
EXPECT_NE(absl::FastTypeId<Base>(), absl::FastTypeId<Derived>());
EXPECT_NE(absl::FastTypeId<Base>(), absl::FastTypeId<PDerived>());
}
} // namespace