LRAUV  revA
BlobWriter.h
Go to the documentation of this file.
1 
10 #ifndef BLOBWRITER_H_
11 #define BLOBWRITER_H_
12 
13 #include "BlobValue.h"
14 #include "DataWriter.h"
15 #include "I1D.h"
16 #include "I2D.h"
17 #include "I3D.h"
18 
19 #include <iostream> // for cerr, since there is no logger_ in this class, but writers should not fail silently (or close to silently)
20 
22 {
23 
32 public:
33 
34  virtual ~AbstractBlobWriter() {}
35 
36  // Parent method used in AbstractBlobWriter: needs to be re-implemented in child classes
37  virtual bool write( const DataValue& value, const Timestamp& timestamp ) = 0;
38 
39  // Parent method used in AbstractBlobWriter: needs to be re-implemented in child classes
40  virtual const ElementURI& getUri( void ) const = 0;
41 
46  virtual bool writeBlob( const void* bytes, size_t elements, const Timestamp& timestamp = Timestamp::NOT_SET_TIME )
47  {
48  blobValue_.setFromRaw( bytes, elements );
49  return write( blobValue_, timestamp );
50  }
51 
56  template<typename T, size_t M>
57  bool write1DArray( const Unit& unit, T( &x )[M], const Timestamp& timestamp = Timestamp::NOT_SET_TIME )
58  {
59  if( getUri().getDimensions() != 1 )
60  {
61  std::cerr << "URI " << Str( getUri() ).cStr() << " is not 1D." << std::endl;
62  return 0;
63  }
64  else if( getUri().getDimension1() != M )
65  {
66  std::cerr << "URI " << Str( getUri() ).cStr() << " expects " << getUri().getDimension1() << ", but received " << M << std::endl;
67  return 0;
68  }
69  return write1DPtr( unit, ( T* )&x, M, timestamp );
70  }
71 
76  template<typename T>
77  bool write1DClass( const Unit& unit, I1D<T>& i1d, const Timestamp& timestamp = Timestamp::NOT_SET_TIME )
78  {
79  return write1DPtr( unit, ( const T* ) i1d.getPtr1d(), i1d.getM(), timestamp );
80  }
81 
86  template<typename T>
87  bool write1DPtr( const Unit& unit, const T* values, int m, const Timestamp& timestamp = Timestamp::NOT_SET_TIME )
88  {
89  if( getUri().getDimensions() != 1 )
90  {
91  std::cerr << "URI " << Str( getUri() ).cStr() << " is not 1D." << std::endl;
92  return 0;
93  }
94  else if( getUri().getDimension1() != m )
95  {
96  std::cerr << "URI " << Str( getUri() ).cStr() << " expects " << getUri().getDimension1() << ", but received " << m << std::endl;
97  return 0;
98  }
99  blobValue_.setFrom( unit, values, m );
100  return write( blobValue_, timestamp );
101  }
102 
103 
108  template<typename T, size_t M, size_t N>
109  bool write2DArray( const Unit& unit, T( &x )[M][N], const Timestamp& timestamp = Timestamp::NOT_SET_TIME )
110  {
111  if( getUri().getDimensions() != 2 )
112  {
113  std::cerr << "URI " << Str( getUri() ).cStr() << " is not 2D." << std::endl;
114  return 0;
115  }
116  else if( getUri().getDimension1() != M || getUri().getDimension2() != N )
117  {
118  std::cerr << "URI " << Str( getUri() ).cStr() << " expects " << getUri().getDimension1() << "-by-" << getUri().getDimension2() << ", but received " << M << "-by-" << N << std::endl;
119  return 0;
120  }
121  blobValue_.setFrom( unit, x );
122  return write( blobValue_, timestamp );
123  }
124 
129  template<typename T>
130  bool write2DClass( const Unit& unit, I2D<T>& i2d, const Timestamp& timestamp = Timestamp::NOT_SET_TIME )
131  {
132  return write2DPtr( unit, ( const T** ) i2d.getPtr2d(), i2d.getM(), i2d.getN(), timestamp );
133  }
134 
139  template<typename T>
140  bool write2DPtr( const Unit& unit, const T** values, int m, int n, const Timestamp& timestamp = Timestamp::NOT_SET_TIME )
141  {
142  if( getUri().getDimensions() != 2 )
143  {
144  std::cerr << "URI " << Str( getUri() ).cStr() << " is not 2D." << std::endl;
145  return 0;
146  }
147  else if( getUri().getDimension1() != m || getUri().getDimension2() != n )
148  {
149  std::cerr << "URI " << Str( getUri() ).cStr() << " expects " << getUri().getDimension1() << "-by-" << getUri().getDimension2() << ", but received " << m << "-by-" << n << std::endl;
150  return 0;
151  }
152  blobValue_.setFrom( unit, values, m, n );
153  return write( blobValue_, timestamp );
154  }
155 
156 
161  template<typename T, size_t M, size_t N, size_t O>
162  bool write3DArray( const Unit& unit, T( &x )[M][N][O], const Timestamp& timestamp = Timestamp::NOT_SET_TIME )
163  {
164  if( getUri().getDimensions() != 3 )
165  {
166  std::cerr << "URI " << Str( getUri() ).cStr() << " is not 3D." << std::endl;
167  return 0;
168  }
169  else if( getUri().getDimension1() != M || getUri().getDimension2() != N || getUri().getDimension3() != O )
170  {
171  std::cerr << "URI " << Str( getUri() ).cStr() << " expects " << getUri().getDimension1() << "-by-" << getUri().getDimension2() << "-by-" << getUri().getDimension3() << ", but received " << M << "-by-" << N << "-by-" << O << std::endl;
172  return 0;
173  }
174  blobValue_.setFrom( unit, x );
175  return write( blobValue_, timestamp );
176  }
177 
182  template<typename T>
183  bool write3DClass( const Unit& unit, I3D<T>& i3d, const Timestamp& timestamp = Timestamp::NOT_SET_TIME )
184  {
185  return write3DPtr( unit, ( const T*** ) i3d.getPtr3d(), i3d.getM(), i3d.getN(), i3d.getO(), timestamp );
186  }
187 
192  template<typename T>
193  bool write3DPtr( const Unit& unit, const T*** values, int m, int n, int o, const Timestamp& timestamp = Timestamp::NOT_SET_TIME )
194  {
195  if( getUri().getDimensions() != 3 )
196  {
197  std::cerr << "URI " << Str( getUri() ).cStr() << " is not 3D." << std::endl;
198  return 0;
199  }
200  else if( getUri().getDimension1() != m || getUri().getDimension2() != n || getUri().getDimension3() != o )
201  {
202  std::cerr << "URI " << Str( getUri() ).cStr() << " expects " << getUri().getDimension1() << "-by-" << getUri().getDimension2() << "-by-" << getUri().getDimension3() << ", but received " << m << "-by-" << n << "-by-" << o << std::endl;
203  return 0;
204  }
205  blobValue_.setFrom( unit, values, m, n, o );
206  return write( blobValue_, timestamp );
207  }
208 
209 
210 protected:
211 
212  AbstractBlobWriter( const ElementURI& elementUri )
213  : blobValue_( elementUri ) {}
214 
216 
217 
218 private:
219  // Disallow default constructor for abstract base class
221 
222  // Disallow copy constructor
223  AbstractBlobWriter( const AbstractBlobWriter& copyFrom );
224 
225 };
226 
228 {
229 
230 public:
231 
232  virtual ~BlobWriter() {}
233 
234  // Re-implement abstract method from AbstractBlobWriter
235  virtual bool write( const DataValue& value, const Timestamp& timestamp )
236  {
237  return DataWriter::write( value, timestamp );
238  }
239 
240  // Re-implement abstract method from AbstractBlobWriter
241  virtual const ElementURI& getUri( void ) const
242  {
243  return DataWriter::getUri();
244  }
245 
246 protected:
247 
248  friend class Component;
249 
251  DataElement& element,
252  UniversalDataElement* universal,
253  Logger::TimePrecisionType timePrecisionType )
254  : DataWriter( owner, element, universal, timePrecisionType ),
256  {}
257 
258 };
259 
260 
261 #endif /* BLOBWRITER_H_ */
const unsigned short getDimension2() const
Definition: ElementURI.h:136
virtual const ElementURI & getUri(void) const =0
Definition: I3D.h:18
Implementation of a DataElement as a "UniversalDataElement".
Definition: UniversalDataElement.h:29
virtual bool writeBlob(const void *bytes, size_t elements, const Timestamp &timestamp=Timestamp::NOT_SET_TIME)
Simply writes the binary blob ElementURI used to declare this DataWriter should have a BLOB TYPE;...
Definition: BlobWriter.h:46
bool write3DPtr(const Unit &unit, const T ***values, int m, int n, int o, const Timestamp &timestamp=Timestamp::NOT_SET_TIME)
Writes data from the 3-d pointer as a binary blob ElementURI used to declare this DataWriter should h...
Definition: BlobWriter.h:193
const unsigned short getDimension1() const
Definition: ElementURI.h:131
virtual bool write(const Unit &unit, const unsigned char value, const Timestamp &timestamp=Timestamp::NOT_SET_TIME)
Sets the Component's DataValue, with an optional timestamp.
Definition: DataWriter.cpp:71
virtual int getM() const =0
Definition: I1D.h:17
virtual int getM() const =0
virtual ~AbstractBlobWriter()
A DataWriter for writing BlobValues, normally created via Component::newBlobWriter() See below for im...
Definition: BlobWriter.h:34
bool write2DPtr(const Unit &unit, const T **values, int m, int n, const Timestamp &timestamp=Timestamp::NOT_SET_TIME)
Writes data from the 2-d pointer as a binary blob ElementURI used to declare this DataWriter should h...
Definition: BlobWriter.h:140
bool write1DPtr(const Unit &unit, const T *values, int m, const Timestamp &timestamp=Timestamp::NOT_SET_TIME)
Writes data from the 1-d pointer as a binary blob ElementURI used to declare this DataWriter should h...
Definition: BlobWriter.h:87
void setFromRaw(const void *bytes, size_t elements)
Definition: BlobValue.cpp:85
virtual const ElementURI & getUri(void) const
Definition: DataAccessor.cpp:49
A DataValue is an abstract base class for a data value and associated engineering units of the value...
Definition: DataValue.h:35
bool write1DArray(const Unit &unit, T(&x)[M], const Timestamp &timestamp=Timestamp::NOT_SET_TIME)
Writes the array as a binary blob ElementURI used to declare this DataWriter should have a BLOB TYPE;...
Definition: BlobWriter.h:57
A DataAccessor that writes values to the Slate via its associated DataElement.
Definition: DataWriter.h:27
Definition: BlobWriter.h:227
static const Timestamp NOT_SET_TIME
Constant value to represent "no time".
Definition: Timestamp.h:37
const unsigned short getDimension3() const
Definition: ElementURI.h:141
virtual T * getPtr1d()=0
virtual int getN() const =0
virtual bool write(const DataValue &value, const Timestamp &timestamp)=0
virtual int getM() const =0
Replacement for standard template class string.
Definition: Str.h:12
Definition: I2D.h:17
Abstract Base class for software components.
Definition: Component.h:53
Wraps a StrValue as an arbitrary collection of binary values, with units.
Definition: BlobValue.h:26
TimePrecisionType
Definition: Logger.h:37
virtual const ElementURI & getUri(void) const
Definition: BlobWriter.h:241
const char * cStr() const
Definition: Str.h:188
Definition: BlobWriter.h:21
virtual int getO() const =0
virtual bool write(const DataValue &value, const Timestamp &timestamp)
Definition: BlobWriter.h:235
virtual T *** getPtr3d()=0
bool write3DClass(const Unit &unit, I3D< T > &i3d, const Timestamp &timestamp=Timestamp::NOT_SET_TIME)
Writes data from the class that implements as I3D a binary blob ElementURI used to declare this DataW...
Definition: BlobWriter.h:183
Contains the DataWriter class definition.
BlobValue blobValue_
Definition: BlobWriter.h:215
virtual T ** getPtr2d()=0
bool write1DClass(const Unit &unit, I1D< T > &i1d, const Timestamp &timestamp=Timestamp::NOT_SET_TIME)
Writes data from the class that implements as I1D a binary blob ElementURI used to declare this DataW...
Definition: BlobWriter.h:77
virtual ~BlobWriter()
Definition: BlobWriter.h:232
Code unit that represents a unique name for a DataElement.
Definition: ElementURI.h:27
AbstractBlobWriter(const ElementURI &elementUri)
Definition: BlobWriter.h:212
BlobWriter(Component *owner, DataElement &element, UniversalDataElement *universal, Logger::TimePrecisionType timePrecisionType)
Definition: BlobWriter.h:250
void setFrom(const Unit &unit, const T *array, size_t elements)
Definition: BlobValue.cpp:93
bool write2DClass(const Unit &unit, I2D< T > &i2d, const Timestamp &timestamp=Timestamp::NOT_SET_TIME)
Writes data from the class that implements as I2D a binary blob ElementURI used to declare this DataW...
Definition: BlobWriter.h:130
bool write2DArray(const Unit &unit, T(&x)[M][N], const Timestamp &timestamp=Timestamp::NOT_SET_TIME)
Writes the array as a binary blob ElementURI used to declare this DataWriter should have a BLOB TYPE;...
Definition: BlobWriter.h:109
bool write3DArray(const Unit &unit, T(&x)[M][N][O], const Timestamp &timestamp=Timestamp::NOT_SET_TIME)
Writes the array as a binary blob ElementURI used to declare this DataWriter should have a BLOB TYPE;...
Definition: BlobWriter.h:162
Code that represents an engineering unit.
Definition: Unit.h:24
Contains the BlobValue class definition.
Represents absolute times.
Definition: Timestamp.h:31
virtual int getN() const =0
Abstact base class for one "element" of the Slate.
Definition: DataElement.h:37