Gorgon Game Engine
Margin.h
Go to the documentation of this file.
1 
3 #pragma once
4 
5 #include <iostream>
6 #include <ostream>
7 #include <string>
8 #include <sstream>
9 #include <iomanip>
10 #include <limits>
11 
12 #include "Point.h"
13 #include "Size.h"
14 #include "Bounds.h"
15 
16 namespace Gorgon { namespace Geometry {
17 
21  template <class T_>
22  class basic_Margin {
23  public:
25  typedef T_ BaseType;
26 
29 
32  basic_Margin(T_ all) : Left(all), Top(all), Right(all), Bottom(all) { }
33 
35  basic_Margin(T_ horizontal, T_ vertical) : Left(horizontal), Right(horizontal),
36  Top(vertical), Bottom(vertical) { }
37 
39  basic_Margin(T_ left, T_ top, T_ right, T_ bottom) :
40  Left(left), Top(top), Right(right), Bottom(bottom) { }
41 
44  explicit operator std::string() const {
45  std::ostringstream str;
46  str<<"("<<Left<<", "<<Top<<", "<<Right<<", "<<Bottom<<")";
47 
48  return str.str();
49  }
50 
54  return {
55  (Left < 0 || other.Left < 0) ? Left + other.Left : std::max(Left, other.Left),
56  (Top < 0 || other.Top < 0) ? Top + other.Top : std::max(Top, other.Top),
57  (Right < 0 || other.Right < 0) ? Right + other.Right : std::max(Right, other.Right),
58  (Bottom < 0 || other.Bottom < 0) ? Bottom + other.Bottom : std::max(Bottom, other.Bottom),
59  };
60  }
61 
65  return {
66  (Left < 0 || other.Right< 0) ? Left + other.Right : std::max(Left, other.Right),
67  (Top < 0 || other.Bottom < 0) ? Top + other.Bottom : std::max(Top, other.Bottom),
68  (Right < 0 || other.Left < 0) ? Right + other.Left : std::max(Right, other.Left),
69  (Bottom < 0 || other.Top < 0) ? Bottom + other.Top : std::max(Bottom, other.Top),
70  };
71  }
72 
74  T_ TotalX() const { return Right+Left; }
75 
77  T_ TotalY() const { return Bottom+Top; }
78 
80  T_ Horizontal() const { return Right+Left; }
81 
83  T_ Vertical() const { return Bottom+Top; }
84 
86  basic_Size<T_> Total() const { return {Right+Left, Bottom+Top}; }
87 
89  basic_Margin operator +(const basic_Margin &right) const {
90  return basic_Margin(Left+right.Left, Top+right.Top, Right+right.Right, Bottom+right.Bottom);
91  }
92 
94  basic_Margin operator -(const basic_Margin &right) const {
95  return basic_Margin(Left-right.Left, Top-right.Top, Right-right.Right, Bottom-right.Bottom);
96  }
97 
100  Left+=right.Left;
101  Top+=right.Top;
102  Right+=right.Right;
103  Bottom+=right.Bottom;
104 
105  return *this;
106  }
107 
110  Left-=right.Left;
111  Top-=right.Top;
112  Right-=right.Right;
113  Bottom-=right.Bottom;
114 
115  return *this;
116  }
117 
119  bool operator ==(const basic_Margin &margin) const {
120  return Left==margin.Left && Right==margin.Right && Top==margin.Top && Bottom==margin.Bottom;
121  }
122 
124  bool operator !=(const basic_Margin &margin) const {
125  return Left!=margin.Left || Right!=margin.Right || Top!=margin.Top || Bottom!=margin.Bottom;
126  }
127 
133  return basic_Margin(Left+Margin.TotalX()+width, Top, Right, Bottom);
134  }
135 
140  basic_Margin AddToTop(T_ height,const basic_Margin &Margin=0) {
141  return basic_Margin(Left, Top+Margin.TotalY()+height, Right, Bottom);
142  }
143 
149  return basic_Margin(Left, Top, Right+Margin.TotalX()+width, Bottom);
150  }
151 
157  return basic_Margin(Left, Top, Right, Bottom+Margin.TotalY()+height);
158  }
159 
163  return {Left, Top};
164  }
165 
167  T_ Left;
168 
170  T_ Top;
171 
173  T_ Right;
174 
176  T_ Bottom;
177  };
178 
181  template <typename T_, typename R_>
183  return basic_Size<T_>(s.Width+m.TotalX(), s.Height+m.TotalY());
184  }
185 
187  template <typename T_, typename R_>
189  return basic_Size<T_>(s.Width-m.TotalX(), s.Height-m.TotalY());
190  }
191 
193  template <typename T_, typename R_>
195  return basic_Margin<T_>(
196  b2.Left-b1.Left, b2.Top-b1.Top, b1.Right-b2.Right, b1.Bottom-b2.Bottom
197  );
198  }
199 
201  template <typename T_, typename R_>
203  return basic_Bounds<T_>(
204  b.Left-m.Left, b.Top-m.Top, b.Right+m.Right, b.Bottom+m.Bottom
205  );
206  }
207 
209  template <typename T_, typename R_>
211  return basic_Bounds<T_>(
212  b.Left+m.Left, b.Top+m.Top, b.Right-m.Right, b.Bottom-m.Bottom
213  );
214  }
215 
217  template <class T_>
218  std::ostream &operator << (std::ostream &out, const basic_Margin<T_> &Margin) {
219  out<<"("<<Margin.Left<<", "<<Margin.Right<<", "<<Margin.Top<<", "<<Margin.Bottom<<")";
220 
221  return out;
222  }
223 
225  template <class T_>
226  std::istream &operator >> (std::istream &in, basic_Margin<T_> &Margin) {
227  while(in.peek()==' ' || in.peek()=='(')
228  in.ignore(1);
229 
230  std::string s;
231  std::stringstream ss;
232 
233  while(in.peek()!=',' && !in.eof())
234  s.append(1, (char)in.get());
235 
236  in.ignore(1);
237 
238  ss.str(s);
239  ss>>Margin.Left;
240 
241  s="";
242 
243  while(in.peek()==' ' || in.peek()=='\t')
244  in.ignore(1);
245 
246  while(in.peek()!=',' && !in.eof())
247  s.append(1, (char)in.get());
248 
249  in.ignore(1);
250 
251  ss.str(s);
252  ss.clear();
253  ss>>Margin.Top;
254 
255  s="";
256 
257  while(in.peek()==' ' || in.peek()=='\t')
258  in.ignore(1);
259 
260  while(in.peek()!=',' && !in.eof())
261  s.append(1, (char)in.get());
262 
263  in.ignore(1);
264 
265  ss.str(s);
266  ss.clear();
267  ss>>Margin.Right;
268 
269  s="";
270 
271  while(in.peek()==' ' || in.peek()=='\t')
272  in.ignore(1);
273 
274  while(in.peek()!='>' && in.peek()!=' ' && in.peek()!='\t' && in.peek()!='\n' && in.peek()!='\r' && !in.eof())
275  s.append(1, in.get());
276 
277 
278  ss.str(s);
279  ss.clear();
280  ss>>Margin.Bottom;
281 
282  if(in.peek()==')')
283  in.ignore(1);
284 
285  return in;
286  }
287 
288 
290 } }
Gorgon::Geometry::basic_Bounds
This class represents boundaries of 2D objects.
Definition: Bounds.h:27
Gorgon::Geometry::basic_Margin::CombineMargins
basic_Margin CombineMargins(const basic_Margin &other) const
Combines two margins that are next to each other, basically taking the maximum margin from each side ...
Definition: Margin.h:64
Gorgon::Geometry::basic_Margin::operator+=
basic_Margin & operator+=(const basic_Margin &right)
Adds a Margin to this one.
Definition: Margin.h:99
Gorgon::Geometry::basic_Margin::Left
T_ Left
Left margin.
Definition: Margin.h:167
Gorgon::Geometry::basic_Margin::TotalX
T_ TotalX() const
Calculates and returns the total Margin in X axis.
Definition: Margin.h:74
Bounds.h
contains the Bounds class
Point.h
contains point class.
Size.h
contains the Size class
Gorgon::Geometry::basic_Size::Height
T_ Height
Height of this size object.
Definition: Size.h:261
Gorgon::Geometry::basic_Margin::BaseType
T_ BaseType
Base type of the margin elements.
Definition: Margin.h:25
Gorgon::Geometry::basic_Margin::Vertical
T_ Vertical() const
Calculates and returns the total Margin in Y axis.
Definition: Margin.h:83
Gorgon::Geometry::operator-
basic_Size< T_ > operator-(const basic_Size< T_ > &s, const basic_Margin< R_ > &m)
Subtracts a Margin from a size.
Definition: Margin.h:188
Gorgon::Geometry::operator>>
std::istream & operator>>(std::istream &in, basic_Bounds< T_ > &bounds)
Stream extractor for bounds.
Definition: Bounds.h:423
Gorgon::Geometry::basic_Margin::AddToLeft
basic_Margin AddToLeft(T_ width, basic_Margin Margin=0)
Adds an object to the left of this Margin to create a new Margin marking the used area.
Definition: Margin.h:132
Gorgon::Geometry::basic_Margin::Horizontal
T_ Horizontal() const
Calculates and returns the total Margin in X axis.
Definition: Margin.h:80
Gorgon::Geometry::basic_Bounds::Left
T_ Left
Left-most boundary.
Definition: Bounds.h:399
Gorgon::Geometry::basic_Margin::Top
T_ Top
Top margin.
Definition: Margin.h:170
Gorgon::Geometry::basic_Margin::operator-
basic_Margin operator-(const basic_Margin &right) const
Subtracts two Margin.
Definition: Margin.h:94
Gorgon
Root namespace for Gorgon Game Engine.
Definition: Any.h:19
Gorgon::Geometry::basic_Size
This class represents a 2D geometric size.
Definition: Size.h:23
Gorgon::Geometry::Margin
basic_Margin< int > Margin
Definition: Margin.h:289
Gorgon::Geometry::basic_Margin::basic_Margin
basic_Margin(T_ left, T_ top, T_ right, T_ bottom)
Sets all Margin separately.
Definition: Margin.h:39
Gorgon::Geometry::basic_Margin::AddToBottom
basic_Margin AddToBottom(T_ height, basic_Margin Margin=0)
Adds an object to the bottom of this Margin to create a new Margin marking the used area.
Definition: Margin.h:156
Gorgon::Geometry::basic_Margin::basic_Margin
basic_Margin()
Default constructor.
Definition: Margin.h:28
Gorgon::Geometry::basic_Margin::CombinePadding
basic_Margin CombinePadding(const basic_Margin &other) const
Combines two margins that are inside each other, basically taking the maximum margin from each side.
Definition: Margin.h:53
Gorgon::Geometry::basic_Margin::operator+
basic_Margin operator+(const basic_Margin &right) const
Adds two Margin.
Definition: Margin.h:89
Gorgon::Geometry::basic_Margin::Bottom
T_ Bottom
Bottom margin.
Definition: Margin.h:176
Gorgon::Geometry::basic_Margin::basic_Margin
basic_Margin(T_ all)
Sets all Margin to the given value.
Definition: Margin.h:32
Gorgon::Geometry::basic_Point
This class represents a 2D point.
Definition: Point.h:32
Gorgon::Geometry::basic_Margin::Total
basic_Size< T_ > Total() const
Calculates and returns the total Margin in X axis.
Definition: Margin.h:86
Gorgon::Geometry::basic_Margin::basic_Margin
basic_Margin(T_ horizontal, T_ vertical)
Sets horizontal and vertical Margin separately.
Definition: Margin.h:35
Gorgon::Geometry::operator+
basic_Size< T_ > operator+(const basic_Size< T_ > &s, const basic_Margin< R_ > &m)
Adds a Margin object to a size structure, resultant size can contain previous size with the given Mar...
Definition: Margin.h:182
Gorgon::Geometry::basic_Bounds::Right
T_ Right
Right-most boundary.
Definition: Bounds.h:405
Gorgon::Geometry::basic_Margin::Right
T_ Right
Right margin.
Definition: Margin.h:173
Gorgon::Geometry::basic_Bounds::Bottom
T_ Bottom
Bottom-most boundary.
Definition: Bounds.h:408
Gorgon::Geometry::operator<<
std::ostream & operator<<(std::ostream &out, const basic_Bounds< T_ > &bounds)
Allows streaming of bounds.
Definition: Bounds.h:415
Gorgon::Geometry::basic_Margin::TopLeft
basic_Point< T_ > TopLeft() const
Top left coordinate of the object that will be placed within a <0:inf, 0:inf> bounds that has this Ma...
Definition: Margin.h:162
Gorgon::Geometry::basic_Margin::operator==
bool operator==(const basic_Margin &margin) const
Compares two Margin.
Definition: Margin.h:119
Gorgon::Geometry::basic_Size::Width
T_ Width
Width of this size object.
Definition: Size.h:258
Gorgon::Geometry::basic_Margin
This class defines Margin of an object or an area.
Definition: Margin.h:22
Gorgon::Geometry::basic_Margin::AddToTop
basic_Margin AddToTop(T_ height, const basic_Margin &Margin=0)
Adds an object to the top of this Margin to create a new Margin marking the used area.
Definition: Margin.h:140
Gorgon::Geometry::basic_Margin::operator!=
bool operator!=(const basic_Margin &margin) const
Compares two Margin.
Definition: Margin.h:124
Gorgon::Geometry::basic_Margin::AddToRight
basic_Margin AddToRight(T_ width, basic_Margin Margin=0)
Adds an object to the right of this Margin to create a new Margin marking the used area.
Definition: Margin.h:148
Gorgon::Geometry::basic_Margin::TotalY
T_ TotalY() const
Calculates and returns the total Margin in Y axis.
Definition: Margin.h:77
Gorgon::Geometry::basic_Margin::operator-=
basic_Margin & operator-=(const basic_Margin &right)
Subtracts a Margin from this one.
Definition: Margin.h:109
Gorgon::Geometry::basic_Bounds::Top
T_ Top
Top-most boundary.
Definition: Bounds.h:402