@@ -59,6 +59,92 @@ namespace
5959 a.getVariant <attribute_types>());
6060 return std::cerr;
6161 }
62+
63+ // Helper function to set geometry based on string value
64+ inline void setMeshGeometryFromString (Mesh &mesh, std::string val)
65+ {
66+ if (" cartesian" == val)
67+ mesh.setGeometry (Mesh::Geometry::cartesian);
68+ else if (" thetaMode" == val)
69+ mesh.setGeometry (Mesh::Geometry::thetaMode);
70+ else if (" cylindrical" == val)
71+ mesh.setGeometry (Mesh::Geometry::cylindrical);
72+ else if (" spherical" == val)
73+ mesh.setGeometry (Mesh::Geometry::spherical);
74+ else
75+ mesh.setGeometry (std::move (val));
76+ }
77+
78+ // Helper function to set data order based on char value
79+ inline auto setMeshDataOrderFromChar (Mesh &mesh, char val)
80+ -> std::optional<error::ReadError>
81+ {
82+ if (val == ' C' || val == ' F' )
83+ {
84+ mesh.setDataOrder (static_cast <Mesh::DataOrder>(val));
85+ return std::nullopt ;
86+ }
87+ else
88+ {
89+ return error::ReadError (
90+ error::AffectedObject::Attribute,
91+ error::Reason::UnexpectedContent,
92+ std::nullopt ,
93+ " Data order must be either C or F." );
94+ }
95+ }
96+
97+ // Helper function to create default axis labels based on dimensionality
98+ inline auto createDefaultAxisLabels (uint64_t dimensionality)
99+ -> std::vector<std::string>
100+ {
101+ switch (dimensionality)
102+ {
103+ case 0 :
104+ case 1 :
105+ return {" x" };
106+ case 2 :
107+ return {" x" , " y" };
108+ case 3 :
109+ return {" x" , " y" , " z" };
110+ default :
111+ if (dimensionality < 100 )
112+ {
113+ // x1, x2, x3, x4, ...
114+ std::vector<std::string> res;
115+ res.reserve (dimensionality);
116+ for (uint64_t i = 0 ; i < dimensionality; ++i)
117+ {
118+ res.emplace_back (" x" + std::to_string (i));
119+ }
120+ return res;
121+ }
122+ else
123+ {
124+ std::string msg =
125+ " Please verify dimensionality. Was inferred as '" ;
126+ msg += std::to_string (dimensionality);
127+ msg += " '. Seems a bit much." ;
128+ return {std::move (msg)};
129+ }
130+ }
131+ return std::vector<std::string>{" x" , " y" , " z" };
132+ }
133+
134+ // Helper function to create default vector based on dimensionality
135+ inline auto
136+ createDefaultVector (uint64_t dimensionality, double defaultValue)
137+ -> std::vector<double >
138+ {
139+ if (dimensionality < 100 )
140+ {
141+ return std::vector<double >(dimensionality, defaultValue);
142+ }
143+ else
144+ {
145+ return std::vector<double >{defaultValue};
146+ }
147+ }
62148} // namespace
63149
64150AttributeReader::AttributeReader (
@@ -339,11 +425,13 @@ auto RequireScalar::operator()(
339425 return std::visit (
340426 auxiliary::overloaded{
341427 [](std::runtime_error const &err) -> res_t {
428+ std::string msg = " Expected a scalar type: " ;
429+ msg += err.what ();
342430 return error::ReadError (
343431 error::AffectedObject::Attribute,
344432 error::Reason::UnexpectedContent,
345433 std::nullopt ,
346- std::string ( " Expected a scalar type: " ) + err. what ( ));
434+ std::move (msg ));
347435 },
348436 [&](Attribute converted_attr) -> res_t {
349437 record.setAttribute (attrName, std::move (converted_attr));
@@ -362,11 +450,13 @@ auto RequireVector::operator()(
362450 return std::visit (
363451 auxiliary::overloaded{
364452 [](std::runtime_error const &err) -> res_t {
453+ std::string msg = " Expected a vector type: " ;
454+ msg += err.what ();
365455 return error::ReadError (
366456 error::AffectedObject::Attribute,
367457 error::Reason::UnexpectedContent,
368458 std::nullopt ,
369- std::string ( " Expected a vector type: " ) + err. what ( ));
459+ std::move (msg ));
370460 },
371461 [&](Attribute converted_attr) -> res_t {
372462 record.setAttribute (attrName, std::move (converted_attr));
@@ -397,11 +487,13 @@ auto RequireType<T>::operator()(
397487 },
398488 [](std::runtime_error const &err)
399489 -> std::optional<error::ReadError> {
490+ std::string msg = " Expected a scalar type: " ;
491+ msg += err.what ();
400492 return error::ReadError (
401493 error::AffectedObject::Attribute,
402494 error::Reason::UnexpectedContent,
403495 std::nullopt ,
404- std::string ( " Expected a scalar type: " ) + err. what ( ));
496+ std::move (msg ));
405497 }},
406498 converted_or_error);
407499}
@@ -506,105 +598,34 @@ void ScientificDefaults<Child>::defaults_impl(OpenpmdStandard standard)
506598 .withReader (
507599 string_types,
508600 require_type<std::string>([this ](std::string val) {
509- auto &m = asChild ();
510- if (" cartesian" == val)
511- m.setGeometry (Mesh::Geometry::cartesian);
512- else if (" thetaMode" == val)
513- m.setGeometry (Mesh::Geometry::thetaMode);
514- else if (" cylindrical" == val)
515- m.setGeometry (Mesh::Geometry::cylindrical);
516- else if (" spherical" == val)
517- m.setGeometry (Mesh::Geometry::spherical);
518- else
519- m.setGeometry (std::move (val));
601+ setMeshGeometryFromString (asChild (), std::move (val));
520602 }))(wor);
521603
522604 defaultAttribute (" dataOrder" )
523605 .template withSetter <Mesh>(Mesh::DataOrder::C, &Mesh::setDataOrder)
524606 .withReader (
525607 string_types,
526608 require_type<char >([this ](char val) -> maybe_read_error {
527- auto &m = this ->asChild ();
528- if (val == ' C' || val == ' F' )
529- {
530- m.setDataOrder (static_cast <Mesh::DataOrder>(val));
531- return std::nullopt ;
532- }
533- else
534- {
535- return error::ReadError (
536- error::AffectedObject::Attribute,
537- error::Reason::UnexpectedContent,
538- std::nullopt ,
539- " Data order must be either C or F." );
540- }
609+ return setMeshDataOrderFromChar (asChild (), val);
541610 }))(wor);
542611
543612 defaultAttribute (" axisLabels" )
544613 .template withSetter <Mesh, std::vector<std::string> const &>(
545614 [&]() -> std::vector<std::string> {
546- switch (dimensionality)
547- {
548- case 0 :
549- case 1 :
550- return {" x" };
551- case 2 :
552- return {" x" , " y" };
553- case 3 :
554- return {" x" , " y" , " z" };
555- default :
556- if (dimensionality < 100 )
557- {
558- // x1, x2, x3, x4, ...
559- std::vector<std::string> res;
560- res.reserve (dimensionality);
561- for (uint64_t i = 0 ; i < dimensionality; ++i)
562- {
563- res.emplace_back (" x" + std::to_string (i));
564- }
565- return res;
566- }
567- else
568- {
569- return {
570- " Please verify dimensionality. Was inferred as "
571- " '" +
572- std::to_string (dimensionality) +
573- " '. Seems a bit much." };
574- }
575- }
576- return std::vector<std::string>{" x" , " y" , " z" };
615+ return createDefaultAxisLabels (dimensionality);
577616 },
578617 &Mesh::setAxisLabels)
579618 .withReader (string_types, require_vector)(wor);
580619
581620 defaultAttribute (" gridSpacing" )
582621 .template withSetter <Mesh, std::vector<double > const &>(
583- [&]() {
584- if (dimensionality < 100 )
585- {
586- return std::vector<double >(dimensionality, 1.0 );
587- }
588- else
589- {
590- return std::vector<double >{1.0 };
591- }
592- },
622+ [&]() { return createDefaultVector (dimensionality, 1.0 ); },
593623 &Mesh::setGridSpacing)
594624 .withReader (float_types, require_vector)(wor);
595625
596626 defaultAttribute (" gridGlobalOffset" )
597627 .template withSetter <Mesh, std::vector<double > const &>(
598- [&]() {
599- if (dimensionality < 100 )
600- {
601- return std::vector<double >(dimensionality, 0.0 );
602- }
603- else
604- {
605- return std::vector<double >{0.0 };
606- }
607- },
628+ [&]() { return createDefaultVector (dimensionality, 0.0 ); },
608629 &Mesh::setGridGlobalOffset)
609630 .withReader (float_types, require_type<std::vector<double >>())(wor);
610631
@@ -616,16 +637,7 @@ void ScientificDefaults<Child>::defaults_impl(OpenpmdStandard standard)
616637 {
617638 defaultAttribute (" gridUnitSI" )
618639 .template withSetter <Mesh, std::vector<double > const &>(
619- [&]() {
620- if (dimensionality < 100 )
621- {
622- return std::vector<double >(dimensionality, 1 .);
623- }
624- else
625- {
626- return std::vector<double >{1 .};
627- }
628- },
640+ [&]() { return createDefaultVector (dimensionality, 1 .); },
629641 &Mesh::setGridUnitSIPerDimension)
630642 .withReader (float_types, require_type<std::vector<double >>())(
631643 wor);
@@ -683,16 +695,7 @@ void ScientificDefaults<Child>::defaults_impl(OpenpmdStandard standard)
683695
684696 defaultAttribute (" position" )
685697 .template withSetter <MeshRecordComponent>(
686- [&]() {
687- if (dimensionality < 100 )
688- {
689- return std::vector<double >(dimensionality, 0.5 );
690- }
691- else
692- {
693- return std::vector<double >{0.0 };
694- }
695- },
698+ [&]() { return createDefaultVector (dimensionality, 0.5 ); },
696699 &MeshRecordComponent::setPosition)
697700 .withReader (float_types, require_vector)(wor);
698701
0 commit comments