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:
parent
7c3b6b10e4
commit
865f524d5b
116 changed files with 5 additions and 494 deletions
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue