diff options
author | Marc Chevrier <marc.chevrier@gmail.com> | 2019-11-18 18:15:49 (GMT) |
---|---|---|
committer | Marc Chevrier <marc.chevrier@gmail.com> | 2019-11-27 15:03:04 (GMT) |
commit | fc3b4caa2e6a1970c75830445ef4aa7d03c5a533 (patch) | |
tree | 83e8eef4e853baab91218bf49120f04b342b8d96 /Utilities/std/cmext | |
parent | 7046a5219893436cbe19b6973ac13fb489199601 (diff) | |
download | CMake-fc3b4caa2e6a1970c75830445ef4aa7d03c5a533.zip CMake-fc3b4caa2e6a1970c75830445ef4aa7d03c5a533.tar.gz CMake-fc3b4caa2e6a1970c75830445ef4aa7d03c5a533.tar.bz2 |
Memory management: cast functions for managed pointers
Diffstat (limited to 'Utilities/std/cmext')
-rw-r--r-- | Utilities/std/cmext/memory | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/Utilities/std/cmext/memory b/Utilities/std/cmext/memory new file mode 100644 index 0000000..540a3de --- /dev/null +++ b/Utilities/std/cmext/memory @@ -0,0 +1,32 @@ +// -*-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_memory +#define cmext_memory + +#include <cm/type_traits> + +namespace cm { + +template <typename T, typename O, + cm::enable_if_t< + std::is_pointer<cm::invoke_result_t<decltype(&O::get), O>>::value, + int> = 0> +T& static_reference_cast(O& item) +{ + return *(static_cast<T*>(item.get())); +} +template <typename T, typename O, + cm::enable_if_t< + std::is_pointer<cm::invoke_result_t<decltype(&O::get), O>>::value, + int> = 0> +T& dynamic_reference_cast(O& item) +{ + return *(dynamic_cast<T*>(item.get())); +} + +} // namespace cm + +#endif |