aboutsummaryrefslogtreecommitdiff
path: root/test/source/ConceptImpls.h
diff options
context:
space:
mode:
Diffstat (limited to 'test/source/ConceptImpls.h')
-rw-r--r--test/source/ConceptImpls.h192
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