26 #include "../rw/Reader.h"
27 #include "../rw/Writer.h"
28 #include "../visitor/Visitor.h"
33 template <
class ReaderImplementation,
class WriterImplementation,
class DerivedT>
34 requires isReader<ReaderImplementation> && isWriter<WriterImplementation>
39 std::is_base_of<Converter<typename T::ReaderType, typename T::WriterType, typename T::This>,
42 template <
class ConverterImplementation>
43 requires isConverter<ConverterImplementation>
44 typename ConverterImplementation::WriterReturnType
45 readAndWrite(
typename ConverterImplementation::ReaderInputType& o);
49 template <
class ReaderImplementation,
class WriterImplementation,
class DerivedT>
50 requires isReader<ReaderImplementation> && isWriter<WriterImplementation>
52 struct Converter :
virtual public Visitor<typename ReaderImplementation::InputType>
61 ReaderImplementation
r;
62 WriterImplementation
w;
70 return r.getDescriptor(o);
76 std::map<std::string, ReaderInputTypeNonConst> elementsOfInput;
78 std::vector<std::string> templates;
79 std::vector<std::string> templateInstantiations;
81 std::map<std::string, WriterReturnType> elementsReturn;
83 r.readObject(o, name, templates, templateInstantiations, elementsOfInput, maybe, p);
84 for (
const auto& [key,
value] : elementsOfInput)
86 auto converted = readAndWrite<DerivedT>(
value);
87 elementsReturn.insert({key, converted});
91 name, templates, templateInstantiations, elementsReturn, std::nullopt, maybe, p);
100 r.readDict(o, acceptedType, maybe, p);
102 auto converted = readAndWrite<DerivedT>(acceptedType);
113 r.readList(o, acceptedType, maybe, p);
115 auto converted = readAndWrite<DerivedT>(acceptedType);
127 r.readPair(o, acceptedType1, acceptedType2, maybe, p);
129 auto converted1 = readAndWrite<DerivedT>(acceptedType1);
130 auto converted2 = readAndWrite<DerivedT>(acceptedType2);
138 std::vector<ReaderInputTypeNonConst> acceptedTypes;
139 std::vector<WriterReturnType> elementsReturn;
142 r.readTuple(o, acceptedTypes, maybe, p);
144 for (
const auto& el : acceptedTypes)
146 auto converted = readAndWrite<DerivedT>(el);
147 elementsReturn.push_back(converted);
158 std::string defaultValue;
161 r.readNDArray(o, ndim, type, defaultValue, maybe, p);
162 last_returned =
w.writeNDArray(ndim, type, defaultValue, maybe, p);
170 std::string defaultValue;
174 r.readMatrix(o, rows, cols, type, defaultValue, maybe, p);
175 last_returned =
w.writeMatrix(rows, cols, type, defaultValue, maybe, p);
183 std::string defaultValue;
185 r.readQuaternion(o, type, defaultValue, maybe, p);
193 type::image::PixelType type;
194 std::string defaultValue;
196 r.readImage(o, type, defaultValue, maybe, p);
204 type::pointcloud::VoxelType type;
205 std::string defaultValue;
207 r.readPointCloud(o, type, defaultValue, maybe, p);
216 std::map<std::string, int>
values;
217 std::string defaultValue;
219 r.readIntEnum(o, name,
values, defaultValue, maybe, p);
228 std::optional<int> defaultValue;
229 r.readInt(o, defaultValue, maybe, p);
238 std::optional<long> defaultValue;
239 r.readLong(o, defaultValue, maybe, p);
248 std::optional<float> defaultValue;
249 r.readFloat(o, defaultValue, maybe, p);
258 std::optional<double> defaultValue;
259 r.readDouble(o, defaultValue, maybe, p);
268 std::optional<bool> defaultValue;
269 r.readBool(o, defaultValue, maybe, p);
278 std::optional<std::string> defaultValue;
279 r.readString(o, defaultValue, maybe, p);
289 "A visitor got type but the enum is unknown.");
297 template <
class ConverterImplementation>
298 requires isConverter<ConverterImplementation>
300 typename ConverterImplementation::WriterReturnType
303 ConverterImplementation
v;
305 return v.last_returned;