1818
1919namespace openPMD ::internal
2020{
21+ template <typename RecordType, typename GetDefaultValue>
22+ template <typename S>
23+ auto ConfigAttribute<RecordType, GetDefaultValue>::withSetter(
24+ SetterType<S> setter)
25+ && -> ConfigAttributeWithSetter<RecordType, GetDefaultValue, SetterType<S>>
26+ {
27+ return ConfigAttributeWithSetter<
28+ RecordType,
29+ GetDefaultValue,
30+ SetterType<S>>{std::move (*this ), setter};
31+ }
32+
2133template <typename Child>
2234auto ScientificDefaults<Child>::asChild() -> Child &
2335{
@@ -189,19 +201,21 @@ void ScientificDefaults<Child>::addDefaults()
189201
190202 if constexpr (std::is_same_v<Child, Iteration>)
191203 {
192- addDefaultFor (" time" , 0 ., &Iteration::setTime);
193- addDefaultFor (" dt" , 1 ., &Iteration::setDt);
194- addDefaultFor (" timeUnitSI" , 1.0 , &Iteration::setTimeUnitSI);
204+ defaultAttribute (" time" , 0 .).withSetter (&Iteration::setTime)();
205+ defaultAttribute (" dt" , 1 .).withSetter (&Iteration::setDt)();
206+ defaultAttribute (" timeUnitSI" , 1.0 )
207+ .withSetter (&Iteration::setTimeUnitSI)();
195208 }
196209 else if constexpr (std::is_same_v<Child, Mesh>)
197210 {
198211 auto dimensionality = asChild ().retrieveDimensionality ();
199212
200- addDefaultFor (" timeOffset" , 0 .f , &Mesh::setTimeOffset);
201- addDefaultFor (
202- " geometry" , Mesh::Geometry::cartesian, &Mesh::setGeometry);
203- addDefaultFor (" dataOrder" , Mesh::DataOrder::C, &Mesh::setDataOrder);
204- addDefaultFor<std::vector<std::string> const &>(
213+ defaultAttribute (" timeOffset" , 0 .f ).withSetter (&Mesh::setTimeOffset)();
214+ defaultAttribute (" geometry" , Mesh::Geometry::cartesian)
215+ .withSetter (&Mesh::setGeometry)();
216+ defaultAttribute (" dataOrder" , Mesh::DataOrder::C)
217+ .withSetter (&Mesh::setDataOrder)();
218+ defaultAttribute (
205219 " axisLabels" ,
206220 [&]() -> std::vector<std::string> {
207221 switch (dimensionality)
@@ -233,9 +247,10 @@ void ScientificDefaults<Child>::addDefaults()
233247 }
234248 }
235249 return std::vector<std::string>{" x" , " y" , " z" };
236- },
237- &Mesh::setAxisLabels);
238- addDefaultFor<std::vector<double > const &>(
250+ })
251+ .template withSetter <std::vector<std::string> const &> (
252+ &Mesh::setAxisLabels)();
253+ defaultAttribute (
239254 " gridSpacing" ,
240255 [&]() {
241256 if (dimensionality < 100 )
@@ -246,9 +261,10 @@ void ScientificDefaults<Child>::addDefaults()
246261 {
247262 return std::vector<double >{1.0 };
248263 }
249- },
250- &Mesh::setGridSpacing);
251- addDefaultFor<std::vector<double > const &>(
264+ })
265+ .template withSetter <std::vector<double > const &> (
266+ &Mesh::setGridSpacing)();
267+ defaultAttribute (
252268 " gridGlobalOffset" ,
253269 [&]() {
254270 if (dimensionality < 100 )
@@ -259,14 +275,16 @@ void ScientificDefaults<Child>::addDefaults()
259275 {
260276 return std::vector<double >{0.0 };
261277 }
262- },
263- &Mesh::setGridGlobalOffset);
278+ })
279+ .template withSetter <std::vector<double > const &> (
280+ &Mesh::setGridGlobalOffset)();
264281
265282 addParentDefaults<BaseRecord<MeshRecordComponent>>();
266283 }
267284 else if constexpr (std::is_same_v<Child, Record>)
268285 {
269- addDefaultFor (" timeOffset" , 0 .f , &Record::setTimeOffset);
286+ defaultAttribute (" timeOffset" , 0 .f )
287+ .withSetter (&Record::setTimeOffset)();
270288 auto const &keyInParent = asChild ().writable ().ownKeyWithinParent ;
271289
272290 if (keyInParent == " position" || keyInParent == " positionOffset" )
@@ -287,25 +305,23 @@ void ScientificDefaults<Child>::addDefaults()
287305 }
288306 else if constexpr (std::is_same_v<Child, RecordComponent>)
289307 {
290- addDefaultFor (" unitSI" , 1.0 , &RecordComponent::setUnitSI);
308+ defaultAttribute (" unitSI" , 1.0 )
309+ .withSetter (&RecordComponent::setUnitSI)();
291310 }
292311 else if constexpr (std::is_same_v<Child, MeshRecordComponent>)
293312 {
294313 // position
295314 auto dimensionality = asChild ().getDimensionality ();
296- addDefaultFor (
297- " position" ,
298- [&]() {
299- if (dimensionality < 100 )
300- {
301- return std::vector<double >(dimensionality, 0.5 );
302- }
303- else
304- {
305- return std::vector<double >{0.0 };
306- }
307- },
308- &MeshRecordComponent::setPosition);
315+ defaultAttribute (" position" , [&]() {
316+ if (dimensionality < 100 )
317+ {
318+ return std::vector<double >(dimensionality, 0.5 );
319+ }
320+ else
321+ {
322+ return std::vector<double >{0.0 };
323+ }
324+ }).withSetter (&MeshRecordComponent::setPosition)();
309325 addParentDefaults<RecordComponent>();
310326 }
311327 else if constexpr (std::is_same_v<Child, PatchRecordComponent>)
0 commit comments