mirror of
https://github.com/mpusz/mp-units.git
synced 2025-08-02 20:04:27 +02:00
clang-format applied to a downcasting header
This commit is contained in:
73
src/include/units/bits/external/downcasting.h
vendored
73
src/include/units/bits/external/downcasting.h
vendored
@@ -27,46 +27,47 @@
|
|||||||
|
|
||||||
namespace units {
|
namespace units {
|
||||||
|
|
||||||
template<typename BaseType>
|
template<typename BaseType>
|
||||||
struct downcast_base {
|
struct downcast_base {
|
||||||
using downcast_base_type = BaseType;
|
using downcast_base_type = BaseType;
|
||||||
friend auto downcast_guide(downcast_base);
|
friend auto downcast_guide(downcast_base);
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
concept Downcastable =
|
||||||
|
requires {
|
||||||
|
typename T::downcast_base_type;
|
||||||
|
} &&
|
||||||
|
std::derived_from<T, downcast_base<typename T::downcast_base_type>>;
|
||||||
|
|
||||||
|
template<typename Target, Downcastable T>
|
||||||
|
struct downcast_child : T {
|
||||||
|
friend auto downcast_guide(typename downcast_child::downcast_base /* base */) { return Target(); }
|
||||||
|
};
|
||||||
|
|
||||||
|
namespace detail {
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
concept has_downcast =
|
||||||
|
requires {
|
||||||
|
downcast_guide(std::declval<downcast_base<T>>());
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
concept Downcastable =
|
constexpr auto downcast_impl()
|
||||||
requires {
|
{
|
||||||
typename T::downcast_base_type;
|
if constexpr (has_downcast<T>)
|
||||||
} &&
|
return decltype(downcast_guide(std::declval<downcast_base<T>>()))();
|
||||||
std::derived_from<T, downcast_base<typename T::downcast_base_type>>;
|
else
|
||||||
|
return T();
|
||||||
|
}
|
||||||
|
|
||||||
template<typename Target, Downcastable T>
|
} // namespace detail
|
||||||
struct downcast_child : T {
|
|
||||||
friend auto downcast_guide(typename downcast_child::downcast_base) { return Target(); }
|
|
||||||
};
|
|
||||||
|
|
||||||
namespace detail {
|
template<Downcastable T>
|
||||||
|
using downcast = decltype(detail::downcast_impl<T>());
|
||||||
|
|
||||||
template<typename T>
|
template<Downcastable T>
|
||||||
concept has_downcast = requires {
|
using downcast_base_t = T::downcast_base_type;
|
||||||
downcast_guide(std::declval<downcast_base<T>>());
|
|
||||||
};
|
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
constexpr auto downcast_impl()
|
|
||||||
{
|
|
||||||
if constexpr(has_downcast<T>)
|
|
||||||
return decltype(downcast_guide(std::declval<downcast_base<T>>()))();
|
|
||||||
else
|
|
||||||
return T();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
template<Downcastable T>
|
|
||||||
using downcast = decltype(detail::downcast_impl<T>());
|
|
||||||
|
|
||||||
template<Downcastable T>
|
|
||||||
using downcast_base_t = T::downcast_base_type;
|
|
||||||
|
|
||||||
} // namespace units
|
} // namespace units
|
||||||
|
Reference in New Issue
Block a user