Skip to content

Commit 802c4fb

Browse files
Improve performance of getting property dimension count
Can now get the count of all dimensions of a property using only one method : getValuesCountPerDimensionOfPatch. It is especially more performant in a FETPAPI context where one method call corresponds to one request/response.
1 parent a3c2796 commit 802c4fb

8 files changed

Lines changed: 87 additions & 167 deletions

File tree

src/resqml2/AbstractProperty.cpp

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -525,14 +525,18 @@ gsoap_resqml2_0_1::resqml20__ResqmlPropertyKind AbstractProperty::getEnergistics
525525
throw invalid_argument("The property kind of this property is not an Energistics one.");
526526
}
527527

528-
uint64_t AbstractProperty::getValuesCountOfPatch(unsigned int patchIndex) const
528+
uint64_t AbstractProperty::getValuesCountOfPatch(uint64_t patchIndex) const
529529
{
530-
uint64_t result = 1;
531-
532-
size_t dimCount = getDimensionsCountOfPatch(patchIndex);
533-
for (size_t dimIndex = 0; dimIndex < dimCount; ++dimIndex) {
534-
result *= getValuesCountOfDimensionOfPatch(dimIndex, patchIndex);
535-
}
530+
auto valuescountPerDim = getValuesCountPerDimensionOfPatch(patchIndex);
531+
return std::accumulate(std::begin(valuescountPerDim), std::end(valuescountPerDim), static_cast<uint64_t>(1), std::multiplies<uint64_t>());
532+
}
536533

537-
return result;
534+
uint64_t AbstractProperty::getValuesCountOfDimensionOfPatch(uint64_t dimIndex, uint64_t patchIndex) const
535+
{
536+
return getValuesCountPerDimensionOfPatch(patchIndex).at(dimIndex);
538537
}
538+
539+
uint64_t AbstractProperty::getDimensionsCountOfPatch(uint64_t patchIndex) const
540+
{
541+
return getValuesCountPerDimensionOfPatch(patchIndex).size();
542+
}

src/resqml2/AbstractProperty.h

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,13 @@ namespace RESQML2_NS
101101
*/
102102
DLL_IMPORT_OR_EXPORT virtual COMMON_NS::AbstractObject::numericalDatatypeEnum getValuesHdfDatatype() const = 0;
103103

104+
/**
105+
* Get the number of values in each dimension into the underlying HDF5 dataset.
106+
* uint32_t is returned instead of uint64_t cause of some SWIG usage. I cannot SWIG port std::vector<uint64_t>
107+
* @param patchIndex The index of the patch we want to count the values from.
108+
*/
109+
DLL_IMPORT_OR_EXPORT virtual std::vector<uint32_t> getValuesCountPerDimensionOfPatch(uint64_t patchIndex) const = 0;
110+
104111
/**
105112
* Gets the count of all values contained into the underlying HDF5 dataset of a given patch of
106113
* this property.
@@ -111,7 +118,7 @@ namespace RESQML2_NS
111118
*
112119
* @returns The count of values of the @p patchIndex patch.
113120
*/
114-
DLL_IMPORT_OR_EXPORT uint64_t getValuesCountOfPatch(unsigned int patchIndex) const;
121+
DLL_IMPORT_OR_EXPORT uint64_t getValuesCountOfPatch(uint64_t patchIndex) const;
115122

116123
/**
117124
* Gets the count of values on a specific dimension of the underlying HDF5 dataset of a given
@@ -125,7 +132,7 @@ namespace RESQML2_NS
125132
*
126133
* @returns The count of values in the @p dimIndex dimension of @p patchIndex patch.
127134
*/
128-
DLL_IMPORT_OR_EXPORT virtual uint64_t getValuesCountOfDimensionOfPatch(uint64_t dimIndex, uint64_t patchIndex) const = 0;
135+
DLL_IMPORT_OR_EXPORT uint64_t getValuesCountOfDimensionOfPatch(uint64_t dimIndex, uint64_t patchIndex) const;
129136

130137
/**
131138
* Gets the count of dimensions of the underlying HDF5 dataset of a given patch of this property.
@@ -136,7 +143,7 @@ namespace RESQML2_NS
136143
*
137144
* @returns The number of values, 0 otherwise.
138145
*/
139-
DLL_IMPORT_OR_EXPORT virtual uint64_t getDimensionsCountOfPatch(uint64_t patchIndex) const = 0;
146+
DLL_IMPORT_OR_EXPORT uint64_t getDimensionsCountOfPatch(uint64_t patchIndex) const;
140147

141148
//*********************************************
142149
//************* PROPERTY SET ******************

src/resqml2/AbstractValuesProperty.cpp

Lines changed: 36 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -84,108 +84,70 @@ COMMON_NS::AbstractObject::numericalDatatypeEnum AbstractValuesProperty::getValu
8484
return hdfProxy->getNumericalDatatype(dsPath);
8585
}
8686

87-
uint64_t AbstractValuesProperty::getValuesCountOfDimensionOfPatch(uint64_t dimIndex, uint64_t patchIndex) const
87+
std::vector<uint32_t> AbstractValuesProperty::getValuesCountPerDimensionOfPatch(uint64_t patchIndex) const
8888
{
8989
cannotBePartial();
9090

9191
if (gsoapProxy2_0_1 != nullptr) {
92-
gsoap_resqml2_0_1::resqml20__PatchOfValues* patch = static_cast<gsoap_resqml2_0_1::resqml20__AbstractValuesProperty*>(gsoapProxy2_0_1)->PatchOfValues[patchIndex];
92+
gsoap_resqml2_0_1::resqml20__PatchOfValues const* patch = static_cast<gsoap_resqml2_0_1::resqml20__AbstractValuesProperty*>(gsoapProxy2_0_1)->PatchOfValues[patchIndex];
9393

9494
switch (patch->Values->soap_type()) {
9595
case SOAP_TYPE_gsoap_resqml2_0_1_resqml20__DoubleConstantArray:
9696
{
97-
return static_cast<gsoap_resqml2_0_1::resqml20__DoubleConstantArray*>(patch->Values)->Count;
97+
return std::vector<uint32_t>(1, static_cast<gsoap_resqml2_0_1::resqml20__DoubleConstantArray*>(patch->Values)->Count);
9898
}
9999
case SOAP_TYPE_gsoap_resqml2_0_1_resqml20__DoubleLatticeArray:
100100
{
101-
return static_cast<gsoap_resqml2_0_1::resqml20__DoubleLatticeArray*>(patch->Values)->Offset[dimIndex]->Count + 1;
101+
auto const* arrayDef = static_cast<gsoap_resqml2_0_1::resqml20__DoubleLatticeArray*>(patch->Values);
102+
std::vector<uint32_t> result;
103+
for (auto offset : arrayDef->Offset) {
104+
result.push_back(offset->Count + 1);
105+
}
106+
return result;
102107
}
103108
case SOAP_TYPE_gsoap_resqml2_0_1_resqml20__IntegerConstantArray:
104109
{
105-
return static_cast<gsoap_resqml2_0_1::resqml20__IntegerConstantArray*>(patch->Values)->Count;
110+
return std::vector<uint32_t>(1, static_cast<gsoap_resqml2_0_1::resqml20__IntegerConstantArray*>(patch->Values)->Count);
106111
}
107112
case SOAP_TYPE_gsoap_resqml2_0_1_resqml20__IntegerLatticeArray:
108113
{
109-
return static_cast<gsoap_resqml2_0_1::resqml20__IntegerLatticeArray*>(patch->Values)->Offset[dimIndex]->Count + 1;
114+
auto const* arrayDef = static_cast<gsoap_resqml2_0_1::resqml20__IntegerLatticeArray*>(patch->Values);
115+
std::vector<uint32_t> result;
116+
for (auto offset : arrayDef->Offset) {
117+
result.push_back(offset->Count + 1);
118+
}
119+
return result;
110120
}
111121
}
112122
}
113123
else if (gsoapProxy2_3 != nullptr) {
114-
auto patch = static_cast<gsoap_eml2_3::resqml22__AbstractValuesProperty*>(gsoapProxy2_3)->ValuesForPatch[patchIndex];
124+
auto const* patch = static_cast<gsoap_eml2_3::resqml22__AbstractValuesProperty*>(gsoapProxy2_3)->ValuesForPatch[patchIndex];
115125
switch (patch->soap_type()) {
116126
case SOAP_TYPE_gsoap_eml2_3_eml23__FloatingPointConstantArray:
117127
{
118-
return static_cast<gsoap_eml2_3::eml23__FloatingPointConstantArray*>(patch)->Count;
128+
return std::vector<uint32_t>(1, static_cast<gsoap_eml2_3::eml23__FloatingPointConstantArray const*>(patch)->Count);
119129
}
120130
case SOAP_TYPE_gsoap_eml2_3_eml23__FloatingPointLatticeArray:
121131
{
122-
return static_cast<gsoap_eml2_3::eml23__FloatingPointLatticeArray*>(patch)->Offset[dimIndex]->Count + 1;
123-
}
124-
case SOAP_TYPE_gsoap_eml2_3_eml23__IntegerConstantArray:
125-
{
126-
return static_cast<gsoap_eml2_3::eml23__IntegerConstantArray*>(patch)->Count;
127-
}
128-
case SOAP_TYPE_gsoap_eml2_3_eml23__IntegerLatticeArray:
129-
{
130-
return static_cast<gsoap_eml2_3::eml23__IntegerLatticeArray*>(patch)->Offset[dimIndex]->Count + 1;
131-
}
132-
}
133-
}
134-
else {
135-
throw logic_error("Only RESQML 2.2 and 2.0.1 are supported for now.");
136-
}
137-
138-
int64_t nullValue = (numeric_limits<int64_t>::min)();
139-
std::string dsPath;
140-
EML2_NS::AbstractHdfProxy * hdfProxy = getDatasetOfPatch(patchIndex, nullValue, dsPath);
141-
142-
std::vector<uint32_t> dims = hdfProxy->getElementCountPerDimension(dsPath);
143-
144-
if (dimIndex < dims.size()) {
145-
return dims[dimIndex];
146-
}
147-
148-
throw out_of_range("The dim index to get the count is out of range.");
149-
}
150-
151-
uint64_t AbstractValuesProperty::getDimensionsCountOfPatch(uint64_t patchIndex) const
152-
{
153-
cannotBePartial();
154-
155-
if (gsoapProxy2_0_1 != nullptr) {
156-
gsoap_resqml2_0_1::resqml20__PatchOfValues* patch = static_cast<gsoap_resqml2_0_1::resqml20__AbstractValuesProperty*>(gsoapProxy2_0_1)->PatchOfValues[patchIndex];
157-
158-
switch (patch->Values->soap_type()) {
159-
case SOAP_TYPE_gsoap_resqml2_0_1_resqml20__DoubleConstantArray:
160-
case SOAP_TYPE_gsoap_resqml2_0_1_resqml20__IntegerConstantArray:
161-
{
162-
return 1;
163-
}
164-
case SOAP_TYPE_gsoap_resqml2_0_1_resqml20__DoubleLatticeArray:
165-
{
166-
return static_cast<gsoap_resqml2_0_1::resqml20__DoubleLatticeArray*>(patch->Values)->Offset.size();
132+
auto const* arrayDef = static_cast<gsoap_eml2_3::eml23__FloatingPointLatticeArray const*>(patch);
133+
std::vector<uint32_t> result;
134+
for (auto offset : arrayDef->Offset) {
135+
result.push_back(offset->Count + 1);
136+
}
137+
return result;
167138
}
168-
case SOAP_TYPE_gsoap_resqml2_0_1_resqml20__IntegerLatticeArray:
169-
{
170-
return static_cast<gsoap_resqml2_0_1::resqml20__IntegerLatticeArray*>(patch->Values)->Offset.size();
171-
}
172-
}
173-
}
174-
else if (gsoapProxy2_3 != nullptr) {
175-
auto patch = static_cast<gsoap_eml2_3::resqml22__AbstractValuesProperty*>(gsoapProxy2_3)->ValuesForPatch[patchIndex];
176-
switch (patch->soap_type()) {
177-
case SOAP_TYPE_gsoap_eml2_3_eml23__FloatingPointConstantArray:
178139
case SOAP_TYPE_gsoap_eml2_3_eml23__IntegerConstantArray:
179140
{
180-
return 1;
181-
}
182-
case SOAP_TYPE_gsoap_eml2_3_eml23__FloatingPointLatticeArray:
183-
{
184-
return static_cast<gsoap_eml2_3::eml23__FloatingPointLatticeArray*>(patch)->Offset.size();
141+
return std::vector<uint32_t>(1, static_cast<gsoap_eml2_3::eml23__IntegerConstantArray const*>(patch)->Count);
185142
}
186143
case SOAP_TYPE_gsoap_eml2_3_eml23__IntegerLatticeArray:
187144
{
188-
return static_cast<gsoap_eml2_3::eml23__IntegerLatticeArray*>(patch)->Offset.size();
145+
auto const* arrayDef = static_cast<gsoap_eml2_3::eml23__IntegerLatticeArray const*>(patch);
146+
std::vector<uint32_t> result;
147+
for (auto offset : arrayDef->Offset) {
148+
result.push_back(offset->Count + 1);
149+
}
150+
return result;
189151
}
190152
}
191153
}
@@ -195,19 +157,15 @@ uint64_t AbstractValuesProperty::getDimensionsCountOfPatch(uint64_t patchIndex)
195157

196158
int64_t nullValue = (numeric_limits<int64_t>::min)();
197159
std::string dsPath;
198-
EML2_NS::AbstractHdfProxy * hdfProxy = getDatasetOfPatch(patchIndex, nullValue, dsPath);
160+
EML2_NS::AbstractHdfProxy* hdfProxy = getDatasetOfPatch(patchIndex, nullValue, dsPath);
199161

200-
return hdfProxy->getDimensionCount(dsPath);
162+
return hdfProxy->getElementCountPerDimension(dsPath);
201163
}
202164

203-
EML2_NS::AbstractHdfProxy * AbstractValuesProperty::getDatasetOfPatch(uint64_t patchIndex, int64_t & nullValue, std::string & dsPath) const
165+
EML2_NS::AbstractHdfProxy * AbstractValuesProperty::getDatasetOfPatch(uint64_t patchIndex, int64_t& nullValue, std::string& dsPath) const
204166
{
205-
if (patchIndex >= getPatchCount()) {
206-
throw out_of_range("The values property patch is out of range");
207-
}
208-
209167
if (gsoapProxy2_0_1 != nullptr) {
210-
gsoap_resqml2_0_1::resqml20__PatchOfValues* patch = static_cast<gsoap_resqml2_0_1::resqml20__AbstractValuesProperty*>(gsoapProxy2_0_1)->PatchOfValues[patchIndex];
168+
gsoap_resqml2_0_1::resqml20__PatchOfValues const* patch = static_cast<gsoap_resqml2_0_1::resqml20__AbstractValuesProperty*>(gsoapProxy2_0_1)->PatchOfValues.at(patchIndex);
211169

212170
nullValue = (numeric_limits<int64_t>::min)();
213171
int valuesType = patch->Values->soap_type();
@@ -234,7 +192,7 @@ EML2_NS::AbstractHdfProxy * AbstractValuesProperty::getDatasetOfPatch(uint64_t p
234192
}
235193
else if (gsoapProxy2_3 != nullptr) {
236194
nullValue = (numeric_limits<int64_t>::min)();
237-
auto patch = static_cast<gsoap_eml2_3::resqml22__AbstractValuesProperty*>(gsoapProxy2_3)->ValuesForPatch[patchIndex];
195+
auto patch = static_cast<gsoap_eml2_3::resqml22__AbstractValuesProperty*>(gsoapProxy2_3)->ValuesForPatch.at(patchIndex);
238196
if (dynamic_cast<gsoap_eml2_3::eml23__FloatingPointExternalArray*>(patch) != nullptr) {
239197
dsPath = static_cast<gsoap_eml2_3::eml23__FloatingPointExternalArray*>(patch)->Values->ExternalDataArrayPart[0]->PathInExternalFile;
240198
return getOrCreateHdfProxyFromDataArrayPart(static_cast<gsoap_eml2_3::eml23__FloatingPointExternalArray*>(patch)->Values->ExternalDataArrayPart[0]);

src/resqml2/AbstractValuesProperty.h

Lines changed: 3 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -51,29 +51,11 @@ namespace RESQML2_NS
5151
DLL_IMPORT_OR_EXPORT COMMON_NS::AbstractObject::numericalDatatypeEnum getValuesHdfDatatype() const final;
5252

5353
/**
54-
* Gets the count of values on a specific dimension of the underlying HDF5 dataset of a given
55-
* patch of this property.
56-
*
57-
* @exception std::out_of_range If @p dimIndex is strictly greater than dimension count.
58-
* @exception std::range_error If @p patchIndex is strictly greater than patch count.
59-
*
60-
* @param dimIndex The index of the dimension we want to count the values from.
54+
* Get the number of values in each dimension into the underlying HDF5 dataset.
55+
* uint32_t is returned instead of uint64_t cause of some SWIG usage. I cannot SWIG port std::vector<uint64_t>
6156
* @param patchIndex The index of the patch we want to count the values from.
62-
*
63-
* @returns The count of values in the @p dimIndex dimension of @p patchIndex patch.
64-
*/
65-
DLL_IMPORT_OR_EXPORT uint64_t getValuesCountOfDimensionOfPatch(uint64_t dimIndex, uint64_t patchIndex) const final;
66-
67-
/**
68-
* Gets the count of dimensions of the underlying HDF5 dataset of a given patch of this property.
69-
*
70-
* @exception std::range_error If @p patchIndex is strictly greater than patch count.
71-
*
72-
* @param patchIndex The index of the patch we want to count the dimensions from.
73-
*
74-
* @returns The number of values, 0 otherwise.
7557
*/
76-
DLL_IMPORT_OR_EXPORT uint64_t getDimensionsCountOfPatch(uint64_t patchIndex) const final;
58+
DLL_IMPORT_OR_EXPORT std::vector<uint32_t> getValuesCountPerDimensionOfPatch(uint64_t patchIndex) const final;
7759

7860
/**
7961
* Pushes back a new facet to this instance. Facets are qualifiers for property values which

src/resqml2/PointsProperty.cpp

Lines changed: 7 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,7 @@ const char* PointsProperty::XML_TAG = "PointsProperty";
2828

2929
COMMON_NS::AbstractObject::numericalDatatypeEnum PointsProperty::getValuesHdfDatatype() const
3030
{
31-
if (isPartial()) {
32-
throw logic_error("You cannot get values from a partial property.");
33-
}
31+
cannotBePartial();
3432

3533
int64_t nullValue = (numeric_limits<int64_t>::min)();
3634
std::string dsPath;
@@ -39,36 +37,15 @@ COMMON_NS::AbstractObject::numericalDatatypeEnum PointsProperty::getValuesHdfDat
3937
return hdfProxy->getNumericalDatatype(dsPath);
4038
}
4139

42-
uint64_t PointsProperty::getValuesCountOfDimensionOfPatch(uint64_t dimIndex, uint64_t patchIndex) const
40+
std::vector<uint32_t> PointsProperty::getValuesCountPerDimensionOfPatch(uint64_t patchIndex) const
4341
{
44-
if (isPartial()) {
45-
throw logic_error("You cannot get values from a partial property.");
46-
}
47-
48-
int64_t nullValue = (numeric_limits<int64_t>::min)();
49-
std::string dsPath;
50-
EML2_NS::AbstractHdfProxy * hdfProxy = getDatasetOfPatch(patchIndex, nullValue, dsPath);
51-
52-
std::vector<uint32_t> dims = hdfProxy->getElementCountPerDimension(dsPath);
53-
54-
if (dimIndex < dims.size()) {
55-
return dims[dimIndex];
56-
}
57-
58-
throw out_of_range("The dim index to get the count is out of range.");
59-
}
60-
61-
uint64_t PointsProperty::getDimensionsCountOfPatch(uint64_t patchIndex) const
62-
{
63-
if (isPartial()) {
64-
throw logic_error("You cannot get values from a partial property.");
65-
}
42+
cannotBePartial();
6643

6744
int64_t nullValue = (numeric_limits<int64_t>::min)();
6845
std::string dsPath;
69-
EML2_NS::AbstractHdfProxy * hdfProxy = getDatasetOfPatch(patchIndex, nullValue, dsPath);
46+
EML2_NS::AbstractHdfProxy* hdfProxy = getDatasetOfPatch(patchIndex, nullValue, dsPath);
7047

71-
return hdfProxy->getDimensionCount(dsPath);
48+
return hdfProxy->getElementCountPerDimension(dsPath);
7249
}
7350

7451
uint64_t PointsProperty::getXyzPointCountOfAllPatches() const
@@ -140,13 +117,13 @@ void PointsProperty::pushBackArray3dOfXyzPoints(const double * points, uint64_t
140117
pushBackArrayOfXyzPoints(points, pointCountPerDimension, 3, proxy);
141118
}
142119

143-
void PointsProperty::pushBackArrayOfXyzPoints(double const * points, uint64_t const * pointCountByDimension, unsigned int numArrayDimensions, EML2_NS::AbstractHdfProxy * proxy)
120+
void PointsProperty::pushBackArrayOfXyzPoints(double const * points, uint64_t const * pointCountByDimension, uint32_t numArrayDimensions, EML2_NS::AbstractHdfProxy * proxy)
144121
{
145122
const string datasetName = "points_patch" + std::to_string(getPatchCount());
146123

147124
// HDF
148125
std::unique_ptr<uint64_t[]> coordinateCountByDimension(new uint64_t[numArrayDimensions + 1]);
149-
for (unsigned int i = 0; i < numArrayDimensions; ++i) {
126+
for (size_t i = 0; i < numArrayDimensions; ++i) {
150127
coordinateCountByDimension[i] = pointCountByDimension[i];
151128
}
152129
coordinateCountByDimension[numArrayDimensions] = 3; // For the XYZ triplet

src/resqml2/PointsProperty.h

Lines changed: 4 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -40,29 +40,11 @@ namespace RESQML2_NS
4040
DLL_IMPORT_OR_EXPORT COMMON_NS::AbstractObject::numericalDatatypeEnum getValuesHdfDatatype() const final;
4141

4242
/**
43-
* Gets the count of values on a specific dimension of the underlying HDF5 dataset of a given
44-
* patch of this property.
45-
*
46-
* @exception std::out_of_range If @p dimIndex is strictly greater than dimension count.
47-
* @exception std::range_error If @p patchIndex is strictly greater than patch count.
48-
*
49-
* @param dimIndex The index of the dimension we want to count the values from.
43+
* Get the number of values in each dimension into the underlying HDF5 dataset.
44+
* uint32_t is returned instead of uint64_t cause of some SWIG usage. I cannot SWIG port std::vector<uint64_t>
5045
* @param patchIndex The index of the patch we want to count the values from.
51-
*
52-
* @returns The count of values in the @p dimIndex dimension of @p patchIndex patch.
53-
*/
54-
DLL_IMPORT_OR_EXPORT uint64_t getValuesCountOfDimensionOfPatch(uint64_t dimIndex, uint64_t patchIndex) const final;
55-
56-
/**
57-
* Gets the count of dimensions of the underlying HDF5 dataset of a given patch of this property.
58-
*
59-
* @exception std::range_error If @p patchIndex is strictly greater than patch count.
60-
*
61-
* @param patchIndex The index of the patch we want to count the dimensions from.
62-
*
63-
* @returns The number of values, 0 otherwise.
6446
*/
65-
DLL_IMPORT_OR_EXPORT uint64_t getDimensionsCountOfPatch(uint64_t patchIndex) const final;
47+
DLL_IMPORT_OR_EXPORT std::vector<uint32_t> getValuesCountPerDimensionOfPatch(uint64_t patchIndex) const final;
6648

6749
/**
6850
* Get the xyz point count in a given patch of this property.
@@ -211,7 +193,7 @@ namespace RESQML2_NS
211193
* then a default HDF proxy must be defined in the
212194
* repository.
213195
*/
214-
DLL_IMPORT_OR_EXPORT void pushBackArrayOfXyzPoints(double const * xyzPoints, uint64_t const * pointCountByDimension, unsigned int numArrayDimensions, EML2_NS::AbstractHdfProxy* proxy = nullptr);
196+
DLL_IMPORT_OR_EXPORT void pushBackArrayOfXyzPoints(double const * xyzPoints, uint64_t const * pointCountByDimension, uint32_t numArrayDimensions, EML2_NS::AbstractHdfProxy* proxy = nullptr);
215197

216198
/**
217199
* Pushes back a reference to an existing (or a "to exist") HDF dataset in a particular HDF

0 commit comments

Comments
 (0)