Skip to content

Commit 7b3d818

Browse files
committed
Avoid using lambdas for require_type
1 parent b08e56c commit 7b3d818

File tree

2 files changed

+40
-45
lines changed

2 files changed

+40
-45
lines changed

include/openPMD/backend/ScientificDefaults_internal.hpp

Lines changed: 28 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -68,45 +68,34 @@ struct constructor_tag
6868
{};
6969
static constexpr constructor_tag constructor_tag_v = {};
7070

71-
template <typename T, typename Functor>
71+
template <typename T, typename RecordType>
7272
struct PostProcessConvertedAttributeImpl : PostProcessConvertedAttribute<T>
7373
{
74-
template <typename T_, typename Functor_>
75-
friend auto makePostProcessConvertedAttribute(Functor_ &&fun)
76-
-> std::shared_ptr<PostProcessConvertedAttribute<T_>>;
74+
RecordType record;
75+
using handler_t = std::optional<error::ReadError> (*)(RecordType &, T);
76+
handler_t reader;
7777

78-
template <typename Fun>
79-
PostProcessConvertedAttributeImpl(constructor_tag, Fun &&f)
80-
: fun{std::forward<Fun>(f)}
78+
PostProcessConvertedAttributeImpl(RecordType record_in, handler_t reader_in)
79+
: record(std::move(record_in)), reader(reader_in)
8180
{}
8281

83-
Functor fun;
8482
auto operator()(T val) -> std::optional<error::ReadError> override
8583
{
86-
return fun(std::move(val));
84+
return (*reader)(record, std::move(val));
8785
}
8886
};
8987

90-
// 4, 0.152344
91-
template <typename T, typename Fun>
92-
auto makePostProcessConvertedAttribute(Fun &&fun)
88+
template <typename T, typename RecordType>
89+
auto makePostProcessConvertedAttribute(
90+
RecordType &&record,
91+
std::optional<error::ReadError> (*handler)(
92+
std::remove_reference_t<RecordType> &, T))
9393
-> std::shared_ptr<PostProcessConvertedAttribute<T>>
9494
{
95-
auto functor = [fun_lambda = std::forward<Fun>(fun)](
96-
T val) -> std::optional<error::ReadError> {
97-
if constexpr (!std::is_void_v<std::invoke_result<Fun &&, T>>)
98-
{
99-
std::move(fun_lambda)(std::move(val));
100-
return std::nullopt;
101-
}
102-
else
103-
{
104-
return std::move(fun_lambda)(std::move(val));
105-
}
106-
};
107-
return std::make_shared<
108-
PostProcessConvertedAttributeImpl<T, decltype(functor)>>(
109-
constructor_tag_v, std::move(functor));
95+
return std::make_shared<PostProcessConvertedAttributeImpl<
96+
T,
97+
std::remove_reference_t<RecordType>>>(
98+
std::forward<RecordType>(record), handler);
11099
}
111100

112101
template <typename T>
@@ -117,10 +106,13 @@ struct RequireType : ProcessAttribute
117106

118107
explicit RequireType() = default;
119108

120-
template <typename Functor>
121-
RequireType(constructor_tag, Functor &&fun)
122-
: postProcess(
123-
makePostProcessConvertedAttribute<T>(std::forward<Functor>(fun)))
109+
template <typename RecordType>
110+
RequireType(
111+
RecordType &&record,
112+
std::optional<error::ReadError> (*handler)(
113+
std::remove_reference_t<RecordType> &, T))
114+
: postProcess(makePostProcessConvertedAttribute(
115+
std::forward<RecordType>(record), handler))
124116
{}
125117

126118
auto operator()(Attributable &, char const *, Attribute const &)
@@ -220,8 +212,11 @@ namespace
220212
extern std::shared_ptr<ProcessAttribute> require_scalar;
221213
// try converting to vectors (e.g. when a scalar or an array is given)
222214
extern std::shared_ptr<ProcessAttribute> require_vector;
223-
template <typename T, typename Fun>
224-
auto require_type(Fun &&) -> std::shared_ptr<ProcessAttribute>;
215+
template <typename T, typename RecordType>
216+
auto require_type(
217+
std::optional<error::ReadError> (*)(
218+
std::remove_reference_t<RecordType> &, T))
219+
-> std::shared_ptr<ProcessAttribute>;
225220
// common case: directly use setAttribute
226221
template <typename T>
227222
auto require_type() -> std::shared_ptr<ProcessAttribute>;

src/backend/ScientificDefaults.cpp

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,8 @@ namespace
6161
}
6262

6363
// Helper function to set geometry based on string value
64-
inline void setMeshGeometryFromString(Mesh &mesh, std::string val)
64+
inline auto setMeshGeometryFromString(Mesh &mesh, std::string val)
65+
-> std::optional<error::ReadError>
6566
{
6667
if ("cartesian" == val)
6768
mesh.setGeometry(Mesh::Geometry::cartesian);
@@ -73,6 +74,7 @@ namespace
7374
mesh.setGeometry(Mesh::Geometry::spherical);
7475
else
7576
mesh.setGeometry(std::move(val));
77+
return std::nullopt;
7678
}
7779

7880
// Helper function to set data order based on char value
@@ -506,11 +508,15 @@ namespace
506508
std::shared_ptr<ProcessAttribute> require_vector =
507509
std::make_shared<RequireVector>();
508510

509-
template <typename T, typename Fun>
510-
auto require_type(Fun &&fun) -> std::shared_ptr<ProcessAttribute>
511+
template <typename T, typename RecordType>
512+
auto require_type(
513+
RecordType &&record,
514+
std::optional<error::ReadError> (*handler)(
515+
std::remove_reference_t<RecordType> &, T))
516+
-> std::shared_ptr<ProcessAttribute>
511517
{
512518
return std::make_shared<RequireType<T>>(
513-
constructor_tag_v, std::forward<Fun>(fun));
519+
std::forward<RecordType>(record), handler);
514520
}
515521

516522
template <typename T>
@@ -551,8 +557,6 @@ template <typename Child>
551557
template <bool write>
552558
void ScientificDefaults<Child>::defaults_impl(OpenpmdStandard standard)
553559
{
554-
using maybe_read_error = std::optional<error::ReadError>;
555-
556560
auto float_types = get_float_types();
557561
auto string_types = get_string_types();
558562

@@ -597,17 +601,13 @@ void ScientificDefaults<Child>::defaults_impl(OpenpmdStandard standard)
597601
Mesh::Geometry::cartesian, &Mesh::setGeometry)
598602
.withReader(
599603
string_types,
600-
require_type<std::string>([this](std::string val) {
601-
setMeshGeometryFromString(asChild(), std::move(val));
602-
}))(wor);
604+
require_type(asChild(), &setMeshGeometryFromString))(wor);
603605

604606
defaultAttribute("dataOrder")
605607
.template withSetter<Mesh>(Mesh::DataOrder::C, &Mesh::setDataOrder)
606608
.withReader(
607609
string_types,
608-
require_type<char>([this](char val) -> maybe_read_error {
609-
return setMeshDataOrderFromChar(asChild(), val);
610-
}))(wor);
610+
require_type(asChild(), &setMeshDataOrderFromChar))(wor);
611611

612612
defaultAttribute("axisLabels")
613613
.template withSetter<Mesh, std::vector<std::string> const &>(

0 commit comments

Comments
 (0)