@@ -49,18 +49,6 @@ namespace CppUtils::UnitTest::Language::CSV::Mapping
4949 CppUtils::Type::Pair<"Signed integer"_token, &FileObject::d>,
5050 CppUtils::Type::Pair<"Floating point"_token, &FileObject::e>>;
5151
52- namespace Conversion
53- {
54- inline auto doubleValue(std::size_t& member, std::string_view value) -> void
55- {
56- std::from_chars(std::data(value), std::data(value) + std::size(value), member);
57- member *= 2;
58- }
59- }
60-
61- using FunctionMapping = CppUtils::Type::Mapping<
62- CppUtils::Type::Pair<"Unsigned integer"_token, &Conversion::doubleValue>>;
63-
6452 struct ObjectMapping final
6553 {
6654 using CSVMapping = UnitTest::Language::CSV::Mapping::CSVMapping;
@@ -79,7 +67,40 @@ namespace CppUtils::UnitTest::Language::CSV::Mapping
7967 {
8068 using CSVMapping = UnitTest::Language::CSV::Mapping::CSVMapping;
8169 using StructMapping = UnitTest::Language::CSV::Mapping::StructMapping;
82- using FunctionMapping = UnitTest::Language::CSV::Mapping::FunctionMapping;
70+ using FunctionMapping = CppUtils::Type::Mapping<
71+ CppUtils::Type::Pair<"Unsigned integer"_token, [](std::size_t& member, std::string_view value) {
72+ std::from_chars(std::data(value), std::data(value) + std::size(value), member);
73+ member *= 2;
74+ }>>;
75+ };
76+
77+ struct ObjectLambdaMapping final
78+ {
79+ using CSVMapping = UnitTest::Language::CSV::Mapping::CSVMapping;
80+ using StructMapping = UnitTest::Language::CSV::Mapping::StructMapping;
81+ using FunctionMapping = CppUtils::Type::Mapping<
82+ CppUtils::Type::Pair<"Unsigned integer"_token, [](std::size_t& member, std::string_view value) {
83+ std::from_chars(std::data(value), std::data(value) + std::size(value), member);
84+ member *= 2;
85+ }>>;
86+ };
87+
88+ struct ObjectFunctorMapping final
89+ {
90+ struct MultiplyBy final
91+ {
92+ std::size_t factor;
93+ void operator()(std::size_t& member, std::string_view value) const
94+ {
95+ std::from_chars(std::data(value), std::data(value) + std::size(value), member);
96+ member *= factor;
97+ }
98+ };
99+
100+ using CSVMapping = UnitTest::Language::CSV::Mapping::CSVMapping;
101+ using StructMapping = UnitTest::Language::CSV::Mapping::StructMapping;
102+ using FunctionMapping = CppUtils::Type::Mapping<
103+ CppUtils::Type::Pair<"Unsigned integer"_token, MultiplyBy{4uz}>>;
83104 };
84105
85106 auto _ = TestSuite{"Language/CSV/Mapping", {}, [](TestSuite& suite) {
@@ -183,5 +204,21 @@ namespace CppUtils::UnitTest::Language::CSV::Mapping
183204
184205 suite.expectEqual(object, Object{"foo", "bar", 42, -1, 3.14f});
185206 });
207+
208+ suite.addTest("LambdaMapping", [&] {
209+ constexpr auto csvLine = "foo;bar;21;-1;3.14"sv;
210+
211+ const auto object = CppUtils::Language::CSV::toStruct<Object, ObjectLambdaMapping>(csvLine);
212+
213+ suite.expectEqual(object, Object{"foo", "bar", 42, -1, 3.14f});
214+ });
215+
216+ suite.addTest("FunctorMapping (lambda with capture substitute)", [&] {
217+ constexpr auto csvLine = "foo;bar;10;-1;3.14"sv;
218+
219+ const auto object = CppUtils::Language::CSV::toStruct<Object, ObjectFunctorMapping>(csvLine);
220+
221+ suite.expectEqual(object, Object{"foo", "bar", 40, -1, 3.14f});
222+ });
186223 }};
187224}
0 commit comments