26 #ifndef TESSERACT_COMMON_ANY_POLY_H
27 #define TESSERACT_COMMON_ANY_POLY_H
30 #include <boost/serialization/access.hpp>
31 #include <boost/serialization/export.hpp>
32 #include <boost/stacktrace.hpp>
33 #include <boost/core/demangle.hpp>
38 #include <unordered_map>
52 virtual std::type_index
getType()
const;
58 virtual std::unique_ptr<AnyInterface>
clone()
const = 0;
75 template <
class Archive>
76 void serialize(Archive& ar,
const unsigned int version);
87 std::type_index
getType() const override final {
return typeid(T); }
89 std::unique_ptr<AnyInterface>
clone() const override final {
return std::make_unique<AnyWrapper<T>>(
value); }
93 const auto* derived_other =
dynamic_cast<const AnyWrapper<T>*
>(&other);
94 if (derived_other ==
nullptr)
97 return (
value == derived_other->value);
105 template <
class Archive>
109 ar& boost::serialization::make_nvp(
"value",
value);
125 template <
typename T,
126 typename std::enable_if_t<!std::is_base_of_v<AnyInterface, T> && !std::is_same_v<std::decay_t<T>,
AnyPoly>,
132 template <
typename T,
133 typename std::enable_if_t<!std::is_base_of_v<AnyInterface, T> && !std::is_same_v<std::decay_t<T>,
AnyPoly>,
137 impl_ = std::make_unique<AnyWrapper<std::decay_t<T>>>(std::forward<T>(value));
142 template <
typename T,
143 typename std::enable_if_t<!std::is_base_of_v<AnyInterface, T> && !std::is_same_v<std::decay_t<T>,
AnyPoly>,
150 template <
typename T,
151 typename std::enable_if_t<!std::is_base_of_v<AnyInterface, T> && !std::is_same_v<std::decay_t<T>,
AnyPoly>,
155 impl_ = std::make_unique<AnyWrapper<T>>(value);
163 std::type_index
getType()
const;
180 template <
typename T,
typename std::enable_if_t<std::is_base_of_v<AnyInterface, T>,
bool> = true>
184 throw std::runtime_error(
"AnyPoly, tried to cast '" + boost::core::demangle(
getType().name()) +
"' to '" +
185 boost::core::demangle(
typeid(T).name()) +
"'\nBacktrace:\n" +
186 boost::stacktrace::to_string(boost::stacktrace::stacktrace()) +
"\n");
188 return *
dynamic_cast<T*
>(
impl_.get());
191 template <
typename T,
typename std::enable_if_t<!std::is_base_of_v<AnyInterface, T>,
bool> = true>
195 throw std::runtime_error(
"AnyPoly, tried to cast '" + boost::core::demangle(
getType().name()) +
"' to '" +
196 boost::core::demangle(
typeid(T).name()) +
"'\nBacktrace:\n" +
197 boost::stacktrace::to_string(boost::stacktrace::stacktrace()) +
"\n");
202 template <
typename T,
typename std::enable_if_t<std::is_base_of_v<AnyInterface, T>,
bool> = true>
206 throw std::runtime_error(
"AnyPoly, tried to cast '" + boost::core::demangle(
getType().name()) +
"' to '" +
207 boost::core::demangle(
typeid(T).name()) +
"'\nBacktrace:\n" +
208 boost::stacktrace::to_string(boost::stacktrace::stacktrace()) +
"\n");
210 return *
dynamic_cast<const T*
>(
impl_.get());
213 template <
typename T,
typename std::enable_if_t<!std::is_base_of_v<AnyInterface, T>,
bool> = true>
217 throw std::runtime_error(
"AnyPoly, tried to cast '" + boost::core::demangle(
getType().name()) +
"' to '" +
218 boost::core::demangle(
typeid(T).name()) +
"'\nBacktrace:\n" +
219 boost::stacktrace::to_string(boost::stacktrace::stacktrace()) +
"\n");
229 std::unique_ptr<AnyInterface>
impl_;
233 template <
class Archive>
234 void serialize(Archive& ar,
const unsigned int version);
303 #endif // TESSERACT_COMMON_ANY_POLY_H