NexusCPP  3.5.0
nxwriter.hpp
Go to the documentation of this file.
1 //*****************************************************************************
17 //*****************************************************************************
18 
19 #include <typeinfo>
20 
21 //==============================================================================
22 // DatasetWriter
23 //==============================================================================
24 
25 template <>
26 inline void DatasetWriter::SetDataType<int>()
27 {
28  m_NexusDataType = NX_INT32;
29  AdjustSizes<int>();
30 }
31 
32 template <>
33 inline void DatasetWriter::SetDataType<unsigned int>()
34 {
35  m_NexusDataType = NX_UINT32;
36  AdjustSizes<unsigned int>();
37 }
38 
39 template <>
40 inline void DatasetWriter::SetDataType<char>()
41 {
42  m_NexusDataType = NX_INT8;
43  AdjustSizes<char>();
44 }
45 
46 template <>
47 inline void DatasetWriter::SetDataType<unsigned char>()
48 {
49  m_NexusDataType = NX_UINT8;
50  AdjustSizes<unsigned char>();
51 }
52 
53 template <>
54 inline void DatasetWriter::SetDataType<short>()
55 {
56  m_NexusDataType = NX_INT16;
57  AdjustSizes<short>();
58 }
59 
60 template <>
61 inline void DatasetWriter::SetDataType<unsigned short>()
62 {
63  m_NexusDataType = NX_UINT16;
64  AdjustSizes<unsigned short>();
65 }
66 
67 template <>
68 inline void DatasetWriter::SetDataType<long>()
69 {
70  if( sizeof(long) == 4 )
71  {
72  m_NexusDataType = NX_INT32;
73  }
74  else
75  {
76  m_NexusDataType = NX_INT64;
77  }
78  AdjustSizes<long>();
79 }
80 
81 template <>
82 inline void DatasetWriter::SetDataType<unsigned long>()
83 {
84  if( sizeof(unsigned long) == 4 )
85  {
86  m_NexusDataType = NX_UINT32;
87  }
88  else
89  {
90  m_NexusDataType = NX_UINT64;
91  }
92  AdjustSizes<unsigned long>();
93 }
94 
95 #ifndef __x86_64
96 template <>
97 inline void DatasetWriter::SetDataType<yat::int64>()
98 {
99  m_NexusDataType = NX_INT64;
100  AdjustSizes<yat::int64>();
101 }
102 
103 template <>
104 inline void DatasetWriter::SetDataType<yat::uint64>()
105 {
106  m_NexusDataType = NX_UINT64;
107  AdjustSizes<yat::uint64>();
108 }
109 #endif
110 
111 template <>
112 inline void DatasetWriter::SetDataType<float>()
113 {
114  m_NexusDataType = NX_FLOAT32;
115  AdjustSizes<float>();
116 }
117 
118 template <>
119 inline void DatasetWriter::SetDataType<double>()
120 {
121  m_NexusDataType = NX_FLOAT64;
122  AdjustSizes<double>();
123 }
124 
125 template <class TYPE>
126 void DatasetWriter::SetDataType()
127 {
128  throw yat::Exception("UNRECOGNIZED TYPE", "Unable to map <TYPE> to Nexus type", "DatasetWriter::SetDataType");
129 }
130 
131 //------------------------------------------------------------------------------
132 // DatasetWriter::AdjustSizes
133 //------------------------------------------------------------------------------
134 template <class TYPE>
135 void DatasetWriter::AdjustSizes()
136 {
137  m_ulDataItemSize = sizeof(TYPE);
138 
139  for( unsigned int i = 0; i < m_nTotalRank; i++ )
140  {
141  m_ulDataItemSize *= m_aiDataItemDim[i];
142  }
143  yat::int64 totalSize = sizeof(TYPE);
144  for( unsigned int i = 0; i < m_nTotalRank; i++ )
145  {
146  totalSize *= m_aiTotalDim[i];
147  }
148  if( totalSize < 0 )
149  {
150  // The result is negative in case of an unlimited dataset (first dimension fixed to '-1')
151  m_ui64TotalSize = -totalSize;
152  }
153  else
154  {
155  m_ui64TotalSize = totalSize;
156  }
157 }
158 
159 //==============================================================================
160 // GenericDatasetWriter
161 //==============================================================================
162 //------------------------------------------------------------------------------
163 // GenericDatasetWriter:: GenericDatasetWriter
164 //------------------------------------------------------------------------------
165 template <class TYPE>
166 GenericDatasetWriter<TYPE>::GenericDatasetWriter(const DataShape &shapeDataItem, const DataShape &shapeMatrix, yat::uint16 usMaxMB)
167 : DatasetWriter(shapeDataItem, shapeMatrix, usMaxMB)
168 {
169  SetDataType<TYPE>();
170 }
171 
172 //==============================================================================
173 // AxisDatasetWriter
174 //==============================================================================
175 //------------------------------------------------------------------------------
176 // AxisDatasetWriter::AxisDatasetWriter
177 //------------------------------------------------------------------------------
178 template <class TYPE>
180 {
181  // This is a 1D dataset
182  DataShape shapeMatrix;
183  shapeMatrix.push_back(iSize);
184 
185  // Scalar data item => Data Item shape is null
186  SetShapes(g_empty_shape, shapeMatrix);
187  SetDataType<TYPE>();
188 
189  AddIntegerAttribute("order", long(iDim));
190  AddIntegerAttribute("primary", long(iOrder));
191 }
192 
193 //------------------------------------------------------------------------------
194 // AxisDatasetWriter::PushPosition
195 //------------------------------------------------------------------------------
196 template <class TYPE>
198 {
199  PushData((const void *)&TValue);
200 }
201 
202 //==============================================================================
203 // SignalDatasetWriter
204 //==============================================================================
205 //------------------------------------------------------------------------------
206 // SignalDatasetWriter::SignalDatasetWriter
207 //------------------------------------------------------------------------------
208 template <class TYPE>
209 SignalDatasetWriter<TYPE>::SignalDatasetWriter(const DataShape &shapeData, const DataShape &shapeMatrix, int iSignal): DatasetWriter(shapeData, shapeMatrix)
210 {
211  SetShapes(shapeData, shapeMatrix);
212  SetDataType<TYPE>();
213 }
214 
215 //------------------------------------------------------------------------------
216 // SignalDatasetWriter::PushSignal
217 //------------------------------------------------------------------------------
218 template <class TYPE>
220 {
221  PushData((const void *)pValue);
222 }
void PushData(const void *pData, std::size_t nDataCount=1, bool bNoCopy=false)
Push data.
Definition: nxfile.h:150
Definition: nxfile.h:143
void SetShapes(const DataShape &shapeDataItem, const DataShape &shapeMatrix)
Definition: nxfile.h:141
AxisDatasetWriter(int iDim, int iSize, int iOrder=1)
Definition: nxwriter.hpp:179
Definition: nxfile.h:145
Definition: nxfile.h:144
void AddIntegerAttribute(const std::string &strName, long lValue)
Adding integer-type attribute to the NeXus dataset.
Definition: nxfile.h:142
Definition: nxfile.h:147
const DataShape g_empty_shape
SignalDatasetWriter(const DataShape &shapeData, const DataShape &shapeMatrix=g_empty_shape, int iSignal=1)
Definition: nxwriter.hpp:209
void PushPosition(TYPE TValue)
Definition: nxwriter.hpp:197
Definition: nxwriter.h:431
Definition: nxwriter.h:630
std::vector< std::size_t > DataShape
Data shape type.
Definition: nxwriter.h:421
Definition: nxfile.h:148
Definition: nxfile.h:146
void PushSignal(TYPE *pValue)
Definition: nxwriter.hpp:219
Definition: nxfile.h:149