From 04c2f67492c5ccc59592e8575a7c66f66aca71a6 Mon Sep 17 00:00:00 2001 From: Marc Chevrier Date: Tue, 7 Jan 2020 11:29:32 +0100 Subject: STL Support: extends type_traits for future developments --- Utilities/std/cm/type_traits | 10 ++++++ Utilities/std/cmext/type_traits | 68 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+) create mode 100644 Utilities/std/cmext/type_traits diff --git a/Utilities/std/cm/type_traits b/Utilities/std/cm/type_traits index 4dfe17b..e32c2c6 100644 --- a/Utilities/std/cm/type_traits +++ b/Utilities/std/cm/type_traits @@ -33,6 +33,8 @@ using std::bool_constant; using std::invoke_result; using std::invoke_result_t; +using std::void_t; + #else // Helper classes @@ -46,6 +48,14 @@ using invoke_result = std::result_of; template using invoke_result_t = typename invoke_result::type; +template +struct make_void +{ + typedef void type; +}; +template +using void_t = typename make_void::type; + #endif } // namespace cm diff --git a/Utilities/std/cmext/type_traits b/Utilities/std/cmext/type_traits new file mode 100644 index 0000000..da6550d --- /dev/null +++ b/Utilities/std/cmext/type_traits @@ -0,0 +1,68 @@ +// -*-c++-*- +// vim: set ft=cpp: + +/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying + file Copyright.txt or https://cmake.org/licensing for details. */ +#ifndef cmext_type_traits +#define cmext_type_traits + +#include + +namespace cm { + +// type traits for managed pointer types +template +struct is_unique_ptr : std::false_type +{ +}; +template +struct is_unique_ptr> : std::true_type +{ +}; + +// type traits for containers +template > +struct is_container : std::false_type +{ +}; +template +struct is_container< + T, + cm::void_t> + : std::true_type +{ +}; + +template > +struct is_associative_container : std::false_type +{ +}; +template +struct is_associative_container< + T, cm::void_t> + : cm::is_container +{ +}; + +template > +struct is_unordered_associative_container : std::false_type +{ +}; +template +struct is_unordered_associative_container< + T, + cm::void_t> : cm::is_container +{ +}; + +template +using is_sequence_container = + cm::bool_constant::value && + !cm::is_associative_container::value && + !cm::is_unordered_associative_container::value>; + +} // namespace cm + +#endif -- cgit v0.12 From b9a3f2e7e22e3757e863af102c20cc465e1cc02b Mon Sep 17 00:00:00 2001 From: Marc Chevrier Date: Sun, 12 Jan 2020 17:26:12 +0100 Subject: STL Support: enhance behavior of cm::dynamic_reference_cast Ensure cm::dynamic_reference_cast has same behavior as dynamic_cast on reference: raise std::bad_cast if dynamic_cast is not possible. --- Utilities/std/cmext/memory | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/Utilities/std/cmext/memory b/Utilities/std/cmext/memory index 540a3de..50e79df 100644 --- a/Utilities/std/cmext/memory +++ b/Utilities/std/cmext/memory @@ -6,6 +6,8 @@ #ifndef cmext_memory #define cmext_memory +#include + #include namespace cm { @@ -24,7 +26,13 @@ template = 0> T& dynamic_reference_cast(O& item) { - return *(dynamic_cast(item.get())); + auto p = dynamic_cast(item.get()); + + if (p == nullptr) { + throw std::bad_cast(); + } + + return *p; } } // namespace cm -- cgit v0.12