31namespace iceberg::internal {
33template <
typename OutputType,
typename InputType>
34inline OutputType checked_cast(InputType&& value) {
36 std::is_class_v<std::remove_pointer_t<std::remove_reference_t<InputType>>>,
37 "checked_cast input type must be a class");
39 std::is_class_v<std::remove_pointer_t<std::remove_reference_t<OutputType>>>,
40 "checked_cast output type must be a class");
42 return static_cast<OutputType
>(value);
44 return dynamic_cast<OutputType
>(value);
48template <
class T,
class U>
49std::shared_ptr<T> checked_pointer_cast(std::shared_ptr<U> r)
noexcept {
51 return std::static_pointer_cast<T>(std::move(r));
53 return std::dynamic_pointer_cast<T>(std::move(r));
57template <
class T,
class U>
58std::unique_ptr<T> checked_pointer_cast(std::unique_ptr<U> r)
noexcept {
60 return std::unique_ptr<T>(
static_cast<T*
>(r.release()));
62 return std::unique_ptr<T>(
dynamic_cast<T*
>(r.release()));