blob: 0cc6884e309e28e7fe600065573389c335495054 [file] [log] [blame]
// Copyright 2018 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.
//
// -----------------------------------------------------------------------------
// regularity_aliases.h
// -----------------------------------------------------------------------------
//
// This file contains type aliases of common ConformanceProfiles and Archetypes
// so that they can be directly used by name without creating them from scratch.
#ifndef ABSL_TYPES_INTERNAL_CONFORMANCE_ALIASES_H_
#define ABSL_TYPES_INTERNAL_CONFORMANCE_ALIASES_H_
#include "absl/types/internal/conformance_archetype.h"
#include "absl/types/internal/conformance_profile.h"
namespace absl {
ABSL_NAMESPACE_BEGIN
namespace types_internal {
// Creates both a Profile and a corresponding Archetype with root name "name".
#define ABSL_INTERNAL_PROFILE_AND_ARCHETYPE_ALIAS(name, ...) \
struct name##Profile : __VA_ARGS__ {}; \
\
using name##Archetype = ::absl::types_internal::Archetype<name##Profile>; \
\
template <class AbslInternalProfileTag> \
using name##Archetype##_ = ::absl::types_internal::Archetype< \
::absl::types_internal::StrongProfileTypedef<name##Profile, \
AbslInternalProfileTag>>
ABSL_INTERNAL_PROFILE_AND_ARCHETYPE_ALIAS(
HasTrivialDefaultConstructor,
ConformanceProfile<default_constructible::trivial>);
ABSL_INTERNAL_PROFILE_AND_ARCHETYPE_ALIAS(
HasNothrowDefaultConstructor,
ConformanceProfile<default_constructible::nothrow>);
ABSL_INTERNAL_PROFILE_AND_ARCHETYPE_ALIAS(
HasDefaultConstructor, ConformanceProfile<default_constructible::yes>);
ABSL_INTERNAL_PROFILE_AND_ARCHETYPE_ALIAS(
HasTrivialMoveConstructor, ConformanceProfile<default_constructible::maybe,
move_constructible::trivial>);
ABSL_INTERNAL_PROFILE_AND_ARCHETYPE_ALIAS(
HasNothrowMoveConstructor, ConformanceProfile<default_constructible::maybe,
move_constructible::nothrow>);
ABSL_INTERNAL_PROFILE_AND_ARCHETYPE_ALIAS(
HasMoveConstructor,
ConformanceProfile<default_constructible::maybe, move_constructible::yes>);
ABSL_INTERNAL_PROFILE_AND_ARCHETYPE_ALIAS(
HasTrivialCopyConstructor,
ConformanceProfile<default_constructible::maybe, move_constructible::maybe,
copy_constructible::trivial>);
ABSL_INTERNAL_PROFILE_AND_ARCHETYPE_ALIAS(
HasNothrowCopyConstructor,
ConformanceProfile<default_constructible::maybe, move_constructible::maybe,
copy_constructible::nothrow>);
ABSL_INTERNAL_PROFILE_AND_ARCHETYPE_ALIAS(
HasCopyConstructor,
ConformanceProfile<default_constructible::maybe, move_constructible::maybe,
copy_constructible::yes>);
ABSL_INTERNAL_PROFILE_AND_ARCHETYPE_ALIAS(
HasTrivialMoveAssign,
ConformanceProfile<default_constructible::maybe, move_constructible::maybe,
copy_constructible::maybe, move_assignable::trivial>);
ABSL_INTERNAL_PROFILE_AND_ARCHETYPE_ALIAS(
HasNothrowMoveAssign,
ConformanceProfile<default_constructible::maybe, move_constructible::maybe,
copy_constructible::maybe, move_assignable::nothrow>);
ABSL_INTERNAL_PROFILE_AND_ARCHETYPE_ALIAS(
HasMoveAssign,
ConformanceProfile<default_constructible::maybe, move_constructible::maybe,
copy_constructible::maybe, move_assignable::yes>);
ABSL_INTERNAL_PROFILE_AND_ARCHETYPE_ALIAS(
HasTrivialCopyAssign,
ConformanceProfile<default_constructible::maybe, move_constructible::maybe,
copy_constructible::maybe, move_assignable::maybe,
copy_assignable::trivial>);
ABSL_INTERNAL_PROFILE_AND_ARCHETYPE_ALIAS(
HasNothrowCopyAssign,
ConformanceProfile<default_constructible::maybe, move_constructible::maybe,
copy_constructible::maybe, move_assignable::maybe,
copy_assignable::nothrow>);
ABSL_INTERNAL_PROFILE_AND_ARCHETYPE_ALIAS(
HasCopyAssign,
ConformanceProfile<default_constructible::maybe, move_constructible::maybe,
copy_constructible::maybe, move_assignable::maybe,
copy_assignable::yes>);
ABSL_INTERNAL_PROFILE_AND_ARCHETYPE_ALIAS(
HasTrivialDestructor,
ConformanceProfile<default_constructible::maybe, move_constructible::maybe,
copy_constructible::maybe, move_assignable::maybe,
copy_assignable::maybe, destructible::trivial>);
ABSL_INTERNAL_PROFILE_AND_ARCHETYPE_ALIAS(
HasNothrowDestructor,
ConformanceProfile<default_constructible::maybe, move_constructible::maybe,
copy_constructible::maybe, move_assignable::maybe,
copy_assignable::maybe, destructible::nothrow>);
ABSL_INTERNAL_PROFILE_AND_ARCHETYPE_ALIAS(
HasDestructor,
ConformanceProfile<default_constructible::maybe, move_constructible::maybe,
copy_constructible::maybe, move_assignable::maybe,
copy_assignable::maybe, destructible::yes>);
ABSL_INTERNAL_PROFILE_AND_ARCHETYPE_ALIAS(
HasNothrowEquality,
ConformanceProfile<default_constructible::maybe, move_constructible::maybe,
copy_constructible::maybe, move_assignable::maybe,
copy_assignable::maybe, destructible::maybe,
equality_comparable::nothrow>);
ABSL_INTERNAL_PROFILE_AND_ARCHETYPE_ALIAS(
HasEquality,
ConformanceProfile<default_constructible::maybe, move_constructible::maybe,
copy_constructible::maybe, move_assignable::maybe,
copy_assignable::maybe, destructible::maybe,
equality_comparable::yes>);
ABSL_INTERNAL_PROFILE_AND_ARCHETYPE_ALIAS(
HasNothrowInequality,
ConformanceProfile<default_constructible::maybe, move_constructible::maybe,
copy_constructible::maybe, move_assignable::maybe,
copy_assignable::maybe, destructible::maybe,
equality_comparable::maybe,
inequality_comparable::nothrow>);
ABSL_INTERNAL_PROFILE_AND_ARCHETYPE_ALIAS(
HasInequality,
ConformanceProfile<default_constructible::maybe, move_constructible::maybe,
copy_constructible::maybe, move_assignable::maybe,
copy_assignable::maybe, destructible::maybe,
equality_comparable::maybe, inequality_comparable::yes>);
ABSL_INTERNAL_PROFILE_AND_ARCHETYPE_ALIAS(
HasNothrowLessThan,
ConformanceProfile<default_constructible::maybe, move_constructible::maybe,
copy_constructible::maybe, move_assignable::maybe,
copy_assignable::maybe, destructible::maybe,
equality_comparable::maybe, inequality_comparable::maybe,
less_than_comparable::nothrow>);
ABSL_INTERNAL_PROFILE_AND_ARCHETYPE_ALIAS(
HasLessThan,
ConformanceProfile<default_constructible::maybe, move_constructible::maybe,
copy_constructible::maybe, move_assignable::maybe,
copy_assignable::maybe, destructible::maybe,
equality_comparable::maybe, inequality_comparable::maybe,
less_than_comparable::yes>);
ABSL_INTERNAL_PROFILE_AND_ARCHETYPE_ALIAS(
HasNothrowLessEqual,
ConformanceProfile<default_constructible::maybe, move_constructible::maybe,
copy_constructible::maybe, move_assignable::maybe,
copy_assignable::maybe, destructible::maybe,
equality_comparable::maybe, inequality_comparable::maybe,
less_than_comparable::maybe,
less_equal_comparable::nothrow>);
ABSL_INTERNAL_PROFILE_AND_ARCHETYPE_ALIAS(
HasLessEqual,
ConformanceProfile<default_constructible::maybe, move_constructible::maybe,
copy_constructible::maybe, move_assignable::maybe,
copy_assignable::maybe, destructible::maybe,
equality_comparable::maybe, inequality_comparable::maybe,
less_than_comparable::maybe,
less_equal_comparable::yes>);
ABSL_INTERNAL_PROFILE_AND_ARCHETYPE_ALIAS(
HasNothrowGreaterEqual,
ConformanceProfile<
default_constructible::maybe, move_constructible::maybe,
copy_constructible::maybe, move_assignable::maybe,
copy_assignable::maybe, destructible::maybe, equality_comparable::maybe,
inequality_comparable::maybe, less_than_comparable::maybe,
less_equal_comparable::maybe, greater_equal_comparable::nothrow>);
ABSL_INTERNAL_PROFILE_AND_ARCHETYPE_ALIAS(
HasGreaterEqual,
ConformanceProfile<
default_constructible::maybe, move_constructible::maybe,
copy_constructible::maybe, move_assignable::maybe,
copy_assignable::maybe, destructible::maybe, equality_comparable::maybe,
inequality_comparable::maybe, less_than_comparable::maybe,
less_equal_comparable::maybe, greater_equal_comparable::yes>);
ABSL_INTERNAL_PROFILE_AND_ARCHETYPE_ALIAS(
HasNothrowGreaterThan,
ConformanceProfile<
default_constructible::maybe, move_constructible::maybe,
copy_constructible::maybe, move_assignable::maybe,
copy_assignable::maybe, destructible::maybe, equality_comparable::maybe,
inequality_comparable::maybe, less_than_comparable::maybe,
less_equal_comparable::maybe, greater_equal_comparable::maybe,
greater_than_comparable::nothrow>);
ABSL_INTERNAL_PROFILE_AND_ARCHETYPE_ALIAS(
HasGreaterThan,
ConformanceProfile<
default_constructible::maybe, move_constructible::maybe,
copy_constructible::maybe, move_assignable::maybe,
copy_assignable::maybe, destructible::maybe, equality_comparable::maybe,
inequality_comparable::maybe, less_than_comparable::maybe,
less_equal_comparable::maybe, greater_equal_comparable::maybe,
greater_than_comparable::yes>);
ABSL_INTERNAL_PROFILE_AND_ARCHETYPE_ALIAS(
HasNothrowSwap,
ConformanceProfile<
default_constructible::maybe, move_constructible::maybe,
copy_constructible::maybe, move_assignable::maybe,
copy_assignable::maybe, destructible::maybe, equality_comparable::maybe,
inequality_comparable::maybe, less_than_comparable::maybe,
less_equal_comparable::maybe, greater_equal_comparable::maybe,
greater_than_comparable::maybe, swappable::nothrow>);
ABSL_INTERNAL_PROFILE_AND_ARCHETYPE_ALIAS(
HasSwap,
ConformanceProfile<
default_constructible::maybe, move_constructible::maybe,
copy_constructible::maybe, move_assignable::maybe,
copy_assignable::maybe, destructible::maybe, equality_comparable::maybe,
inequality_comparable::maybe, less_than_comparable::maybe,
less_equal_comparable::maybe, greater_equal_comparable::maybe,
greater_than_comparable::maybe, swappable::yes>);
ABSL_INTERNAL_PROFILE_AND_ARCHETYPE_ALIAS(
HasStdHashSpecialization,
ConformanceProfile<
default_constructible::maybe, move_constructible::maybe,
copy_constructible::maybe, move_assignable::maybe,
copy_assignable::maybe, destructible::maybe, equality_comparable::maybe,
inequality_comparable::maybe, less_than_comparable::maybe,
less_equal_comparable::maybe, greater_equal_comparable::maybe,
greater_than_comparable::maybe, swappable::maybe, hashable::yes>);
////////////////////////////////////////////////////////////////////////////////
//// The remaining aliases are combinations of the previous aliases. ////
////////////////////////////////////////////////////////////////////////////////
ABSL_INTERNAL_PROFILE_AND_ARCHETYPE_ALIAS(
Equatable, CombineProfiles<HasEqualityProfile, HasInequalityProfile>);
ABSL_INTERNAL_PROFILE_AND_ARCHETYPE_ALIAS(
Comparable,
CombineProfiles<EquatableProfile, HasLessThanProfile, HasLessEqualProfile,
HasGreaterEqualProfile, HasGreaterThanProfile>);
ABSL_INTERNAL_PROFILE_AND_ARCHETYPE_ALIAS(
NothrowEquatable,
CombineProfiles<HasNothrowEqualityProfile, HasNothrowInequalityProfile>);
ABSL_INTERNAL_PROFILE_AND_ARCHETYPE_ALIAS(
NothrowComparable,
CombineProfiles<NothrowEquatableProfile, HasNothrowLessThanProfile,
HasNothrowLessEqualProfile, HasNothrowGreaterEqualProfile,
HasNothrowGreaterThanProfile>);
ABSL_INTERNAL_PROFILE_AND_ARCHETYPE_ALIAS(
Value,
CombineProfiles<HasNothrowMoveConstructorProfile, HasCopyConstructorProfile,
HasNothrowMoveAssignProfile, HasCopyAssignProfile,
HasNothrowDestructorProfile, HasNothrowSwapProfile>);
ABSL_INTERNAL_PROFILE_AND_ARCHETYPE_ALIAS(
EquatableValue, CombineProfiles<EquatableProfile, ValueProfile>);
ABSL_INTERNAL_PROFILE_AND_ARCHETYPE_ALIAS(
ComparableValue, CombineProfiles<ComparableProfile, ValueProfile>);
ABSL_INTERNAL_PROFILE_AND_ARCHETYPE_ALIAS(
DefaultConstructibleValue,
CombineProfiles<HasDefaultConstructorProfile, ValueProfile>);
ABSL_INTERNAL_PROFILE_AND_ARCHETYPE_ALIAS(
NothrowMoveConstructible, CombineProfiles<HasNothrowMoveConstructorProfile,
HasNothrowDestructorProfile>);
ABSL_INTERNAL_PROFILE_AND_ARCHETYPE_ALIAS(
EquatableNothrowMoveConstructible,
CombineProfiles<EquatableProfile, NothrowMoveConstructibleProfile>);
ABSL_INTERNAL_PROFILE_AND_ARCHETYPE_ALIAS(
ComparableNothrowMoveConstructible,
CombineProfiles<ComparableProfile, NothrowMoveConstructibleProfile>);
ABSL_INTERNAL_PROFILE_AND_ARCHETYPE_ALIAS(
DefaultConstructibleNothrowMoveConstructible,
CombineProfiles<HasDefaultConstructorProfile,
NothrowMoveConstructibleProfile>);
ABSL_INTERNAL_PROFILE_AND_ARCHETYPE_ALIAS(
CopyConstructible,
CombineProfiles<HasNothrowMoveConstructorProfile, HasCopyConstructorProfile,
HasNothrowDestructorProfile>);
ABSL_INTERNAL_PROFILE_AND_ARCHETYPE_ALIAS(
EquatableCopyConstructible,
CombineProfiles<EquatableProfile, CopyConstructibleProfile>);
ABSL_INTERNAL_PROFILE_AND_ARCHETYPE_ALIAS(
ComparableCopyConstructible,
CombineProfiles<ComparableProfile, CopyConstructibleProfile>);
ABSL_INTERNAL_PROFILE_AND_ARCHETYPE_ALIAS(
DefaultConstructibleCopyConstructible,
CombineProfiles<HasDefaultConstructorProfile, CopyConstructibleProfile>);
ABSL_INTERNAL_PROFILE_AND_ARCHETYPE_ALIAS(
NothrowMovable,
CombineProfiles<HasNothrowMoveConstructorProfile,
HasNothrowMoveAssignProfile, HasNothrowDestructorProfile,
HasNothrowSwapProfile>);
ABSL_INTERNAL_PROFILE_AND_ARCHETYPE_ALIAS(
EquatableNothrowMovable,
CombineProfiles<EquatableProfile, NothrowMovableProfile>);
ABSL_INTERNAL_PROFILE_AND_ARCHETYPE_ALIAS(
ComparableNothrowMovable,
CombineProfiles<ComparableProfile, NothrowMovableProfile>);
ABSL_INTERNAL_PROFILE_AND_ARCHETYPE_ALIAS(
DefaultConstructibleNothrowMovable,
CombineProfiles<HasDefaultConstructorProfile, NothrowMovableProfile>);
ABSL_INTERNAL_PROFILE_AND_ARCHETYPE_ALIAS(
TrivialSpecialMemberFunctions,
CombineProfiles<HasTrivialDefaultConstructorProfile,
HasTrivialMoveConstructorProfile,
HasTrivialCopyConstructorProfile,
HasTrivialMoveAssignProfile, HasTrivialCopyAssignProfile,
HasTrivialDestructorProfile, HasNothrowSwapProfile>);
ABSL_INTERNAL_PROFILE_AND_ARCHETYPE_ALIAS(
TriviallyComplete,
CombineProfiles<TrivialSpecialMemberFunctionsProfile, ComparableProfile,
HasStdHashSpecializationProfile>);
ABSL_INTERNAL_PROFILE_AND_ARCHETYPE_ALIAS(
HashableNothrowMoveConstructible,
CombineProfiles<HasStdHashSpecializationProfile,
NothrowMoveConstructibleProfile>);
ABSL_INTERNAL_PROFILE_AND_ARCHETYPE_ALIAS(
HashableCopyConstructible,
CombineProfiles<HasStdHashSpecializationProfile, CopyConstructibleProfile>);
ABSL_INTERNAL_PROFILE_AND_ARCHETYPE_ALIAS(
HashableNothrowMovable,
CombineProfiles<HasStdHashSpecializationProfile, NothrowMovableProfile>);
ABSL_INTERNAL_PROFILE_AND_ARCHETYPE_ALIAS(
HashableValue,
CombineProfiles<HasStdHashSpecializationProfile, ValueProfile>);
ABSL_INTERNAL_PROFILE_AND_ARCHETYPE_ALIAS(
ComparableHashableValue,
CombineProfiles<HashableValueProfile, ComparableProfile>);
// The "preferred" profiles that we support in Abseil.
template <template <class...> class Receiver>
using ExpandBasicProfiles =
Receiver<NothrowMoveConstructibleProfile, CopyConstructibleProfile,
NothrowMovableProfile, ValueProfile>;
// The basic profiles except that they are also all Equatable.
template <template <class...> class Receiver>
using ExpandBasicEquatableProfiles =
Receiver<EquatableNothrowMoveConstructibleProfile,
EquatableCopyConstructibleProfile, EquatableNothrowMovableProfile,
EquatableValueProfile>;
// The basic profiles except that they are also all Comparable.
template <template <class...> class Receiver>
using ExpandBasicComparableProfiles =
Receiver<ComparableNothrowMoveConstructibleProfile,
ComparableCopyConstructibleProfile,
ComparableNothrowMovableProfile, ComparableValueProfile>;
// The basic profiles except that they are also all Hashable.
template <template <class...> class Receiver>
using ExpandBasicHashableProfiles =
Receiver<HashableNothrowMoveConstructibleProfile,
HashableCopyConstructibleProfile, HashableNothrowMovableProfile,
HashableValueProfile>;
// The basic profiles except that they are also all DefaultConstructible.
template <template <class...> class Receiver>
using ExpandBasicDefaultConstructibleProfiles =
Receiver<DefaultConstructibleNothrowMoveConstructibleProfile,
DefaultConstructibleCopyConstructibleProfile,
DefaultConstructibleNothrowMovableProfile,
DefaultConstructibleValueProfile>;
// The type profiles that we support in Abseil (all of the previous lists).
template <template <class...> class Receiver>
using ExpandSupportedProfiles = Receiver<
NothrowMoveConstructibleProfile, CopyConstructibleProfile,
NothrowMovableProfile, ValueProfile,
EquatableNothrowMoveConstructibleProfile, EquatableCopyConstructibleProfile,
EquatableNothrowMovableProfile, EquatableValueProfile,
ComparableNothrowMoveConstructibleProfile,
ComparableCopyConstructibleProfile, ComparableNothrowMovableProfile,
ComparableValueProfile, DefaultConstructibleNothrowMoveConstructibleProfile,
DefaultConstructibleCopyConstructibleProfile,
DefaultConstructibleNothrowMovableProfile, DefaultConstructibleValueProfile,
HashableNothrowMoveConstructibleProfile, HashableCopyConstructibleProfile,
HashableNothrowMovableProfile, HashableValueProfile>;
// TODO(calabrese) Include types that have throwing move constructors, since in
// practice we still need to support them because of standard library types with
// (potentially) non-noexcept moves.
} // namespace types_internal
ABSL_NAMESPACE_END
} // namespace absl
#undef ABSL_INTERNAL_PROFILE_AND_ARCHETYPE_ALIAS
#endif // ABSL_TYPES_INTERNAL_CONFORMANCE_ALIASES_H_