TwirreLink
 All Classes Functions Pages
Value.h
1 /*
2  * Twirre: architecture for autonomous UAVs using interchangeable commodity components
3  *
4  * Copyright© 2017 Centre of expertise in Computer Vision & Data Science, NHL Stenden University of applied sciences
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
7  *
8  * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
11  */
12 
13 #ifndef VALUE_H_
14 #define VALUE_H_
15 
16 #include <string>
17 #include <cstdint>
18 #include <vector>
19 #include <shared_mutex>
20 #include <type_traits>
21 
22 #include "../Core/owned_mutex.h"
23 
24 namespace twirre
25 {
26  class Parameter;
27 
28  enum class NativeType
29  {
30  type_void, type_int8, type_uint8, type_int16, type_uint16, type_int32, type_uint32, type_int64, type_uint64, type_float, type_double
31  };
32 
33  static constexpr inline const char * enumtostr(const NativeType t)
34  {
35  switch(t)
36  {
37  case NativeType::type_void:
38  return "type_void";
39  case NativeType::type_int8:
40  return "type_int8";
41  case NativeType::type_uint8:
42  return "type_uint8";
43  case NativeType::type_int16:
44  return "type_int16";
45  case NativeType::type_uint16:
46  return "type_uint16";
47  case NativeType::type_int32:
48  return "type_int32";
49  case NativeType::type_uint32:
50  return "type_uint32";
51  case NativeType::type_int64:
52  return "type_int64";
53  case NativeType::type_uint64:
54  return "type_uint64";
55  case NativeType::type_float:
56  return "type_float";
57  case NativeType::type_double:
58  return "type_double";
59  default:
60  return nullptr;
61  }
62  }
63 
64  template<typename T>
65  constexpr NativeType _getNativeType();
66 
67  template<>
68  constexpr NativeType _getNativeType<int8_t>()
69  {
70  return NativeType::type_int8;
71  }
72  template<>
73  constexpr NativeType _getNativeType<uint8_t>()
74  {
75  return NativeType::type_uint8;
76  }
77  template<>
78  constexpr NativeType _getNativeType<int16_t>()
79  {
80  return NativeType::type_int16;
81  }
82  template<>
83  constexpr NativeType _getNativeType<uint16_t>()
84  {
85  return NativeType::type_uint16;
86  }
87  template<>
88  constexpr NativeType _getNativeType<int32_t>()
89  {
90  return NativeType::type_int32;
91  }
92  template<>
93  constexpr NativeType _getNativeType<uint32_t>()
94  {
95  return NativeType::type_uint32;
96  }
97  template<>
98  constexpr NativeType _getNativeType<int64_t>()
99  {
100  return NativeType::type_int64;
101  }
102  template<>
103  constexpr NativeType _getNativeType<uint64_t>()
104  {
105  return NativeType::type_uint64;
106  }
107  template<>
108  constexpr NativeType _getNativeType<float>()
109  {
110  return NativeType::type_float;
111  }
112  template<>
113  constexpr NativeType _getNativeType<double>()
114  {
115  return NativeType::type_double;
116  }
117 
118  class Scalar
119  {
120  public:
121  virtual ~Scalar()
122  {
123  }
124 
125  virtual NativeType getNativeType() = 0;
126 
127  virtual uint8_t as_uint8_t() = 0;
128  virtual int8_t as_int8_t() = 0;
129  virtual uint16_t as_uint16_t() = 0;
130  virtual int16_t as_int16_t() = 0;
131  virtual uint32_t as_uint32_t() = 0;
132  virtual int32_t as_int32_t() = 0;
133  virtual uint64_t as_uint64_t() = 0;
134  virtual int64_t as_int64_t() = 0;
135  virtual float as_float() = 0;
136  virtual double as_double() = 0;
137  virtual std::string as_string() = 0;
138  };
139 
140  class Value: public Scalar
141  {
142  template<typename T> friend class ValueImpl;
143  template<typename T> friend class ArrayValue;
144  public:
145 
146  Value(const std::string name);
147  virtual ~Value()
148  {
149  }
150 
151  int GetSize();
152  void SetBuffer(unsigned char *buffer);
153 
154  virtual NativeType getNativeType() = 0;
155 
156  virtual uint8_t as_uint8_t() = 0;
157  virtual int8_t as_int8_t() = 0;
158  virtual uint16_t as_uint16_t() = 0;
159  virtual int16_t as_int16_t() = 0;
160  virtual uint32_t as_uint32_t() = 0;
161  virtual int32_t as_int32_t() = 0;
162  virtual uint64_t as_uint64_t() = 0;
163  virtual int64_t as_int64_t() = 0;
164  virtual float as_float() = 0;
165  virtual double as_double() = 0;
166  virtual std::string as_string() = 0;
167 
168  virtual uint8_t as_uint8_t(uint32_t index) = 0;
169  virtual int8_t as_int8_t(uint32_t index) = 0;
170  virtual uint16_t as_uint16_t(uint32_t index) = 0;
171  virtual int16_t as_int16_t(uint32_t index) = 0;
172  virtual uint32_t as_uint32_t(uint32_t index) = 0;
173  virtual int32_t as_int32_t(uint32_t index) = 0;
174  virtual uint64_t as_uint64_t(uint32_t index) = 0;
175  virtual int64_t as_int64_t(uint32_t index) = 0;
176  virtual float as_float(uint32_t index) = 0;
177  virtual double as_double(uint32_t index) = 0;
178  //virtual std::string as_string(uint32_t index) = 0;
179 
180  const std::string& getName();
181 
182  virtual uint32_t getSize() const = 0;
183  virtual size_t getElementSize() const = 0;
184  virtual void* getBuffer() = 0;
185 
186  virtual bool isValid() const = 0;
187  virtual bool isArray() const = 0;
188  protected:
189  virtual void copyTo(Parameter* parm) const = 0;
190  std::string _name;
191  mutable std::shared_timed_mutex _rwMutex;
192  };
193 
194  class Parameter: public Value
195  {
196  template<typename T> friend class ArrayValue;
197  public:
198  Parameter(const std::string name);
199  Parameter(const std::string name, owned_mutex * actuatorMutex);
200  virtual ~Parameter()
201  {
202  }
203 
204  virtual void set(const uint8_t val) = 0;
205  virtual void set(const int8_t val) = 0;
206  virtual void set(const uint16_t val) = 0;
207  virtual void set(const int16_t val) = 0;
208  virtual void set(const uint32_t val) = 0;
209  virtual void set(const int32_t val) = 0;
210  virtual void set(const uint64_t val) = 0;
211  virtual void set(const int64_t val) = 0;
212  virtual void set(const float val) = 0;
213  virtual void set(const double val) = 0;
214  virtual void set(const Value& val) = 0;
215 
216  virtual void set(const uint8_t * vals, const uint32_t size) = 0;
217  virtual void set(const int8_t * vals, const uint32_t size) = 0;
218  virtual void set(const uint16_t * vals, const uint32_t size) = 0;
219  virtual void set(const int16_t * vals, const uint32_t size) = 0;
220  virtual void set(const uint32_t * vals, const uint32_t size) = 0;
221  virtual void set(const int32_t * vals, const uint32_t size) = 0;
222  virtual void set(const uint64_t * vals, const uint32_t size) = 0;
223  virtual void set(const int64_t * vals, const uint32_t size) = 0;
224  virtual void set(const float * vals, const uint32_t size) = 0;
225  virtual void set(const double * vals, const uint32_t size) = 0;
226 
227  virtual void set(const std::vector<uint8_t>& vals) = 0;
228  virtual void set(const std::vector<int8_t>& vals) = 0;
229  virtual void set(const std::vector<uint16_t>& vals) = 0;
230  virtual void set(const std::vector<int16_t>& vals) = 0;
231  virtual void set(const std::vector<uint32_t>& vals) = 0;
232  virtual void set(const std::vector<int32_t>& vals) = 0;
233  virtual void set(const std::vector<uint64_t>& vals) = 0;
234  virtual void set(const std::vector<int64_t>& vals) = 0;
235  virtual void set(const std::vector<float>& vals) = 0;
236  virtual void set(const std::vector<double>& vals) = 0;
237 
238  virtual void setActuatorMutex(owned_mutex * actuatorMutex);
239 
240  virtual Scalar& getMin() = 0;
241  virtual Scalar& getMax() = 0;
242 
243  template<typename T>
244  Parameter& operator =(const T & value)
245  {
246  set(value);
247  return *this;
248  }
249 
250  bool isModified() const;
251  void resetModified();
252 
253  protected:
254  bool _modified;
255  owned_mutex * _actuatorMutex;
256  };
257 
258  template<typename T>
259  class ScalarImpl: public Scalar
260  {
261  public:
262  ScalarImpl()
263  {
264  }
265  explicit ScalarImpl(const T val);
266 
267  virtual ~ScalarImpl()
268  {
269  }
270 
271  virtual NativeType getNativeType() override;
272 
273  virtual uint8_t as_uint8_t() override;
274  virtual int8_t as_int8_t() override;
275  virtual uint16_t as_uint16_t() override;
276  virtual int16_t as_int16_t() override;
277  virtual uint32_t as_uint32_t() override;
278  virtual int32_t as_int32_t() override;
279  virtual uint64_t as_uint64_t() override;
280  virtual int64_t as_int64_t() override;
281  virtual float as_float() override;
282  virtual double as_double() override;
283  virtual std::string as_string() override;
284 
285  virtual void set(const T val);
286 
287  protected:
288  mutable std::shared_timed_mutex _rwMutex;
289  T _val;
290  };
291 
292 
293 
294  class ErrorValue: public Parameter
295  {
296  /* singleton */
297  public:
298  static ErrorValue * getInstance();
299  private:
300  static ErrorValue *_instance;
301  void operator delete(void *)
302  {
303  } //prevent deletion
304 
305  ErrorValue(const std::string name);
306  virtual ~ErrorValue()
307  {
308  }
309  public:
310  virtual NativeType getNativeType() override;
311 
312  virtual uint8_t as_uint8_t() override;
313  virtual int8_t as_int8_t() override;
314  virtual uint16_t as_uint16_t() override;
315  virtual int16_t as_int16_t() override;
316  virtual uint32_t as_uint32_t() override;
317  virtual int32_t as_int32_t() override;
318  virtual uint64_t as_uint64_t() override;
319  virtual int64_t as_int64_t() override;
320  virtual float as_float() override;
321  virtual double as_double() override;
322  virtual std::string as_string() override;
323 
324  virtual uint8_t as_uint8_t(uint32_t index) override;
325  virtual int8_t as_int8_t(uint32_t index) override;
326  virtual uint16_t as_uint16_t(uint32_t index) override;
327  virtual int16_t as_int16_t(uint32_t index) override;
328  virtual uint32_t as_uint32_t(uint32_t index) override;
329  virtual int32_t as_int32_t(uint32_t index) override;
330  virtual uint64_t as_uint64_t(uint32_t index) override;
331  virtual int64_t as_int64_t(uint32_t index) override;
332  virtual float as_float(uint32_t index) override;
333  virtual double as_double(uint32_t index) override;
334 
335  virtual void set(const uint8_t val) override;
336  virtual void set(const int8_t val) override;
337  virtual void set(const uint16_t val) override;
338  virtual void set(const int16_t val) override;
339  virtual void set(const uint32_t val) override;
340  virtual void set(const int32_t val) override;
341  virtual void set(const uint64_t val) override;
342  virtual void set(const int64_t val) override;
343  virtual void set(const float val) override;
344  virtual void set(const double val) override;
345  virtual void set(const Value&) override
346  {
347  }
348 
349  virtual void set(const uint8_t * vals, const uint32_t size) override;
350  virtual void set(const int8_t * vals, const uint32_t size) override;
351  virtual void set(const uint16_t * vals, const uint32_t size) override;
352  virtual void set(const int16_t * vals, const uint32_t size) override;
353  virtual void set(const uint32_t * vals, const uint32_t size) override;
354  virtual void set(const int32_t * vals, const uint32_t size) override;
355  virtual void set(const uint64_t * vals, const uint32_t size) override;
356  virtual void set(const int64_t * vals, const uint32_t size) override;
357  virtual void set(const float * vals, const uint32_t size) override;
358  virtual void set(const double * vals, const uint32_t size) override;
359 
360  virtual void set(const std::vector<uint8_t>& vals) override;
361  virtual void set(const std::vector<int8_t>& vals) override;
362  virtual void set(const std::vector<uint16_t>& vals) override;
363  virtual void set(const std::vector<int16_t>& vals) override;
364  virtual void set(const std::vector<uint32_t>& vals) override;
365  virtual void set(const std::vector<int32_t>& vals) override;
366  virtual void set(const std::vector<uint64_t>& vals) override;
367  virtual void set(const std::vector<int64_t>& vals) override;
368  virtual void set(const std::vector<float>& vals) override;
369  virtual void set(const std::vector<double>& vals) override;
370 
371  virtual Scalar& getMin() override;
372  virtual Scalar& getMax() override;
373 
374  virtual bool isValid() const override;
375  virtual bool isArray() const override;
376 
377  virtual uint32_t getSize() const override;
378  virtual size_t getElementSize() const override;
379  virtual void* getBuffer() override;
380  protected:
381  ScalarImpl<uint8_t> _min;
382  ScalarImpl<uint8_t> _max;
383 
384  virtual void copyTo(Parameter*) const override
385  {
386  }
387  };
388 
389  /* explicit template instantiations of ScalarImpl */
390  extern template class ScalarImpl<uint8_t> ;
391  extern template class ScalarImpl<int8_t> ;
392  extern template class ScalarImpl<uint16_t> ;
393  extern template class ScalarImpl<int16_t> ;
394  extern template class ScalarImpl<uint32_t> ;
395  extern template class ScalarImpl<int32_t> ;
396  extern template class ScalarImpl<uint64_t> ;
397  extern template class ScalarImpl<int64_t> ;
398  extern template class ScalarImpl<float> ;
399  extern template class ScalarImpl<double> ;
400 } /* namespace twirre */
401 
402 
403 
404 
405 #include "../Core/ValueImpl.h"
406 #include "../Core/ArrayValue.h"
407 
408 
409 
410 
411 #endif /* VALUE_H_ */
Definition: Value.h:194
Definition: ValueImpl.h:21
Definition: Value.h:259
Definition: ArrayValue.h:21
Definition: Value.h:140
Definition: Value.h:294
A mutex with the concept of 'ownership'.
Definition: owned_mutex.h:27
Definition: Value.h:118