GDevelop Core
Core library for developing platforms and tools compatible with GDevelop.
MeasurementUnit.h
1 /*
2  * GDevelop Core
3  * Copyright 2008-present Florian Rival ([email protected]). All rights
4  * reserved. This project is released under the MIT License.
5  */
6 #ifndef GDCORE_MEASUREMENTUNIT
7 #define GDCORE_MEASUREMENTUNIT
8 #include <vector>
9 
10 #include "GDCore/Project/MeasurementUnitElement.h"
11 #include "GDCore/String.h"
13 
14 namespace gd {
15 class SerializerElement;
16 class MeasurementBaseUnit;
17 } // namespace gd
18 
19 namespace gd {
20 
24 class GD_CORE_API MeasurementUnit {
25 public:
26  MeasurementUnit(const std::vector<gd::MeasurementUnitElement> &elements_,
27  gd::String name_, gd::String label_,
28  gd::String elementsWithWords_, gd::String description_ = "")
29  : elements(elements_), name(name_), label(label_),
30  description(description_), elementsWithWords(elementsWithWords_) {}
31 
33  gd::String elementsWithWords_, gd::String description_ = "")
34  : name(name_), label(label_), description(description_),
35  elementsWithWords(elementsWithWords_) {}
36 
37  virtual ~MeasurementUnit();
38 
42  const gd::String &GetName() const { return name; }
43 
47  const gd::String &GetLabel() const { return label; }
48 
52  const gd::String &GetDescription() const { return description; }
53 
57  const gd::String &GetElementsWithWords() const { return elementsWithWords; }
58 
62  const std::vector<gd::MeasurementUnitElement> &GetElements() const {
63  return elements;
64  }
65 
66  std::size_t GetElementsCount() const { return elements.size(); }
67 
68  int GetElementPower(std::size_t elementIndex) const {
69  return elements.at(elementIndex).GetPower();
70  }
71 
73  GetElementBaseUnit(std::size_t elementIndex) const {
74  return elements.at(elementIndex).GetBaseUnit();
75  }
76 
77  bool IsUndefined() const {
78  return this == &gd::MeasurementUnit::undefined || name == "Undefined";
79  }
80 
81  static void ApplyTranslation();
82 
83  static const gd::MeasurementUnit &GetUndefined() { return undefined; }
84 
85  static const gd::MeasurementUnit &GetDimensionless() { return dimensionless; }
86 
87  static const gd::MeasurementUnit &GetDegreeAngle() { return degreeAngle; }
88 
89  static const gd::MeasurementUnit &GetSecond() { return second; }
90 
91  static const gd::MeasurementUnit &GetPixel() { return pixel; }
92 
93  static const gd::MeasurementUnit &GetPixelSpeed() { return pixelSpeed; }
94 
95  static const gd::MeasurementUnit &GetPixelAcceleration() {
96  return pixelAcceleration;
97  }
98 
99  static const gd::MeasurementUnit &GetAngularSpeed() { return angularSpeed; }
100 
101  static const gd::MeasurementUnit &GetNewton() { return newton; }
102 
103  static const std::vector<const gd::MeasurementUnit*> &GetDefaultMeasurementUnits();
104  static std::size_t GetDefaultMeasurementUnitsCount();
105  static const gd::MeasurementUnit &GetDefaultMeasurementUnitAtIndex(std::size_t index);
106  static bool HasDefaultMeasurementUnitNamed(const gd::String &name);
107  static const gd::MeasurementUnit &GetDefaultMeasurementUnitByName(const gd::String &name);
108 
109 private:
110  static std::vector<const gd::MeasurementUnit*> defaultMeasurementUnits;
111  static gd::MeasurementUnit undefined;
112  static gd::MeasurementUnit dimensionless;
113  static gd::MeasurementUnit degreeAngle;
114  static gd::MeasurementUnit second;
115  static gd::MeasurementUnit pixel;
116  static gd::MeasurementUnit pixelSpeed;
117  static gd::MeasurementUnit pixelAcceleration;
118  static gd::MeasurementUnit newton;
119  static gd::MeasurementUnit angularSpeed;
120 
121  static gd::MeasurementUnit CreateUndefined() {
122  return MeasurementUnit("Undefined", _("Undefined"), "");
123  }
124 
125  static gd::MeasurementUnit CreateDimensionless() {
126  return MeasurementUnit("Dimensionless", _("Dimensionless"), "");
127  }
128 
129  static gd::MeasurementUnit CreateDegreeAngle() {
130  std::vector<gd::MeasurementUnitElement> elements;
131  elements.push_back(
132  MeasurementUnitElement(gd::MeasurementBaseUnit::degreeAngle, 1));
133  return MeasurementUnit(elements, "DegreeAngle", _("Angle"), _("degree"));
134  }
135 
136  static gd::MeasurementUnit CreateSecond() {
137  std::vector<gd::MeasurementUnitElement> elements;
138  elements.push_back(
139  MeasurementUnitElement(gd::MeasurementBaseUnit::second, 1));
140  return MeasurementUnit(elements, "Second", _("Duration"), _("second"));
141  }
142 
143  static gd::MeasurementUnit CreatePixel() {
144  std::vector<gd::MeasurementUnitElement> elements;
145  elements.push_back(
146  MeasurementUnitElement(gd::MeasurementBaseUnit::pixel, 1));
147  return MeasurementUnit(elements, "Pixel", _("Distance"), _("pixel"));
148  }
149 
150  static gd::MeasurementUnit CreatePixelSpeed() {
151  std::vector<gd::MeasurementUnitElement> elements;
152  elements.push_back(
153  MeasurementUnitElement(gd::MeasurementBaseUnit::pixel, 1));
154  elements.push_back(
155  MeasurementUnitElement(gd::MeasurementBaseUnit::second, -1));
156  return MeasurementUnit(elements, "PixelSpeed", _("Speed"),
157  _("pixel per second"),
158  _("How much distance is covered per second."));
159  }
160 
161  static gd::MeasurementUnit CreatePixelAcceleration() {
162  std::vector<gd::MeasurementUnitElement> elements;
163  elements.push_back(
164  MeasurementUnitElement(gd::MeasurementBaseUnit::pixel, 1));
165  elements.push_back(
166  MeasurementUnitElement(gd::MeasurementBaseUnit::second, -2));
167  return MeasurementUnit(elements, "PixelAcceleration", _("Acceleration"),
168  _("pixel per second, per second"),
169  _("How much speed is gained (or lost) per second."));
170  }
171 
172  static gd::MeasurementUnit CreateNewton() {
173  std::vector<gd::MeasurementUnitElement> elements;
174  elements.push_back(
175  MeasurementUnitElement(gd::MeasurementBaseUnit::meter, 1));
176  elements.push_back(
177  MeasurementUnitElement(gd::MeasurementBaseUnit::kilogram, 1));
178  elements.push_back(
179  MeasurementUnitElement(gd::MeasurementBaseUnit::second, -2));
180  return MeasurementUnit(
181  elements, "Newton",
182  _("Force (in Newton)"), _("meter kilogram per second, per second"),
183  _("A unit to measure forces."));
184  }
185 
186  static gd::MeasurementUnit CreateAngularSpeed() {
187  std::vector<gd::MeasurementUnitElement> elements;
188  elements.push_back(
189  MeasurementUnitElement(gd::MeasurementBaseUnit::degreeAngle, 1));
190  elements.push_back(
191  MeasurementUnitElement(gd::MeasurementBaseUnit::second, -1));
192  return MeasurementUnit(elements, "AngularSpeed", _("Angular speed"),
193  _("degree per second"),
194  _("How much angle is covered per second."));
195  }
196 
197  gd::String name;
198  gd::String label;
199  gd::String description;
200  gd::String elementsWithWords;
201  std::vector<gd::MeasurementUnitElement> elements;
202 };
203 
204 } // namespace gd
205 
206 #endif // GDCORE_MEASUREMENTUNIT
An atomic unit of measurement.
Definition: MeasurementBaseUnit.h:20
A unit of measurement.
Definition: MeasurementUnit.h:24
const gd::String & GetName() const
Return the unit name.
Definition: MeasurementUnit.h:42
const std::vector< gd::MeasurementUnitElement > & GetElements() const
Return the unit elements.
Definition: MeasurementUnit.h:62
const gd::String & GetLabel() const
Return the unit label.
Definition: MeasurementUnit.h:47
const gd::String & GetElementsWithWords() const
Return the unit description.
Definition: MeasurementUnit.h:57
const gd::String & GetDescription() const
Return the unit description.
Definition: MeasurementUnit.h:52
String represents an UTF8 encoded string.
Definition: String.h:31
Definition: CommonTools.h:24