// 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_