Imported Upstream version 3.17.5
[platform/upstream/cmake.git] / Utilities / std / cmext / memory
1 // -*-c++-*-
2 // vim: set ft=cpp:
3
4 /* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
5    file Copyright.txt or https://cmake.org/licensing for details.  */
6 #ifndef cmext_memory
7 #define cmext_memory
8
9 #include <typeinfo>
10
11 #include <cm/type_traits>
12
13 namespace cm {
14
15 template <
16   typename T, typename O,
17   cm::enable_if_t<std::is_pointer<decltype(std::declval<O>().get())>::value,
18                   int> = 0>
19 T& static_reference_cast(O& item)
20 {
21   return *(static_cast<T*>(item.get()));
22 }
23
24 template <
25   typename T, typename O,
26   cm::enable_if_t<std::is_pointer<decltype(std::declval<O>().get())>::value,
27                   int> = 0>
28 T& dynamic_reference_cast(O& item)
29 {
30   auto p = dynamic_cast<T*>(item.get());
31
32   if (p == nullptr) {
33     throw std::bad_cast();
34   }
35
36   return *p;
37 }
38
39 } // namespace cm
40
41 #endif