diff options
Diffstat (limited to 'test/source/ConceptImpls.h')
-rw-r--r-- | test/source/ConceptImpls.h | 192 |
1 files changed, 192 insertions, 0 deletions
diff --git a/test/source/ConceptImpls.h b/test/source/ConceptImpls.h new file mode 100644 index 0000000..e6c20ef --- /dev/null +++ b/test/source/ConceptImpls.h @@ -0,0 +1,192 @@ +///////////////////////////////////////////////////////////////////////////// +// Copyright (c) Electronic Arts Inc. All rights reserved. +///////////////////////////////////////////////////////////////////////////// + +#ifndef CONCEPTSIMPLS_H +#define CONCEPTSIMPLS_H + +#include <EASTL/type_traits.h> + +#if !defined(EA_COMPILER_NO_DEFAULTED_FUNCTIONS) && !defined(EA_COMPILER_NO_DELETED_FUNCTIONS) + +#define EASTL_TEST_CONCEPT_IMPLS + +// This header provides a variety of helper classes that have interfaces corresponding to the concepts used to specify +// requirements of many STL containers and algorithms. These helper classes are used in tests to verify that containers +// and algorithms do not impose stricter requirements than specified by the standard on their arguments. + +// Destructible - only valid operation on this class is to destroy it. + +class Destructible +{ +public: + ~Destructible() = default; + + Destructible() = delete; + Destructible(const Destructible&) = delete; + Destructible(Destructible&&) = delete; + Destructible& operator=(const Destructible&) = delete; + Destructible& operator=(Destructible&&) = delete; +}; + +// Unfortunately not all compilers handle type_traits reliably correctly currently so we can't straightforwardly +// static_assert everything that should be true of this class +static_assert(eastl::is_destructible<Destructible>::value, "eastl::is_destructible<Destructible>::value"); +// static_assert(!eastl::is_default_constructible<Destructible>::value, +// "!eastl::is_default_constructible<Destructible>::value"); +// static_assert(!is_copy_constructible<Destructible>::value, "!eastl::is_copy_constructible<Destructible>::value"); +static_assert(!eastl::is_copy_assignable<Destructible>::value, "!eastl::is_copy_assignable<Destructible>::value"); +// static_assert(!eastl::is_move_constructible<Destructible>::value, +// "!eastl::is_move_constructible<Destructible>::value"); +static_assert(!eastl::is_move_assignable<Destructible>::value, "!eastl::is_move_assignable<Destructible>::value"); + +class DefaultConstructible +{ +public: + static const int defaultValue = 42; + + DefaultConstructible() : value(defaultValue) {} + ~DefaultConstructible() = default; + + DefaultConstructible(const DefaultConstructible&) = delete; + DefaultConstructible(DefaultConstructible&&) = delete; + DefaultConstructible& operator=(const DefaultConstructible&) = delete; + DefaultConstructible& operator=(DefaultConstructible&&) = delete; + + const int value; +}; + + +struct NotDefaultConstructible +{ + NotDefaultConstructible() = delete; +}; +static_assert(!eastl::is_default_constructible<NotDefaultConstructible>::value, "'NotDefaultConstructible' is default constructible."); + + +class CopyConstructible +{ +public: + static const int defaultValue = 42; + static CopyConstructible Create() + { + CopyConstructible x; + return x; + } + + CopyConstructible(const CopyConstructible&) = default; + ~CopyConstructible() = default; + + CopyConstructible& operator=(const CopyConstructible&) = delete; + CopyConstructible& operator=(CopyConstructible&&) = delete; + + const int value; + +private: + CopyConstructible() : value(defaultValue) {} +}; + +// Unfortunately not all compilers handle type_traits reliably correctly currently so we can't straightforwardly +// static_assert everything that should be true of this class +static_assert(eastl::is_destructible<CopyConstructible>::value, "eastl::is_destructible<CopyConstructible>::value"); +// static_assert(!eastl::is_default_constructible<CopyConstructible>::value, +// "!eastl::is_default_constructible<CopyConstructible>::value"); +// static_assert(is_copy_constructible<CopyConstructible>::value, "is_copy_constructible<CopyConstructible>::value"); +static_assert(eastl::is_copy_constructible<CopyConstructible>::value, + "eastl::is_copy_constructible<CopyConstructible>::value"); +static_assert(!eastl::is_copy_assignable<CopyConstructible>::value, + "!eastl::is_copy_assignable<CopyConstructible>::value"); +// static_assert(!eastl::is_move_constructible<CopyConstructible>::value, +// "!eastl::is_move_constructible<CopyConstructible>::value"); +static_assert(!eastl::is_move_assignable<CopyConstructible>::value, + "!eastl::is_move_assignable<CopyConstructible>::value"); + +class MoveConstructible +{ +public: + static const int defaultValue = 42; + static MoveConstructible Create() + { + return MoveConstructible{}; + } + + MoveConstructible(MoveConstructible&& x) : value(x.value) {} + ~MoveConstructible() = default; + + MoveConstructible(const MoveConstructible&) = delete; + MoveConstructible& operator=(const MoveConstructible&) = delete; + MoveConstructible& operator=(MoveConstructible&&) = delete; + + const int value; + +private: + MoveConstructible() : value(defaultValue) {} +}; + +class MoveAssignable +{ +public: + static const int defaultValue = 42; + static MoveAssignable Create() + { + return MoveAssignable{}; + } + + MoveAssignable(MoveAssignable&& x) : value(x.value) {} + MoveAssignable& operator=(MoveAssignable&& x) + { + value = x.value; + return *this; + } + ~MoveAssignable() = default; + + MoveAssignable(const MoveAssignable&) = delete; + MoveAssignable& operator=(const MoveAssignable&) = delete; + + int value; + +private: + MoveAssignable() : value(defaultValue) {} +}; + +struct MoveAndDefaultConstructible +{ + static const int defaultValue = 42; + + MoveAndDefaultConstructible() : value(defaultValue) {} + MoveAndDefaultConstructible(MoveAndDefaultConstructible&& x) : value(x.value) {} + ~MoveAndDefaultConstructible() = default; + + MoveAndDefaultConstructible(const MoveAndDefaultConstructible&) = delete; + MoveAndDefaultConstructible& operator=(const MoveAndDefaultConstructible&) = delete; + MoveAndDefaultConstructible& operator=(MoveAndDefaultConstructible&&) = delete; + + const int value; +}; + +struct MissingMoveConstructor +{ + MissingMoveConstructor() {} + MissingMoveConstructor(const MissingMoveConstructor&) {} + MissingMoveConstructor& operator=(MissingMoveConstructor&&) { return *this; } + MissingMoveConstructor& operator=(const MissingMoveConstructor&) { return *this; } + bool operator<(const MissingMoveConstructor&) const { return true; } +}; + +struct MissingMoveAssignable +{ + MissingMoveAssignable() {} + MissingMoveAssignable(const MissingMoveAssignable&) {} + MissingMoveAssignable(MissingMoveAssignable&&) {} + MissingMoveAssignable& operator=(const MissingMoveAssignable&) { return *this; } + bool operator<(const MissingMoveAssignable&) const { return true; } +}; + +struct MissingEquality +{ + MissingEquality& operator==(const MissingEquality&) = delete; +}; + +#endif // !defined(EA_COMPILER_NO_DEFAULTED_FUNCTIONS) && !defined(EA_COMPILER_NO_DELETED_FUNCTIONS) + +#endif // CONCEPTSIMPLS_H |