libosmscout 1.1.1
Loading...
Searching...
No Matches
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
33namespace osmscout {
34
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
#define CLASS_FINAL
Definition Compiler.h:26
#define OSMSCOUT_API
Definition CoreImportExport.h:45
std::string AsString() const
bool operator>(const Distance &d) const
Definition Distance.h:129
bool operator==(const Distance &d) const
Definition Distance.h:119
static Distance Lowest()
Distance & operator-=(const Distance &d)
Definition Distance.h:81
static Distance Min(const Distance &a, const Distance &b)
Distance & operator+=(const Distance &d)
Definition Distance.h:75
double AsMeter() const
Definition Distance.h:70
Distance & operator=(const Distance &d)=default
Distance operator-(const Distance &d) const
Definition Distance.h:99
static Distance Of(double value)
Definition Distance.h:178
double As() const
Definition Distance.h:150
Distance operator*(double factor) const
Definition Distance.h:109
bool operator!=(const Distance &d) const
Definition Distance.h:124
bool operator<=(const Distance &d) const
Definition Distance.h:144
Distance & operator=(Distance &&d) noexcept
Definition Distance.h:64
static Distance Max(const Distance &a, const Distance &b)
bool operator<(const Distance &d) const
Definition Distance.h:134
Distance & operator*=(double d)
Definition Distance.h:87
Distance(const Distance &d)=default
bool operator>=(const Distance &d) const
Definition Distance.h:139
Distance operator/(double factor) const
Definition Distance.h:114
static Distance Zero()
Distance(Distance &&d) noexcept
Definition Distance.h:59
static Distance Max()
static Distance Min()
Distance operator+(const Distance &d) const
Definition Distance.h:104
Distance & operator/=(double d)
Definition Distance.h:93
Definition Distance.h:204
std::string UnitStr() const override
Definition Distance.h:218
double Value(const class Distance &d) const override
Definition Distance.h:213
class Distance Distance(double d) const override
Definition Distance.h:208
static double FromMeter(double m)
Definition Distance.h:228
static double ToMeter(double m)
Definition Distance.h:223
~Meter() override=default
Definition Area.h:39
Distance Meters(double m)
Definition Distance.h:358
std::shared_ptr< DistanceUnit > DistanceUnitPtr
Definition Distance.h:201
Distance Kilometers(double km)
Definition Distance.h:362
std::ostream & operator<<(std::ostream &stream, const DBId &o)
Definition DBFileOffset.h:80
DistanceUnitSystem
Definition Distance.h:36
@ Imperial
Definition Distance.h:38
@ Metrics
Definition Distance.h:37
Definition Distance.h:193
virtual std::string UnitStr() const =0
virtual ~DistanceUnit()=default
virtual double Value(const class Distance &d) const =0
virtual class Distance Distance(double d) const =0
Definition Distance.h:266
std::string UnitStr() const override
Definition Distance.h:280
class Distance Distance(double d) const override
Definition Distance.h:270
~Feet() override=default
static double FromMeter(double m)
Definition Distance.h:290
double Value(const class Distance &d) const override
Definition Distance.h:275
static double ToMeter(double feet)
Definition Distance.h:285
Definition Distance.h:235
double Value(const class Distance &d) const override
Definition Distance.h:244
static double ToMeter(double km)
Definition Distance.h:254
~Kilometer() override=default
class Distance Distance(double d) const override
Definition Distance.h:239
std::string UnitStr() const override
Definition Distance.h:249
static double FromMeter(double m)
Definition Distance.h:259
Definition Distance.h:328
double Value(const class Distance &d) const override
Definition Distance.h:337
std::string UnitStr() const override
Definition Distance.h:342
static double ToMeter(double mile)
Definition Distance.h:347
static double FromMeter(double m)
Definition Distance.h:352
~Mile() override=default
class Distance Distance(double d) const override
Definition Distance.h:332
Definition Distance.h:297
static double ToMeter(double yard)
Definition Distance.h:316
class Distance Distance(double d) const override
Definition Distance.h:301
~Yard() override=default
static double FromMeter(double m)
Definition Distance.h:321
double Value(const class Distance &d) const override
Definition Distance.h:306
std::string UnitStr() const override
Definition Distance.h:311