mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-08-17 09:20:28 +03:00
These instances were detected by searching for files that include AK/StdLibExtras.h, but don't match the regex: \\b(abs|AK_REPLACED_STD_NAMESPACE|array_size|ceil_div|clamp|exchange|for ward|is_constant_evaluated|is_power_of_two|max|min|mix|move|_RawPtr|RawP tr|round_up_to_power_of_two|swap|to_underlying)\\b (Without the linebreaks.) This regex is pessimistic, so there might be more files that don't actually use any "extra stdlib" functions. In theory, one might use LibCPP to detect things like this automatically, but let's do this one step after another.
58 lines
1.4 KiB
C++
58 lines
1.4 KiB
C++
/*
|
|
* Copyright (c) 2020-2021, Andreas Kling <kling@serenityos.org>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <AK/Assertions.h>
|
|
#include <AK/Forward.h>
|
|
#include <AK/Platform.h>
|
|
|
|
namespace AK {
|
|
|
|
template<typename OutputType, typename InputType>
|
|
ALWAYS_INLINE bool is(InputType& input)
|
|
{
|
|
if constexpr (requires { input.template fast_is<OutputType>(); }) {
|
|
return input.template fast_is<OutputType>();
|
|
}
|
|
return dynamic_cast<CopyConst<InputType, OutputType>*>(&input);
|
|
}
|
|
|
|
template<typename OutputType, typename InputType>
|
|
ALWAYS_INLINE bool is(InputType* input)
|
|
{
|
|
return input && is<OutputType>(*input);
|
|
}
|
|
|
|
template<typename OutputType, typename InputType>
|
|
ALWAYS_INLINE bool is(NonnullRefPtr<InputType> const& input)
|
|
{
|
|
return is<OutputType>(*input);
|
|
}
|
|
|
|
template<typename OutputType, typename InputType>
|
|
ALWAYS_INLINE CopyConst<InputType, OutputType>* verify_cast(InputType* input)
|
|
{
|
|
static_assert(IsBaseOf<InputType, OutputType>);
|
|
VERIFY(!input || is<OutputType>(*input));
|
|
return static_cast<CopyConst<InputType, OutputType>*>(input);
|
|
}
|
|
|
|
template<typename OutputType, typename InputType>
|
|
ALWAYS_INLINE CopyConst<InputType, OutputType>& verify_cast(InputType& input)
|
|
{
|
|
static_assert(IsBaseOf<InputType, OutputType>);
|
|
VERIFY(is<OutputType>(input));
|
|
return static_cast<CopyConst<InputType, OutputType>&>(input);
|
|
}
|
|
|
|
}
|
|
|
|
#if USING_AK_GLOBALLY
|
|
using AK::is;
|
|
using AK::verify_cast;
|
|
#endif
|