1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 19:57:45 +00:00

AK+LibGUI+LibWeb: Remove AK::TypeTraits in favor of RTTI-based helpers

Now that we have RTTI in userspace, we can do away with all this manual
hackery and use dynamic_cast.

We keep the is<T> and downcast<T> helpers since they still provide good
readability improvements. Note that unlike dynamic_cast<T>, downcast<T>
does not fail in a recoverable way, but will assert if the object being
casted is not a T.
This commit is contained in:
Andreas Kling 2021-01-01 15:33:30 +01:00
parent 7c3b6b10e4
commit 865f524d5b
116 changed files with 5 additions and 494 deletions

View file

@ -30,30 +30,16 @@
namespace AK {
template<typename OutputType, typename InputType, bool is_base_type = IsBaseOf<OutputType, InputType>::value>
struct TypeTraits {
static bool has_type(InputType&)
{
static_assert(IsVoid<OutputType>::value, "No TypeTraits for this type");
return false;
}
};
template<typename OutputType, typename InputType>
struct TypeTraits<OutputType, InputType, true> {
static bool has_type(InputType&) { return true; }
};
inline bool is(InputType& input)
{
return dynamic_cast<CopyConst<InputType, OutputType>*>(&input);
}
template<typename OutputType, typename InputType>
inline bool is(InputType* input)
{
return input && TypeTraits<const OutputType, const InputType>::has_type(*input);
}
template<typename OutputType, typename InputType>
inline bool is(InputType& input)
{
return TypeTraits<const OutputType, const InputType>::has_type(input);
return input && is<OutputType>(*input);
}
template<typename OutputType, typename InputType>
@ -72,22 +58,7 @@ inline CopyConst<InputType, OutputType>& downcast(InputType& input)
return static_cast<CopyConst<InputType, OutputType>&>(input);
}
#define AK_BEGIN_TYPE_TRAITS(ClassName) \
namespace AK { \
template<typename InputType> \
class TypeTraits<const ClassName, InputType, false> { \
public: \
static bool has_type(InputType& input) { return is_type(input); } \
\
private:
#define AK_END_TYPE_TRAITS() \
} \
; \
}
}
using AK::downcast;
using AK::is;
using AK::TypeTraits;