MI - Fimex
Data.h
Go to the documentation of this file.
1 /*
2  * Fimex
3  *
4  * (C) Copyright 2008, met.no
5  *
6  * Project Info: https://wiki.met.no/fimex/start
7  *
8  * This library is free software; you can redistribute it and/or modify it
9  * under the terms of the GNU Lesser General Public License as published by
10  * the Free Software Foundation; either version 2.1 of the License, or
11  * (at your option) any later version.
12  *
13  * This library is distributed in the hope that it will be useful, but
14  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15  * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
16  * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
21  * USA.
22  */
23 
24 #ifndef DATA_H_
25 #define DATA_H_
26 
27 #include "fimex/DataDecl.h"
28 #include <boost/shared_array.hpp>
29 #include <string>
30 #include <sstream>
31 #include <iostream>
32 #include "fimex/CDMDataType.h"
33 #include "fimex/CDMException.h"
34 #include "fimex/Utils.h"
35 #include "fimex/deprecated.h"
36 
37 namespace MetNoFimex
38 {
42  // forward decl.
43  class UnitsConverter;
44 
48  class Data
49  {
50  public:
51  virtual ~Data() = 0;
52 
54  virtual size_t size() const = 0;
55 
57  virtual int bytes_for_one() const = 0;
58  virtual void* getDataPtr() = 0;
60  virtual void toStream(std::ostream&, std::string separator = "") const = 0;
61 
66  MIFI_DEPRECATED(virtual const boost::shared_array<char> asConstChar() const) = 0;
68  virtual boost::shared_array<char> asChar() const = 0;
73  MIFI_DEPRECATED(virtual const boost::shared_array<short> asConstShort() const) = 0;
75  virtual boost::shared_array<short> asShort() const = 0;
80  MIFI_DEPRECATED(virtual const boost::shared_array<int> asConstInt() const) = 0;
82  virtual boost::shared_array<int> asInt() const = 0;
87  MIFI_DEPRECATED(virtual const boost::shared_array<long long> asConstInt64() const) = 0;
89  virtual boost::shared_array<long long> asInt64() const = 0;
94  MIFI_DEPRECATED(virtual const boost::shared_array<unsigned char> asConstUChar() const) = 0;
96  virtual boost::shared_array<unsigned char> asUChar() const = 0;
98  MIFI_DEPRECATED(virtual const boost::shared_array<unsigned short> asConstUShort() const) = 0;
100  virtual boost::shared_array<unsigned short> asUShort() const = 0;
102  MIFI_DEPRECATED(virtual const boost::shared_array<unsigned int> asConstUInt() const) = 0;
104  virtual boost::shared_array<unsigned int> asUInt() const = 0;
106  MIFI_DEPRECATED(virtual const boost::shared_array<unsigned long long> asConstUInt64() const) = 0;
108  virtual boost::shared_array<unsigned long long> asUInt64() const = 0;
110  MIFI_DEPRECATED(virtual const boost::shared_array<float> asConstFloat() const) = 0;
112  virtual boost::shared_array<float> asFloat() const = 0;
114  MIFI_DEPRECATED(virtual const boost::shared_array<double> asConstDouble() const) = 0;
116  virtual boost::shared_array<double> asDouble() const = 0;
118  virtual boost::shared_array<std::string> asStrings() const = 0;
120  virtual std::string asString(std::string separator = "") const = 0;
121 
122 
128  virtual double getDouble(size_t pos) = 0;
134  virtual long long getLongLong(size_t pos) = 0;
135 
137  virtual void setValue(size_t pos, double val) = 0;
145  virtual void setValues(size_t startPos, const Data& data, size_t first = 0, size_t end = -1) = 0;
150  virtual void setAllValues(double val) = 0;
157  virtual DataPtr clone() const = 0;
172  virtual DataPtr slice(std::vector<size_t> orgDimSize, std::vector<size_t> startDims, std::vector<size_t> outputDimSize) = 0;
176  virtual DataPtr convertDataType(double oldFill, double oldScale, double oldOffset, CDMDataType newType, double newFill, double newScale, double newOffset) = 0;
177 
178  virtual DataPtr convertDataType(double oldFill, double oldScale, double oldOffset, boost::shared_ptr<UnitsConverter> unitConverter, CDMDataType newType, double newFill, double newScale, double newOffset) = 0;
182  virtual CDMDataType getDataType() const = 0;
183  };
184 
193  DataPtr createData(CDMDataType datatype, size_t length, double val = 0);
194 
202  DataPtr createData(size_t length, boost::shared_array<double> array);
210  DataPtr createData(size_t length, boost::shared_array<float> array);
218  DataPtr createData(size_t length, boost::shared_array<int> array);
226  DataPtr createData(size_t length, boost::shared_array<short> array);
234  DataPtr createData(size_t length, boost::shared_array<char> array);
242  DataPtr createData(size_t length, boost::shared_array<unsigned int> array);
250  DataPtr createData(size_t length, boost::shared_array<long long> array);
258  DataPtr createData(size_t length, boost::shared_array<unsigned long long> array);
266  DataPtr createData(size_t length, boost::shared_array<unsigned short> array);
274  DataPtr createData(size_t length, boost::shared_array<unsigned char> array);
282  DataPtr createData(size_t length, boost::shared_array<std::string> array);
283 
292  template<class InputIterator>
293  DataPtr createData(CDMDataType datatype, InputIterator first, InputIterator last);
294 
303  DataPtr createDataSlice(CDMDataType datatype, const Data& data, size_t dataStartPos, size_t dataSize);
304 
305  /* BELOW follow template implementations */
306  template<class InputIterator>
307  DataPtr createData(CDMDataType datatype, InputIterator first, InputIterator last)
308  {
309  size_t length = std::distance(first, last);
310  switch (datatype) {
311  case CDM_DOUBLE: { boost::shared_array<double> ary(new double[length]); std::copy(first, last, ary.get()); return createData(length, ary); }
312  case CDM_FLOAT: { boost::shared_array<float> ary(new float[length]); std::copy(first, last, ary.get()); return createData(length, ary); }
313  case CDM_INT64: { boost::shared_array<long long> ary(new long long[length]); std::copy(first, last, ary.get()); return createData(length, ary); }
314  case CDM_INT: { boost::shared_array<int> ary(new int[length]); std::copy(first, last, ary.get()); return createData(length, ary); }
315  case CDM_SHORT: { boost::shared_array<short> ary(new short[length]); std::copy(first, last, ary.get()); return createData(length, ary); }
316  case CDM_CHAR: { boost::shared_array<char> ary(new char[length]); std::copy(first, last, ary.get()); return createData(length, ary); }
317  case CDM_UINT64: { boost::shared_array<unsigned long long> ary(new unsigned long long[length]); std::copy(first, last, ary.get()); return createData(length, ary); }
318  case CDM_UINT: { boost::shared_array<unsigned int> ary(new unsigned int[length]); std::copy(first, last, ary.get()); return createData(length, ary); }
319  case CDM_USHORT: { boost::shared_array<unsigned short> ary(new unsigned short[length]); std::copy(first, last, ary.get()); return createData(length, ary); }
320  case CDM_UCHAR: { boost::shared_array<unsigned char> ary(new unsigned char[length]); std::copy(first, last, ary.get()); return createData(length, ary); }
321  case CDM_NAT:
322  default: break;
323  }
324  return createData(0, boost::shared_array<char>(new char[0])); // a dummy dataset
325  }
326 
327 }
328 
329 #endif /*DATA_H_*/
virtual ~Data()=0
Definition: CDMDataType.h:38
basic_string< char > string
Definition: CDMDataType.h:40
virtual double getDouble(size_t pos)=0
get a value at the desired position
virtual boost::shared_array< unsigned long long > asUInt64() const =0
retrieve data as uint64
boost::shared_ptr< Data > DataPtr
Definition: DataDecl.h:39
DataPtr createData(CDMDataType datatype, size_t length, double val=0)
create a Data-pointer of the datatype
virtual boost::shared_array< short > asShort() const =0
retrieve data as short
virtual void setValue(size_t pos, double val)=0
set a value at the desired position
Definition: Data.h:48
virtual boost::shared_array< double > asDouble() const =0
retrieve data as double
Definition: CDMDataType.h:36
Definition: CDMDataType.h:43
virtual std::string asString(std::string separator="") const =0
retrieve the whole array as a string (with possible separator)
virtual boost::shared_array< char > asChar() const =0
retrieve data as char
basic_ostream< char > ostream
virtual boost::shared_array< unsigned char > asUChar() const =0
retrieve data as uchar
Definition: CDMDataType.h:44
virtual void setValues(size_t startPos, const Data &data, size_t first=0, size_t end=-1)=0
virtual void toStream(std::ostream &, std::string separator="") const =0
printing of the current data to ostream, with optional separator
Definition: C_CDMReader.h:35
virtual CDMDataType getDataType() const =0
virtual int bytes_for_one() const =0
sizeof the data-impl datatype
virtual DataPtr slice(std::vector< size_t > orgDimSize, std::vector< size_t > startDims, std::vector< size_t > outputDimSize)=0
get a multi-dimensional slice of the data
Definition: CDMDataType.h:37
_OutputIterator copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
virtual boost::shared_array< unsigned short > asUShort() const =0
retrieve data as short
virtual DataPtr clone() const =0
duplicate the data
iterator_traits< _InputIterator >::difference_type distance(_InputIterator __first, _InputIterator __last)
virtual void setAllValues(double val)=0
virtual size_t size() const =0
size of the data
virtual boost::shared_array< unsigned int > asUInt() const =0
retrieve data as uint
virtual DataPtr convertDataType(double oldFill, double oldScale, double oldOffset, CDMDataType newType, double newFill, double newScale, double newOffset)=0
convert the datatype from one type,fill,scale,offset to another
DataPtr createDataSlice(CDMDataType datatype, const Data &data, size_t dataStartPos, size_t dataSize)
create a one-dimensional dataslice from another Data object
virtual boost::shared_array< float > asFloat() const =0
retrieve data as float (eventually copy)
Definition: CDMDataType.h:47
virtual void * getDataPtr()=0
virtual boost::shared_array< int > asInt() const =0
retrieve data as int
Definition: CDMDataType.h:45
Definition: CDMDataType.h:41
Definition: CDMDataType.h:39
CDMDataType
Definition: CDMDataType.h:35
virtual boost::shared_array< long long > asInt64() const =0
retrieve data as int64
MIFI_DEPRECATED(virtual const boost::shared_array< char > asConstChar() const)=0
retrieve data as char
virtual boost::shared_array< std::string > asStrings() const =0
retrieve data as array of strings
Definition: CDMDataType.h:46
virtual long long getLongLong(size_t pos)=0
get a value at the desired position