/* * Copyright (c) 2022, Andreas Kling * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include namespace Web::Layout { class AvailableSize { public: enum class Type { Definite, Indefinite, MinContent, MaxContent, }; static AvailableSize make_definite(CSSPixels); static AvailableSize make_indefinite(); static AvailableSize make_min_content(); static AvailableSize make_max_content(); bool is_definite() const { return m_type == Type::Definite; } bool is_indefinite() const { return m_type == Type::Indefinite; } bool is_min_content() const { return m_type == Type::MinContent; } bool is_max_content() const { return m_type == Type::MaxContent; } bool is_intrinsic_sizing_constraint() const { return is_min_content() || is_max_content(); } CSSPixels to_px() const { return m_value; } CSSPixels to_px_or_zero() const { if (!is_definite()) return 0.0f; return m_value; } DeprecatedString to_deprecated_string() const; bool operator==(AvailableSize const& other) const = default; private: AvailableSize(Type type, CSSPixels); Type m_type {}; CSSPixels m_value {}; }; class AvailableSpace { public: AvailableSpace(AvailableSize w, AvailableSize h) : width(move(w)) , height(move(h)) { } bool operator==(AvailableSpace const& other) const = default; AvailableSize width; AvailableSize height; DeprecatedString to_deprecated_string() const; }; } template<> struct AK::Formatter : Formatter { ErrorOr format(FormatBuilder& builder, Web::Layout::AvailableSize const& available_size) { return Formatter::format(builder, available_size.to_deprecated_string()); } }; template<> struct AK::Formatter : Formatter { ErrorOr format(FormatBuilder& builder, Web::Layout::AvailableSpace const& available_space) { return Formatter::format(builder, available_space.to_deprecated_string()); } };