LibWeb: Devirtualize CSS::CalculatedOr

This fixes a compile warning on GCC 13.3.0 where it warns about the
use of Variant within this class with no key function. Since the class
was almost a CRTP base class, make it a real one.
This commit is contained in:
Andrew Kaster 2025-03-19 15:16:11 -06:00 committed by Andrew Kaster
commit 603df37a88
Notes: github-actions[bot] 2025-03-20 17:37:08 +00:00

View file

@ -18,7 +18,7 @@
namespace Web::CSS { namespace Web::CSS {
template<typename T> template<typename Self, typename T>
class CalculatedOr { class CalculatedOr {
public: public:
CalculatedOr(T t) CalculatedOr(T t)
@ -31,8 +31,6 @@ public:
{ {
} }
virtual ~CalculatedOr() = default;
bool is_calculated() const { return m_value.template has<NonnullRefPtr<CalculatedStyleValue>>(); } bool is_calculated() const { return m_value.template has<NonnullRefPtr<CalculatedStyleValue>>(); }
T const& value() const T const& value() const
@ -80,7 +78,7 @@ public:
}); });
} }
bool operator==(CalculatedOr<T> const& other) const bool operator==(CalculatedOr<Self, T> const& other) const
{ {
if (is_calculated() || other.is_calculated()) if (is_calculated() || other.is_calculated())
return false; return false;
@ -88,92 +86,89 @@ public:
} }
protected: protected:
virtual Optional<T> resolve_calculated(NonnullRefPtr<CalculatedStyleValue> const&, CalculationResolutionContext const&) const = 0; Optional<T> resolve_calculated(NonnullRefPtr<CalculatedStyleValue> const& calculated, CalculationResolutionContext const& context) const
virtual NonnullRefPtr<CSSStyleValue> create_style_value() const = 0; {
return static_cast<Self const*>(this)->resolve_calculated(calculated, context);
}
NonnullRefPtr<CSSStyleValue> create_style_value() const
{
return static_cast<Self const*>(this)->create_style_value();
}
private: private:
Variant<T, NonnullRefPtr<CalculatedStyleValue>> m_value; Variant<T, NonnullRefPtr<CalculatedStyleValue>> m_value;
}; };
class AngleOrCalculated : public CalculatedOr<Angle> { class AngleOrCalculated : public CalculatedOr<AngleOrCalculated, Angle> {
public: public:
using CalculatedOr<Angle>::CalculatedOr; using CalculatedOr::CalculatedOr;
private: Optional<Angle> resolve_calculated(NonnullRefPtr<CalculatedStyleValue> const&, CalculationResolutionContext const&) const;
virtual Optional<Angle> resolve_calculated(NonnullRefPtr<CalculatedStyleValue> const&, CalculationResolutionContext const&) const override; NonnullRefPtr<CSSStyleValue> create_style_value() const;
virtual NonnullRefPtr<CSSStyleValue> create_style_value() const override;
}; };
class FlexOrCalculated : public CalculatedOr<Flex> { class FlexOrCalculated : public CalculatedOr<FlexOrCalculated, Flex> {
public: public:
using CalculatedOr<Flex>::CalculatedOr; using CalculatedOr::CalculatedOr;
private: Optional<Flex> resolve_calculated(NonnullRefPtr<CalculatedStyleValue> const&, CalculationResolutionContext const&) const;
virtual Optional<Flex> resolve_calculated(NonnullRefPtr<CalculatedStyleValue> const&, CalculationResolutionContext const&) const override; NonnullRefPtr<CSSStyleValue> create_style_value() const;
virtual NonnullRefPtr<CSSStyleValue> create_style_value() const override;
}; };
class FrequencyOrCalculated : public CalculatedOr<Frequency> { class FrequencyOrCalculated : public CalculatedOr<FrequencyOrCalculated, Frequency> {
public: public:
using CalculatedOr<Frequency>::CalculatedOr; using CalculatedOr::CalculatedOr;
private: Optional<Frequency> resolve_calculated(NonnullRefPtr<CalculatedStyleValue> const&, CalculationResolutionContext const&) const;
virtual Optional<Frequency> resolve_calculated(NonnullRefPtr<CalculatedStyleValue> const&, CalculationResolutionContext const&) const override; NonnullRefPtr<CSSStyleValue> create_style_value() const;
virtual NonnullRefPtr<CSSStyleValue> create_style_value() const override;
}; };
class IntegerOrCalculated : public CalculatedOr<i64> { class IntegerOrCalculated : public CalculatedOr<IntegerOrCalculated, i64> {
public: public:
using CalculatedOr<i64>::CalculatedOr; using CalculatedOr::CalculatedOr;
private: Optional<i64> resolve_calculated(NonnullRefPtr<CalculatedStyleValue> const&, CalculationResolutionContext const&) const;
virtual Optional<i64> resolve_calculated(NonnullRefPtr<CalculatedStyleValue> const&, CalculationResolutionContext const&) const override; NonnullRefPtr<CSSStyleValue> create_style_value() const;
virtual NonnullRefPtr<CSSStyleValue> create_style_value() const override;
}; };
class LengthOrCalculated : public CalculatedOr<Length> { class LengthOrCalculated : public CalculatedOr<LengthOrCalculated, Length> {
public: public:
using CalculatedOr<Length>::CalculatedOr; using CalculatedOr::CalculatedOr;
private: Optional<Length> resolve_calculated(NonnullRefPtr<CalculatedStyleValue> const&, CalculationResolutionContext const&) const;
virtual Optional<Length> resolve_calculated(NonnullRefPtr<CalculatedStyleValue> const&, CalculationResolutionContext const&) const override; NonnullRefPtr<CSSStyleValue> create_style_value() const;
virtual NonnullRefPtr<CSSStyleValue> create_style_value() const override;
}; };
class NumberOrCalculated : public CalculatedOr<double> { class NumberOrCalculated : public CalculatedOr<NumberOrCalculated, double> {
public: public:
using CalculatedOr<double>::CalculatedOr; using CalculatedOr::CalculatedOr;
private: Optional<double> resolve_calculated(NonnullRefPtr<CalculatedStyleValue> const&, CalculationResolutionContext const&) const;
virtual Optional<double> resolve_calculated(NonnullRefPtr<CalculatedStyleValue> const&, CalculationResolutionContext const&) const override; NonnullRefPtr<CSSStyleValue> create_style_value() const;
virtual NonnullRefPtr<CSSStyleValue> create_style_value() const override;
}; };
class PercentageOrCalculated : public CalculatedOr<Percentage> { class PercentageOrCalculated : public CalculatedOr<PercentageOrCalculated, Percentage> {
public: public:
using CalculatedOr<Percentage>::CalculatedOr; using CalculatedOr::CalculatedOr;
private: Optional<Percentage> resolve_calculated(NonnullRefPtr<CalculatedStyleValue> const&, CalculationResolutionContext const&) const;
virtual Optional<Percentage> resolve_calculated(NonnullRefPtr<CalculatedStyleValue> const&, CalculationResolutionContext const&) const override; NonnullRefPtr<CSSStyleValue> create_style_value() const;
virtual NonnullRefPtr<CSSStyleValue> create_style_value() const override;
}; };
class ResolutionOrCalculated : public CalculatedOr<Resolution> { class ResolutionOrCalculated : public CalculatedOr<ResolutionOrCalculated, Resolution> {
public: public:
using CalculatedOr<Resolution>::CalculatedOr; using CalculatedOr::CalculatedOr;
private: Optional<Resolution> resolve_calculated(NonnullRefPtr<CalculatedStyleValue> const&, CalculationResolutionContext const&) const;
virtual Optional<Resolution> resolve_calculated(NonnullRefPtr<CalculatedStyleValue> const&, CalculationResolutionContext const&) const override; NonnullRefPtr<CSSStyleValue> create_style_value() const;
virtual NonnullRefPtr<CSSStyleValue> create_style_value() const override;
}; };
class TimeOrCalculated : public CalculatedOr<Time> { class TimeOrCalculated : public CalculatedOr<TimeOrCalculated, Time> {
public: public:
using CalculatedOr<Time>::CalculatedOr; using CalculatedOr::CalculatedOr;
private: Optional<Time> resolve_calculated(NonnullRefPtr<CalculatedStyleValue> const&, CalculationResolutionContext const&) const;
virtual Optional<Time> resolve_calculated(NonnullRefPtr<CalculatedStyleValue> const&, CalculationResolutionContext const&) const override; NonnullRefPtr<CSSStyleValue> create_style_value() const;
virtual NonnullRefPtr<CSSStyleValue> create_style_value() const override;
}; };
} }