From 603df37a88a17a8807ab53466f25abf63d6032d4 Mon Sep 17 00:00:00 2001 From: Andrew Kaster Date: Wed, 19 Mar 2025 15:16:11 -0600 Subject: [PATCH] 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. --- Libraries/LibWeb/CSS/CalculatedOr.h | 97 ++++++++++++++--------------- 1 file changed, 46 insertions(+), 51 deletions(-) diff --git a/Libraries/LibWeb/CSS/CalculatedOr.h b/Libraries/LibWeb/CSS/CalculatedOr.h index ee6d564fe4a..1d2f340e8d4 100644 --- a/Libraries/LibWeb/CSS/CalculatedOr.h +++ b/Libraries/LibWeb/CSS/CalculatedOr.h @@ -18,7 +18,7 @@ namespace Web::CSS { -template +template class CalculatedOr { public: CalculatedOr(T t) @@ -31,8 +31,6 @@ public: { } - virtual ~CalculatedOr() = default; - bool is_calculated() const { return m_value.template has>(); } T const& value() const @@ -80,7 +78,7 @@ public: }); } - bool operator==(CalculatedOr const& other) const + bool operator==(CalculatedOr const& other) const { if (is_calculated() || other.is_calculated()) return false; @@ -88,92 +86,89 @@ public: } protected: - virtual Optional resolve_calculated(NonnullRefPtr const&, CalculationResolutionContext const&) const = 0; - virtual NonnullRefPtr create_style_value() const = 0; + Optional resolve_calculated(NonnullRefPtr const& calculated, CalculationResolutionContext const& context) const + { + return static_cast(this)->resolve_calculated(calculated, context); + } + NonnullRefPtr create_style_value() const + { + return static_cast(this)->create_style_value(); + } private: Variant> m_value; }; -class AngleOrCalculated : public CalculatedOr { +class AngleOrCalculated : public CalculatedOr { public: - using CalculatedOr::CalculatedOr; + using CalculatedOr::CalculatedOr; -private: - virtual Optional resolve_calculated(NonnullRefPtr const&, CalculationResolutionContext const&) const override; - virtual NonnullRefPtr create_style_value() const override; + Optional resolve_calculated(NonnullRefPtr const&, CalculationResolutionContext const&) const; + NonnullRefPtr create_style_value() const; }; -class FlexOrCalculated : public CalculatedOr { +class FlexOrCalculated : public CalculatedOr { public: - using CalculatedOr::CalculatedOr; + using CalculatedOr::CalculatedOr; -private: - virtual Optional resolve_calculated(NonnullRefPtr const&, CalculationResolutionContext const&) const override; - virtual NonnullRefPtr create_style_value() const override; + Optional resolve_calculated(NonnullRefPtr const&, CalculationResolutionContext const&) const; + NonnullRefPtr create_style_value() const; }; -class FrequencyOrCalculated : public CalculatedOr { +class FrequencyOrCalculated : public CalculatedOr { public: - using CalculatedOr::CalculatedOr; + using CalculatedOr::CalculatedOr; -private: - virtual Optional resolve_calculated(NonnullRefPtr const&, CalculationResolutionContext const&) const override; - virtual NonnullRefPtr create_style_value() const override; + Optional resolve_calculated(NonnullRefPtr const&, CalculationResolutionContext const&) const; + NonnullRefPtr create_style_value() const; }; -class IntegerOrCalculated : public CalculatedOr { +class IntegerOrCalculated : public CalculatedOr { public: - using CalculatedOr::CalculatedOr; + using CalculatedOr::CalculatedOr; -private: - virtual Optional resolve_calculated(NonnullRefPtr const&, CalculationResolutionContext const&) const override; - virtual NonnullRefPtr create_style_value() const override; + Optional resolve_calculated(NonnullRefPtr const&, CalculationResolutionContext const&) const; + NonnullRefPtr create_style_value() const; }; -class LengthOrCalculated : public CalculatedOr { +class LengthOrCalculated : public CalculatedOr { public: - using CalculatedOr::CalculatedOr; + using CalculatedOr::CalculatedOr; -private: - virtual Optional resolve_calculated(NonnullRefPtr const&, CalculationResolutionContext const&) const override; - virtual NonnullRefPtr create_style_value() const override; + Optional resolve_calculated(NonnullRefPtr const&, CalculationResolutionContext const&) const; + NonnullRefPtr create_style_value() const; }; -class NumberOrCalculated : public CalculatedOr { +class NumberOrCalculated : public CalculatedOr { public: - using CalculatedOr::CalculatedOr; + using CalculatedOr::CalculatedOr; -private: - virtual Optional resolve_calculated(NonnullRefPtr const&, CalculationResolutionContext const&) const override; - virtual NonnullRefPtr create_style_value() const override; + Optional resolve_calculated(NonnullRefPtr const&, CalculationResolutionContext const&) const; + NonnullRefPtr create_style_value() const; }; -class PercentageOrCalculated : public CalculatedOr { +class PercentageOrCalculated : public CalculatedOr { public: - using CalculatedOr::CalculatedOr; + using CalculatedOr::CalculatedOr; -private: - virtual Optional resolve_calculated(NonnullRefPtr const&, CalculationResolutionContext const&) const override; - virtual NonnullRefPtr create_style_value() const override; + Optional resolve_calculated(NonnullRefPtr const&, CalculationResolutionContext const&) const; + NonnullRefPtr create_style_value() const; }; -class ResolutionOrCalculated : public CalculatedOr { +class ResolutionOrCalculated : public CalculatedOr { public: - using CalculatedOr::CalculatedOr; + using CalculatedOr::CalculatedOr; -private: - virtual Optional resolve_calculated(NonnullRefPtr const&, CalculationResolutionContext const&) const override; - virtual NonnullRefPtr create_style_value() const override; + Optional resolve_calculated(NonnullRefPtr const&, CalculationResolutionContext const&) const; + NonnullRefPtr create_style_value() const; }; -class TimeOrCalculated : public CalculatedOr