22
22
#include " openPMD/IO/JSON/JSONIOHandlerImpl.hpp"
23
23
#include " openPMD/Datatype.hpp"
24
24
#include " openPMD/DatatypeHelpers.hpp"
25
+ #include " openPMD/Error.hpp"
25
26
#include " openPMD/auxiliary/Filesystem.hpp"
26
27
#include " openPMD/auxiliary/Memory.hpp"
27
28
#include " openPMD/auxiliary/StringManip.hpp"
@@ -200,20 +201,30 @@ void JSONIOHandlerImpl::createDataset(
200
201
setAndGetFilePosition (writable, name);
201
202
auto &dset = jsonVal[name];
202
203
dset[" datatype" ] = datatypeToString (parameter.dtype );
203
- switch (parameter.dtype )
204
+
205
+ switch (m_mode)
204
206
{
205
- case Datatype::CFLOAT:
206
- case Datatype::CDOUBLE:
207
- case Datatype::CLONG_DOUBLE: {
208
- auto complexExtent = parameter.extent ;
209
- complexExtent.push_back (2 );
210
- dset[" data" ] = initializeNDArray (complexExtent);
207
+ case IOMode::Dataset: {
208
+ auto extent = parameter.extent ;
209
+ switch (parameter.dtype )
210
+ {
211
+ case Datatype::CFLOAT:
212
+ case Datatype::CDOUBLE:
213
+ case Datatype::CLONG_DOUBLE: {
214
+ extent.push_back (2 );
215
+ break ;
216
+ }
217
+ default :
218
+ break ;
219
+ }
220
+ dset[" data" ] = initializeNDArray (extent);
211
221
break ;
212
222
}
213
- default :
214
- dset[" data " ] = initializeNDArray ( parameter.extent ) ;
223
+ case IOMode::Template :
224
+ dset[" extent " ] = parameter.extent ;
215
225
break ;
216
226
}
227
+
217
228
writable->written = true ;
218
229
m_dirty.emplace (file);
219
230
}
@@ -254,7 +265,7 @@ void JSONIOHandlerImpl::extendDataset(
254
265
255
266
try
256
267
{
257
- auto datasetExtent = getExtent (j);
268
+ auto datasetExtent = getExtent (j, m_mode );
258
269
VERIFY_ALWAYS (
259
270
datasetExtent.size () == parameters.extent .size (),
260
271
" [JSON] Cannot change dimensionality of a dataset" )
@@ -271,27 +282,33 @@ void JSONIOHandlerImpl::extendDataset(
271
282
throw std::runtime_error (
272
283
" [JSON] The specified location contains no valid dataset" );
273
284
}
274
- switch (stringToDatatype (j[" datatype" ].get <std::string>()))
285
+
286
+ switch (m_mode)
275
287
{
276
- case Datatype::CFLOAT:
277
- case Datatype::CDOUBLE:
278
- case Datatype::CLONG_DOUBLE: {
279
- // @todo test complex resizing
280
- auto complexExtent = parameters.extent ;
281
- complexExtent.push_back (2 );
282
- nlohmann::json newData = initializeNDArray (complexExtent);
283
- nlohmann::json &oldData = j[" data" ];
284
- mergeInto (newData, oldData);
285
- j[" data" ] = newData;
288
+ case IOMode::Template:
289
+ j[" extent" ] = parameters.extent ;
286
290
break ;
287
- }
288
- default :
289
- nlohmann::json newData = initializeNDArray (parameters.extent );
291
+ case IOMode::Dataset: {
292
+ auto extent = parameters.extent ;
293
+ switch (stringToDatatype (j[" datatype" ].get <std::string>()))
294
+ {
295
+ case Datatype::CFLOAT:
296
+ case Datatype::CDOUBLE:
297
+ case Datatype::CLONG_DOUBLE: {
298
+ extent.push_back (2 );
299
+ break ;
300
+ }
301
+ default :
302
+ // nothing to do
303
+ break ;
304
+ }
305
+ nlohmann::json newData = initializeNDArray (extent);
290
306
nlohmann::json &oldData = j[" data" ];
291
307
mergeInto (newData, oldData);
292
308
j[" data" ] = newData;
293
309
break ;
294
310
}
311
+ }
295
312
writable->written = true ;
296
313
}
297
314
@@ -583,7 +600,7 @@ void JSONIOHandlerImpl::openDataset(
583
600
584
601
*parameters.dtype =
585
602
Datatype (stringToDatatype (datasetJson[" datatype" ].get <std::string>()));
586
- *parameters.extent = getExtent (datasetJson);
603
+ *parameters.extent = getExtent (datasetJson, m_mode );
587
604
writable->written = true ;
588
605
}
589
606
@@ -762,6 +779,15 @@ void JSONIOHandlerImpl::writeDataset(
762
779
m_handler->m_backendAccess != Access::READ_ONLY,
763
780
" [JSON] Cannot write data in read-only mode." );
764
781
782
+ switch (m_mode)
783
+ {
784
+ case IOMode::Template:
785
+ throw error::WrongAPIUsage (
786
+ " Cannot write chunks in Template mode of JSON backend." );
787
+ case IOMode::Dataset:
788
+ break ;
789
+ }
790
+
765
791
auto pos = setAndGetFilePosition (writable);
766
792
auto file = refreshFileFromParent (writable);
767
793
auto &j = obtainJsonContents (writable);
@@ -805,6 +831,15 @@ void JSONIOHandlerImpl::writeAttribute(
805
831
void JSONIOHandlerImpl::readDataset (
806
832
Writable *writable, Parameter<Operation::READ_DATASET> ¶meters)
807
833
{
834
+ switch (m_mode)
835
+ {
836
+ case IOMode::Template:
837
+ throw error::WrongAPIUsage (
838
+ " Cannot write chunks in Template mode of JSON backend." );
839
+ case IOMode::Dataset:
840
+ break ;
841
+ }
842
+
808
843
refreshFileFromParent (writable);
809
844
setAndGetFilePosition (writable);
810
845
auto &j = obtainJsonContents (writable);
@@ -1043,25 +1078,34 @@ nlohmann::json JSONIOHandlerImpl::initializeNDArray(Extent const &extent)
1043
1078
return *accum_ptr;
1044
1079
}
1045
1080
1046
- Extent JSONIOHandlerImpl::getExtent (nlohmann::json &j)
1081
+ Extent JSONIOHandlerImpl::getExtent (nlohmann::json &j, IOMode mode )
1047
1082
{
1048
1083
Extent res;
1049
- nlohmann::json *ptr = &j[" data" ];
1050
- while (ptr->is_array ())
1084
+ switch (mode)
1051
1085
{
1052
- res.push_back (ptr->size ());
1053
- ptr = &(*ptr)[0 ];
1086
+ case IOMode::Dataset: {
1087
+ nlohmann::json *ptr = &j[" data" ];
1088
+ while (ptr->is_array ())
1089
+ {
1090
+ res.push_back (ptr->size ());
1091
+ ptr = &(*ptr)[0 ];
1092
+ }
1093
+ switch (stringToDatatype (j[" datatype" ].get <std::string>()))
1094
+ {
1095
+ case Datatype::CFLOAT:
1096
+ case Datatype::CDOUBLE:
1097
+ case Datatype::CLONG_DOUBLE:
1098
+ // the last "dimension" is only the two entries for the complex
1099
+ // number, so remove that again
1100
+ res.erase (res.end () - 1 );
1101
+ break ;
1102
+ default :
1103
+ break ;
1104
+ }
1054
1105
}
1055
- switch (stringToDatatype (j[" datatype" ].get <std::string>()))
1056
- {
1057
- case Datatype::CFLOAT:
1058
- case Datatype::CDOUBLE:
1059
- case Datatype::CLONG_DOUBLE:
1060
- // the last "dimension" is only the two entries for the complex
1061
- // number, so remove that again
1062
- res.erase (res.end () - 1 );
1063
- break ;
1064
- default :
1106
+ break ;
1107
+ case IOMode::Template:
1108
+ res = j[" extent" ].get <Extent>();
1065
1109
break ;
1066
1110
}
1067
1111
return res;
@@ -1258,8 +1302,8 @@ bool JSONIOHandlerImpl::isDataset(nlohmann::json const &j)
1258
1302
{
1259
1303
return false ;
1260
1304
}
1261
- auto i = j.find (" data " );
1262
- return i != j.end () && i.value ().is_array ();
1305
+ auto i = j.find (" datatype " );
1306
+ return i != j.end () && i.value ().is_string ();
1263
1307
}
1264
1308
1265
1309
bool JSONIOHandlerImpl::isGroup (nlohmann::json::const_iterator it)
@@ -1270,8 +1314,9 @@ bool JSONIOHandlerImpl::isGroup(nlohmann::json::const_iterator it)
1270
1314
{
1271
1315
return false ;
1272
1316
}
1273
- auto i = j.find (" data" );
1274
- return i == j.end () || !i.value ().is_array ();
1317
+
1318
+ auto i = j.find (" datatype" );
1319
+ return i == j.end () || !i.value ().is_string ();
1275
1320
}
1276
1321
1277
1322
template <typename Param>
@@ -1284,7 +1329,7 @@ void JSONIOHandlerImpl::verifyDataset(
1284
1329
1285
1330
try
1286
1331
{
1287
- auto datasetExtent = getExtent (j);
1332
+ auto datasetExtent = getExtent (j, m_mode );
1288
1333
VERIFY_ALWAYS (
1289
1334
datasetExtent.size () == parameters.extent .size (),
1290
1335
" [JSON] Read/Write request does not fit the dataset's dimension" );
0 commit comments