diff --git a/src/include/units/bits/external/downcasting.h b/src/include/units/bits/external/downcasting.h index 535147e9..469f1556 100644 --- a/src/include/units/bits/external/downcasting.h +++ b/src/include/units/bits/external/downcasting.h @@ -27,46 +27,47 @@ namespace units { - template - struct downcast_base { - using downcast_base_type = BaseType; - friend auto downcast_guide(downcast_base); +template +struct downcast_base { + using downcast_base_type = BaseType; + friend auto downcast_guide(downcast_base); +}; + +template +concept Downcastable = + requires { + typename T::downcast_base_type; + } && + std::derived_from>; + +template +struct downcast_child : T { + friend auto downcast_guide(typename downcast_child::downcast_base /* base */) { return Target(); } +}; + +namespace detail { + +template +concept has_downcast = + requires { + downcast_guide(std::declval>()); }; - template - concept Downcastable = - requires { - typename T::downcast_base_type; - } && - std::derived_from>; +template +constexpr auto downcast_impl() +{ + if constexpr (has_downcast) + return decltype(downcast_guide(std::declval>()))(); + else + return T(); +} - template - struct downcast_child : T { - friend auto downcast_guide(typename downcast_child::downcast_base) { return Target(); } - }; +} // namespace detail - namespace detail { +template +using downcast = decltype(detail::downcast_impl()); - template - concept has_downcast = requires { - downcast_guide(std::declval>()); - }; - - template - constexpr auto downcast_impl() - { - if constexpr(has_downcast) - return decltype(downcast_guide(std::declval>()))(); - else - return T(); - } - - } - - template - using downcast = decltype(detail::downcast_impl()); - - template - using downcast_base_t = T::downcast_base_type; +template +using downcast_base_t = T::downcast_base_type; } // namespace units