libSplash
DomainData.hpp
1 
23 #ifndef DOMAINDATA_HPP
24 #define DOMAINDATA_HPP
25 
26 #include <sstream>
27 #include <cassert>
28 #include <string>
29 #include <hdf5.h>
30 
31 #include "splash/Dimensions.hpp"
32 #include "splash/domains/Domain.hpp"
33 #include "splash/core/DCDataSet.hpp"
34 
35 namespace splash
36 {
37 
41  typedef struct
42  {
43  int dataClass;
44  hid_t handle;
45  int32_t id;
46  std::string name;
47  Dimensions dstBuffer;
48  Dimensions dstOffset;
49  Dimensions srcSize;
50  Dimensions srcOffset;
51  } DomainH5Ref;
52 
56  class DomainData : public Domain
57  {
58  public:
59 
69  DomainData(const Domain& domain_, const Dimensions elements_,
70  size_t datatypeSize_, DCDataType datatype_) :
71  Domain(domain_),
72  elements(elements_),
73  data(NULL),
74  loadingReference(NULL),
75  datatype(datatype_),
76  datatypeSize(datatypeSize_)
77  {
78  data = new uint8_t[datatypeSize * elements.getScalarSize()];
79  assert(data != NULL);
80  }
81 
86  virtual ~DomainData()
87  {
88  if (loadingReference != NULL)
89  {
90  delete loadingReference;
91  loadingReference = NULL;
92  }
93 
94  freeData();
95  }
96 
103  {
104  return elements;
105  }
106 
113  void* getData()
114  {
115  return data;
116  }
117 
121  void freeData()
122  {
123  if (data != NULL)
124  {
125  delete[] data;
126  data = NULL;
127  }
128  }
129 
135  size_t getTypeSize()
136  {
137  return datatypeSize;
138  }
139 
146  {
147  return datatype;
148  }
149 
153  void setLoadingReference(int dataClass, hid_t handle, int32_t id,
154  const char *name, const Dimensions dstBuffer,
155  const Dimensions dstOffset, const Dimensions srcSize,
156  const Dimensions srcOffset)
157  {
158  if (loadingReference != NULL)
159  {
160  delete loadingReference;
161  loadingReference = NULL;
162  }
163 
164  loadingReference = new DomainH5Ref();
165  loadingReference->dataClass = dataClass;
166  loadingReference->handle = handle;
167  loadingReference->id = id;
168  loadingReference->name = name;
169  loadingReference->dstBuffer.set(dstBuffer);
170  loadingReference->dstOffset.set(dstOffset);
171  loadingReference->srcSize.set(srcSize);
172  loadingReference->srcOffset.set(srcOffset);
173  }
174 
181  {
182  return loadingReference;
183  }
184 
192  std::string getFormatString() throw (DCException)
193  {
194  std::stringstream format_string;
195  format_string << "%";
196 
197  switch (datatype)
198  {
199  case DCDT_FLOAT32:
200  case DCDT_FLOAT64:
201  format_string << "f";
202  break;
203  case DCDT_UINT32:
204  format_string << "u";
205  break;
206  case DCDT_UINT64:
207  format_string << "lu";
208  break;
209  case DCDT_INT32:
210  format_string << "d";
211  break;
212  case DCDT_INT64:
213  format_string << "ld";
214  break;
215  default:
216  throw DCException("cannot identify datatype");
217  }
218 
219  return format_string.str();
220  }
221 
222  protected:
223  Dimensions elements;
224  uint8_t* data;
225  DomainH5Ref *loadingReference;
226 
227  DCDataType datatype;
228  size_t datatypeSize;
229  };
230 
231 }
232 
233 #endif /* DOMAINDATA_HPP */
DomainH5Ref * getLoadingReference()
Definition: DomainData.hpp:180
DomainData(const Domain &domain_, const Dimensions elements_, size_t datatypeSize_, DCDataType datatype_)
Definition: DomainData.hpp:69
void set(hsize_t x, hsize_t y, hsize_t z)
Definition: Dimensions.hpp:230
void setLoadingReference(int dataClass, hid_t handle, int32_t id, const char *name, const Dimensions dstBuffer, const Dimensions dstOffset, const Dimensions srcSize, const Dimensions srcOffset)
Definition: DomainData.hpp:153
std::string getFormatString()
Definition: DomainData.hpp:192
size_t getScalarSize() const
Definition: Dimensions.hpp:219
Dimensions & getElements()
Definition: DomainData.hpp:102
DCDataType getDataType()
Definition: DomainData.hpp:145
virtual ~DomainData()
Definition: DomainData.hpp:86