]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/boost/boost/histogram/detail/try_cast.hpp
import quincy beta 17.1.0
[ceph.git] / ceph / src / boost / boost / histogram / detail / try_cast.hpp
index 1e8a7d27015203341185863a65d48ae095a7fb1b..970e184551b8d89a149fbb44a47285e2ce35bf4f 100644 (file)
@@ -7,38 +7,50 @@
 #ifndef BOOST_HISTOGRAM_DETAIL_TRY_CAST_HPP
 #define BOOST_HISTOGRAM_DETAIL_TRY_CAST_HPP
 
-#include <boost/config.hpp>
-#include <boost/core/demangle.hpp>
-#include <boost/histogram/detail/type_name.hpp>
-#include <boost/mp11/integral.hpp>
+#include <boost/config.hpp> // BOOST_NORETURN
 #include <boost/throw_exception.hpp>
-#include <stdexcept>
-#include <string>
 #include <type_traits>
 
 namespace boost {
 namespace histogram {
 namespace detail {
-template <class T, class E, class U>
-BOOST_NORETURN T try_cast_impl(mp11::mp_int<0>, U&&) {
-  BOOST_THROW_EXCEPTION(E("cannot cast " + type_name<T>() + " to " + type_name<U>()));
+
+template <class T, class U>
+constexpr T* ptr_cast(U*) noexcept {
+  return nullptr;
+}
+
+template <class T>
+constexpr T* ptr_cast(T* p) noexcept {
+  return p;
+}
+
+template <class T>
+constexpr const T* ptr_cast(const T* p) noexcept {
+  return p;
 }
 
 template <class T, class E, class U>
-T try_cast_impl(mp11::mp_int<1>, U&& u) noexcept {
-  return static_cast<T>(u);
+BOOST_NORETURN T try_cast_impl(std::false_type, std::false_type, U&&) {
+  BOOST_THROW_EXCEPTION(E("type cast error"));
 }
 
+// converting cast
 template <class T, class E, class U>
-decltype(auto) try_cast_impl(mp11::mp_int<2>, U&& u) noexcept {
-  return std::forward<U>(u);
+T try_cast_impl(std::false_type, std::true_type, U&& u) noexcept {
+  return static_cast<T>(u); // cast to avoid warnings
+}
+
+// pass-through cast
+template <class T, class E>
+T&& try_cast_impl(std::true_type, std::true_type, T&& t) noexcept {
+  return std::forward<T>(t);
 }
 
 // cast fails at runtime with exception E instead of compile-time, T must be a value
 template <class T, class E, class U>
-decltype(auto) try_cast(U&& u) noexcept(std::is_convertible<U, T>::value) {
-  return try_cast_impl<T, E>(mp11::mp_int<(std::is_convertible<U, T>::value +
-                                           std::is_same<T, std::decay_t<U>>::value)>{},
+T try_cast(U&& u) noexcept(std::is_convertible<U, T>::value) {
+  return try_cast_impl<T, E>(std::is_same<U, T>{}, std::is_convertible<U, T>{},
                              std::forward<U>(u));
 }