header_utils
Loading...
Searching...
No Matches
align.h
1
4
5#pragma once
6
7#define GHPL_HAS_ALIGN
8
9namespace ghassanpl
10{
13
16
19 {
20 left = 0,
21 center = 1,
22 centre = 1,
23 right = 2,
24 justify = 3,
25 };
26
28 enum class vertical_align
29 {
30 top = 0,
31 middle = 4,
32 center = 4,
33 centre = 4,
34 bottom = 8,
35 justify = 12,
36 };
37
38 enum class align;
39
44
46 enum class align
47 {
51 top_center = int(horizontal_align::center | vertical_align::top), top_centre = top_center, center_top = top_center, centre_top = top_center,
54
61
68 };
69
76
81
82 constexpr align& operator|=(align& first, horizontal_align second) { return first = align(int(first) | int(second)); }
83 constexpr align& operator|=(align& first, vertical_align second) { return first = align(int(first) | int(second)); }
84
85 constexpr inline const char* horizontal_align_names[] = { "left", "center", "right", "justify_horizontal", "center", "", "", "", "right", "", "", "", "justify_horizontal" };
86 constexpr inline const char* vertical_align_names[] = { "top", "middle", "bottom", "justify_vertical", "middle", "", "", "", "bottom", "", "", "", "justify_vertical" };
87 constexpr inline const char* align_names[] = { "top_left", "top_center", "top_right", "", "middle_left", "middle_center", "middle_right", "", "bottom_left", "bottom_center", "bottom_right", "", "" };
88 constexpr inline const char* align_names_natural[] = { "top left", "center top", "top right", "", "middle left", "center", "middle right", "", "bottom left", "center bottom", "bottom right", "", "" };
89
93 constexpr const char* to_name(horizontal_align h) { return horizontal_align_names[int(h)]; }
97 constexpr const char* to_name(vertical_align v) { return vertical_align_names[int(v)]; }
101 constexpr const char* to_name(align a) { return align_names[int(a)]; }
105 constexpr const char* to_natural_name(align a) { return align_names_natural[int(a)]; }
106
107 namespace detail
108 {
109 static constexpr inline auto horizontal_align_mask = int(horizontal_align::left) | int(horizontal_align::center) | int(horizontal_align::right);
110 static constexpr inline auto vertical_align_mask = int(vertical_align::top) | int(vertical_align::middle) | int(vertical_align::bottom);
111 }
112
114 constexpr vertical_align to_vertical(horizontal_align alignment) { return vertical_align{ (int(alignment) & detail::horizontal_align_mask) << 2 }; }
118 constexpr horizontal_align to_horizontal(vertical_align alignment) { return horizontal_align{ (int(alignment) & detail::vertical_align_mask) >> 2 }; }
121
123 constexpr vertical_align vertical_from(align alignment) { return vertical_align{ (int(alignment) & detail::vertical_align_mask) }; }
125 constexpr horizontal_align horizontal_from(align alignment) { return horizontal_align{ (int(alignment) & detail::horizontal_align_mask) }; }
126
128 constexpr align only_vertical(align alignment) { return align{ (int(alignment) & detail::vertical_align_mask) }; }
130 constexpr align only_horizontal(align alignment) { return align{ (int(alignment) & detail::horizontal_align_mask) }; }
131
134 constexpr vertical_align to_opposite(vertical_align alignment) { return vertical_align{ ((2 - (int(alignment) >> 2)) & detail::horizontal_align_mask) << 2 }; }
135
138 constexpr horizontal_align to_opposite(horizontal_align alignment) { return horizontal_align{ (2 - int(alignment)) & detail::horizontal_align_mask }; }
139
143
161
165
166 constexpr align flipped_horizontally(align alignment) { return vertical_from(alignment) | to_opposite(horizontal_from(alignment)); }
167 constexpr align flipped_vertically(align alignment) { return to_opposite(vertical_from(alignment)) | horizontal_from(alignment); }
168
169 template <typename T>
170 constexpr T aligned(const T& width, const T& max_width, horizontal_align align) {
171 switch (align)
172 {
173 case horizontal_align::center: return (max_width / 2 - width / 2);
174 case horizontal_align::right: return (max_width - width);
175 default: return 0;
176 }
177 }
178
179 template <typename T>
180 constexpr T aligned(const T& width, const T& max_width, vertical_align align) {
181 switch (align)
182 {
183 case vertical_align::middle: return (max_width / 2 - width / 2);
184 case vertical_align::bottom: return (max_width - width);
185 default: return 0;
186 }
187 }
188
190
191 /*
192 template <typename T>
193 struct HorizontalMargins
194 {
195 T Left = {};
196 T Right = {};
197
198 constexpr HorizontalMargins(T left, T right) : Left(left), Right(right) {}
199
200 constexpr HorizontalMargins(T container_width, T width, Alignment align)
201 {
202 switch (GetHorizontal(align))
203 {
204 case Alignment::Right:
205 Left = container_width - width;
206 break;
207 case Alignment::Center:
208 Left = container_width / 2 - detail::DivideRoundDown(width, 2);
209 Right = container_width / 2 + detail::DivideRoundUp(width, 2);
210 break;
211 case Alignment::Left:
212 default:
213 Left = container_width - width;
214 break;
215 }
216 }
217
218 constexpr HorizontalMargins() = default;
219 constexpr HorizontalMargins(const HorizontalMargins&) = default;
220 constexpr HorizontalMargins(HorizontalMargins&&) noexcept = default;
221 constexpr HorizontalMargins& operator=(const HorizontalMargins&) = default;
222 constexpr HorizontalMargins& operator=(HorizontalMargins&&) noexcept = default;
223 };
224 */
225
227}
228
229#ifdef GHPL_HAS_REC2
230#include "align+rec2.h"
231#endif
232
250
align
Represents an alignment in both axes (horizontal and veritcal)
Definition align.h:47
constexpr vertical_align vertical_aligns_in_order[]
Vertical alignments in order.
Definition align.h:80
constexpr align only_vertical(align alignment)
Gets a mew align that only has the vertical component.
Definition align.h:128
constexpr align rotated_counter_clockwise(align alignment)
Like rotated_clockwise but counter clockwise.
Definition align.h:164
constexpr align aligns_counter_clockwise[]
Alignments in counter-clockwise order.
Definition align.h:75
constexpr vertical_align vertical_from(align alignment)
Gets just the vertical component from the align (as a vertical_align)
Definition align.h:123
constexpr align rotated_clockwise(align alignment)
Returns the 2D alignment rotated clockwise.
Definition align.h:160
constexpr horizontal_align horizontal_from(align alignment)
Gets just the horizontal component from the align (as a horizontal_align)
Definition align.h:125
vertical_align
Represents an alignment on a vertical line.
Definition align.h:29
constexpr horizontal_align horizontal_aligns_in_order[]
Horizontal alignments in order.
Definition align.h:78
constexpr align aligns_clockwise[]
Alignments in clockwise order.
Definition align.h:73
constexpr vertical_align to_vertical(horizontal_align alignment)
Returns alignment as if it was on a vertical line.
Definition align.h:114
constexpr align operator|(horizontal_align first, vertical_align second)
You can use the | operator to create an align from a horizontal_align and a vertical_align.
Definition align.h:41
constexpr const char * to_natural_name(align a)
Get natural alignment name.
Definition align.h:105
constexpr const char * to_name(horizontal_align h)
Get alignment name.
Definition align.h:93
horizontal_align
Definition align.h:19
constexpr align aligns_in_order[]
Alignments in order, first left-to-right, then top-to-bottom.
Definition align.h:71
constexpr align only_horizontal(align alignment)
Gets a mew align that only has the horizontal component.
Definition align.h:130
constexpr horizontal_align to_horizontal(vertical_align alignment)
Returns alignment as if it was on a horizontal line.
Definition align.h:118
constexpr vertical_align to_opposite(vertical_align alignment)
Returns the opposite aligment.
Definition align.h:134
constexpr auto bit_count
Equal to the number of bits in the type.
Definition bits.h:33
The below code is based on Sun's libm library code, which is licensed under the following license:
Primary namespace for everything in this library.
Definition align+rec2.h:10
@ top_center
Top center.
@ bottom_center
Bottom center.
@ bottom_left
Bottom left.
@ top_left
Top left.
@ middle_left
Middle left.
@ bottom_right
Bottom right.
@ middle_center
Middle center.
@ top_right
Top right.
@ middle_right
Middle right.