Euphoria
size2.cc
Go to the documentation of this file.
1 #include "base/size2.h"
2 
3 #include "base/numparse.h"
4 
5 
6 namespace eu
7 {
9  : width(-1)
10  , height(-1)
11  {
12  }
13 
14  [[nodiscard]] size2f
16  {
17  return {w, h};
18  }
19 
20  [[nodiscard]] size2f
22  {
23  return {w, h};
24  }
25 
26  [[nodiscard]] size2f
28  {
29  return {s, s};
30  }
31 
32  void
34  {
35  width += rhs.width;
36  height += rhs.height;
37  }
38 
39  void
41  {
42  width -= rhs.width;
43  height -= rhs.height;
44  }
45 
46  void
47  size2f::operator*=(float rhs)
48  {
49  width *= rhs;
50  height *= rhs;
51  }
52 
53  void
54  size2f::operator/=(float rhs)
55  {
56  width /= rhs;
57  height /= rhs;
58  }
59 
60  vec2f
62  {
63  const float x = (width - o.width) / 2;
64  const float y = (height - o.height) / 2;
65  return {x, y};
66  }
67 
68  size2f::size2f(float w, float h)
69  : width(w)
70  , height(h)
71  {
72  }
73 
74 
76 
77  namespace
78  {
79  template<typename T>
80  Result<T> parse_number(const std::string& str, const char* const name)
81  {
82  const auto v = locale_parse_generic<T>
83  (
84  trim(str)
85  );
86  if (v)
87  {
88  return Result<T>::create_value(*v);
89  }
90  else
91  {
92  return Result<T>::create_error(fmt::format("{} is not a valid number for {}", str, name));
93  }
94  };
95  }
96 
97 
98  std::string
100  {
101  return fmt::format("{}x{}", s.width, s.height);
102  }
103 
105  StringParser<size2f>::parse(const std::string& value)
106  {
107  using R = Result<size2f>;
108  const auto values = split(value, 'x');
109  const auto xes = values.size();
110  if(xes != 2)
111  {
112  if(xes < 2)
113  {
114  return R::create_error
115  (
116  fmt::format("{} contains less than one x", value)
117  );
118  }
119  else
120  {
121  return R::create_error
122  (
123  fmt::format("{} contains more than one x: {}", value, xes-1)
124  );
125  }
126  }
127 
128  const auto lhs = parse_number<float>(values[0], "lhs");
129  const auto rhs = parse_number<float>(values[1], "rhs");
130 
131  if(!lhs) { return R::create_error(lhs.get_error()); }
132  if(!rhs) { return R::create_error(rhs.get_error()); }
133 
134  return R::create_value(size2f::create_from_width_height(*lhs, *rhs));
135  }
136 
138 
139  size2f
140  min(const size2f lhs, const size2f rhs)
141  {
143  (
144  min(lhs.width, rhs.width), min(lhs.height, rhs.height)
145  );
146  }
147 
148  size2f
149  max(const size2f lhs, const size2f rhs)
150  {
152  (
153  max(lhs.width, rhs.width), max(lhs.height, rhs.height)
154  );
155  }
156 
157  size2f
158  operator+(const size2f& lhs, const size2f& rhs)
159  {
160  size2f t = lhs;
161  t += rhs;
162  return t;
163  }
164 
165  size2f
166  operator-(const size2f& lhs, const size2f& rhs)
167  {
168  size2f t = lhs;
169  t -= rhs;
170  return t;
171  }
172 
173  size2f operator*(const size2f& lhs, float rhs)
174  {
175  size2f t = lhs;
176  t *= rhs;
177  return t;
178  }
179 
180  size2f operator*(float lhs, const size2f& rhs)
181  {
182  size2f t = rhs;
183  t *= lhs;
184  return t;
185  }
186 
187  size2f
188  operator/(const size2f& lhs, float rhs)
189  {
190  size2f t = lhs;
191  t /= rhs;
192  return t;
193  }
194 
195  std::string to_string(const size2f& r)
196  {
197  return fmt::format("({} x {})", r.width, r.height);
198  }
199 
200 
202 
203 
205  : width(-1)
206  , height(-1)
207  {
208  }
209 
210  [[nodiscard]] size2i
212  {
213  return {w, h};
214  }
215 
216  [[nodiscard]] size2i
218  {
219  return {w, h};
220  }
221 
222  [[nodiscard]] size2i
224  {
225  return {s, s};
226  }
227 
228  void
230  {
231  width += rhs.width;
232  height += rhs.height;
233  }
234 
235  void
237  {
238  width -= rhs.width;
239  height -= rhs.height;
240  }
241 
242  void
244  {
245  width *= rhs;
246  height *= rhs;
247  }
248 
249  vec2i
251  {
252  const int x = (width - o.width) / 2;
253  const int y = (height - o.height) / 2;
254  return {x, y};
255  }
256 
257 
258  size2i::size2i(int w, int h)
259  : width(w)
260  , height(h)
261  {
262  }
263 
265 
266 
267  std::string
269  {
270  return fmt::format("{}x{}", s.width, s.height);
271  }
272 
274  StringParser<size2i>::parse(const std::string& value)
275  {
276  using R = Result<size2i>;
277  const auto values = split(value, 'x');
278  const auto xes = values.size();
279  if(xes != 2)
280  {
281  if(xes < 2)
282  {
283  return R::create_error
284  (
285  fmt::format("{} contains less than one x", value)
286  );
287  }
288  else
289  {
290  return R::create_error
291  (
292  fmt::format("{} contains more than one x: {}", value, xes-1)
293  );
294  }
295  }
296 
297  const auto lhs = parse_number<int>(values[0], "lhs");
298  const auto rhs = parse_number<int>(values[1], "rhs");
299 
300  if(!lhs) { return R::create_error(lhs.get_error()); }
301  if(!rhs) { return R::create_error(rhs.get_error()); }
302 
303  return R::create_value(size2i::create_from_width_height(*lhs, *rhs));
304  }
305 
307 
308  size2i
309  min(const size2i lhs, const size2i rhs)
310  {
312  (
313  min(lhs.width, rhs.width), min(lhs.height, rhs.height)
314  );
315  }
316 
317  size2i
318  max(const size2i lhs, const size2i rhs)
319  {
321  (
322  max(lhs.width, rhs.width), max(lhs.height, rhs.height)
323  );
324  }
325 
326  size2i
327  operator+(const size2i& lhs, const size2i& rhs)
328  {
329  size2i t = lhs;
330  t += rhs;
331  return t;
332  }
333 
334  size2i
335  operator-(const size2i& lhs, const size2i& rhs)
336  {
337  size2i t = lhs;
338  t -= rhs;
339  return t;
340  }
341 
342  size2i operator*(const size2i& lhs, int rhs)
343  {
344  size2i t = lhs;
345  t *= rhs;
346  return t;
347  }
348 
349  size2i operator*(int lhs, const size2i& rhs)
350  {
351  size2i t = rhs;
352  t *= lhs;
353  return t;
354  }
355 
356  std::string to_string(const size2i& r)
357  {
358  return fmt::format("({} x {})", r.width, r.height);
359  }
360 }
361 
362 
std::vector< std::string > split(const std::string &s, char delim)
Definition: stringutils.cc:431
std::string trim(const std::string &string_to_trim, std::string_view trim_characters)
Remove characters from both the start and the end.
Definition: stringutils.cc:79
Definition: assert.h:90
Angle operator+(const Angle &lhs, const Angle &rhs)
Definition: angle.cc:123
int parse_number(const char **aa)
Definition: stringutils.cc:478
Angle operator-(const Angle &lhs, const Angle &rhs)
Definition: angle.cc:132
Angle operator/(const Angle &lhs, float rhs)
Definition: angle.cc:141
std::string to_string(const Aabb &a)
Definition: aabb.cc:110
std::string to_string(const size2i &r)
Definition: size2.cc:356
size2f min(const size2f lhs, const size2f rhs)
Definition: size2.cc:140
size2f max(const size2f lhs, const size2f rhs)
Definition: size2.cc:149
Angle operator*(const Angle &lhs, float rhs)
Definition: angle.cc:149
static Self create_error(const Error &error)
Definition: result.h:21
static Self create_value(const T &t)
Definition: result.h:15
void operator-=(const size2f &rhs)
Definition: size2.cc:40
static size2f create_from_height_width(float h, float w)
Definition: size2.cc:21
static size2f create_from_width_height(float w, float h)
Definition: size2.cc:15
static size2f create_from_square(float s)
Definition: size2.cc:27
float height
Definition: size2.h:14
float width
Definition: size2.h:13
void operator*=(float rhs)
Definition: size2.cc:47
void operator+=(const size2f &rhs)
Definition: size2.cc:33
void operator/=(float rhs)
Definition: size2.cc:54
vec2f calc_center_offset_for(const size2f &o) const
Definition: size2.cc:61
size2f()
Definition: size2.cc:8
static size2i create_from_width_height(int w, int h)
Definition: size2.cc:211
static size2i create_from_height_width(int h, int w)
Definition: size2.cc:217
int width
Definition: size2.h:36
void operator*=(int rhs)
Definition: size2.cc:243
vec2i calc_center_offset_for(const size2i &o) const
Definition: size2.cc:250
size2i()
Definition: size2.cc:204
static size2i create_from_square(int s)
Definition: size2.cc:223
int height
Definition: size2.h:37
void operator-=(const size2i &rhs)
Definition: size2.cc:236
void operator+=(const size2i &rhs)
Definition: size2.cc:229
Definition: vec2.h:33
Definition: vec2.h:72