AK: Introduce an as_if<OutputType>() cast

We currently have a fair amount of code of the form:

    if (is<Child>(parent)) {
        auto& child = static_cast<Child&>(parent);

        if (child.foo()) {
        }
    }

This new cast allows us to instead write code of the form:

    if (auto* child = as_if<Child>(parent); child && child->foo()) {
    }

N.B. The name "as_if" was chosen because we are considering renaming
verify_cast to "as".

Co-authored-by: Tim Ledbetter <tim.ledbetter@ladybird.org>
This commit is contained in:
Timothy Flynn 2025-01-20 11:17:23 -05:00 committed by Andreas Kling
parent ef793d8679
commit fc20e61e72
Notes: github-actions[bot] 2025-01-21 14:00:12 +00:00

View file

@ -51,9 +51,26 @@ ALWAYS_INLINE CopyConst<InputType, OutputType>& verify_cast(InputType& input)
return static_cast<CopyConst<InputType, OutputType>&>(input);
}
template<typename OutputType, typename InputType>
ALWAYS_INLINE CopyConst<InputType, OutputType>* as_if(InputType& input)
{
if (!is<OutputType>(input))
return nullptr;
return static_cast<CopyConst<InputType, OutputType>*>(&input);
}
template<typename OutputType, typename InputType>
ALWAYS_INLINE CopyConst<InputType, OutputType>* as_if(InputType* input)
{
if (!input)
return nullptr;
return as_if<OutputType>(*input);
}
}
#if USING_AK_GLOBALLY
using AK::as_if;
using AK::is;
using AK::verify_cast;
#endif