libosmscout  1.1.1
Distance.h
Go to the documentation of this file.
1 #ifndef OSMSCOUT_DISTANCE_H
2 #define OSMSCOUT_DISTANCE_H
3 
4 /*
5  This source is part of the libosmscout library
6  Copyright (C) 2018 Lukáš Karas
7 
8  This library is free software; you can redistribute it and/or
9  modify it under the terms of the GNU Lesser General Public
10  License as published by the Free Software Foundation; either
11  version 2.1 of the License, or (at your option) any later version.
12 
13  This library is distributed in the hope that it will be useful,
14  but WITHOUT ANY WARRANTY; without even the implied warranty of
15  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  Lesser General Public License for more details.
17 
18  You should have received a copy of the GNU Lesser General Public
19  License along with this library; if not, write to the Free Software
20  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 */
22 
25 
26 #include <utility>
27 #include <limits>
28 #include <algorithm>
29 #include <string>
30 #include <ostream>
31 #include <memory>
32 
33 namespace osmscout {
34 
35  enum class DistanceUnitSystem
36  {
37  Metrics,
38  Imperial
39  };
40 
41  class OSMSCOUT_API Distance CLASS_FINAL
42  {
43  private:
44  double meters=0.0;
45 
46  private:
47  explicit Distance(double meters):
48  meters(meters)
49  { }
50 
51  public:
52  Distance() = default;
53  ~Distance() = default;
54 
55  Distance(const Distance &d) = default;
56 
57  Distance& operator=(const Distance &d) = default;
58 
59  Distance(Distance &&d) noexcept
60  {
61  std::swap(meters, d.meters);
62  }
63 
64  Distance &operator=(Distance &&d) noexcept
65  {
66  std::swap(meters, d.meters);
67  return *this;
68  }
69 
70  double AsMeter() const
71  {
72  return meters;
73  }
74 
75  Distance& operator+=(const Distance &d)
76  {
77  meters+=d.meters;
78  return *this;
79  }
80 
81  Distance& operator-=(const Distance &d)
82  {
83  meters-=d.meters;
84  return *this;
85  }
86 
87  Distance& operator*=(double d)
88  {
89  meters*=d;
90  return *this;
91  }
92 
93  Distance& operator/=(double d)
94  {
95  meters/=d;
96  return *this;
97  }
98 
99  Distance operator-(const Distance &d) const
100  {
101  return Distance(meters-d.meters);
102  }
103 
104  Distance operator+(const Distance &d) const
105  {
106  return Distance(meters+d.meters);
107  }
108 
109  Distance operator*(double factor) const
110  {
111  return Distance(meters*factor);
112  }
113 
114  Distance operator/(double factor) const
115  {
116  return Distance(meters / factor);
117  }
118 
119  bool operator==(const Distance &d) const
120  {
121  return meters == d.meters;
122  }
123 
124  bool operator!=(const Distance &d) const
125  {
126  return meters != d.meters;
127  }
128 
129  bool operator>(const Distance &d) const
130  {
131  return meters > d.meters;
132  }
133 
134  bool operator<(const Distance &d) const
135  {
136  return meters < d.meters;
137  }
138 
139  bool operator>=(const Distance &d) const
140  {
141  return meters >= d.meters;
142  }
143 
144  bool operator<=(const Distance &d) const
145  {
146  return meters <= d.meters;
147  }
148 
149  template <typename Unit>
150  double As() const
151  {
152  return Unit::FromMeter(meters);
153  }
154 
155  std::string AsString() const;
156 
157  static Distance Zero();
158 
159  static Distance Max();
160 
165  static Distance Min();
166 
171  static Distance Lowest();
172 
173  static Distance Max(const Distance &a, const Distance &b);
174 
175  static Distance Min(const Distance &a, const Distance &b);
176 
177  template <typename Unit>
178  static Distance Of(double value)
179  {
180  return Distance(Unit::ToMeter(value));
181  }
182  };
183 
184  inline std::ostream& operator<<(std::ostream& os,
185  const Distance& distance)
186  {
187  os << distance.AsString();
188 
189  return os;
190  }
191 
193  {
194  public:
195  virtual ~DistanceUnit() = default;
196  virtual class Distance Distance(double d) const = 0;
197  virtual double Value(const class Distance &d) const = 0;
198  virtual std::string UnitStr() const = 0;
199  };
200 
201  using DistanceUnitPtr = std::shared_ptr<DistanceUnit>;
202 
204  {
205  public:
206  ~Meter() override = default;
207 
208  class Distance Distance(double d) const override
209  {
210  return Distance::Of<Meter>(d);
211  }
212 
213  double Value(const class Distance &d) const override
214  {
215  return d.As<Meter>();
216  }
217 
218  std::string UnitStr() const override
219  {
220  return "m";
221  };
222 
223  static double ToMeter(double m)
224  {
225  return m;
226  }
227 
228  static double FromMeter(double m)
229  {
230  return m;
231  }
232  };
233 
235  {
236  public:
237  ~Kilometer() override = default;
238 
239  class Distance Distance(double d) const override
240  {
241  return Distance::Of<Kilometer>(d);
242  }
243 
244  double Value(const class Distance &d) const override
245  {
246  return d.As<Kilometer>();
247  }
248 
249  std::string UnitStr() const override
250  {
251  return "km";
252  };
253 
254  static double ToMeter(double km)
255  {
256  return km*1000.0;
257  }
258 
259  static double FromMeter(double m)
260  {
261  return m/1000.0;
262  }
263  };
264 
266  {
267  public:
268  ~Feet() override = default;
269 
270  class Distance Distance(double d) const override
271  {
272  return Distance::Of<Feet>(d);
273  }
274 
275  double Value(const class Distance &d) const override
276  {
277  return d.As<Feet>();
278  }
279 
280  std::string UnitStr() const override
281  {
282  return "ft";
283  };
284 
285  static double ToMeter(double feet)
286  {
287  return feet * 0.3048;
288  }
289 
290  static double FromMeter(double m)
291  {
292  return m/0.3048;
293  }
294  };
295 
297  {
298  public:
299  ~Yard() override = default;
300 
301  class Distance Distance(double d) const override
302  {
303  return Distance::Of<Yard>(d);
304  }
305 
306  double Value(const class Distance &d) const override
307  {
308  return d.As<Yard>();
309  }
310 
311  std::string UnitStr() const override
312  {
313  return "yard";
314  };
315 
316  static double ToMeter(double yard)
317  {
318  return yard / 0.9144;
319  }
320 
321  static double FromMeter(double m)
322  {
323  return m * 0.9144;
324  }
325  };
326 
328  {
329  public:
330  ~Mile() override = default;
331 
332  class Distance Distance(double d) const override
333  {
334  return Distance::Of<Mile>(d);
335  }
336 
337  double Value(const class Distance &d) const override
338  {
339  return d.As<Mile>();
340  }
341 
342  std::string UnitStr() const override
343  {
344  return "mi";
345  };
346 
347  static double ToMeter(double mile)
348  {
349  return mile * 1609.344;
350  }
351 
352  static double FromMeter(double m)
353  {
354  return m / 1609.344;
355  }
356  };
357 
358  inline Distance Meters(double m){
359  return Distance::Of<Meter>(m);
360  }
361 
362  inline Distance Kilometers(double km){
363  return Distance::Of<Kilometer>(km);
364  }
365 
366 }
367 
368 #endif //OSMSCOUT_DISTANCE_H
DistanceUnitSystem
Definition: Distance.h:35
Distance & operator-=(const Distance &d)
Definition: Distance.h:81
Distance & operator+=(const Distance &d)
Definition: Distance.h:75
Distance operator-(const Distance &d) const
Definition: Distance.h:99
double AsMeter() const
Definition: Distance.h:70
Definition: Distance.h:192
static double ToMeter(double m)
Definition: Distance.h:223
std::string UnitStr() const override
Definition: Distance.h:311
static double FromMeter(double m)
Definition: Distance.h:352
double Value(const class Distance &d) const override
Definition: Distance.h:306
Distance & operator*=(double d)
Definition: Distance.h:87
static double ToMeter(double feet)
Definition: Distance.h:285
double Value(const class Distance &d) const override
Definition: Distance.h:244
double As() const
Definition: Distance.h:150
Definition: Distance.h:296
static double FromMeter(double m)
Definition: Distance.h:228
Distance operator+(const Distance &d) const
Definition: Distance.h:104
std::ostream & operator<<(std::ostream &stream, const DBId &o)
Definition: DBFileOffset.h:80
double Value(const class Distance &d) const override
Definition: Distance.h:337
static double ToMeter(double yard)
Definition: Distance.h:316
Definition: Distance.h:327
Distance(Distance &&d) noexcept
Definition: Distance.h:59
bool operator==(const Distance &d) const
Definition: Distance.h:119
std::string UnitStr() const override
Definition: Distance.h:280
std::string UnitStr() const override
Definition: Distance.h:218
bool operator<=(const Distance &d) const
Definition: Distance.h:144
bool operator>(const Distance &d) const
Definition: Distance.h:129
Distance Kilometers(double km)
Definition: Distance.h:362
double Value(const class Distance &d) const override
Definition: Distance.h:275
Definition: Distance.h:265
Definition: Area.h:38
Definition: Distance.h:234
#define CLASS_FINAL
Definition: Compiler.h:26
#define OSMSCOUT_API
Definition: CoreImportExport.h:45
static double FromMeter(double m)
Definition: Distance.h:290
std::string UnitStr() const override
Definition: Distance.h:342
static double ToMeter(double mile)
Definition: Distance.h:347
double Value(const class Distance &d) const override
Definition: Distance.h:213
static double FromMeter(double m)
Definition: Distance.h:259
Distance operator*(double factor) const
Definition: Distance.h:109
static Distance Of(double value)
Definition: Distance.h:178
bool operator<(const Distance &d) const
Definition: Distance.h:134
std::shared_ptr< DistanceUnit > DistanceUnitPtr
Definition: Distance.h:201
bool operator!=(const Distance &d) const
Definition: Distance.h:124
Distance Meters(double m)
Definition: Distance.h:358
Definition: Distance.h:203
bool operator>=(const Distance &d) const
Definition: Distance.h:139
static double ToMeter(double km)
Definition: Distance.h:254
Distance & operator=(Distance &&d) noexcept
Definition: Distance.h:64
static double FromMeter(double m)
Definition: Distance.h:321
std::string UnitStr() const override
Definition: Distance.h:249
Distance operator/(double factor) const
Definition: Distance.h:114
Distance & operator/=(double d)
Definition: Distance.h:93