HikoGUI
A low latency retained GUI
Loading...
Searching...
No Matches
box_constraints.hpp
1// Copyright Take Vos 2022.
2// Distributed under the Boost Software License, Version 1.0.
3// (See accompanying file LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt)
4
5#pragma once
6
7#include "../geometry/module.hpp"
8#include "../utility/module.hpp"
9#include <cstdint>
10#include <limits>
11#include <concepts>
12
13namespace hi { inline namespace v1 {
14
23 extent2 minimum = {};
24 extent2 preferred = {};
25 extent2 maximum = {};
27 vector2 priority = {};
28 hi::alignment alignment = hi::alignment{};
29
30 constexpr box_constraints() noexcept = default;
31 constexpr box_constraints(box_constraints const&) noexcept = default;
32 constexpr box_constraints(box_constraints&&) noexcept = default;
33 constexpr box_constraints& operator=(box_constraints const&) noexcept = default;
34 constexpr box_constraints& operator=(box_constraints&&) noexcept = default;
35 [[nodiscard]] constexpr friend bool operator==(box_constraints const&, box_constraints const&) noexcept = default;
36
37 constexpr box_constraints(
38 extent2 minimum,
39 extent2 preferred,
40 extent2 maximum,
41 hi::alignment alignment = hi::alignment{},
43 vector2 priority = hi::vector2{}) noexcept :
44 minimum(minimum), preferred(preferred), maximum(maximum), margins(margins), priority(priority), alignment(alignment)
45 {
46 hi_axiom(holds_invariant());
47 }
48
49 [[nodiscard]] constexpr box_constraints constrain(extent2 new_minimum, extent2 new_maximum) const noexcept
50 {
51 hi_assert(new_minimum <= new_maximum);
52
53 auto r = *this;
54
55 inplace_max(r.minimum, new_minimum);
56 inplace_min(r.maximum, new_maximum);
57
58 inplace_max(r.preferred, r.minimum);
59 inplace_max(r.maximum, r.preferred);
60 hi_axiom(r.holds_invariant());
61 return r;
62 }
63
64 constexpr box_constraints& operator+=(extent2 const& rhs) noexcept
65 {
66 minimum.width() += rhs.width();
67 preferred.width() += rhs.width();
68 maximum.width() += rhs.width();
69 minimum.height() += rhs.height();
70 preferred.height() += rhs.height();
71 maximum.height() += rhs.height();
72
73 hi_axiom(holds_invariant());
74 return *this;
75 }
76
77 [[nodiscard]] constexpr box_constraints operator+(extent2 const& rhs) const noexcept
78 {
79 auto r = *this;
80 r += rhs;
81 return r;
82 }
83
84 [[nodiscard]] constexpr bool holds_invariant() const noexcept
85 {
86 if (alignment == horizontal_alignment::flush or alignment == horizontal_alignment::justified) {
87 return false;
88 }
89 if (not(is_integral_value(minimum.width()) and is_integral_value(minimum.height()) and
90 is_integral_value(preferred.width()) and is_integral_value(preferred.height()) and
91 is_integral_value(maximum.width()) and is_integral_value(maximum.height()))) {
92 return false;
93 }
94 if (minimum > preferred or preferred > maximum) {
95 return false;
96 }
97 return true;
98 }
99
100 [[nodiscard]] friend constexpr box_constraints max(box_constraints const& lhs, extent2 const& rhs) noexcept
101 {
102 auto r = lhs;
103 inplace_max(r.minimum, rhs);
104 inplace_max(r.preferred, rhs);
105 inplace_max(r.maximum, rhs);
106
107 hi_axiom(r.holds_invariant());
108 return r;
109 }
110
118 [[nodiscard]] friend constexpr box_constraints max(box_constraints const& lhs, box_constraints const& rhs) noexcept
119 {
120 auto r = lhs;
121 inplace_max(r.minimum, rhs.minimum);
122 inplace_max(r.preferred, rhs.preferred);
123 inplace_max(r.maximum, rhs.maximum);
124 inplace_max(r.margins, rhs.margins);
125 inplace_max(r.priority, rhs.priority);
126
127 hi_axiom(r.holds_invariant());
128 return r;
129 }
130
131 template<std::convertible_to<box_constraints>... Args>
132 [[nodiscard]] friend constexpr box_constraints
133 max(box_constraints const& first, box_constraints const& second, box_constraints const& third, Args const&...args) noexcept
134 {
135 return max(first, max(second, third, args...));
136 }
137};
138
139}} // namespace hi::v1
#define hi_assert(expression,...)
Assert if expression is true.
Definition assert.hpp:199
#define hi_axiom(expression,...)
Specify an axiom; an expression that is true.
Definition assert.hpp:253
DOXYGEN BUG.
Definition algorithm.hpp:13
geometry/margins.hpp
Definition cache.hpp:11
constexpr bool is_integral_value(T const &rhs) noexcept
Check if a value is integral.
Definition value_traits.hpp:18
constexpr value_type & width() noexcept
Access the x-as-width element from the extent.
Definition extent.hpp:166
constexpr value_type & height() noexcept
Access the y-as-height element from the extent.
Definition extent.hpp:177
2D constraints.
Definition box_constraints.hpp:22
friend constexpr box_constraints max(box_constraints const &lhs, box_constraints const &rhs) noexcept
Makes a constraint that encompasses both given constraints.
Definition box_constraints.hpp:118