| // -*-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. */ | |
| #pragma once | |
| #include <typeinfo> | |
| #include <cm/type_traits> | |
| namespace cm { | |
| template < | |
| typename T, typename O, | |
| cm::enable_if_t<std::is_pointer<decltype(std::declval<O>().get())>::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<decltype(std::declval<O>().get())>::value, | |
| int> = 0> | |
| T& dynamic_reference_cast(O& item) | |
| { | |
| auto p = dynamic_cast<T*>(item.get()); | |
| if (p == nullptr) { | |
| throw std::bad_cast(); | |
| } | |
| return *p; | |
| } | |
| } // namespace cm |