@@ -68,45 +68,34 @@ struct constructor_tag
6868{};
6969static constexpr constructor_tag constructor_tag_v = {};
7070
71- template <typename T, typename Functor >
71+ template <typename T, typename RecordType >
7272struct 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
112101template <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>;
0 commit comments