diff --git a/source/RobotAPI/applications/AronCodeGenerator/main.cpp b/source/RobotAPI/applications/AronCodeGenerator/main.cpp index ce2acfef11109d06328aff9bb18a1cba7a5af7c5..3de3dc06515dcc47c36657e51edb56baddb76823 100644 --- a/source/RobotAPI/applications/AronCodeGenerator/main.cpp +++ b/source/RobotAPI/applications/AronCodeGenerator/main.cpp @@ -136,9 +136,9 @@ int main(int argc, char* argv[]) if (verbose) { std::cout << "Parsing the XML file... done!" << std::endl; - std::cout << "--> Found " << reader.getGenerateTypes().size() << " types." << std::endl; + std::cout << "--> Found " << reader.getGenerateObjects().size() << " types." << std::endl; std::cout << "--> They are: " << std::endl; - for (const auto& generateType : reader.getGenerateTypes()) + for (const auto& generateType : reader.getGenerateObjects()) { std::cout << "----> " << generateType->typeName << "( with " << generateType->nestedObjects.size() << " inner definitions)" << std::endl; } @@ -151,12 +151,13 @@ int main(int argc, char* argv[]) std::cout << "Running the type class generator..." << std::endl; } - writer.generateTypeClasses(reader.getGenerateTypes()); + writer.generateTypeIntEnums(reader.getGenerateIntEnums()); + writer.generateTypeObjects(reader.getGenerateObjects()); if (verbose) { std::cout << "Running the type class generator... done!" << std::endl; - std::cout << "--> Found " << writer.getTypeClasses().size() << " type classes." << std::endl; + std::cout << "--> Found " << writer.getTypeClasses().size() << " type objects." << std::endl; std::cout << "--> They are: " << std::endl; for (const auto& c : writer.getTypeClasses()) { @@ -248,7 +249,7 @@ int main(int argc, char* argv[]) if (verbose) { - std::cout << "Finished generating <" + output_file.string() + ">" << std::endl; + std::cout << "Finished generating <" + output_file.string() + ">. The new file ist called <" << output_file.string() << ">" << std::endl; } } catch (const cxxopts::OptionException& e) diff --git a/source/RobotAPI/libraries/armem/CMakeLists.txt b/source/RobotAPI/libraries/armem/CMakeLists.txt index 5e85729b15a7afbf8855a6eca1059062635df405..844097e2b278b7b4dc2b92bb38daa2ea47aa8123 100644 --- a/source/RobotAPI/libraries/armem/CMakeLists.txt +++ b/source/RobotAPI/libraries/armem/CMakeLists.txt @@ -145,6 +145,7 @@ armarx_enable_aron_file_generation_for_target( ${LIB_NAME} ARON_FILES ${ARON_FILES} + #ENABLE_DEBUG_INFO ) diff --git a/source/RobotAPI/libraries/armem/core/aron/MemoryID.xml b/source/RobotAPI/libraries/armem/core/aron/MemoryID.xml index d7ba24e0525a8f9087ac1d9200e910fa03bd1ee5..11d0fee395edca2c597dc1ea9de53dfbd7f9eae9 100644 --- a/source/RobotAPI/libraries/armem/core/aron/MemoryID.xml +++ b/source/RobotAPI/libraries/armem/core/aron/MemoryID.xml @@ -1,8 +1,7 @@ -<!--Some fancy comment --> <?xml version="1.0" encoding="UTF-8" ?> <AronTypeDefinition> <GenerateTypes> - <GenerateType name='armarx::armem::aron::MemoryID'> + <Object name='armarx::armem::aron::MemoryID'> <ObjectChild key='memoryName'> <string /> </ObjectChild> @@ -21,6 +20,6 @@ <ObjectChild key='instanceIndex'> <int /> </ObjectChild> - </GenerateType> + </Object> </GenerateTypes> </AronTypeDefinition> diff --git a/source/RobotAPI/libraries/armem/core/io/DiskReader/NlohmannJSONDiskReader/NlohmannJSONDiskReader.cpp b/source/RobotAPI/libraries/armem/core/io/DiskReader/NlohmannJSONDiskReader/NlohmannJSONDiskReader.cpp index 641db4fa43b2b4f5f268efdec1847c96857c05f1..3742996cda7cf4f03a15615a5ba7a296dfeba591 100644 --- a/source/RobotAPI/libraries/armem/core/io/DiskReader/NlohmannJSONDiskReader/NlohmannJSONDiskReader.cpp +++ b/source/RobotAPI/libraries/armem/core/io/DiskReader/NlohmannJSONDiskReader/NlohmannJSONDiskReader.cpp @@ -5,6 +5,7 @@ #include <RobotAPI/libraries/aron/core/io/dataIO/writer/navigator/NavigatorWriter.h> #include <RobotAPI/libraries/aron/core/io/typeIO/converter/Converter.h> #include <RobotAPI/libraries/aron/core/io/typeIO/reader/nlohmannJSON/NlohmannJSONReader.h> +#include <RobotAPI/libraries/aron/core/io/typeIO/writer/navigator/NavigatorWriter.h> namespace armarx::armem::io diff --git a/source/RobotAPI/libraries/armem/core/io/DiskWriter/DiskWriter.cpp b/source/RobotAPI/libraries/armem/core/io/DiskWriter/DiskWriter.cpp index 2d67aae02af1bd058cd2d05720c7d8d69f4fdab2..9168f8adf64313f17a21700a50d93113db60954c 100644 --- a/source/RobotAPI/libraries/armem/core/io/DiskWriter/DiskWriter.cpp +++ b/source/RobotAPI/libraries/armem/core/io/DiskWriter/DiskWriter.cpp @@ -247,7 +247,7 @@ namespace armarx::armem::io aron::typenavigator::ObjectNavigatorPtr DiskWriter::wrapType(const aron::typenavigator::ObjectNavigatorPtr& t) const { aron::typenavigator::ObjectNavigatorPtr typeWrapped(new aron::typenavigator::ObjectNavigator()); - typeWrapped->setObjectName(t->getObjectName() + "__ltm_export"); + typeWrapped->setObjectName(t->getName() + "__ltm_export"); typeWrapped->addMemberType(DISK_READER_WRITER_DATA_FIELD, t); typeWrapped->addMemberType(DISK_READER_WRITER_TIME_STORED_FIELD, aron::typenavigator::LongNavigatorPtr(new aron::typenavigator::LongNavigator())); diff --git a/source/RobotAPI/libraries/armem_gui/MemoryTreeWidget.cpp b/source/RobotAPI/libraries/armem_gui/MemoryTreeWidget.cpp index dbd016df71bb87a325088c6d7acff4393a650cde..06c23bcc897291e714be66f329d87c09b3cc046a 100644 --- a/source/RobotAPI/libraries/armem_gui/MemoryTreeWidget.cpp +++ b/source/RobotAPI/libraries/armem_gui/MemoryTreeWidget.cpp @@ -291,7 +291,7 @@ namespace armarx::armem::gui std::string typeName; if (container.aronType()) { - typeName = container.aronType()->getObjectName(); + typeName = container.aronType()->getName(); std::string del = "::"; size_t find = typeName.rfind(del); diff --git a/source/RobotAPI/libraries/aron/core/CMakeLists.txt b/source/RobotAPI/libraries/aron/core/CMakeLists.txt index c515fb3054fe53bf325e6381919c32cb96a28b4f..abc8a843057a029c3453e7e56abeab962af02a15 100644 --- a/source/RobotAPI/libraries/aron/core/CMakeLists.txt +++ b/source/RobotAPI/libraries/aron/core/CMakeLists.txt @@ -76,6 +76,8 @@ set(LIB_FILES codegenerator/codeWriter/cpp/Writer.cpp codegenerator/codeWriter/cpp/serializer/Serializer.cpp + codegenerator/codeWriter/cpp/serializer/toplevel/ObjectClass.cpp + codegenerator/codeWriter/cpp/serializer/toplevel/IntEnumClass.cpp codegenerator/codeWriter/cpp/serializer/container/Dict.cpp codegenerator/codeWriter/cpp/serializer/container/List.cpp codegenerator/codeWriter/cpp/serializer/container/Object.cpp @@ -188,6 +190,7 @@ set(LIB_HEADERS codegenerator/WriterInfo.h codegenerator/ReaderInfo.h codegenerator/GenerateTypeInfo.h + codegenerator/GenerateIntEnumInfo.h codegenerator/codeWriter/CodeWriter.h codegenerator/codeWriter/SerializerFactory.h @@ -195,6 +198,8 @@ set(LIB_HEADERS codegenerator/codeWriter/cpp/AronCppClass.h codegenerator/codeWriter/cpp/Writer.h codegenerator/codeWriter/cpp/serializer/Serializer.h + codegenerator/codeWriter/cpp/serializer/toplevel/ObjectClass.h + codegenerator/codeWriter/cpp/serializer/toplevel/IntEnumClass.h codegenerator/codeWriter/cpp/serializer/container/Dict.h codegenerator/codeWriter/cpp/serializer/container/List.h codegenerator/codeWriter/cpp/serializer/container/Object.h diff --git a/source/RobotAPI/libraries/aron/core/Config.h b/source/RobotAPI/libraries/aron/core/Config.h index a33a4539c01c04941bec2683d0424211338a0958..fc05237a22dab5dc57cb4f44b6d4b9616cc379d2 100644 --- a/source/RobotAPI/libraries/aron/core/Config.h +++ b/source/RobotAPI/libraries/aron/core/Config.h @@ -84,11 +84,6 @@ namespace armarx RUN_ARON_MACRO(Tuple, tuple, TUPLE) \ RUN_ARON_MACRO(Pair, pair, PAIR) -/*#define HANDLE_CONTAINER_TYPES_EXCEPT_OBJECT \ - RUN_ARON_MACRO(List, list, LIST) \ - RUN_ARON_MACRO(Dict, dict, DICT) \ - RUN_ARON_MACRO(Tuple, tuple, TUPLE)*/ - // All complex types go here #define HANDLE_NDARRAY_TYPES \ RUN_ARON_MACRO(EigenMatrix, eigenmatrix, EIGEN_MATRIX) \ @@ -122,21 +117,6 @@ namespace armarx HANDLE_ENUM_TYPES \ HANDLE_PRIMITIVE_TYPES -/************************************ - * Intermediate types, just for hierarchy - * TODO: Remove - ***********************************/ -/*#define HANDLE_CONTAINER_ARON_ABSTRACT_TYPES \ - RUN_ARON_MACRO(AronDictSerializerType, arondictserializertype, ARON_DICT_SERIALIZER_TYPE) \ - RUN_ARON_MACRO(AronListSerializerType, aronlistserializertype, ARON_LIST_SERIALIZER_TYPE) - -#define HANDLE_COMPLEX_ARON_ABSTRACT_TYPES \ - RUN_ARON_MACRO(AronNDArraySerializerType, aronndarrayserializertype, ARON_NDARRAY_SERIALIZER_TYPE) - -#define HANDLE_ALL_ARON_ABSTRACT_TYPES \ - HANDLE_CONTAINER_ARON_ABSTRACT_TYPES \ - HANDLE_COMPLEX_ARON_ABSTRACT_TYPES*/ - /************************************ * DATA ***************************** ***********************************/ @@ -185,6 +165,7 @@ namespace armarx #define HANDLE_COMPLEX_CORRESPONDING \ RUN_ARON_MACRO(EigenMatrix, eigenmatrix, EIGEN_MATRIX, NDArray, ndarray, NDARRAY) \ + RUN_ARON_MACRO(EigenQuaternion, eigenmatrix, EIGEN_MATRIX, NDArray, ndarray, NDARRAY) \ RUN_ARON_MACRO(IVTCByteImage, ivtcbyteimage, IVT_CBYTE_IMAGE, NDArray, ndarray, NDARRAY) \ RUN_ARON_MACRO(OpenCVMat, opencvmat, OPENCV_MAT, NDArray, ndarray, NDARRAY) \ RUN_ARON_MACRO(PCLPointCloud, pclpointcloud, PCL_POINTCLOUD, NDArray, ndarray, NDARRAY) \ @@ -210,34 +191,6 @@ namespace armarx HANDLE_ENUM_CORRESPONDING \ HANDLE_PRIMITIVE_CORRESPONDING -// TODO: Remove -/*#define HANDLE_CONTAINER_ARON_TYPE_ARON_ABSTRACT_TYPE_CORRESPONDING \ - RUN_ARON_MACRO(List, list, LIST, AronListSerializerType, aronlistserializertype, ARON_LIST_SERIALIZER_TYPE) \ - RUN_ARON_MACRO(Tuple, tuple, TUPLE, AronListSerializerType, aronlistserializertype, ARON_LIST_SERIALIZER_TYPE) \ - RUN_ARON_MACRO(Object, object, OBJECT, AronDictSerializerType, arondictserializertype, ARON_DICT_SERIALIZER_TYPE) \ - RUN_ARON_MACRO(Dict, dict, DICT, AronDictSerializerType, arondictserializertype, ARON_DICT_SERIALIZER_TYPE) - -#define HANDLE_COMPLEX_ARON_TYPE_ARON_ABSTRACT_TYPE_CORRESPONDING \ - RUN_ARON_MACRO(EigenMatrix, eigenmatrix, EIGEN_MATRIX, AronNDArraySerializerType, aronndarrayserializertype, ARON_NDARRAY_SERIALIZER_TYPE) \ - RUN_ARON_MACRO(IVTCByteImage, ivtcbyteimage, IVT_CBYTE_IMAGE, AronNDArraySerializerType, aronndarrayserializertype, ARON_NDARRAY_SERIALIZER_TYPE) \ - RUN_ARON_MACRO(OpenCVMat, opencvmat, OPENCV_MAT, AronNDArraySerializerType, aronndarrayserializertype, ARON_NDARRAY_SERIALIZER_TYPE) \ - RUN_ARON_MACRO(PCLPointCloud, pclpointcloud, PCL_POINTCLOUD, AronNDArraySerializerType, aronndarrayserializertype, ARON_NDARRAY_SERIALIZER_TYPE) - -#define HANDLE_ALL_ARON_TYPE_ARON_ABSTRACT_TYPE_CORRESPONDING \ - HANDLE_CONTAINER_ARON_TYPE_ARON_ABSTRACT_TYPE_CORRESPONDING \ - HANDLE_COMPLEX_ARON_TYPE_ARON_ABSTRACT_TYPE_CORRESPONDING - -#define HANDLE_CONTAINER_ARON_DATA_ARON_ABSTRACT_TYPE_CORRESPONDING \ - RUN_ARON_MACRO(List, list, LIST, AronListSerializerType, aronlistserializertype, ARON_LIST_SERIALIZER_TYPE) \ - RUN_ARON_MACRO(Dict, dict, DICT, AronDictSerializerType, arondictserializertype, ARON_DICT_SERIALIZER_TYPE) - -#define HANDLE_COMPLEX_ARON_DATA_ARON_ABSTRACT_TYPE_CORRESPONDING \ - RUN_ARON_MACRO(NDArray, ndarray, NDARRAY, AronNDArraySerializerType, aronndarrayserializertype, ARON_NDARRAY_SERIALIZER_TYPE) - -#define HANDLE_ALL_ARON_DATA_ARON_ABSTRACT_TYPE_CORRESPONDING \ - HANDLE_CONTAINER_ARON_DATA_ARON_ABSTRACT_TYPE_CORRESPONDING \ - HANDLE_COMPLEX_ARON_DATA_ARON_ABSTRACT_TYPE_CORRESPONDING*/ - /************************************ * Related data types *************** * (which on can be converted into what) diff --git a/source/RobotAPI/libraries/aron/core/Randomizer.h b/source/RobotAPI/libraries/aron/core/Randomizer.h index 65602d86714f720345f8f95346a29bfae6f17fef..aeefb6913607dde05b926bfc237262a490fa93a4 100644 --- a/source/RobotAPI/libraries/aron/core/Randomizer.h +++ b/source/RobotAPI/libraries/aron/core/Randomizer.h @@ -77,7 +77,7 @@ namespace armarx::aron usedKeys.insert(key); typenavigator::NavigatorPtr m = generateRandomType(false); - t->addAcceptedType(key, m); + t->addMemberType(key, m); } return t; } @@ -109,24 +109,63 @@ namespace armarx::aron t->setAcceptedType(a); return t; } -#define RUN_ARON_MACRO(upperType, lowerType, capsType) \ -case type::e##upperType: - - HANDLE_NDARRAY_TYPES -#undef RUN_ARON_MACRO - -#define RUN_ARON_MACRO(upperType, lowerType, capsType) \ -case type::e##upperType: \ -{ \ - typenavigator::upperType##NavigatorPtr t = typenavigator::upperType##NavigatorPtr(new typenavigator::upperType##Navigator()); \ - return t; \ -} + case type::ePair: + { + typenavigator::PairNavigatorPtr t = typenavigator::PairNavigatorPtr(new typenavigator::PairNavigator()); + typenavigator::NavigatorPtr a = generateRandomType(false); + typenavigator::NavigatorPtr b = generateRandomType(false); - HANDLE_PRIMITIVE_TYPES -#undef RUN_ARON_MACRO + t->setFirstAcceptedType(a); + t->setSecondAcceptedType(b); + return t; + } + case type::eEigenMatrix: + case type::eEigenQuaternion: + case type::eIVTCByteImage: + case type::eOpenCVMat: + case type::ePCLPointCloud: + case type::ePosition: + case type::eOrientation: + case type::ePose: + + case type::eInt: + { + auto t = std::make_shared<typenavigator::IntNavigator>(); + return t; + } + case type::eLong: + { + auto t = std::make_shared<typenavigator::LongNavigator>(); + return t; + } + case type::eFloat: + { + auto t = std::make_shared<typenavigator::FloatNavigator>(); + return t; + } + case type::eDouble: + { + auto t = std::make_shared<typenavigator::DoubleNavigator>(); + return t; + } + case type::eString: + { + auto t = std::make_shared<typenavigator::StringNavigator>(); + return t; + } + case type::eBool: + { + auto t = std::make_shared<typenavigator::BoolNavigator>(); + return t; + } + case type::eTime: + { + auto t = std::make_shared<typenavigator::TimeNavigator>(); + return t; + } default: { - throw error::DescriptorNotValidException("AronTest", "generateRandomType", "No valid type found!", nextType); + throw error::DescriptorNotValidException("Randomizer", "generateRandomType", "No valid type found!", nextType); } } } @@ -169,7 +208,8 @@ case type::e##upperType: \ case type::e##upperType: \ { \ typenavigator::upperType##NavigatorPtr t = typenavigator::upperType##Navigator::DynamicCastAndCheck(type); \ - return datanavigator::NavigatorPtr(new datanavigator::NDArrayNavigator()); \ + datanavigator::NDArrayNavigatorPtr ndarray = datanavigator::NDArrayNavigatorPtr(new datanavigator::NDArrayNavigator()); \ + return ndarray; \ } HANDLE_NDARRAY_TYPES @@ -186,12 +226,81 @@ case type::e##upperType: \ #undef RUN_ARON_MACRO default: { - throw error::DescriptorNotValidException("AronTest", "generateAronDataFromType", "No valid type found!", desc); + throw error::DescriptorNotValidException("Randomizer", "generateAronDataFromType", "No valid type found!", desc); + } + } + } + + void initializeRandomly(datanavigator::NavigatorPtr& data, const typenavigator::NavigatorPtr& type) const + { + // Containers + type::Descriptor desc = type->getDescriptor(); + switch (desc) + { + +#define RUN_ARON_MACRO(upperType, lowerType, capsType, upperData, lowerData, capsData) \ +case type::e##upperType: \ +{ \ + typenavigator::upperType##NavigatorPtr t = typenavigator::upperType##Navigator::DynamicCastAndCheck(type); \ + datanavigator::upperData##NavigatorPtr d = datanavigator::upperData##Navigator::DynamicCastAndCheck(data); \ + initializeRandomly(d, t); \ + break; \ +} + + HANDLE_ALL_CORRESPONDING +#undef RUN_ARON_MACRO + + default: + { + throw error::DescriptorNotValidException("Randomizer", "initializeRandomly", "No valid type found!", desc); } } } + int generateRandom(int max, int min) const + { + max += 1; + int random = (std::rand() % (max - min)) + min; + return random; + } + + std::string generateRandomWord(const std::set<std::string>& usedKeys = {}) const + { + std::vector<string> words = + { + "Lorem", "ipsum", "dolor", "sit", "amet", "consetetur", "sadipscing", "elitr" + "sed", "diam", "nonumy", "eirmod", "tempor", "invidunt", "ut", "labore", "et" + "dolore", "magna", "aliquyam", "eratsed" + }; + + int i = generateRandom(words.size() - 1, 0); + std::string key = words[i]; + + while (usedKeys.count(key) > 0) + { + key = generateRandomWord(usedKeys); + } + + return key; + } + + std::vector<unsigned char> generateRandomBlob(unsigned int size) const + { + std::vector<unsigned char> new_blob(size, 0); + for (unsigned int i = 0; i < size; ++i) + { + new_blob[i] = (generateRandom(127, 0)); + } + return new_blob; + } + + private: + void initialize_random() const + { + std::srand(std::time(nullptr)); + } + public: void initializeRandomly(datanavigator::DictNavigatorPtr& data, const typenavigator::ObjectNavigatorPtr& type) const { for (auto& [key, nextData] : data->getElements()) @@ -224,6 +333,14 @@ case type::e##upperType: \ } } + void initializeRandomly(datanavigator::ListNavigatorPtr& data, const typenavigator::PairNavigatorPtr& type) const + { + datanavigator::NavigatorPtr first = data->getElement(0); + datanavigator::NavigatorPtr second = data->getElement(1); + initializeRandomly(first, type->getFirstAcceptedType()); + initializeRandomly(second, type->getSecondAcceptedType()); + } + void initializeRandomly(datanavigator::ListNavigatorPtr& data, const typenavigator::ListNavigatorPtr& type) const { data->clear(); @@ -236,18 +353,13 @@ case type::e##upperType: \ } } - -#define RUN_ARON_MACRO(upperData, lowerData, capsData) \ - void initializeRandomly(datanavigator::upperData##NavigatorPtr& data, const typenavigator::NavigatorPtr& type) const \ - { \ - std::vector<int> dims = data->getDimensions(); \ - int bytes = std::accumulate(std::begin(dims), std::end(dims), 1, std::multiplies<int>()); \ - std::vector<unsigned char> blob = generateRandomBlob(bytes); \ - data->setData(bytes, blob.data()); \ - } - - HANDLE_COMPLEX_DATA -#undef RUN_ARON_MACRO + void initializeRandomly(datanavigator::NDArrayNavigatorPtr& data, const typenavigator::NavigatorPtr& type) const + { + std::vector<int> dims = data->getDimensions(); + int bytes = std::accumulate(std::begin(dims), std::end(dims), 1, std::multiplies<int>()); + std::vector<unsigned char> blob = generateRandomBlob(bytes); + data->setData(bytes, blob.data()); + } void initializeRandomly(datanavigator::IntNavigatorPtr& data, const typenavigator::NavigatorPtr& type) const { @@ -278,74 +390,5 @@ case type::e##upperType: \ { data->setValue(generateRandomWord()); } - - void initializeRandomly(datanavigator::NavigatorPtr& data, const typenavigator::NavigatorPtr& type) const - { - // Containers - type::Descriptor desc = type->getDescriptor(); - switch (desc) - { - -#define RUN_ARON_MACRO(upperType, lowerType, capsType, upperData, lowerData, capsData) \ -case type::e##upperType: \ -{ \ - typenavigator::upperType##NavigatorPtr t = typenavigator::upperType##Navigator::DynamicCastAndCheck(type); \ - datanavigator::upperData##NavigatorPtr d = datanavigator::upperData##Navigator::DynamicCastAndCheck(data); \ - initializeRandomly(d, t); \ - break; \ -} - - HANDLE_ALL_CORRESPONDING -#undef RUN_ARON_MACRO - - default: - { - throw error::DescriptorNotValidException("AronTest", "initializeRandomly", "No valid type found!", desc); - } - } - } - - int generateRandom(int max, int min) const - { - max += 1; - int random = (std::rand() % (max - min)) + min; - return random; - } - - std::string generateRandomWord(const std::set<std::string>& usedKeys = {}) const - { - std::vector<string> words = - { - "Lorem", "ipsum", "dolor", "sit", "amet", "consetetur", "sadipscing", "elitr" - "sed", "diam", "nonumy", "eirmod", "tempor", "invidunt", "ut", "labore", "et" - "dolore", "magna", "aliquyam", "eratsed" - }; - - int i = generateRandom(words.size() - 1, 0); - std::string key = words[i]; - - while (usedKeys.count(key) > 0) - { - key = generateRandomWord(usedKeys); - } - - return key; - } - - std::vector<unsigned char> generateRandomBlob(unsigned int size) const - { - std::vector<unsigned char> new_blob(size, 0); - for (unsigned int i = 0; i < size; ++i) - { - new_blob[i] = (generateRandom(127, 0)); - } - return new_blob; - } - - protected: - void initialize_random() const - { - std::srand(std::time(nullptr)); - } }; } diff --git a/source/RobotAPI/libraries/aron/core/Resolver.cpp b/source/RobotAPI/libraries/aron/core/Resolver.cpp index 2a6c5cc67e19e1176cbe783476efcfefa1f95dc3..5c3080eebbb6b053343adaf01a1f4a04f1a7c4e7 100644 --- a/source/RobotAPI/libraries/aron/core/Resolver.cpp +++ b/source/RobotAPI/libraries/aron/core/Resolver.cpp @@ -72,6 +72,15 @@ namespace armarx::aron return false; } + type::Descriptor Resolver::GetFirstIfCorrespond(const type::Descriptor& t, const data::Descriptor& d) + { + if (Correspond(t, d)) + { + return t; + } + return GetCorresponding(d); + } + data::Descriptor Resolver::GetCorresponding(const type::Descriptor& d) { #define RUN_ARON_MACRO(typeUpperType, typeLowerType, typeCapsType, dataUpperType, dataLowerType, dataCapsType) \ @@ -86,6 +95,20 @@ namespace armarx::aron return data::Descriptor::eUnknown; } + type::Descriptor Resolver::GetCorresponding(const data::Descriptor& d) + { +#define RUN_ARON_MACRO(typeUpperType, typeLowerType, typeCapsType, dataUpperType, dataLowerType, dataCapsType) \ + { \ + if(d == data::Descriptor::e##dataUpperType) \ + { \ + return type::Descriptor::e##typeUpperType; \ + } \ + } + HANDLE_ALL_CORRESPONDING +#undef RUN_ARON_MACRO + return type::Descriptor::eUnknown; + } + bool Resolver::AreRelated(const data::Descriptor& d, const data::Descriptor& d2) { if (d == d2) diff --git a/source/RobotAPI/libraries/aron/core/Resolver.h b/source/RobotAPI/libraries/aron/core/Resolver.h index 1294be2f3d1a695b0893a8debee66ed51eaf8387..8c04597ef1fa5ab5866a1d56d0713ae53aa3e8fb 100644 --- a/source/RobotAPI/libraries/aron/core/Resolver.h +++ b/source/RobotAPI/libraries/aron/core/Resolver.h @@ -47,7 +47,10 @@ namespace armarx::aron static bool Correspond(const type::Descriptor&, const data::Descriptor&); + static type::Descriptor GetFirstIfCorrespond(const type::Descriptor&, const data::Descriptor&); + static data::Descriptor GetCorresponding(const type::Descriptor&); + static type::Descriptor GetCorresponding(const data::Descriptor&); static bool AreRelated(const data::Descriptor&, const data::Descriptor&); static bool AreRelated(const type::Descriptor&, const type::Descriptor&); diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/GenerateIntEnumInfo.h b/source/RobotAPI/libraries/aron/core/codegenerator/GenerateIntEnumInfo.h new file mode 100644 index 0000000000000000000000000000000000000000..832c3e47d08766a565ddb4dc297239da472d1d9a --- /dev/null +++ b/source/RobotAPI/libraries/aron/core/codegenerator/GenerateIntEnumInfo.h @@ -0,0 +1,45 @@ +/* + * This file is part of ArmarX. + * + * Copyright (C) 2012-2016, High Performance Humanoid Technologies (H2T), + * Karlsruhe Institute of Technology (KIT), all rights reserved. + * + * ArmarX is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * ArmarX is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + * @author Fabian Peller-Konrad (fabian dot peller-konrad at kit dot edu) + * @copyright http://www.gnu.org/licenses/gpl-2.0.txt + * GNU General Public License + */ + +#pragma once + +// STD/STL +#include <memory> +#include <string> + +// ArmarX +#include <RobotAPI/libraries/aron/core/navigator/type/enum/IntEnum.h> + +namespace armarx::aron::codegeneratorhelper +{ + class GenerateIntEnumInfo; + typedef std::shared_ptr<GenerateIntEnumInfo> GenerateIntEnumInfoPtr; + + class GenerateIntEnumInfo + { + public: + std::string typeName; + std::string definedIn; + typenavigator::IntEnumNavigatorPtr correspondingType; + }; +} diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/GenerateTypeInfo.h b/source/RobotAPI/libraries/aron/core/codegenerator/GenerateTypeInfo.h index 5641e89c08c4663b7c884dcd4f2c779a33b94579..a029bca09d634f3565e89e7ef7d39eaee3af1201 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/GenerateTypeInfo.h +++ b/source/RobotAPI/libraries/aron/core/codegenerator/GenerateTypeInfo.h @@ -28,19 +28,21 @@ #include <string> // ArmarX +#include <RobotAPI/libraries/aron/core/codegenerator/GenerateIntEnumInfo.h> #include <RobotAPI/libraries/aron/core/navigator/type/container/Object.h> namespace armarx::aron::codegeneratorhelper { - class GenerateTypeInfo; - typedef std::shared_ptr<GenerateTypeInfo> GenerateTypeInfoPtr; + class GenerateObjectInfo; + typedef std::shared_ptr<GenerateObjectInfo> GenerateObjectInfoPtr; - class GenerateTypeInfo - { - public: - std::string typeName; - std::string definedIn; - typenavigator::ObjectNavigatorPtr correspondingObjectType; - std::map<std::string, GenerateTypeInfoPtr> nestedObjects; - }; + class GenerateObjectInfo + { + public: + std::string typeName; + std::string definedIn; + typenavigator::ObjectNavigatorPtr correspondingType; + std::map<std::string, GenerateObjectInfoPtr> nestedObjects; + std::map<std::string, GenerateIntEnumInfoPtr> nestedIntEnums; + }; } diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/CodeWriter.h b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/CodeWriter.h index cca2b3bee5e5307c32f8793159277e4f413bd7af..f2f9b12c22c9a8bcf3ca88ddc4ba19f6f8168b14 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/CodeWriter.h +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/CodeWriter.h @@ -52,7 +52,9 @@ namespace armarx::aron::codegenerator producerName(producerName), additionalIncludes(additionalIncludesFromXMLFile) {} - virtual void generateTypeClasses(const std::vector<codegeneratorhelper::GenerateTypeInfoPtr>&) = 0; + + virtual void generateTypeObjects(const std::vector<codegeneratorhelper::GenerateObjectInfoPtr>&) = 0; + virtual void generateTypeIntEnums(const std::vector<codegeneratorhelper::GenerateIntEnumInfoPtr>&) = 0; std::vector<MetaClassPtr> getTypeClasses() const { diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/AronCppClass.h b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/AronCppClass.h index b131739e41d822284fc40a51bd1a16f494428fe7..7098b08c6630be31bbb44c0fe098d09071e68b45 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/AronCppClass.h +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/AronCppClass.h @@ -30,7 +30,6 @@ // ArmarX #include <RobotAPI/libraries/aron/core/Exception.h> -#include <RobotAPI/libraries/aron/core/Concepts.h> #include <RobotAPI/libraries/aron/core/io/dataIO/Reader.h> #include <RobotAPI/libraries/aron/core/io/dataIO/Writer.h> #include <RobotAPI/libraries/aron/core/io/typeIO/Writer.h> @@ -50,10 +49,10 @@ namespace armarx::aron::cppcodegenerator AronCppClass() = default; virtual void reset() = 0; virtual void initialize() = 0; - virtual void read(armarx::aron::dataIO::Reader& r) = 0; - virtual void write(armarx::aron::dataIO::Writer& w) const = 0; - virtual void writeCurrentType(armarx::aron::typeIO::Writer& w) const = 0; - static void writeType(armarx::aron::typeIO::Writer& w) + virtual void read(armarx::aron::dataIO::ReaderInterface& r) = 0; + virtual void write(armarx::aron::dataIO::WriterInterface& w) const = 0; + virtual void writeCurrentType(armarx::aron::typeIO::WriterInterface& w) const = 0; + static void writeType(armarx::aron::typeIO::WriterInterface& w) { throw error::AronException("AronCppClass", "writeType", "You are not allowed to call this method directly. Each class must inheriting from AronCppClass must implement this static method!"); }; diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/Writer.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/Writer.cpp index 993ddef8346d4deaa262a1182ecef325077a3403..ca13c658ff5852538f08301b14f7eb50f9b6f10d 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/Writer.cpp +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/Writer.cpp @@ -47,7 +47,7 @@ namespace armarx::aron::cppcodegenerator codegeneratorhelper::WriterInfoPtr toAron = codegeneratorhelper::WriterInfoPtr(new codegeneratorhelper::WriterInfo()); toAron->methodName = "toAron"; toAron->returnType = "armarx::aron::datanavigator::DictNavigatorPtr"; - toAron->writerClassType = "armarx::aron::io::NavigatorWriter"; + toAron->writerClassType = "armarx::aron::dataIO::writer::NavigatorWriter"; toAron->include = "<RobotAPI/libraries/aron/core/io/dataIO/writer/navigator/NavigatorWriter.h>"; dataWriters.push_back(toAron); } @@ -60,7 +60,7 @@ namespace armarx::aron::cppcodegenerator codegeneratorhelper::ReaderInfoPtr fromAron = codegeneratorhelper::ReaderInfoPtr(new codegeneratorhelper::ReaderInfo()); fromAron->methodName = "fromAron"; fromAron->argumentType = "armarx::aron::datanavigator::DictNavigatorPtr"; - fromAron->readerClassType = "armarx::aron::io::NavigatorReader"; + fromAron->readerClassType = "armarx::aron::dataIO::reader::NavigatorReader"; fromAron->include = "<RobotAPI/libraries/aron/core/io/dataIO/reader/navigator/NavigatorReader.h>"; dataReaders.push_back(fromAron); } @@ -68,7 +68,7 @@ namespace armarx::aron::cppcodegenerator codegeneratorhelper::ReaderInfoPtr fromAron = codegeneratorhelper::ReaderInfoPtr(new codegeneratorhelper::ReaderInfo()); fromAron->methodName = "fromAron"; fromAron->argumentType = "armarx::aron::data::AronDictPtr"; - fromAron->readerClassType = "armarx::aron::io::NavigatorReader"; + fromAron->readerClassType = "armarx::aron::dataIO::reader::NavigatorReader"; dataReaders.push_back(fromAron); } } @@ -79,7 +79,7 @@ namespace armarx::aron::cppcodegenerator codegeneratorhelper::WriterInfoPtr toAronType = codegeneratorhelper::WriterInfoPtr(new codegeneratorhelper::WriterInfo()); toAronType->methodName = "toInitialAronType"; toAronType->returnType = "armarx::aron::typenavigator::ObjectNavigatorPtr"; - toAronType->writerClassType = "armarx::aron::io::NavigatorWriter"; + toAronType->writerClassType = "armarx::aron::typeIO::writer::NavigatorWriter"; toAronType->include = "<RobotAPI/libraries/aron/core/io/typeIO/writer/navigator/NavigatorWriter.h>"; initialTypeWriters.push_back(toAronType); @@ -87,32 +87,38 @@ namespace armarx::aron::cppcodegenerator codegeneratorhelper::WriterInfoPtr toAronType2 = codegeneratorhelper::WriterInfoPtr(new codegeneratorhelper::WriterInfo()); toAronType2->methodName = "toCurrentAronType"; toAronType2->returnType = "armarx::aron::typenavigator::ObjectNavigatorPtr"; - toAronType2->writerClassType = "armarx::aron::io::NavigatorWriter"; + toAronType2->writerClassType = "armarx::aron::typeIO::writer::NavigatorWriter"; currentTypeWriters.push_back(toAronType2); } - void Writer::generateTypeClasses(const std::vector<codegeneratorhelper::GenerateTypeInfoPtr>& generateTypes) + void Writer::generateTypeObjects(const std::vector<codegeneratorhelper::GenerateObjectInfoPtr>& generateObjects) { - for (const auto& publicGenerateObjectType : generateTypes) + for (const auto& publicGenerateObjectType : generateObjects) { + const auto& nav = publicGenerateObjectType->correspondingType; + + //std::cout << "Generating: " << publicGenerateObjectType->correspondingObjectType->getName() << std::endl; + // Convert to Object type and create class object - if (publicGenerateObjectType->correspondingObjectType == nullptr) + if (nav == nullptr) { throw error::AronException("ClassCppWriter", "generateTypeClasses", "An received public type is null. Abort due to error!"); } - serializer::ObjectSerializerPtr objectSerializer = serializer::ObjectSerializerPtr(new serializer::ObjectSerializer(publicGenerateObjectType->correspondingObjectType)); + auto serializer = std::make_shared<serializer::ObjectClassSerializer>(nav); - CppClassPtr c = setupCppClassFromObjectType(publicGenerateObjectType->correspondingObjectType); - if (publicGenerateObjectType->correspondingObjectType->getExtends() != nullptr) + CppClassPtr c = setupBasicCppClass(serializer->getCppTypename()); + setupMemberFields(c, serializer); + + if (nav->getExtends() != nullptr) { - serializer::ObjectSerializerPtr extendsSerializer = serializer::ObjectSerializerPtr(new serializer::ObjectSerializer(publicGenerateObjectType->correspondingObjectType->getExtends())); + auto extendsSerializer = std::make_shared<serializer::ObjectClassSerializer>(nav->getExtends()); c->addInherit(extendsSerializer->getCppTypename()); } else { - c->addInherit("virtual public armarx::aron::codegeneration::AronCppClass"); - c->addInclude("<RobotAPI/libraries/aron/core/codegenerator/AronCppClass.h>"); + c->addInherit("virtual public armarx::aron::cppcodegenerator::AronCppClass"); + c->addInclude("<RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/AronCppClass.h>"); } // Add includes and guard @@ -133,31 +139,39 @@ namespace armarx::aron::cppcodegenerator } } - generateInnerTypeClasses(c, publicGenerateObjectType->nestedObjects); + //std::cout << "Generate Type classes" << std::endl; + generateInnerTypeObjects(c, publicGenerateObjectType->nestedObjects); // ctor - c->addCtor(objectSerializer->toCtor(c->getName())); + c->addCtor(serializer->toCtor(c->getName())); // Generic methods - CppMethodPtr equals = objectSerializer->toEqualsMethod(); + //std::cout << "Generate equals method" << std::endl; + CppMethodPtr equals = serializer->toEqualsMethod(); c->addMethod(equals); - CppMethodPtr reset = objectSerializer->toResetMethod(); + //std::cout << "Generate reset method" << std::endl; + CppMethodPtr reset = serializer->toResetMethod(); c->addMethod(reset); - CppMethodPtr setup = objectSerializer->toInitializeMethod(); + //std::cout << "Generate init method" << std::endl; + CppMethodPtr setup = serializer->toInitializeMethod(); c->addMethod(setup); - CppMethodPtr writeInitialType = objectSerializer->toWriteInitialTypeMethod(); + //std::cout << "Generate writeInit method" << std::endl; + CppMethodPtr writeInitialType = serializer->toWriteInitialTypeMethod(); c->addMethod(writeInitialType); - CppMethodPtr writeCurrentType = objectSerializer->toWriteCurrentTypeMethod(); + //std::cout << "Generate writeCurrent method" << std::endl; + CppMethodPtr writeCurrentType = serializer->toWriteCurrentTypeMethod(); c->addMethod(writeCurrentType); - CppMethodPtr write = objectSerializer->toWriteMethod(); + //std::cout << "Generate write method" << std::endl; + CppMethodPtr write = serializer->toWriteMethod(); c->addMethod(write); - CppMethodPtr read = objectSerializer->toReadMethod(); + //std::cout << "Generate read method" << std::endl; + CppMethodPtr read = serializer->toReadMethod(); c->addMethod(read); // Writermethods @@ -167,7 +181,7 @@ namespace armarx::aron::cppcodegenerator { c->addInclude(info->include); } - CppMethodPtr convert = objectSerializer->toSpecializedDataWriterMethod(info->returnType, info->methodName, info->writerClassType, "armarx::aron::datanavigator::DictNavigator::DynamicCast"); + CppMethodPtr convert = serializer->toSpecializedDataWriterMethod(info->returnType, info->methodName, info->writerClassType, "armarx::aron::datanavigator::DictNavigator::DynamicCast"); c->addMethod(convert); } @@ -178,7 +192,7 @@ namespace armarx::aron::cppcodegenerator { c->addInclude(info->include); } - CppMethodPtr convert = objectSerializer->toSpecializedDataReaderMethod(info->argumentType, info->methodName, info->readerClassType); + CppMethodPtr convert = serializer->toSpecializedDataReaderMethod(info->argumentType, info->methodName, info->readerClassType); c->addMethod(convert); } @@ -189,7 +203,7 @@ namespace armarx::aron::cppcodegenerator { c->addInclude(info->include); } - CppMethodPtr convert = objectSerializer->toSpecializedInitialTypeWriterMethod(info->returnType, info->methodName, info->writerClassType, "armarx::aron::typenavigator::ObjectNavigator::DynamicCast"); + CppMethodPtr convert = serializer->toSpecializedInitialTypeWriterMethod(info->returnType, info->methodName, info->writerClassType, "armarx::aron::typenavigator::ObjectNavigator::DynamicCast"); c->addMethod(convert); } @@ -200,7 +214,7 @@ namespace armarx::aron::cppcodegenerator { c->addInclude(info->include); } - CppMethodPtr convert = objectSerializer->toSpecializedCurrentTypeWriterMethod(info->returnType, info->methodName, info->writerClassType, "armarx::aron::typenavigator::ObjectNavigator::DynamicCast"); + CppMethodPtr convert = serializer->toSpecializedCurrentTypeWriterMethod(info->returnType, info->methodName, info->writerClassType, "armarx::aron::typenavigator::ObjectNavigator::DynamicCast"); c->addMethod(convert); } @@ -211,7 +225,7 @@ namespace armarx::aron::cppcodegenerator { c->addInclude(info->include); } - CppMethodPtr convert = objectSerializer->toSpecializedCurrentTypeReaderMethod(info->argumentType, info->methodName, info->readerClassType); + CppMethodPtr convert = serializer->toSpecializedCurrentTypeReaderMethod(info->argumentType, info->methodName, info->readerClassType); c->addMethod(convert); } @@ -219,55 +233,121 @@ namespace armarx::aron::cppcodegenerator } } - void Writer::generateInnerTypeClasses(CppClassPtr& classToAdd, const std::map<std::string, codegeneratorhelper::GenerateTypeInfoPtr>& localGenerateTypes) + void Writer::generateTypeIntEnums(const std::vector<codegeneratorhelper::GenerateIntEnumInfoPtr>& generateIntEnums) + { + for (const auto& publicGenerateIntEnumType : generateIntEnums) + { + const auto& nav = publicGenerateIntEnumType->correspondingType; + if (nav == nullptr) + { + throw error::AronException("ClassCppWriter", "generateTypeIntEnums", "An received public type is null. Abort due to error!"); + } + + auto serializer = std::make_shared<serializer::IntEnumClassSerializer>(nav); + + CppClassPtr c = setupBasicCppClass(serializer->getCppTypename()); + setupMemberFields(c, serializer); + + // Add includes and guard + c->addClassDoc("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n" + "!!!!!!AUTOGENERATED CLASS. Please do NOT edit. Instead, edit the corresponding .xml file!!!!!!\n" + "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); + c->setPragmaOnceIncludeGuard(true); + c->addInclude("<memory>"); + c->addInclude("<string>"); + c->addInclude("<vector>"); + c->addInclude("<map>"); + c->addInclude("<RobotAPI/interface/aron.h>"); + + c->addInherit("virtual public armarx::aron::cppcodegenerator::AronCppClass"); + c->addInclude("<RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/AronCppClass.h>"); + + // ctor + c->addCtor(serializer->toCtor(c->getName())); + + // Generic methods + //std::cout << "Generate equals method" << std::endl; + CppMethodPtr equals = serializer->toEqualsMethod(); + c->addMethod(equals); + + //std::cout << "Generate reset method" << std::endl; + CppMethodPtr reset = serializer->toResetMethod(); + c->addMethod(reset); + + //std::cout << "Generate init method" << std::endl; + CppMethodPtr setup = serializer->toInitializeMethod(); + c->addMethod(setup); + + //std::cout << "Generate writeInit method" << std::endl; + CppMethodPtr writeInitialType = serializer->toWriteInitialTypeMethod(); + c->addMethod(writeInitialType); + + //std::cout << "Generate writeCurrent method" << std::endl; + CppMethodPtr writeCurrentType = serializer->toWriteCurrentTypeMethod(); + c->addMethod(writeCurrentType); + + //std::cout << "Generate write method" << std::endl; + CppMethodPtr write = serializer->toWriteMethod(); + c->addMethod(write); + + //std::cout << "Generate read method" << std::endl; + CppMethodPtr read = serializer->toReadMethod(); + c->addMethod(read); + + typeClasses.push_back(c); + } + } + + void Writer::generateInnerTypeObjects(CppClassPtr& classToAdd, const std::map<std::string, codegeneratorhelper::GenerateObjectInfoPtr>& localGenerateTypes) { // setup inner classes for (const auto& [_, localGenerateObjectType] : localGenerateTypes) { - serializer::ObjectSerializerPtr objectSerializer = serializer::ObjectSerializerPtr(new serializer::ObjectSerializer(localGenerateObjectType->correspondingObjectType)); + const auto& nav = localGenerateObjectType->correspondingType; + + auto serializer = std::make_shared<serializer::ObjectClassSerializer>(nav); - CppClassPtr c = setupCppClassFromObjectType(localGenerateObjectType->correspondingObjectType); - if (localGenerateObjectType->correspondingObjectType->getExtends() != nullptr) + CppClassPtr c = setupBasicCppClass(serializer->getCppTypename()); + setupMemberFields(c, serializer); + + if (nav->getExtends() != nullptr) { - serializer::ObjectSerializerPtr extendsSerializer = serializer::ObjectSerializerPtr(new serializer::ObjectSerializer(localGenerateObjectType->correspondingObjectType->getExtends())); + auto extendsSerializer = std::make_shared<serializer::ObjectClassSerializer>(nav->getExtends()); c->addInherit(extendsSerializer->getCppTypename()); } else { - c->addInherit("virtual public armarx::aron::codegeneration::AronCppClass"); + c->addInherit("virtual public armarx::aron::cppcodegenerator::AronCppClass"); } - CppMethodPtr equals = objectSerializer->toEqualsMethod(); + CppMethodPtr equals = serializer->toEqualsMethod(); c->addMethod(equals); - CppMethodPtr reset = objectSerializer->toResetMethod(); + CppMethodPtr reset = serializer->toResetMethod(); c->addMethod(reset); - CppMethodPtr setup = objectSerializer->toInitializeMethod(); + CppMethodPtr setup = serializer->toInitializeMethod(); c->addMethod(setup); - CppMethodPtr writeInitialType = objectSerializer->toWriteInitialTypeMethod(); + CppMethodPtr writeInitialType = serializer->toWriteInitialTypeMethod(); c->addMethod(writeInitialType); - CppMethodPtr writeCurrentType = objectSerializer->toWriteCurrentTypeMethod(); + CppMethodPtr writeCurrentType = serializer->toWriteCurrentTypeMethod(); c->addMethod(writeCurrentType); - CppMethodPtr write = objectSerializer->toWriteMethod(); + CppMethodPtr write = serializer->toWriteMethod(); c->addMethod(write); - CppMethodPtr read = objectSerializer->toReadMethod(); + CppMethodPtr read = serializer->toReadMethod(); c->addMethod(read); - generateInnerTypeClasses(c, localGenerateObjectType->nestedObjects); + generateInnerTypeObjects(c, localGenerateObjectType->nestedObjects); classToAdd->addInnerClass(c); } } - CppClassPtr Writer::setupCppClassFromObjectType(const typenavigator::ObjectNavigatorPtr& o) const + CppClassPtr Writer::setupBasicCppClass(const std::string& cppTypename) const { - serializer::ObjectSerializerPtr objectSerializer = serializer::ObjectSerializerPtr(new serializer::ObjectSerializer(o)); - - std::string cppTypename = objectSerializer->getCppTypename(); std::vector<std::string> split = simox::alg::split(cppTypename, "::"); if (split.size() < 1) { @@ -277,14 +357,26 @@ namespace armarx::aron::cppcodegenerator std::vector<std::string> namespaces(split); namespaces.pop_back(); - CppClassPtr c = CppClassPtr(new CppClass(namespaces, split[split.size() - 1])); + CppClassPtr c = std::make_shared<CppClass>(namespaces, split[split.size() - 1]); + return c; + } - for (const auto& [key, child] : o->getMemberTypes()) + void Writer::setupMemberFields(CppClassPtr& c, const serializer::ObjectClassSerializerPtr& o) const + { + auto publicFields = o->getPublicVariableDeclarations(""); + for (const auto& f : publicFields) { - SerializerPtr child_s = Serializer::FromAronTypeNaviagtorPtr(child); - c->addPublicField(child_s->getCppTypename() + " " + key + ";"); + c->addPublicField(f); + } + } + + void Writer::setupMemberFields(CppClassPtr& c, const serializer::IntEnumClassSerializerPtr& o) const + { + auto publicFields = o->getPublicVariableDeclarations(""); + for (const auto& f : publicFields) + { + c->addPublicField(f); } - return c; } } diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/Writer.h b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/Writer.h index c7cf9ae5ae8722211cd148dd73477f81cf1e926c..91dd59689dfb678b45ac6b5190ea1b8a04f05cd4 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/Writer.h +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/Writer.h @@ -37,7 +37,8 @@ #include <ArmarXCore/libraries/cppgen/CppClass.h> #include <RobotAPI/libraries/aron/core/navigator/type/AllNavigators.h> -#include <RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/AllSerializers.h> +#include <RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/toplevel/ObjectClass.h> +#include <RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/toplevel/IntEnumClass.h> namespace armarx::aron::cppcodegenerator { @@ -51,7 +52,8 @@ namespace armarx::aron::cppcodegenerator Writer() = delete; Writer(const std::string&, const std::vector<std::string>&); - virtual void generateTypeClasses(const std::vector<codegeneratorhelper::GenerateTypeInfoPtr>&) override; + virtual void generateTypeObjects(const std::vector<codegeneratorhelper::GenerateObjectInfoPtr>&) override; + virtual void generateTypeIntEnums(const std::vector<codegeneratorhelper::GenerateIntEnumInfoPtr>&) override; protected: virtual void addToAronMethod() override; @@ -59,8 +61,11 @@ namespace armarx::aron::cppcodegenerator virtual void addToAronTypeMethod() override; private: - void generateInnerTypeClasses(CppClassPtr& classToAdd, const std::map<std::string, codegeneratorhelper::GenerateTypeInfoPtr>& localGenerateTypes); - CppClassPtr setupCppClassFromObjectType(const typenavigator::ObjectNavigatorPtr&) const; + void generateInnerTypeObjects(CppClassPtr& classToAdd, const std::map<std::string, codegeneratorhelper::GenerateObjectInfoPtr>& localGenerateTypes); + + CppClassPtr setupBasicCppClass(const std::string&) const; + void setupMemberFields(CppClassPtr&, const serializer::ObjectClassSerializerPtr&) const; + void setupMemberFields(CppClassPtr&, const serializer::IntEnumClassSerializerPtr&) const; private: }; diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/Serializer.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/Serializer.cpp index 9bdd22e61b9dd6bd6e486d8b990db205e9e44db9..0e01b411419d76eb6b3556ef31d664d75356fc4e 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/Serializer.cpp +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/Serializer.cpp @@ -193,7 +193,7 @@ namespace armarx::aron::cppcodegenerator doc << "@brief writeType() - This method returns a new type from the class structure using a type writer implementation. This function is static. \n"; doc << "@return - the result of the writer implementation"; - CppMethodPtr m = CppMethodPtr(new CppMethod("static void writeInitialType(armarx::aron::io::AronTypeWriter& w)", doc.str())); + CppMethodPtr m = CppMethodPtr(new CppMethod("static void writeInitialType(armarx::aron::typeIO::WriterInterface& w)", doc.str())); CppBlockPtr b = this->getWriteInitialTypeBlock(""); m->setBlock(b); return m; @@ -205,8 +205,8 @@ namespace armarx::aron::cppcodegenerator doc << "@brief writeType() - This method returns a new type from the current class structure using a type writer implementation. \n"; doc << "@return - the result of the writer implementation"; - CppMethodPtr m = CppMethodPtr(new CppMethod("void writeCurrentType(armarx::aron::io::AronTypeWriter& w) const override", doc.str())); - CppBlockPtr b = this->getWriteInitialTypeBlock(""); + CppMethodPtr m = CppMethodPtr(new CppMethod("void writeCurrentType(armarx::aron::typeIO::WriterInterface& w) const override", doc.str())); + CppBlockPtr b = this->getWriteCurrentTypeBlock(""); m->setBlock(b); return m; } @@ -218,7 +218,7 @@ namespace armarx::aron::cppcodegenerator doc << "@param w - The writer implementation\n"; doc << "@return - the result of the writer implementation"; - CppMethodPtr m = CppMethodPtr(new CppMethod("virtual void write(armarx::aron::io::AronDataWriter& w) const override", doc.str())); + CppMethodPtr m = CppMethodPtr(new CppMethod("virtual void write(armarx::aron::dataIO::WriterInterface& w) const override", doc.str())); CppBlockPtr b = this->getWriteBlock(""); m->setBlock(b); return m; @@ -231,7 +231,7 @@ namespace armarx::aron::cppcodegenerator doc << "@param r - The reader implementation\n"; doc << "@return - nothing"; - CppMethodPtr m = CppMethodPtr(new CppMethod("virtual void read(armarx::aron::io::AronDataReader& r) override", doc.str())); + CppMethodPtr m = CppMethodPtr(new CppMethod("virtual void read(armarx::aron::dataIO::ReaderInterface& r) override", doc.str())); CppBlockPtr b = this->getReadBlock(""); m->setBlock(b); return m; @@ -270,7 +270,7 @@ namespace armarx::aron::cppcodegenerator CppMethodPtr m = CppMethodPtr(new CppMethod("static " + returnname + " " + methodname + "()", doc.str())); m->addLine(writerName + " writer;"); - m->addLine(getCppTypename() + "::writeInitialType(writer);"); + m->addLine("writeInitialType(writer);"); m->addLine("return " + enforceConversion + "(writer.getResult());"); return m; } diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/SerializerFactory.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/SerializerFactory.cpp index 0d893214185ad431326242e1cd7f383f18448ecd..7b777b8201d2ddfa302135a1b7795afd134a8c9d 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/SerializerFactory.cpp +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/SerializerFactory.cpp @@ -34,15 +34,30 @@ namespace armarx::aron::cppcodegenerator // Access method SerializerPtr SerializerFactory::create(const typenavigator::NavigatorPtr& n, const Path& path) const { - -#define RUN_ARON_MACRO(upperType, lowerType, capsType) \ - {type::Descriptor::e##upperType, SerializerFactoryPtr(new upperType##SerializerFactory())}, - static const std::map<type::Descriptor, SerializerFactoryPtr> Factories = { - HANDLE_ALL_ARON_TYPES + {type::eObject, SerializerFactoryPtr(new ObjectSerializerFactory())}, + {type::eDict, SerializerFactoryPtr(new DictSerializerFactory())}, + {type::eList, SerializerFactoryPtr(new ListSerializerFactory())}, + {type::eTuple, SerializerFactoryPtr(new TupleSerializerFactory())}, + {type::ePair, SerializerFactoryPtr(new PairSerializerFactory())}, + {type::eEigenMatrix, SerializerFactoryPtr(new EigenMatrixSerializerFactory())}, + {type::eEigenQuaternion, SerializerFactoryPtr(new EigenQuaternionSerializerFactory())}, + {type::eIVTCByteImage, SerializerFactoryPtr(new IVTCByteImageSerializerFactory())}, + {type::eOpenCVMat, SerializerFactoryPtr(new OpenCVMatSerializerFactory())}, + {type::ePCLPointCloud, SerializerFactoryPtr(new PCLPointCloudSerializerFactory())}, + {type::ePosition, SerializerFactoryPtr(new PositionSerializerFactory())}, + {type::eOrientation, SerializerFactoryPtr(new OrientationSerializerFactory())}, + {type::ePose, SerializerFactoryPtr(new PoseSerializerFactory())}, + {type::eIntEnum, SerializerFactoryPtr(new IntEnumSerializerFactory())}, + {type::eInt, SerializerFactoryPtr(new IntSerializerFactory())}, + {type::eLong, SerializerFactoryPtr(new LongSerializerFactory())}, + {type::eFloat, SerializerFactoryPtr(new FloatSerializerFactory())}, + {type::eDouble, SerializerFactoryPtr(new DoubleSerializerFactory())}, + {type::eString, SerializerFactoryPtr(new StringSerializerFactory())}, + {type::eBool, SerializerFactoryPtr(new BoolSerializerFactory())}, + {type::eTime, SerializerFactoryPtr(new TimeSerializerFactory())} }; -#undef RUN_ARON_MACRO //CheckIfPtrIsNull("NavigatorFactory", "create", path, n); auto res = n->getResult(); @@ -59,7 +74,7 @@ namespace armarx::aron::cppcodegenerator throw error::AronException("NavigatorFactory", "createSpecific", "Called disallowed method. Use child class instead!"); } - // Container Factories + // Factories #define RUN_ARON_MACRO(upperType, lowerType, capsType) \ SerializerPtr upperType##SerializerFactory::createSpecific(const typenavigator::NavigatorPtr& n, const Path& path) const \ { \ @@ -69,6 +84,6 @@ namespace armarx::aron::cppcodegenerator return SerializerPtr(new serializer::upperType##Serializer(casted)); \ } - HANDLE_ALL_ARON_TYPES + HANDLE_ALL_ARON_TYPES #undef RUN_ARON_MACRO } diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/Dict.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/Dict.cpp index 91a45cd845d04e8bd26b96a1d9ced54b89ba7ed6..306553442f3ed1274c1de4b4a03d7fd601a22b91 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/Dict.cpp +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/Dict.cpp @@ -70,7 +70,7 @@ namespace armarx::aron::cppcodegenerator::serializer CppBlockPtr DictSerializer::getWriteInitialTypeBlock(const std::string& accessor) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("w.writeStartDictType();"); + b->addLine("w.writeStartDict();"); std::string escaped_accessor = EscapeAccessor(accessor); std::string accessor_iterator = escaped_accessor + DICT_ITERATOR_ACCESSOR; @@ -78,14 +78,14 @@ namespace armarx::aron::cppcodegenerator::serializer auto type_s = FromAronTypeNaviagtorPtr(navigator->getAcceptedType()); CppBlockPtr b2 = type_s->getWriteInitialTypeBlock(type_s->getCppTypename()); b->appendBlock(b2); - b->addLine("w.writeEndDictType();"); + b->addLine("w.writeEndDict();"); return b; } CppBlockPtr DictSerializer::getWriteCurrentTypeBlock(const std::string& accessor) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("w.writeStartDictType();"); + b->addLine("w.writeStartDict();"); std::string escaped_accessor = EscapeAccessor(accessor); std::string accessor_iterator = escaped_accessor + DICT_ITERATOR_ACCESSOR; @@ -93,7 +93,7 @@ namespace armarx::aron::cppcodegenerator::serializer auto type_s = FromAronTypeNaviagtorPtr(navigator->getAcceptedType()); CppBlockPtr b2 = type_s->getWriteCurrentTypeBlock(type_s->getCppTypename()); b->appendBlock(b2); - b->addLine("w.writeEndDictType();"); + b->addLine("w.writeEndDict();"); return b; } diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/List.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/List.cpp index 779ffd6183c7ef1e6b78bd746b31d2397dd8bd29..1961536dc1d6a1316736891b4599c0e2ba6b74e9 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/List.cpp +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/List.cpp @@ -68,26 +68,26 @@ namespace armarx::aron::cppcodegenerator::serializer CppBlockPtr ListSerializer::getWriteInitialTypeBlock(const std::string&) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("w.writeStartListType();"); + b->addLine("w.writeStartList();"); auto type_s = FromAronTypeNaviagtorPtr(typenavigator->getAcceptedType()); CppBlockPtr b2 = type_s->getWriteInitialTypeBlock(type_s->getCppTypename()); b->appendBlock(b2); - b->addLine("w.writeEndListType();"); + b->addLine("w.writeEndList();"); return b; } CppBlockPtr ListSerializer::getWriteCurrentTypeBlock(const std::string&) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("w.writeStartListType();"); + b->addLine("w.writeStartList();"); auto type_s = FromAronTypeNaviagtorPtr(typenavigator->getAcceptedType()); - CppBlockPtr b2 = type_s->getWriteCurrentTypeBlock(type_s->getCppTypename()); + CppBlockPtr b2 = type_s->getWriteInitialTypeBlock(type_s->getCppTypename()); // TODO: think about having a better solution not ignoting the current type b->appendBlock(b2); - b->addLine("w.writeEndListType();"); + b->addLine("w.writeEndList();"); return b; } diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/Object.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/Object.cpp index 29345b3391cec2d6695d7946ecb40eadc765bb37..c57be2c1f80dbe0ff2b8f323d14ba12c4026fb8d 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/Object.cpp +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/Object.cpp @@ -26,239 +26,80 @@ namespace armarx::aron::cppcodegenerator::serializer - { - // constructors - ObjectSerializer::ObjectSerializer(const typenavigator::ObjectNavigatorPtr& e) : - Serializer(e->getObjectName(), simox::meta::get_type_name(typeid(data::AronDict)), simox::meta::get_type_name(typeid(type::AronObject))), - navigator(e) - { - //AddObjectTypeToAllObjectTypesList(ObjectNavigatorPtr(this)); - } - - std::vector<CppFieldPtr> ObjectSerializer::getPublicVariableDeclarations(const std::string& name) const - { - if (name == "") // object defintiion - { - std::vector<CppFieldPtr> fields; - for (const auto& [key, member] : navigator->getMemberTypes()) - { - auto member_s = FromAronTypeNaviagtorPtr(member); - std::vector<CppFieldPtr> member_fields = member_s->getPublicVariableDeclarations(key); - fields.insert(fields.end(), member_fields.begin(), member_fields.end()); - } - return fields; - } - else // object usage - { - CppFieldPtr field = CppFieldPtr(new CppField(getCppTypename(), name)); - return {field}; - }; - } - - std::vector<std::pair<std::string, std::string>> ObjectSerializer::getCtorInitializers(const std::string&) const - { - return {}; - } - - CppBlockPtr ObjectSerializer::getCtorBlock(const std::string&) const - { - CppBlockPtr b = CppBlockPtr(new CppBlock()); - return b; - } - - CppBlockPtr ObjectSerializer::getResetBlock(const std::string& accessor) const - { - CppBlockPtr b = CppBlockPtr(new CppBlock()); - if (accessor == "") - { - if (navigator->getExtends() != nullptr) - { - const auto extends_s = FromAronTypeNaviagtorPtr(navigator->getExtends()); - b->addLine(extends_s->getCppTypename() + "::reset();"); - } - - for (const auto& [key, child] : navigator->getMemberTypes()) - { - auto child_s = FromAronTypeNaviagtorPtr(child); - CppBlockPtr b2 = child_s->getResetBlock((accessor != "" ? (accessor + "." + key) : key)); - b->appendBlock(b2); - } - } - else - { - b->addLine(accessor + ".reset();"); - } - return b; - } - - CppBlockPtr ObjectSerializer::getInitializeBlock(const std::string& accessor) const - { - CppBlockPtr b = CppBlockPtr(new CppBlock()); - - if (accessor == "") - { - if (navigator->getExtends() != nullptr) - { - const auto extends_s = FromAronTypeNaviagtorPtr(navigator->getExtends()); - b->addLine(extends_s->getCppTypename() + "::initialize();"); - } - - for (const auto& [key, child] : navigator->getMemberTypes()) - { - const auto child_s = FromAronTypeNaviagtorPtr(child); - CppBlockPtr b2 = child_s->getInitializeBlock((accessor != "" ? (accessor + "." + key) : key)); - b->appendBlock(b2); - } - } - else - { - b->addLine(accessor + ".initialize();"); - } - return b; - } - - CppBlockPtr ObjectSerializer::getWriteInitialTypeBlock(const std::string& accessor) const - { - CppBlockPtr b = CppBlockPtr(new CppBlock()); - - if (accessor == "") - { - if (navigator->getExtends() != nullptr) - { - const auto extends_s = FromAronTypeNaviagtorPtr(navigator->getExtends()); - b->addLine(extends_s->getCppTypename() + "::writeInitialType(w);"); - } - - b->addLine("w.writeStartObjectType();"); - b->addLine("w.writeObjectName(\"" + navigator->getObjectName() + "\");"); - for (const auto& [key, child] : navigator->getMemberTypes()) - { - const auto child_s = FromAronTypeNaviagtorPtr(child); - b->addLine("w.writeKey(\"" + key + "\");"); - CppBlockPtr b2 = child_s->getWriteInitialTypeBlock(child_s->getCppTypename()); - b->appendBlock(b2); - } - b->addLine("w.writeEndObjectType();"); - } - else - { - b->addLine(accessor + "::writeInitialType(w);"); - } - return b; - } - - CppBlockPtr ObjectSerializer::getWriteCurrentTypeBlock(const std::string& accessor) const - { - CppBlockPtr b = CppBlockPtr(new CppBlock()); - - if (accessor == "") - { - if (navigator->getExtends() != nullptr) - { - const auto extends_s = FromAronTypeNaviagtorPtr(navigator->getExtends()); - //b->addLine(extends_s->getCppTypename() + ".writeCurrentType(w);"); TODO - } - - b->addLine("w.writeStartObjectType();"); - b->addLine("w.writeObjectName(\"" + navigator->getObjectName() + "\");"); - for (const auto& [key, child] : navigator->getMemberTypes()) - { - const auto child_s = FromAronTypeNaviagtorPtr(child); - b->addLine("w.writeKey(\"" + key + "\");"); - CppBlockPtr b2 = child_s->getWriteCurrentTypeBlock(child_s->getCppTypename()); - b->appendBlock(b2); - } - b->addLine("w.writeEndObjectType();"); - } - else - { - b->addLine(accessor + ".writeCurrentType(w);"); - } - return b; - } - - CppBlockPtr ObjectSerializer::getWriteBlock(const std::string& accessor) const - { - CppBlockPtr b = CppBlockPtr(new CppBlock()); - - if (accessor == "") - { - if (navigator->getExtends() != nullptr) - { - const auto extends_s = FromAronTypeNaviagtorPtr(navigator->getExtends()); - b->addLine(extends_s->getCppTypename() + "::write(w, aron_type);"); - } - - b->addLine("w.writeStartDict();"); - for (const auto& [key, child] : navigator->getMemberTypes()) - { - const auto child_s = FromAronTypeNaviagtorPtr(child); - b->addLine("w.writeKey(\"" + key + "\");"); - CppBlockPtr b2 = child_s->getWriteBlock((accessor != "" ? (accessor + "." + key) : key)); - b->appendBlock(b2); - } - b->addLine("w.writeEndDict();"); - } - else - { - b->addLine(accessor + ".write(w);"); - } - return b; - } - - CppBlockPtr ObjectSerializer::getReadBlock(const std::string& accessor) const - { - CppBlockPtr b = CppBlockPtr(new CppBlock()); - - if (accessor == "") - { - if (navigator->getExtends() != nullptr) - { - const auto extends_s = FromAronTypeNaviagtorPtr(navigator->getExtends()); - b->addLine(extends_s->getCppTypename() + "::read(r);"); - } - - b->addLine("r.readStartDict();"); - for (const auto& [key, child] : navigator->getMemberTypes()) - { - const auto child_s = FromAronTypeNaviagtorPtr(child); - b->addLine("r.readKey(\"" + key + "\");"); - CppBlockPtr b2 = child_s->getReadBlock((accessor != "" ? (accessor + "." + key) : key)); - b->appendBlock(b2); - } - b->addLine("r.readEndDict();"); - } - else - { - b->addLine(accessor + ".read(r);"); - } - return b; - } - - CppBlockPtr ObjectSerializer::getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const - { - CppBlockPtr b = CppBlockPtr(new CppBlock()); - if (accessor == "") // object definition, so we are no member of some other class - { - if (navigator->getExtends() != nullptr) - { - const auto extends_s = FromAronTypeNaviagtorPtr(navigator->getExtends()); - b->addLine("if (not (" + extends_s->getCppTypename() + "::operator== (" + otherInstanceAccessor + ")))"); - b->addLine("\t return false;"); - } - for (const auto& [key, child] : navigator->getMemberTypes()) - { - auto child_s = FromAronTypeNaviagtorPtr(child); - CppBlockPtr b2 = child_s->getEqualsBlock(key, otherInstanceAccessor + "." + key); - b->appendBlock(b2); - } - } - else // object usage with existing operator== - { - b->addLine("if (not (" + accessor + " == " + otherInstanceAccessor + "))"); - b->addLine("\t return false;"); - } - return b; - } +{ + // constructors + ObjectSerializer::ObjectSerializer(const typenavigator::ObjectNavigatorPtr& e) : + Serializer(e->getObjectName(), simox::meta::get_type_name(typeid(data::AronDict)), simox::meta::get_type_name(typeid(type::AronObject))), + navigator(e) + { + //AddObjectTypeToAllObjectTypesList(ObjectNavigatorPtr(this)); + } + + std::vector<CppFieldPtr> ObjectSerializer::getPublicVariableDeclarations(const std::string& name) const + { + CppFieldPtr field = CppFieldPtr(new CppField(getCppTypename(), name)); + return {field}; + } + + std::vector<std::pair<std::string, std::string>> ObjectSerializer::getCtorInitializers(const std::string&) const + { + return {}; + } + + CppBlockPtr ObjectSerializer::getCtorBlock(const std::string&) const + { + CppBlockPtr b = CppBlockPtr(new CppBlock()); + return b; + } + + CppBlockPtr ObjectSerializer::getResetBlock(const std::string& accessor) const + { + CppBlockPtr b = CppBlockPtr(new CppBlock()); + b->addLine(accessor + ".reset();"); + return b; + } + + CppBlockPtr ObjectSerializer::getInitializeBlock(const std::string& accessor) const + { + CppBlockPtr b = CppBlockPtr(new CppBlock()); + b->addLine(accessor + ".initialize();"); + return b; + } + + CppBlockPtr ObjectSerializer::getWriteInitialTypeBlock(const std::string& accessor) const + { + CppBlockPtr b = CppBlockPtr(new CppBlock()); + b->addLine(accessor + "::writeInitialType(w);"); + return b; + } + + CppBlockPtr ObjectSerializer::getWriteCurrentTypeBlock(const std::string& accessor) const + { + CppBlockPtr b = CppBlockPtr(new CppBlock()); + b->addLine(accessor + ".writeCurrentType(w);"); + return b; + } + + CppBlockPtr ObjectSerializer::getWriteBlock(const std::string& accessor) const + { + CppBlockPtr b = CppBlockPtr(new CppBlock()); + b->addLine(accessor + ".write(w);"); + return b; + } + + CppBlockPtr ObjectSerializer::getReadBlock(const std::string& accessor) const + { + CppBlockPtr b = CppBlockPtr(new CppBlock()); + b->addLine(accessor + ".read(r);"); + return b; + } + + CppBlockPtr ObjectSerializer::getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const + { + CppBlockPtr b = CppBlockPtr(new CppBlock()); + b->addLine("if (not (" + accessor + " == " + otherInstanceAccessor + "))"); + b->addLine("\t return false;"); + return b; + } } diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/Pair.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/Pair.cpp index a8bcb99db043034e1a324bf33872bdd9eebce834..401ee4a09bf41a33fe47f8ec8f972f9900f6b4d6 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/Pair.cpp +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/Pair.cpp @@ -69,7 +69,7 @@ namespace armarx::aron::cppcodegenerator::serializer CppBlockPtr PairSerializer::getWriteInitialTypeBlock(const std::string& accessor) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("w.writeStartPairType();"); + b->addLine("w.writeStartPair();"); std::string escaped_accessor = EscapeAccessor(accessor); @@ -85,14 +85,14 @@ namespace armarx::aron::cppcodegenerator::serializer CppBlockPtr b22 = child_s2->getWriteInitialTypeBlock(accessor_iterator2); b->appendBlock(b22); - b->addLine("w.writeEndPairType();"); + b->addLine("w.writeEndPair();"); return b; } CppBlockPtr PairSerializer::getWriteCurrentTypeBlock(const std::string& accessor) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("w.writeStartPairType();"); + b->addLine("w.writeStartPair();"); std::string escaped_accessor = EscapeAccessor(accessor); @@ -108,7 +108,7 @@ namespace armarx::aron::cppcodegenerator::serializer CppBlockPtr b22 = child_s2->getWriteCurrentTypeBlock(accessor_iterator2); b->appendBlock(b22); - b->addLine("w.writeEndPairType();"); + b->addLine("w.writeEndPair();"); return b; } diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/Tuple.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/Tuple.cpp index 300a1474322db30f5417e2ed19a778ea1d815ed6..5e6f97e448280dccc0e13f91bc24d75020b26e3c 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/Tuple.cpp +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/container/Tuple.cpp @@ -68,7 +68,7 @@ namespace armarx::aron::cppcodegenerator::serializer CppBlockPtr TupleSerializer::getWriteInitialTypeBlock(const std::string& accessor) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("w.writeStartTupleType();"); + b->addLine("w.writeStartTuple();"); std::string escaped_accessor = EscapeAccessor(accessor); unsigned int i = 0; @@ -80,14 +80,14 @@ namespace armarx::aron::cppcodegenerator::serializer CppBlockPtr b2 = type_s->getWriteInitialTypeBlock(accessor_iterator); b->appendBlock(b2); } - b->addLine("w.writeEndTupleType();"); + b->addLine("w.writeEndTuple();"); return b; } CppBlockPtr TupleSerializer::getWriteCurrentTypeBlock(const std::string& accessor) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("w.writeStartTupleType();"); + b->addLine("w.writeStartTuple();"); std::string escaped_accessor = EscapeAccessor(accessor); unsigned int i = 0; @@ -99,7 +99,7 @@ namespace armarx::aron::cppcodegenerator::serializer CppBlockPtr b2 = type_s->getWriteCurrentTypeBlock(accessor_iterator); b->appendBlock(b2); } - b->addLine("w.writeEndTupleType();"); + b->addLine("w.writeEndTuple();"); return b; } diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/enum/IntEnum.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/enum/IntEnum.cpp index 30a7df9a7ee7a0644d2b33b0254ad23ceadf54e6..c2d7e59189c1caa4acf839cf1c67afc5f2f0d14b 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/enum/IntEnum.cpp +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/enum/IntEnum.cpp @@ -29,7 +29,7 @@ namespace armarx::aron::cppcodegenerator::serializer // constructors IntEnumSerializer::IntEnumSerializer(const typenavigator::IntEnumNavigatorPtr& n) : Serializer(n->getEnumName(), simox::meta::get_type_name(typeid(data::AronNDArray)), simox::meta::get_type_name(typeid(type::AronIntEnum))), - typenavigator(n) + navigator(n) { } @@ -53,50 +53,49 @@ namespace armarx::aron::cppcodegenerator::serializer CppBlockPtr IntEnumSerializer::getResetBlock(const std::string& accessor) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine(accessor + " = " + getCppTypename() + "enum());"); + b->addLine(accessor + ".reset();"); return b; } - CppBlockPtr IntEnumSerializer::getWriteInitialTypeBlock(const std::string&) const + CppBlockPtr IntEnumSerializer::getWriteInitialTypeBlock(const std::string& accessor) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("w.writeIntEnumType();"); + b->addLine(accessor + "::writeInitialType(w);"); return b; } CppBlockPtr IntEnumSerializer::getWriteCurrentTypeBlock(const std::string& accessor) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("w.writeIntEnumType();"); + b->addLine(accessor + ".writeCurrentType(w);"); return b; } CppBlockPtr IntEnumSerializer::getInitializeBlock(const std::string& accessor) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine(accessor + " = " + getCppTypename() + "();"); + b->addLine(accessor + ".initialize();"); return b; } CppBlockPtr IntEnumSerializer::getWriteBlock(const std::string& accessor) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("w.writeNDArray();"); + b->addLine(accessor + ".write(w);"); return b; } CppBlockPtr IntEnumSerializer::getReadBlock(const std::string& accessor) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("r.readStartNDArray(); // We do not need the dims and type since a EigenMat can not change (templated)"); - b->addLine("r.readEndNDArray(reinterpret_cast<unsigned char*>(" + accessor + "->data()));"); + b->addLine(accessor + ".read(r);"); return b; } CppBlockPtr IntEnumSerializer::getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("if (not (" + accessor + "->isApprox(*" + otherInstanceAccessor + ")))"); + b->addLine("if (not (" + accessor + " == " + otherInstanceAccessor + "))"); b->addLine("\t return false;"); return b; } diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/enum/IntEnum.h b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/enum/IntEnum.h index ba53bb47e8b7a406eab9d2ad738c48df0b3c62ab..abb82b441cb59b139ec531110523a7844216273d 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/enum/IntEnum.h +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/enum/IntEnum.h @@ -65,6 +65,6 @@ namespace armarx::aron::cppcodegenerator::serializer // Members static const std::map<std::string, std::pair<std::string, int>> ACCEPTED_TYPES; - typenavigator::IntEnumNavigatorPtr typenavigator; + typenavigator::IntEnumNavigatorPtr navigator; }; } diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/EigenMatrix.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/EigenMatrix.cpp index 2e6dfec9ebca6bb178f05f36a9b8000f35aad38d..31fc0342b768c72a5f0daed022ef167c0e3ee170 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/EigenMatrix.cpp +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/EigenMatrix.cpp @@ -40,7 +40,7 @@ namespace armarx::aron::cppcodegenerator::serializer // constructors EigenMatrixSerializer::EigenMatrixSerializer(const typenavigator::EigenMatrixNavigatorPtr& n) : - Serializer("std::shared_ptr<::Eigen::Matrix<" + ACCEPTED_TYPES.at(n->getTypename()).first + ", " + std::to_string(n->getRows()) + ", " + std::to_string(n->getCols()) + ">>", simox::meta::get_type_name(typeid(data::AronNDArray)), simox::meta::get_type_name(typeid(type::AronEigenMatrix))), + Serializer("Eigen::Matrix<" + ACCEPTED_TYPES.at(n->getTypename()).first + ", " + std::to_string(n->getRows()) + ", " + std::to_string(n->getCols()) + ">", simox::meta::get_type_name(typeid(data::AronNDArray)), simox::meta::get_type_name(typeid(type::AronEigenMatrix))), typenavigator(n) { } @@ -65,35 +65,35 @@ namespace armarx::aron::cppcodegenerator::serializer CppBlockPtr EigenMatrixSerializer::getResetBlock(const std::string& accessor) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine(accessor + " = " + getCppTypename() + "(new ::Eigen::Matrix<" + ACCEPTED_TYPES.at(typenavigator->getTypename()).first + ", " + std::to_string(typenavigator->getRows()) + ", " + std::to_string(typenavigator->getCols()) + ">());"); + b->addLine(accessor + " = " + getCppTypename() + "();"); return b; } CppBlockPtr EigenMatrixSerializer::getWriteInitialTypeBlock(const std::string&) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("w.writeEigenMatrixType({" + simox::alg::to_string<int>(typenavigator->getDimensions(), ", ") + "}, \"" + typenavigator->getTypename() + "\");"); + b->addLine("w.writeEigenMatrix({" + simox::alg::to_string<int>(typenavigator->getDimensions(), ", ") + "}, \"" + typenavigator->getTypename() + "\");"); return b; } CppBlockPtr EigenMatrixSerializer::getWriteCurrentTypeBlock(const std::string& accessor) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("w.writeEigenMatrixType({" + accessor + "->rows(), " + accessor + "->cols()}, \"" + typenavigator->getTypename() + "\");"); + b->addLine("w.writeEigenMatrix({" + accessor + ".rows(), " + accessor + ".cols()}, \"" + typenavigator->getTypename() + "\");"); return b; } CppBlockPtr EigenMatrixSerializer::getInitializeBlock(const std::string& accessor) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine(accessor + " = " + getCppTypename() + "(new ::Eigen::Matrix<" + ACCEPTED_TYPES.at(typenavigator->getTypename()).first + ", " + std::to_string(typenavigator->getRows()) + ", " + std::to_string(typenavigator->getCols()) + ">());"); + b->addLine(accessor + " = " + getCppTypename() + "();"); return b; } CppBlockPtr EigenMatrixSerializer::getWriteBlock(const std::string& accessor) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("w.writeNDArray({" + accessor + "->rows(), " + accessor + "->cols(), " + std::to_string(ACCEPTED_TYPES.at(typenavigator->getTypename()).second) + "}, \"" + typenavigator->getTypename() + "\", reinterpret_cast<unsigned char*>(" + accessor + "->data()));"); + b->addLine("w.writeNDArray({" + accessor + ".rows(), " + accessor + ".cols(), " + std::to_string(ACCEPTED_TYPES.at(typenavigator->getTypename()).second) + "}, \"" + typenavigator->getTypename() + "\", reinterpret_cast<const unsigned char*>(" + accessor + ".data()));"); return b; } @@ -101,14 +101,14 @@ namespace armarx::aron::cppcodegenerator::serializer { CppBlockPtr b = CppBlockPtr(new CppBlock()); b->addLine("r.readStartNDArray(); // We do not need the dims and type since a EigenMat can not change (templated)"); - b->addLine("r.readEndNDArray(reinterpret_cast<unsigned char*>(" + accessor + "->data()));"); + b->addLine("r.readEndNDArray(reinterpret_cast<unsigned char*>(" + accessor + ".data()));"); return b; } CppBlockPtr EigenMatrixSerializer::getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("if (not (" + accessor + "->isApprox(*" + otherInstanceAccessor + ")))"); + b->addLine("if (not (" + accessor + ".isApprox(" + otherInstanceAccessor + ")))"); b->addLine("\t return false;"); return b; } diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/EigenQuaternion.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/EigenQuaternion.cpp index 28ef264c4f39185e8dfeb3d701312aa36631b6f4..2d0d53e17fc5ab195efce9c424c118e67e5935e0 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/EigenQuaternion.cpp +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/EigenQuaternion.cpp @@ -35,7 +35,7 @@ namespace armarx::aron::cppcodegenerator::serializer // constructors EigenQuaternionSerializer::EigenQuaternionSerializer(const typenavigator::EigenQuaternionNavigatorPtr& n) : - Serializer("std::shared_ptr<::Eigen::Quaternion<" + ACCEPTED_TYPES.at(n->getTypename()).first + ">>", simox::meta::get_type_name(typeid(data::AronNDArray)), simox::meta::get_type_name(typeid(type::AronEigenQuaternion))), + Serializer("Eigen::Quaternion<" + ACCEPTED_TYPES.at(n->getTypename()).first + ">", simox::meta::get_type_name(typeid(data::AronNDArray)), simox::meta::get_type_name(typeid(type::AronEigenQuaternion))), typenavigator(n) { } @@ -60,35 +60,35 @@ namespace armarx::aron::cppcodegenerator::serializer CppBlockPtr EigenQuaternionSerializer::getResetBlock(const std::string& accessor) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine(accessor + " = " + getCppTypename() + "(new ::Eigen::Quaternion<" + ACCEPTED_TYPES.at(typenavigator->getTypename()).first + ">());"); + b->addLine(accessor + " = " + getCppTypename() + "();"); return b; } CppBlockPtr EigenQuaternionSerializer::getWriteInitialTypeBlock(const std::string&) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("w.writeEigenQuaternionType({" + simox::alg::to_string<int>(typenavigator->getDimensions(), ", ") + "}, \"" + typenavigator->getTypename() + "\");"); + b->addLine("w.writeEigenQuaternion(\"" + typenavigator->getTypename() + "\");"); return b; } - CppBlockPtr EigenQuaternionSerializer::getWriteCurrentTypeBlock(const std::string& accessor) const + CppBlockPtr EigenQuaternionSerializer::getWriteCurrentTypeBlock(const std::string&) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("w.writeEigenQuaternionType({" + accessor + "->rows(), " + accessor + "->cols()}, \"" + typenavigator->getTypename() + "\");"); + b->addLine("w.writeEigenQuaternion(\"" + typenavigator->getTypename() + "\");"); return b; } CppBlockPtr EigenQuaternionSerializer::getInitializeBlock(const std::string& accessor) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine(accessor + " = " + getCppTypename() + "(new ::Eigen::Quaternion<" + ACCEPTED_TYPES.at(typenavigator->getTypename()).first + ">());"); + b->addLine(accessor + " = " + getCppTypename() + "();"); return b; } CppBlockPtr EigenQuaternionSerializer::getWriteBlock(const std::string& accessor) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("w.writeNDArray({" + accessor + "->rows(), " + accessor + "->cols(), " + std::to_string(ACCEPTED_TYPES.at(typenavigator->getTypename()).second) + "}, \"" + typenavigator->getTypename() + "\", reinterpret_cast<unsigned char*>(" + accessor + "->data()));"); + b->addLine("w.writeNDArray({" + simox::alg::to_string(typenavigator->getDimensions(), ", ") + ", " + std::to_string(ACCEPTED_TYPES.at(typenavigator->getTypename()).second) + "}, \"" + typenavigator->getTypename() + "\", reinterpret_cast<const unsigned char*>(" + accessor + ".coeffs().data()));"); return b; } @@ -96,14 +96,14 @@ namespace armarx::aron::cppcodegenerator::serializer { CppBlockPtr b = CppBlockPtr(new CppBlock()); b->addLine("r.readStartNDArray(); // We do not need the dims and type since a EigenMat can not change (templated)"); - b->addLine("r.readEndNDArray(reinterpret_cast<unsigned char*>(" + accessor + "->data()));"); + b->addLine("r.readEndNDArray(reinterpret_cast<unsigned char*>(" + accessor + ".coeffs().data()));"); return b; } CppBlockPtr EigenQuaternionSerializer::getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("if (not (" + accessor + "->isApprox(*" + otherInstanceAccessor + ")))"); + b->addLine("if (not (" + accessor + ".isApprox(" + otherInstanceAccessor + ")))"); b->addLine("\t return false;"); return b; } diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/IVTCByteImage.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/IVTCByteImage.cpp index 30de9f5f8a96d0297ad7757411cfa66790b1f87d..920cd941a2622fa92df5873e4823d35bc16ea2c7 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/IVTCByteImage.cpp +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/IVTCByteImage.cpp @@ -36,7 +36,7 @@ namespace armarx::aron::cppcodegenerator::serializer // constructors IVTCByteImageSerializer::IVTCByteImageSerializer(const typenavigator::IVTCByteImageNavigatorPtr& e) : - Serializer("std::shared_ptr<CByteImage>", simox::meta::get_type_name(typeid(data::AronNDArray)), simox::meta::get_type_name(typeid(type::AronIVTCByteImage))), + Serializer("CByteImage", simox::meta::get_type_name(typeid(data::AronNDArray)), simox::meta::get_type_name(typeid(type::AronIVTCByteImage))), typenavigator(e) { // check if type exists @@ -63,53 +63,57 @@ namespace armarx::aron::cppcodegenerator::serializer CppBlockPtr IVTCByteImageSerializer::getResetBlock(const std::string& accessor) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine(accessor + " = " + getCppTypename() + "(new CByteImage(" + accessor + "->width, " + accessor + "->height, " + accessor + "->type));"); + b->addLine(accessor + ".Set(" + accessor + ".width, " + accessor + ".height, " + accessor + ".type);"); return b; } CppBlockPtr IVTCByteImageSerializer::getInitializeBlock(const std::string& accessor) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine(accessor + " = " + getCppTypename() + "(new CByteImage(" + std::to_string(typenavigator->getWidth()) + ", " + std::to_string(typenavigator->getHeight()) + ", " + ACCEPTED_TYPES.at(typenavigator->getTypename()).first + "));"); + b->addLine(accessor + ".Set(" + std::to_string(typenavigator->getWidth()) + ", " + std::to_string(typenavigator->getHeight()) + ", " + ACCEPTED_TYPES.at(typenavigator->getTypename()).first + ");"); return b; } CppBlockPtr IVTCByteImageSerializer::getWriteInitialTypeBlock(const std::string&) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("w.writeIVTCByteImageType({" + std::to_string(typenavigator->getWidth()) + ", " + std::to_string(typenavigator->getHeight()) + "}, \"" + typenavigator->getTypename() + "\");"); + b->addLine("w.writeIVTCByteImage(" + std::to_string(typenavigator->getWidth()) + ", " + std::to_string(typenavigator->getHeight()) + ", \"" + typenavigator->getTypename() + "\");"); return b; } CppBlockPtr IVTCByteImageSerializer::getWriteCurrentTypeBlock(const std::string& accessor) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("w.writeIVTCByteImageType({" + accessor + "->width, " + accessor + "->height} \"" + typenavigator->getTypename() + "\");"); + b->addLine("w.writeIVTCByteImage(" + accessor + ".width, " + accessor + ".height, \"" + typenavigator->getTypename() + "\");"); return b; } CppBlockPtr IVTCByteImageSerializer::getWriteBlock(const std::string& accessor) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("w.writeNDArray({" + accessor + "->width, " + accessor + "->height, " + accessor + "->bytesPerPixel}, std::to_string(" + accessor + "->type), reinterpret_cast<unsigned char*>(" + accessor + "->pixels));"); + b->addLine("w.writeNDArray({" + accessor + ".width, " + accessor + ".height, " + accessor + ".bytesPerPixel}, std::to_string(" + accessor + ".type), reinterpret_cast<const unsigned char*>(" + accessor + ".pixels));"); return b; } CppBlockPtr IVTCByteImageSerializer::getReadBlock(const std::string& accessor) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("const auto [dims, type] = r.readStartNDArray();"); - b->addLine(accessor + " = " + getCppTypename() + "(new CByteImage(dims[0], dims[1], static_cast<CByteImage::ImageType>(std::stoi(type))));"); - b->addLine("r.readEndNDArray(reinterpret_cast<unsigned char*>(" + accessor + "->pixels));"); + std::string escaped_accessor = EscapeAccessor(accessor); + std::string dims_accessor = escaped_accessor + DIMENSION_ACCESSOR; + std::string type_accessor = escaped_accessor + TYPE_ACCESSOR; + + b->addLine("const auto [" + dims_accessor + ", " + type_accessor + "] = r.readStartNDArray();"); + b->addLine(accessor + ".Set(" + dims_accessor + "[0], " + dims_accessor + "[1], static_cast<CByteImage::ImageType>(std::stoi(" + type_accessor + ")));"); + b->addLine("r.readEndNDArray(reinterpret_cast<unsigned char*>(" + accessor + ".pixels));"); return b; } CppBlockPtr IVTCByteImageSerializer::getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("if (not (" + accessor + "->IsCompatible(" + otherInstanceAccessor + ".get())))"); + b->addLine("if (not (" + accessor + ".IsCompatible(&" + otherInstanceAccessor + ")))"); b->addLine("\t return false;"); - b->addLine("if (not (memcmp(" + accessor + "->pixels, " + otherInstanceAccessor + "->pixels, " + accessor + "->width * " + accessor + "->height * " + accessor + "->bytesPerPixel) == 0))"); + b->addLine("if (not (memcmp(" + accessor + ".pixels, " + otherInstanceAccessor + ".pixels, " + accessor + ".width * " + accessor + ".height * " + accessor + ".bytesPerPixel) == 0))"); b->addLine("\t return false;"); return b; } diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/IVTCByteImage.h b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/IVTCByteImage.h index d7b0869afde055183cd512bb1aad794af922b973..ac91df514b87f3377f5f9738a613cd1dc6c29ca6 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/IVTCByteImage.h +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/IVTCByteImage.h @@ -64,6 +64,8 @@ namespace armarx::aron::cppcodegenerator::serializer private: // members static const std::map<std::string, std::pair<std::string, int>> ACCEPTED_TYPES; + static constexpr const char* DIMENSION_ACCESSOR = "_dimensions"; + static constexpr const char* TYPE_ACCESSOR = "_type"; typenavigator::IVTCByteImageNavigatorPtr typenavigator; }; diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/OpenCVMat.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/OpenCVMat.cpp index 0bcebaec3f58acb3b4bd13c5f4cb735ce4bd2cb6..fed76275099b5969bf3993cbd10d57973065e103 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/OpenCVMat.cpp +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/OpenCVMat.cpp @@ -25,130 +25,133 @@ #include "OpenCVMat.h" namespace armarx::aron::cppcodegenerator::serializer - { - - const std::map<std::string, std::pair<std::string, int>> OpenCVMatSerializer::ACCEPTED_TYPES = - { - {"CV_8U", {"CV_8U", 1}}, - {"CV_8S", {"CV_8S", 1}}, - {"CV_16U", {"CV_16U", 2}}, - {"CV_16S", {"CV_16S", 2}}, - {"CV_32S", {"CV_32S", 4}}, - {"CV_32F", {"CV_32F", 4}}, - {"CV_64F", {"CV_64F", 8}}, - }; - - const std::string OpenCVMatSerializer::OPENCVMAT_ITERATOR_ACCESSOR = "_iterator"; - const std::string OpenCVMatSerializer::OPENCVMAT_DIMENSIONS_ACCESSOR = "_dimensions"; - const std::string OpenCVMatSerializer::OPENCVMAT_DIFF_ACCESSOR = "_dimensions"; - - // constructors - OpenCVMatSerializer::OpenCVMatSerializer(const typenavigator::OpenCVMatNavigatorPtr& e) : - Serializer("std::shared_ptr<cv::Mat>", simox::meta::get_type_name(typeid(data::AronNDArray)), simox::meta::get_type_name(typeid(type::AronOpenCVMat))), - typenavigator(e) - { - // check if type exists - ACCEPTED_TYPES.at(e->getTypename()); - } - - std::vector<CppFieldPtr> OpenCVMatSerializer::getPublicVariableDeclarations(const std::string& name) const - { - CppFieldPtr field = CppFieldPtr(new CppField(getCppTypename(), name)); - return {field}; - } - - std::vector<std::pair<std::string, std::string>> OpenCVMatSerializer::getCtorInitializers(const std::string&) const - { - return {}; - } - - CppBlockPtr OpenCVMatSerializer::getCtorBlock(const std::string&) const - { - CppBlockPtr b = CppBlockPtr(new CppBlock()); - return b; - } - - CppBlockPtr OpenCVMatSerializer::getResetBlock(const std::string& accessor) const - { - CppBlockPtr b = CppBlockPtr(new CppBlock()); - - std::string escaped_accessor = EscapeAccessor(accessor); - std::string accessor_dimensions = escaped_accessor + OPENCVMAT_DIMENSIONS_ACCESSOR; - std::string accessor_iterator = escaped_accessor + OPENCVMAT_ITERATOR_ACCESSOR; - - b->addLine("std::vector<int> " + accessor_dimensions + ";"); - b->addLine("for (int " + accessor_iterator + " = 0; " + accessor_iterator + " < " + accessor + "->dims; ++" + accessor_iterator + ")"); - CppBlockPtr b2 = CppBlockPtr(new CppBlock()); - b2->addLine(accessor_dimensions + ".push_back(" + accessor + "->size[" + accessor_iterator + "]);"); - b->appendBlock(b2); - b->addLine(accessor + " = " + getCppTypename() + "(new cv::Mat(" + accessor_dimensions + ", " + accessor + "->type()));"); - return b; - } - - CppBlockPtr OpenCVMatSerializer::getInitializeBlock(const std::string& accessor) const - { - CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine(accessor + " = " + getCppTypename() + "(new cv::Mat(std::vector<int>({" + simox::alg::to_string<int>(typenavigator->getDimensions(), ", ") + "}), " + ACCEPTED_TYPES.at(typenavigator->getTypename()).first + "));"); - return b; - } - - CppBlockPtr OpenCVMatSerializer::getWriteInitialTypeBlock(const std::string&) const - { - CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("w.writeOpenCVMatType({" + simox::alg::to_string<int>(typenavigator->getDimensions(), ", ") + "}, \"" + typenavigator->getTypename() + "\");"); - return b; - } - - CppBlockPtr OpenCVMatSerializer::getWriteCurrentTypeBlock(const std::string& accessor) const - { - CppBlockPtr b = CppBlockPtr(new CppBlock()); - - std::string escaped_accessor = EscapeAccessor(accessor); - std::string accessor_dimensions = escaped_accessor + OPENCVMAT_DIMENSIONS_ACCESSOR; - std::string accessor_iterator = escaped_accessor + OPENCVMAT_ITERATOR_ACCESSOR; - - b->addLine("std::vector<int> " + accessor_dimensions + ";"); - b->addLine("for (int " + accessor_iterator + " = 0; " + accessor_iterator + " < " + accessor + "->dims; ++" + accessor_iterator + ")"); - CppBlockPtr b2 = CppBlockPtr(new CppBlock()); - b2->addLine(accessor_dimensions + ".push_back(" + accessor + "->size[" + accessor_iterator + "]);"); - b->appendBlock(b2); - b->addLine("w.writeOpenCVMatType(" + accessor_dimensions + ", std::to_string(" + accessor + "->type()));"); - return b; - } - - CppBlockPtr OpenCVMatSerializer::getWriteBlock(const std::string& accessor) const - { - CppBlockPtr b = CppBlockPtr(new CppBlock()); - - std::string escaped_accessor = EscapeAccessor(accessor); - std::string accessor_dimensions = escaped_accessor + OPENCVMAT_DIMENSIONS_ACCESSOR; - std::string accessor_iterator = escaped_accessor + OPENCVMAT_ITERATOR_ACCESSOR; - - b->addLine("std::vector<int> " + accessor_dimensions + ";"); - b->addLine("for (int " + accessor_iterator + " = 0; " + accessor_iterator + " < " + accessor + "->dims; ++" + accessor_iterator + ")"); - CppBlockPtr b2 = CppBlockPtr(new CppBlock()); - b2->addLine(accessor_dimensions + ".push_back(" + accessor + "->size[" + accessor_iterator + "]);"); - b->appendBlock(b2); - b->addLine(accessor_dimensions + ".push_back(" + accessor + "->elemSize());"); - b->addLine("w.writeNDArray(" + accessor_dimensions + ", std::to_string(" + accessor + "->type()), reinterpret_cast<unsigned char*>(" + accessor + "->data));"); - return b; - } - - CppBlockPtr OpenCVMatSerializer::getReadBlock(const std::string& accessor) const - { - CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("const auto [dims, type] = r.readStartNDArray();"); - b->addLine(accessor + " = " + getCppTypename() + "(new cv::Mat(std::vector<int>({dims.begin(), std::prev(dims.end())}), std::stoi(type)));"); - b->addLine("r.readEndNDArray(reinterpret_cast<unsigned char*>(" + accessor + "->data));"); - return b; - } - - CppBlockPtr OpenCVMatSerializer::getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const - { - CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("if (cv::countNonZero(*" + accessor + " != *" + otherInstanceAccessor + ") != 0)"); - b->addLine("\t return false;"); - return b; - } +{ + + const std::map<std::string, std::pair<std::string, int>> OpenCVMatSerializer::ACCEPTED_TYPES = + { + {"CV_8U", {"CV_8U", 1}}, + {"CV_8S", {"CV_8S", 1}}, + {"CV_16U", {"CV_16U", 2}}, + {"CV_16S", {"CV_16S", 2}}, + {"CV_32S", {"CV_32S", 4}}, + {"CV_32F", {"CV_32F", 4}}, + {"CV_64F", {"CV_64F", 8}}, + }; + + // constructors + OpenCVMatSerializer::OpenCVMatSerializer(const typenavigator::OpenCVMatNavigatorPtr& e) : + Serializer("cv::Mat", simox::meta::get_type_name(typeid(data::AronNDArray)), simox::meta::get_type_name(typeid(type::AronOpenCVMat))), + typenavigator(e) + { + // check if type exists + if (ACCEPTED_TYPES.find(e->getTypename()) == ACCEPTED_TYPES.end()) + { + throw error::StringNotValidException("OpenCVMatSerializer", "OpenCVMatSerializer", "Could not find a matching typename.", e->getTypename(), e->getPath()); + } + } + + std::vector<CppFieldPtr> OpenCVMatSerializer::getPublicVariableDeclarations(const std::string& name) const + { + CppFieldPtr field = CppFieldPtr(new CppField(getCppTypename(), name)); + return {field}; + } + + std::vector<std::pair<std::string, std::string>> OpenCVMatSerializer::getCtorInitializers(const std::string&) const + { + return {}; + } + + CppBlockPtr OpenCVMatSerializer::getCtorBlock(const std::string&) const + { + CppBlockPtr b = CppBlockPtr(new CppBlock()); + return b; + } + + CppBlockPtr OpenCVMatSerializer::getResetBlock(const std::string& accessor) const + { + CppBlockPtr b = CppBlockPtr(new CppBlock()); + + std::string escaped_accessor = EscapeAccessor(accessor); + std::string accessor_dimensions = escaped_accessor + DIMENSION_ACCESSOR; + std::string accessor_iterator = escaped_accessor + ITERATOR_ACCESSOR; + + b->addLine("std::vector<int> " + accessor_dimensions + ";"); + b->addLine("for (int " + accessor_iterator + " = 0; " + accessor_iterator + " < " + accessor + ".dims; ++" + accessor_iterator + ")"); + CppBlockPtr b2 = CppBlockPtr(new CppBlock()); + b2->addLine(accessor_dimensions + ".push_back(" + accessor + ".size[" + accessor_iterator + "]);"); + b->appendBlock(b2); + b->addLine(accessor + " = " + getCppTypename() + "(" + accessor_dimensions + ", " + accessor + ".type());"); + return b; + } + + CppBlockPtr OpenCVMatSerializer::getInitializeBlock(const std::string& accessor) const + { + CppBlockPtr b = CppBlockPtr(new CppBlock()); + b->addLine(accessor + " = " + getCppTypename() + "(std::vector<int>({" + simox::alg::to_string<int>(typenavigator->getDimensions(), ", ") + "}), " + ACCEPTED_TYPES.at(typenavigator->getTypename()).first + ");"); + return b; + } + + CppBlockPtr OpenCVMatSerializer::getWriteInitialTypeBlock(const std::string&) const + { + CppBlockPtr b = CppBlockPtr(new CppBlock()); + b->addLine("w.writeOpenCVMat({" + simox::alg::to_string<int>(typenavigator->getDimensions(), ", ") + "}, \"" + typenavigator->getTypename() + "\");"); + return b; + } + + CppBlockPtr OpenCVMatSerializer::getWriteCurrentTypeBlock(const std::string& accessor) const + { + CppBlockPtr b = CppBlockPtr(new CppBlock()); + + std::string escaped_accessor = EscapeAccessor(accessor); + std::string accessor_dimensions = escaped_accessor + DIMENSION_ACCESSOR; + std::string accessor_iterator = escaped_accessor + ITERATOR_ACCESSOR; + + b->addLine("std::vector<int> " + accessor_dimensions + ";"); + b->addLine("for (int " + accessor_iterator + " = 0; " + accessor_iterator + " < " + accessor + ".dims; ++" + accessor_iterator + ")"); + CppBlockPtr b2 = CppBlockPtr(new CppBlock()); + b2->addLine(accessor_dimensions + ".push_back(" + accessor + ".size[" + accessor_iterator + "]);"); + b->appendBlock(b2); + b->addLine("w.writeOpenCVMat(" + accessor_dimensions + ", std::to_string(" + accessor + ".type()));"); + return b; + } + + CppBlockPtr OpenCVMatSerializer::getWriteBlock(const std::string& accessor) const + { + CppBlockPtr b = CppBlockPtr(new CppBlock()); + + std::string escaped_accessor = EscapeAccessor(accessor); + std::string accessor_dimensions = escaped_accessor + DIMENSION_ACCESSOR; + std::string accessor_iterator = escaped_accessor + ITERATOR_ACCESSOR; + + b->addLine("std::vector<int> " + accessor_dimensions + ";"); + b->addLine("for (int " + accessor_iterator + " = 0; " + accessor_iterator + " < " + accessor + ".dims; ++" + accessor_iterator + ")"); + CppBlockPtr b2 = CppBlockPtr(new CppBlock()); + b2->addLine(accessor_dimensions + ".push_back(" + accessor + ".size[" + accessor_iterator + "]);"); + b->appendBlock(b2); + b->addLine(accessor_dimensions + ".push_back(" + accessor + ".elemSize());"); + b->addLine("w.writeNDArray(" + accessor_dimensions + ", std::to_string(" + accessor + ".type()), reinterpret_cast<const unsigned char*>(" + accessor + ".data));"); + return b; + } + + CppBlockPtr OpenCVMatSerializer::getReadBlock(const std::string& accessor) const + { + CppBlockPtr b = CppBlockPtr(new CppBlock()); + std::string escaped_accessor = EscapeAccessor(accessor); + std::string accessor_dimensions = escaped_accessor + DIMENSION_ACCESSOR; + std::string accessor_type = escaped_accessor + TYPE_ACCESSOR; + + b->addLine("const auto [" + accessor_dimensions + ", " + accessor_type + "] = r.readStartNDArray();"); + b->addLine(accessor + " = " + getCppTypename() + "(std::vector<int>({" + accessor_dimensions + ".begin(), std::prev(" + accessor_dimensions + ".end())}), std::stoi(" + accessor_type + "));"); + b->addLine("r.readEndNDArray(reinterpret_cast<unsigned char*>(" + accessor + ".data));"); + return b; + } + + CppBlockPtr OpenCVMatSerializer::getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const + { + CppBlockPtr b = CppBlockPtr(new CppBlock()); + b->addLine("if (cv::countNonZero(" + accessor + " != " + otherInstanceAccessor + ") != 0)"); + b->addLine("\t return false;"); + return b; + } } diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/OpenCVMat.h b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/OpenCVMat.h index fcd719c9e218393c27845a527cdce8fcb2922a70..dff7118e2e4dad0cdc46267e4a927f7d53435eac 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/OpenCVMat.h +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/OpenCVMat.h @@ -64,9 +64,9 @@ namespace armarx::aron::cppcodegenerator::serializer private: // members static const std::map<std::string, std::pair<std::string, int>> ACCEPTED_TYPES; - static const std::string OPENCVMAT_ITERATOR_ACCESSOR; - static const std::string OPENCVMAT_DIMENSIONS_ACCESSOR; - static const std::string OPENCVMAT_DIFF_ACCESSOR; + static constexpr const char* ITERATOR_ACCESSOR = "_iterator"; + static constexpr const char* DIMENSION_ACCESSOR = "_dimensions"; + static constexpr const char* TYPE_ACCESSOR = "_type"; typenavigator::OpenCVMatNavigatorPtr typenavigator; }; diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Orientation.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Orientation.cpp index 0f52f2e3078981277aa20bd7f9f85039ff4faeda..b9f97778607242dffd0203160f7c28c343613846 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Orientation.cpp +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Orientation.cpp @@ -28,7 +28,7 @@ namespace armarx::aron::cppcodegenerator::serializer { // constructors OrientationSerializer::OrientationSerializer(const typenavigator::OrientationNavigatorPtr& n) : - Serializer("std::shared_ptr<Eigen::Quaternionf>", simox::meta::get_type_name(typeid(data::AronNDArray)), simox::meta::get_type_name(typeid(type::AronOrientation))), + Serializer("Eigen::Quaternion<" + n->getTypename() + ">", simox::meta::get_type_name(typeid(data::AronNDArray)), simox::meta::get_type_name(typeid(type::AronOrientation))), typenavigator(n) { } @@ -53,54 +53,56 @@ namespace armarx::aron::cppcodegenerator::serializer CppBlockPtr OrientationSerializer::getResetBlock(const std::string& accessor) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine(accessor + " = " + getCppTypename() + "(new Eigen::Quaternionf(" + accessor + "->width, " + accessor + "->height));"); + b->addLine(accessor + " = " + getCppTypename() + "();"); return b; } CppBlockPtr OrientationSerializer::getInitializeBlock(const std::string& accessor) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine(accessor + " = " + getCppTypename() + "(new Eigen::Quaternionf());"); + b->addLine(accessor + " = " + getCppTypename() + "();"); return b; } CppBlockPtr OrientationSerializer::getWriteInitialTypeBlock(const std::string&) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("w.writeOrientationType({" + simox::alg::to_string(typenavigator->getDimensions(), ", ") + "}, \"" + typenavigator->getTypename() + "\");"); + b->addLine("w.writeOrientation();"); return b; } - CppBlockPtr OrientationSerializer::getWriteCurrentTypeBlock(const std::string& accessor) const + CppBlockPtr OrientationSerializer::getWriteCurrentTypeBlock(const std::string&) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("w.writeOrientationType({" + accessor + "->width, " + accessor + "->height}, \"" + typenavigator->getTypename() + "\");"); + b->addLine("w.writeOrientation();"); return b; } CppBlockPtr OrientationSerializer::getWriteBlock(const std::string& accessor) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("w.writeNDArray({" + simox::alg::to_string(typenavigator->getDimensions(), ", ") + "}, \"" + typenavigator->getTypename() + "\", reinterpret_cast<unsigned char*>(" + accessor + "->data()));"); + b->addLine("w.writeNDArray({" + simox::alg::to_string(typenavigator->getDimensions(), ", ") + "}, \"" + typenavigator->getTypename() + "\", reinterpret_cast<const unsigned char*>(" + accessor + ".coeffs().data()));"); return b; } CppBlockPtr OrientationSerializer::getReadBlock(const std::string& accessor) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("const auto [dims, _] = r.readStartNDArray();"); - b->addLine(accessor + " = " + getCppTypename() + "(new Eigen::Quaternionf());"); - b->addLine("r.readEndNDArray(reinterpret_cast<unsigned char*>(" + accessor + "->data()));"); + std::string escaped_accessor = EscapeAccessor(accessor); + std::string accessor_dimensions = escaped_accessor + DIMENSION_ACCESSOR; + std::string accessor_type = escaped_accessor + TYPE_ACCESSOR; + + b->addLine("const auto [" + accessor_dimensions + ", " + accessor_type + "] = r.readStartNDArray();"); + b->addLine(accessor + " = " + getCppTypename() + "();"); + b->addLine("r.readEndNDArray(reinterpret_cast<unsigned char*>(" + accessor + ".coeffs().data()));"); return b; } CppBlockPtr OrientationSerializer::getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - //b->addLine("if (" + accessor + "->width != " + otherInstanceAccessor + "->width || " + accessor + "->height != " + otherInstanceAccessor + "->height)"); + b->addLine("if (not (" + accessor + ".isApprox(" + otherInstanceAccessor + ")))"); b->addLine("\t return false;"); - //b->addLine("if (" + accessor + "->points != " + otherInstanceAccessor + "->points)"); - //b->addLine("\t return false;"); return b; } } diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Orientation.h b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Orientation.h index a2aebf0fc9340021b2c34a8263b46e74e3746328..248a1a6da3f4a93da04e362640bdb0fa5feedd8e 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Orientation.h +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Orientation.h @@ -61,6 +61,9 @@ namespace armarx::aron::cppcodegenerator::serializer virtual CppBlockPtr getEqualsBlock(const std::string&, const std::string&) const override; private: + static constexpr const char* DIMENSION_ACCESSOR = "_dimensions"; + static constexpr const char* TYPE_ACCESSOR = "_type"; + typenavigator::OrientationNavigatorPtr typenavigator; }; } diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/PCLPointCloud.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/PCLPointCloud.cpp index db9ac1e7e72d43f5fcf68f72e92a573c21380d14..cdf469274f87af9bff64544793dca566b76891f5 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/PCLPointCloud.cpp +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/PCLPointCloud.cpp @@ -41,7 +41,7 @@ namespace armarx::aron::cppcodegenerator::serializer // constructors PCLPointCloudSerializer::PCLPointCloudSerializer(const typenavigator::PCLPointCloudNavigatorPtr& n) : - Serializer("std::shared_ptr<pcl::PointCloud<" + ACCEPTED_TYPES.at(n->getTypename()).first + ">>", simox::meta::get_type_name(typeid(data::AronNDArray)), simox::meta::get_type_name(typeid(type::AronPCLPointCloud))), + Serializer("pcl::PointCloud<" + ACCEPTED_TYPES.at(n->getTypename()).first + ">", simox::meta::get_type_name(typeid(data::AronNDArray)), simox::meta::get_type_name(typeid(type::AronPCLPointCloud))), typenavigator(n) { } @@ -66,51 +66,55 @@ namespace armarx::aron::cppcodegenerator::serializer CppBlockPtr PCLPointCloudSerializer::getResetBlock(const std::string& accessor) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine(accessor + " = " + getCppTypename() + "(new pcl::PointCloud<" + ACCEPTED_TYPES.at(typenavigator->getTypename()).first + ">(" + accessor + "->width, " + accessor + "->height));"); + b->addLine(accessor + " = " + getCppTypename() + "(" + accessor + ".width, " + accessor + ".height);"); return b; } CppBlockPtr PCLPointCloudSerializer::getInitializeBlock(const std::string& accessor) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine(accessor + " = " + getCppTypename() + "(new pcl::PointCloud<" + ACCEPTED_TYPES.at(typenavigator->getTypename()).first + ">(" + std::to_string(typenavigator->getWidth()) + ", " + std::to_string(typenavigator->getHeight()) + "));"); + b->addLine(accessor + " = " + getCppTypename() + "(" + std::to_string(typenavigator->getWidth()) + ", " + std::to_string(typenavigator->getHeight()) + ");"); return b; } CppBlockPtr PCLPointCloudSerializer::getWriteInitialTypeBlock(const std::string&) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("w.writePCLPointCloudType({" + std::to_string(typenavigator->getWidth()) + ", " + std::to_string(typenavigator->getHeight()) + "}, \"" + typenavigator->getTypename() + "\");"); + b->addLine("w.writePCLPointCloud(" + std::to_string(typenavigator->getWidth()) + ", " + std::to_string(typenavigator->getHeight()) + ", \"" + typenavigator->getTypename() + "\");"); return b; } CppBlockPtr PCLPointCloudSerializer::getWriteCurrentTypeBlock(const std::string& accessor) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("w.writePCLPointCloudType({" + accessor + "->width, " + accessor + "->height}, \"" + typenavigator->getTypename() + "\");"); + b->addLine("w.writePCLPointCloud(" + accessor + ".width, " + accessor + ".height, \"" + typenavigator->getTypename() + "\");"); return b; } CppBlockPtr PCLPointCloudSerializer::getWriteBlock(const std::string& accessor) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("w.writeNDArray({" + accessor + "->width, " + accessor + "->height, " + std::to_string(ACCEPTED_TYPES.at(typenavigator->getTypename()).second) + "}, \"" + typenavigator->getTypename() + "\", reinterpret_cast<unsigned char*>(" + accessor + "->points.data()));"); + b->addLine("w.writeNDArray({" + accessor + ".width, " + accessor + ".height, " + std::to_string(ACCEPTED_TYPES.at(typenavigator->getTypename()).second) + "}, \"" + typenavigator->getTypename() + "\", reinterpret_cast<const unsigned char*>(" + accessor + ".points.data()));"); return b; } CppBlockPtr PCLPointCloudSerializer::getReadBlock(const std::string& accessor) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("const auto [dims, _] = r.readStartNDArray();"); - b->addLine(accessor + " = " + getCppTypename() + "(new pcl::PointCloud<" + ACCEPTED_TYPES.at(typenavigator->getTypename()).first + ">(dims[0], dims[1]));"); - b->addLine("r.readEndNDArray(reinterpret_cast<unsigned char*>(" + accessor + "->points.data()));"); + std::string escaped_accessor = EscapeAccessor(accessor); + std::string dims_accessor = escaped_accessor + DIMENSION_ACCESSOR; + std::string type_accessor = escaped_accessor + TYPE_ACCESSOR; + + b->addLine("const auto [" + dims_accessor + ", " + type_accessor + "] = r.readStartNDArray();"); + b->addLine(accessor + " = " + getCppTypename() + "(" + dims_accessor + "[0], " + dims_accessor + "[1]);"); + b->addLine("r.readEndNDArray(reinterpret_cast<unsigned char*>(" + accessor + ".points.data()));"); return b; } CppBlockPtr PCLPointCloudSerializer::getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("if (" + accessor + "->width != " + otherInstanceAccessor + "->width || " + accessor + "->height != " + otherInstanceAccessor + "->height)"); + b->addLine("if (" + accessor + ".width != " + otherInstanceAccessor + ".width || " + accessor + ".height != " + otherInstanceAccessor + ".height)"); b->addLine("\t return false;"); //b->addLine("if (" + accessor + "->points != " + otherInstanceAccessor + "->points)"); //b->addLine("\t return false;"); diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/PCLPointCloud.h b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/PCLPointCloud.h index 4405348096d5f6e3ab774e8c9bfc1204cd22fc3a..101ee2ee61047673fed94964f2d41da297d0c263 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/PCLPointCloud.h +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/PCLPointCloud.h @@ -63,6 +63,8 @@ namespace armarx::aron::cppcodegenerator::serializer private: // members static const std::map<std::string, std::pair<std::string, int>> ACCEPTED_TYPES; + static constexpr const char* DIMENSION_ACCESSOR = "_dimensions"; + static constexpr const char* TYPE_ACCESSOR = "_type"; typenavigator::PCLPointCloudNavigatorPtr typenavigator; }; diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Pose.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Pose.cpp index e517806944548ecc0baa5ec798efabd068bc84d3..382e5853c0993997c663e80330a22fc4a085afa2 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Pose.cpp +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Pose.cpp @@ -28,7 +28,7 @@ namespace armarx::aron::cppcodegenerator::serializer { // constructors PoseSerializer::PoseSerializer(const typenavigator::PoseNavigatorPtr& n) : - Serializer("std::shared_ptr<Eigen::Matrix4f>", simox::meta::get_type_name(typeid(data::AronNDArray)), simox::meta::get_type_name(typeid(type::AronPose))), + Serializer("Eigen::Matrix<" + n->getTypename() + ", " + simox::alg::to_string(n->getDimensions(), ", ") + ">", simox::meta::get_type_name(typeid(data::AronNDArray)), simox::meta::get_type_name(typeid(type::AronPose))), typenavigator(n) { } @@ -53,14 +53,14 @@ namespace armarx::aron::cppcodegenerator::serializer CppBlockPtr PoseSerializer::getResetBlock(const std::string& accessor) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine(accessor + " = " + getCppTypename() + "(new std::shared_ptr<Eigen::Matrix4f>());"); + b->addLine(accessor + " = " + getCppTypename() + "();"); return b; } CppBlockPtr PoseSerializer::getInitializeBlock(const std::string& accessor) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine(accessor + " = " + getCppTypename() + "(new std::shared_ptr<Eigen::Matrix4f>());"); + b->addLine(accessor + " = " + getCppTypename() + "();"); return b; } @@ -81,26 +81,28 @@ namespace armarx::aron::cppcodegenerator::serializer CppBlockPtr PoseSerializer::getWriteBlock(const std::string& accessor) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("w.writeNDArray({" + simox::alg::to_string(typenavigator->getDimensions(), ", ") + "}, \"" + typenavigator->getTypename() + "\", reinterpret_cast<unsigned char*>(" + accessor + "->data()));"); + b->addLine("w.writeNDArray({" + simox::alg::to_string(typenavigator->getDimensions(), ", ") + "}, \"" + typenavigator->getTypename() + "\", reinterpret_cast<const unsigned char*>(" + accessor + ".data()));"); return b; } CppBlockPtr PoseSerializer::getReadBlock(const std::string& accessor) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("const auto [dims, _] = r.readStartNDArray();"); - b->addLine(accessor + " = " + getCppTypename() + "(new Eigen::Matrix4f());"); - b->addLine("r.readEndNDArray(reinterpret_cast<unsigned char*>(" + accessor + "->points.data()));"); + std::string escaped_accessor = EscapeAccessor(accessor); + std::string accessor_dimensions = escaped_accessor + DIMENSION_ACCESSOR; + std::string accessor_type = escaped_accessor + TYPE_ACCESSOR; + + b->addLine("const auto [" + accessor_dimensions + ", " + accessor_type + "] = r.readStartNDArray();"); + b->addLine(accessor + " = " + getCppTypename() + "();"); + b->addLine("r.readEndNDArray(reinterpret_cast<unsigned char*>(" + accessor + ".data()));"); return b; } CppBlockPtr PoseSerializer::getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("if (" + accessor + "->width != " + otherInstanceAccessor + "->width || " + accessor + "->height != " + otherInstanceAccessor + "->height)"); + b->addLine("if (not (" + accessor + ".isApprox(" + otherInstanceAccessor + ")))"); b->addLine("\t return false;"); - //b->addLine("if (" + accessor + "->points != " + otherInstanceAccessor + "->points)"); - //b->addLine("\t return false;"); return b; } } diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Pose.h b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Pose.h index f58bdff1ae565e95cb4074a1cc8ef5c6a3e8c38f..567b4f1ef970f2084c7b032074808438d3d27e5d 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Pose.h +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Pose.h @@ -61,6 +61,9 @@ namespace armarx::aron::cppcodegenerator::serializer virtual CppBlockPtr getEqualsBlock(const std::string&, const std::string&) const override; private: + static constexpr const char* DIMENSION_ACCESSOR = "_dimensions"; + static constexpr const char* TYPE_ACCESSOR = "_type"; + typenavigator::PoseNavigatorPtr typenavigator; }; } diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Position.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Position.cpp index 9a72117ecc4eb01107ea1055f9f3b6c3a06ac4a7..e1aa51fcfe4d98a07dab2022910b366fa27f98f0 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Position.cpp +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Position.cpp @@ -28,7 +28,7 @@ namespace armarx::aron::cppcodegenerator::serializer { // constructors PositionSerializer::PositionSerializer(const typenavigator::PositionNavigatorPtr& n) : - Serializer("std::shared_ptr<Eigen::Vector3f>", simox::meta::get_type_name(typeid(data::AronNDArray)), simox::meta::get_type_name(typeid(type::AronPosition))), + Serializer("Eigen::Matrix<" + n->getTypename() + ", " + simox::alg::to_string(n->getDimensions(), ", ") + ">", simox::meta::get_type_name(typeid(data::AronNDArray)), simox::meta::get_type_name(typeid(type::AronPosition))), typenavigator(n) { } @@ -53,14 +53,14 @@ namespace armarx::aron::cppcodegenerator::serializer CppBlockPtr PositionSerializer::getResetBlock(const std::string& accessor) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine(accessor + " = " + getCppTypename() + "(new Eigen::Vector3f());"); + b->addLine(accessor + " = " + getCppTypename() + "();"); return b; } CppBlockPtr PositionSerializer::getInitializeBlock(const std::string& accessor) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine(accessor + " = " + getCppTypename() + "(new Eigen::Vector3f());"); + b->addLine(accessor + " = " + getCppTypename() + "();"); return b; } @@ -81,26 +81,28 @@ namespace armarx::aron::cppcodegenerator::serializer CppBlockPtr PositionSerializer::getWriteBlock(const std::string& accessor) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("w.writeNDArray({" + simox::alg::to_string(typenavigator->getDimensions(), ", ") + "}, \"" + typenavigator->getTypename() + "\", reinterpret_cast<unsigned char*>(" + accessor + "->data()));"); + b->addLine("w.writeNDArray({" + simox::alg::to_string(typenavigator->getDimensions(), ", ") + "}, \"" + typenavigator->getTypename() + "\", reinterpret_cast<const unsigned char*>(" + accessor + ".data()));"); return b; } CppBlockPtr PositionSerializer::getReadBlock(const std::string& accessor) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - b->addLine("const auto [dims, _] = r.readStartNDArray();"); - b->addLine(accessor + " = " + getCppTypename() + "(new Eigen::Vector3f());"); - b->addLine("r.readEndNDArray(reinterpret_cast<unsigned char*>(" + accessor + "->data()));"); + std::string escaped_accessor = EscapeAccessor(accessor); + std::string accessor_dimensions = escaped_accessor + DIMENSION_ACCESSOR; + std::string accessor_type = escaped_accessor + TYPE_ACCESSOR; + + b->addLine("const auto [" + accessor_dimensions + ", " + accessor_type + "] = r.readStartNDArray();"); + b->addLine(accessor + " = " + getCppTypename() + "();"); + b->addLine("r.readEndNDArray(reinterpret_cast<unsigned char*>(" + accessor + ".data()));"); return b; } CppBlockPtr PositionSerializer::getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const { CppBlockPtr b = CppBlockPtr(new CppBlock()); - //b->addLine("if (" + accessor + "->width != " + otherInstanceAccessor + "->width || " + accessor + "->height != " + otherInstanceAccessor + "->height)"); + b->addLine("if (not (" + accessor + ".isApprox(" + otherInstanceAccessor + ")))"); b->addLine("\t return false;"); - //b->addLine("if (" + accessor + "->points != " + otherInstanceAccessor + "->points)"); - //b->addLine("\t return false;"); return b; } } diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Position.h b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Position.h index 9de67dd0ca1a927bd35281485ab820d92018659f..94b9317e0921c8d1e9c1985eb0060d6427ddfeaa 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Position.h +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/ndarray/Position.h @@ -61,6 +61,9 @@ namespace armarx::aron::cppcodegenerator::serializer virtual CppBlockPtr getEqualsBlock(const std::string&, const std::string&) const override; private: + static constexpr const char* DIMENSION_ACCESSOR = "_dimensions"; + static constexpr const char* TYPE_ACCESSOR = "_type"; + typenavigator::PositionNavigatorPtr typenavigator; }; } diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/Primitive.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/Primitive.cpp index 7d2001905d466feaeca9d3134eb1850b7b0775ad..abf316efd231a753ceb49986bce6aa5c1531a38d 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/Primitive.cpp +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/primitive/Primitive.cpp @@ -30,12 +30,23 @@ #include "Primitive.h" namespace armarx::aron::cppcodegenerator::serializer - { +{ + namespace + { + std::string convertStdString(const std::string& s) + { + if(s == "string") + { + return "std::string"; + } + return s; + } + } #define RUN_ARON_MACRO(upperType, lowerType, capsType, upperData, lowerData, capsData) \ /* constructors */ \ upperType##Serializer::upperType##Serializer(const typenavigator::upperType##NavigatorPtr& e) : \ - Serializer(simox::meta::get_type_name(typeid(lowerData)), simox::meta::get_type_name(typeid(data::Aron##upperData)), simox::meta::get_type_name(typeid(type::Aron##upperType))), \ + Serializer(convertStdString(#lowerData), simox::meta::get_type_name(typeid(data::Aron##upperData)), simox::meta::get_type_name(typeid(type::Aron##upperType))), \ typenavigator(e) \ { \ \ @@ -76,14 +87,14 @@ namespace armarx::aron::cppcodegenerator::serializer CppBlockPtr upperType##Serializer::getWriteInitialTypeBlock(const std::string&) const \ { \ CppBlockPtr b = CppBlockPtr(new CppBlock()); \ - b->addLine("w.write" + std::string(#upperType) + "Type();"); \ + b->addLine("w.write" + std::string(#upperType) + "();"); \ return b; \ } \ \ CppBlockPtr upperType##Serializer::getWriteCurrentTypeBlock(const std::string&) const \ { \ CppBlockPtr b = CppBlockPtr(new CppBlock()); \ - b->addLine("w.write" + std::string(#upperType) + "Type();"); \ + b->addLine("w.write" + std::string(#upperType) + "();"); \ return b; \ } \ \ diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/toplevel/IntEnumClass.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/toplevel/IntEnumClass.cpp new file mode 100644 index 0000000000000000000000000000000000000000..20d453e18ad146c2bb7c3c8f1a05f4961232978e --- /dev/null +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/toplevel/IntEnumClass.cpp @@ -0,0 +1,120 @@ +/* + * This file is part of ArmarX. + * + * Copyright (C) 2012-2016, High Performance Humanoid Technologies (H2T), + * Karlsruhe Institute of Technology (KIT), all rights reserved. + * + * ArmarX is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * ArmarX is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + * @author Fabian Peller-Konrad (fabian dot peller-konrad at kit dot edu) + * @copyright http://www.gnu.org/licenses/gpl-2.0.txt + * GNU General Public License + */ + +// Header +#include "IntEnumClass.h" + +namespace armarx::aron::cppcodegenerator::serializer +{ + // constructors + IntEnumClassSerializer::IntEnumClassSerializer(const typenavigator::IntEnumNavigatorPtr& n) : + Serializer(n->getEnumName(), simox::meta::get_type_name(typeid(data::AronNDArray)), simox::meta::get_type_name(typeid(type::AronIntEnum))), + navigator(n) + { + } + + std::vector<CppFieldPtr> IntEnumClassSerializer::getPublicVariableDeclarations(const std::string&) const + { + std::vector<CppFieldPtr> fields; + std::stringstream val_to_name; + std::stringstream name_to_val; + val_to_name << "{" << std::endl; + name_to_val << "{" << std::endl; + for (const auto& [key, value] : navigator->getAcceptedValues()) + { + fields.push_back(std::make_shared<CppField>("static const int", key, std::to_string(value))); + val_to_name << "\t\t{" << key << ", \"" << key << "\"}," << std::endl; + name_to_val << "\t\t{\"" << key << "\", " << key << "}," << std::endl; + } + val_to_name << "\t}"; + name_to_val << "\t}"; + + fields.push_back(std::make_shared<CppField>("const std::map<int, std::string>", "ToStringMap", val_to_name.str())); + fields.push_back(std::make_shared<CppField>("const std::map<std::string, int>", "FromStringMap", name_to_val.str())); + + fields.push_back(std::make_shared<CppField>("int", "value", "-1")); + + return fields; + } + + std::vector<std::pair<std::string, std::string>> IntEnumClassSerializer::getCtorInitializers(const std::string&) const + { + return {}; + } + + CppBlockPtr IntEnumClassSerializer::getCtorBlock(const std::string&) const + { + CppBlockPtr b = CppBlockPtr(new CppBlock()); + return b; + } + + CppBlockPtr IntEnumClassSerializer::getResetBlock(const std::string&) const + { + CppBlockPtr b = CppBlockPtr(new CppBlock()); + + return b; + } + + CppBlockPtr IntEnumClassSerializer::getWriteInitialTypeBlock(const std::string&) const + { + CppBlockPtr b = CppBlockPtr(new CppBlock()); + + return b; + } + + CppBlockPtr IntEnumClassSerializer::getWriteCurrentTypeBlock(const std::string&) const + { + CppBlockPtr b = CppBlockPtr(new CppBlock()); + + return b; + } + + CppBlockPtr IntEnumClassSerializer::getInitializeBlock(const std::string&) const + { + CppBlockPtr b = CppBlockPtr(new CppBlock()); + b->addLine("value = -1;"); + return b; + } + + CppBlockPtr IntEnumClassSerializer::getWriteBlock(const std::string&) const + { + CppBlockPtr b = CppBlockPtr(new CppBlock()); + b->addLine("w.writePrimitive(value);"); + return b; + } + + CppBlockPtr IntEnumClassSerializer::getReadBlock(const std::string&) const + { + CppBlockPtr b = CppBlockPtr(new CppBlock()); + b->addLine("r.readPrimitive(value);"); + return b; + } + + CppBlockPtr IntEnumClassSerializer::getEqualsBlock(const std::string&, const std::string& otherInstanceAccessor) const + { + CppBlockPtr b = CppBlockPtr(new CppBlock()); + b->addLine("if (not (value == " + otherInstanceAccessor + ".value))"); + b->addLine("\t return false;"); + return b; + } +} diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/toplevel/IntEnumClass.h b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/toplevel/IntEnumClass.h new file mode 100644 index 0000000000000000000000000000000000000000..a2d2ad463f73b98354cf4bc231511df26bc0a750 --- /dev/null +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/toplevel/IntEnumClass.h @@ -0,0 +1,70 @@ +/* + * This file is part of ArmarX. + * + * Copyright (C) 2012-2016, High Performance Humanoid Technologies (H2T), + * Karlsruhe Institute of Technology (KIT), all rights reserved. + * + * ArmarX is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * ArmarX is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + * @author Fabian Peller-Konrad (fabian dot peller-konrad at kit dot edu) + * @copyright http://www.gnu.org/licenses/gpl-2.0.txt + * GNU General Public License + */ + +#pragma once + +// STD/STL +#include <string> +#include <map> + +// Base Class +#include <RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/Serializer.h> + +// ArmarX +#include <RobotAPI/libraries/aron/core/navigator/type/enum/IntEnum.h> + +namespace armarx::aron::cppcodegenerator::serializer +{ + + class IntEnumClassSerializer; + typedef std::shared_ptr<IntEnumClassSerializer> IntEnumClassSerializerPtr; + + class IntEnumClassSerializer : + virtual public Serializer + { + public: + using PointerType = IntEnumClassSerializerPtr; + + public: + // constructors + IntEnumClassSerializer(const typenavigator::IntEnumNavigatorPtr&); + + // virtual implementations + std::vector<CppFieldPtr> getPublicVariableDeclarations(const std::string&) const; + virtual std::vector<std::pair<std::string, std::string>> getCtorInitializers(const std::string&) const override; + virtual CppBlockPtr getCtorBlock(const std::string&) const override; + virtual CppBlockPtr getWriteInitialTypeBlock(const std::string&) const override; + virtual CppBlockPtr getWriteCurrentTypeBlock(const std::string&) const override; + virtual CppBlockPtr getInitializeBlock(const std::string&) const override; + virtual CppBlockPtr getResetBlock(const std::string&) const override; + virtual CppBlockPtr getWriteBlock(const std::string&) const override; + virtual CppBlockPtr getReadBlock(const std::string&) const override; + virtual CppBlockPtr getEqualsBlock(const std::string&, const std::string&) const override; + + private: + // Members + static const std::map<std::string, std::pair<std::string, int>> ACCEPTED_TYPES; + + typenavigator::IntEnumNavigatorPtr navigator; + }; +} diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/toplevel/ObjectClass.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/toplevel/ObjectClass.cpp new file mode 100644 index 0000000000000000000000000000000000000000..dc1c52a4e7b9963cb33013f36f65869e47c7199b --- /dev/null +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/toplevel/ObjectClass.cpp @@ -0,0 +1,199 @@ +/* + * This file is part of ArmarX. + * + * Copyright (C) 2012-2016, High Performance Humanoid Technologies (H2T), + * Karlsruhe Institute of Technology (KIT), all rights reserved. + * + * ArmarX is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * ArmarX is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + * @author Fabian Peller-Konrad (fabian dot peller-konrad at kit dot edu) + * @copyright http://www.gnu.org/licenses/gpl-2.0.txt + * GNU General Public License + */ + +// Header +#include "ObjectClass.h" + + +namespace armarx::aron::cppcodegenerator::serializer +{ + // constructors + ObjectClassSerializer::ObjectClassSerializer(const typenavigator::ObjectNavigatorPtr& e) : + Serializer(e->getObjectName(), simox::meta::get_type_name(typeid(data::AronDict)), simox::meta::get_type_name(typeid(type::AronObject))), + navigator(e) + { + //AddObjectTypeToAllObjectTypesList(ObjectNavigatorPtr(this)); + } + + std::vector<CppFieldPtr> ObjectClassSerializer::getPublicVariableDeclarations(const std::string&) const + { + std::vector<CppFieldPtr> fields; + for (const auto& [key, member] : navigator->getMemberTypes()) + { + auto member_s = FromAronTypeNaviagtorPtr(member); + std::vector<CppFieldPtr> member_fields = member_s->getPublicVariableDeclarations(key); + fields.insert(fields.end(), member_fields.begin(), member_fields.end()); + } + return fields; + } + + std::vector<std::pair<std::string, std::string>> ObjectClassSerializer::getCtorInitializers(const std::string&) const + { + return {}; + } + + CppBlockPtr ObjectClassSerializer::getCtorBlock(const std::string&) const + { + CppBlockPtr b = CppBlockPtr(new CppBlock()); + return b; + } + + CppBlockPtr ObjectClassSerializer::getResetBlock(const std::string&) const + { + CppBlockPtr b = CppBlockPtr(new CppBlock()); + if (navigator->getExtends() != nullptr) + { + const auto extends_s = FromAronTypeNaviagtorPtr(navigator->getExtends()); + b->addLine(extends_s->getCppTypename() + "::reset();"); + } + + for (const auto& [key, child] : navigator->getMemberTypes()) + { + auto child_s = FromAronTypeNaviagtorPtr(child); + CppBlockPtr b2 = child_s->getResetBlock(key); + b->appendBlock(b2); + } + return b; + } + + CppBlockPtr ObjectClassSerializer::getInitializeBlock(const std::string&) const + { + CppBlockPtr b = CppBlockPtr(new CppBlock()); + if (navigator->getExtends() != nullptr) + { + const auto extends_s = FromAronTypeNaviagtorPtr(navigator->getExtends()); + b->addLine(extends_s->getCppTypename() + "::initialize();"); + } + + for (const auto& [key, child] : navigator->getMemberTypes()) + { + const auto child_s = FromAronTypeNaviagtorPtr(child); + CppBlockPtr b2 = child_s->getInitializeBlock(key); + b->appendBlock(b2); + } + return b; + } + + CppBlockPtr ObjectClassSerializer::getWriteInitialTypeBlock(const std::string&) const + { + CppBlockPtr b = CppBlockPtr(new CppBlock()); + if (navigator->getExtends() != nullptr) + { + const auto extends_s = FromAronTypeNaviagtorPtr(navigator->getExtends()); + b->addLine(extends_s->getCppTypename() + "::writeInitialType(w);"); + } + + b->addLine("w.writeStartObject(\"" + navigator->getObjectName() + "\");"); + for (const auto& [key, child] : navigator->getMemberTypes()) + { + const auto child_s = FromAronTypeNaviagtorPtr(child); + b->addLine("w.writeKey(\"" + key + "\");"); + CppBlockPtr b2 = child_s->getWriteInitialTypeBlock(child_s->getCppTypename()); + b->appendBlock(b2); + } + b->addLine("w.writeEndObject();"); + return b; + } + + CppBlockPtr ObjectClassSerializer::getWriteCurrentTypeBlock(const std::string&) const + { + CppBlockPtr b = CppBlockPtr(new CppBlock()); + if (navigator->getExtends() != nullptr) + { + const auto extends_s = FromAronTypeNaviagtorPtr(navigator->getExtends()); + b->addLine(extends_s->getCppTypename() + "::writeCurrentType(w);"); + } + + b->addLine("w.writeStartObject(\"" + navigator->getObjectName() + "\");"); + for (const auto& [key, child] : navigator->getMemberTypes()) + { + const auto child_s = FromAronTypeNaviagtorPtr(child); + b->addLine("w.writeKey(\"" + key + "\");"); + CppBlockPtr b2 = child_s->getWriteCurrentTypeBlock(key); + b->appendBlock(b2); + } + b->addLine("w.writeEndObject();"); + return b; + } + + CppBlockPtr ObjectClassSerializer::getWriteBlock(const std::string&) const + { + CppBlockPtr b = CppBlockPtr(new CppBlock()); + if (navigator->getExtends() != nullptr) + { + const auto extends_s = FromAronTypeNaviagtorPtr(navigator->getExtends()); + b->addLine(extends_s->getCppTypename() + "::write(w, aron_type);"); + } + + b->addLine("w.writeStartDict();"); + for (const auto& [key, child] : navigator->getMemberTypes()) + { + const auto child_s = FromAronTypeNaviagtorPtr(child); + b->addLine("w.writeKey(\"" + key + "\");"); + CppBlockPtr b2 = child_s->getWriteBlock(key); + b->appendBlock(b2); + } + b->addLine("w.writeEndDict();"); + return b; + } + + CppBlockPtr ObjectClassSerializer::getReadBlock(const std::string&) const + { + CppBlockPtr b = CppBlockPtr(new CppBlock()); + if (navigator->getExtends() != nullptr) + { + const auto extends_s = FromAronTypeNaviagtorPtr(navigator->getExtends()); + b->addLine(extends_s->getCppTypename() + "::read(r);"); + } + + b->addLine("r.readStartDict();"); + for (const auto& [key, child] : navigator->getMemberTypes()) + { + const auto child_s = FromAronTypeNaviagtorPtr(child); + b->addLine("r.loadMember(\"" + key + "\");"); + CppBlockPtr b2 = child_s->getReadBlock(key); + b->appendBlock(b2); + } + b->addLine("r.readEndDict();"); + return b; + } + + CppBlockPtr ObjectClassSerializer::getEqualsBlock(const std::string&, const std::string& otherInstanceAccessor) const + { + CppBlockPtr b = CppBlockPtr(new CppBlock()); + if (navigator->getExtends() != nullptr) + { + const auto extends_s = FromAronTypeNaviagtorPtr(navigator->getExtends()); + b->addLine("if (not (" + extends_s->getCppTypename() + "::operator== (" + otherInstanceAccessor + ")))"); + b->addLine("\t return false;"); + } + for (const auto& [key, child] : navigator->getMemberTypes()) + { + auto child_s = FromAronTypeNaviagtorPtr(child); + CppBlockPtr b2 = child_s->getEqualsBlock(key, otherInstanceAccessor + "." + key); + b->appendBlock(b2); + } + return b; + } +} + diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/toplevel/ObjectClass.h b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/toplevel/ObjectClass.h new file mode 100644 index 0000000000000000000000000000000000000000..7b996cb7625ab2968d515cb0db05060a85e0ce60 --- /dev/null +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/toplevel/ObjectClass.h @@ -0,0 +1,71 @@ +/* + * This file is part of ArmarX. + * + * Copyright (C) 2012-2016, High Performance Humanoid Technologies (H2T), + * Karlsruhe Institute of Technology (KIT), all rights reserved. + * + * ArmarX is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * ArmarX is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + * @author Fabian Peller-Konrad (fabian dot peller-konrad at kit dot edu) + * @copyright http://www.gnu.org/licenses/gpl-2.0.txt + * GNU General Public License + */ + +#pragma once + +// STD/STL +#include <string> +#include <map> + +// Base Class +#include <RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/Serializer.h> + +// ArmarX +#include <RobotAPI/libraries/aron/core/navigator/type/container/Object.h> + + +namespace armarx::aron::cppcodegenerator::serializer +{ + + class ObjectClassSerializer; + typedef std::shared_ptr<ObjectClassSerializer> ObjectClassSerializerPtr; + + class ObjectClassSerializer : + virtual public Serializer + { + public: + using PointerType = ObjectClassSerializerPtr; + + public: + // constructors + ObjectClassSerializer(const typenavigator::ObjectNavigatorPtr&); + + // virtual implementations + std::vector<CppFieldPtr> getPublicVariableDeclarations(const std::string&) const; + virtual std::vector<std::pair<std::string, std::string>> getCtorInitializers(const std::string&) const override; + virtual CppBlockPtr getCtorBlock(const std::string&) const override; + virtual CppBlockPtr getWriteInitialTypeBlock(const std::string&) const override; + virtual CppBlockPtr getWriteCurrentTypeBlock(const std::string&) const override; + virtual CppBlockPtr getInitializeBlock(const std::string&) const override; + virtual CppBlockPtr getResetBlock(const std::string&) const override; + virtual CppBlockPtr getWriteBlock(const std::string&) const override; + virtual CppBlockPtr getReadBlock(const std::string&) const override; + virtual CppBlockPtr getEqualsBlock(const std::string&, const std::string&) const override; + + private: + // members + static constexpr const char* EXTENDS_ITERATOR_ACCESSOR = "_extends"; + + typenavigator::ObjectNavigatorPtr navigator; + }; +} diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/typeReader/Reader.h b/source/RobotAPI/libraries/aron/core/codegenerator/typeReader/Reader.h index 0cdc95710df5a6efaad982591d4a0ef70cdd2c60..c65d64893b4ecc86f2c5b97a7bc7be5cdbb18ff0 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/typeReader/Reader.h +++ b/source/RobotAPI/libraries/aron/core/codegenerator/typeReader/Reader.h @@ -66,9 +66,13 @@ namespace armarx::aron::typereader { return readers; } - std::vector<codegeneratorhelper::GenerateTypeInfoPtr> getGenerateTypes() const + std::vector<codegeneratorhelper::GenerateObjectInfoPtr> getGenerateObjects() const { - return generateTypes; + return generateObjects; + } + std::vector<codegeneratorhelper::GenerateIntEnumInfoPtr> getGenerateIntEnums() const + { + return generateIntEnums; } protected: @@ -78,6 +82,7 @@ namespace armarx::aron::typereader std::vector<std::string> aronIncludes; std::vector<codegeneratorhelper::ReaderInfoPtr> readers; std::vector<codegeneratorhelper::WriterInfoPtr> writers; - std::vector<codegeneratorhelper::GenerateTypeInfoPtr> generateTypes; + std::vector<codegeneratorhelper::GenerateIntEnumInfoPtr> generateIntEnums; + std::vector<codegeneratorhelper::GenerateObjectInfoPtr> generateObjects; }; } diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/typeReader/xml/Data.h b/source/RobotAPI/libraries/aron/core/codegenerator/typeReader/xml/Data.h index 85658becf94b453963859b25a6e180838dd7b980..2f152c9e4d1d2925d8a0c5848f9529458b666604 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/typeReader/xml/Data.h +++ b/source/RobotAPI/libraries/aron/core/codegenerator/typeReader/xml/Data.h @@ -54,15 +54,16 @@ namespace armarx::aron::xmltypereader static constexpr const char* GENERATE_TYPES_TAG = "generatetypes"; static constexpr const char* INCLUDE_TAG = "include"; - static constexpr const char* GENERATE_TYPE_TAG = "generatetype"; + static constexpr const char* GENERATE_OBJECT_TAG = "object"; + static constexpr const char* GENERATE_INT_ENUM_TAG = "intenum"; // Attribute names - static constexpr const char* METHOD_ATTRIBUTE_NAME = "include"; - static constexpr const char* RETURN_ATTRIBUTE_NAME = "method"; - static constexpr const char* ARGUMENT_TYPE_ATTRIBUTE_NAME = "return"; - static constexpr const char* INCLUDE_ATTRIBUTE_NAME = "argumenttype"; - static constexpr const char* READER_ATTRIBUTE_NAME = "writer"; - static constexpr const char* WRITER_ATTRIBUTE_NAME = "reader"; + static constexpr const char* METHOD_ATTRIBUTE_NAME = "method"; + static constexpr const char* RETURN_ATTRIBUTE_NAME = "return"; + static constexpr const char* ARGUMENT_TYPE_ATTRIBUTE_NAME = "argumenttype"; + static constexpr const char* INCLUDE_ATTRIBUTE_NAME = "include"; + static constexpr const char* READER_ATTRIBUTE_NAME = "reader"; + static constexpr const char* WRITER_ATTRIBUTE_NAME = "writer"; static constexpr const char* EXTENDS_ATTRIBUTE_NAME = "extends"; static constexpr const char* NAME_ATTRIBUTE_NAME = "name"; static constexpr const char* VALUE_ATTRIBUTE_NAME = "value"; @@ -79,11 +80,11 @@ namespace armarx::aron::xmltypereader static constexpr const char* ENUM_VALUE_TAG = "enumvalue"; // Top Level type tags - #define RUN_ARON_MACRO(upperType, lowerType, capsType) \ - static constexpr const char* GENERATE_##capsType##_TAG = #lowerType; +#define RUN_ARON_MACRO(upperType, lowerType, capsType) \ + static constexpr const char* GENERATE_##capsType##_MEMBER_TAG = #lowerType; HANDLE_ALL_ARON_TYPES - #undef RUN_ARON_MACRO +#undef RUN_ARON_MACRO static void EnforceAttribute(const RapidXmlReaderNode& node, const std::string& att) { diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/typeReader/xml/Reader.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/typeReader/xml/Reader.cpp index 812e261fa892eab843cf52eff7201205c56fee1a..6bf00c8db81a9bd61b579d760b6b250f47544537 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/typeReader/xml/Reader.cpp +++ b/source/RobotAPI/libraries/aron/core/codegenerator/typeReader/xml/Reader.cpp @@ -131,9 +131,22 @@ namespace armarx::aron::xmltypereader for (const auto& generateType : children[generate_types_index].nodes()) { // ugly workaround - const typenavigator::ObjectNavigatorPtr aronObj = readGenerateType(generateType); - const std::map<std::string, codegeneratorhelper::GenerateTypeInfoPtr> generatedObjects = factory.GetAllKnownGeneratedPublicObjects(); - generateTypes.push_back(generatedObjects.at(aronObj->getObjectName())); + if(Data::HasTagName(generateType, Data::GENERATE_OBJECT_TAG)) + { + const auto nav = readGenerateObject(generateType); + const auto infos = factory.AllPublicObjects; + generateObjects.push_back(infos.at(simox::alg::to_lower(nav->getObjectName()))); + continue; + } + if(Data::HasTagName(generateType, Data::GENERATE_INT_ENUM_TAG)) + { + const auto nav = readGenerateIntEnum(generateType); + const auto infos = factory.AllPublicIntEnums; + generateIntEnums.push_back(infos.at(simox::alg::to_lower(nav->getEnumName()))); + continue; + } + throw error::StringNotValidException("XMLReader", "parse", "Could not find a valid tag inside generatetypes", generateType.name()); + } } } @@ -159,10 +172,17 @@ namespace armarx::aron::xmltypereader return xmlinclude; } - typenavigator::ObjectNavigatorPtr Reader::readGenerateType(const RapidXmlReaderNode& node) const + typenavigator::ObjectNavigatorPtr Reader::readGenerateObject(const RapidXmlReaderNode& node) const + { + Data::EnforceTagName(node, Data::GENERATE_OBJECT_TAG); + return typenavigator::ObjectNavigator::DynamicCastAndCheck(factory.create(node, Path())); + + } + + typenavigator::IntEnumNavigatorPtr Reader::readGenerateIntEnum(const RapidXmlReaderNode& node) const { - Data::EnforceTagName(node, Data::GENERATE_TYPE_TAG); - return typenavigator::ObjectNavigator::DynamicCast(factory.createSpecific(node, Path())); + Data::EnforceTagName(node, Data::GENERATE_INT_ENUM_TAG); + return typenavigator::IntEnumNavigator::DynamicCastAndCheck(factory.create(node, Path())); } } diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/typeReader/xml/Reader.h b/source/RobotAPI/libraries/aron/core/codegenerator/typeReader/xml/Reader.h index 6decba395d2fdfc9e35c1d7fd6cd7d5638e0d4ba..0801465160e06ddbd0ebfc78b57d8b8bb97eafcd 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/typeReader/xml/Reader.h +++ b/source/RobotAPI/libraries/aron/core/codegenerator/typeReader/xml/Reader.h @@ -57,9 +57,10 @@ namespace armarx::aron::xmltypereader std::string readCppInclude(const RapidXmlReaderNode& node) const; std::string readAronInclude(const RapidXmlReaderNode& node) const; - typenavigator::ObjectNavigatorPtr readGenerateType(const RapidXmlReaderNode& node) const; + typenavigator::ObjectNavigatorPtr readGenerateObject(const RapidXmlReaderNode& node) const; + typenavigator::IntEnumNavigatorPtr readGenerateIntEnum(const RapidXmlReaderNode& node) const; private: - ObjectReaderFactory factory; + ReaderFactory factory; }; } diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/typeReader/xml/ReaderFactory.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/typeReader/xml/ReaderFactory.cpp index dbb245ad18601a3b5a6729cc4b86ac611e154454..da9eff9f25c9ee9478d7c183ae4fde981e21a16f 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/typeReader/xml/ReaderFactory.cpp +++ b/source/RobotAPI/libraries/aron/core/codegenerator/typeReader/xml/ReaderFactory.cpp @@ -34,354 +34,381 @@ #include <RobotAPI/libraries/aron/core/codegenerator/typeReader/xml/Data.h> namespace armarx::aron::xmltypereader - { - std::stack<codegeneratorhelper::GenerateTypeInfoPtr> ReaderFactory::TheObjectWeAreGoingToGenerateNowStack = {}; - std::map<std::string, codegeneratorhelper::GenerateTypeInfoPtr> ReaderFactory::AllKnownGeneratedPublicObjects = {}; +{ + std::stack<codegeneratorhelper::GenerateObjectInfoPtr> ReaderFactory::ObjectGenerationStack = {}; + std::map<std::string, codegeneratorhelper::GenerateObjectInfoPtr> ReaderFactory::AllPublicObjects = {}; + std::map<std::string, codegeneratorhelper::GenerateIntEnumInfoPtr> ReaderFactory::AllPublicIntEnums = {}; - typenavigator::NavigatorPtr ReaderFactory::create(const RapidXmlReaderNode& node, const Path& path) const - { + typenavigator::NavigatorPtr ReaderFactory::create(const RapidXmlReaderNode& node, const Path& path) const + { #define RUN_ARON_MACRO(upperType, lowerType, capsType) \ - {Data::GENERATE_##capsType##_TAG, ReaderFactoryPtr(new upperType##ReaderFactory())}, - static const std::map<std::string, ReaderFactoryPtr> Factories = - { - HANDLE_ALL_ARON_TYPES - }; + {Data::GENERATE_##capsType##_MEMBER_TAG, ReaderFactoryPtr(new upperType##ReaderFactory())}, + static const std::map<std::string, ReaderFactoryPtr> Factories = + { + {Data::GENERATE_OBJECT_TAG, ReaderFactoryPtr(new ObjectReaderFactory())}, + {Data::GENERATE_INT_ENUM_TAG, ReaderFactoryPtr(new IntEnumReaderFactory())}, + HANDLE_ALL_ARON_TYPES + }; #undef RUN_ARON_MACRO - const std::string tag = simox::alg::to_lower(node.name()); - if (tag == "") - { - throw error::AronException("XMLReaderFactory", "create", "An node is empty. Cannot find facory for empty nodes."); - } - auto factory_iterator = Factories.find(tag); - if (factory_iterator != Factories.end()) - { - return factory_iterator->second->createSpecific(node, path); - } - - // Search for known objects - return ResolveTypename(tag); - } - - std::map<std::string, codegeneratorhelper::GenerateTypeInfoPtr> ReaderFactory::GetAllKnownGeneratedPublicObjects() - { - return AllKnownGeneratedPublicObjects; - } - - typenavigator::NavigatorPtr ReaderFactory::ResolveTypename(const std::string& name) - { - const auto public_it = AllKnownGeneratedPublicObjects.find(name); - if (public_it != AllKnownGeneratedPublicObjects.end()) - { - return public_it->second->correspondingObjectType; - } - - throw error::StringNotValidException("XMLReaderFactory", "ResolveTypename", "Could not find a tag. Please note that you cant make use of nested objects yet", name); - } - - // Object type - typenavigator::NavigatorPtr ObjectReaderFactory::createSpecific(const RapidXmlReaderNode& node, const Path& path) const - { - Data::EnforceAttribute(node, Data::NAME_ATTRIBUTE_NAME); - const std::string extends = Data::GetAttributeWithDefault(node, Data::EXTENDS_ATTRIBUTE_NAME, ""); - const std::string name = Data::GetAttribute(node, Data::NAME_ATTRIBUTE_NAME); - - bool object_is_nested = TheObjectWeAreGoingToGenerateNowStack.size() > 0; - - // set the new object - typenavigator::ObjectNavigatorPtr aronObjectType = typenavigator::ObjectNavigatorPtr(new typenavigator::ObjectNavigator(path)); - if (object_is_nested) - { - if (name.rfind("::") != std::string::npos) - { - throw error::StringNotValidException("AronObjectTypeXMLReaderFactory", "createSpecific", "Namespaces are not allowed in nested classes", name); - } - } - aronObjectType->setObjectName(name); - - codegeneratorhelper::GenerateTypeInfoPtr theObjectWeAreGoingToProduceNow = codegeneratorhelper::GenerateTypeInfoPtr(new codegeneratorhelper::GenerateTypeInfo()); - theObjectWeAreGoingToProduceNow->typeName = name; - theObjectWeAreGoingToProduceNow->correspondingObjectType = aronObjectType; - - if (extends != "") - { - auto it = AllKnownGeneratedPublicObjects.find(extends); - if (it != AllKnownGeneratedPublicObjects.end()) - { - codegeneratorhelper::GenerateTypeInfoPtr prodObj = it->second; - aronObjectType->setExtends(prodObj->correspondingObjectType); - } - else - { - throw error::StringNotValidException("AronObjectTypeXMLReaderFactory", "createSpecific", "An extends name could not be found. Perhaps you need to change the order of your types or you have to add another UseType", extends); - } - } - - TheObjectWeAreGoingToGenerateNowStack.push(theObjectWeAreGoingToProduceNow); - for (const RapidXmlReaderNode& objectChild : node.nodes()) - { - Data::EnforceTagName(objectChild, Data::OBJECT_CHILD_TAG); - Data::EnforceChildSize(objectChild, 1); - - Data::EnforceAttribute(objectChild, Data::KEY_ATTRIBUTE_NAME); - const std::string key = objectChild.attribute_value(Data::KEY_ATTRIBUTE_NAME); - - std::vector<RapidXmlReaderNode> children = objectChild.nodes(); - typenavigator::NavigatorPtr childNavigator = create(children[0], Path(path, key)); - aronObjectType->addMemberType(key, childNavigator); - } - - // remove current item from stack - TheObjectWeAreGoingToGenerateNowStack.pop(); - - if (object_is_nested) - { - // We are in a local nested class since there is a parent class in stack - codegeneratorhelper::GenerateTypeInfoPtr parent = TheObjectWeAreGoingToGenerateNowStack.top(); - parent->nestedObjects.insert(std::make_pair(theObjectWeAreGoingToProduceNow->typeName, theObjectWeAreGoingToProduceNow)); - } - else - { - // We are a public top level class. Add to AllProducedPublicObjects - AllKnownGeneratedPublicObjects.insert(std::make_pair(theObjectWeAreGoingToProduceNow->typeName, theObjectWeAreGoingToProduceNow)); - } - - return aronObjectType; - } - - // List type (List) - typenavigator::NavigatorPtr ListReaderFactory::createSpecific(const RapidXmlReaderNode& node, const Path& path) const - { - Data::EnforceTagName(node, Data::GENERATE_LIST_TAG); - - typenavigator::ListNavigatorPtr list(new typenavigator::ListNavigator(path)); - Data::EnforceChildSize(node, 1); - std::vector<RapidXmlReaderNode> listTypeNodeChildren = node.nodes(); - const RapidXmlReaderNode typeNode = listTypeNodeChildren[0]; - typenavigator::NavigatorPtr type = create(typeNode, Path(path, "type")); - - list->setAcceptedType(type); - return list; - } - - // List type (Dict) - typenavigator::NavigatorPtr DictReaderFactory::createSpecific(const RapidXmlReaderNode& node, const Path& path) const - { - Data::EnforceTagName(node, Data::GENERATE_DICT_TAG); - - typenavigator::DictNavigatorPtr dict(new typenavigator::DictNavigator(path)); - Data::EnforceChildSize(node, 1); - std::vector<RapidXmlReaderNode> dictTypeNodeChildren = node.nodes(); - const RapidXmlReaderNode typeNode = dictTypeNodeChildren[0]; - typenavigator::NavigatorPtr type = create(typeNode, Path(path, "type")); - dict->setAcceptedType(type); - - return dict; - } - - // List type (Tuple) - typenavigator::NavigatorPtr TupleReaderFactory::createSpecific(const RapidXmlReaderNode& node, const Path& path) const - { - Data::EnforceTagName(node, Data::GENERATE_TUPLE_TAG); - std::vector<RapidXmlReaderNode> nodeChildren = node.nodes(); - - if (nodeChildren.size() < 1) - { - throw error::AronException("AronTupleTypeXMLReaderFactory", "createSpecific", "A tuple must have at least one type. Found child nodes size: " + std::to_string(nodeChildren.size())); - } - - typenavigator::TupleNavigatorPtr tuple(new typenavigator::TupleNavigator(path)); - unsigned int i = 0; - for (const RapidXmlReaderNode& tupleTypeDeclarationNode : nodeChildren) - { - Data::EnforceChildSize(tupleTypeDeclarationNode, 1); - - std::vector<RapidXmlReaderNode> typeNodeChildren = tupleTypeDeclarationNode.nodes(); - const RapidXmlReaderNode typeNode = typeNodeChildren[0]; - - typenavigator::NavigatorPtr type = create(typeNode, Path(path, "<" + std::to_string(i++) + ">")); - tuple->addAcceptedType(type); - } - return tuple; - } - - // List type (Pair) - typenavigator::NavigatorPtr PairReaderFactory::createSpecific(const RapidXmlReaderNode& node, const Path& path) const - { - Data::EnforceTagName(node, Data::GENERATE_PAIR_TAG); - std::vector<RapidXmlReaderNode> nodeChildren = node.nodes(); - - if (nodeChildren.size() != 2) - { - throw error::AronException("AronPairTypeXMLReaderFactory", "createSpecific", "A pair must have two types. Found child nodes size: " + std::to_string(nodeChildren.size())); - } - - typenavigator::PairNavigatorPtr pair(new typenavigator::PairNavigator(path)); - - Data::EnforceChildSize(nodeChildren[0], 1); - std::vector<RapidXmlReaderNode> type1NodeChildren = nodeChildren[0].nodes(); - const RapidXmlReaderNode type1Node = type1NodeChildren[0]; - - typenavigator::NavigatorPtr type1 = create(type1Node, Path(path, std::to_string(0))); - pair->setFirstAcceptedType(type1); - - Data::EnforceChildSize(nodeChildren[1], 1); - std::vector<RapidXmlReaderNode> type2NodeChildren = nodeChildren[1].nodes(); - const RapidXmlReaderNode type2Node = type2NodeChildren[0]; - - typenavigator::NavigatorPtr type2 = create(type2Node, Path(path, std::to_string(1))); - pair->setSecondAcceptedType(type2); - - return pair; - } - - // Complex type (IVTCByteImage) - typenavigator::NavigatorPtr IVTCByteImageReaderFactory::createSpecific(const RapidXmlReaderNode& node, const Path& path) const - { - Data::EnforceTagName(node, Data::GENERATE_IVT_CBYTE_IMAGE_TAG); - Data::EnforceAttribute(node, Data::TYPE_ATTRIBUTE_NAME); - - int width = std::stoi(Data::GetAttributeWithDefault(node, Data::WIDTH_ATTRIBUTE_NAME, "1")); - int height = std::stoi(Data::GetAttributeWithDefault(node, Data::HEIGHT_ATTRIBUTE_NAME, "1")); - std::string type = node.attribute_value(Data::TYPE_ATTRIBUTE_NAME);; - - typenavigator::IVTCByteImageNavigatorPtr complex(new typenavigator::IVTCByteImageNavigator(path)); - complex->setWidth(width); - complex->setHeight(height); - complex->setTypename(type); - return complex; - } - - // Complex type (EigenMatrix) - typenavigator::NavigatorPtr EigenMatrixReaderFactory::createSpecific(const RapidXmlReaderNode& node, const Path& path) const - { - Data::EnforceTagName(node, Data::GENERATE_EIGEN_MATRIX_TAG); - Data::EnforceAttribute(node, Data::TYPE_ATTRIBUTE_NAME); - - int rows = std::stoi(Data::GetAttributeWithDefault(node, Data::ROWS_ATTRIBUTE_NAME, "1")); - int cols = std::stoi(Data::GetAttributeWithDefault(node, Data::COLS_ATTRIBUTE_NAME, "1")); - std::string type = node.attribute_value(Data::TYPE_ATTRIBUTE_NAME); - - typenavigator::EigenMatrixNavigatorPtr complex(new typenavigator::EigenMatrixNavigator(path)); - complex->setRows(rows); - complex->setCols(cols); - complex->setTypename(type); - return complex; - } - - // Complex type (EigenQuaternion) - typenavigator::NavigatorPtr EigenQuaternionReaderFactory::createSpecific(const RapidXmlReaderNode& node, const Path& path) const - { - Data::EnforceTagName(node, Data::GENERATE_EIGEN_QUATERNION_TAG); - Data::EnforceAttribute(node, Data::TYPE_ATTRIBUTE_NAME); - - std::string type = node.attribute_value(Data::TYPE_ATTRIBUTE_NAME); - - typenavigator::EigenQuaternionNavigatorPtr complex(new typenavigator::EigenQuaternionNavigator(path)); - complex->setTypename(type); - return complex; - } - - // Complex type (OpenCVMat) - typenavigator::NavigatorPtr OpenCVMatReaderFactory::createSpecific(const RapidXmlReaderNode& node, const Path& path) const - { - Data::EnforceTagName(node, Data::GENERATE_OPENCV_MAT_TAG); - Data::EnforceAttribute(node, Data::TYPE_ATTRIBUTE_NAME); - - std::vector<std::string> dimensions_as_strings = simox::alg::split(Data::GetAttributeWithDefault(node, Data::DIMENSIONS_ATTRIBUTE_NAME, "1"), ","); - std::vector<int> dimensions = simox::alg::to_vec<int>(dimensions_as_strings); - std::string type = node.attribute_value(Data::TYPE_ATTRIBUTE_NAME); - - typenavigator::OpenCVMatNavigatorPtr complex(new typenavigator::OpenCVMatNavigator(path)); - complex->setDimensions(dimensions); - complex->setTypename(type); - return complex; - } - - // Complex type (PCLPointCloud) - typenavigator::NavigatorPtr PCLPointCloudReaderFactory::createSpecific(const RapidXmlReaderNode& node, const Path& path) const - { - Data::EnforceTagName(node, Data::GENERATE_PCL_POINTCLOUD_TAG); - Data::EnforceAttribute(node, Data::TYPE_ATTRIBUTE_NAME); - - int width = std::stoi(Data::GetAttributeWithDefault(node, Data::WIDTH_ATTRIBUTE_NAME, "1")); - int height = std::stoi(Data::GetAttributeWithDefault(node, Data::HEIGHT_ATTRIBUTE_NAME, "1")); - std::string type = node.attribute_value(Data::TYPE_ATTRIBUTE_NAME);; - - typenavigator::PCLPointCloudNavigatorPtr complex(new typenavigator::PCLPointCloudNavigator(path)); - complex->setWidth(width); - complex->setHeight(height); - complex->setTypename(type); - return complex; - } - - // Complex type (Position) - typenavigator::NavigatorPtr PositionReaderFactory::createSpecific(const RapidXmlReaderNode& node, const Path& path) const - { - Data::EnforceTagName(node, Data::GENERATE_POSITION_TAG); - - typenavigator::PositionNavigatorPtr complex(new typenavigator::PositionNavigator(path)); - return complex; - } - - // Complex type (Orientation) - typenavigator::NavigatorPtr OrientationReaderFactory::createSpecific(const RapidXmlReaderNode& node, const Path& path) const - { - Data::EnforceTagName(node, Data::GENERATE_ORIENTATION_TAG); - - typenavigator::OrientationNavigatorPtr complex(new typenavigator::OrientationNavigator(path)); - return complex; - } - - // Complex type (Pose) - typenavigator::NavigatorPtr PoseReaderFactory::createSpecific(const RapidXmlReaderNode& node, const Path& path) const - { - Data::EnforceTagName(node, Data::GENERATE_POSE_TAG); - - typenavigator::PoseNavigatorPtr complex(new typenavigator::PoseNavigator(path)); - return complex; - } - - - - // Enum (IntEnum) - typenavigator::NavigatorPtr IntEnumReaderFactory::createSpecific(const RapidXmlReaderNode& node, const Path& path) const - { - Data::EnforceTagName(node, Data::GENERATE_INT_ENUM_TAG); - Data::EnforceAttribute(node, Data::NAME_ATTRIBUTE_NAME); - - std::vector<RapidXmlReaderNode> nodeChildren = node.nodes(); - - std::string name = node.attribute_value(Data::NAME_ATTRIBUTE_NAME); - - typenavigator::IntEnumNavigatorPtr complex(new typenavigator::IntEnumNavigator(path)); - complex->setEnumName(name); + const std::string tag = simox::alg::to_lower(node.name()); + if (tag == "") + { + throw error::AronException("XMLReaderFactory", "create", "An node is empty. Cannot find facory for empty nodes."); + } + auto factory_iterator = Factories.find(tag); + if (factory_iterator != Factories.end()) + { + return factory_iterator->second->createSpecific(node, path); + } + + // Search for known objects + return ResolveTypename(tag); + } + + typenavigator::NavigatorPtr ReaderFactory::createSpecific(const RapidXmlReaderNode&, const Path& p) const + { + throw error::AronException("ReaderFactory", "createSpecific", "Called disallowed method of an NavigatorFactory. Use child class instead!", p); + } + + typenavigator::NavigatorPtr ReaderFactory::ResolveTypename(const std::string& name) + { + const auto public_intenum_it = AllPublicIntEnums.find(name); + if (public_intenum_it != AllPublicIntEnums.end()) + { + return public_intenum_it->second->correspondingType; + } + + const auto public_obj_it = AllPublicObjects.find(name); + if (public_obj_it != AllPublicObjects.end()) + { + return public_obj_it->second->correspondingType; + } + + throw error::StringNotValidException("XMLReaderFactory", "ResolveTypename", "Could not find a tag. You can only access already finished public objects.", name); + } + + // Object type + typenavigator::NavigatorPtr ObjectReaderFactory::createSpecific(const RapidXmlReaderNode& node, const Path& path) const + { + Data::EnforceAttribute(node, Data::NAME_ATTRIBUTE_NAME); + const std::string extends = Data::GetAttributeWithDefault(node, Data::EXTENDS_ATTRIBUTE_NAME, ""); + const std::string name = Data::GetAttribute(node, Data::NAME_ATTRIBUTE_NAME); + + bool object_is_nested = ObjectGenerationStack.size() > 0; + if (object_is_nested) + { + if (name.rfind("::") != std::string::npos) + { + throw error::StringNotValidException("AronObjectTypeXMLReaderFactory", "createSpecific", "Namespaces are not allowed in nested classes", name, path); + } + } + + // set the new object + auto aronObjectType = std::make_shared<typenavigator::ObjectNavigator>(path); + aronObjectType->setObjectName(name); + + auto newObject = std::make_shared<codegeneratorhelper::GenerateObjectInfo>(); + newObject->typeName = name; + newObject->correspondingType = aronObjectType; + + if (extends != "") + { + auto it = AllPublicObjects.find(extends); + if (it == AllPublicObjects.end()) + { + throw error::StringNotValidException("AronObjectTypeXMLReaderFactory", "createSpecific", "An extends name could not be found. Perhaps you need to change the order of your types or you have to add another UseType", extends, path); + } + codegeneratorhelper::GenerateObjectInfoPtr parentObj = it->second; + aronObjectType->setExtends(parentObj->correspondingType); + } + + ObjectGenerationStack.push(newObject); + for (const RapidXmlReaderNode& objectChild : node.nodes()) + { + Data::EnforceTagName(objectChild, Data::OBJECT_CHILD_TAG); + Data::EnforceChildSize(objectChild, 1); + + Data::EnforceAttribute(objectChild, Data::KEY_ATTRIBUTE_NAME); + const std::string key = objectChild.attribute_value(Data::KEY_ATTRIBUTE_NAME); + + std::vector<RapidXmlReaderNode> children = objectChild.nodes(); + typenavigator::NavigatorPtr childNavigator = create(children[0], Path(path, key)); + aronObjectType->addMemberType(key, childNavigator); + } + ObjectGenerationStack.pop(); + + if (object_is_nested) + { + // We are in a local nested class since there is a parent class in stack + codegeneratorhelper::GenerateObjectInfoPtr parent = ObjectGenerationStack.top(); + parent->nestedObjects.insert(std::make_pair(simox::alg::to_lower(newObject->typeName), newObject)); + } + else + { + // We are a public top level class. Add to AllPublicObjects + AllPublicObjects.insert(std::make_pair(simox::alg::to_lower(newObject->typeName), newObject)); + } + + return aronObjectType; + } + + // List type (List) + typenavigator::NavigatorPtr ListReaderFactory::createSpecific(const RapidXmlReaderNode& node, const Path& path) const + { + Data::EnforceTagName(node, Data::GENERATE_LIST_MEMBER_TAG); + + typenavigator::ListNavigatorPtr list(new typenavigator::ListNavigator(path)); + Data::EnforceChildSize(node, 1); + std::vector<RapidXmlReaderNode> listTypeNodeChildren = node.nodes(); + const RapidXmlReaderNode typeNode = listTypeNodeChildren[0]; + typenavigator::NavigatorPtr type = create(typeNode, Path(path, "type")); + + list->setAcceptedType(type); + return list; + } + + // List type (Dict) + typenavigator::NavigatorPtr DictReaderFactory::createSpecific(const RapidXmlReaderNode& node, const Path& path) const + { + Data::EnforceTagName(node, Data::GENERATE_DICT_MEMBER_TAG); + + typenavigator::DictNavigatorPtr dict(new typenavigator::DictNavigator(path)); + Data::EnforceChildSize(node, 1); + std::vector<RapidXmlReaderNode> dictTypeNodeChildren = node.nodes(); + const RapidXmlReaderNode typeNode = dictTypeNodeChildren[0]; + typenavigator::NavigatorPtr type = create(typeNode, Path(path, "type")); + dict->setAcceptedType(type); + + return dict; + } + + // List type (Tuple) + typenavigator::NavigatorPtr TupleReaderFactory::createSpecific(const RapidXmlReaderNode& node, const Path& path) const + { + Data::EnforceTagName(node, Data::GENERATE_TUPLE_MEMBER_TAG); + std::vector<RapidXmlReaderNode> nodeChildren = node.nodes(); + + if (nodeChildren.size() < 1) + { + throw error::AronException("AronTupleTypeXMLReaderFactory", "createSpecific", "A tuple must have at least one type. Found child nodes size: " + std::to_string(nodeChildren.size())); + } + + typenavigator::TupleNavigatorPtr tuple(new typenavigator::TupleNavigator(path)); + unsigned int i = 0; + for (const RapidXmlReaderNode& tupleTypeDeclarationNode : nodeChildren) + { + Data::EnforceChildSize(tupleTypeDeclarationNode, 1); + + std::vector<RapidXmlReaderNode> typeNodeChildren = tupleTypeDeclarationNode.nodes(); + const RapidXmlReaderNode typeNode = typeNodeChildren[0]; + + typenavigator::NavigatorPtr type = create(typeNode, Path(path, "<" + std::to_string(i++) + ">")); + tuple->addAcceptedType(type); + } + return tuple; + } + + // List type (Pair) + typenavigator::NavigatorPtr PairReaderFactory::createSpecific(const RapidXmlReaderNode& node, const Path& path) const + { + Data::EnforceTagName(node, Data::GENERATE_PAIR_MEMBER_TAG); + std::vector<RapidXmlReaderNode> nodeChildren = node.nodes(); + + if (nodeChildren.size() != 2) + { + throw error::AronException("AronPairTypeXMLReaderFactory", "createSpecific", "A pair must have two types. Found child nodes size: " + std::to_string(nodeChildren.size())); + } + + typenavigator::PairNavigatorPtr pair(new typenavigator::PairNavigator(path)); + + Data::EnforceChildSize(nodeChildren[0], 1); + std::vector<RapidXmlReaderNode> type1NodeChildren = nodeChildren[0].nodes(); + const RapidXmlReaderNode type1Node = type1NodeChildren[0]; + + typenavigator::NavigatorPtr type1 = create(type1Node, Path(path, std::to_string(0))); + pair->setFirstAcceptedType(type1); + + Data::EnforceChildSize(nodeChildren[1], 1); + std::vector<RapidXmlReaderNode> type2NodeChildren = nodeChildren[1].nodes(); + const RapidXmlReaderNode type2Node = type2NodeChildren[0]; + + typenavigator::NavigatorPtr type2 = create(type2Node, Path(path, std::to_string(1))); + pair->setSecondAcceptedType(type2); - for (const RapidXmlReaderNode& acceptedValueDeclarationNode : nodeChildren) - { - Data::EnforceTagName(acceptedValueDeclarationNode, Data::ENUM_VALUE_TAG); - Data::EnforceAttribute(acceptedValueDeclarationNode, Data::NAME_ATTRIBUTE_NAME); - Data::EnforceAttribute(acceptedValueDeclarationNode, Data::VALUE_ATTRIBUTE_NAME); - - Data::EnforceChildSize(acceptedValueDeclarationNode, 0); + return pair; + } + + // Complex type (IVTCByteImage) + typenavigator::NavigatorPtr IVTCByteImageReaderFactory::createSpecific(const RapidXmlReaderNode& node, const Path& path) const + { + Data::EnforceTagName(node, Data::GENERATE_IVT_CBYTE_IMAGE_MEMBER_TAG); + Data::EnforceAttribute(node, Data::TYPE_ATTRIBUTE_NAME); + + int width = std::stoi(Data::GetAttributeWithDefault(node, Data::WIDTH_ATTRIBUTE_NAME, "1")); + int height = std::stoi(Data::GetAttributeWithDefault(node, Data::HEIGHT_ATTRIBUTE_NAME, "1")); + std::string type = node.attribute_value(Data::TYPE_ATTRIBUTE_NAME);; + + typenavigator::IVTCByteImageNavigatorPtr complex(new typenavigator::IVTCByteImageNavigator(path)); + complex->setWidth(width); + complex->setHeight(height); + complex->setTypename(type); + return complex; + } + + // Complex type (EigenMatrix) + typenavigator::NavigatorPtr EigenMatrixReaderFactory::createSpecific(const RapidXmlReaderNode& node, const Path& path) const + { + Data::EnforceTagName(node, Data::GENERATE_EIGEN_MATRIX_MEMBER_TAG); + Data::EnforceAttribute(node, Data::TYPE_ATTRIBUTE_NAME); + + int rows = std::stoi(Data::GetAttributeWithDefault(node, Data::ROWS_ATTRIBUTE_NAME, "1")); + int cols = std::stoi(Data::GetAttributeWithDefault(node, Data::COLS_ATTRIBUTE_NAME, "1")); + std::string type = node.attribute_value(Data::TYPE_ATTRIBUTE_NAME); + + typenavigator::EigenMatrixNavigatorPtr complex(new typenavigator::EigenMatrixNavigator(path)); + complex->setRows(rows); + complex->setCols(cols); + complex->setTypename(type); + return complex; + } + + // Complex type (EigenQuaternion) + typenavigator::NavigatorPtr EigenQuaternionReaderFactory::createSpecific(const RapidXmlReaderNode& node, const Path& path) const + { + Data::EnforceTagName(node, Data::GENERATE_EIGEN_QUATERNION_MEMBER_TAG); + Data::EnforceAttribute(node, Data::TYPE_ATTRIBUTE_NAME); + + std::string type = node.attribute_value(Data::TYPE_ATTRIBUTE_NAME); - std::string name = acceptedValueDeclarationNode.attribute_value(Data::NAME_ATTRIBUTE_NAME); - int value = std::stoi(acceptedValueDeclarationNode.attribute_value(Data::VALUE_ATTRIBUTE_NAME)); + typenavigator::EigenQuaternionNavigatorPtr complex(new typenavigator::EigenQuaternionNavigator(path)); + complex->setTypename(type); + return complex; + } + + // Complex type (OpenCVMat) + typenavigator::NavigatorPtr OpenCVMatReaderFactory::createSpecific(const RapidXmlReaderNode& node, const Path& path) const + { + Data::EnforceTagName(node, Data::GENERATE_OPENCV_MAT_MEMBER_TAG); + Data::EnforceAttribute(node, Data::TYPE_ATTRIBUTE_NAME); + + std::vector<std::string> dimensions_as_strings = simox::alg::split(Data::GetAttributeWithDefault(node, Data::DIMENSIONS_ATTRIBUTE_NAME, "1"), ","); + std::vector<int> dimensions = simox::alg::to_vec<int>(dimensions_as_strings); + std::string type = node.attribute_value(Data::TYPE_ATTRIBUTE_NAME); + + typenavigator::OpenCVMatNavigatorPtr complex(new typenavigator::OpenCVMatNavigator(path)); + complex->setDimensions(dimensions); + complex->setTypename(type); + return complex; + } + + // Complex type (PCLPointCloud) + typenavigator::NavigatorPtr PCLPointCloudReaderFactory::createSpecific(const RapidXmlReaderNode& node, const Path& path) const + { + Data::EnforceTagName(node, Data::GENERATE_PCL_POINTCLOUD_MEMBER_TAG); + Data::EnforceAttribute(node, Data::TYPE_ATTRIBUTE_NAME); + + int width = std::stoi(Data::GetAttributeWithDefault(node, Data::WIDTH_ATTRIBUTE_NAME, "1")); + int height = std::stoi(Data::GetAttributeWithDefault(node, Data::HEIGHT_ATTRIBUTE_NAME, "1")); + std::string type = node.attribute_value(Data::TYPE_ATTRIBUTE_NAME);; + + typenavigator::PCLPointCloudNavigatorPtr complex(new typenavigator::PCLPointCloudNavigator(path)); + complex->setWidth(width); + complex->setHeight(height); + complex->setTypename(type); + return complex; + } - complex->addAcceptedValue(name, value); - } + // Complex type (Position) + typenavigator::NavigatorPtr PositionReaderFactory::createSpecific(const RapidXmlReaderNode& node, const Path& path) const + { + Data::EnforceTagName(node, Data::GENERATE_POSITION_MEMBER_TAG); - return complex; - } + typenavigator::PositionNavigatorPtr complex(new typenavigator::PositionNavigator(path)); + return complex; + } + + // Complex type (Orientation) + typenavigator::NavigatorPtr OrientationReaderFactory::createSpecific(const RapidXmlReaderNode& node, const Path& path) const + { + Data::EnforceTagName(node, Data::GENERATE_ORIENTATION_MEMBER_TAG); + + typenavigator::OrientationNavigatorPtr complex(new typenavigator::OrientationNavigator(path)); + return complex; + } + + // Complex type (Pose) + typenavigator::NavigatorPtr PoseReaderFactory::createSpecific(const RapidXmlReaderNode& node, const Path& path) const + { + Data::EnforceTagName(node, Data::GENERATE_POSE_MEMBER_TAG); + + typenavigator::PoseNavigatorPtr complex(new typenavigator::PoseNavigator(path)); + return complex; + } + + + + // Enum (IntEnum) + typenavigator::NavigatorPtr IntEnumReaderFactory::createSpecific(const RapidXmlReaderNode& node, const Path& path) const + { + Data::EnforceAttribute(node, Data::NAME_ATTRIBUTE_NAME); + const std::string name = Data::GetAttribute(node, Data::NAME_ATTRIBUTE_NAME); + + bool enum_is_nested = ObjectGenerationStack.size() > 0; + if (enum_is_nested) + { + if (name.rfind("::") != std::string::npos) + { + throw error::StringNotValidException("IntEnumReaderFactory", "createSpecific", "Namespaces are not allowed in nested enums", name, path); + } + } + + // set the new object + auto aronIntEnumType = std::make_shared<typenavigator::IntEnumNavigator>(path); + aronIntEnumType->setEnumName(name); + + auto newEnumInfo = std::make_shared<codegeneratorhelper::GenerateIntEnumInfo>(); + newEnumInfo->typeName = name; + newEnumInfo->correspondingType = aronIntEnumType; + + for (const RapidXmlReaderNode& objectChild : node.nodes()) + { + Data::EnforceTagName(objectChild, Data::ENUM_VALUE_TAG); + Data::EnforceChildSize(objectChild, 0); + + Data::EnforceAttribute(objectChild, Data::KEY_ATTRIBUTE_NAME); + const std::string key = objectChild.attribute_value(Data::KEY_ATTRIBUTE_NAME); + + Data::EnforceAttribute(objectChild, Data::VALUE_ATTRIBUTE_NAME); + const std::string value = objectChild.attribute_value(Data::VALUE_ATTRIBUTE_NAME); + + aronIntEnumType->addAcceptedValue(key, std::stoi(value)); + } + + if (enum_is_nested) + { + // We are in a local nested class since there is a parent class in stack + codegeneratorhelper::GenerateObjectInfoPtr parent = ObjectGenerationStack.top(); + parent->nestedIntEnums.insert(std::make_pair(simox::alg::to_lower(newEnumInfo->typeName), newEnumInfo)); + } + else + { + // We are a public top level class. Add to AllPublicObjects + AllPublicIntEnums.insert(std::make_pair(simox::alg::to_lower(newEnumInfo->typeName), newEnumInfo)); + } + + return aronIntEnumType; + } - // Primitve Types + // Primitve Types #define RUN_ARON_MACRO(upperType, lowerType, capsType) \ - typenavigator::NavigatorPtr upperType##ReaderFactory::createSpecific(const RapidXmlReaderNode&, const Path& path) const \ + typenavigator::NavigatorPtr upperType##ReaderFactory::createSpecific(const RapidXmlReaderNode& node, const Path& path) const \ { \ + Data::EnforceTagName(node, Data::GENERATE_##capsType##_MEMBER_TAG); \ return typenavigator::NavigatorPtr(new typenavigator::upperType##Navigator(path)); \ } - HANDLE_PRIMITIVE_TYPES + HANDLE_PRIMITIVE_TYPES #undef RUN_ARON_MACRO } diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/typeReader/xml/ReaderFactory.h b/source/RobotAPI/libraries/aron/core/codegenerator/typeReader/xml/ReaderFactory.h index f180d04b16f59f0fbf3af3df240847510174612f..dbed99c551c990aedc4ab7546894ad8049387485 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/typeReader/xml/ReaderFactory.h +++ b/source/RobotAPI/libraries/aron/core/codegenerator/typeReader/xml/ReaderFactory.h @@ -35,6 +35,7 @@ // ArmarX #include <ArmarXCore/core/rapidxml/wrapper/RapidXmlReader.h> #include <RobotAPI/libraries/aron/core/codegenerator/GenerateTypeInfo.h> +#include <RobotAPI/libraries/aron/core/codegenerator/GenerateIntEnumInfo.h> #include <RobotAPI/libraries/aron/core/navigator/type/AllNavigators.h> @@ -50,16 +51,18 @@ namespace armarx::aron::xmltypereader ReaderFactory() = default; virtual typenavigator::NavigatorPtr create(const RapidXmlReaderNode&, const Path&) const override; - virtual typenavigator::NavigatorPtr createSpecific(const RapidXmlReaderNode&, const Path&) const override = 0; - - static std::map<std::string, codegeneratorhelper::GenerateTypeInfoPtr> GetAllKnownGeneratedPublicObjects(); + virtual typenavigator::NavigatorPtr createSpecific(const RapidXmlReaderNode&, const Path&) const override; protected: static typenavigator::NavigatorPtr ResolveTypename(const std::string&); + public: + static std::map<std::string, codegeneratorhelper::GenerateObjectInfoPtr> AllPublicObjects; + static std::map<std::string, codegeneratorhelper::GenerateIntEnumInfoPtr> AllPublicIntEnums; + protected: - static std::stack<codegeneratorhelper::GenerateTypeInfoPtr> TheObjectWeAreGoingToGenerateNowStack; - static std::map<std::string, codegeneratorhelper::GenerateTypeInfoPtr> AllKnownGeneratedPublicObjects; + static std::stack<codegeneratorhelper::GenerateObjectInfoPtr> ObjectGenerationStack; + }; #define RUN_ARON_MACRO(upperType, lowerType, capsType) \ diff --git a/source/RobotAPI/libraries/aron/core/io/Data.h b/source/RobotAPI/libraries/aron/core/io/Data.h index 87a606af2bb4885019994f03c1d227f3a8ca57f3..6d29388942067854205998b2c0aaef4e4b74a402 100644 --- a/source/RobotAPI/libraries/aron/core/io/Data.h +++ b/source/RobotAPI/libraries/aron/core/io/Data.h @@ -40,7 +40,7 @@ namespace armarx::aron::io public: // TODO: Remove copy from ReaderWriter - static constexpr const char* READER_WRITER_OBJECT_NAME_SLUG = "ARON_OBJECT_NAME"; + static constexpr const char* READER_WRITER_NAME_SLUG = "ARON_NAME"; static constexpr const char* READER_WRITER_DICT_ACCEPTED_TYPE_SLUG = "ARON_DICT_ACCEPTED_TYPE"; static constexpr const char* READER_WRITER_LIST_ACCEPTED_TYPE_SLUG = "ARON_LIST_ACCEPTED_TYPE"; @@ -49,6 +49,10 @@ namespace armarx::aron::io static constexpr const char* READER_WRITER_NDARRAY_TYPE_SLUG = "ARON_NDARRAY_TYPE"; static constexpr const char* READER_WRITER_NDARRAY_DATA_SLUG = "ARON_NDARRAY_DATA"; + static constexpr const char* READER_WRITER_INT_ENUM_NAME_SLUG = "ARON_INT_ENUM_NAME"; + static constexpr const char* READER_WRITER_INT_ENUM_VALUE_SLUG = "ARON_INT_ENUM_VALUE"; + static constexpr const char* READER_WRITER_ENUM_KEY_SLUG = "ARON_ENUM_KEY"; + #define RUN_ARON_MACRO(upperType, lowerType, capsType) \ static constexpr const char* READER_WRITER_##capsType##_TYPENAME_SLUG = #capsType; diff --git a/source/RobotAPI/libraries/aron/core/io/ReaderToken.h b/source/RobotAPI/libraries/aron/core/io/ReaderToken.h index 2551589a98fa27d12ed5e410cc6401c14545ad6d..a6a42098d8a198c7aa1ace6751cce3e7130c4cfa 100644 --- a/source/RobotAPI/libraries/aron/core/io/ReaderToken.h +++ b/source/RobotAPI/libraries/aron/core/io/ReaderToken.h @@ -20,104 +20,3 @@ #pragma once -// STD/STL -#include <memory> -#include <string> - -// ArmarX -#include <RobotAPI/libraries/aron/core/Config.h> -#include <RobotAPI/libraries/aron/core/Exception.h> -#include <RobotAPI/libraries/aron/core/Resolver.h> -#include <RobotAPI/libraries/aron/core/io/Data.h> - - -namespace armarx::aron::io -{ - template<typename AronDescriptorTypename, typename ElementReturnPtrTypename, typename ElementTypename> - class ReaderToken; - - template<typename AronDescriptorTypename, typename ElementReturnPtrTypename, typename ElementTypename> - using ReaderTokenPtr = std::shared_ptr<ReaderToken<AronDescriptorTypename, ElementReturnPtrTypename, ElementTypename>> ; - - template<typename AronDescriptorTypename, typename ElementReturnPtrTypename, typename ElementTypename> - class ReaderToken - { - public: - ReaderToken() = delete; - ReaderToken(const AronDescriptorTypename& desc, const ElementTypename& e) : - descriptor(desc), element(e), currentIndex(0), maxIndex(0), currentKey("") - { - }; - - bool checkedAllChildren() const - { - return currentIndex >= allKeys.size() && currentIndex >= maxIndex; - } - - AronDescriptorTypename getDescriptor() const - { - return descriptor; - } - - unsigned int getChildrenSize() const - { - return maxIndex; - } - - void setCurrentKey(const std::string& s) - { - if (s.empty()) - { - throw error::AronException("AronReaderToken", "setCurrentKey", "The passed key is empty."); - } - currentKey = s; - } - - virtual bool currentIsEligableForResolvingKey() const = 0; - std::string resolveCurrentKey() const - { - if (!this->currentIsEligableForResolvingKey()) - { - throw error::AronException("AronReaderToken", "resolveCurrentKey", "Cant get key of token."); - } - - // check outOfBounds - if (this->currentIndex >= this->maxIndex) - { - throw error::SizeNotValidException("AronReaderToken", "resolveCurrentKey", "Index out of bounds.", this->currentIndex, this->maxIndex); - } - - // ugly workaround - if (this->currentKey == "") // probably in a dict where the caller does not know which keys are there - { - if (this->allKeys.size() == 0) - { - throw error::AronException("AronReaderToken", "resolveCurrentKey", "The currentKey is not set and the list of all keys is empty!"); - } - return this->allKeys[this->currentIndex]; - } - return this->currentKey; - } - - - virtual ElementReturnPtrTypename getCurrentElement() const = 0; - ElementReturnPtrTypename getCurrentElementAndIncreaseCnt() - { - ElementReturnPtrTypename next = getCurrentElement(); - this->currentIndex++; - return next; - } - - protected: - // members - AronDescriptorTypename descriptor; - ElementTypename element; - - unsigned int currentIndex; - unsigned int maxIndex; - - // dict and object members - std::string currentKey; - std::vector<std::string> allKeys; - }; -} diff --git a/source/RobotAPI/libraries/aron/core/io/WriterToken.h b/source/RobotAPI/libraries/aron/core/io/WriterToken.h index a7f6d5ff8e17420bf0c7af49799719db88fb79d5..dbc013c6efd7bace247c1c2a4a656d3bdd87748c 100644 --- a/source/RobotAPI/libraries/aron/core/io/WriterToken.h +++ b/source/RobotAPI/libraries/aron/core/io/WriterToken.h @@ -19,67 +19,3 @@ */ #pragma once - -// STD/STL -#include <memory> -#include <string> - -// ArmarX -#include <RobotAPI/libraries/aron/core/Config.h> -#include <RobotAPI/libraries/aron/core/Exception.h> -#include <RobotAPI/libraries/aron/core/io/Data.h> - - -namespace armarx::aron::io -{ - template<typename AronDescriptorTypename, typename ElementTypename, typename ElementAddTypename> - class WriterToken; - - template<typename AronDescriptorTypename, typename ElementTypename, typename ElementAddTypename> - using WriterTokenPtr = std::shared_ptr<WriterToken<AronDescriptorTypename, ElementTypename, ElementAddTypename>> ; - - template<typename AronDescriptorTypename, typename ElementTypename, typename ElementAddTypename> - class WriterToken - { - public: - WriterToken() = delete; - WriterToken(const AronDescriptorTypename& desc, const ElementTypename& e) : - descriptor(desc), element(e), currentIndex(0), currentKey("") - { - }; - - // virtual definitions - virtual void addElement(const ElementAddTypename&) = 0; - virtual std::string toElementAccessor() const = 0; - - void setCurrentKey(const std::string& s) - { - if (s.empty()) - { - throw error::AronException("AronWriterToken", "setCurrentKey", "The passed key is empty."); - } - currentKey = s; - } - - virtual ElementTypename getElement() const - { - return element; - } - - virtual AronDescriptorTypename getDescriptor() const - { - return descriptor; - } - - protected: - // members - AronDescriptorTypename descriptor; - ElementTypename element; - - // current index - unsigned int currentIndex; - - // current key - std::string currentKey; - }; -} diff --git a/source/RobotAPI/libraries/aron/core/io/dataIO/Reader.h b/source/RobotAPI/libraries/aron/core/io/dataIO/Reader.h index d74d23b4cc8cf0f9a5c51d2dcbb07b01d3d18d10..7df44a015c8f93f531e1e54c8dd2524ae98308d6 100644 --- a/source/RobotAPI/libraries/aron/core/io/dataIO/Reader.h +++ b/source/RobotAPI/libraries/aron/core/io/dataIO/Reader.h @@ -31,46 +31,39 @@ namespace armarx::aron::dataIO { - class Reader; - typedef std::shared_ptr<Reader> AronDataReaderPtr; + class ReaderInterface; + typedef std::shared_ptr<ReaderInterface> ReaderInterfacePtr; - class Reader - { - public: - Reader() = default; + class ReaderInterface + { + public: + virtual int readStartDict() = 0; + virtual bool readEndDict() = 0; + virtual int readStartList() = 0; + virtual bool readEndList() = 0; -#define RUN_ARON_MACRO(upperType, lowerType, capsType) \ - virtual int readStart##upperType() = 0; \ - virtual bool readEnd##upperType() = 0; \ + virtual std::tuple<std::vector<int>, std::string> readStartNDArray() = 0; + virtual bool readEndNDArray(unsigned char*) = 0; - HANDLE_CONTAINER_DATA -#undef RUN_ARON_MACRO + virtual void readPrimitive(int&) = 0; + virtual void readPrimitive(long&) = 0; + virtual void readPrimitive(float&) = 0; + virtual void readPrimitive(double&) = 0; + virtual void readPrimitive(std::string&) = 0; + virtual void readPrimitive(bool&) = 0; -#define RUN_ARON_MACRO(upperType, lowerType, capsType) \ - virtual std::pair<std::vector<int>, std::string> readStart##upperType() = 0; \ - virtual void readEnd##upperType(unsigned char*) = 0; \ + template<class T> + T readPrimitive() + { + T p; + readPrimitive(p); + return p; + } - HANDLE_COMPLEX_DATA -#undef RUN_ARON_MACRO + virtual std::string readKey() = 0; + virtual void loadMember(const std::string&) = 0; -#define RUN_ARON_MACRO(upperType, lowerType, capsType) \ - virtual void readPrimitive(lowerType&) = 0; \ - - HANDLE_PRIMITIVE_DATA -#undef RUN_ARON_MACRO - - template<class T> - T readPrimitive() - { - T p; - readPrimitive(p); - return p; - } - - virtual std::string readKey() = 0; - virtual bool readKey(const std::string&) = 0; - - // Helper functions - virtual data::Descriptor getTypeOfNextAron(const type::Descriptor) const = 0; - }; + // Helper functions + virtual data::Descriptor getTypeOfNext(const type::Descriptor hint = type::eUnknown) const = 0; + }; } diff --git a/source/RobotAPI/libraries/aron/core/io/dataIO/Writer.h b/source/RobotAPI/libraries/aron/core/io/dataIO/Writer.h index 449909b2c2a5e820ebf7386f187003d4d6746734..89aca64073cc652b2a72d3da62b7ce0a7c3e76d9 100644 --- a/source/RobotAPI/libraries/aron/core/io/dataIO/Writer.h +++ b/source/RobotAPI/libraries/aron/core/io/dataIO/Writer.h @@ -32,33 +32,26 @@ namespace armarx::aron::dataIO { - class Writer; - typedef std::shared_ptr<Writer> WriterPtr; - - class Writer - { - public: - Writer() = default; - -#define RUN_ARON_MACRO(upperType, lowerType, capsType) \ - virtual bool writeStart##upperType() = 0; \ - virtual bool writeEnd##upperType() = 0; - - HANDLE_CONTAINER_DATA -#undef RUN_ARON_MACRO - -#define RUN_ARON_MACRO(upperType, lowerType, capsType) \ - virtual bool write##upperType(const std::vector<int>&, const std::string&, const unsigned char*) = 0; - - HANDLE_COMPLEX_DATA -#undef RUN_ARON_MACRO - -#define RUN_ARON_MACRO(upperType, lowerType, capsType) \ - virtual bool writePrimitive(const lowerType&) = 0; - - HANDLE_PRIMITIVE_DATA -#undef RUN_ARON_MACRO - - virtual bool writeKey(const std::string&) = 0; - }; + class WriterInterface; + typedef std::shared_ptr<WriterInterface> WriterInterfacePtr; + + class WriterInterface + { + public: + virtual void writeStartDict() = 0; + virtual void writeEndDict() = 0; + virtual void writeStartList() = 0; + virtual void writeEndList() = 0; + + virtual void writeNDArray(const std::vector<int>&, const std::string&, const unsigned char*) = 0; + + virtual void writePrimitive(int) = 0; + virtual void writePrimitive(long) = 0; + virtual void writePrimitive(float) = 0; + virtual void writePrimitive(double) = 0; + virtual void writePrimitive(const std::string&) = 0; + virtual void writePrimitive(bool) = 0; + + virtual void writeKey(const std::string&) = 0; + }; } diff --git a/source/RobotAPI/libraries/aron/core/io/dataIO/converter/Converter.cpp b/source/RobotAPI/libraries/aron/core/io/dataIO/converter/Converter.cpp index bfd7804b3618e13cfe3543dc76c30e581673d62b..13b6703cd69bffe9e6c8f89cf4164ada98649bc0 100644 --- a/source/RobotAPI/libraries/aron/core/io/dataIO/converter/Converter.cpp +++ b/source/RobotAPI/libraries/aron/core/io/dataIO/converter/Converter.cpp @@ -30,71 +30,71 @@ namespace armarx::aron::dataIO +{ + void Converter::ConvertFromReader(ReaderInterface& reader, WriterInterface& writer, const aron::typenavigator::NavigatorPtr& expectedStructure) + { + type::Descriptor t_desc = expectedStructure != nullptr ? expectedStructure->getDescriptor() : type::eUnknown; + data::Descriptor desc = reader.getTypeOfNext(t_desc); + switch (desc) { - void Converter::ConvertFromReader(Reader& reader, dataIO::Writer& writer, const aron::typenavigator::NavigatorPtr& expectedStructure) + case data::eDict: { - type::Descriptor t_desc = expectedStructure != nullptr ? expectedStructure->getDescriptor() : type::eUnknown; - data::Descriptor desc = reader.getTypeOfNextAron(t_desc); - switch (desc) + int elements = reader.readStartDict(); + writer.writeStartDict(); + + typenavigator::NavigatorPtr childType = nullptr; + if (t_desc == type::eDict) { - case data::eDict: + auto t = typenavigator::DictNavigator::DynamicCast(expectedStructure); + childType = t->getAcceptedType(); + } + + for (int i = 0; i < elements; ++i) { - int elements = reader.readStartDict(); - writer.writeStartDict(); + std::string key = reader.readKey(); + writer.writeKey(key); - typenavigator::NavigatorPtr childType = nullptr; - if (t_desc == type::eDict) + if (t_desc == type::eObject) { - auto t = typenavigator::DictNavigator::DynamicCast(expectedStructure); - childType = t->getAcceptedType(); + auto t = typenavigator::ObjectNavigator::DynamicCast(expectedStructure); + childType = t->getMemberType(key); } - for (int i = 0; i < elements; ++i) - { - std::string key = reader.readKey(); - writer.writeKey(key); + Converter::ConvertFromReader(reader, writer, childType); + } - if (t_desc == type::eObject) - { - auto t = typenavigator::ObjectNavigator::DynamicCast(expectedStructure); - childType = t->getMemberType(key); - } + writer.writeEndDict(); + reader.readEndDict(); - Converter::ConvertFromReader(reader, writer, childType); - } - - writer.writeEndDict(); - reader.readEndDict(); + break; + } + case data::eList: + { + int elements = reader.readStartList(); + writer.writeStartList(); - break; - } - case data::eList: + typenavigator::NavigatorPtr childType = nullptr; + if (t_desc == type::eList) { - int elements = reader.readStartList(); - writer.writeStartList(); - - typenavigator::NavigatorPtr childType = nullptr; - if (t_desc == type::eList) - { - auto t = typenavigator::ListNavigator::DynamicCast(expectedStructure); - childType = t->getAcceptedType(); - } + auto t = typenavigator::ListNavigator::DynamicCast(expectedStructure); + childType = t->getAcceptedType(); + } - for (int i = 0; i < elements; ++i) + for (int i = 0; i < elements; ++i) + { + if (t_desc == type::eObject) { - if (t_desc == type::eObject) - { - auto t = typenavigator::TupleNavigator::DynamicCast(expectedStructure); - childType = t->getAcceptedType(i); - } - - Converter::ConvertFromReader(reader, writer, childType); + auto t = typenavigator::TupleNavigator::DynamicCast(expectedStructure); + childType = t->getAcceptedType(i); } - writer.writeEndList(); - reader.readEndList(); - break; + Converter::ConvertFromReader(reader, writer, childType); } + + writer.writeEndList(); + reader.readEndList(); + break; + } #define RUN_ARON_MACRO(upperType, lowerType, capsType) \ case data::e##upperType: \ { \ @@ -107,7 +107,7 @@ case data::e##upperType: \ break; \ } - HANDLE_COMPLEX_DATA + HANDLE_COMPLEX_DATA #undef RUN_ARON_MACRO #define RUN_ARON_MACRO(upperType, lowerType, capsType) \ @@ -118,13 +118,13 @@ case data::e##upperType: \ break; \ } - HANDLE_PRIMITIVE_DATA + HANDLE_PRIMITIVE_DATA #undef RUN_ARON_MACRO - default: - { - throw error::DescriptorNotValidException("LegacyAronDataReader", "SetupReaderAndGetResult", "Data-Type could not be resolved", desc); - } - } + default: + { + throw error::DescriptorNotValidException("LegacyAronDataReader", "SetupReaderAndGetResult", "Data-Type could not be resolved", desc); } + } + } } diff --git a/source/RobotAPI/libraries/aron/core/io/dataIO/converter/Converter.h b/source/RobotAPI/libraries/aron/core/io/dataIO/converter/Converter.h index 74d1363b1aeaed620b01a351c7924f0aea003b79..d51d81761b764d5616bb70e5cefd67dd105987bd 100644 --- a/source/RobotAPI/libraries/aron/core/io/dataIO/converter/Converter.h +++ b/source/RobotAPI/libraries/aron/core/io/dataIO/converter/Converter.h @@ -43,7 +43,6 @@ namespace armarx::aron::dataIO Converter() = delete; public: - static void ConvertFromReader(dataIO::Reader&, dataIO::Writer&, const aron::typenavigator::NavigatorPtr& expectedStructure = nullptr); - public: + static void ConvertFromReader(ReaderInterface&, WriterInterface&, const aron::typenavigator::NavigatorPtr& expectedStructure = nullptr); }; } diff --git a/source/RobotAPI/libraries/aron/core/io/dataIO/reader/Reader.h b/source/RobotAPI/libraries/aron/core/io/dataIO/reader/Reader.h index 2cd749a1f5109d4a059d6b2f0076fe5f8c1ce3a5..dbc013c6efd7bace247c1c2a4a656d3bdd87748c 100644 --- a/source/RobotAPI/libraries/aron/core/io/dataIO/reader/Reader.h +++ b/source/RobotAPI/libraries/aron/core/io/dataIO/reader/Reader.h @@ -19,67 +19,3 @@ */ #pragma once - -// STD/STL -#include <memory> -#include <string> -#include <stack> - -// Base Class -#include <RobotAPI/libraries/aron/core/io/dataIO/Reader.h> - - - -namespace armarx::aron::dataIO -{ - template <typename InputTypename, typename TokenPtrTypename> - class TokenizedReader; - - template <typename InputTypename, typename TokenPtrTypename> - using TokenizedReaderPtr = std::shared_ptr<TokenizedReader<InputTypename, TokenPtrTypename>>; - - template <typename InputTypename, typename TokenPtrTypename> - class TokenizedReader : - virtual public Reader - { - public: - TokenizedReader() = delete; - TokenizedReader(const InputTypename& input) : - data(input) - { - } - - // ReadKey - std::string readKey() override - { - TokenPtrTypename token = stack.top(); - std::string k = token->resolveCurrentKey(); - return k; - } - - bool readKey(const std::string& k) override - { - TokenPtrTypename token = stack.top(); - token->setCurrentKey(k); - return true; - } - - data::Descriptor getTypeOfNextAron(const type::Descriptor hint) const override - { - if (stack.empty()) - { - // completely unknown. We assume a dict on the top level - return data::Descriptor::eDict; - } - - TokenPtrTypename lastToken = stack.top(); - return lastToken->getTypeOfNextElement(hint); - } - - - protected: - InputTypename data; - bool readInitialStart = false; - std::stack<TokenPtrTypename> stack; - }; -} diff --git a/source/RobotAPI/libraries/aron/core/io/dataIO/reader/ReaderToken.h b/source/RobotAPI/libraries/aron/core/io/dataIO/reader/ReaderToken.h index a3c2be81ebdcfe3cbcc08fa54d0336d1ef518ff8..07cd3ef344f4226ea250733706f164d63c7481ee 100644 --- a/source/RobotAPI/libraries/aron/core/io/dataIO/reader/ReaderToken.h +++ b/source/RobotAPI/libraries/aron/core/io/dataIO/reader/ReaderToken.h @@ -29,42 +29,102 @@ // ArmarX #include <RobotAPI/libraries/aron/core/Config.h> -#include <RobotAPI/libraries/aron/core/Descriptor.h> - - +#include <RobotAPI/libraries/aron/core/Exception.h> +#include <RobotAPI/libraries/aron/core/io/Data.h> namespace armarx::aron::dataIO { - template<typename ElementReturnPtrTypename, typename ElementAddTypename> - class ReaderToken; + template<typename ElementTypename> + class ReaderTokenInterface; - template<typename ElementReturnPtrTypename, typename ElementAddTypename> - using ReaderTokenPtr = std::shared_ptr<ReaderToken<ElementReturnPtrTypename, ElementAddTypename>>; + template<typename ElementTypename> + using ReaderTokenInterfacePtr = std::shared_ptr<ReaderTokenInterface<ElementTypename>>; - template<typename ElementReturnPtrTypename, typename ElementAddTypename> - class ReaderToken : - virtual public io::ReaderToken<data::Descriptor, ElementReturnPtrTypename, ElementAddTypename> + template<typename ElementTypename> + class ReaderTokenInterface { public: - using PointerType = ReaderTokenPtr<ElementReturnPtrTypename, ElementAddTypename>; + using PointerType = ReaderTokenInterfacePtr<ElementTypename>; - public: - // constructors - ReaderToken() = delete; - ReaderToken(const data::Descriptor desc, const ElementAddTypename& data) : - io::ReaderToken<data::Descriptor, ElementReturnPtrTypename, ElementAddTypename>(desc, data) - { } - bool currentIsEligableForResolvingKey() const override + // Interface + virtual data::Descriptor getTypeOfNext(const type::Descriptor hint = type::eUnknown) const = 0; + virtual ElementTypename getNextElement() const = 0; + + // General implementation + ElementTypename getElement() const + { + return element; + } + + data::Descriptor getDescriptor() const + { + return descriptor; + } + + unsigned int getElementChildrenSize() const { - if (this->descriptor == data::Descriptor::eDict) + return childrenSize; + } + + bool finishedElement() const + { + return currentIndex >= getElementChildrenSize(); + } + + std::string getCurrentKey() const + { + assertIndexInBounds(); + + // ugly workaround + if (this->currentKey == "") // probably in a dict where the caller does not know which keys are there { - return true; + if (this->allMemberNames.size() == 0) + { + throw error::AronException("dataIO::ReaderTokenInterface", "getCurrentKey", "The currentKey is not set and the list of all keys is empty!"); + } + return this->allMemberNames[this->currentIndex]; } - return false; + return this->currentKey; } - virtual data::Descriptor getTypeOfNextElement(const type::Descriptor) const = 0; - private: + void setCurrentKey(const std::string& s) + { + currentKey = s; + } + + void assertType(data::Descriptor t) const + { + if (getDescriptor() != t) + { + throw error::DescriptorNotValidException("dataIO::ReaderTokenInterface", "assertType", "The type was not equal.", t); + } + } + + void assertIndexInBounds() const + { + if (this->currentIndex >= getElementChildrenSize()) + { + throw error::SizeNotValidException("dataIO::ReaderTokenInterface", "assertIndexInBounds", "Index out of bounds.", this->currentIndex, getElementChildrenSize()); + } + } + + ElementTypename getNextElementAndIncreaseCnt() + { + ElementTypename next = getNextElement(); + this->currentIndex++; + return next; + } + + protected: + // members + data::Descriptor descriptor = data::eUnknown; + ElementTypename element; + + unsigned int childrenSize = 0; + unsigned int currentIndex = 0; + + std::string currentKey = ""; + std::vector<std::string> allMemberNames = {}; }; } diff --git a/source/RobotAPI/libraries/aron/core/io/dataIO/reader/navigator/NavigatorReader.cpp b/source/RobotAPI/libraries/aron/core/io/dataIO/reader/navigator/NavigatorReader.cpp index 56506642ae73fcc5a3518dc86f85d7cae2248e50..aa5d3d14864aff4fd5d86b8cfc47b06a81cc0200 100644 --- a/source/RobotAPI/libraries/aron/core/io/dataIO/reader/navigator/NavigatorReader.cpp +++ b/source/RobotAPI/libraries/aron/core/io/dataIO/reader/navigator/NavigatorReader.cpp @@ -33,110 +33,166 @@ namespace armarx::aron::dataIO::reader +{ + NavigatorReader::NavigatorReader(const datanavigator::NavigatorPtr& n) : + input(n) + { + } + + NavigatorReader::NavigatorReader(const data::AronDataPtr& n) : + input(datanavigator::Navigator::FromAronData(n)) + { + } + + datanavigator::NavigatorPtr NavigatorReader::getNextAndIncrease() + { + if (!readInitialStart) + { + readInitialStart = true; + return input; + } + auto lastToken = stack.top(); + return lastToken->getNextElementAndIncreaseCnt(); + } + + datanavigator::NavigatorPtr NavigatorReader::getNext() + { + if (!readInitialStart) + { + readInitialStart = true; + return input; + } + auto lastToken = stack.top(); + return lastToken->getNextElement(); + } + + // Containers + int NavigatorReader::readStartDict() + { + auto current_nav = getNextAndIncrease(); + auto current_nav_casted = datanavigator::DictNavigator::DynamicCastAndCheck(current_nav); + int c = current_nav->childrenSize(); + auto newToken = std::make_shared<NavigatorReaderToken>(data::eDict, current_nav_casted); + stack.push(newToken); + return c; + } + + bool NavigatorReader::readEndDict() + { + auto token = stack.top(); + datanavigator::DictNavigator::DynamicCastAndCheck(token->getElement()); + + if (token->finishedElement()) { - NavigatorReader::NavigatorReader(const datanavigator::NavigatorPtr& n) : - TokenizedReader<datanavigator::NavigatorPtr, NavigatorReaderTokenPtr>(n) - { - } - - NavigatorReader::NavigatorReader(const data::AronDataPtr& n) : - TokenizedReader<datanavigator::NavigatorPtr, NavigatorReaderTokenPtr>(datanavigator::Navigator::FromAronData(n)) - { - } - - datanavigator::NavigatorPtr NavigatorReader::getCurrentAndGoToNext() - { - if (!readInitialStart) - { - readInitialStart = true; - return data; - } - auto lastToken = stack.top(); - return lastToken->getCurrentElementAndIncreaseCnt(); - } - - datanavigator::NavigatorPtr NavigatorReader::getCurrent() - { - if (!readInitialStart) - { - readInitialStart = true; - return data; - } - auto lastToken = stack.top(); - return lastToken->getCurrentElement(); - } - -#define RUN_ARON_MACRO(upperType, lowerType, capsType) \ - int NavigatorReader::readStart##upperType() \ - { \ - datanavigator::NavigatorPtr current_nav = getCurrentAndGoToNext(); \ - auto desc = current_nav->getDescriptor(); \ - if (desc != data::Descriptor::e##upperType) \ - { \ - throw error::DescriptorNotValidException("NavigatorReader", "readStart" + std::string(#upperType), "A token in the stack has the wrong type. Expected " + std::string(#upperType), desc); \ - return false; \ - } \ - datanavigator::upperType##NavigatorPtr current_nav_casted = datanavigator::upperType##Navigator::DynamicCast(current_nav); \ - int c = current_nav->childrenSize(); \ - NavigatorReaderTokenPtr newToken = NavigatorReaderTokenPtr(new NavigatorReaderToken(current_nav->getDescriptor(), current_nav_casted)); \ - stack.push(newToken); \ - return c; \ - } \ - \ - bool NavigatorReader::readEnd##upperType() \ - { \ - NavigatorReaderTokenPtr token = stack.top(); \ - auto desc = token->getDescriptor(); \ - if (desc != data::Descriptor::e##upperType) \ - { \ - throw error::DescriptorNotValidException("NavigatorReader", "readEnd" + std::string(#upperType), "A token in the stack has the wrong type. Expected " + std::string(#upperType), desc); \ - return false; \ - } \ - \ - if (token->checkedAllChildren()) \ - { \ - stack.pop(); \ - return true; \ - } \ - return false; \ - } - - HANDLE_CONTAINER_DATA -#undef RUN_ARON_MACRO - - // Complex Data -#define RUN_ARON_MACRO(upperType, lowerType, capsType) \ - std::pair<std::vector<int>, std::string> NavigatorReader::readStart##upperType() \ - { \ - datanavigator::NavigatorPtr nav = getCurrent(); \ - datanavigator::NDArrayNavigatorPtr casted = datanavigator::NDArrayNavigator::DynamicCast(nav); \ - return std::make_pair(casted->getDimensions(), casted->getType()); \ - } \ - \ - void NavigatorReader::readEnd##upperType(unsigned char* data) \ - { \ - if(data == NULL) \ - { \ - throw error::AronException("NavigatorReader", "readEnd" + std::string(#upperType), "The corresponding data pointer of an complex aron ptr is NULL."); \ - } \ - datanavigator::NavigatorPtr nav = getCurrentAndGoToNext(); \ - datanavigator::NDArrayNavigatorPtr casted = datanavigator::NDArrayNavigator::DynamicCast(nav); \ - std::vector<int> dims = casted->getDimensions(); \ - memcpy(data, casted->getData(), std::accumulate(std::begin(dims), std::end(dims), 1, std::multiplies<int>())); \ - } - - HANDLE_COMPLEX_DATA -#undef RUN_ARON_MACRO - - // Read primitives -#define RUN_ARON_MACRO(upperType, lowerType, capsType) \ - void NavigatorReader::readPrimitive(lowerType& t) \ - { \ - datanavigator::NavigatorPtr nav = getCurrentAndGoToNext(); \ - datanavigator::upperType##NavigatorPtr casted = datanavigator::upperType##Navigator::DynamicCast(nav); \ - t = casted->getValue(); \ - } - - HANDLE_PRIMITIVE_DATA -#undef RUN_ARON_MACRO + stack.pop(); + return true; + } + return false; + } + + int NavigatorReader::readStartList() + { + auto current_nav = getNextAndIncrease(); + auto current_nav_casted = datanavigator::ListNavigator::DynamicCastAndCheck(current_nav); + int c = current_nav->childrenSize(); + auto newToken = std::make_shared<NavigatorReaderToken>(data::eList, current_nav_casted); + stack.push(newToken); + return c; + } + + bool NavigatorReader::readEndList() + { + auto token = stack.top(); + datanavigator::ListNavigator::DynamicCastAndCheck(token->getElement()); + + if (token->finishedElement()) + { + stack.pop(); + return true; + } + return false; + } + + // Complex Data + std::tuple<std::vector<int>, std::string> NavigatorReader::readStartNDArray() + { + datanavigator::NavigatorPtr nav = getNext(); + datanavigator::NDArrayNavigatorPtr casted = datanavigator::NDArrayNavigator::DynamicCastAndCheck(nav); + return {casted->getDimensions(), casted->getType()}; + } + + bool NavigatorReader::readEndNDArray(unsigned char* data) + { + if (data == NULL) + { + throw error::AronException("NavigatorReader", "readEndNDArray", "The corresponding data pointer of an complex aron ptr is NULL."); + } + auto nav = getNextAndIncrease(); + auto casted = datanavigator::NDArrayNavigator::DynamicCastAndCheck(nav); + std::vector<int> dims = casted->getDimensions(); + memcpy(data, casted->getData(), std::accumulate(std::begin(dims), std::end(dims), 1, std::multiplies<int>())); + return true; + } + + // Read primitives + void NavigatorReader::readPrimitive(int& t) + { + auto nav = getNextAndIncrease(); + auto casted = datanavigator::IntNavigator::DynamicCastAndCheck(nav); + t = casted->getValue(); + } + + void NavigatorReader::readPrimitive(long& t) + { + auto nav = getNextAndIncrease(); + auto casted = datanavigator::LongNavigator::DynamicCastAndCheck(nav); + t = casted->getValue(); + } + + void NavigatorReader::readPrimitive(float& t) + { + auto nav = getNextAndIncrease(); + auto casted = datanavigator::FloatNavigator::DynamicCastAndCheck(nav); + t = casted->getValue(); + } + + void NavigatorReader::readPrimitive(double& t) + { + auto nav = getNextAndIncrease(); + auto casted = datanavigator::DoubleNavigator::DynamicCastAndCheck(nav); + t = casted->getValue(); + } + + void NavigatorReader::readPrimitive(std::string& t) + { + auto nav = getNextAndIncrease(); + auto casted = datanavigator::StringNavigator::DynamicCastAndCheck(nav); + t = casted->getValue(); + } + + void NavigatorReader::readPrimitive(bool& t) + { + auto nav = getNextAndIncrease(); + auto casted = datanavigator::BoolNavigator::DynamicCastAndCheck(nav); + t = casted->getValue(); + } + + std::string NavigatorReader::readKey() + { + auto token = stack.top(); + return token->getCurrentKey(); + } + + void NavigatorReader::loadMember(const std::string& k) + { + auto token = stack.top(); + token->setCurrentKey(k); + } + + // Helper functions + data::Descriptor NavigatorReader::getTypeOfNext(const type::Descriptor hint) const + { + auto token = stack.top(); + return token->getTypeOfNext(hint); + } } diff --git a/source/RobotAPI/libraries/aron/core/io/dataIO/reader/navigator/NavigatorReader.h b/source/RobotAPI/libraries/aron/core/io/dataIO/reader/navigator/NavigatorReader.h index 3aa6b49d5c34ed30854a0664230685342b07d1a4..0bcc56b7bdc6e22775fc2d4345e1f9715e942d1f 100644 --- a/source/RobotAPI/libraries/aron/core/io/dataIO/reader/navigator/NavigatorReader.h +++ b/source/RobotAPI/libraries/aron/core/io/dataIO/reader/navigator/NavigatorReader.h @@ -25,7 +25,7 @@ #include <stack> // BaseClass -#include <RobotAPI/libraries/aron/core/io/dataIO/reader/Reader.h> +#include <RobotAPI/libraries/aron/core/io/dataIO/Reader.h> // ArmarX #include <RobotAPI/libraries/aron/core/navigator/data/Navigator.h> @@ -38,41 +38,43 @@ namespace armarx::aron::dataIO::reader typedef std::shared_ptr<NavigatorReader> NavigatorReaderPtr; class NavigatorReader : - virtual public TokenizedReader<datanavigator::NavigatorPtr, NavigatorReaderTokenPtr> + virtual public ReaderInterface { public: using PointerType = NavigatorReaderPtr; - public: // constructors NavigatorReader() = delete; NavigatorReader(const datanavigator::NavigatorPtr& n); NavigatorReader(const data::AronDataPtr& n); -#define RUN_ARON_MACRO(upperType, lowerType, capsType) \ -virtual int readStart##upperType() override; \ -virtual bool readEnd##upperType() override; \ - - HANDLE_CONTAINER_DATA -#undef RUN_ARON_MACRO + virtual int readStartDict() override; + virtual bool readEndDict() override; + virtual int readStartList() override; + virtual bool readEndList() override; -#define RUN_ARON_MACRO(upperType, lowerType, capsType) \ -virtual std::pair<std::vector<int>, std::string> readStart##upperType() override; \ -virtual void readEnd##upperType(unsigned char*) override; \ + virtual std::tuple<std::vector<int>, std::string> readStartNDArray() override; + virtual bool readEndNDArray(unsigned char*) override; - HANDLE_COMPLEX_DATA -#undef RUN_ARON_MACRO + virtual void readPrimitive(int&) override; + virtual void readPrimitive(long&) override; + virtual void readPrimitive(float&) override; + virtual void readPrimitive(double&) override; + virtual void readPrimitive(std::string&) override; + virtual void readPrimitive(bool&) override; -#define RUN_ARON_MACRO(upperType, lowerType, capsType) \ -virtual void readPrimitive(lowerType&) override; \ + virtual std::string readKey() override; + virtual void loadMember(const std::string&) override; - HANDLE_PRIMITIVE_DATA -#undef RUN_ARON_MACRO + virtual data::Descriptor getTypeOfNext(const type::Descriptor hint = type::eUnknown) const override; private: - datanavigator::NavigatorPtr getCurrent(); - datanavigator::NavigatorPtr getCurrentAndGoToNext(); + datanavigator::NavigatorPtr getNext(); + datanavigator::NavigatorPtr getNextAndIncrease(); private: + datanavigator::NavigatorPtr input; + bool readInitialStart = false; + std::stack<NavigatorReaderTokenPtr> stack; }; } diff --git a/source/RobotAPI/libraries/aron/core/io/dataIO/reader/navigator/NavigatorReaderToken.h b/source/RobotAPI/libraries/aron/core/io/dataIO/reader/navigator/NavigatorReaderToken.h index 4157ecba745dda7709f4efbf7f6181d2603a4f63..2efb3352f203d93fa0b647ea318affea7d41b4fd 100644 --- a/source/RobotAPI/libraries/aron/core/io/dataIO/reader/navigator/NavigatorReaderToken.h +++ b/source/RobotAPI/libraries/aron/core/io/dataIO/reader/navigator/NavigatorReaderToken.h @@ -38,7 +38,7 @@ namespace armarx::aron::dataIO::reader typedef std::shared_ptr<NavigatorReaderToken> NavigatorReaderTokenPtr; class NavigatorReaderToken : - virtual public ReaderToken<datanavigator::NavigatorPtr, datanavigator::NavigatorPtr> + virtual public ReaderTokenInterface<datanavigator::NavigatorPtr> { public: using PointerType = NavigatorReaderTokenPtr; @@ -46,21 +46,22 @@ namespace armarx::aron::dataIO::reader public: // constructors NavigatorReaderToken() = delete; - NavigatorReaderToken(const data::Descriptor desc, const datanavigator::NavigatorPtr& data) : - io::ReaderToken<data::Descriptor, datanavigator::NavigatorPtr, datanavigator::NavigatorPtr>(desc, data), - ReaderToken<datanavigator::NavigatorPtr, datanavigator::NavigatorPtr>(desc, data) + NavigatorReaderToken(const data::Descriptor desc, const datanavigator::NavigatorPtr& data) { + descriptor = desc; + element = data; + switch (descriptor) { case data::Descriptor::eDict: { - allKeys = datanavigator::DictNavigator::DynamicCastAndCheck(data)->getAllKeys(); - maxIndex = allKeys.size(); + allMemberNames = datanavigator::DictNavigator::DynamicCastAndCheck(data)->getAllKeys(); + childrenSize = data->childrenSize(); break; } case data::Descriptor::eList: { - maxIndex = datanavigator::ListNavigator::DynamicCastAndCheck(data)->childrenSize(); + childrenSize = data->childrenSize(); break; } default: @@ -68,20 +69,20 @@ namespace armarx::aron::dataIO::reader } } - data::Descriptor getTypeOfNextElement(const type::Descriptor) const override + data::Descriptor getTypeOfNext(const type::Descriptor hint = type::eUnknown) const override { - const datanavigator::NavigatorPtr next = getCurrentElement(); + const datanavigator::NavigatorPtr next = getNextElement(); return next->getDescriptor(); } - datanavigator::NavigatorPtr getCurrentElement() const override + datanavigator::NavigatorPtr getNextElement() const override { switch (descriptor) { case data::Descriptor::eDict: { datanavigator::DictNavigatorPtr casted = datanavigator::DictNavigator::DynamicCast(element); - datanavigator::NavigatorPtr ret = casted->getElement(resolveCurrentKey()); + datanavigator::NavigatorPtr ret = casted->getElement(getCurrentKey()); return ret; } case data::Descriptor::eList: @@ -96,5 +97,6 @@ namespace armarx::aron::dataIO::reader } private: + }; } diff --git a/source/RobotAPI/libraries/aron/core/io/dataIO/reader/nlohmannJSON/NlohmannJSONReader.cpp b/source/RobotAPI/libraries/aron/core/io/dataIO/reader/nlohmannJSON/NlohmannJSONReader.cpp index 2ac1b5462137df5bf1e8f29f4c8683dfed20b6e0..9b15c88280210b4e9b2e583ba7439d87e68909d9 100644 --- a/source/RobotAPI/libraries/aron/core/io/dataIO/reader/nlohmannJSON/NlohmannJSONReader.cpp +++ b/source/RobotAPI/libraries/aron/core/io/dataIO/reader/nlohmannJSON/NlohmannJSONReader.cpp @@ -33,103 +33,158 @@ namespace armarx::aron::dataIO::reader +{ + NlohmannJSONReader::NlohmannJSONReader(const nlohmann::json& n) : + input(n) + { + } + + NlohmannJSONReader::NlohmannJSONReader(const std::string& n) : + input(nlohmann::json::parse(n)) + { + } + + nlohmann::json NlohmannJSONReader::getNextAndIncrease() + { + if (!readInitialStart) + { + readInitialStart = true; + return input; + } + NlohmannJSONReaderTokenPtr lastToken = stack.top(); + return lastToken->getNextElementAndIncreaseCnt(); + } + + nlohmann::json NlohmannJSONReader::getNext() + { + if (!readInitialStart) + { + readInitialStart = true; + return input; + } + NlohmannJSONReaderTokenPtr lastToken = stack.top(); + return lastToken->getNextElement(); + } + + int NlohmannJSONReader::readStartDict() + { + nlohmann::json current_json = getNextAndIncrease(); + int c = current_json.size(); + auto newToken = std::make_shared<NlohmannJSONReaderToken>(data::eDict, current_json); + stack.push(newToken); + return c; + } + + bool NlohmannJSONReader::readEndDict() + { + auto token = stack.top(); + token->assertType(data::eDict); + + if (token->finishedElement()) { - NlohmannJSONReader::NlohmannJSONReader(const nlohmann::json& n) : - TokenizedReader<nlohmann::json, NlohmannJSONReaderTokenPtr>(n) - { - } - - NlohmannJSONReader::NlohmannJSONReader(const std::string& n) : - TokenizedReader<nlohmann::json, NlohmannJSONReaderTokenPtr>(nlohmann::json::parse(n)) - { - } - - nlohmann::json NlohmannJSONReader::getCurrentAndGoToNext() - { - if (!readInitialStart) - { - readInitialStart = true; - return data; - } - NlohmannJSONReaderTokenPtr lastToken = stack.top(); - return lastToken->getCurrentElementAndIncreaseCnt(); - } - - nlohmann::json NlohmannJSONReader::getCurrent() - { - if (!readInitialStart) - { - readInitialStart = true; - return data; - } - NlohmannJSONReaderTokenPtr lastToken = stack.top(); - return lastToken->getCurrentElement(); - } - -#define RUN_ARON_MACRO(upperType, lowerType, capsType) \ - int NlohmannJSONReader::readStart##upperType() \ - { \ - nlohmann::json current_json = getCurrentAndGoToNext(); \ - int c = current_json.size(); \ - NlohmannJSONReaderTokenPtr newToken = NlohmannJSONReaderTokenPtr(new NlohmannJSONReaderToken(data::e##upperType, current_json)); \ - stack.push(newToken); \ - return c; \ - } \ - \ - bool NlohmannJSONReader::readEnd##upperType() \ - { \ - NlohmannJSONReaderTokenPtr token = stack.top(); \ - auto desc = token->getDescriptor(); \ - if (desc != data::Descriptor::e##upperType) \ - { \ - throw error::DescriptorNotValidException("NlohmannJSONReader", "readEnd" + std::string(#upperType), "A token in the stack has the wrong type. Expected " + std::string(#upperType), desc); \ - return false; \ - } \ - \ - if (token->checkedAllChildren()) \ - { \ - stack.pop(); \ - return true; \ - } \ - return false; \ - } - - HANDLE_CONTAINER_DATA -#undef RUN_ARON_MACRO - - // Complex Data -#define RUN_ARON_MACRO(upperType, lowerType, capsType) \ - std::pair<std::vector<int>, std::string> NlohmannJSONReader::readStart##upperType() \ - { \ - nlohmann::json j = getCurrent(); \ - std::vector<int> dims = j[io::Data::READER_WRITER_NDARRAY_DIMENSIONS_SLUG]; \ - std::string type = j[io::Data::READER_WRITER_NDARRAY_TYPE_SLUG]; \ - return std::make_pair(dims, type); \ - } \ - \ - void NlohmannJSONReader::readEnd##upperType(unsigned char* data) \ - { \ - if(data == NULL) \ - { \ - throw error::AronException("NlohmannJSONReader", "readEnd" + std::string(#upperType), "The corresponding data pointer of an complex aron ptr is NULL."); \ - } \ - nlohmann::json j = getCurrentAndGoToNext(); \ - std::vector<int> dims = j[io::Data::READER_WRITER_NDARRAY_DIMENSIONS_SLUG]; \ - std::vector<unsigned char> d = j[io::Data::READER_WRITER_NDARRAY_DATA_SLUG]; \ - memcpy(data, d.data(), std::accumulate(std::begin(dims), std::end(dims), 1, std::multiplies<int>())); \ - } - - HANDLE_COMPLEX_DATA -#undef RUN_ARON_MACRO - - // Read primitives -#define RUN_ARON_MACRO(upperType, lowerType, capsType) \ - void NlohmannJSONReader::readPrimitive(lowerType& t) \ - { \ - nlohmann::json j = getCurrentAndGoToNext(); \ - t = j; \ - } - - HANDLE_PRIMITIVE_DATA -#undef RUN_ARON_MACRO + stack.pop(); + return true; + } + return false; + } + + int NlohmannJSONReader::readStartList() + { + nlohmann::json current_json = getNextAndIncrease(); + int c = current_json.size(); + auto newToken = std::make_shared<NlohmannJSONReaderToken>(data::eList, current_json); + stack.push(newToken); + return c; + } + + bool NlohmannJSONReader::readEndList() + { + auto token = stack.top(); + token->assertType(data::eList); + + if (token->finishedElement()) + { + stack.pop(); + return true; + } + return false; + } + + // Complex Data + std::tuple<std::vector<int>, std::string> NlohmannJSONReader::readStartNDArray() + { + nlohmann::json j = getNext(); + std::vector<int> dims = j[io::Data::READER_WRITER_NDARRAY_DIMENSIONS_SLUG]; + std::string type = j[io::Data::READER_WRITER_NDARRAY_TYPE_SLUG]; + return {dims, type}; + } + + bool NlohmannJSONReader::readEndNDArray(unsigned char* data) + { + if (data == NULL) + { + throw error::AronException("NlohmannJSONReader", "readEndNDArray", "The corresponding data pointer of an complex aron ptr is NULL."); + } + nlohmann::json j = getNextAndIncrease(); + std::vector<int> dims = j[io::Data::READER_WRITER_NDARRAY_DIMENSIONS_SLUG]; + std::vector<unsigned char> d = j[io::Data::READER_WRITER_NDARRAY_DATA_SLUG]; + memcpy(data, d.data(), std::accumulate(std::begin(dims), std::end(dims), 1, std::multiplies<int>())); + return true; + } + + // Read primitives + void NlohmannJSONReader::readPrimitive(int& t) + { + nlohmann::json j = getNextAndIncrease(); + t = j; + } + + void NlohmannJSONReader::readPrimitive(long& t) + { + nlohmann::json j = getNextAndIncrease(); + t = j; + } + + void NlohmannJSONReader::readPrimitive(float& t) + { + nlohmann::json j = getNextAndIncrease(); + t = j; + } + + void NlohmannJSONReader::readPrimitive(double& t) + { + nlohmann::json j = getNextAndIncrease(); + t = j; + } + + void NlohmannJSONReader::readPrimitive(std::string& t) + { + nlohmann::json j = getNextAndIncrease(); + t = j; + } + + void NlohmannJSONReader::readPrimitive(bool& t) + { + nlohmann::json j = getNextAndIncrease(); + t = j; + } + + std::string NlohmannJSONReader::readKey() + { + auto token = stack.top(); + return token->getCurrentKey(); + } + + void NlohmannJSONReader::loadMember(const std::string& k) + { + auto token = stack.top(); + token->setCurrentKey(k); + } + + // Helper functions + data::Descriptor NlohmannJSONReader::getTypeOfNext(const type::Descriptor hint) const + { + auto token = stack.top(); + return token->getTypeOfNext(hint); + } } diff --git a/source/RobotAPI/libraries/aron/core/io/dataIO/reader/nlohmannJSON/NlohmannJSONReader.h b/source/RobotAPI/libraries/aron/core/io/dataIO/reader/nlohmannJSON/NlohmannJSONReader.h index 0b48fe229b1dca5034c618d211153e3b09ccacd5..1ca1810a0c3085e4d53b7a79c934dc1eaa7e1e25 100644 --- a/source/RobotAPI/libraries/aron/core/io/dataIO/reader/nlohmannJSON/NlohmannJSONReader.h +++ b/source/RobotAPI/libraries/aron/core/io/dataIO/reader/nlohmannJSON/NlohmannJSONReader.h @@ -25,7 +25,7 @@ #include <stack> // BaseClass -#include <RobotAPI/libraries/aron/core/io/dataIO/reader/Reader.h> +#include <RobotAPI/libraries/aron/core/io/dataIO/Reader.h> // ArmarX #include <RobotAPI/libraries/aron/core/io/dataIO/reader/nlohmannJSON/NlohmannJSONReaderToken.h> @@ -36,41 +36,43 @@ namespace armarx::aron::dataIO::reader typedef std::shared_ptr<NlohmannJSONReader> NlohmannJSONReaderPtr; class NlohmannJSONReader : - virtual public TokenizedReader<nlohmann::json, NlohmannJSONReaderTokenPtr> + virtual public ReaderInterface { public: using PointerType = NlohmannJSONReaderPtr; - public: // constructors NlohmannJSONReader() = delete; NlohmannJSONReader(const nlohmann::json& n); NlohmannJSONReader(const std::string& n); -#define RUN_ARON_MACRO(upperType, lowerType, capsType) \ -virtual int readStart##upperType() override; \ -virtual bool readEnd##upperType() override; \ - - HANDLE_CONTAINER_DATA -#undef RUN_ARON_MACRO + virtual int readStartDict() override; + virtual bool readEndDict() override; + virtual int readStartList() override; + virtual bool readEndList() override; -#define RUN_ARON_MACRO(upperType, lowerType, capsType) \ -virtual std::pair<std::vector<int>, std::string> readStart##upperType() override; \ -virtual void readEnd##upperType(unsigned char*) override; \ + virtual std::tuple<std::vector<int>, std::string> readStartNDArray() override; + virtual bool readEndNDArray(unsigned char*) override; - HANDLE_COMPLEX_DATA -#undef RUN_ARON_MACRO + virtual void readPrimitive(int&) override; + virtual void readPrimitive(long&) override; + virtual void readPrimitive(float&) override; + virtual void readPrimitive(double&) override; + virtual void readPrimitive(std::string&) override; + virtual void readPrimitive(bool&) override; -#define RUN_ARON_MACRO(upperType, lowerType, capsType) \ -virtual void readPrimitive(lowerType&) override; \ + virtual std::string readKey() override; + virtual void loadMember(const std::string&) override; - HANDLE_PRIMITIVE_DATA -#undef RUN_ARON_MACRO + virtual data::Descriptor getTypeOfNext(const type::Descriptor hint = type::eUnknown) const override; private: - nlohmann::json getCurrent(); - nlohmann::json getCurrentAndGoToNext(); + nlohmann::json getNext(); + nlohmann::json getNextAndIncrease(); private: + nlohmann::json input; + bool readInitialStart = false; + std::stack<NlohmannJSONReaderTokenPtr> stack; }; } diff --git a/source/RobotAPI/libraries/aron/core/io/dataIO/reader/nlohmannJSON/NlohmannJSONReaderToken.h b/source/RobotAPI/libraries/aron/core/io/dataIO/reader/nlohmannJSON/NlohmannJSONReaderToken.h index 5148357520ed5cec05869ed76d9afaf9ec214fcb..d155a2d155027ad03f16a359a903da88dae6776c 100644 --- a/source/RobotAPI/libraries/aron/core/io/dataIO/reader/nlohmannJSON/NlohmannJSONReaderToken.h +++ b/source/RobotAPI/libraries/aron/core/io/dataIO/reader/nlohmannJSON/NlohmannJSONReaderToken.h @@ -34,39 +34,41 @@ #include <RobotAPI/libraries/aron/core/Config.h> #include <RobotAPI/libraries/aron/core/Resolver.h> + + namespace armarx::aron::dataIO::reader - { +{ // BaseClass class NlohmannJSONReaderToken; typedef std::shared_ptr<NlohmannJSONReaderToken> NlohmannJSONReaderTokenPtr; class NlohmannJSONReaderToken : - virtual public ReaderToken<nlohmann::json, nlohmann::json> + virtual public ReaderTokenInterface<nlohmann::json> { public: using PointerType = NlohmannJSONReaderTokenPtr; - public: // constructors NlohmannJSONReaderToken() = delete; - NlohmannJSONReaderToken(const data::Descriptor desc, const nlohmann::json& data) : - io::ReaderToken<data::Descriptor, nlohmann::json, nlohmann::json>(desc, data), - ReaderToken<nlohmann::json, nlohmann::json>(desc, data) + NlohmannJSONReaderToken(const data::Descriptor desc, const nlohmann::json& data) { + descriptor = desc; + element = data; + switch (descriptor) { case data::eDict: { for (auto it = data.begin(); it != data.end(); ++it) { - allKeys.push_back(it.key()); + allMemberNames.push_back(it.key()); } - maxIndex = allKeys.size(); + childrenSize = data.size(); break; } case data::eList: { - maxIndex = data.size(); + childrenSize = data.size(); break; } default: @@ -74,9 +76,9 @@ namespace armarx::aron::dataIO::reader } } - data::Descriptor getTypeOfNextElement(const type::Descriptor hint) const override + data::Descriptor getTypeOfNext(const type::Descriptor hint) const override { - const nlohmann::json next = getCurrentElement(); + const nlohmann::json next = getNextElement(); if (next.is_object()) { // Check if specific NDArray key exists @@ -94,15 +96,15 @@ namespace armarx::aron::dataIO::reader { data::Descriptor d = Resolver::GetFirstIfRelated( - Resolver::GetCorresponding(hint), - data::eLong); + Resolver::GetCorresponding(hint), + data::eLong); return d; } if (next.is_number_float()) { data::Descriptor d = Resolver::GetFirstIfRelated( - Resolver::GetCorresponding(hint), - data::eDouble); + Resolver::GetCorresponding(hint), + data::eDouble); return d; } if (next.is_boolean()) @@ -116,13 +118,13 @@ namespace armarx::aron::dataIO::reader throw error::AronException("NlohmannJSONReaderToken", "getTypeOfNextElement", "Could not determine the type of an nlohmann::json object. Could not convert to data::Descriptor enum."); } - nlohmann::json getCurrentElement() const override + nlohmann::json getNextElement() const override { switch (descriptor) { case data::eDict: { - nlohmann::json ret = element[resolveCurrentKey()]; + nlohmann::json ret = element[getCurrentKey()]; return ret; } case data::eList: diff --git a/source/RobotAPI/libraries/aron/core/io/dataIO/visitor/Visitor.cpp b/source/RobotAPI/libraries/aron/core/io/dataIO/visitor/Visitor.cpp index 7b756f8d24238b4655348607346c1f1d6e650f71..9f2dd3cd6e470c72698aae1c5c0bdcd948194e53 100644 --- a/source/RobotAPI/libraries/aron/core/io/dataIO/visitor/Visitor.cpp +++ b/source/RobotAPI/libraries/aron/core/io/dataIO/visitor/Visitor.cpp @@ -31,67 +31,87 @@ namespace armarx::aron::dataIO - { +{ + + void Visitor::SetupWriterFromAronDataPtr(WriterInterface& writer, const datanavigator::NavigatorPtr& aron) + { + SetupWriterFromAronDataPtr(writer, aron->getResult()); + } - void Visitor::SetupWriterFromAronDataPtr(dataIO::Writer& writer, const datanavigator::NavigatorPtr& aron) + void Visitor::SetupWriterFromAronDataPtr(WriterInterface& writer, const data::AronDataPtr& aron) + { + data::Descriptor desc = Resolver::GetDescriptor(aron); + switch (desc) + { + case data::eDict: { - SetupWriterFromAronDataPtr(writer, aron->getResult()); + data::AronDictPtr casted = data::AronDictPtr::dynamicCast(aron); + writer.writeStartDict(); + for (const auto& [key, value] : casted->elements) + { + writer.writeKey(key); + Visitor::SetupWriterFromAronDataPtr(writer, value); + } + writer.writeEndDict(); + break; } - - void Visitor::SetupWriterFromAronDataPtr(dataIO::Writer& writer, const data::AronDataPtr& aron) + case data::eList: { - data::Descriptor desc = Resolver::GetDescriptor(aron); - switch (desc) + data::AronListPtr casted = data::AronListPtr::dynamicCast(aron); + writer.writeStartList(); + for (const auto& value : casted->elements) { - case data::eDict: - { - data::AronDictPtr casted = data::AronDictPtr::dynamicCast(aron); - writer.writeStartDict(); - for (const auto& [key, value] : casted->elements) - { - writer.writeKey(key); - Visitor::SetupWriterFromAronDataPtr(writer, value); - } - writer.writeEndDict(); - break; - } - case data::eList: - { - data::AronListPtr casted = data::AronListPtr::dynamicCast(aron); - writer.writeStartList(); - for (const auto& value : casted->elements) - { - Visitor::SetupWriterFromAronDataPtr(writer, value); - } - writer.writeEndList(); - break; - } -#define RUN_ARON_MACRO(upperType, lowerType, capsType) \ -case data::e##upperType: \ -{ \ - data::Aron##upperType##Ptr casted = data::Aron##upperType##Ptr::dynamicCast(aron); \ - writer.write##upperType(casted->dimensions, casted->type, casted->data.data()); \ - break; \ -} - - HANDLE_COMPLEX_DATA -#undef RUN_ARON_MACRO - -#define RUN_ARON_MACRO(upperType, lowerType, capsType) \ -case data::e##upperType: \ -{ \ - data::Aron##upperType##Ptr casted = data::Aron##upperType##Ptr::dynamicCast(aron); \ - writer.writePrimitive(casted->value); \ - break; \ -} - - HANDLE_PRIMITIVE_DATA -#undef RUN_ARON_MACRO - - default: - { - throw error::DescriptorNotValidException("LegacyAronDataWriter", "SetupWriterFromAronDataPtr", "Data-Type could not be resolved. The ice_id of the input was: " + aron->ice_id(), desc); - } + Visitor::SetupWriterFromAronDataPtr(writer, value); } + writer.writeEndList(); + break; + } + case data::eNDArray: + { + data::AronNDArrayPtr casted = data::AronNDArrayPtr::dynamicCast(aron); + writer.writeNDArray(casted->dimensions, casted->type, casted->data.data()); + break; + } + case data::eInt: + { + data::AronIntPtr casted = data::AronIntPtr::dynamicCast(aron); + writer.writePrimitive(casted->value); + break; + } + case data::eLong: + { + data::AronLongPtr casted = data::AronLongPtr::dynamicCast(aron); + writer.writePrimitive(casted->value); + break; + } + case data::eFloat: + { + data::AronFloatPtr casted = data::AronFloatPtr::dynamicCast(aron); + writer.writePrimitive(casted->value); + break; + } + case data::eDouble: + { + data::AronDoublePtr casted = data::AronDoublePtr::dynamicCast(aron); + writer.writePrimitive(casted->value); + break; + } + case data::eString: + { + data::AronStringPtr casted = data::AronStringPtr::dynamicCast(aron); + writer.writePrimitive(casted->value); + break; + } + case data::eBool: + { + data::AronBoolPtr casted = data::AronBoolPtr::dynamicCast(aron); + writer.writePrimitive(casted->value); + break; + } + default: + { + throw error::DescriptorNotValidException("LegacyAronDataWriter", "SetupWriterFromAronDataPtr", "Data-Type could not be resolved. The ice_id of the input was: " + aron->ice_id(), desc); } + } + } } diff --git a/source/RobotAPI/libraries/aron/core/io/dataIO/visitor/Visitor.h b/source/RobotAPI/libraries/aron/core/io/dataIO/visitor/Visitor.h index 6aacda826b32b1c5fa7aa4359a04f49cc5d6f984..b45ef50c60207e97e6e29e170df39cf0be237a90 100644 --- a/source/RobotAPI/libraries/aron/core/io/dataIO/visitor/Visitor.h +++ b/source/RobotAPI/libraries/aron/core/io/dataIO/visitor/Visitor.h @@ -41,8 +41,8 @@ namespace armarx::aron::dataIO Visitor() = delete; public: - static void SetupWriterFromAronDataPtr(Writer&, const datanavigator::NavigatorPtr&); - static void SetupWriterFromAronDataPtr(Writer&, const data::AronDataPtr&); + static void SetupWriterFromAronDataPtr(WriterInterface&, const datanavigator::NavigatorPtr&); + static void SetupWriterFromAronDataPtr(WriterInterface&, const data::AronDataPtr&); public: }; diff --git a/source/RobotAPI/libraries/aron/core/io/dataIO/writer/Writer.h b/source/RobotAPI/libraries/aron/core/io/dataIO/writer/Writer.h index f72099f145fd0d178d928c7efb94f23609e1173a..a6a42098d8a198c7aa1ace6751cce3e7130c4cfa 100644 --- a/source/RobotAPI/libraries/aron/core/io/dataIO/writer/Writer.h +++ b/source/RobotAPI/libraries/aron/core/io/dataIO/writer/Writer.h @@ -20,71 +20,3 @@ #pragma once -// STD/STL -#include <memory> -#include <string> -#include <stack> - -// BaseClass -#include <RobotAPI/libraries/aron/core/io/dataIO/Writer.h> - -// ArmarX -#include <RobotAPI/libraries/aron/core/Exception.h> - - - -namespace armarx::aron::dataIO -{ - template <typename GeneratePtr, typename TokenPtr> - class TokenizedWriter; - - template <typename GeneratePtr, typename TokenPtr> - using TokenizedWriterPtr = std::shared_ptr<TokenizedWriter<GeneratePtr, TokenPtr>>; - - template <typename GeneratePtr, typename TokenPtr> - class TokenizedWriter : - virtual public Writer - { - public: - TokenizedWriter() = default; - - virtual bool writeKey(const std::string& k) override - { - TokenPtr token = stack.top(); - token->setCurrentKey(k); - return true; - } - - GeneratePtr getResult() const - { - assertLastRemovedTokenIsSet(); - assertStackIsEmpty(); - return lastRemovedToken->getElement(); - } - - protected: - void assertLastRemovedTokenIsSet() const - { - if (lastRemovedToken == nullptr) - { - throw error::AronException("ClassWriter", "assertLastRemovedTokenIsSet", "lastRemovedToken is NULL. Perhaps you never called a writeEnd* method?"); - } - if (lastRemovedToken->getElement() == nullptr) - { - throw error::AronException("ClassWriter", "assertLastRemovedTokenIsSet", "lastRemovedToken->getElement() is NULL."); - } - } - void assertStackIsEmpty() const - { - if (stack.size() != 0) - { - throw error::AronException("ClassWriter", "assertStackIsEmpty", "The Size of the stack is not 0. Perhaps you never called a writeEnd* method?"); - } - } - - protected: - bool wroteInitialStartContainer = false; - TokenPtr lastRemovedToken = nullptr; - std::stack<TokenPtr> stack; - }; -} diff --git a/source/RobotAPI/libraries/aron/core/io/dataIO/writer/WriterToken.h b/source/RobotAPI/libraries/aron/core/io/dataIO/writer/WriterToken.h index e5b84742bb6ddc365bd40ce3dcee6743ab93d7e2..f68311c85584db53e2401923e7eccbf6949dbbde 100644 --- a/source/RobotAPI/libraries/aron/core/io/dataIO/writer/WriterToken.h +++ b/source/RobotAPI/libraries/aron/core/io/dataIO/writer/WriterToken.h @@ -29,46 +29,69 @@ // ArmarX #include <RobotAPI/libraries/aron/core/Config.h> -#include <RobotAPI/libraries/aron/core/Descriptor.h> +#include <RobotAPI/libraries/aron/core/Exception.h> +#include <RobotAPI/libraries/aron/core/io/Data.h> namespace armarx::aron::dataIO { - template<typename ElementTypename, typename ElementAddTypename> - class WriterToken; + template<typename ElementTypename> + class WriterTokenInterface; - template<typename ElementTypename, typename ElementAddTypename> - using WriterTokenPtr = std::shared_ptr<WriterToken<ElementTypename, ElementAddTypename>>; + template<typename ElementTypename> + using WriterTokenPtr = std::shared_ptr<WriterTokenInterface<ElementTypename>>; - template<typename ElementTypename, typename ElementAddTypename> - class WriterToken : - virtual public io::WriterToken<data::Descriptor, ElementTypename, ElementAddTypename> + template<typename ElementTypename> + class WriterTokenInterface { public: - using PointerType = WriterToken<ElementTypename, ElementAddTypename>; + using PointerType = WriterTokenInterface<ElementTypename>; - public: - // constructor - WriterToken() = delete; - WriterToken(const data::Descriptor desc, const ElementTypename& n) : - io::WriterToken<data::Descriptor, ElementTypename, ElementAddTypename>(desc, n) - {} + // Interface + virtual void addElement(const ElementTypename&) = 0; - // public member functions - virtual void addElement(const ElementAddTypename&) override = 0; + // General implementation + void setCurrentKey(const std::string& s) + { + if (s.empty()) + { + throw error::AronException("AronWriterToken", "setCurrentKey", "The passed key is empty."); + } + currentKey = s; + } - virtual std::string toElementAccessor() const override + ElementTypename getElement() const { - switch (this->descriptor) + return element; + } + + data::Descriptor getDescriptor() const + { + return descriptor; + } + + std::string toAccessor() const + { + data::Descriptor desc = this->getDescriptor(); + switch (desc) { - case data::Descriptor::eDict: - return this->currentKey; - case data::Descriptor::eList: - return std::to_string(this->currentIndex); + case data::eDict: + return currentKey; + case data::eList: + return std::to_string(currentIndex); default: - throw error::DescriptorNotValidException("ClassWriterToken", "toElementAccessor", "Could not resove a type of a navigator. Allowed are only container and complex types due to performance.", this->descriptor); + throw error::DescriptorNotValidException("NavigatorWriterToken", "toElementAccessor", "Could not resove a type of a navigator. Allowed are only containers.", desc); } } - private: + protected: + // members + data::Descriptor descriptor = data::eUnknown; + ElementTypename element; + + // current index + unsigned int currentIndex = 0; + + // current key + std::string currentKey = ""; }; } diff --git a/source/RobotAPI/libraries/aron/core/io/dataIO/writer/navigator/NavigatorWriter.cpp b/source/RobotAPI/libraries/aron/core/io/dataIO/writer/navigator/NavigatorWriter.cpp index 25cb9335f9843315ba00631bfdc13182c0173361..adebb69a3a86875ac18e9854c96256c01458a9a3 100644 --- a/source/RobotAPI/libraries/aron/core/io/dataIO/writer/navigator/NavigatorWriter.cpp +++ b/source/RobotAPI/libraries/aron/core/io/dataIO/writer/navigator/NavigatorWriter.cpp @@ -31,79 +31,135 @@ namespace armarx::aron::dataIO::writer +{ + + Path NavigatorWriter::generatePath() + { + Path path; + if (!wroteInitialStartContainer) + { + wroteInitialStartContainer = true; + } + else + { + auto parent_token = stack.top(); + path = Path(parent_token->getElement()->getPath(), parent_token->toAccessor()); + } + return path; + } + + // Containers + void NavigatorWriter::writeStartDict() + { + Path path = generatePath(); + auto data = std::make_shared<datanavigator::DictNavigator>(path); + auto new_token = std::make_shared<NavigatorWriterToken>(data::eDict, data); + stack.push(new_token); + } + + void NavigatorWriter::writeEndDict() + { + lastRemovedToken = stack.top(); + stack.pop(); + + if (stack.size() > 0) { + NavigatorWriterTokenPtr prevToken = stack.top(); + prevToken->addElement(lastRemovedToken->getElement()); + } + } - Path NavigatorWriter::generatePath() - { - Path path; - if (!wroteInitialStartContainer) - { - wroteInitialStartContainer = true; - } - else - { - NavigatorWriterTokenPtr parent_token = stack.top(); - path = Path(parent_token->getElement()->getPath(), parent_token->toElementAccessor()); - } - return path; - } - - // Containers -#define RUN_ARON_MACRO(upperType, lowerType, capsType) \ - bool NavigatorWriter::writeStart##upperType() \ - { \ - Path path = generatePath(); \ - datanavigator::upperType##NavigatorPtr data = datanavigator::upperType##NavigatorPtr(new datanavigator::upperType##Navigator(path)); \ - NavigatorWriterTokenPtr new_token = NavigatorWriterTokenPtr(new NavigatorWriterToken(data->getDescriptor(), data)); \ - stack.push(new_token); \ - return true; \ - } \ - \ - bool NavigatorWriter::writeEnd##upperType() \ - { \ - lastRemovedToken = stack.top(); \ - stack.pop(); \ - \ - if (stack.size() > 0) \ - { \ - NavigatorWriterTokenPtr prevToken = stack.top(); \ - prevToken->addElement(lastRemovedToken->getElement()); \ - } \ - return true; \ + void NavigatorWriter::writeStartList() + { + Path path = generatePath(); + auto data = std::make_shared<datanavigator::ListNavigator>(path); + auto new_token = std::make_shared<NavigatorWriterToken>(data::eList, data); + stack.push(new_token); } - HANDLE_CONTAINER_DATA -#undef RUN_ARON_MACRO - - // Complex Types -#define RUN_ARON_MACRO(upperType, lowerType, capsType) \ - bool NavigatorWriter::write##upperType(const std::vector<int>& dims, const std::string& t, const unsigned char* data) \ - { \ - Path path = generatePath(); \ - NavigatorWriterTokenPtr token = stack.top(); \ - datanavigator::upperType##NavigatorPtr aron(new datanavigator::upperType##Navigator(path)); \ - aron->setDimensions(dims); \ - aron->setType(t); \ - aron->setData(std::accumulate(std::begin(dims), std::end(dims), 1, std::multiplies<int>()), data); \ - token->addElement(aron); \ - return true; \ + void NavigatorWriter::writeEndList() + { + lastRemovedToken = stack.top(); + stack.pop(); + + if (stack.size() > 0) + { + NavigatorWriterTokenPtr prevToken = stack.top(); + prevToken->addElement(lastRemovedToken->getElement()); + } } - HANDLE_COMPLEX_DATA -#undef RUN_ARON_MACRO + // Complex Types + void NavigatorWriter::writeNDArray(const std::vector<int>& dims, const std::string& t, const unsigned char* data) + { + Path path = generatePath(); + NavigatorWriterTokenPtr token = stack.top(); + datanavigator::NDArrayNavigatorPtr aron(new datanavigator::NDArrayNavigator(path)); + aron->setDimensions(dims); + aron->setType(t); + aron->setData(std::accumulate(std::begin(dims), std::end(dims), 1, std::multiplies<int>()), data); + token->addElement(aron); + } -#define RUN_ARON_MACRO(upperType, lowerType, capsType) \ - bool NavigatorWriter::writePrimitive(const lowerType& x) \ - { \ - Path path = generatePath(); \ - NavigatorWriterTokenPtr token = stack.top(); \ - datanavigator::upperType##NavigatorPtr aron(new datanavigator::upperType##Navigator(path)); \ - aron->setValue(x); \ - token->addElement(aron); \ - return true; \ + // Primitive Types + void NavigatorWriter::writePrimitive(const int x) + { + Path path = generatePath(); + NavigatorWriterTokenPtr token = stack.top(); + auto aron = std::make_shared<datanavigator::IntNavigator>(path); + aron->setValue(x); + token->addElement(aron); } - HANDLE_PRIMITIVE_DATA -#undef RUN_ARON_MACRO + void NavigatorWriter::writePrimitive(const long x) + { + Path path = generatePath(); + NavigatorWriterTokenPtr token = stack.top(); + auto aron = std::make_shared<datanavigator::LongNavigator>(path); + aron->setValue(x); + token->addElement(aron); + } + + void NavigatorWriter::writePrimitive(const float x) + { + Path path = generatePath(); + NavigatorWriterTokenPtr token = stack.top(); + auto aron = std::make_shared<datanavigator::FloatNavigator>(path); + aron->setValue(x); + token->addElement(aron); + } + + void NavigatorWriter::writePrimitive(const double x) + { + Path path = generatePath(); + NavigatorWriterTokenPtr token = stack.top(); + auto aron = std::make_shared<datanavigator::DoubleNavigator>(path); + aron->setValue(x); + token->addElement(aron); + } + + void NavigatorWriter::writePrimitive(const std::string& x) + { + Path path = generatePath(); + NavigatorWriterTokenPtr token = stack.top(); + auto aron = std::make_shared<datanavigator::StringNavigator>(path); + aron->setValue(x); + token->addElement(aron); + } + + void NavigatorWriter::writePrimitive(const bool x) + { + Path path = generatePath(); + NavigatorWriterTokenPtr token = stack.top(); + auto aron = std::make_shared<datanavigator::BoolNavigator>(path); + aron->setValue(x); + token->addElement(aron); + } + + void NavigatorWriter::writeKey(const std::string& k) + { + auto token = stack.top(); + token->setCurrentKey(k); + } } diff --git a/source/RobotAPI/libraries/aron/core/io/dataIO/writer/navigator/NavigatorWriter.h b/source/RobotAPI/libraries/aron/core/io/dataIO/writer/navigator/NavigatorWriter.h index 4c4d58cc921de0a2be862ba0c7b9e3ff90907a8e..3467d630a3301e4ed962f4529057d4be4089a4b5 100644 --- a/source/RobotAPI/libraries/aron/core/io/dataIO/writer/navigator/NavigatorWriter.h +++ b/source/RobotAPI/libraries/aron/core/io/dataIO/writer/navigator/NavigatorWriter.h @@ -25,7 +25,7 @@ #include <stack> // BaseClass -#include <RobotAPI/libraries/aron/core/io/dataIO/writer/Writer.h> +#include <RobotAPI/libraries/aron/core/io/dataIO/Writer.h> // ArmarX #include <RobotAPI/libraries/aron/core/Concepts.h> @@ -38,31 +38,38 @@ namespace armarx::aron::dataIO::writer typedef std::shared_ptr<NavigatorWriter> NavigatorWriterPtr; class NavigatorWriter : - virtual public TokenizedWriter<datanavigator::NavigatorPtr, NavigatorWriterTokenPtr> + virtual public WriterInterface { public: NavigatorWriter() = default; - #define RUN_ARON_MACRO(upperType, lowerType, capsType) \ - virtual bool writeStart##upperType() override; \ - virtual bool writeEnd##upperType() override; + virtual void writeStartDict() override; + virtual void writeEndDict() override; + virtual void writeStartList() override; + virtual void writeEndList() override; - HANDLE_CONTAINER_DATA - #undef RUN_ARON_MACRO + virtual void writeNDArray(const std::vector<int>&, const std::string&, const unsigned char*) override; - #define RUN_ARON_MACRO(upperType, lowerType, capsType) \ - virtual bool write##upperType(const std::vector<int>&, const std::string&, const unsigned char*) override; \ + virtual void writePrimitive(const int) override; + virtual void writePrimitive(const long) override; + virtual void writePrimitive(const float) override; + virtual void writePrimitive(const double) override; + virtual void writePrimitive(const std::string&) override; + virtual void writePrimitive(const bool) override; - HANDLE_COMPLEX_DATA - #undef RUN_ARON_MACRO + virtual void writeKey(const std::string&) override; - #define RUN_ARON_MACRO(upperType, lowerType, capsType) \ - virtual bool writePrimitive(const lowerType&) override; - - HANDLE_PRIMITIVE_DATA - #undef RUN_ARON_MACRO + datanavigator::NavigatorPtr getResult() const + { + return lastRemovedToken->getElement(); + } private: Path generatePath(); + + private: + bool wroteInitialStartContainer = false; + NavigatorWriterTokenPtr lastRemovedToken = nullptr; + std::stack<NavigatorWriterTokenPtr> stack; }; } diff --git a/source/RobotAPI/libraries/aron/core/io/dataIO/writer/navigator/NavigatorWriterToken.h b/source/RobotAPI/libraries/aron/core/io/dataIO/writer/navigator/NavigatorWriterToken.h index 89778188cfac0130de989463e11e3d2bf66401aa..8f10dd89e20a4ad0d606a6b2054d152679a76bee 100644 --- a/source/RobotAPI/libraries/aron/core/io/dataIO/writer/navigator/NavigatorWriterToken.h +++ b/source/RobotAPI/libraries/aron/core/io/dataIO/writer/navigator/NavigatorWriterToken.h @@ -33,49 +33,46 @@ namespace armarx::aron::dataIO::writer { -class NavigatorWriterToken; -typedef std::shared_ptr<NavigatorWriterToken> NavigatorWriterTokenPtr; + class NavigatorWriterToken; + typedef std::shared_ptr<NavigatorWriterToken> NavigatorWriterTokenPtr; -class NavigatorWriterToken : - virtual public WriterToken<datanavigator::NavigatorPtr, datanavigator::NavigatorPtr> -{ -public: - using PointerType = NavigatorWriterTokenPtr; - -public: - // constructor - NavigatorWriterToken() = delete; - NavigatorWriterToken(const data::Descriptor desc, const datanavigator::NavigatorPtr& d) : - io::WriterToken<data::Descriptor, datanavigator::NavigatorPtr, datanavigator::NavigatorPtr>(desc, d), - WriterToken<datanavigator::NavigatorPtr, datanavigator::NavigatorPtr>(desc, d) + class NavigatorWriterToken : + virtual public WriterTokenInterface<datanavigator::NavigatorPtr> { + public: + using PointerType = NavigatorWriterTokenPtr; - } + public: + // constructor + NavigatorWriterToken() = delete; + NavigatorWriterToken(const data::Descriptor desc, const datanavigator::NavigatorPtr& d) + { + descriptor = desc; + element = d; + } - // public member functions - virtual void addElement(const datanavigator::NavigatorPtr& n) override - { - auto desc = this->getDescriptor(); - switch (desc) + // public member functions + virtual void addElement(const datanavigator::NavigatorPtr& n) override { - case data::Descriptor::eDict: - { - datanavigator::DictNavigatorPtr casted = datanavigator::DictNavigator::DynamicCastAndCheck(element); - casted->addElement(currentKey, n); - break; - } - case data::Descriptor::eList: + auto desc = this->getDescriptor(); + switch (desc) { - datanavigator::ListNavigatorPtr casted = datanavigator::ListNavigator::DynamicCastAndCheck(element); - casted->addElement(n); - currentIndex++; - break; + case data::Descriptor::eDict: + { + datanavigator::DictNavigatorPtr casted = datanavigator::DictNavigator::DynamicCastAndCheck(element); + casted->addElement(currentKey, n); + break; + } + case data::Descriptor::eList: + { + datanavigator::ListNavigatorPtr casted = datanavigator::ListNavigator::DynamicCastAndCheck(element); + casted->addElement(n); + currentIndex++; + break; + } + default: + throw error::DescriptorNotValidException("NavigatorWriterToken", "addElement", "Could not resove a type of a navigator. Allowed are only containers. The path was: " + element->pathToString(), desc); } - default: - throw error::DescriptorNotValidException("NavigatorWriterToken", "addElement", "Could not resove a type of a navigator. Allowed are only containers. The path was: " + element->pathToString(), desc); } - } - -private: -}; + }; } diff --git a/source/RobotAPI/libraries/aron/core/io/dataIO/writer/nlohmannJSON/NlohmannJSONWriter.cpp b/source/RobotAPI/libraries/aron/core/io/dataIO/writer/nlohmannJSON/NlohmannJSONWriter.cpp index 1ec5b749a8c2d0f8cdbd8e1d8c4839614090b59c..e57ee04fd96febf4aeeb128385ac14dce87d9217 100644 --- a/source/RobotAPI/libraries/aron/core/io/dataIO/writer/nlohmannJSON/NlohmannJSONWriter.cpp +++ b/source/RobotAPI/libraries/aron/core/io/dataIO/writer/nlohmannJSON/NlohmannJSONWriter.cpp @@ -26,63 +26,108 @@ #include "NlohmannJSONWriter.h" namespace armarx::aron::dataIO::writer +{ + + // Containers + void NlohmannJSONWriter::writeStartDict() + { + nlohmann::json data; + auto new_token = std::make_shared<NlohmannJSONWriterToken>(data::eDict, data); + stack.push(new_token); + } + + void NlohmannJSONWriter::writeEndDict() + { + lastRemovedToken = stack.top(); + stack.pop(); + + if (stack.size() > 0) { + auto prevToken = stack.top(); + prevToken->addElement(lastRemovedToken->getElement()); + } + } - // Containers -#define RUN_ARON_MACRO(upperType, lowerType, capsType) \ - bool NlohmannJSONWriter::writeStart##upperType() \ - { \ - nlohmann::json data; \ - NlohmannJSONWriterTokenPtr new_token = NlohmannJSONWriterTokenPtr(new NlohmannJSONWriterToken(data::Descriptor::e##upperType, data)); \ - stack.push(new_token); \ - return true; \ - } \ - \ - bool NlohmannJSONWriter::writeEnd##upperType() \ - { \ - lastRemovedToken = stack.top(); \ - stack.pop(); \ - \ - if (stack.size() > 0) \ - { \ - NlohmannJSONWriterTokenPtr prevToken = stack.top(); \ - prevToken->addElement(lastRemovedToken->getElement()); \ - } \ - return true; \ + void NlohmannJSONWriter::writeStartList() + { + nlohmann::json data; + auto new_token = std::make_shared<NlohmannJSONWriterToken>(data::eList, data); + stack.push(new_token); } - HANDLE_CONTAINER_DATA -#undef RUN_ARON_MACRO - - // Complex Types -#define RUN_ARON_MACRO(upperType, lowerType, capsType) \ - bool NlohmannJSONWriter::write##upperType(const std::vector<int>& dims, const std::string& t, const unsigned char* data) \ - { \ - NlohmannJSONWriterTokenPtr token = stack.top(); \ - nlohmann::json j; \ - j[io::Data::READER_WRITER_NDARRAY_DIMENSIONS_SLUG] = dims; \ - j[io::Data::READER_WRITER_NDARRAY_TYPE_SLUG] = t; \ - int elements = std::accumulate(std::begin(dims), std::end(dims), 1, std::multiplies<int>()); \ - std::vector<unsigned char> d = std::vector<unsigned char>(elements); \ - memcpy(d.data(), data, elements); \ - j[io::Data::READER_WRITER_NDARRAY_DATA_SLUG] = d; \ - token->addElement(j); \ - return true; \ + void NlohmannJSONWriter::writeEndList() + { + lastRemovedToken = stack.top(); + stack.pop(); + + if (stack.size() > 0) + { + auto prevToken = stack.top(); + prevToken->addElement(lastRemovedToken->getElement()); + } } - HANDLE_COMPLEX_DATA -#undef RUN_ARON_MACRO + // Complex Types + void NlohmannJSONWriter::writeNDArray(const std::vector<int>& dims, const std::string& t, const unsigned char* data) \ + { + NlohmannJSONWriterTokenPtr token = stack.top(); + nlohmann::json j; + j[io::Data::READER_WRITER_NDARRAY_DIMENSIONS_SLUG] = dims; + j[io::Data::READER_WRITER_NDARRAY_TYPE_SLUG] = t; + int elements = std::accumulate(std::begin(dims), std::end(dims), 1, std::multiplies<int>()); + std::vector<unsigned char> d = std::vector<unsigned char>(elements); + memcpy(d.data(), data, elements); + j[io::Data::READER_WRITER_NDARRAY_DATA_SLUG] = d; + token->addElement(j); + } + + // Primitive + void NlohmannJSONWriter::writePrimitive(const int x) + { + auto token = stack.top(); + nlohmann::json j(x); + token->addElement(j); + } -#define RUN_ARON_MACRO(upperType, lowerType, capsType) \ - bool NlohmannJSONWriter::writePrimitive(const lowerType& x) \ - { \ - NlohmannJSONWriterTokenPtr token = stack.top(); \ - nlohmann::json j(x); \ - token->addElement(j); \ - return true; \ + void NlohmannJSONWriter::writePrimitive(const long x) + { + auto token = stack.top(); + nlohmann::json j(x); + token->addElement(j); } - HANDLE_PRIMITIVE_DATA -#undef RUN_ARON_MACRO + void NlohmannJSONWriter::writePrimitive(const float x) + { + auto token = stack.top(); + nlohmann::json j(x); + token->addElement(j); + } + + void NlohmannJSONWriter::writePrimitive(const double x) + { + auto token = stack.top(); + nlohmann::json j(x); + token->addElement(j); + } + + void NlohmannJSONWriter::writePrimitive(const std::string& x) + { + auto token = stack.top(); + nlohmann::json j(x); + token->addElement(j); + } + + void NlohmannJSONWriter::writePrimitive(const bool x) + { + auto token = stack.top(); + nlohmann::json j(x); + token->addElement(j); + } + + void NlohmannJSONWriter::writeKey(const std::string& k) + { + auto token = stack.top(); + token->setCurrentKey(k); + } } diff --git a/source/RobotAPI/libraries/aron/core/io/dataIO/writer/nlohmannJSON/NlohmannJSONWriter.h b/source/RobotAPI/libraries/aron/core/io/dataIO/writer/nlohmannJSON/NlohmannJSONWriter.h index 0407c6386261776f2bffa5ad89e41f18decc2cab..f36fa55d53127a2c79a6d0b9629718a24cb2070c 100644 --- a/source/RobotAPI/libraries/aron/core/io/dataIO/writer/nlohmannJSON/NlohmannJSONWriter.h +++ b/source/RobotAPI/libraries/aron/core/io/dataIO/writer/nlohmannJSON/NlohmannJSONWriter.h @@ -26,7 +26,7 @@ #include <sstream> // Base Class -#include <RobotAPI/libraries/aron/core/io/dataIO/writer/Writer.h> +#include <RobotAPI/libraries/aron/core/io/dataIO/Writer.h> // ArmarX #include <RobotAPI/libraries/aron/core/Concepts.h> @@ -34,34 +34,39 @@ namespace armarx::aron::dataIO::writer { - class NlohmannJSONWriter; - typedef std::shared_ptr<NlohmannJSONWriter> NlohmannJSONWriterPtr; + class NlohmannJSONWriter; + typedef std::shared_ptr<NlohmannJSONWriter> NlohmannJSONWriterPtr; - class NlohmannJSONWriter : - virtual public TokenizedWriter<nlohmann::json, NlohmannJSONWriterTokenPtr> - { - public: - NlohmannJSONWriter() = default; + class NlohmannJSONWriter : + virtual public WriterInterface + { + public: + NlohmannJSONWriter() = default; -#define RUN_ARON_MACRO(upperType, lowerType, capsType) \ - virtual bool writeStart##upperType() override; \ - virtual bool writeEnd##upperType() override; + virtual void writeStartDict() override; + virtual void writeEndDict() override; + virtual void writeStartList() override; + virtual void writeEndList() override; - HANDLE_CONTAINER_DATA -#undef RUN_ARON_MACRO + virtual void writeNDArray(const std::vector<int>&, const std::string&, const unsigned char*) override; -#define RUN_ARON_MACRO(upperType, lowerType, capsType) \ - virtual bool write##upperType(const std::vector<int>&, const std::string&, const unsigned char*) override; \ + virtual void writePrimitive(const int) override; + virtual void writePrimitive(const long) override; + virtual void writePrimitive(const float) override; + virtual void writePrimitive(const double) override; + virtual void writePrimitive(const std::string&) override; + virtual void writePrimitive(const bool) override; - HANDLE_COMPLEX_DATA -#undef RUN_ARON_MACRO + virtual void writeKey(const std::string&) override; -#define RUN_ARON_MACRO(upperType, lowerType, capsType) \ - virtual bool writePrimitive(const lowerType&) override; + nlohmann::json getResult() const + { + return lastRemovedToken->getElement(); + } - HANDLE_PRIMITIVE_DATA -#undef RUN_ARON_MACRO - - private: - }; + private: + bool wroteInitialStartContainer = false; + NlohmannJSONWriterTokenPtr lastRemovedToken = nullptr; + std::stack<NlohmannJSONWriterTokenPtr> stack; + }; } diff --git a/source/RobotAPI/libraries/aron/core/io/dataIO/writer/nlohmannJSON/NlohmannJSONWriterToken.h b/source/RobotAPI/libraries/aron/core/io/dataIO/writer/nlohmannJSON/NlohmannJSONWriterToken.h index 4cbb9c1623c8499e906a856af98a4956da6c365a..9f37b4993a86c7006cfe8ad98b40ea006c09ff53 100644 --- a/source/RobotAPI/libraries/aron/core/io/dataIO/writer/nlohmannJSON/NlohmannJSONWriterToken.h +++ b/source/RobotAPI/libraries/aron/core/io/dataIO/writer/nlohmannJSON/NlohmannJSONWriterToken.h @@ -39,7 +39,7 @@ namespace armarx::aron::dataIO::writer typedef std::shared_ptr<NlohmannJSONWriterToken> NlohmannJSONWriterTokenPtr; class NlohmannJSONWriterToken : - virtual public WriterToken<nlohmann::json, nlohmann::json> + virtual public WriterTokenInterface<nlohmann::json> { public: using PointerType = NlohmannJSONWriterTokenPtr; @@ -47,11 +47,10 @@ namespace armarx::aron::dataIO::writer public: // constructor NlohmannJSONWriterToken() = delete; - NlohmannJSONWriterToken(const data::Descriptor desc, const nlohmann::json& d) : - io::WriterToken<data::Descriptor, nlohmann::json, nlohmann::json>(desc, d), - WriterToken<nlohmann::json, nlohmann::json>(desc, d) + NlohmannJSONWriterToken(const data::Descriptor desc, const nlohmann::json& d) { - + descriptor = desc; + element = d; } // public member functions @@ -75,7 +74,5 @@ namespace armarx::aron::dataIO::writer throw error::DescriptorNotValidException("NlohmannJSONWriterToken", "addElement", "Could not resove a type of a token. Allowed are only containers.", desc); } } - - private: }; } diff --git a/source/RobotAPI/libraries/aron/core/io/typeIO/Reader.h b/source/RobotAPI/libraries/aron/core/io/typeIO/Reader.h index e66ea6053f5857c8b7ec0a8f92639ce13232f785..738b4c351b068bbfc54b363cf68901dbb6035837 100644 --- a/source/RobotAPI/libraries/aron/core/io/typeIO/Reader.h +++ b/source/RobotAPI/libraries/aron/core/io/typeIO/Reader.h @@ -1,4 +1,4 @@ -/* +/* * This file is part of ArmarX. * * ArmarX is free software; you can redistribute it and/or modify @@ -25,48 +25,51 @@ #include <string> // ArmarX -#include <ArmarXCore/core/exceptions/Exception.h> +#include <RobotAPI/interface/aron.h> +#include <RobotAPI/libraries/aron/core/Exception.h> #include <RobotAPI/libraries/aron/core/Config.h> -#include <RobotAPI/libraries/aron/core/io/typeIO/writer/Writer.h> namespace armarx::aron::typeIO { - class Reader; - typedef std::shared_ptr<Reader> ReaderPtr; + class ReaderInterface; + typedef std::shared_ptr<ReaderInterface> ReaderInterfacePtr; - class Reader - { - public: - Reader() = default; + class ReaderInterface + { + public: + virtual std::tuple<std::string, int> readStartObject() = 0; + virtual bool readEndObject() = 0; + virtual int readStartList() = 0; + virtual bool readEndList() = 0; + virtual int readStartDict() = 0; + virtual bool readEndDict() = 0; + virtual int readStartTuple() = 0; + virtual bool readEndTuple() = 0; + virtual int readStartPair() = 0; + virtual bool readEndPair() = 0; -#define RUN_ARON_MACRO(upperType, lowerType, capsType) \ - virtual int readStart##upperType() = 0; \ - virtual bool readEnd##upperType() = 0; + virtual std::tuple<std::vector<int>, std::string> readEigenMatrix() = 0; + virtual std::string readEigenQuaternion() = 0; + virtual std::tuple<unsigned int, unsigned int, std::string> readIVTCByteImage() = 0; + virtual std::tuple<std::vector<int>, std::string> readOpenCVMat() = 0; + virtual std::tuple<unsigned int, unsigned int, std::string> readPCLPointCloud() = 0; + virtual void readPosition() = 0; + virtual void readOrientation() = 0; + virtual void readPose() = 0; - HANDLE_CONTAINER_TYPES -#undef RUN_ARON_MACRO + virtual void readInt() = 0; + virtual void readLong() = 0; + virtual void readFloat() = 0; + virtual void readDouble() = 0; + virtual void readString() = 0; + virtual void readBool() = 0; + virtual void readTime() = 0; - virtual std::tuple<std::vector<int>, std::string> readEigenMatrix() = 0; - virtual std::string readEigenQuaternion() = 0; - virtual std::tuple<unsigned int, unsigned int, std::string> readIVTCByteImage() = 0; - virtual std::tuple<std::vector<int>, std::string> readOpenCVMat() = 0; - virtual std::tuple<unsigned int, unsigned int, std::string> readPCLPointCloud() = 0; - virtual void readPosition() = 0; - virtual void readOrientation() = 0; - virtual void readPose() = 0; + virtual std::string readKey() = 0; + virtual void loadMember(const std::string&) = 0; -#define RUN_ARON_MACRO(upperType, lowerType, capsType) \ - virtual void read##upperType() = 0; - - HANDLE_PRIMITIVE_TYPES -#undef RUN_ARON_MACRO - - virtual std::string readKey() = 0; - virtual bool readKey(const std::string&) = 0; - virtual std::string readObjectName() = 0; - - // Helper functions - virtual type::Descriptor getTypeOfNextAron() const = 0; - }; + // Helper functions + virtual type::Descriptor getTypeOfNext() const = 0; + }; } diff --git a/source/RobotAPI/libraries/aron/core/io/typeIO/Writer.h b/source/RobotAPI/libraries/aron/core/io/typeIO/Writer.h index 7de05543ad3650590e74625fc57bb78194fd4f3c..552b5fc1a9427357ee9b971115fc49dda89d3745 100644 --- a/source/RobotAPI/libraries/aron/core/io/typeIO/Writer.h +++ b/source/RobotAPI/libraries/aron/core/io/typeIO/Writer.h @@ -33,38 +33,40 @@ namespace armarx::aron::typeIO { - class Writer; - typedef std::shared_ptr<Writer> TypeWriterPtr; + class WriterInterface; + typedef std::shared_ptr<WriterInterface> WriterInterfacePtr; - class Writer - { - public: - Writer() = default; + class WriterInterface + { + public: + virtual void writeStartObject(const std::string&) = 0; + virtual void writeEndObject() = 0; + virtual void writeStartList() = 0; + virtual void writeEndList() = 0; + virtual void writeStartDict() = 0; + virtual void writeEndDict() = 0; + virtual void writeStartTuple() = 0; + virtual void writeEndTuple() = 0; + virtual void writeStartPair() = 0; + virtual void writeEndPair() = 0; -#define RUN_ARON_MACRO(upperType, lowerType, capsType) \ - virtual bool writeStart##upperType() = 0; \ - virtual bool writeEnd##upperType() = 0; + virtual void writeEigenMatrix(const std::vector<int>&, const std::string&) = 0; + virtual void writeEigenQuaternion(const std::string&) = 0; + virtual void writeIVTCByteImage(unsigned int w, unsigned int h, const std::string&) = 0; + virtual void writeOpenCVMat(const std::vector<int>&, const std::string&) = 0; + virtual void writePCLPointCloud(unsigned int w, unsigned int h, const std::string&) = 0; + virtual void writePosition() = 0; + virtual void writeOrientation() = 0; + virtual void writePose() = 0; - HANDLE_CONTAINER_TYPES -#undef RUN_ARON_MACRO + virtual void writeInt() = 0; + virtual void writeLong() = 0; + virtual void writeFloat() = 0; + virtual void writeDouble() = 0; + virtual void writeString() = 0; + virtual void writeBool() = 0; + virtual void writeTime() = 0; - virtual bool writeEigenMatrix(const std::vector<int>&, const std::string&) = 0; - virtual bool writeEigenQuaternion(const std::string&) = 0; - virtual bool writeIVTCByteImage(unsigned int w, unsigned int h, const std::string&) = 0; - virtual bool writeOpenCVMat(const std::vector<int>&, const std::string&) = 0; - virtual bool writePCLPointCloud(unsigned int w, unsigned int h, const std::string&) = 0; - virtual bool writePosition() = 0; - virtual bool writeOrientation() = 0; - virtual bool writePose() = 0; - -#define RUN_ARON_MACRO(upperType, lowerType, capsType) \ - virtual bool write##upperType() = 0; - - HANDLE_PRIMITIVE_TYPES -#undef RUN_ARON_MACRO - - //virtual std::string readKey() = 0; - virtual bool writeKey(const std::string&) = 0; - virtual bool writeObjectName(const std::string&) = 0; - }; + virtual void writeKey(const std::string&) = 0; + }; } diff --git a/source/RobotAPI/libraries/aron/core/io/typeIO/converter/Converter.cpp b/source/RobotAPI/libraries/aron/core/io/typeIO/converter/Converter.cpp index 8bcde495e4b9af364cc21e297b423ceb2796cef9..b9aca9ffceea3bbae3fbd76794112bdca58379d8 100644 --- a/source/RobotAPI/libraries/aron/core/io/typeIO/converter/Converter.cpp +++ b/source/RobotAPI/libraries/aron/core/io/typeIO/converter/Converter.cpp @@ -26,131 +26,158 @@ #include "Converter.h" namespace armarx::aron::typeIO +{ + void Converter::ConvertFromReader(ReaderInterface& reader, WriterInterface& writer) + { + type::Descriptor desc = reader.getTypeOfNext(); + switch (desc) { - void Converter::ConvertFromReader(Reader& reader, Writer& writer) + case type::eObject: { - type::Descriptor desc = reader.getTypeOfNextAron(); - switch (desc) - { - case type::eObject: - { - const int elements = reader.readStartObject(); - const std::string name = reader.readObjectName(); - - writer.writeStartObject(); - writer.writeObjectName(name); + const auto [name, elements] = reader.readStartObject(); + writer.writeStartObject(name); - for (int i = 0; i < elements; ++i) - { - std::string key = reader.readKey(); - writer.writeKey(key); - Converter::ConvertFromReader(reader, writer); - } - - writer.writeEndObject(); - reader.readEndObject(); - break; - } - case type::eDict: + for (int i = 0; i < elements; ++i) { - reader.readStartDict(); - writer.writeStartDict(); - + std::string key = reader.readKey(); + writer.writeKey(key); Converter::ConvertFromReader(reader, writer); - - writer.writeEndDict(); - reader.readEndDict(); - break; } - case type::eTuple: - { - int elements = reader.readStartTuple(); - writer.writeStartTuple(); - for (int i = 0; i < elements; ++i) - { - Converter::ConvertFromReader(reader, writer); - } + writer.writeEndObject(); + reader.readEndObject(); + break; + } + case type::eDict: + { + reader.readStartDict(); + writer.writeStartDict(); - writer.writeEndTuple(); - reader.readEndTuple(); - break; - } - case type::eList: - { - reader.readStartList(); - writer.writeStartList(); + Converter::ConvertFromReader(reader, writer); - Converter::ConvertFromReader(reader, writer); + writer.writeEndDict(); + reader.readEndDict(); + break; + } + case type::eTuple: + { + int elements = reader.readStartTuple(); + writer.writeStartTuple(); - writer.writeEndList(); - reader.readEndList(); - break; - } - case type::eEigenMatrix: - { - auto x = reader.readEigenMatrix(); - writer.writeEigenMatrix(std::get<0>(x), std::get<1>(x)); - break; - } - case type::eEigenQuaternion: - { - auto x = reader.readEigenQuaternion(); - writer.writeEigenQuaternion(x); - break; - } - case type::eIVTCByteImage: - { - auto x = reader.readIVTCByteImage(); - writer.writeIVTCByteImage(std::get<0>(x), std::get<1>(x), std::get<2>(x)); - break; - } - case type::eOpenCVMat: - { - auto x = reader.readOpenCVMat(); - writer.writeOpenCVMat(std::get<0>(x), std::get<1>(x)); - break; - } - case type::ePCLPointCloud: - { - auto x = reader.readPCLPointCloud(); - writer.writePCLPointCloud(std::get<0>(x), std::get<1>(x), std::get<2>(x)); - break; - } - case type::ePosition: + for (int i = 0; i < elements; ++i) { - reader.readPosition(); - writer.writePosition(); - break; - } - case type::eOrientation: - { - reader.readOrientation(); - writer.writeOrientation(); - break; - } - case type::ePose: - { - reader.readPose(); - writer.writePose(); - break; + Converter::ConvertFromReader(reader, writer); } -#define RUN_ARON_MACRO(upperType, lowerType, capsType) \ -case type::e##upperType: \ -{ \ - reader.read##upperType(); \ - writer.write##upperType(); \ - break; \ -} + writer.writeEndTuple(); + reader.readEndTuple(); + break; + } + case type::eList: + { + reader.readStartList(); + writer.writeStartList(); - HANDLE_PRIMITIVE_TYPES -#undef RUN_ARON_MACRO + Converter::ConvertFromReader(reader, writer); - default: - { - throw error::DescriptorNotValidException("LegacyAronTypeReader", "SetupReaderAndGetResult", "Type-Type could not be resolved", desc); - } - } + writer.writeEndList(); + reader.readEndList(); + break; + } + case type::eEigenMatrix: + { + auto x = reader.readEigenMatrix(); + writer.writeEigenMatrix(std::get<0>(x), std::get<1>(x)); + break; + } + case type::eEigenQuaternion: + { + auto x = reader.readEigenQuaternion(); + writer.writeEigenQuaternion(x); + break; + } + case type::eIVTCByteImage: + { + auto x = reader.readIVTCByteImage(); + writer.writeIVTCByteImage(std::get<0>(x), std::get<1>(x), std::get<2>(x)); + break; + } + case type::eOpenCVMat: + { + auto x = reader.readOpenCVMat(); + writer.writeOpenCVMat(std::get<0>(x), std::get<1>(x)); + break; + } + case type::ePCLPointCloud: + { + auto x = reader.readPCLPointCloud(); + writer.writePCLPointCloud(std::get<0>(x), std::get<1>(x), std::get<2>(x)); + break; + } + case type::ePosition: + { + reader.readPosition(); + writer.writePosition(); + break; + } + case type::eOrientation: + { + reader.readOrientation(); + writer.writeOrientation(); + break; + } + case type::ePose: + { + reader.readPose(); + writer.writePose(); + break; + } + case type::eInt: + { + reader.readInt(); + writer.writeInt(); + break; + } + case type::eLong: + { + reader.readLong(); + writer.writeLong(); + break; + } + case type::eFloat: + { + reader.readFloat(); + writer.writeFloat(); + break; + } + case type::eDouble: + { + reader.readDouble(); + writer.writeDouble(); + break; + } + case type::eString: + { + reader.readString(); + writer.writeString(); + break; + } + case type::eBool: + { + reader.readBool(); + writer.writeBool(); + break; + } + case type::eTime: + { + reader.readTime(); + writer.writeTime(); + break; + } + default: + { + throw error::DescriptorNotValidException("LegacyAronTypeReader", "ConvertFromReader", "Type could not be resolved", desc); } + } + } } diff --git a/source/RobotAPI/libraries/aron/core/io/typeIO/converter/Converter.h b/source/RobotAPI/libraries/aron/core/io/typeIO/converter/Converter.h index 0cf154c351fb908fee17fbb1b6522310fe7d6c77..f1c59c61894ff07dfdea24d1f5682620392ebf35 100644 --- a/source/RobotAPI/libraries/aron/core/io/typeIO/converter/Converter.h +++ b/source/RobotAPI/libraries/aron/core/io/typeIO/converter/Converter.h @@ -25,12 +25,13 @@ #include <string> // BaseClass -#include <RobotAPI/libraries/aron/core/io/typeIO/Reader.h> + // ArmarX #include <RobotAPI/interface/aron.h> #include <RobotAPI/libraries/aron/core/navigator/type/Navigator.h> -#include <RobotAPI/libraries/aron/core/io/typeIO/writer/navigator/NavigatorWriter.h> +#include <RobotAPI/libraries/aron/core/io/typeIO/Reader.h> +#include <RobotAPI/libraries/aron/core/io/typeIO/Writer.h> namespace armarx::aron::typeIO @@ -44,7 +45,7 @@ namespace armarx::aron::typeIO Converter() = delete; public: - static void ConvertFromReader(Reader&, Writer&); + static void ConvertFromReader(ReaderInterface&, WriterInterface&); public: }; diff --git a/source/RobotAPI/libraries/aron/core/io/typeIO/reader/Reader.h b/source/RobotAPI/libraries/aron/core/io/typeIO/reader/Reader.h index 34864822acf7ca03853d3615fed96913de13c7ec..a6a42098d8a198c7aa1ace6751cce3e7130c4cfa 100644 --- a/source/RobotAPI/libraries/aron/core/io/typeIO/reader/Reader.h +++ b/source/RobotAPI/libraries/aron/core/io/typeIO/reader/Reader.h @@ -20,72 +20,3 @@ #pragma once -// STD/STL -#include <memory> -#include <string> - -// BaseClass -#include <RobotAPI/libraries/aron/core/io/typeIO/Reader.h> - -// ArmarX -#include <RobotAPI/libraries/aron/core/Config.h> -#include <RobotAPI/libraries/aron/core/Descriptor.h> - -namespace armarx::aron::typeIO - { - template <typename InputTypename, typename TokenPtrTypename> - class TokenizedReader; - - template <typename InputTypename, typename TokenPtrTypename> - using TokenizedReaderPtr = std::shared_ptr<TokenizedReader<InputTypename, TokenPtrTypename>> ; - - template <typename InputTypename, typename TokenPtrTypename> - class TokenizedReader : - public Reader - { - public: - TokenizedReader() = delete; - TokenizedReader(const InputTypename& input) : - input(input) - { - } - - // ReadKey - std::string readKey() override - { - TokenPtrTypename token = stack.top(); - std::string k = token->resolveCurrentKey(); - return k; - } - - bool readKey(const std::string& k) override - { - TokenPtrTypename token = stack.top(); - token->setCurrentKey(k); - return true; - } - - std::string readObjectName() override - { - TokenPtrTypename token = stack.top(); - return token->getObjectName(); - } - - virtual type::Descriptor getTypeOfNextAron() const override - { - if (stack.empty()) - { - // completely unknown. We assume a object on the top level - return type::Descriptor::eObject; - } - - TokenPtrTypename lastToken = stack.top(); - return lastToken->getTypeOfNextElement(); - } - - protected: - InputTypename input; - bool readInitialStart = false; - std::stack<TokenPtrTypename> stack; - }; -} diff --git a/source/RobotAPI/libraries/aron/core/io/typeIO/reader/ReaderToken.h b/source/RobotAPI/libraries/aron/core/io/typeIO/reader/ReaderToken.h index aec9e3f5b5607986024525cfb1af8931b0acf557..d0bd996f75fb869bc1a2b2fc879a5e505b1931bd 100644 --- a/source/RobotAPI/libraries/aron/core/io/typeIO/reader/ReaderToken.h +++ b/source/RobotAPI/libraries/aron/core/io/typeIO/reader/ReaderToken.h @@ -23,50 +23,119 @@ // STD/STL #include <memory> #include <string> +#include <vector> // Base Class #include <RobotAPI/libraries/aron/core/io/ReaderToken.h> // ArmarX #include <RobotAPI/libraries/aron/core/Config.h> -#include <RobotAPI/libraries/aron/core/Descriptor.h> +#include <RobotAPI/libraries/aron/core/Exception.h> +#include <RobotAPI/libraries/aron/core/io/Data.h> +namespace armarx::aron::typeIO +{ + template<typename ElementTypename> + class ReaderTokenInterface; + template<typename ElementTypename> + using ReaderTokenInterfacePtr = std::shared_ptr<ReaderTokenInterface<ElementTypename>>; -namespace armarx::aron::typeIO - { - template<typename ElementReturnPtrTypename, typename ElementAddTypename> - class ReaderToken; + template<typename ElementTypename> + class ReaderTokenInterface + { + public: + using PointerType = ReaderTokenInterfacePtr<ElementTypename>; - template<typename ElementReturnPtrTypename, typename ElementAddTypename> - using ReaderTokenPtr = std::shared_ptr<ReaderToken<ElementReturnPtrTypename, ElementAddTypename>>; + public: + // Interface + virtual type::Descriptor getTypeOfNext() const = 0; + virtual ElementTypename getNextElement() const = 0; - template<typename ElementReturnPtrTypename, typename ElementAddTypename> - class ReaderToken : - virtual public io::ReaderToken<type::Descriptor, ElementReturnPtrTypename, ElementAddTypename> + // General implementation + std::string getElementName() const + { + switch (descriptor) { - public: - using PointerType = ReaderTokenPtr<ElementReturnPtrTypename, ElementAddTypename>; + case type::eObject: + case type::eIntEnum: + { + return elementName; + } + default: + throw error::DescriptorNotValidException("ReaderTokenInterface", "getElementName", "Could not get object nme of a non-object or non-enum token", descriptor); + } + } - public: - // constructors - ReaderToken() = delete; - ReaderToken(const type::Descriptor desc, const ElementAddTypename& type) : - io::ReaderToken<type::Descriptor, ElementReturnPtrTypename, ElementAddTypename>(desc, type) - { } + type::Descriptor getDescriptor() const + { + return descriptor; + } + + unsigned int getElementChildrenSize() const + { + return childrenSize; + } + + bool finishedElement() const + { + return currentIndex >= getElementChildrenSize(); + } + + std::string getCurrentKey() const + { + assertIndexInBounds(); - bool currentIsEligableForResolvingKey() const override + // ugly workaround + if (this->currentKey == "") // probably in a dict where the caller does not know which keys are there + { + if (this->allMemberNames.size() == 0) { - if (this->descriptor == type::Descriptor::eObject) - { - return true; - } - return false; + throw error::AronException("typeIO::ReaderTokenInterface", "getCurrentKey", "The currentKey is not set and the list of all keys is empty!"); } + return this->allMemberNames[this->currentIndex]; + } + return this->currentKey; + } + + void setCurrentKey(const std::string& s) + { + currentKey = s; + } + + void assertType(type::Descriptor t) const + { + if (getDescriptor() != t) + { + throw error::DescriptorNotValidException("typeIO::ReaderTokenInterface", "assertType", "The type was not equal.", t); + } + } + + void assertIndexInBounds() const + { + if (this->currentIndex >= getElementChildrenSize()) + { + throw error::SizeNotValidException("typeIO::ReaderTokenInterface", "assertIndexInBounds", "Index out of bounds.", this->currentIndex, getElementChildrenSize()); + } + } + + ElementTypename getNextElementAndIncreaseCnt() + { + ElementTypename next = getNextElement(); + this->currentIndex++; + return next; + } + + protected: + // members + type::Descriptor descriptor = type::eUnknown; + ElementTypename element; + std::string elementName = ""; - virtual std::string getObjectName() const = 0; - virtual type::Descriptor getTypeOfNextElement() const = 0; + unsigned int childrenSize = 0; + unsigned int currentIndex = 0; - private: - }; + std::string currentKey = ""; + std::vector<std::string> allMemberNames = {}; + }; } diff --git a/source/RobotAPI/libraries/aron/core/io/typeIO/reader/navigator/NavigatorReader.cpp b/source/RobotAPI/libraries/aron/core/io/typeIO/reader/navigator/NavigatorReader.cpp index a2cdd6d27465e4e00c75b72d9f022af52147c249..19a19936f8cc8e01f494c00105735a6556c1ef14 100644 --- a/source/RobotAPI/libraries/aron/core/io/typeIO/reader/navigator/NavigatorReader.cpp +++ b/source/RobotAPI/libraries/aron/core/io/typeIO/reader/navigator/NavigatorReader.cpp @@ -33,137 +33,250 @@ namespace armarx::aron::typeIO::reader - { - NavigatorReader::NavigatorReader(const typenavigator::NavigatorPtr& n) : - TokenizedReader<typenavigator::NavigatorPtr, NavigatorReaderTokenPtr>(n) - { - } - - NavigatorReader::NavigatorReader(const type::AronTypePtr& n) : - TokenizedReader<typenavigator::NavigatorPtr, NavigatorReaderTokenPtr>(typenavigator::Navigator::FromAronType(n)) - { - } - - typenavigator::NavigatorPtr NavigatorReader::getCurrentAndGoToNext() - { - if (!readInitialStart) - { - readInitialStart = true; - return input; - } - NavigatorReaderTokenPtr lastToken = stack.top(); - return lastToken->getCurrentElementAndIncreaseCnt(); - } - - typenavigator::NavigatorPtr NavigatorReader::getCurrent() - { - if (!readInitialStart) - { - readInitialStart = true; - return input; - } - NavigatorReaderTokenPtr lastToken = stack.top(); - return lastToken->getCurrentElement(); - } - -#define RUN_ARON_MACRO(upperType, lowerType, capsType) \ - int NavigatorReader::readStart##upperType() \ - { \ - typenavigator::NavigatorPtr current_nav = getCurrentAndGoToNext(); \ - auto desc = current_nav->getDescriptor(); \ - if (desc != type::Descriptor::e##upperType) \ - { \ - throw error::DescriptorNotValidException("NavigatorReader", "readStart" + std::string(#upperType), "A token in the stack has the wrong type. Expected " + std::string(#upperType), desc); \ - return false; \ - } \ - typenavigator::upperType##NavigatorPtr current_nav_casted = typenavigator::upperType##Navigator::DynamicCast(current_nav); \ - NavigatorReaderTokenPtr newToken = NavigatorReaderTokenPtr(new NavigatorReaderToken(current_nav->getDescriptor(), current_nav_casted)); \ - stack.push(newToken); \ - return newToken->getChildrenSize(); \ - } \ - \ - bool NavigatorReader::readEnd##upperType() \ - { \ - NavigatorReaderTokenPtr token = stack.top(); \ - auto desc = token->getDescriptor(); \ - if (desc != type::Descriptor::e##upperType) \ - { \ - throw error::DescriptorNotValidException("NavigatorReader", "readEnd" + std::string(#upperType), "A token in the stack has the wrong type. Expected " + std::string(#upperType), desc); \ - return false; \ - } \ - \ - if (token->checkedAllChildren()) \ - { \ - stack.pop(); \ - return true; \ - } \ - return false; \ - } - - HANDLE_CONTAINER_TYPES -#undef RUN_ARON_MACRO - -std::tuple<std::vector<int>, std::string> NavigatorReader::readEigenMatrix() { - typenavigator::NavigatorPtr nav = getCurrentAndGoToNext(); - typenavigator::EigenMatrixNavigatorPtr casted = typenavigator::EigenMatrixNavigator::DynamicCastAndCheck(nav); - return std::make_tuple(casted->getDimensions(), casted->getTypename()); -} + NavigatorReader::NavigatorReader(const typenavigator::NavigatorPtr& n) : + input(n) + { + } -std::string NavigatorReader::readEigenQuaternion() -{ - typenavigator::NavigatorPtr nav = getCurrentAndGoToNext(); - typenavigator::EigenMatrixNavigatorPtr casted = typenavigator::EigenMatrixNavigator::DynamicCastAndCheck(nav); - return casted->getTypename(); -} + NavigatorReader::NavigatorReader(const type::AronTypePtr& n) : + input(typenavigator::Navigator::FromAronType(n)) + { + } -std::tuple<unsigned int, unsigned int, std::string> NavigatorReader::readIVTCByteImage() -{ - typenavigator::NavigatorPtr nav = getCurrentAndGoToNext(); - typenavigator::IVTCByteImageNavigatorPtr casted = typenavigator::IVTCByteImageNavigator::DynamicCastAndCheck(nav); - return make_tuple(casted->getWidth(), casted->getHeight(), casted->getTypename()); -} + typenavigator::NavigatorPtr NavigatorReader::getNextAndIncrease() + { + if (!readInitialStart) + { + readInitialStart = true; + return input; + } + NavigatorReaderTokenPtr lastToken = stack.top(); + return lastToken->getNextElementAndIncreaseCnt(); + } -std::tuple<std::vector<int>, std::string> NavigatorReader::readOpenCVMat() -{ - typenavigator::NavigatorPtr nav = getCurrentAndGoToNext(); - typenavigator::OpenCVMatNavigatorPtr casted = typenavigator::OpenCVMatNavigator::DynamicCastAndCheck(nav); - return make_tuple(casted->getDimensions(), casted->getTypename()); -} + std::tuple<std::string, int> NavigatorReader::readStartObject() + { + auto current_nav = getNextAndIncrease(); + auto current_nav_casted = typenavigator::ObjectNavigator::DynamicCastAndCheck(current_nav); + auto newToken = std::make_shared<NavigatorReaderToken>(type::eObject, current_nav_casted); + stack.push(newToken); + return {newToken->getElementName(), newToken->getElementChildrenSize()}; + } -std::tuple<unsigned int, unsigned int, std::string> NavigatorReader::readPCLPointCloud() -{ - typenavigator::NavigatorPtr nav = getCurrentAndGoToNext(); - typenavigator::PCLPointCloudNavigatorPtr casted = typenavigator::PCLPointCloudNavigator::DynamicCastAndCheck(nav); - return make_tuple(casted->getWidth(), casted->getHeight(), casted->getTypename()); -} + bool NavigatorReader::readEndObject() + { + auto token = stack.top(); + token->assertType(type::eObject); -void NavigatorReader::readPosition() -{ - getCurrentAndGoToNext(); - return; -} + if (token->finishedElement()) + { + stack.pop(); + return true; + } + return false; + } -void NavigatorReader::readOrientation() -{ - getCurrentAndGoToNext(); - return; -} + int NavigatorReader::readStartDict() + { + auto current_nav = getNextAndIncrease(); + auto current_nav_casted = typenavigator::DictNavigator::DynamicCastAndCheck(current_nav); + auto newToken = std::make_shared<NavigatorReaderToken>(type::eDict, current_nav_casted); + stack.push(newToken); + return newToken->getElementChildrenSize(); + } -void NavigatorReader::readPose() -{ - getCurrentAndGoToNext(); - return; -} + bool NavigatorReader::readEndDict() + { + auto token = stack.top(); + token->assertType(type::eDict); + + if (token->finishedElement()) + { + stack.pop(); + return true; + } + return false; + } + + int NavigatorReader::readStartList() + { + auto current_nav = getNextAndIncrease(); + auto current_nav_casted = typenavigator::ListNavigator::DynamicCastAndCheck(current_nav); + auto newToken = std::make_shared<NavigatorReaderToken>(type::eList, current_nav_casted); + stack.push(newToken); + return newToken->getElementChildrenSize(); + } + + bool NavigatorReader::readEndList() + { + auto token = stack.top(); + token->assertType(type::eList); + + if (token->finishedElement()) + { + stack.pop(); + return true; + } + return false; + } + + int NavigatorReader::readStartTuple() + { + auto current_nav = getNextAndIncrease(); + auto current_nav_casted = typenavigator::TupleNavigator::DynamicCastAndCheck(current_nav); + auto newToken = std::make_shared<NavigatorReaderToken>(type::eTuple, current_nav_casted); + stack.push(newToken); + return newToken->getElementChildrenSize(); + } + + bool NavigatorReader::readEndTuple() + { + auto token = stack.top(); + token->assertType(type::eTuple); + + if (token->finishedElement()) + { + stack.pop(); + return true; + } + return false; + } - // Read primitives -#define RUN_ARON_MACRO(upperType, lowerType, capsType) \ - void NavigatorReader::read##upperType() \ - { \ - typenavigator::NavigatorPtr nav = getCurrentAndGoToNext(); \ - typenavigator::upperType##NavigatorPtr casted = typenavigator::upperType##Navigator::DynamicCastAndCheck(nav); \ + int NavigatorReader::readStartPair() + { + auto current_nav = getNextAndIncrease(); + auto current_nav_casted = typenavigator::PairNavigator::DynamicCastAndCheck(current_nav); + auto newToken = std::make_shared<NavigatorReaderToken>(type::ePair, current_nav_casted); + stack.push(newToken); + return newToken->getElementChildrenSize(); } - HANDLE_PRIMITIVE_TYPES -#undef RUN_ARON_MACRO + bool NavigatorReader::readEndPair() + { + auto token = stack.top(); + token->assertType(type::ePair); + + if (token->finishedElement()) + { + stack.pop(); + return true; + } + return false; + } + + std::tuple<std::vector<int>, std::string> NavigatorReader::readEigenMatrix() + { + auto nav = getNextAndIncrease(); + auto casted = typenavigator::EigenMatrixNavigator::DynamicCastAndCheck(nav); + return std::make_tuple(casted->getDimensions(), casted->getTypename()); + } + + std::string NavigatorReader::readEigenQuaternion() + { + auto nav = getNextAndIncrease(); + auto casted = typenavigator::EigenMatrixNavigator::DynamicCastAndCheck(nav); + return casted->getTypename(); + } + + std::tuple<unsigned int, unsigned int, std::string> NavigatorReader::readIVTCByteImage() + { + auto nav = getNextAndIncrease(); + auto casted = typenavigator::IVTCByteImageNavigator::DynamicCastAndCheck(nav); + return make_tuple(casted->getWidth(), casted->getHeight(), casted->getTypename()); + } + + std::tuple<std::vector<int>, std::string> NavigatorReader::readOpenCVMat() + { + auto nav = getNextAndIncrease(); + auto casted = typenavigator::OpenCVMatNavigator::DynamicCastAndCheck(nav); + return make_tuple(casted->getDimensions(), casted->getTypename()); + } + + std::tuple<unsigned int, unsigned int, std::string> NavigatorReader::readPCLPointCloud() + { + auto nav = getNextAndIncrease(); + auto casted = typenavigator::PCLPointCloudNavigator::DynamicCastAndCheck(nav); + return make_tuple(casted->getWidth(), casted->getHeight(), casted->getTypename()); + } + + void NavigatorReader::readPosition() + { + auto nav = getNextAndIncrease(); + typenavigator::PositionNavigator::DynamicCastAndCheck(nav); + } + + void NavigatorReader::readOrientation() + { + auto nav = getNextAndIncrease(); + typenavigator::OrientationNavigator::DynamicCastAndCheck(nav); + } + + void NavigatorReader::readPose() + { + auto nav = getNextAndIncrease(); + typenavigator::PoseNavigator::DynamicCastAndCheck(nav); + } + + // Read primitives + void NavigatorReader::readInt() + { + auto nav = getNextAndIncrease(); + typenavigator::IntNavigator::DynamicCastAndCheck(nav); + } + + void NavigatorReader::readFloat() + { + auto nav = getNextAndIncrease(); + typenavigator::FloatNavigator::DynamicCastAndCheck(nav); + } + + void NavigatorReader::readLong() + { + auto nav = getNextAndIncrease(); + typenavigator::LongNavigator::DynamicCastAndCheck(nav); + } + + void NavigatorReader::readDouble() + { + auto nav = getNextAndIncrease(); + typenavigator::DoubleNavigator::DynamicCastAndCheck(nav); + } + + void NavigatorReader::readString() + { + auto nav = getNextAndIncrease(); + typenavigator::StringNavigator::DynamicCastAndCheck(nav); + } + + void NavigatorReader::readBool() + { + auto nav = getNextAndIncrease(); + typenavigator::BoolNavigator::DynamicCastAndCheck(nav); + } + + void NavigatorReader::readTime() + { + auto nav = getNextAndIncrease(); + typenavigator::TimeNavigator::DynamicCastAndCheck(nav); + } + + std::string NavigatorReader::readKey() + { + auto token = stack.top(); + return token->getCurrentKey(); + } + + void NavigatorReader::loadMember(const std::string& k) + { + auto token = stack.top(); + token->setCurrentKey(k); + } + + // Helper functions + type::Descriptor NavigatorReader::getTypeOfNext() const + { + auto token = stack.top(); + return token->getTypeOfNext(); + } } diff --git a/source/RobotAPI/libraries/aron/core/io/typeIO/reader/navigator/NavigatorReader.h b/source/RobotAPI/libraries/aron/core/io/typeIO/reader/navigator/NavigatorReader.h index 43cb65c8738f2c53ff40c97e5a07df107c0b5ec2..0b733ce7cb7bafc9965a6a08c649271c35079028 100644 --- a/source/RobotAPI/libraries/aron/core/io/typeIO/reader/navigator/NavigatorReader.h +++ b/source/RobotAPI/libraries/aron/core/io/typeIO/reader/navigator/NavigatorReader.h @@ -25,7 +25,7 @@ #include <stack> // BaseClass -#include <RobotAPI/libraries/aron/core/io/typeIO/reader/Reader.h> +#include <RobotAPI/libraries/aron/core/io/typeIO/Reader.h> // ArmarX #include <RobotAPI/libraries/aron/core/navigator/type/Navigator.h> @@ -33,48 +33,63 @@ namespace armarx::aron::typeIO::reader - { - class NavigatorReader; - typedef std::shared_ptr<NavigatorReader> NavigatorReaderPtr; - - class NavigatorReader : - virtual public TokenizedReader<typenavigator::NavigatorPtr, NavigatorReaderTokenPtr> - { - public: - using PointerType = NavigatorReaderPtr; - - public: - // constructors - NavigatorReader() = delete; - NavigatorReader(const typenavigator::NavigatorPtr& n); - NavigatorReader(const type::AronTypePtr& n); - -#define RUN_ARON_MACRO(upperType, lowerType, capsType) \ - virtual int readStart##upperType() override; \ - virtual bool readEnd##upperType() override; - - HANDLE_CONTAINER_TYPES -#undef RUN_ARON_MACRO - - virtual std::tuple<std::vector<int>, std::string> readEigenMatrix() = 0; - virtual std::string readEigenQuaternion() = 0; - virtual std::tuple<unsigned int, unsigned int, std::string> readIVTCByteImage() = 0; - virtual std::tuple<std::vector<int>, std::string> readOpenCVMat() = 0; - virtual std::tuple<unsigned int, unsigned int, std::string> readPCLPointCloud() = 0; - virtual void readPosition() = 0; - virtual void readOrientation() = 0; - virtual void readPose() = 0; - -#define RUN_ARON_MACRO(upperType, lowerType, capsType) \ - virtual void read##upperType() override; - - HANDLE_PRIMITIVE_TYPES -#undef RUN_ARON_MACRO - - private: - typenavigator::NavigatorPtr getCurrentAndGoToNext(); - typenavigator::NavigatorPtr getCurrent(); - - private: - }; +{ + class NavigatorReader; + typedef std::shared_ptr<NavigatorReader> NavigatorReaderPtr; + + class NavigatorReader : + virtual public ReaderInterface + { + public: + using PointerType = NavigatorReaderPtr; + + public: + // constructors + NavigatorReader() = delete; + NavigatorReader(const typenavigator::NavigatorPtr& n); + NavigatorReader(const type::AronTypePtr& n); + + + virtual std::tuple<std::string, int> readStartObject() override; + virtual bool readEndObject() override; + virtual int readStartList() override; + virtual bool readEndList() override; + virtual int readStartDict() override; + virtual bool readEndDict() override; + virtual int readStartTuple() override; + virtual bool readEndTuple() override; + virtual int readStartPair() override; + virtual bool readEndPair() override; + + virtual std::tuple<std::vector<int>, std::string> readEigenMatrix() override; + virtual std::string readEigenQuaternion() override; + virtual std::tuple<unsigned int, unsigned int, std::string> readIVTCByteImage() override; + virtual std::tuple<std::vector<int>, std::string> readOpenCVMat() override; + virtual std::tuple<unsigned int, unsigned int, std::string> readPCLPointCloud() override; + virtual void readPosition() override; + virtual void readOrientation() override; + virtual void readPose() override; + + virtual void readInt() override; + virtual void readLong() override; + virtual void readFloat() override; + virtual void readDouble() override; + virtual void readString() override; + virtual void readBool() override; + virtual void readTime() override; + + virtual std::string readKey() override; + virtual void loadMember(const std::string&) override; + + // Helper functions + virtual type::Descriptor getTypeOfNext() const override; + + private: + typenavigator::NavigatorPtr getNextAndIncrease(); + + private: + typenavigator::NavigatorPtr input; + bool readInitialStart = false; + std::stack<NavigatorReaderTokenPtr> stack; + }; } diff --git a/source/RobotAPI/libraries/aron/core/io/typeIO/reader/navigator/NavigatorReaderToken.h b/source/RobotAPI/libraries/aron/core/io/typeIO/reader/navigator/NavigatorReaderToken.h index a22818709fcb5fb6bb513952bad66b8e0e08006f..9c8425ce589d6585bb6a460ea4774b76960707e7 100644 --- a/source/RobotAPI/libraries/aron/core/io/typeIO/reader/navigator/NavigatorReaderToken.h +++ b/source/RobotAPI/libraries/aron/core/io/typeIO/reader/navigator/NavigatorReaderToken.h @@ -32,105 +32,108 @@ #include <RobotAPI/libraries/aron/core/navigator/type/AllNavigators.h> namespace armarx::aron::typeIO::reader +{ + class NavigatorReaderToken; + typedef std::shared_ptr<NavigatorReaderToken> NavigatorReaderTokenPtr; + + class NavigatorReaderToken : + virtual public ReaderTokenInterface<typenavigator::NavigatorPtr> + { + public: + using PointerType = NavigatorReaderTokenPtr; + + public: + // constructors + NavigatorReaderToken() = delete; + NavigatorReaderToken(const type::Descriptor desc, const typenavigator::NavigatorPtr& type) { - // BaseClass - class NavigatorReaderToken; - typedef std::shared_ptr<NavigatorReaderToken> NavigatorReaderTokenPtr; + descriptor = desc; + element = type; - class NavigatorReaderToken : - virtual public ReaderToken<typenavigator::NavigatorPtr, typenavigator::NavigatorPtr> + switch (descriptor) { - public: - using PointerType = NavigatorReaderTokenPtr; - - public: - // constructors - NavigatorReaderToken() = delete; - NavigatorReaderToken(const type::Descriptor desc, const typenavigator::NavigatorPtr& type) : - io::ReaderToken<type::Descriptor, typenavigator::NavigatorPtr, typenavigator::NavigatorPtr>(desc, type), - ReaderToken<typenavigator::NavigatorPtr, typenavigator::NavigatorPtr>(desc, type) + case type::Descriptor::eObject: { - switch (descriptor) + for (const auto& [key, _] : typenavigator::ObjectNavigator::DynamicCastAndCheck(element)->getMemberTypes()) { - case type::Descriptor::eObject: - { - for (const auto& [key, _] : typenavigator::ObjectNavigator::DynamicCast(element)->getMemberTypes()) - { - allKeys.push_back(key); - } - - maxIndex = allKeys.size(); - break; - } - case type::Descriptor::eDict: - { - maxIndex = 1; - break; - } - case type::Descriptor::eTuple: - { - maxIndex = typenavigator::TupleNavigator::DynamicCast(element)->getAcceptedTypes().size(); - break; - } - case type::Descriptor::eList: - { - maxIndex = 1; - break; - } - default: - throw error::DescriptorNotValidException("NavigatorReaderToken", "NavigatorReaderToken", "Received an invalid instance for a reader token.", desc); + allMemberNames.push_back(key); } + childrenSize = type->childrenSize(); + break; } - - std::string getObjectName() const override + case type::Descriptor::eDict: { - if(descriptor == type::Descriptor::eObject) - { - const typenavigator::ObjectNavigatorPtr next = typenavigator::ObjectNavigator::DynamicCastAndCheck(getCurrentElement()); - return next->getObjectName(); - } - throw error::DescriptorNotValidException("NavigatorReaderToken", "NavigatorReaderToken", "Could not get object nme of a non-object token", descriptor); + typenavigator::DictNavigator::DynamicCastAndCheck(element); + childrenSize = 1; + break; } - - type::Descriptor getTypeOfNextElement() const override + case type::Descriptor::eTuple: + { + typenavigator::TupleNavigator::DynamicCastAndCheck(element); + childrenSize = type->childrenSize(); + break; + } + case type::Descriptor::eList: { - const typenavigator::NavigatorPtr next = getCurrentElement(); - return next->getDescriptor(); + typenavigator::ListNavigator::DynamicCastAndCheck(element); + childrenSize = 1; + break; } + case type::Descriptor::ePair: + { + typenavigator::PairNavigator::DynamicCastAndCheck(element); + childrenSize = 2; + break; + } + default: + throw error::DescriptorNotValidException("NavigatorReaderToken", "NavigatorReaderToken", "Received an invalid instance for a reader token.", desc); + } + } + + type::Descriptor getTypeOfNext() const override + { + const typenavigator::NavigatorPtr next = getNextElement(); + return next->getDescriptor(); + } + + typenavigator::NavigatorPtr getNextElement() const override + { + assertIndexInBounds(); - typenavigator::NavigatorPtr getCurrentElement() const override + switch (descriptor) + { + case type::Descriptor::eObject: { - switch (descriptor) + typenavigator::ObjectNavigatorPtr casted = typenavigator::ObjectNavigator::DynamicCastAndCheck(element); + return casted->getMemberType(getCurrentKey()); + } + case type::Descriptor::eDict: + { + typenavigator::DictNavigatorPtr casted = typenavigator::DictNavigator::DynamicCastAndCheck(element); + return casted->getAcceptedType(); + } + case type::Descriptor::eTuple: + { + typenavigator::TupleNavigatorPtr casted = typenavigator::TupleNavigator::DynamicCastAndCheck(element); + return casted->getAcceptedType(currentIndex); + } + case type::Descriptor::eList: + { + typenavigator::ListNavigatorPtr casted = typenavigator::ListNavigator::DynamicCastAndCheck(element); + return casted->getAcceptedType(); + } + case type::Descriptor::ePair: + { + typenavigator::PairNavigatorPtr casted = typenavigator::PairNavigator::DynamicCastAndCheck(element); + if (currentIndex == 0) { - case type::Descriptor::eObject: - { - typenavigator::ObjectNavigatorPtr casted = typenavigator::ObjectNavigator::DynamicCastAndCheck(element); - typenavigator::NavigatorPtr ret = casted->getMemberType(resolveCurrentKey()); - return ret; - } - case type::Descriptor::eDict: - { - typenavigator::DictNavigatorPtr casted = typenavigator::DictNavigator::DynamicCastAndCheck(element); - typenavigator::NavigatorPtr ret = casted->getAcceptedType(); - return ret; - } - case type::Descriptor::eTuple: - { - typenavigator::TupleNavigatorPtr casted = typenavigator::TupleNavigator::DynamicCastAndCheck(element); - typenavigator::NavigatorPtr ret = casted->getAcceptedType(currentIndex); - return ret; - } - case type::Descriptor::eList: - { - typenavigator::ListNavigatorPtr casted = typenavigator::ListNavigator::DynamicCastAndCheck(element); - typenavigator::NavigatorPtr ret = casted->getAcceptedType(); - return ret; - } - default: - throw error::DescriptorNotValidException("NavigatorReaderToken", "getNextElement", "Could not resove a type of a navigator. Allowed are only container types due to performance", descriptor); + return casted->getFirstAcceptedType(); } + return casted->getSecondAcceptedType(); } - - private: - }; + default: + throw error::DescriptorNotValidException("NavigatorReaderToken", "getNextElement", "Could not resove a type of a navigator. Allowed are only container types due to performance", descriptor); + } + } + }; } diff --git a/source/RobotAPI/libraries/aron/core/io/typeIO/reader/nlohmannJSON/NlohmannJSONReader.cpp b/source/RobotAPI/libraries/aron/core/io/typeIO/reader/nlohmannJSON/NlohmannJSONReader.cpp index 6090f2176eb1d677df379d5327bae604f3963694..eea8c5dc279d527d9aa6024b1c3bfed2f2e9da8a 100644 --- a/source/RobotAPI/libraries/aron/core/io/typeIO/reader/nlohmannJSON/NlohmannJSONReader.cpp +++ b/source/RobotAPI/libraries/aron/core/io/typeIO/reader/nlohmannJSON/NlohmannJSONReader.cpp @@ -35,16 +35,16 @@ namespace armarx::aron::typeIO::reader { NlohmannJSONReader::NlohmannJSONReader(const nlohmann::json& n) : - TokenizedReader<nlohmann::json, NlohmannJSONReaderTokenPtr>(n) + input(n) { } NlohmannJSONReader::NlohmannJSONReader(const std::string& n) : - TokenizedReader<nlohmann::json, NlohmannJSONReaderTokenPtr>(nlohmann::json::parse(n)) + input(n) { } - nlohmann::json NlohmannJSONReader::getCurrentAndGoToNext() + nlohmann::json NlohmannJSONReader::getNextAndIncrease() { if (!readInitialStart) { @@ -52,114 +52,223 @@ namespace armarx::aron::typeIO::reader return input; } NlohmannJSONReaderTokenPtr lastToken = stack.top(); - return lastToken->getCurrentElementAndIncreaseCnt(); + return lastToken->getNextElementAndIncreaseCnt(); } - nlohmann::json NlohmannJSONReader::getCurrent() + std::tuple<std::string, int> NlohmannJSONReader::readStartObject() { - if (!readInitialStart) + nlohmann::json current_json = getNextAndIncrease(); + auto newToken = std::make_shared<NlohmannJSONReaderToken>(type::eObject, current_json); + stack.push(newToken); + return {newToken->getElementName(), newToken->getElementChildrenSize()}; + } + + bool NlohmannJSONReader::readEndObject() + { + NlohmannJSONReaderTokenPtr token = stack.top(); + token->assertType(type::eObject); + + if (token->finishedElement()) { - readInitialStart = true; - return input; + stack.pop(); + return true; } - NlohmannJSONReaderTokenPtr lastToken = stack.top(); - return lastToken->getCurrentElement(); - } - -#define RUN_ARON_MACRO(upperType, lowerType, capsType) \ - int NlohmannJSONReader::readStart##upperType() \ - { \ - nlohmann::json current_json = getCurrentAndGoToNext(); \ - NlohmannJSONReaderTokenPtr newToken = NlohmannJSONReaderTokenPtr(new NlohmannJSONReaderToken(type::e##upperType, current_json)); \ - stack.push(newToken); \ - return newToken->getChildrenSize(); \ - } \ - \ - bool NlohmannJSONReader::readEnd##upperType() \ - { \ - NlohmannJSONReaderTokenPtr token = stack.top(); \ - auto desc = token->getDescriptor(); \ - if (desc != type::Descriptor::e##upperType) \ - { \ - throw error::DescriptorNotValidException("NlohmannJSONReader", "readEnd" + std::string(#upperType), "A token in the stack has the wrong type. Expected " + std::string(#upperType) + "Type", desc); \ - return false; \ - } \ - \ - if (token->checkedAllChildren()) \ - { \ - stack.pop(); \ - return true; \ - } \ - return false; \ - } - - HANDLE_CONTAINER_TYPES -#undef RUN_ARON_MACRO - -std::tuple<std::vector<int>, std::string> NlohmannJSONReader::readEigenMatrix() -{ - nlohmann::json j = getCurrentAndGoToNext(); - std::vector<int> dims = j[io::Data::READER_WRITER_NDARRAY_DIMENSIONS_SLUG]; - std::string type = j[io::Data::READER_WRITER_NDARRAY_TYPE_SLUG]; - return std::make_tuple(dims, type); -} + return false; + } -std::string NlohmannJSONReader::readEigenQuaternion() -{ - nlohmann::json j = getCurrentAndGoToNext(); - std::string type = j[io::Data::READER_WRITER_NDARRAY_TYPE_SLUG]; - return type; -} + int NlohmannJSONReader::readStartDict() + { + nlohmann::json current_json = getNextAndIncrease(); + auto newToken = std::make_shared<NlohmannJSONReaderToken>(type::eDict, current_json); + stack.push(newToken); + return newToken->getElementChildrenSize(); + } -std::tuple<unsigned int, unsigned int, std::string> NlohmannJSONReader::readIVTCByteImage() -{ - nlohmann::json j = getCurrentAndGoToNext(); - std::vector<int> dims = j[io::Data::READER_WRITER_NDARRAY_DIMENSIONS_SLUG]; - std::string type = j[io::Data::READER_WRITER_NDARRAY_TYPE_SLUG]; - return std::make_tuple(dims[0], dims[1], type); -} + bool NlohmannJSONReader::readEndDict() + { + NlohmannJSONReaderTokenPtr token = stack.top(); + token->assertType(type::eDict); -std::tuple<std::vector<int>, std::string> NlohmannJSONReader::readOpenCVMat() -{ - nlohmann::json j = getCurrentAndGoToNext(); - std::vector<int> dims = j[io::Data::READER_WRITER_NDARRAY_DIMENSIONS_SLUG]; - std::string type = j[io::Data::READER_WRITER_NDARRAY_TYPE_SLUG]; - return std::make_tuple(dims, type); -} + if (token->finishedElement()) + { + stack.pop(); + return true; + } + return false; + } -std::tuple<unsigned int, unsigned int, std::string> NlohmannJSONReader::readPCLPointCloud() -{ - nlohmann::json j = getCurrentAndGoToNext(); - std::vector<int> dims = j[io::Data::READER_WRITER_NDARRAY_DIMENSIONS_SLUG]; - std::string type = j[io::Data::READER_WRITER_NDARRAY_TYPE_SLUG]; - return std::make_tuple(dims[0], dims[1], type); -} + int NlohmannJSONReader::readStartList() + { + nlohmann::json current_json = getNextAndIncrease(); + auto newToken = std::make_shared<NlohmannJSONReaderToken>(type::eList, current_json); + stack.push(newToken); + return newToken->getElementChildrenSize(); + } -void NlohmannJSONReader::readPosition() -{ - getCurrentAndGoToNext(); - return; -} + bool NlohmannJSONReader::readEndList() + { + NlohmannJSONReaderTokenPtr token = stack.top(); + token->assertType(type::eList); -void NlohmannJSONReader::readOrientation() -{ - getCurrentAndGoToNext(); - return; -} + if (token->finishedElement()) + { + stack.pop(); + return true; + } + return false; + } -void NlohmannJSONReader::readPose() -{ - getCurrentAndGoToNext(); - return; -} + int NlohmannJSONReader::readStartTuple() + { + nlohmann::json current_json = getNextAndIncrease(); + auto newToken = std::make_shared<NlohmannJSONReaderToken>(type::eTuple, current_json); + stack.push(newToken); + return newToken->getElementChildrenSize(); + } + + bool NlohmannJSONReader::readEndTuple() + { + NlohmannJSONReaderTokenPtr token = stack.top(); + token->assertType(type::eTuple); - // Read primitives -#define RUN_ARON_MACRO(upperType, lowerType, capsType) \ - void NlohmannJSONReader::read##upperType() \ - { \ - nlohmann::json j = getCurrentAndGoToNext(); \ + if (token->finishedElement()) + { + stack.pop(); + return true; + } + return false; } - HANDLE_PRIMITIVE_TYPES -#undef RUN_ARON_MACRO + int NlohmannJSONReader::readStartPair() + { + nlohmann::json current_json = getNextAndIncrease(); + auto newToken = std::make_shared<NlohmannJSONReaderToken>(type::ePair, current_json); + stack.push(newToken); + return newToken->getElementChildrenSize(); + } + + bool NlohmannJSONReader::readEndPair() + { + NlohmannJSONReaderTokenPtr token = stack.top(); + token->assertType(type::ePair); + + if (token->finishedElement()) + { + stack.pop(); + return true; + } + return false; + } + + std::tuple<std::vector<int>, std::string> NlohmannJSONReader::readEigenMatrix() + { + nlohmann::json j = getNextAndIncrease(); + std::vector<int> dims = j[io::Data::READER_WRITER_NDARRAY_DIMENSIONS_SLUG]; + std::string type = j[io::Data::READER_WRITER_NDARRAY_TYPE_SLUG]; + return std::make_tuple(dims, type); + } + + std::string NlohmannJSONReader::readEigenQuaternion() + { + nlohmann::json j = getNextAndIncrease(); + std::string type = j[io::Data::READER_WRITER_NDARRAY_TYPE_SLUG]; + return type; + } + + std::tuple<unsigned int, unsigned int, std::string> NlohmannJSONReader::readIVTCByteImage() + { + nlohmann::json j = getNextAndIncrease(); + std::vector<int> dims = j[io::Data::READER_WRITER_NDARRAY_DIMENSIONS_SLUG]; + std::string type = j[io::Data::READER_WRITER_NDARRAY_TYPE_SLUG]; + return std::make_tuple(dims[0], dims[1], type); + } + + std::tuple<std::vector<int>, std::string> NlohmannJSONReader::readOpenCVMat() + { + nlohmann::json j = getNextAndIncrease(); + std::vector<int> dims = j[io::Data::READER_WRITER_NDARRAY_DIMENSIONS_SLUG]; + std::string type = j[io::Data::READER_WRITER_NDARRAY_TYPE_SLUG]; + return std::make_tuple(dims, type); + } + + std::tuple<unsigned int, unsigned int, std::string> NlohmannJSONReader::readPCLPointCloud() + { + nlohmann::json j = getNextAndIncrease(); + std::vector<int> dims = j[io::Data::READER_WRITER_NDARRAY_DIMENSIONS_SLUG]; + std::string type = j[io::Data::READER_WRITER_NDARRAY_TYPE_SLUG]; + return std::make_tuple(dims[0], dims[1], type); + } + + void NlohmannJSONReader::readPosition() + { + getNextAndIncrease(); + return; + } + + void NlohmannJSONReader::readOrientation() + { + getNextAndIncrease(); + return; + } + + void NlohmannJSONReader::readPose() + { + getNextAndIncrease(); + return; + } + + // Read primitives + void NlohmannJSONReader::readInt() + { + nlohmann::json j = getNextAndIncrease(); + } + + void NlohmannJSONReader::readLong() + { + nlohmann::json j = getNextAndIncrease(); + } + + void NlohmannJSONReader::readFloat() + { + nlohmann::json j = getNextAndIncrease(); + } + + void NlohmannJSONReader::readDouble() + { + nlohmann::json j = getNextAndIncrease(); + } + + void NlohmannJSONReader::readString() + { + nlohmann::json j = getNextAndIncrease(); + } + + void NlohmannJSONReader::readBool() + { + nlohmann::json j = getNextAndIncrease(); + } + + void NlohmannJSONReader::readTime() + { + nlohmann::json j = getNextAndIncrease(); + } + + std::string NlohmannJSONReader::readKey() + { + auto token = stack.top(); + return token->getCurrentKey(); + } + + void NlohmannJSONReader::loadMember(const std::string& k) + { + auto token = stack.top(); + token->setCurrentKey(k); + } + + // Helper functions + type::Descriptor NlohmannJSONReader::getTypeOfNext() const + { + auto token = stack.top(); + return token->getTypeOfNext(); + } } diff --git a/source/RobotAPI/libraries/aron/core/io/typeIO/reader/nlohmannJSON/NlohmannJSONReader.h b/source/RobotAPI/libraries/aron/core/io/typeIO/reader/nlohmannJSON/NlohmannJSONReader.h index 322bf0cf7e02174e6caca07d829a2767262ab167..70efcc50ec54620533272f9493aa77c17701fa41 100644 --- a/source/RobotAPI/libraries/aron/core/io/typeIO/reader/nlohmannJSON/NlohmannJSONReader.h +++ b/source/RobotAPI/libraries/aron/core/io/typeIO/reader/nlohmannJSON/NlohmannJSONReader.h @@ -25,54 +25,68 @@ #include <stack> // BaseClass -#include <RobotAPI/libraries/aron/core/io/typeIO/reader/Reader.h> +#include <RobotAPI/libraries/aron/core/io/typeIO/Reader.h> // ArmarX #include <RobotAPI/libraries/aron/core/io/typeIO/reader/nlohmannJSON/NlohmannJSONReaderToken.h> namespace armarx::aron::typeIO::reader - { - class NlohmannJSONReader; - typedef std::shared_ptr<NlohmannJSONReader> NlohmannJSONReaderPtr; +{ + class NlohmannJSONReader; + typedef std::shared_ptr<NlohmannJSONReader> NlohmannJSONReaderPtr; - class NlohmannJSONReader : - virtual public TokenizedReader<nlohmann::json, NlohmannJSONReaderTokenPtr> - { - public: - using PointerType = NlohmannJSONReaderPtr; + class NlohmannJSONReader : + virtual public ReaderInterface + { + public: + using PointerType = NlohmannJSONReaderPtr; - public: - // constructors - NlohmannJSONReader() = delete; - NlohmannJSONReader(const nlohmann::json& n); - NlohmannJSONReader(const std::string& n); + public: + // constructors + NlohmannJSONReader() = delete; + NlohmannJSONReader(const nlohmann::json& n); + NlohmannJSONReader(const std::string& n); -#define RUN_ARON_MACRO(upperType, lowerType, capsType) \ - virtual int readStart##upperType() override; \ - virtual bool readEnd##upperType() override; + virtual std::tuple<std::string, int> readStartObject() override; + virtual bool readEndObject() override; + virtual int readStartList() override; + virtual bool readEndList() override; + virtual int readStartDict() override; + virtual bool readEndDict() override; + virtual int readStartTuple() override; + virtual bool readEndTuple() override; + virtual int readStartPair() override; + virtual bool readEndPair() override; - HANDLE_CONTAINER_TYPES -#undef RUN_ARON_MACRO + virtual std::tuple<std::vector<int>, std::string> readEigenMatrix() override; + virtual std::string readEigenQuaternion() override; + virtual std::tuple<unsigned int, unsigned int, std::string> readIVTCByteImage() override; + virtual std::tuple<std::vector<int>, std::string> readOpenCVMat() override; + virtual std::tuple<unsigned int, unsigned int, std::string> readPCLPointCloud() override; + virtual void readPosition() override; + virtual void readOrientation() override; + virtual void readPose() override; - virtual std::tuple<std::vector<int>, std::string> readEigenMatrix() override; - virtual std::string readEigenQuaternion() override; - virtual std::tuple<unsigned int, unsigned int, std::string> readIVTCByteImage() override; - virtual std::tuple<std::vector<int>, std::string> readOpenCVMat() override; - virtual std::tuple<unsigned int, unsigned int, std::string> readPCLPointCloud() override; - virtual void readPosition() override; - virtual void readOrientation() override; - virtual void readPose() override; + virtual void readInt() override; + virtual void readLong() override; + virtual void readFloat() override; + virtual void readDouble() override; + virtual void readString() override; + virtual void readBool() override; + virtual void readTime() override; -#define RUN_ARON_MACRO(upperType, lowerType, capsType) \ - virtual void read##upperType() override; + virtual std::string readKey() override; + virtual void loadMember(const std::string&) override; - HANDLE_PRIMITIVE_TYPES -#undef RUN_ARON_MACRO + // Helper functions + virtual type::Descriptor getTypeOfNext() const override; - private: - nlohmann::json getCurrent(); - nlohmann::json getCurrentAndGoToNext(); + private: + nlohmann::json getNextAndIncrease(); - private: - }; + private: + nlohmann::json input; + bool readInitialStart = false; + std::stack<NlohmannJSONReaderTokenPtr> stack; + }; } diff --git a/source/RobotAPI/libraries/aron/core/io/typeIO/reader/nlohmannJSON/NlohmannJSONReaderToken.h b/source/RobotAPI/libraries/aron/core/io/typeIO/reader/nlohmannJSON/NlohmannJSONReaderToken.h index ba2bf1f97b20dd83a9e5e9096f07b19f0dd2461c..78b3c04ab5fe09cef34cee4c96c5749a9eff908c 100644 --- a/source/RobotAPI/libraries/aron/core/io/typeIO/reader/nlohmannJSON/NlohmannJSONReaderToken.h +++ b/source/RobotAPI/libraries/aron/core/io/typeIO/reader/nlohmannJSON/NlohmannJSONReaderToken.h @@ -35,156 +35,185 @@ #include <RobotAPI/libraries/aron/core/Resolver.h> namespace armarx::aron::typeIO::reader +{ + class NlohmannJSONReaderToken; + typedef std::shared_ptr<NlohmannJSONReaderToken> NlohmannJSONReaderTokenPtr; + + class NlohmannJSONReaderToken : + virtual public ReaderTokenInterface<nlohmann::json> + { + public: + using PointerType = NlohmannJSONReaderTokenPtr; + + public: + // constructors + NlohmannJSONReaderToken() = delete; + NlohmannJSONReaderToken(const type::Descriptor desc, const nlohmann::json& type) { - // BaseClass - class NlohmannJSONReaderToken; - typedef std::shared_ptr<NlohmannJSONReaderToken> NlohmannJSONReaderTokenPtr; + descriptor = desc; + element = type; - class NlohmannJSONReaderToken : - virtual public ReaderToken<nlohmann::json, nlohmann::json> + switch (descriptor) { - public: - using PointerType = NlohmannJSONReaderTokenPtr; - - public: - // constructors - NlohmannJSONReaderToken() = delete; - NlohmannJSONReaderToken(const type::Descriptor desc, const nlohmann::json& type) : - io::ReaderToken<type::Descriptor, nlohmann::json, nlohmann::json>(desc, type), - ReaderToken<nlohmann::json, nlohmann::json>(desc, type) - { - switch (descriptor) + case type::Descriptor::eObject: + { + for (auto it = type.begin(); it != type.end(); ++it) { - case type::Descriptor::eObject: - { - for (auto it = type.begin(); it != type.end(); ++it) - { - if ( - it.key() == io::Data::READER_WRITER_OBJECT_NAME_SLUG || -#define RUN_ARON_MACRO(upperType, lowerType, capsType) \ - it.key() == io::Data::READER_WRITER_##capsType##_TYPENAME_SLUG || - - HANDLE_PRIMITIVE_TYPES -#undef RUN_ARON_MACRO - it.key() == io::Data::READER_WRITER_DICT_ACCEPTED_TYPE_SLUG || - it.key() == io::Data::READER_WRITER_LIST_ACCEPTED_TYPE_SLUG || - it.key() == io::Data::READER_WRITER_NDARRAY_NAME_SLUG || - it.key() == io::Data::READER_WRITER_NDARRAY_DIMENSIONS_SLUG || - it.key() == io::Data::READER_WRITER_NDARRAY_TYPE_SLUG - ) - { - continue; - } - - allKeys.push_back(it.key()); - } - maxIndex = allKeys.size(); - break; - } - case type::Descriptor::eDict: + if (it.key() == io::Data::READER_WRITER_NAME_SLUG) { - maxIndex = 1; - break; + continue; } - case type::Descriptor::eTuple: - { - maxIndex = type.size(); - break; - } - case type::Descriptor::eList: - { - maxIndex = 1; - break; - } - default: - throw error::DescriptorNotValidException("NlohmannJSONReaderToken", "NlohmannJSONReaderToken", "Received an invalid instance for a reader token.", desc); + + allMemberNames.push_back(it.key()); } + childrenSize = allMemberNames.size(); + elementName = element[io::Data::READER_WRITER_NAME_SLUG]; + break; } - - std::string getObjectName() const override + case type::Descriptor::eDict: { - if (descriptor == type::Descriptor::eObject) - { - return element[io::Data::READER_WRITER_OBJECT_NAME_SLUG]; - } - throw error::DescriptorNotValidException("NavigatorReaderToken", "NavigatorReaderToken", "Could not get object nme of a non-object token", descriptor); + childrenSize = 1; + break; } - - type::Descriptor getTypeOfNextElement() const override + case type::Descriptor::eTuple: + { + childrenSize = element.size(); + break; + } + case type::Descriptor::eList: + { + childrenSize = 1; + break; + } + case type::ePair: { - const nlohmann::json next = getCurrentElement(); + childrenSize = 2; + break; + } + default: + throw error::DescriptorNotValidException("NlohmannJSONReaderToken", "NlohmannJSONReaderToken", "Received an invalid instance for a reader token.", desc); + } + } - if (next.is_object()) - { - if (next.find(io::Data::READER_WRITER_DICT_ACCEPTED_TYPE_SLUG) != next.end()) - { - return type::Descriptor::eDict; - } - if (next.find(io::Data::READER_WRITER_LIST_ACCEPTED_TYPE_SLUG) != next.end()) - { - return type::Descriptor::eList; - } - if (next.find(io::Data::READER_WRITER_NDARRAY_NAME_SLUG) != next.end()) - { -#define RUN_ARON_MACRO(upperType, lowerType, capsType) \ - if (next[io::Data::READER_WRITER_NDARRAY_NAME_SLUG] == std::string(#upperType)) \ - { \ - return type::Descriptor::e##upperType; \ - } + type::Descriptor getTypeOfNext() const override + { + const nlohmann::json next = getNextElement(); - HANDLE_NDARRAY_TYPES -#undef RUN_ARON_MACRO - throw error::AronException("NlohmannJSONReaderToken", "getTypeOfNextElement", "Could not determine the type of an nlohmann::json object. Found indicator of NDArray but could not resolve real type. Found JSON: " + next[io::Data::READER_WRITER_NDARRAY_NAME_SLUG].dump(2)); - } - return type::Descriptor::eObject; + if (next.is_object()) + { + if (next.find(io::Data::READER_WRITER_DICT_ACCEPTED_TYPE_SLUG) != next.end()) + { + return type::eDict; + } + if (next.find(io::Data::READER_WRITER_LIST_ACCEPTED_TYPE_SLUG) != next.end()) + { + return type::eList; + } + if (next.find(io::Data::READER_WRITER_INT_ENUM_NAME_SLUG) != next.end()) + { + return type::eIntEnum; + } + if (next.find(io::Data::READER_WRITER_NDARRAY_NAME_SLUG) != next.end()) + { + if (next[io::Data::READER_WRITER_NDARRAY_NAME_SLUG] == "EigenMatrix") + { + return type::eEigenMatrix; } - if (next.is_array()) + if (next[io::Data::READER_WRITER_NDARRAY_NAME_SLUG] == "EigenQuaternion") { - return type::Descriptor::eTuple; + return type::eEigenQuaternion; } - if (next.is_string()) + if (next[io::Data::READER_WRITER_NDARRAY_NAME_SLUG] == "IVTCByteImage") { -#define RUN_ARON_MACRO(upperType, lowerType, capsType) \ - if (next == io::Data::READER_WRITER_##capsType##_TYPENAME_SLUG) \ - { \ - return type::Descriptor::e##upperType; \ - } - - HANDLE_PRIMITIVE_TYPES -#undef RUN_ARON_MACRO + return type::eIVTCByteImage; } - throw error::AronException("NlohmannJSONReaderToken", "getTypeOfNextElement", "Could not determine the type of an nlohmann::json object. Could not convert to type::Descriptor enum. Found JSON: " + next.dump(2)); - } - - nlohmann::json getCurrentElement() const override - { - switch (descriptor) + if (next[io::Data::READER_WRITER_NDARRAY_NAME_SLUG] == "OpenCVMat") { - case type::Descriptor::eObject: - { - nlohmann::json ret = element[resolveCurrentKey()]; - return ret; - } - case type::Descriptor::eDict: - { - nlohmann::json ret = element[io::Data::READER_WRITER_DICT_ACCEPTED_TYPE_SLUG]; - return ret; - } - case type::Descriptor::eTuple: - { - nlohmann::json ret = element[currentIndex]; - return ret; - } - case type::Descriptor::eList: - { - nlohmann::json ret = element[io::Data::READER_WRITER_LIST_ACCEPTED_TYPE_SLUG]; - return ret; - } - default: - throw error::DescriptorNotValidException("NlohmannJSONReaderToken", "getNextElement", "Could not resove a type of a navigator. Allowed are only container types due to performance", descriptor); + return type::eOpenCVMat; + } + if (next[io::Data::READER_WRITER_NDARRAY_NAME_SLUG] == "PCLPointCloud") + { + return type::ePCLPointCloud; + } + if (next[io::Data::READER_WRITER_NDARRAY_NAME_SLUG] == "Position") + { + return type::ePosition; } + if (next[io::Data::READER_WRITER_NDARRAY_NAME_SLUG] == "Orientation") + { + return type::eOrientation; + } + if (next[io::Data::READER_WRITER_NDARRAY_NAME_SLUG] == "Pose") + { + return type::ePose; + } + throw error::AronException("NlohmannJSONReaderToken", "getTypeOfNextElement", "Could not determine the type of an nlohmann::json object. Found indicator of NDArray but could not resolve real type. Found JSON: " + next[io::Data::READER_WRITER_NDARRAY_NAME_SLUG].dump(2)); + } + return type::eObject; + } + if (next.is_array()) + { + return type::eTuple; + } + if (next.is_string()) + { + if (next == io::Data::READER_WRITER_INT_TYPENAME_SLUG) + { + return type::eInt; + } + if (next == io::Data::READER_WRITER_LONG_TYPENAME_SLUG) + { + return type::eLong; } + if (next == io::Data::READER_WRITER_FLOAT_TYPENAME_SLUG) + { + return type::eFloat; + } + if (next == io::Data::READER_WRITER_DOUBLE_TYPENAME_SLUG) + { + return type::eDouble; + } + if (next == io::Data::READER_WRITER_STRING_TYPENAME_SLUG) + { + return type::eString; + } + if (next == io::Data::READER_WRITER_BOOL_TYPENAME_SLUG) + { + return type::eBool; + } + if (next == io::Data::READER_WRITER_TIME_TYPENAME_SLUG) + { + return type::eTime; + } + } + throw error::AronException("NlohmannJSONReaderToken", "getTypeOfNextElement", "Could not determine the type of an nlohmann::json object. Could not convert to type::Descriptor enum. Found JSON: " + next.dump(2)); + } - private: - }; + nlohmann::json getNextElement() const override + { + assertIndexInBounds(); + + switch (descriptor) + { + case type::Descriptor::eObject: + { + return element[getCurrentKey()]; + } + case type::Descriptor::eDict: + { + return element[io::Data::READER_WRITER_DICT_ACCEPTED_TYPE_SLUG]; + } + case type::Descriptor::eTuple: + { + return element[currentIndex]; + } + case type::Descriptor::eList: + { + return element[io::Data::READER_WRITER_LIST_ACCEPTED_TYPE_SLUG]; + } + default: + throw error::DescriptorNotValidException("NlohmannJSONReaderToken", "getNextElement", "Could not resove a type of a navigator. Allowed are only container types due to performance", descriptor); + } + } + }; } diff --git a/source/RobotAPI/libraries/aron/core/io/typeIO/visitor/Visitor.cpp b/source/RobotAPI/libraries/aron/core/io/typeIO/visitor/Visitor.cpp index 52b3050fb7e333689bc34ccc8d021e0030ed3f8e..99005c64e9a148fad4cbf4b54932d10f68332a5a 100644 --- a/source/RobotAPI/libraries/aron/core/io/typeIO/visitor/Visitor.cpp +++ b/source/RobotAPI/libraries/aron/core/io/typeIO/visitor/Visitor.cpp @@ -31,119 +31,148 @@ namespace armarx::aron::typeIO - { +{ + + void Visitor::SetupWriterFromAronTypePtr(WriterInterface& writer, const typenavigator::NavigatorPtr& aron) + { + SetupWriterFromAronTypePtr(writer, aron->getResult()); + } - void Visitor::SetupWriterFromAronTypePtr(Writer& writer, const typenavigator::NavigatorPtr& aron) + void Visitor::SetupWriterFromAronTypePtr(WriterInterface& writer, const type::AronTypePtr& aron) + { + type::Descriptor desc = Resolver::GetDescriptor(aron); + switch (desc) + { + case type::eObject: { - SetupWriterFromAronTypePtr(writer, aron->getResult()); + type::AronObjectPtr casted = type::AronObjectPtr::dynamicCast(aron); + writer.writeStartObject(casted->objectName); + for (const auto& [key, value] : casted->elementTypes) + { + writer.writeKey(key); + Visitor::SetupWriterFromAronTypePtr(writer, value); + } + writer.writeEndObject(); + break; } - - void Visitor::SetupWriterFromAronTypePtr(Writer& writer, const type::AronTypePtr& aron) + case type::eDict: { - type::Descriptor desc = Resolver::GetDescriptor(aron); - switch (desc) + type::AronDictPtr casted = type::AronDictPtr::dynamicCast(aron); + writer.writeStartDict(); + Visitor::SetupWriterFromAronTypePtr(writer, casted->acceptedType); + writer.writeEndDict(); + break; + } + case type::eTuple: + { + type::AronTuplePtr casted = type::AronTuplePtr::dynamicCast(aron); + writer.writeStartTuple(); + for (const auto& value : casted->elementTypes) { - case type::eObject: - { - type::AronObjectPtr casted = type::AronObjectPtr::dynamicCast(aron); - writer.writeStartObject(); - writer.writeObjectName(casted->objectName); - for (const auto& [key, value] : casted->elementTypes) - { - writer.writeKey(key); - Visitor::SetupWriterFromAronTypePtr(writer, value); - } - writer.writeEndObject(); - break; - } - case type::eDict: - { - type::AronDictPtr casted = type::AronDictPtr::dynamicCast(aron); - writer.writeStartDict(); - Visitor::SetupWriterFromAronTypePtr(writer, casted->acceptedType); - writer.writeEndDict(); - break; - } - case type::eTuple: - { - type::AronTuplePtr casted = type::AronTuplePtr::dynamicCast(aron); - writer.writeStartTuple(); - for (const auto& value : casted->elementTypes) - { - Visitor::SetupWriterFromAronTypePtr(writer, value); - } - writer.writeEndTuple(); - break; - } - case type::eList: - { - type::AronListPtr casted = type::AronListPtr::dynamicCast(aron); - writer.writeStartList(); - Visitor::SetupWriterFromAronTypePtr(writer, casted->acceptedType); - writer.writeEndList(); - break; - } - case type::eEigenMatrix: - { - type::AronEigenMatrixPtr casted = type::AronEigenMatrixPtr::dynamicCast(aron); - writer.writeEigenMatrix(casted->dimensions, casted->typeName); - break; - } - case type::eEigenQuaternion: - { - type::AronEigenQuaternionPtr casted = type::AronEigenQuaternionPtr::dynamicCast(aron); - writer.writeEigenQuaternion(casted->typeName); - break; - } - case type::eIVTCByteImage: - { - type::AronIVTCByteImagePtr casted = type::AronIVTCByteImagePtr::dynamicCast(aron); - writer.writeIVTCByteImage(casted->width, casted->height, casted->typeName); - break; - } - case type::eOpenCVMat: - { - type::AronOpenCVMatPtr casted = type::AronOpenCVMatPtr::dynamicCast(aron); - writer.writeOpenCVMat(casted->dimensions, casted->typeName); - break; - } - case type::ePCLPointCloud: - { - type::AronPCLPointCloudPtr casted = type::AronPCLPointCloudPtr::dynamicCast(aron); - writer.writePCLPointCloud(casted->width, casted->height, casted->typeName); - break; - } - case type::ePosition: - { - writer.writePosition(); - break; - } - case type::eOrientation: - { - writer.writeOrientation(); - break; - } - case type::ePose: - { - writer.writePose(); - break; - } - -#define RUN_ARON_MACRO(upperType, lowerType, capsType) \ -case type::e##upperType: \ -{ \ - type::Aron##upperType##Ptr casted = type::Aron##upperType##Ptr::dynamicCast(aron); \ - writer.write##upperType(); \ - break; \ -} - - HANDLE_PRIMITIVE_TYPES -#undef RUN_ARON_MACRO - - default: - { - throw error::DescriptorNotValidException("LegacyAronTypeWriter", "SetupWriterFromAronTypePtr", "Type-Type could not be resolved. The ice_id of the input was: " + aron->ice_id(), desc); - } + Visitor::SetupWriterFromAronTypePtr(writer, value); } + writer.writeEndTuple(); + break; + } + case type::eList: + { + type::AronListPtr casted = type::AronListPtr::dynamicCast(aron); + writer.writeStartList(); + Visitor::SetupWriterFromAronTypePtr(writer, casted->acceptedType); + writer.writeEndList(); + break; + } + case type::eEigenMatrix: + { + type::AronEigenMatrixPtr casted = type::AronEigenMatrixPtr::dynamicCast(aron); + writer.writeEigenMatrix(casted->dimensions, casted->typeName); + break; + } + case type::eEigenQuaternion: + { + type::AronEigenQuaternionPtr casted = type::AronEigenQuaternionPtr::dynamicCast(aron); + writer.writeEigenQuaternion(casted->typeName); + break; + } + case type::eIVTCByteImage: + { + type::AronIVTCByteImagePtr casted = type::AronIVTCByteImagePtr::dynamicCast(aron); + writer.writeIVTCByteImage(casted->width, casted->height, casted->typeName); + break; + } + case type::eOpenCVMat: + { + type::AronOpenCVMatPtr casted = type::AronOpenCVMatPtr::dynamicCast(aron); + writer.writeOpenCVMat(casted->dimensions, casted->typeName); + break; + } + case type::ePCLPointCloud: + { + type::AronPCLPointCloudPtr casted = type::AronPCLPointCloudPtr::dynamicCast(aron); + writer.writePCLPointCloud(casted->width, casted->height, casted->typeName); + break; + } + case type::ePosition: + { + writer.writePosition(); + break; + } + case type::eOrientation: + { + writer.writeOrientation(); + break; + } + case type::ePose: + { + writer.writePose(); + break; + } + case type::eInt: + { + type::AronIntPtr casted = type::AronIntPtr::dynamicCast(aron); + writer.writeInt(); + break; + } + case type::eLong: + { + type::AronLongPtr casted = type::AronLongPtr::dynamicCast(aron); + writer.writeLong(); + break; + } + case type::eFloat: + { + type::AronFloatPtr casted = type::AronFloatPtr::dynamicCast(aron); + writer.writeFloat(); + break; + } + case type::eDouble: + { + type::AronDoublePtr casted = type::AronDoublePtr::dynamicCast(aron); + writer.writeDouble(); + break; + } + case type::eString: + { + type::AronStringPtr casted = type::AronStringPtr::dynamicCast(aron); + writer.writeString(); + break; + } + case type::eBool: + { + type::AronBoolPtr casted = type::AronBoolPtr::dynamicCast(aron); + writer.writeBool(); + break; + } + case type::eTime: + { + type::AronTimePtr casted = type::AronTimePtr::dynamicCast(aron); + writer.writeTime(); + break; + } + default: + { + throw error::DescriptorNotValidException("LegacyAronTypeWriter", "SetupWriterFromAronTypePtr", "Type-Type could not be resolved. The ice_id of the input was: " + aron->ice_id(), desc); } + } + } } diff --git a/source/RobotAPI/libraries/aron/core/io/typeIO/visitor/Visitor.h b/source/RobotAPI/libraries/aron/core/io/typeIO/visitor/Visitor.h index a5f86273b8283f2292d9333b93cfa8df2714d777..6f781b3dae61236e202ffffd0fd243f89732f5d7 100644 --- a/source/RobotAPI/libraries/aron/core/io/typeIO/visitor/Visitor.h +++ b/source/RobotAPI/libraries/aron/core/io/typeIO/visitor/Visitor.h @@ -41,8 +41,8 @@ namespace armarx::aron::typeIO Visitor() = delete; public: - static void SetupWriterFromAronTypePtr(Writer&, const typenavigator::NavigatorPtr&); - static void SetupWriterFromAronTypePtr(Writer&, const type::AronTypePtr&); + static void SetupWriterFromAronTypePtr(WriterInterface&, const typenavigator::NavigatorPtr&); + static void SetupWriterFromAronTypePtr(WriterInterface&, const type::AronTypePtr&); public: }; diff --git a/source/RobotAPI/libraries/aron/core/io/typeIO/writer/Writer.h b/source/RobotAPI/libraries/aron/core/io/typeIO/writer/Writer.h index 80f32a7c6d243ab93b0989ab201296f95f6350c8..6ba53b81acec39ec84792402e3066e901aef27b8 100644 --- a/source/RobotAPI/libraries/aron/core/io/typeIO/writer/Writer.h +++ b/source/RobotAPI/libraries/aron/core/io/typeIO/writer/Writer.h @@ -20,76 +20,5 @@ #pragma once -// STD/STL -#include <memory> -#include <string> -#include <stack> - -// ArmarX -#include <RobotAPI/libraries/aron/core/io/typeIO/Writer.h> - - - -namespace armarx::aron::typeIO - { - template <typename GeneratePtr, typename TokenPtr> - class TokenizedWriter; - - template <typename GeneratePtr, typename TokenPtr> - using TokenizedWriterPtr = std::shared_ptr<TokenizedWriter<GeneratePtr, TokenPtr>>; - - template <typename GeneratePtr, typename TokenPtr> - class TokenizedWriter : - virtual public Writer - { - public: - TokenizedWriter() = default; - - virtual bool writeKey(const std::string& k) override - { - TokenPtr token = stack.top(); - token->setCurrentKey(k); - return true; - } - - bool writeObjectName(const std::string& n) - { - TokenPtr token = stack.top(); - token->setObjectName(n); - return true; - } - - GeneratePtr getResult() const - { - assertLastRemovedTokenIsSet(); - assertStackIsEmpty(); - return lastRemovedToken->getElement(); - } - - protected: - void assertLastRemovedTokenIsSet() const - { - if (lastRemovedToken == nullptr) - { - throw error::AronException("ClassWriter", "assertLastRemovedTokenIsSet", "lastRemovedToken is NULL. Perhaps you never called a writeEnd* method?"); - } - if (lastRemovedToken->getElement() == nullptr) - { - throw error::AronException("ClassWriter", "assertLastRemovedTokenIsSet", "lastRemovedToken->getElement() is NULL."); - } - } - void assertStackIsEmpty() const - { - if (stack.size() != 0) - { - throw error::AronException("ClassWriter", "assertStackIsEmpty", "The Size of the stack is not 0. Perhaps you never called a writeEnd* method?"); - } - } - - protected: - bool wroteInitialStartContainer = false; - TokenPtr lastRemovedToken; - std::stack<TokenPtr> stack; - }; } diff --git a/source/RobotAPI/libraries/aron/core/io/typeIO/writer/WriterToken.h b/source/RobotAPI/libraries/aron/core/io/typeIO/writer/WriterToken.h index c3742cb4cddd99c3b39348806c0897a82a7bfa96..315be70a3e9096d0b264c8f9e27ecb0e1e80bc1e 100644 --- a/source/RobotAPI/libraries/aron/core/io/typeIO/writer/WriterToken.h +++ b/source/RobotAPI/libraries/aron/core/io/typeIO/writer/WriterToken.h @@ -29,51 +29,73 @@ // ArmarX #include <RobotAPI/libraries/aron/core/Config.h> +#include <RobotAPI/libraries/aron/core/Exception.h> +#include <RobotAPI/libraries/aron/core/io/Data.h> namespace armarx::aron::typeIO { - template<typename ElementPtrTypename, typename ElementAddTypename> - class WriterToken; + template<typename ElementTypename> + class WriterTokenInterface; - template<typename ElementPtrTypename, typename ElementAddTypename> - using WriterTokenPtr = std::shared_ptr<WriterToken<ElementPtrTypename, ElementAddTypename>>; + template<typename ElementTypename> + using WriterTokenInterfacePtr = std::shared_ptr<WriterTokenInterface<ElementTypename>>; - template<typename ElementPtrTypename, typename ElementAddTypename> - class WriterToken : - virtual public io::WriterToken<type::Descriptor, ElementPtrTypename, ElementAddTypename> + template<typename ElementTypename> + class WriterTokenInterface + { + public: + using PointerType = WriterTokenInterfacePtr<ElementTypename>; + + // Interface + virtual void addElement(const ElementTypename&) = 0; + virtual void setName(const std::string&) = 0; + + // General implementation + std::string toAccessor() const + { + type::Descriptor desc = this->getDescriptor(); + switch (desc) + { + case type::Descriptor::eDict: + case type::Descriptor::eList: + return "[ACCEPTED_TYPE]"; + case type::Descriptor::eObject: + return this->currentKey; + case type::Descriptor::eTuple: + return std::to_string(this->currentIndex); + default: + throw error::DescriptorNotValidException("NavigatorWriterToken", "toElementAccessor", "Could not resove a type of a navigator. Allowed are only containers.", desc); + } + } + + void setCurrentKey(const std::string& s) + { + if (s.empty()) { - public: - using PointerType = WriterToken<ElementPtrTypename, ElementAddTypename>; + throw error::AronException("AronWriterToken", "setCurrentKey", "The passed key is empty."); + } + currentKey = s; + } - public: - // constructor - WriterToken() = delete; - WriterToken(const type::Descriptor desc, const ElementPtrTypename& n) : - io::WriterToken<type::Descriptor, ElementPtrTypename, ElementAddTypename>(desc, n) - {} + ElementTypename getElement() const + { + return element; + } - // public member functions - virtual void addElement(const ElementAddTypename&) = 0; + type::Descriptor getDescriptor() const + { + return descriptor; + } - virtual std::string toElementAccessor() const override - { - type::Descriptor desc = this->getDescriptor(); - switch (desc) - { - case type::Descriptor::eDict: - case type::Descriptor::eList: - return "[ACCEPTED_TYPE]"; - case type::Descriptor::eObject: - return "\"" + this->currentKey + "\""; - case type::Descriptor::eTuple: - return "<" + std::to_string(this->currentIndex) + ">"; - default: - throw error::DescriptorNotValidException("NavigatorWriterToken", "toElementAccessor", "Could not resove a type of a navigator. Allowed are only containers.", desc); - } - } + protected: + // members + type::Descriptor descriptor = type::eUnknown; + ElementTypename element; - virtual void setObjectName(const std::string& n) = 0; + // current index + unsigned int currentIndex = 0; - private: - }; + // current key + std::string currentKey = ""; + }; } diff --git a/source/RobotAPI/libraries/aron/core/io/typeIO/writer/navigator/NavigatorWriter.cpp b/source/RobotAPI/libraries/aron/core/io/typeIO/writer/navigator/NavigatorWriter.cpp index 19f58a42a90b7e0d3d58bb647731fd48353d57ab..06e8c00764ed0c3c446c7fdb2b1448a780d085cb 100644 --- a/source/RobotAPI/libraries/aron/core/io/typeIO/writer/navigator/NavigatorWriter.cpp +++ b/source/RobotAPI/libraries/aron/core/io/typeIO/writer/navigator/NavigatorWriter.cpp @@ -34,144 +34,260 @@ #include <RobotAPI/libraries/aron/core/navigator/type/container/Tuple.h> #include <RobotAPI/libraries/aron/core/navigator/type/primitive/Primitive.h> +namespace armarx::aron::typeIO::writer +{ + // generate Path info + Path NavigatorWriter::generatePath() + { + Path path; + if (!wroteInitialStartObject) + { + wroteInitialStartObject = true; + } + else + { + auto current = stack.top(); + path = Path(current->getElement()->getPath(), current->toAccessor()); + } + return path; + } + // interface + void NavigatorWriter::writeStartObject(const std::string& n) + { + Path path = generatePath(); + auto type = std::make_shared<typenavigator::ObjectNavigator>(path); + type->setObjectName(n); + auto new_token = std::make_shared<NavigatorWriterToken>(type->getDescriptor(), type); + stack.push(new_token); + } -namespace armarx::aron::typeIO::writer + void NavigatorWriter::writeEndObject() + { + lastRemovedToken = stack.top(); + stack.pop(); + + if (stack.size() > 0) { + auto prevToken = stack.top(); + prevToken->addElement(lastRemovedToken->getElement()); + } + } - Path NavigatorWriter::generatePath() - { - Path path; - if (!wroteInitialStartContainer) - { - wroteInitialStartContainer = true; - } - else - { - NavigatorWriterTokenPtr parent_token = stack.top(); - path = Path(parent_token->getElement()->getPath(), parent_token->toElementAccessor()); - } - return path; - } - -#define RUN_ARON_MACRO(upperType, lowerType, capsType) \ - bool NavigatorWriter::writeStart##upperType() \ - { \ - Path path = generatePath(); \ - typenavigator::upperType##NavigatorPtr type = typenavigator::upperType##NavigatorPtr(new typenavigator::upperType##Navigator(path)); \ - NavigatorWriterTokenPtr new_token = NavigatorWriterTokenPtr(new NavigatorWriterToken(type->getDescriptor(), type)); \ - stack.push(new_token); \ - return true; \ - } \ - bool NavigatorWriter::writeEnd##upperType() \ - { \ - lastRemovedToken = stack.top(); \ - stack.pop(); \ - \ - if (stack.size() > 0) \ - { \ - NavigatorWriterTokenPtr prevToken = stack.top(); \ - prevToken->addElement(lastRemovedToken->getElement()); \ - } \ - return true; \ - } - - HANDLE_CONTAINER_TYPES -#undef RUN_ARON_MACRO - -bool NavigatorWriter::writeEigenMatrix(const std::vector<int>& dims, const std::string& t) -{ - Path path = generatePath(); - NavigatorWriterTokenPtr token = stack.top(); - typenavigator::EigenMatrixNavigatorPtr aron(new typenavigator::EigenMatrixNavigator(path)); - aron->setTypename(t); - aron->setDimensions(dims); - token->addElement(aron); - return true; -} + void NavigatorWriter::writeStartDict() + { + Path path = generatePath(); + auto type = std::make_shared<typenavigator::DictNavigator>(path); + auto new_token = std::make_shared<NavigatorWriterToken>(type->getDescriptor(), type); + stack.push(new_token); + } -bool NavigatorWriter::writeEigenQuaternion(const std::string& t) -{ - Path path = generatePath(); - NavigatorWriterTokenPtr token = stack.top(); - typenavigator::EigenQuaternionNavigatorPtr aron(new typenavigator::EigenQuaternionNavigator(path)); - aron->setTypename(t); - token->addElement(aron); - return true; -} + void NavigatorWriter::writeEndDict() + { + lastRemovedToken = stack.top(); + stack.pop(); -bool NavigatorWriter::writeIVTCByteImage(unsigned int w, unsigned int h, const std::string& t) -{ - Path path = generatePath(); - NavigatorWriterTokenPtr token = stack.top(); - typenavigator::IVTCByteImageNavigatorPtr aron(new typenavigator::IVTCByteImageNavigator(path)); - aron->setTypename(t); - aron->setWidth(w); - aron->setHeight(h); - token->addElement(aron); - return true; -} + if (stack.size() > 0) + { + auto prevToken = stack.top(); + prevToken->addElement(lastRemovedToken->getElement()); + } + } -bool NavigatorWriter::writeOpenCVMat(const std::vector<int>& dims, const std::string& t) -{ - Path path = generatePath(); - NavigatorWriterTokenPtr token = stack.top(); - typenavigator::OpenCVMatNavigatorPtr aron(new typenavigator::OpenCVMatNavigator(path)); - aron->setTypename(t); - aron->setDimensions(dims); - token->addElement(aron); - return true; -} + void NavigatorWriter::writeStartList() + { + Path path = generatePath(); + auto type = std::make_shared<typenavigator::ListNavigator>(path); + auto new_token = std::make_shared<NavigatorWriterToken>(type->getDescriptor(), type); + stack.push(new_token); + } -bool NavigatorWriter::writePCLPointCloud(unsigned int w, unsigned int h, const std::string& t) -{ - Path path = generatePath(); - NavigatorWriterTokenPtr token = stack.top(); - typenavigator::PCLPointCloudNavigatorPtr aron(new typenavigator::PCLPointCloudNavigator(path)); - aron->setTypename(t); - aron->setWidth(w); - aron->setHeight(h); - token->addElement(aron); - return true; -} + void NavigatorWriter::writeEndList() + { + lastRemovedToken = stack.top(); + stack.pop(); -bool NavigatorWriter::writePosition() -{ - Path path = generatePath(); - NavigatorWriterTokenPtr token = stack.top(); - typenavigator::PositionNavigatorPtr aron(new typenavigator::PositionNavigator(path)); - token->addElement(aron); - return true; -} + if (stack.size() > 0) + { + auto prevToken = stack.top(); + prevToken->addElement(lastRemovedToken->getElement()); + } + } -bool NavigatorWriter::writeOrientation() -{ - Path path = generatePath(); - NavigatorWriterTokenPtr token = stack.top(); - typenavigator::OrientationNavigatorPtr aron(new typenavigator::OrientationNavigator(path)); - token->addElement(aron); - return true; -} + void NavigatorWriter::writeStartTuple() + { + Path path = generatePath(); + auto type = std::make_shared<typenavigator::TupleNavigator>(path); + auto new_token = std::make_shared<NavigatorWriterToken>(type->getDescriptor(), type); + stack.push(new_token); + } -bool NavigatorWriter::writePose() -{ - Path path = generatePath(); - NavigatorWriterTokenPtr token = stack.top(); - typenavigator::PoseNavigatorPtr aron(new typenavigator::PoseNavigator(path)); - token->addElement(aron); - return true; -} + void NavigatorWriter::writeEndTuple() + { + lastRemovedToken = stack.top(); + stack.pop(); + + if (stack.size() > 0) + { + auto prevToken = stack.top(); + prevToken->addElement(lastRemovedToken->getElement()); + } + } -#define RUN_ARON_MACRO(upperType, lowerType, capsType) \ - bool NavigatorWriter::write##upperType() \ - { \ - Path path = generatePath(); \ - NavigatorWriterTokenPtr token = stack.top(); \ - typenavigator::upperType##NavigatorPtr aron(new typenavigator::upperType##Navigator(path)); \ - token->addElement(aron); \ - return true; \ + void NavigatorWriter::writeStartPair() + { + Path path = generatePath(); + auto type = std::make_shared<typenavigator::PairNavigator>(path); + auto new_token = std::make_shared<NavigatorWriterToken>(type->getDescriptor(), type); + stack.push(new_token); } - HANDLE_PRIMITIVE_TYPES -#undef RUN_ARON_MACRO + void NavigatorWriter::writeEndPair() + { + lastRemovedToken = stack.top(); + stack.pop(); + + if (stack.size() > 0) + { + auto prevToken = stack.top(); + prevToken->addElement(lastRemovedToken->getElement()); + } + } + + void NavigatorWriter::writeEigenMatrix(const std::vector<int>& dims, const std::string& t) + { + Path path = generatePath(); + NavigatorWriterTokenPtr token = stack.top(); + typenavigator::EigenMatrixNavigatorPtr aron(new typenavigator::EigenMatrixNavigator(path)); + aron->setTypename(t); + aron->setDimensions(dims); + token->addElement(aron); + } + + void NavigatorWriter::writeEigenQuaternion(const std::string& t) + { + Path path = generatePath(); + NavigatorWriterTokenPtr token = stack.top(); + typenavigator::EigenQuaternionNavigatorPtr aron(new typenavigator::EigenQuaternionNavigator(path)); + aron->setTypename(t); + token->addElement(aron); + } + + void NavigatorWriter::writeIVTCByteImage(unsigned int w, unsigned int h, const std::string& t) + { + Path path = generatePath(); + NavigatorWriterTokenPtr token = stack.top(); + typenavigator::IVTCByteImageNavigatorPtr aron(new typenavigator::IVTCByteImageNavigator(path)); + aron->setTypename(t); + aron->setWidth(w); + aron->setHeight(h); + token->addElement(aron); + } + + void NavigatorWriter::writeOpenCVMat(const std::vector<int>& dims, const std::string& t) + { + Path path = generatePath(); + NavigatorWriterTokenPtr token = stack.top(); + typenavigator::OpenCVMatNavigatorPtr aron(new typenavigator::OpenCVMatNavigator(path)); + aron->setTypename(t); + aron->setDimensions(dims); + token->addElement(aron); + } + + void NavigatorWriter::writePCLPointCloud(unsigned int w, unsigned int h, const std::string& t) + { + Path path = generatePath(); + NavigatorWriterTokenPtr token = stack.top(); + typenavigator::PCLPointCloudNavigatorPtr aron(new typenavigator::PCLPointCloudNavigator(path)); + aron->setTypename(t); + aron->setWidth(w); + aron->setHeight(h); + token->addElement(aron); + } + + void NavigatorWriter::writePosition() + { + Path path = generatePath(); + NavigatorWriterTokenPtr token = stack.top(); + typenavigator::PositionNavigatorPtr aron(new typenavigator::PositionNavigator(path)); + token->addElement(aron); + } + + void NavigatorWriter::writeOrientation() + { + Path path = generatePath(); + NavigatorWriterTokenPtr token = stack.top(); + typenavigator::OrientationNavigatorPtr aron(new typenavigator::OrientationNavigator(path)); + token->addElement(aron); + } + + void NavigatorWriter::writePose() + { + Path path = generatePath(); + NavigatorWriterTokenPtr token = stack.top(); + typenavigator::PoseNavigatorPtr aron(new typenavigator::PoseNavigator(path)); + token->addElement(aron); + } + + void NavigatorWriter::writeInt() + { + Path path = generatePath(); + NavigatorWriterTokenPtr token = stack.top(); + typenavigator::IntNavigatorPtr aron(new typenavigator::IntNavigator(path)); + token->addElement(aron); + } + + void NavigatorWriter::writeLong() + { + Path path = generatePath(); + NavigatorWriterTokenPtr token = stack.top(); + typenavigator::LongNavigatorPtr aron(new typenavigator::LongNavigator(path)); + token->addElement(aron); + } + + void NavigatorWriter::writeFloat() + { + Path path = generatePath(); + NavigatorWriterTokenPtr token = stack.top(); + typenavigator::FloatNavigatorPtr aron(new typenavigator::FloatNavigator(path)); + token->addElement(aron); + } + + void NavigatorWriter::writeDouble() + { + Path path = generatePath(); + NavigatorWriterTokenPtr token = stack.top(); + typenavigator::DoubleNavigatorPtr aron(new typenavigator::DoubleNavigator(path)); + token->addElement(aron); + } + + void NavigatorWriter::writeString() + { + Path path = generatePath(); + NavigatorWriterTokenPtr token = stack.top(); + typenavigator::StringNavigatorPtr aron(new typenavigator::StringNavigator(path)); + token->addElement(aron); + } + + void NavigatorWriter::writeBool() + { + Path path = generatePath(); + NavigatorWriterTokenPtr token = stack.top(); + typenavigator::BoolNavigatorPtr aron(new typenavigator::BoolNavigator(path)); + token->addElement(aron); + } + + void NavigatorWriter::writeTime() + { + Path path = generatePath(); + NavigatorWriterTokenPtr token = stack.top(); + typenavigator::TimeNavigatorPtr aron(new typenavigator::TimeNavigator(path)); + token->addElement(aron); + } + + void NavigatorWriter::writeKey(const std::string& k) + { + auto token = stack.top(); + token->setCurrentKey(k); + } } diff --git a/source/RobotAPI/libraries/aron/core/io/typeIO/writer/navigator/NavigatorWriter.h b/source/RobotAPI/libraries/aron/core/io/typeIO/writer/navigator/NavigatorWriter.h index 83697bd3ab2484fdd3fbaa284143348855eb721d..00b7ed96e3789deb7f72a6f370b2a8fbb9371576 100644 --- a/source/RobotAPI/libraries/aron/core/io/typeIO/writer/navigator/NavigatorWriter.h +++ b/source/RobotAPI/libraries/aron/core/io/typeIO/writer/navigator/NavigatorWriter.h @@ -25,7 +25,7 @@ #include <stack> // BaseClass -#include <RobotAPI/libraries/aron/core/io/typeIO/writer/Writer.h> +#include <RobotAPI/libraries/aron/core/io/typeIO/Writer.h> // ArmarX #include <RobotAPI/libraries/aron/core/Concepts.h> @@ -34,40 +34,55 @@ namespace armarx::aron::typeIO::writer { - class NavigatorWriter; - typedef std::shared_ptr<NavigatorWriter> NavigatorWriterPtr; + class NavigatorWriter; + typedef std::shared_ptr<NavigatorWriter> NavigatorWriterPtr; - class NavigatorWriter : - virtual public TokenizedWriter<typenavigator::NavigatorPtr, NavigatorWriterTokenPtr> - { - public: - NavigatorWriter() = default; + class NavigatorWriter : + virtual public typeIO::WriterInterface + { + public: + NavigatorWriter() = default; -#define RUN_ARON_MACRO(upperType, lowerType, capsType) \ - virtual bool writeStart##upperType() override; \ - virtual bool writeEnd##upperType() override; + virtual void writeStartObject(const std::string&) override; + virtual void writeEndObject() override; + virtual void writeStartList() override; + virtual void writeEndList() override; + virtual void writeStartDict() override; + virtual void writeEndDict() override; + virtual void writeStartTuple() override; + virtual void writeEndTuple() override; + virtual void writeStartPair() override; + virtual void writeEndPair() override; - HANDLE_CONTAINER_TYPES -#undef RUN_ARON_MACRO + virtual void writeEigenMatrix(const std::vector<int>&, const std::string&) override; + virtual void writeEigenQuaternion(const std::string&) override; + virtual void writeIVTCByteImage(unsigned int w, unsigned int h, const std::string&) override; + virtual void writeOpenCVMat(const std::vector<int>&, const std::string&) override; + virtual void writePCLPointCloud(unsigned int w, unsigned int h, const std::string&) override; + virtual void writePosition() override; + virtual void writeOrientation() override; + virtual void writePose() override; - virtual bool writeEigenMatrix(const std::vector<int>&, const std::string&) override; - virtual bool writeEigenQuaternion(const std::string&) override; - virtual bool writeIVTCByteImage(unsigned int w, unsigned int h, const std::string&) override; - virtual bool writeOpenCVMat(const std::vector<int>&, const std::string&) override; - virtual bool writePCLPointCloud(unsigned int w, unsigned int h, const std::string&) override; - virtual bool writePosition() override; - virtual bool writeOrientation() override; - virtual bool writePose() override; + virtual void writeInt() override; + virtual void writeLong() override; + virtual void writeFloat() override; + virtual void writeDouble() override; + virtual void writeString() override; + virtual void writeBool() override; + virtual void writeTime() override; -#define RUN_ARON_MACRO(upperType, lowerType, capsType) \ - virtual bool write##upperType() override; + virtual void writeKey(const std::string&) override; - HANDLE_PRIMITIVE_TYPES -#undef RUN_ARON_MACRO + typenavigator::NavigatorPtr getResult() const + { + return lastRemovedToken->getElement(); + } - private: - Path generatePath(); + private: + bool wroteInitialStartObject = false; + NavigatorWriterTokenPtr lastRemovedToken = nullptr; + std::stack<NavigatorWriterTokenPtr> stack = {}; - private: - }; + Path generatePath(); + }; } diff --git a/source/RobotAPI/libraries/aron/core/io/typeIO/writer/navigator/NavigatorWriterToken.h b/source/RobotAPI/libraries/aron/core/io/typeIO/writer/navigator/NavigatorWriterToken.h index bfc6905a6e45a21092ab6f7778aab5b0a0d94eea..20b337298c61c58e0665fb1bcf21bb54eb1d845d 100644 --- a/source/RobotAPI/libraries/aron/core/io/typeIO/writer/navigator/NavigatorWriterToken.h +++ b/source/RobotAPI/libraries/aron/core/io/typeIO/writer/navigator/NavigatorWriterToken.h @@ -33,67 +33,89 @@ namespace armarx::aron::typeIO::writer { - class NavigatorWriterToken; - typedef std::shared_ptr<NavigatorWriterToken> NavigatorWriterTokenPtr; + class NavigatorWriterToken; + typedef std::shared_ptr<NavigatorWriterToken> NavigatorWriterTokenPtr; - class NavigatorWriterToken : - virtual public WriterToken<typenavigator::NavigatorPtr, typenavigator::NavigatorPtr> - { - public: - using PointerType = NavigatorWriterTokenPtr; + class NavigatorWriterToken : + virtual public WriterTokenInterface<typenavigator::NavigatorPtr> + { + public: + using PointerType = NavigatorWriterTokenPtr; + + public: + // constructor + NavigatorWriterToken() = delete; + NavigatorWriterToken(const type::Descriptor desc, const typenavigator::NavigatorPtr& t) + { + descriptor = desc; + element = t; + } - public: - // constructor - NavigatorWriterToken() = delete; - NavigatorWriterToken(const type::Descriptor desc, const typenavigator::NavigatorPtr& t) : - io::WriterToken<type::Descriptor, typenavigator::NavigatorPtr, typenavigator::NavigatorPtr>(desc, t), - WriterToken<typenavigator::NavigatorPtr, typenavigator::NavigatorPtr>(desc, t) + // virtual member functions + virtual void addElement(const typenavigator::NavigatorPtr& n) override + { + switch (descriptor) + { + case type::eDict: { + typenavigator::DictNavigatorPtr casted = typenavigator::DictNavigator::DynamicCastAndCheck(element); + casted->setAcceptedType(n); + break; } - - // virtual member functions - virtual void addElement(const typenavigator::NavigatorPtr& n) override + case type::eList: + { + typenavigator::ListNavigatorPtr casted = typenavigator::ListNavigator::DynamicCastAndCheck(element); + casted->setAcceptedType(n); + break; + } + case type::eObject: + { + typenavigator::ObjectNavigatorPtr casted = typenavigator::ObjectNavigator::DynamicCastAndCheck(element); + casted->addMemberType(currentKey, n); + break; + } + case type::eTuple: { - switch (descriptor) - { - case type::Descriptor::eDict: - { - typenavigator::DictNavigatorPtr casted = typenavigator::DictNavigator::DynamicCastAndCheck(element); - casted->setAcceptedType(n); - break; - } - case type::Descriptor::eList: - { - typenavigator::ListNavigatorPtr casted = typenavigator::ListNavigator::DynamicCastAndCheck(element); - casted->setAcceptedType(n); - break; - } - case type::Descriptor::eObject: - { - typenavigator::ObjectNavigatorPtr casted = typenavigator::ObjectNavigator::DynamicCastAndCheck(element); - casted->addMemberType(currentKey, n); - break; - } - case type::Descriptor::eTuple: - { - typenavigator::TupleNavigatorPtr casted = typenavigator::TupleNavigator::DynamicCastAndCheck(element); - casted->addAcceptedType(n); - currentIndex++; - break; - } - default: - throw error::DescriptorNotValidException("NavigatorWriterToken", "addElement", "Could not resove a type of a navigator. Allowed are only containers. The path was: " + getElement()->pathToString(), descriptor); - } + typenavigator::TupleNavigatorPtr casted = typenavigator::TupleNavigator::DynamicCastAndCheck(element); + casted->addAcceptedType(n); + currentIndex++; + break; } + case type::ePair: + { + typenavigator::PairNavigatorPtr casted = typenavigator::PairNavigator::DynamicCastAndCheck(element); + casted->addAcceptedType(n); + currentIndex++; + break; + } + default: + throw error::DescriptorNotValidException("NavigatorWriterToken", "addElement", "Could not resove a type of a navigator. Allowed are only containers. The path was: " + getElement()->pathToString(), descriptor); + } + } - virtual void setObjectName(const std::string& n) override + + virtual void setName(const std::string& n) override + { + switch (descriptor) + { + case type::eObject: { - if (descriptor != type::Descriptor::eObject) - { - throw error::DescriptorNotValidException("NavigatorWriterToken", "setName", "Cant set the name of a non-object token. The path was: " + getElement()->pathToString(), descriptor); - } typenavigator::ObjectNavigatorPtr casted = typenavigator::ObjectNavigator::DynamicCast(element); casted->setObjectName(n); + break; } - }; + case type::eIntEnum: + { + typenavigator::IntEnumNavigatorPtr casted = typenavigator::IntEnumNavigator::DynamicCast(element); + casted->setEnumName(n); + break; + } + default: + throw error::DescriptorNotValidException("NavigatorWriterToken", "setName", "Cant set the name of a non-object or non-enum token. The path was: " + getElement()->pathToString(), descriptor); + + } + } + + private: + }; } diff --git a/source/RobotAPI/libraries/aron/core/io/typeIO/writer/nlohmannJSON/NlohmannJSONWriter.cpp b/source/RobotAPI/libraries/aron/core/io/typeIO/writer/nlohmannJSON/NlohmannJSONWriter.cpp index a3a18a83122d9d0ba3df79eabccd4d244bad9f04..187c648096a0fa0e3c9e3b406b1dbc4a7f0b1dcf 100644 --- a/source/RobotAPI/libraries/aron/core/io/typeIO/writer/nlohmannJSON/NlohmannJSONWriter.cpp +++ b/source/RobotAPI/libraries/aron/core/io/typeIO/writer/nlohmannJSON/NlohmannJSONWriter.cpp @@ -24,121 +24,229 @@ #include "NlohmannJSONWriter.h" namespace armarx::aron::typeIO::writer - { -#define RUN_ARON_MACRO(upperType, lowerType, capsType) \ - bool NlohmannJSONWriter::writeStart##upperType() \ - { \ - nlohmann::json data; \ - NlohmannJSONWriterTokenPtr new_token = NlohmannJSONWriterTokenPtr(new NlohmannJSONWriterToken(type::Descriptor::e##upperType, data)); \ - stack.push(new_token); \ - return true; \ - } \ - bool NlohmannJSONWriter::writeEnd##upperType() \ - { \ - lastRemovedToken = stack.top(); \ - stack.pop(); \ - \ - if (stack.size() > 0) \ - { \ - NlohmannJSONWriterTokenPtr prevToken = stack.top(); \ - prevToken->addElement(lastRemovedToken->getElement()); \ - } \ - return true; \ - } - - HANDLE_CONTAINER_TYPES -#undef RUN_ARON_MACRO - -bool NlohmannJSONWriter::writeEigenMatrix(const std::vector<int>& dims, const std::string& t) { - NlohmannJSONWriterTokenPtr token = stack.top(); - nlohmann::json j; - j[io::Data::READER_WRITER_NDARRAY_NAME_SLUG] = "EigenMatrix"; - j[io::Data::READER_WRITER_NDARRAY_DIMENSIONS_SLUG] = dims; - j[io::Data::READER_WRITER_NDARRAY_TYPE_SLUG] = t; - token->addElement(j); - return true; -} -bool NlohmannJSONWriter::writeEigenQuaternion(const std::string& t) -{ - NlohmannJSONWriterTokenPtr token = stack.top(); - nlohmann::json j; - j[io::Data::READER_WRITER_NDARRAY_NAME_SLUG] = "EigenQuaternion"; - j[io::Data::READER_WRITER_NDARRAY_TYPE_SLUG] = t; - token->addElement(j); - return true; -} + void NlohmannJSONWriter::writeStartObject(const std::string& n) + { + nlohmann::json data; + data[io::Data::READER_WRITER_NAME_SLUG] = n; + auto new_token = std::make_shared<NlohmannJSONWriterToken>(type::Descriptor::eList, data); + stack.push(new_token); + } -bool NlohmannJSONWriter::writeIVTCByteImage(unsigned int w, unsigned int h, const std::string& t) -{ - NlohmannJSONWriterTokenPtr token = stack.top(); - nlohmann::json j; - j[io::Data::READER_WRITER_NDARRAY_NAME_SLUG] = "IVTCByteImage"; - j[io::Data::READER_WRITER_NDARRAY_DIMENSIONS_SLUG] = {w, h}; - j[io::Data::READER_WRITER_NDARRAY_TYPE_SLUG] = t; - token->addElement(j); - return true; -} + void NlohmannJSONWriter::writeEndObject() + { + lastRemovedToken = stack.top(); + stack.pop(); -bool NlohmannJSONWriter::writeOpenCVMat(const std::vector<int>& dims, const std::string& t) -{ - NlohmannJSONWriterTokenPtr token = stack.top(); - nlohmann::json j; - j[io::Data::READER_WRITER_NDARRAY_NAME_SLUG] = "OpenCVMat"; - j[io::Data::READER_WRITER_NDARRAY_DIMENSIONS_SLUG] = dims; - j[io::Data::READER_WRITER_NDARRAY_TYPE_SLUG] = t; - token->addElement(j); - return true; -} + if (stack.size() > 0) + { + NlohmannJSONWriterTokenPtr prevToken = stack.top(); + prevToken->addElement(lastRemovedToken->getElement()); + } + } -bool NlohmannJSONWriter::writePCLPointCloud(unsigned int w, unsigned int h, const std::string& t) -{ - NlohmannJSONWriterTokenPtr token = stack.top(); - nlohmann::json j; - j[io::Data::READER_WRITER_NDARRAY_NAME_SLUG] = "PCLPointCloud"; - j[io::Data::READER_WRITER_NDARRAY_DIMENSIONS_SLUG] = {w, h}; - j[io::Data::READER_WRITER_NDARRAY_TYPE_SLUG] = t; - token->addElement(j); - return true; -} + void NlohmannJSONWriter::writeStartList() + { + nlohmann::json data; + auto new_token = std::make_shared<NlohmannJSONWriterToken>(type::Descriptor::eList, data); + stack.push(new_token); + } -bool NlohmannJSONWriter::writePosition() -{ - NlohmannJSONWriterTokenPtr token = stack.top(); - nlohmann::json j; - j[io::Data::READER_WRITER_NDARRAY_NAME_SLUG] = "Position"; - token->addElement(j); - return true; -} + void NlohmannJSONWriter::writeEndList() + { + lastRemovedToken = stack.top(); + stack.pop(); -bool NlohmannJSONWriter::writeOrientation() -{ - NlohmannJSONWriterTokenPtr token = stack.top(); - nlohmann::json j; - j[io::Data::READER_WRITER_NDARRAY_NAME_SLUG] = "Orientation"; - token->addElement(j); - return true; -} + if (stack.size() > 0) + { + NlohmannJSONWriterTokenPtr prevToken = stack.top(); + prevToken->addElement(lastRemovedToken->getElement()); + } + } -bool NlohmannJSONWriter::writePose() -{ - NlohmannJSONWriterTokenPtr token = stack.top(); - nlohmann::json j; - j[io::Data::READER_WRITER_NDARRAY_NAME_SLUG] = "Pose"; - token->addElement(j); - return true; -} + void NlohmannJSONWriter::writeStartDict() + { + nlohmann::json data; + auto new_token = std::make_shared<NlohmannJSONWriterToken>(type::Descriptor::eList, data); + stack.push(new_token); + } + + void NlohmannJSONWriter::writeEndDict() + { + lastRemovedToken = stack.top(); + stack.pop(); + + if (stack.size() > 0) + { + NlohmannJSONWriterTokenPtr prevToken = stack.top(); + prevToken->addElement(lastRemovedToken->getElement()); + } + } + + void NlohmannJSONWriter::writeStartTuple() + { + nlohmann::json data; + auto new_token = std::make_shared<NlohmannJSONWriterToken>(type::Descriptor::eList, data); + stack.push(new_token); + } + + void NlohmannJSONWriter::writeEndTuple() + { + lastRemovedToken = stack.top(); + stack.pop(); + + if (stack.size() > 0) + { + NlohmannJSONWriterTokenPtr prevToken = stack.top(); + prevToken->addElement(lastRemovedToken->getElement()); + } + } + + void NlohmannJSONWriter::writeStartPair() + { + nlohmann::json data; + auto new_token = std::make_shared<NlohmannJSONWriterToken>(type::Descriptor::eList, data); + stack.push(new_token); + } + + void NlohmannJSONWriter::writeEndPair() + { + lastRemovedToken = stack.top(); + stack.pop(); + + if (stack.size() > 0) + { + NlohmannJSONWriterTokenPtr prevToken = stack.top(); + prevToken->addElement(lastRemovedToken->getElement()); + } + } + + void NlohmannJSONWriter::writeEigenMatrix(const std::vector<int>& dims, const std::string& t) + { + auto token = stack.top(); + nlohmann::json j; + j[io::Data::READER_WRITER_NDARRAY_NAME_SLUG] = "EigenMatrix"; + j[io::Data::READER_WRITER_NDARRAY_DIMENSIONS_SLUG] = dims; + j[io::Data::READER_WRITER_NDARRAY_TYPE_SLUG] = t; + token->addElement(j); + } + + void NlohmannJSONWriter::writeEigenQuaternion(const std::string& t) + { + auto token = stack.top(); + nlohmann::json j; + j[io::Data::READER_WRITER_NDARRAY_NAME_SLUG] = "EigenQuaternion"; + j[io::Data::READER_WRITER_NDARRAY_TYPE_SLUG] = t; + token->addElement(j); + } + + void NlohmannJSONWriter::writeIVTCByteImage(unsigned int w, unsigned int h, const std::string& t) + { + auto token = stack.top(); + nlohmann::json j; + j[io::Data::READER_WRITER_NDARRAY_NAME_SLUG] = "IVTCByteImage"; + j[io::Data::READER_WRITER_NDARRAY_DIMENSIONS_SLUG] = {w, h}; + j[io::Data::READER_WRITER_NDARRAY_TYPE_SLUG] = t; + token->addElement(j); + } + + void NlohmannJSONWriter::writeOpenCVMat(const std::vector<int>& dims, const std::string& t) + { + auto token = stack.top(); + nlohmann::json j; + j[io::Data::READER_WRITER_NDARRAY_NAME_SLUG] = "OpenCVMat"; + j[io::Data::READER_WRITER_NDARRAY_DIMENSIONS_SLUG] = dims; + j[io::Data::READER_WRITER_NDARRAY_TYPE_SLUG] = t; + token->addElement(j); + } + + void NlohmannJSONWriter::writePCLPointCloud(unsigned int w, unsigned int h, const std::string& t) + { + auto token = stack.top(); + nlohmann::json j; + j[io::Data::READER_WRITER_NDARRAY_NAME_SLUG] = "PCLPointCloud"; + j[io::Data::READER_WRITER_NDARRAY_DIMENSIONS_SLUG] = {w, h}; + j[io::Data::READER_WRITER_NDARRAY_TYPE_SLUG] = t; + token->addElement(j); + } + + void NlohmannJSONWriter::writePosition() + { + auto token = stack.top(); + nlohmann::json j; + j[io::Data::READER_WRITER_NDARRAY_NAME_SLUG] = "Position"; + token->addElement(j); + } -#define RUN_ARON_MACRO(upperType, lowerType, capsType) \ - bool NlohmannJSONWriter::write##upperType() \ - { \ - NlohmannJSONWriterTokenPtr token = stack.top(); \ - nlohmann::json j(io::Data::READER_WRITER_##capsType##_TYPENAME_SLUG); \ - token->addElement(j); \ - return true; \ + void NlohmannJSONWriter::writeOrientation() + { + auto token = stack.top(); + nlohmann::json j; + j[io::Data::READER_WRITER_NDARRAY_NAME_SLUG] = "Orientation"; + token->addElement(j); } - HANDLE_PRIMITIVE_TYPES -#undef RUN_ARON_MACRO + void NlohmannJSONWriter::writePose() + { + auto token = stack.top(); + nlohmann::json j; + j[io::Data::READER_WRITER_NDARRAY_NAME_SLUG] = "Pose"; + token->addElement(j); + } + + void NlohmannJSONWriter::writeInt() + { + auto token = stack.top(); + nlohmann::json j(io::Data::READER_WRITER_INT_TYPENAME_SLUG); + token->addElement(j); + } + + void NlohmannJSONWriter::writeLong() + { + auto token = stack.top(); + nlohmann::json j(io::Data::READER_WRITER_LONG_TYPENAME_SLUG); + token->addElement(j); + } + + void NlohmannJSONWriter::writeFloat() + { + auto token = stack.top(); + nlohmann::json j(io::Data::READER_WRITER_FLOAT_TYPENAME_SLUG); + token->addElement(j); + } + + void NlohmannJSONWriter::writeDouble() + { + auto token = stack.top(); + nlohmann::json j(io::Data::READER_WRITER_DOUBLE_TYPENAME_SLUG); + token->addElement(j); + } + + void NlohmannJSONWriter::writeString() + { + auto token = stack.top(); + nlohmann::json j(io::Data::READER_WRITER_STRING_TYPENAME_SLUG); + token->addElement(j); + } + + void NlohmannJSONWriter::writeBool() + { + auto token = stack.top(); + nlohmann::json j(io::Data::READER_WRITER_BOOL_TYPENAME_SLUG); + token->addElement(j); + } + + void NlohmannJSONWriter::writeTime() + { + auto token = stack.top(); + nlohmann::json j(io::Data::READER_WRITER_TIME_TYPENAME_SLUG); + token->addElement(j); + } + + void NlohmannJSONWriter::writeKey(const std::string& k) + { + auto token = stack.top(); + token->setCurrentKey(k); + } } diff --git a/source/RobotAPI/libraries/aron/core/io/typeIO/writer/nlohmannJSON/NlohmannJSONWriter.h b/source/RobotAPI/libraries/aron/core/io/typeIO/writer/nlohmannJSON/NlohmannJSONWriter.h index b200765cdf3b7d8aadaf0bba9d871abe36a103b6..7826f895e8e9fec9f3a98a12413ed1f39d12a9e9 100644 --- a/source/RobotAPI/libraries/aron/core/io/typeIO/writer/nlohmannJSON/NlohmannJSONWriter.h +++ b/source/RobotAPI/libraries/aron/core/io/typeIO/writer/nlohmannJSON/NlohmannJSONWriter.h @@ -26,43 +26,60 @@ #include <sstream> // Base Class -#include <RobotAPI/libraries/aron/core/io/typeIO/writer/Writer.h> +#include <RobotAPI/libraries/aron/core/io/typeIO/Writer.h> // ArmarX #include <RobotAPI/libraries/aron/core/Concepts.h> #include <RobotAPI/libraries/aron/core/io/typeIO/writer/nlohmannJSON/NlohmannJSONWriterToken.h> namespace armarx::aron::typeIO::writer - { - class NlohmannJSONWriter : - virtual public TokenizedWriter<nlohmann::json, NlohmannJSONWriterTokenPtr> - { - public: - NlohmannJSONWriter() = default; +{ + class NlohmannJSONWriter : + virtual public WriterInterface + { + public: + NlohmannJSONWriter() = default; -#define RUN_ARON_MACRO(upperType, lowerType, capsType) \ - virtual bool writeStart##upperType() override; \ - virtual bool writeEnd##upperType() override; + virtual void writeStartObject(const std::string&) override; + virtual void writeEndObject() override; + virtual void writeStartList() override; + virtual void writeEndList() override; + virtual void writeStartDict() override; + virtual void writeEndDict() override; + virtual void writeStartTuple() override; + virtual void writeEndTuple() override; + virtual void writeStartPair() override; + virtual void writeEndPair() override; - HANDLE_CONTAINER_TYPES -#undef RUN_ARON_MACRO + virtual void writeEigenMatrix(const std::vector<int>&, const std::string&) override; + virtual void writeEigenQuaternion(const std::string&) override; + virtual void writeIVTCByteImage(unsigned int w, unsigned int h, const std::string&) override; + virtual void writeOpenCVMat(const std::vector<int>&, const std::string&) override; + virtual void writePCLPointCloud(unsigned int w, unsigned int h, const std::string&) override; + virtual void writePosition() override; + virtual void writeOrientation() override; + virtual void writePose() override; - virtual bool writeEigenMatrix(const std::vector<int>&, const std::string&) override; - virtual bool writeEigenQuaternion(const std::string&) override; - virtual bool writeIVTCByteImage(unsigned int w, unsigned int h, const std::string&) override; - virtual bool writeOpenCVMat(const std::vector<int>&, const std::string&) override; - virtual bool writePCLPointCloud(unsigned int w, unsigned int h, const std::string&) override; - virtual bool writePosition() override; - virtual bool writeOrientation() override; - virtual bool writePose() override; + virtual void writeInt() override; + virtual void writeLong() override; + virtual void writeFloat() override; + virtual void writeDouble() override; + virtual void writeString() override; + virtual void writeBool() override; + virtual void writeTime() override; -#define RUN_ARON_MACRO(upperType, lowerType, capsType) \ - virtual bool write##upperType() override; + virtual void writeKey(const std::string&) override; - HANDLE_PRIMITIVE_TYPES -#undef RUN_ARON_MACRO + nlohmann::json getResult() const + { + return lastRemovedToken->getElement(); + } - private: + private: + bool wroteInitialStartObject = false; + NlohmannJSONWriterTokenPtr lastRemovedToken = nullptr; + std::stack<NlohmannJSONWriterTokenPtr> stack = {}; - }; + Path generatePath(); + }; } diff --git a/source/RobotAPI/libraries/aron/core/io/typeIO/writer/nlohmannJSON/NlohmannJSONWriterToken.h b/source/RobotAPI/libraries/aron/core/io/typeIO/writer/nlohmannJSON/NlohmannJSONWriterToken.h index e6c5a10753697202e46076059ad3dc2e7e8495e2..826524dddcd7c6a7d2e8bf7919240bb7d1b109b0 100644 --- a/source/RobotAPI/libraries/aron/core/io/typeIO/writer/nlohmannJSON/NlohmannJSONWriterToken.h +++ b/source/RobotAPI/libraries/aron/core/io/typeIO/writer/nlohmannJSON/NlohmannJSONWriterToken.h @@ -32,68 +32,78 @@ // ArmarX #include <RobotAPI/libraries/aron/core/Config.h> +#include <RobotAPI/libraries/aron/core/Descriptor.h> namespace armarx::aron::typeIO::writer +{ + class NlohmannJSONWriterToken; + typedef std::shared_ptr<NlohmannJSONWriterToken> NlohmannJSONWriterTokenPtr; + + class NlohmannJSONWriterToken : + virtual public WriterTokenInterface<nlohmann::json> + { + public: + using PointerType = NlohmannJSONWriterTokenPtr; + + public: + // constructor + NlohmannJSONWriterToken() = delete; + NlohmannJSONWriterToken(const type::Descriptor desc, const nlohmann::json& t) { - class NlohmannJSONWriterToken; - typedef std::shared_ptr<NlohmannJSONWriterToken> NlohmannJSONWriterTokenPtr; + descriptor = desc; + element = t; + } - class NlohmannJSONWriterToken : - virtual public WriterToken<nlohmann::json, nlohmann::json> + // virtual member functions + virtual void addElement(const nlohmann::json& n) override + { + auto desc = getDescriptor(); + switch (desc) { - public: - using PointerType = NlohmannJSONWriterTokenPtr; - - public: - // constructor - NlohmannJSONWriterToken() = delete; - NlohmannJSONWriterToken(const type::Descriptor desc, const nlohmann::json& t) : - io::WriterToken<type::Descriptor, nlohmann::json, nlohmann::json>(desc, t), - WriterToken<nlohmann::json, nlohmann::json>(desc, t) + case type::Descriptor::eDict: { + element[io::Data::READER_WRITER_DICT_ACCEPTED_TYPE_SLUG] = n; + break; } - - // virtual member functions - virtual void addElement(const nlohmann::json& n) override + case type::Descriptor::eList: { - auto desc = getDescriptor(); - switch (desc) - { - case type::Descriptor::eDict: - { - element[io::Data::READER_WRITER_DICT_ACCEPTED_TYPE_SLUG] = n; - break; - } - case type::Descriptor::eList: - { - element[io::Data::READER_WRITER_LIST_ACCEPTED_TYPE_SLUG] = n; - break; - } - case type::Descriptor::eObject: - { - element[currentKey] = n; - break; - } - case type::Descriptor::eTuple: - { - element.push_back(n); - break; - } - default: - throw error::DescriptorNotValidException("NlohmannJSONWriterToken", "addElement", "Could not resove a type of a navigator. Allowed are only containers.", desc); - } + element[io::Data::READER_WRITER_LIST_ACCEPTED_TYPE_SLUG] = n; + break; } - - - // name functions - void setObjectName(const std::string& n) override + case type::Descriptor::eObject: { - auto desc = getDescriptor(); - if (desc != type::Descriptor::eObject) - { - throw error::DescriptorNotValidException("NlohmannJSONWriterToken", "setName", "Cant set the name of a non-object token.", desc); - } - element[io::Data::READER_WRITER_OBJECT_NAME_SLUG] = n; + element[currentKey] = n; + break; } - }; + case type::Descriptor::eTuple: + { + element.push_back(n); + break; + } + default: + throw error::DescriptorNotValidException("NlohmannJSONWriterToken", "addElement", "Could not resove a type of a navigator. Allowed are only containers.", desc); + } + } + + void setName(const std::string& n) override + { + auto desc = getDescriptor(); + if (desc != type::Descriptor::eObject) + { + throw error::DescriptorNotValidException("NlohmannJSONWriterToken", "setName", "Cant set the name of a non-object token.", desc); + } + element[io::Data::READER_WRITER_NAME_SLUG] = n; + } + + private: + // members + type::Descriptor descriptor; + nlohmann::json element; + + // current index + unsigned int currentIndex; + + // current key + std::string currentKey; + }; } diff --git a/source/RobotAPI/libraries/aron/core/navigator/type/container/Dict.cpp b/source/RobotAPI/libraries/aron/core/navigator/type/container/Dict.cpp index f1d5285a7e39b09cf8a3cdcd05aa681bed007a84..fd14e22ead4f1610d4f4faf4d065396f850496bc 100644 --- a/source/RobotAPI/libraries/aron/core/navigator/type/container/Dict.cpp +++ b/source/RobotAPI/libraries/aron/core/navigator/type/container/Dict.cpp @@ -26,70 +26,76 @@ namespace armarx::aron::typenavigator - { - // constructors - DictNavigator::DictNavigator(const Path& path) : - aron::Navigator<type::Descriptor, type::AronType>::Navigator(type::Descriptor::eDict, path), - Navigator(type::Descriptor::eDict, path), - type(new type::AronDict()) - { +{ + // constructors + DictNavigator::DictNavigator(const Path& path) : + aron::Navigator<type::Descriptor, type::AronType>::Navigator(type::Descriptor::eDict, path), + Navigator(type::Descriptor::eDict, path), + type(new type::AronDict()) + { - } + } - DictNavigator::DictNavigator(const type::AronDictPtr& o, const Path& path) : - aron::Navigator<type::Descriptor, type::AronType>::Navigator(type::Descriptor::eDict, path), - Navigator(type::Descriptor::eDict, path), - type(o) - { - CheckAronPtrForNull("DictNavigator", "DictNavigator", getPath(), o); - acceptedType = FromAronType(o->acceptedType); - } + DictNavigator::DictNavigator(const type::AronDictPtr& o, const Path& path) : + aron::Navigator<type::Descriptor, type::AronType>::Navigator(type::Descriptor::eDict, path), + Navigator(type::Descriptor::eDict, path), + type(o) + { + CheckAronPtrForNull("DictNavigator", "DictNavigator", getPath(), o); + acceptedType = FromAronType(o->acceptedType); + } - NavigatorPtr DictNavigator::getAcceptedType() const - { - return acceptedType; - } + NavigatorPtr DictNavigator::getAcceptedType() const + { + return acceptedType; + } - void DictNavigator::setAcceptedType(const NavigatorPtr& a) - { - type->acceptedType = a->getResult(); - acceptedType = a; - } + void DictNavigator::setAcceptedType(const NavigatorPtr& a) + { + type->acceptedType = a->getResult(); + acceptedType = a; + } - // static methods - DictNavigatorPtr DictNavigator::DynamicCast(const NavigatorPtr& n) - { - return std::dynamic_pointer_cast<DictNavigator>(n); - } + type::AronDictPtr DictNavigator::toAronDictPtr() const + { + CheckAronPtrForNull("DictNavigator", "getResult", getPath(), type->acceptedType); + return type; + } - DictNavigatorPtr DictNavigator::DynamicCastAndCheck(const NavigatorPtr& n) - { - CheckTypeNavigatorPtrForNull("DictNavigator", "DynamicCastAndCheck[Before]", n); - DictNavigatorPtr casted = DictNavigator::DynamicCast(n); - CheckTypeNavigatorPtrForNull("DictNavigator", "DynamicCastAndCheck[After]", n->getPath(), casted); - return casted; - } + // static methods + DictNavigatorPtr DictNavigator::DynamicCast(const NavigatorPtr& n) + { + return std::dynamic_pointer_cast<DictNavigator>(n); + } - // virtual implementations - std::vector<NavigatorPtr> DictNavigator::getChildren() const - { - return {acceptedType}; - } + DictNavigatorPtr DictNavigator::DynamicCastAndCheck(const NavigatorPtr& n) + { + CheckTypeNavigatorPtrForNull("DictNavigator", "DynamicCastAndCheck[Before]", n); + DictNavigatorPtr casted = DictNavigator::DynamicCast(n); + CheckTypeNavigatorPtrForNull("DictNavigator", "DynamicCastAndCheck[After]", n->getPath(), casted); + return casted; + } - size_t DictNavigator::childrenSize() const - { - return 1; - } + // virtual implementations + std::vector<NavigatorPtr> DictNavigator::getChildren() const + { + return {acceptedType}; + } - type::AronTypePtr DictNavigator::getResult() const - { - CheckAronPtrForNull("DictNavigator", "getResult", getPath(), type->acceptedType); - return type; - } + size_t DictNavigator::childrenSize() const + { + return 1; + } - std::string DictNavigator::getName() const - { - return "AronDictType<" + acceptedType->getName() + ">"; - } + type::AronTypePtr DictNavigator::getResult() const + { + CheckAronPtrForNull("DictNavigator", "getResult", getPath(), type->acceptedType); + return type; + } + + std::string DictNavigator::getName() const + { + return "AronDictType<" + acceptedType->getName() + ">"; + } } diff --git a/source/RobotAPI/libraries/aron/core/navigator/type/container/List.cpp b/source/RobotAPI/libraries/aron/core/navigator/type/container/List.cpp index 0e51b074c31b94734cdcf84b5d58ede8c66def4e..3e87c4d5fbbc7879299e9da5f20d7a2086d87465 100644 --- a/source/RobotAPI/libraries/aron/core/navigator/type/container/List.cpp +++ b/source/RobotAPI/libraries/aron/core/navigator/type/container/List.cpp @@ -25,77 +25,75 @@ #include "List.h" namespace armarx::aron::typenavigator - { - // constructors - ListNavigator::ListNavigator(const Path& path) : - aron::Navigator<type::Descriptor, type::AronType>::Navigator(type::Descriptor::eList, path), - Navigator(type::Descriptor::eList, path), - type(new type::AronList()) - { - } +{ + // constructors + ListNavigator::ListNavigator(const Path& path) : + aron::Navigator<type::Descriptor, type::AronType>::Navigator(type::Descriptor::eList, path), + Navigator(type::Descriptor::eList, path), + type(new type::AronList()) + { + } - ListNavigator::ListNavigator(const type::AronListPtr& o, const Path& path) : - aron::Navigator<type::Descriptor, type::AronType>::Navigator(type::Descriptor::eList, path), - Navigator(type::Descriptor::eList, path), - type(o) - { - CheckAronPtrForNull("ListNavigator", "ListNavigator", getPath(), o); - acceptedType = FromAronType(o->acceptedType); - } + ListNavigator::ListNavigator(const type::AronListPtr& o, const Path& path) : + aron::Navigator<type::Descriptor, type::AronType>::Navigator(type::Descriptor::eList, path), + Navigator(type::Descriptor::eList, path), + type(o) + { + CheckAronPtrForNull("ListNavigator", "ListNavigator", getPath(), o); + acceptedType = FromAronType(o->acceptedType); + } - // Member functions - NavigatorPtr ListNavigator::getAcceptedType() const - { - return acceptedType; - } + // Member functions + NavigatorPtr ListNavigator::getAcceptedType() const + { + return acceptedType; + } - void ListNavigator::setAcceptedType(const NavigatorPtr& a) - { - CheckTypeNavigatorPtrForNull("ListNavigator", "setAcceptedType", a); - type->acceptedType = a->getResult(); - acceptedType = a; - } + void ListNavigator::setAcceptedType(const NavigatorPtr& a) + { + CheckTypeNavigatorPtrForNull("ListNavigator", "setAcceptedType", a); + type->acceptedType = a->getResult(); + acceptedType = a; + } - // static methods - ListNavigatorPtr ListNavigator::DynamicCast(const NavigatorPtr& n) - { - return std::dynamic_pointer_cast<ListNavigator>(n); - } + // static methods + ListNavigatorPtr ListNavigator::DynamicCast(const NavigatorPtr& n) + { + return std::dynamic_pointer_cast<ListNavigator>(n); + } - ListNavigatorPtr ListNavigator::DynamicCastAndCheck(const NavigatorPtr& n) - { - CheckTypeNavigatorPtrForNull("ListNavigator", "DynamicCast[Before]", n); - ListNavigatorPtr casted = ListNavigator::DynamicCast(n); - CheckTypeNavigatorPtrForNull("ListNavigator", "DynamicCast[After]", n->getPath(), casted); - return casted; - } + ListNavigatorPtr ListNavigator::DynamicCastAndCheck(const NavigatorPtr& n) + { + CheckTypeNavigatorPtrForNull("ListNavigator", "DynamicCast[Before]", n); + ListNavigatorPtr casted = ListNavigator::DynamicCast(n); + CheckTypeNavigatorPtrForNull("ListNavigator", "DynamicCast[After]", n->getPath(), casted); + return casted; + } - type::AronListPtr ListNavigator::toAronListPtr() const - { - CheckAronPtrForNull("ListNavigator", "getCastedResult", getPath(), type->acceptedType); - return type; - } + type::AronListPtr ListNavigator::toAronListPtr() const + { + CheckAronPtrForNull("ListNavigator", "getCastedResult", getPath(), type->acceptedType); + return type; + } - // virtual implementations - std::vector<NavigatorPtr> ListNavigator::getChildren() const - { - return {acceptedType}; - } + // virtual implementations + std::vector<NavigatorPtr> ListNavigator::getChildren() const + { + return {acceptedType}; + } - size_t ListNavigator::childrenSize() const - { - return 1; - } - - type::AronTypePtr ListNavigator::getResult() const - { - return toAronListPtr(); - } - - std::string ListNavigator::getName() const - { - return "AronListType<" + acceptedType->getName() + ">"; - } + size_t ListNavigator::childrenSize() const + { + return 1; + } + type::AronTypePtr ListNavigator::getResult() const + { + return toAronListPtr(); + } + std::string ListNavigator::getName() const + { + return "AronListType<" + acceptedType->getName() + ">"; + } } diff --git a/source/RobotAPI/libraries/aron/core/navigator/type/container/Pair.cpp b/source/RobotAPI/libraries/aron/core/navigator/type/container/Pair.cpp index 0e8a8347c56c18093fac3481bf83baa55e5ee7ef..60e8947d4f9876b61c42add47979921e33395567 100644 --- a/source/RobotAPI/libraries/aron/core/navigator/type/container/Pair.cpp +++ b/source/RobotAPI/libraries/aron/core/navigator/type/container/Pair.cpp @@ -26,91 +26,110 @@ namespace armarx::aron::typenavigator +{ + // constructors + PairNavigator::PairNavigator(const Path& path) : + aron::Navigator<type::Descriptor, type::AronType>::Navigator(type::Descriptor::ePair, path), + Navigator(type::Descriptor::ePair, path), + type(new type::AronPair()) + { + + } + + PairNavigator::PairNavigator(const type::AronPairPtr& o, const Path& path) : + aron::Navigator<type::Descriptor, type::AronType>::Navigator(type::Descriptor::ePair, path), + Navigator(type::Descriptor::ePair, path), + type(o) + { + CheckAronPtrForNull("AronPairTypeNavigator", "AronPairTypeNavigator", getPath(), o); + + acceptedType1 = FromAronType(o->acceptedType1); + acceptedType2 = FromAronType(o->acceptedType2); + } + + // Member functions + std::pair<NavigatorPtr, NavigatorPtr> PairNavigator::getAcceptedTypes() const + { + return {acceptedType1, acceptedType2}; + } + + NavigatorPtr PairNavigator::getFirstAcceptedType() const + { + return acceptedType1; + } + + NavigatorPtr PairNavigator::getSecondAcceptedType() const + { + return acceptedType2; + } + + void PairNavigator::addAcceptedType(const NavigatorPtr& n) + { + if (acceptedType1 == nullptr) { - // constructors - PairNavigator::PairNavigator(const Path& path) : - aron::Navigator<type::Descriptor, type::AronType>::Navigator(type::Descriptor::ePair, path), - Navigator(type::Descriptor::ePair, path), - type(new type::AronPair()) - { - - } - - PairNavigator::PairNavigator(const type::AronPairPtr& o, const Path& path) : - aron::Navigator<type::Descriptor, type::AronType>::Navigator(type::Descriptor::ePair, path), - Navigator(type::Descriptor::ePair, path), - type(o) - { - CheckAronPtrForNull("AronPairTypeNavigator", "AronPairTypeNavigator", getPath(), o); - - acceptedType1 = FromAronType(o->acceptedType1); - acceptedType2 = FromAronType(o->acceptedType2); - } - - // Member functions - std::pair<NavigatorPtr, NavigatorPtr> PairNavigator::getAcceptedTypes() const - { - return {acceptedType1, acceptedType2}; - } - - NavigatorPtr PairNavigator::getFirstAcceptedType() const - { - return acceptedType1; - } - - NavigatorPtr PairNavigator::getSecondAcceptedType() const - { - return acceptedType2; - } - - void PairNavigator::setFirstAcceptedType(const NavigatorPtr& n) - { - acceptedType1 = n; - } - - void PairNavigator::setSecondAcceptedType(const NavigatorPtr& n) - { - acceptedType2 = n; - } - - type::AronPairPtr PairNavigator::toAronPairPtr() const - { - return type; - } - - // static methods - PairNavigatorPtr PairNavigator::DynamicCast(const NavigatorPtr& n) - { - return std::dynamic_pointer_cast<PairNavigator>(n); - } - - PairNavigatorPtr PairNavigator::DynamicCastAndCheck(const NavigatorPtr& n) - { - CheckTypeNavigatorPtrForNull("AronPairTypeNavigator", "DynamicCastAndCheck[Before]", n); - PairNavigatorPtr casted = PairNavigator::DynamicCast(n); - CheckTypeNavigatorPtrForNull("AronPairTypeNavigator", "DynamicCastAndCheck[After]", n->getPath(), casted); - return casted; - } - - // virtual implementations - std::vector<NavigatorPtr> PairNavigator::getChildren() const - { - return {acceptedType1, acceptedType2}; - } - - size_t PairNavigator::childrenSize() const - { - return 2; - } - - type::AronTypePtr PairNavigator::getResult() const - { - return type; - } - - std::string PairNavigator::getName() const - { - return "AronPairType<" + acceptedType1->getName() + ", " + acceptedType2->getName() + ">"; - } + acceptedType1 = n; + return; + } + if (acceptedType2 == nullptr) + { + acceptedType2 = n; + return; + } + throw error::AronException("PairNavigator", "addAcceptedType", "Both types are already set", getPath()); + } + + void PairNavigator::setFirstAcceptedType(const NavigatorPtr& n) + { + acceptedType1 = n; + } + + void PairNavigator::setSecondAcceptedType(const NavigatorPtr& n) + { + acceptedType2 = n; + } + + type::AronPairPtr PairNavigator::toAronPairPtr() const + { + CheckAronPtrForNull("PairNavigator", "getResult", getPath(), type->acceptedType1); + CheckAronPtrForNull("PairNavigator", "getResult", getPath(), type->acceptedType2); + return type; + } + + // static methods + PairNavigatorPtr PairNavigator::DynamicCast(const NavigatorPtr& n) + { + return std::dynamic_pointer_cast<PairNavigator>(n); + } + + PairNavigatorPtr PairNavigator::DynamicCastAndCheck(const NavigatorPtr& n) + { + CheckTypeNavigatorPtrForNull("AronPairTypeNavigator", "DynamicCastAndCheck[Before]", n); + PairNavigatorPtr casted = PairNavigator::DynamicCast(n); + CheckTypeNavigatorPtrForNull("AronPairTypeNavigator", "DynamicCastAndCheck[After]", n->getPath(), casted); + return casted; + } + + // virtual implementations + std::vector<NavigatorPtr> PairNavigator::getChildren() const + { + return {acceptedType1, acceptedType2}; + } + + size_t PairNavigator::childrenSize() const + { + return 2; + } + + type::AronTypePtr PairNavigator::getResult() const + { + CheckAronPtrForNull("PairNavigator", "getResult", getPath(), type->acceptedType1); + CheckAronPtrForNull("PairNavigator", "getResult", getPath(), type->acceptedType2); + return type; + } + + std::string PairNavigator::getName() const + { + return "AronPairType<" + acceptedType1->getName() + ", " + acceptedType2->getName() + ">"; + } } diff --git a/source/RobotAPI/libraries/aron/core/navigator/type/container/Pair.h b/source/RobotAPI/libraries/aron/core/navigator/type/container/Pair.h index 759c95282ffb9f574029e87034b8d5eefff74d03..999a6c85656aa3ee4b5adc353e3cdbc26d770ce5 100644 --- a/source/RobotAPI/libraries/aron/core/navigator/type/container/Pair.h +++ b/source/RobotAPI/libraries/aron/core/navigator/type/container/Pair.h @@ -32,43 +32,44 @@ namespace armarx::aron::typenavigator { - class PairNavigator; - typedef std::shared_ptr<PairNavigator> PairNavigatorPtr; + class PairNavigator; + typedef std::shared_ptr<PairNavigator> PairNavigatorPtr; - class PairNavigator : - virtual public Navigator - { - public: - using PointerType = PairNavigatorPtr; + class PairNavigator : + virtual public Navigator + { + public: + using PointerType = PairNavigatorPtr; - public: - // constructors - PairNavigator(const Path& path = Path()); - PairNavigator(const type::AronPairPtr&, const Path& path = Path()); + public: + // constructors + PairNavigator(const Path& path = Path()); + PairNavigator(const type::AronPairPtr&, const Path& path = Path()); - std::pair<NavigatorPtr, NavigatorPtr> getAcceptedTypes() const; - NavigatorPtr getFirstAcceptedType() const; - NavigatorPtr getSecondAcceptedType() const; - void setFirstAcceptedType(const NavigatorPtr&); - void setSecondAcceptedType(const NavigatorPtr&); + std::pair<NavigatorPtr, NavigatorPtr> getAcceptedTypes() const; + NavigatorPtr getFirstAcceptedType() const; + NavigatorPtr getSecondAcceptedType() const; + void addAcceptedType(const NavigatorPtr&); + void setFirstAcceptedType(const NavigatorPtr&); + void setSecondAcceptedType(const NavigatorPtr&); - type::AronPairPtr toAronPairPtr() const; + type::AronPairPtr toAronPairPtr() const; - // static methods - static PairNavigatorPtr DynamicCast(const NavigatorPtr& n); - static PairNavigatorPtr DynamicCastAndCheck(const NavigatorPtr& n); + // static methods + static PairNavigatorPtr DynamicCast(const NavigatorPtr& n); + static PairNavigatorPtr DynamicCastAndCheck(const NavigatorPtr& n); - // virtual implementations - virtual std::vector<NavigatorPtr> getChildren() const override; - virtual size_t childrenSize() const override; - virtual type::AronTypePtr getResult() const override; - virtual std::string getName() const override; + // virtual implementations + virtual std::vector<NavigatorPtr> getChildren() const override; + virtual size_t childrenSize() const override; + virtual type::AronTypePtr getResult() const override; + virtual std::string getName() const override; - private: - // members - NavigatorPtr acceptedType1; - NavigatorPtr acceptedType2; - type::AronPairPtr type; + private: + // members + NavigatorPtr acceptedType1; + NavigatorPtr acceptedType2; + type::AronPairPtr type; - }; + }; } diff --git a/source/RobotAPI/libraries/aron/core/navigator/type/ndarray/IVTCByteImage.cpp b/source/RobotAPI/libraries/aron/core/navigator/type/ndarray/IVTCByteImage.cpp index a68340d9a894d49561a4f4db0f18469e0be1ae51..8d76320d402b315e5b06db15c6bbd85986da5da3 100644 --- a/source/RobotAPI/libraries/aron/core/navigator/type/ndarray/IVTCByteImage.cpp +++ b/source/RobotAPI/libraries/aron/core/navigator/type/ndarray/IVTCByteImage.cpp @@ -25,123 +25,125 @@ #include "IVTCByteImage.h" namespace armarx::aron::typenavigator +{ + // constructors + IVTCByteImageNavigator::IVTCByteImageNavigator(const Path& path) : + aron::Navigator<type::Descriptor, type::AronType>::Navigator(type::Descriptor::eIVTCByteImage, path), + Navigator(type::Descriptor::eIVTCByteImage, path), + type(new type::AronIVTCByteImage(0, 0, "")) + { + } + + IVTCByteImageNavigator::IVTCByteImageNavigator(const type::AronIVTCByteImagePtr& o, const Path& path) : + aron::Navigator<type::Descriptor, type::AronType>::Navigator(type::Descriptor::eIVTCByteImage, path), + Navigator(type::Descriptor::eIVTCByteImage, path), + type(o) + { + CheckAronPtrForNull("AronIVTCByteImageTypeNavigator", "AronIVTCByteImageTypeNavigator", getPath(), o); + } + + std::string IVTCByteImageNavigator::checkTypename(const std::string& s) const + { + for (const auto& [key, list] : ACCEPTED_TYPES) { - // constructors - IVTCByteImageNavigator::IVTCByteImageNavigator(const Path& path) : - aron::Navigator<type::Descriptor, type::AronType>::Navigator(type::Descriptor::eIVTCByteImage, path), - Navigator(type::Descriptor::eIVTCByteImage, path), - type(new type::AronIVTCByteImage(0, 0, "")) + if (s == key) { + return key; } - IVTCByteImageNavigator::IVTCByteImageNavigator(const type::AronIVTCByteImagePtr& o, const Path& path) : - aron::Navigator<type::Descriptor, type::AronType>::Navigator(type::Descriptor::eIVTCByteImage, path), - Navigator(type::Descriptor::eIVTCByteImage, path), - type(o) + for (const auto& el : list) { - CheckAronPtrForNull("AronIVTCByteImageTypeNavigator", "AronIVTCByteImageTypeNavigator", getPath(), o); - } - - bool IVTCByteImageNavigator::checkTypename(const std::string& s) const - { - if (s.empty()) - { - throw error::AronException("AronIVTCByteImageTypeNavigator", "checkTypename", "The typename is empty.", getPath()); - } - - if (!std::any_of(ACCEPTED_TYPES.begin(), ACCEPTED_TYPES.end(), [s](const auto & el) - { - return s == el.first || std::find(el.second.begin(), el.second.end(), s) != el.second.end(); - })) - { - throw error::AronException("AronIVTCByteImageTypeNavigator", "checkTypename", "The typename is wrong. Got " + s, getPath()); - } - return true; - } - - type::AronIVTCByteImagePtr IVTCByteImageNavigator::toAronIVTCByteImagePtr() const - { - checkTypename(type->typeName); - return type; - } - - std::vector<int> IVTCByteImageNavigator::getDimensions() const - { - return {type->width, type->height}; - } - - unsigned int IVTCByteImageNavigator::getWidth() const - { - return type->width; - } - - unsigned int IVTCByteImageNavigator::getHeight() const - { - return type->height; - } - - std::string IVTCByteImageNavigator::getTypename() const - { - return type->typeName; - } - - void IVTCByteImageNavigator::setWidth(const unsigned int& w) - { - if (w == 0) + if (s == el) { - throw error::AronException("AronIVTCByteImageTypeNavigator", "setWidth", "The width of an image cannot be 0", getPath()); + return key; } - type->width = w; - } - - void IVTCByteImageNavigator::setHeight(const unsigned int& h) - { - if (h == 0) - { - throw error::AronException("AronIVTCByteImageTypeNavigator", "setHeight", "The height of an image cannot be 0", getPath()); - } - type->height = h; - } - - void IVTCByteImageNavigator::setTypename(const std::string& u) - { - checkTypename(u); - type->typeName = u; - } - - // static methods - IVTCByteImageNavigatorPtr IVTCByteImageNavigator::DynamicCast(const NavigatorPtr& n) - { - return std::dynamic_pointer_cast<IVTCByteImageNavigator>(n); - } - - IVTCByteImageNavigatorPtr IVTCByteImageNavigator::DynamicCastAndCheck(const NavigatorPtr& n) - { - CheckTypeNavigatorPtrForNull("AronIVTCByteImageTypeNavigator", "DynamicCast[Before]", n); - IVTCByteImageNavigatorPtr casted = IVTCByteImageNavigator::DynamicCast(n); - CheckTypeNavigatorPtrForNull("AronIVTCByteImageTypeNavigator", "DynamicCast[After]", n->getPath(), casted); - return casted; - } - - // virtual implementations - std::vector<NavigatorPtr> IVTCByteImageNavigator::getChildren() const - { - return {}; - } - - size_t IVTCByteImageNavigator::childrenSize() const - { - return 0; - } - - type::AronTypePtr IVTCByteImageNavigator::getResult() const - { - return toAronIVTCByteImagePtr(); - } - - std::string IVTCByteImageNavigator::getName() const - { - return "AronIVTCByteImageType<" + simox::alg::to_string(getDimensions(), ", ") + ", " + type->typeName + ">"; } + } + throw error::AronException("AronIVTCByteImageTypeNavigator", "checkTypename", "The typename is empty.", getPath()); + } + + type::AronIVTCByteImagePtr IVTCByteImageNavigator::toAronIVTCByteImagePtr() const + { + checkTypename(type->typeName); + return type; + } + + std::vector<int> IVTCByteImageNavigator::getDimensions() const + { + return {type->width, type->height}; + } + + unsigned int IVTCByteImageNavigator::getWidth() const + { + return type->width; + } + + unsigned int IVTCByteImageNavigator::getHeight() const + { + return type->height; + } + + std::string IVTCByteImageNavigator::getTypename() const + { + return type->typeName; + } + + void IVTCByteImageNavigator::setWidth(const unsigned int& w) + { + if (w == 0) + { + throw error::AronException("AronIVTCByteImageTypeNavigator", "setWidth", "The width of an image cannot be 0", getPath()); + } + type->width = w; + } + + void IVTCByteImageNavigator::setHeight(const unsigned int& h) + { + if (h == 0) + { + throw error::AronException("AronIVTCByteImageTypeNavigator", "setHeight", "The height of an image cannot be 0", getPath()); + } + type->height = h; + } + + void IVTCByteImageNavigator::setTypename(const std::string& u) + { + type->typeName = checkTypename(u); + } + + // static methods + IVTCByteImageNavigatorPtr IVTCByteImageNavigator::DynamicCast(const NavigatorPtr& n) + { + return std::dynamic_pointer_cast<IVTCByteImageNavigator>(n); + } + + IVTCByteImageNavigatorPtr IVTCByteImageNavigator::DynamicCastAndCheck(const NavigatorPtr& n) + { + CheckTypeNavigatorPtrForNull("AronIVTCByteImageTypeNavigator", "DynamicCast[Before]", n); + IVTCByteImageNavigatorPtr casted = IVTCByteImageNavigator::DynamicCast(n); + CheckTypeNavigatorPtrForNull("AronIVTCByteImageTypeNavigator", "DynamicCast[After]", n->getPath(), casted); + return casted; + } + + // virtual implementations + std::vector<NavigatorPtr> IVTCByteImageNavigator::getChildren() const + { + return {}; + } + + size_t IVTCByteImageNavigator::childrenSize() const + { + return 0; + } + + type::AronTypePtr IVTCByteImageNavigator::getResult() const + { + return toAronIVTCByteImagePtr(); + } + + std::string IVTCByteImageNavigator::getName() const + { + return "AronIVTCByteImageType<" + simox::alg::to_string(getDimensions(), ", ") + ", " + type->typeName + ">"; + } } diff --git a/source/RobotAPI/libraries/aron/core/navigator/type/ndarray/IVTCByteImage.h b/source/RobotAPI/libraries/aron/core/navigator/type/ndarray/IVTCByteImage.h index 9628e6c8ec00ccff6da984ace665e198d3b39fdd..aeaf5a3c7f8057cda95706a91637f11ea25fec3e 100644 --- a/source/RobotAPI/libraries/aron/core/navigator/type/ndarray/IVTCByteImage.h +++ b/source/RobotAPI/libraries/aron/core/navigator/type/ndarray/IVTCByteImage.h @@ -32,54 +32,54 @@ namespace armarx::aron::typenavigator { - class IVTCByteImageNavigator; - typedef std::shared_ptr<IVTCByteImageNavigator> IVTCByteImageNavigatorPtr; + class IVTCByteImageNavigator; + typedef std::shared_ptr<IVTCByteImageNavigator> IVTCByteImageNavigatorPtr; - class IVTCByteImageNavigator : - virtual public Navigator - { - public: - using PointerType = IVTCByteImageNavigatorPtr; + class IVTCByteImageNavigator : + virtual public Navigator + { + public: + using PointerType = IVTCByteImageNavigatorPtr; - public: - // constructors - IVTCByteImageNavigator() = delete; - IVTCByteImageNavigator(const Path& path); - IVTCByteImageNavigator(const type::AronIVTCByteImagePtr&, const Path& path); + public: + // constructors + IVTCByteImageNavigator() = delete; + IVTCByteImageNavigator(const Path& path); + IVTCByteImageNavigator(const type::AronIVTCByteImagePtr&, const Path& path); - bool checkTypename(const std::string&) const; + std::string checkTypename(const std::string&) const; - unsigned int getWidth() const; - unsigned int getHeight() const; - std::string getTypename() const; - std::vector<int> getDimensions() const; + unsigned int getWidth() const; + unsigned int getHeight() const; + std::string getTypename() const; + std::vector<int> getDimensions() const; - void setWidth(const unsigned int&); - void setHeight(const unsigned int&); - void setTypename(const std::string&); + void setWidth(const unsigned int&); + void setHeight(const unsigned int&); + void setTypename(const std::string&); - type::AronIVTCByteImagePtr toAronIVTCByteImagePtr() const; + type::AronIVTCByteImagePtr toAronIVTCByteImagePtr() const; - // static methods - static IVTCByteImageNavigatorPtr DynamicCast(const NavigatorPtr& n); - static IVTCByteImageNavigatorPtr DynamicCastAndCheck(const NavigatorPtr& n); + // static methods + static IVTCByteImageNavigatorPtr DynamicCast(const NavigatorPtr& n); + static IVTCByteImageNavigatorPtr DynamicCastAndCheck(const NavigatorPtr& n); - // virtual implementations - virtual std::vector<NavigatorPtr> getChildren() const override; - virtual size_t childrenSize() const override; - virtual type::AronTypePtr getResult() const override; - virtual std::string getName() const override; + // virtual implementations + virtual std::vector<NavigatorPtr> getChildren() const override; + virtual size_t childrenSize() const override; + virtual type::AronTypePtr getResult() const override; + virtual std::string getName() const override; - public: - const std::map<std::string, std::vector<std::string>> ACCEPTED_TYPES = - { - {"GrayScale", {"CByteImage::ImageType::eGrayScale"}}, - {"RGB24", {"CByteImage::ImageType::eRGB24"}}, - {"RGB24Split", {"CByteImage::ImageType::eRGB24Split"}} - }; + public: + const std::map<std::string, std::vector<std::string>> ACCEPTED_TYPES = + { + {"GrayScale", {"CByteImage::ImageType::eGrayScale", "ImageType::eGrayScale"}}, + {"RGB24", {"CByteImage::ImageType::eRGB24", "ImageType::eRGB24"}}, + {"RGB24Split", {"CByteImage::ImageType::eRGB24Split", "ImageType::eRGB24Split"}} + }; - private: - // members - type::AronIVTCByteImagePtr type; - }; + private: + // members + type::AronIVTCByteImagePtr type; + }; } diff --git a/source/RobotAPI/libraries/aron/core/navigator/type/ndarray/OpenCVMat.cpp b/source/RobotAPI/libraries/aron/core/navigator/type/ndarray/OpenCVMat.cpp index 9e9a69fbeefe844ef90815d6eb5730211369edbd..e0d159cc3fc108c2bfb14d15fa6846e6c97d654f 100644 --- a/source/RobotAPI/libraries/aron/core/navigator/type/ndarray/OpenCVMat.cpp +++ b/source/RobotAPI/libraries/aron/core/navigator/type/ndarray/OpenCVMat.cpp @@ -25,122 +25,124 @@ #include "OpenCVMat.h" namespace armarx::aron::typenavigator +{ + // constructors + OpenCVMatNavigator::OpenCVMatNavigator(const Path& path) : + aron::Navigator<type::Descriptor, type::AronType>::Navigator(type::Descriptor::eOpenCVMat, path), + Navigator(type::Descriptor::eOpenCVMat, path), + type(new type::AronOpenCVMat({}, "")) + { + } + + OpenCVMatNavigator::OpenCVMatNavigator(const type::AronOpenCVMatPtr& o, const Path& path) : + aron::Navigator<type::Descriptor, type::AronType>::Navigator(type::Descriptor::eOpenCVMat, path), + Navigator(type::Descriptor::eOpenCVMat, path), + type(o) + { + CheckAronPtrForNull("AronOpenCVMatTypeNavigator", "AronOpenCVMatTypeNavigator", getPath(), o); + checkDimensions(type->dimensions); + checkTypename(type->typeName); + } + + bool OpenCVMatNavigator::checkDimensions(const std::vector<int>& d) const + { + if (d.size() < ACCEPTED_DIMENSION_MIN_SIZE) { - // constructors - OpenCVMatNavigator::OpenCVMatNavigator(const Path& path) : - aron::Navigator<type::Descriptor, type::AronType>::Navigator(type::Descriptor::eOpenCVMat, path), - Navigator(type::Descriptor::eOpenCVMat, path), - type(new type::AronOpenCVMat({}, "")) - { - } + throw error::AronException("AronOpenCVMatTypeNavigator", "checkDimensions", "The dimension size is wrong. Got size: " + std::to_string(d.size()), getPath()); + } - OpenCVMatNavigator::OpenCVMatNavigator(const type::AronOpenCVMatPtr& o, const Path& path) : - aron::Navigator<type::Descriptor, type::AronType>::Navigator(type::Descriptor::eOpenCVMat, path), - Navigator(type::Descriptor::eOpenCVMat, path), - type(o) - { - CheckAronPtrForNull("AronOpenCVMatTypeNavigator", "AronOpenCVMatTypeNavigator", getPath(), o); - checkDimensions(type->dimensions); - checkTypename(type->typeName); - } - - bool OpenCVMatNavigator::checkDimensions(const std::vector<int>& d) const - { - if (d.size() < ACCEPTED_DIMENSION_MIN_SIZE) - { - throw error::AronException("AronOpenCVMatTypeNavigator", "checkDimensions", "The dimension size is wrong. Got size: " + std::to_string(d.size()), getPath()); - } - - if (std::any_of(d.begin(), d.end(), [](int i) + if (std::any_of(d.begin(), d.end(), [](int i) + { + return i < -1 || i == 0; + })) + { + throw error::AronException("AronOpenCVMatTypeNavigator", "checkDimensions", "The dimension size is wrong. At least one empty is < -1 or 0. Got as dimension: " + simox::alg::to_string(d, ", "), getPath()); + } + return true; + } + + std::string OpenCVMatNavigator::checkTypename(const std::string& s) const + { + for (const auto& [key, list] : ACCEPTED_TYPES) + { + if (s == key) { - return i < -1 || i == 0; - })) - { - throw error::AronException("AronOpenCVMatTypeNavigator", "checkDimensions", "The dimension size is wrong. At least one empty is < -1 or 0. Got as dimension: " + simox::alg::to_string(d, ", "), getPath()); - } - return true; + return key; } - bool OpenCVMatNavigator::checkTypename(const std::string& s) const + for (const auto& el : list) { - if (s.empty()) + if (s == el) { - throw error::AronException("AronOpenCVMatTypeNavigator", "checkTypename", "The typename is empty.", getPath()); + return key; } - - if (!std::any_of(ACCEPTED_TYPES.begin(), ACCEPTED_TYPES.end(), [s](const auto & el) - { - return s == el.first || std::find(el.second.begin(), el.second.end(), s) != el.second.end(); - })) - { - throw error::AronException("AronOpenCVMatTypeNavigator", "checkTypename", "The typename is wrong. Got " + s, getPath()); - } - return true; - } - - type::AronOpenCVMatPtr OpenCVMatNavigator::toAronOpenCVMatPtr() const - { - checkDimensions(type->dimensions); - checkTypename(type->typeName); - return type; - } - - std::string OpenCVMatNavigator::getTypename() const - { - return type->typeName; - } - - std::vector<int> OpenCVMatNavigator::getDimensions() const - { - return type->dimensions; - } - - void OpenCVMatNavigator::setTypename(const std::string& u) - { - checkTypename(u); - type->typeName = u; - } - - void OpenCVMatNavigator::setDimensions(const std::vector<int>& d) - { - checkDimensions(d); - type->dimensions = d; - } - - - // static methods - OpenCVMatNavigatorPtr OpenCVMatNavigator::DynamicCast(const NavigatorPtr& n) - { - return std::dynamic_pointer_cast<OpenCVMatNavigator>(n); - } - - OpenCVMatNavigatorPtr OpenCVMatNavigator::DynamicCastAndCheck(const NavigatorPtr& n) - { - CheckTypeNavigatorPtrForNull("AronOpenCVMatTypeNavigator", "DynamicCast[Before]", n); - OpenCVMatNavigatorPtr casted = OpenCVMatNavigator::DynamicCast(n); - CheckTypeNavigatorPtrForNull("AronOpenCVMatTypeNavigator", "DynamicCast[After]", n->getPath(), casted); - return casted; - } - - // virtual implementations - std::vector<NavigatorPtr> OpenCVMatNavigator::getChildren() const - { - return {}; - } - - size_t OpenCVMatNavigator::childrenSize() const - { - return 0; - } - - type::AronTypePtr OpenCVMatNavigator::getResult() const - { - return toAronOpenCVMatPtr(); - } - - std::string OpenCVMatNavigator::getName() const - { - return "AronOpenCVMatType<" + simox::alg::to_string(type->dimensions, ", ") + ", " + type->typeName + ">"; } + } + throw error::AronException("OpenCVMatNavigator", "checkTypename", "The typename is empty.", getPath()); + } + + type::AronOpenCVMatPtr OpenCVMatNavigator::toAronOpenCVMatPtr() const + { + checkDimensions(type->dimensions); + checkTypename(type->typeName); + return type; + } + + std::string OpenCVMatNavigator::getTypename() const + { + return type->typeName; + } + + std::vector<int> OpenCVMatNavigator::getDimensions() const + { + return type->dimensions; + } + + void OpenCVMatNavigator::setTypename(const std::string& u) + { + type->typeName = checkTypename(u); + } + + void OpenCVMatNavigator::setDimensions(const std::vector<int>& d) + { + checkDimensions(d); + type->dimensions = d; + } + + + // static methods + OpenCVMatNavigatorPtr OpenCVMatNavigator::DynamicCast(const NavigatorPtr& n) + { + return std::dynamic_pointer_cast<OpenCVMatNavigator>(n); + } + + OpenCVMatNavigatorPtr OpenCVMatNavigator::DynamicCastAndCheck(const NavigatorPtr& n) + { + CheckTypeNavigatorPtrForNull("AronOpenCVMatTypeNavigator", "DynamicCast[Before]", n); + OpenCVMatNavigatorPtr casted = OpenCVMatNavigator::DynamicCast(n); + CheckTypeNavigatorPtrForNull("AronOpenCVMatTypeNavigator", "DynamicCast[After]", n->getPath(), casted); + return casted; + } + + // virtual implementations + std::vector<NavigatorPtr> OpenCVMatNavigator::getChildren() const + { + return {}; + } + + size_t OpenCVMatNavigator::childrenSize() const + { + return 0; + } + + type::AronTypePtr OpenCVMatNavigator::getResult() const + { + return toAronOpenCVMatPtr(); + } + + std::string OpenCVMatNavigator::getName() const + { + return "AronOpenCVMatType<" + simox::alg::to_string(type->dimensions, ", ") + ", " + type->typeName + ">"; + } } diff --git a/source/RobotAPI/libraries/aron/core/navigator/type/ndarray/OpenCVMat.h b/source/RobotAPI/libraries/aron/core/navigator/type/ndarray/OpenCVMat.h index 305db77e2d6edbf1c2c5b4564ed08ab2d21113a0..4a1c0a88fb65404a0d0eab15ca54d0129af180d7 100644 --- a/source/RobotAPI/libraries/aron/core/navigator/type/ndarray/OpenCVMat.h +++ b/source/RobotAPI/libraries/aron/core/navigator/type/ndarray/OpenCVMat.h @@ -32,57 +32,57 @@ namespace armarx::aron::typenavigator { - class OpenCVMatNavigator; - typedef std::shared_ptr<OpenCVMatNavigator> OpenCVMatNavigatorPtr; + class OpenCVMatNavigator; + typedef std::shared_ptr<OpenCVMatNavigator> OpenCVMatNavigatorPtr; - class OpenCVMatNavigator : - virtual public Navigator - { - public: - using PointerType = OpenCVMatNavigatorPtr; + class OpenCVMatNavigator : + virtual public Navigator + { + public: + using PointerType = OpenCVMatNavigatorPtr; - public: - // constructors - OpenCVMatNavigator() = delete; - OpenCVMatNavigator(const Path& path); - OpenCVMatNavigator(const type::AronOpenCVMatPtr&, const Path& path); + public: + // constructors + OpenCVMatNavigator() = delete; + OpenCVMatNavigator(const Path& path); + OpenCVMatNavigator(const type::AronOpenCVMatPtr&, const Path& path); - bool checkDimensions(const std::vector<int>&) const; - bool checkTypename(const std::string&) const; + bool checkDimensions(const std::vector<int>&) const; + std::string checkTypename(const std::string&) const; - std::string getTypename() const; - std::vector<int> getDimensions() const; + std::string getTypename() const; + std::vector<int> getDimensions() const; - void setDimensions(const std::vector<int>&); - void setTypename(const std::string&); + void setDimensions(const std::vector<int>&); + void setTypename(const std::string&); - type::AronOpenCVMatPtr toAronOpenCVMatPtr() const; + type::AronOpenCVMatPtr toAronOpenCVMatPtr() const; - // static methods - static OpenCVMatNavigatorPtr DynamicCast(const NavigatorPtr& n); - static OpenCVMatNavigatorPtr DynamicCastAndCheck(const NavigatorPtr& n); + // static methods + static OpenCVMatNavigatorPtr DynamicCast(const NavigatorPtr& n); + static OpenCVMatNavigatorPtr DynamicCastAndCheck(const NavigatorPtr& n); - // virtual implementations - virtual std::vector<NavigatorPtr> getChildren() const override; - virtual size_t childrenSize() const override; - virtual type::AronTypePtr getResult() const override; - virtual std::string getName() const override; + // virtual implementations + virtual std::vector<NavigatorPtr> getChildren() const override; + virtual size_t childrenSize() const override; + virtual type::AronTypePtr getResult() const override; + virtual std::string getName() const override; - public: - const std::map<std::string, std::vector<std::string>> ACCEPTED_TYPES = - { - {"CV_8U", {"8U"}}, - {"CV_8S", {"8S"}}, - {"CV_16U", {"16U"}}, - {"CV_16S", {"16S"}}, - {"CV_32S", {"32S"}}, - {"CV_32F", {"32F"}}, - {"CV_64F", {"64F"}} - }; - const unsigned int ACCEPTED_DIMENSION_MIN_SIZE = 2; + public: + const std::map<std::string, std::vector<std::string>> ACCEPTED_TYPES = + { + {"CV_8U", {"8U"}}, + {"CV_8S", {"8S"}}, + {"CV_16U", {"16U"}}, + {"CV_16S", {"16S"}}, + {"CV_32S", {"32S"}}, + {"CV_32F", {"32F"}}, + {"CV_64F", {"64F"}} + }; + const unsigned int ACCEPTED_DIMENSION_MIN_SIZE = 2; - private: - // members - type::AronOpenCVMatPtr type; - }; + private: + // members + type::AronOpenCVMatPtr type; + }; } diff --git a/source/RobotAPI/libraries/aron/core/navigator/type/ndarray/PCLPointCloud.cpp b/source/RobotAPI/libraries/aron/core/navigator/type/ndarray/PCLPointCloud.cpp index 6ba41bf67870184489c2e27f5adb9d263820f385..2de0158a82ac9243202becc23a12272ebed0cd43 100644 --- a/source/RobotAPI/libraries/aron/core/navigator/type/ndarray/PCLPointCloud.cpp +++ b/source/RobotAPI/libraries/aron/core/navigator/type/ndarray/PCLPointCloud.cpp @@ -25,125 +25,127 @@ #include "PCLPointCloud.h" namespace armarx::aron::typenavigator +{ + // constructors + PCLPointCloudNavigator::PCLPointCloudNavigator(const Path& path) : + aron::Navigator<type::Descriptor, type::AronType>::Navigator(type::Descriptor::ePCLPointCloud, path), + Navigator(type::Descriptor::ePCLPointCloud, path), + type(new type::AronPCLPointCloud(0, 0, "")) + { + } + + PCLPointCloudNavigator::PCLPointCloudNavigator(const type::AronPCLPointCloudPtr& o, const Path& path) : + aron::Navigator<type::Descriptor, type::AronType>::Navigator(type::Descriptor::ePCLPointCloud, path), + Navigator(type::Descriptor::ePCLPointCloud, path), + type(o) + { + CheckAronPtrForNull("AronPCLPointCloudTypeNavigator", "AronPCLPointCloudTypeNavigator", getPath(), o); + checkTypename(type->typeName); + } + + std::string PCLPointCloudNavigator::checkTypename(const std::string& s) const + { + for (const auto& [key, list] : ACCEPTED_TYPES) { - // constructors - PCLPointCloudNavigator::PCLPointCloudNavigator(const Path& path) : - aron::Navigator<type::Descriptor, type::AronType>::Navigator(type::Descriptor::ePCLPointCloud, path), - Navigator(type::Descriptor::ePCLPointCloud, path), - type(new type::AronPCLPointCloud(0, 0, "")) + if (s == key) { + return key; } - PCLPointCloudNavigator::PCLPointCloudNavigator(const type::AronPCLPointCloudPtr& o, const Path& path) : - aron::Navigator<type::Descriptor, type::AronType>::Navigator(type::Descriptor::ePCLPointCloud, path), - Navigator(type::Descriptor::ePCLPointCloud, path), - type(o) + for (const auto& el : list) { - CheckAronPtrForNull("AronPCLPointCloudTypeNavigator", "AronPCLPointCloudTypeNavigator", getPath(), o); - checkTypename(type->typeName); - } - - bool PCLPointCloudNavigator::checkTypename(const std::string& s) const - { - if (s.empty()) - { - throw error::AronException("AronPCLPointCloudTypeNavigator", "checkTypename", "The typename is empty.", getPath()); - } - - if (!std::any_of(ACCEPTED_TYPES.begin(), ACCEPTED_TYPES.end(), [s](const auto & el) - { - return s == el.first || std::find(el.second.begin(), el.second.end(), s) != el.second.end(); - })) - { - throw error::AronException("AronPCLPointCloudTypeNavigator", "checkTypename", "The typename is wrong. Got " + s, getPath()); - } - return true; - } - - type::AronPCLPointCloudPtr PCLPointCloudNavigator::toAronPCLPointCloudPtr() const - { - checkTypename(type->typeName); - return type; - } - - std::vector<int> PCLPointCloudNavigator::getDimensions() const - { - return {type->width, type->height}; - } - - unsigned int PCLPointCloudNavigator::getWidth() const - { - return type->width; - } - - unsigned int PCLPointCloudNavigator::getHeight() const - { - return type->height; - } - - std::string PCLPointCloudNavigator::getTypename() const - { - return type->typeName; - } - - void PCLPointCloudNavigator::setWidth(const unsigned int& w) - { - if (w == 0) - { - throw error::AronException("AronPCLPointCloudTypeNavigator", "setWidth", "The width of aa pointcloud cannot be 0", getPath()); - } - type->width = w; - } - - void PCLPointCloudNavigator::setHeight(const unsigned int& h) - { - if (h == 0) + if (s == el) { - throw error::AronException("AronPCLPointCloudTypeNavigator", "setHeight", "The height of aa pointcloud cannot be 0", getPath()); + return key; } - type->height = h; - } - - void PCLPointCloudNavigator::setTypename(const std::string& u) - { - checkTypename(u); - type->typeName = u; - } - - - // static methods - PCLPointCloudNavigatorPtr PCLPointCloudNavigator::DynamicCast(const NavigatorPtr& n) - { - return std::dynamic_pointer_cast<PCLPointCloudNavigator>(n); - } - - PCLPointCloudNavigatorPtr PCLPointCloudNavigator::DynamicCastAndCheck(const NavigatorPtr& n) - { - CheckTypeNavigatorPtrForNull("AronPCLPointCloudTypeNavigator", "DynamicCast[Before]", n); - PCLPointCloudNavigatorPtr casted = PCLPointCloudNavigator::DynamicCast(n); - CheckTypeNavigatorPtrForNull("AronPCLPointCloudTypeNavigator", "DynamicCast[After]", n->getPath(), casted); - return casted; - } - - // virtual implementations - std::vector<NavigatorPtr> PCLPointCloudNavigator::getChildren() const - { - return {}; - } - - size_t PCLPointCloudNavigator::childrenSize() const - { - return 0; - } - - type::AronTypePtr PCLPointCloudNavigator::getResult() const - { - return toAronPCLPointCloudPtr(); - } - - std::string PCLPointCloudNavigator::getName() const - { - return "AronPCLPointCloudType<" + simox::alg::to_string(getDimensions(), ", ") + ", " + type->typeName + ">"; } + } + throw error::AronException("PCLPointCloudNavigator", "checkTypename", "The typename is empty.", getPath()); + } + + type::AronPCLPointCloudPtr PCLPointCloudNavigator::toAronPCLPointCloudPtr() const + { + checkTypename(type->typeName); + return type; + } + + std::vector<int> PCLPointCloudNavigator::getDimensions() const + { + return {type->width, type->height}; + } + + unsigned int PCLPointCloudNavigator::getWidth() const + { + return type->width; + } + + unsigned int PCLPointCloudNavigator::getHeight() const + { + return type->height; + } + + std::string PCLPointCloudNavigator::getTypename() const + { + return type->typeName; + } + + void PCLPointCloudNavigator::setWidth(const unsigned int& w) + { + if (w == 0) + { + throw error::AronException("AronPCLPointCloudTypeNavigator", "setWidth", "The width of aa pointcloud cannot be 0", getPath()); + } + type->width = w; + } + + void PCLPointCloudNavigator::setHeight(const unsigned int& h) + { + if (h == 0) + { + throw error::AronException("AronPCLPointCloudTypeNavigator", "setHeight", "The height of aa pointcloud cannot be 0", getPath()); + } + type->height = h; + } + + void PCLPointCloudNavigator::setTypename(const std::string& u) + { + type->typeName = checkTypename(u); + } + + + // static methods + PCLPointCloudNavigatorPtr PCLPointCloudNavigator::DynamicCast(const NavigatorPtr& n) + { + return std::dynamic_pointer_cast<PCLPointCloudNavigator>(n); + } + + PCLPointCloudNavigatorPtr PCLPointCloudNavigator::DynamicCastAndCheck(const NavigatorPtr& n) + { + CheckTypeNavigatorPtrForNull("AronPCLPointCloudTypeNavigator", "DynamicCast[Before]", n); + PCLPointCloudNavigatorPtr casted = PCLPointCloudNavigator::DynamicCast(n); + CheckTypeNavigatorPtrForNull("AronPCLPointCloudTypeNavigator", "DynamicCast[After]", n->getPath(), casted); + return casted; + } + + // virtual implementations + std::vector<NavigatorPtr> PCLPointCloudNavigator::getChildren() const + { + return {}; + } + + size_t PCLPointCloudNavigator::childrenSize() const + { + return 0; + } + + type::AronTypePtr PCLPointCloudNavigator::getResult() const + { + return toAronPCLPointCloudPtr(); + } + + std::string PCLPointCloudNavigator::getName() const + { + return "AronPCLPointCloudType<" + simox::alg::to_string(getDimensions(), ", ") + ", " + type->typeName + ">"; + } } diff --git a/source/RobotAPI/libraries/aron/core/navigator/type/ndarray/PCLPointCloud.h b/source/RobotAPI/libraries/aron/core/navigator/type/ndarray/PCLPointCloud.h index 1c40aaaeb593c7b5d360429f0a155fd7234c416b..2f62f1b579b5e84b3acc93aa7a72d70329492736 100644 --- a/source/RobotAPI/libraries/aron/core/navigator/type/ndarray/PCLPointCloud.h +++ b/source/RobotAPI/libraries/aron/core/navigator/type/ndarray/PCLPointCloud.h @@ -32,60 +32,60 @@ namespace armarx::aron::typenavigator { - class PCLPointCloudNavigator; - typedef std::shared_ptr<PCLPointCloudNavigator> PCLPointCloudNavigatorPtr; + class PCLPointCloudNavigator; + typedef std::shared_ptr<PCLPointCloudNavigator> PCLPointCloudNavigatorPtr; - class PCLPointCloudNavigator : - virtual public Navigator - { - public: - using PointerType = PCLPointCloudNavigatorPtr; + class PCLPointCloudNavigator : + virtual public Navigator + { + public: + using PointerType = PCLPointCloudNavigatorPtr; - public: - // constructors - PCLPointCloudNavigator() = delete; - PCLPointCloudNavigator(const Path& path); - PCLPointCloudNavigator(const type::AronPCLPointCloudPtr&, const Path& path); + public: + // constructors + PCLPointCloudNavigator() = delete; + PCLPointCloudNavigator(const Path& path); + PCLPointCloudNavigator(const type::AronPCLPointCloudPtr&, const Path& path); - bool checkTypename(const std::string&) const; + std::string checkTypename(const std::string&) const; - unsigned int getWidth() const; - unsigned int getHeight() const; - std::string getTypename() const; - std::vector<int> getDimensions() const; + unsigned int getWidth() const; + unsigned int getHeight() const; + std::string getTypename() const; + std::vector<int> getDimensions() const; - void setWidth(const unsigned int&); - void setHeight(const unsigned int&); - void setTypename(const std::string&); + void setWidth(const unsigned int&); + void setHeight(const unsigned int&); + void setTypename(const std::string&); - type::AronPCLPointCloudPtr toAronPCLPointCloudPtr() const; + type::AronPCLPointCloudPtr toAronPCLPointCloudPtr() const; - // static methods - static PCLPointCloudNavigatorPtr DynamicCast(const NavigatorPtr& n); - static PCLPointCloudNavigatorPtr DynamicCastAndCheck(const NavigatorPtr& n); + // static methods + static PCLPointCloudNavigatorPtr DynamicCast(const NavigatorPtr& n); + static PCLPointCloudNavigatorPtr DynamicCastAndCheck(const NavigatorPtr& n); - // virtual implementations - virtual std::vector<NavigatorPtr> getChildren() const override; - virtual size_t childrenSize() const override; - virtual type::AronTypePtr getResult() const override; - virtual std::string getName() const override; + // virtual implementations + virtual std::vector<NavigatorPtr> getChildren() const override; + virtual size_t childrenSize() const override; + virtual type::AronTypePtr getResult() const override; + virtual std::string getName() const override; - public: - const std::map<std::string, std::vector<std::string>> ACCEPTED_TYPES = - { - {"PointXYZ", {"pcl::PointXYZ"}}, - {"PointXYZI", {"pcl::PointXYZI"}}, - {"PointXYZL", {"pcl::PointXYZL"}}, - {"PointXYZRGB", {"pcl::PointXYZRGB"}}, - {"PointXYZRGBL", {"pcl::PointXYZRGBL"}}, - {"PointXYZRGBA", {"pcl::PointXYZRGBA"}}, - {"PointXYZHSV", {"pcl::PointXYZHSV"}} - }; - const unsigned int ACCEPTED_DIMENSION_MIN_SIZE = 2; - const unsigned int ACCEPTED_DIMENSION_MAX_SIZE = 2; + public: + const std::map<std::string, std::vector<std::string>> ACCEPTED_TYPES = + { + {"PointXYZ", {"pcl::PointXYZ"}}, + {"PointXYZI", {"pcl::PointXYZI"}}, + {"PointXYZL", {"pcl::PointXYZL"}}, + {"PointXYZRGB", {"pcl::PointXYZRGB"}}, + {"PointXYZRGBL", {"pcl::PointXYZRGBL"}}, + {"PointXYZRGBA", {"pcl::PointXYZRGBA"}}, + {"PointXYZHSV", {"pcl::PointXYZHSV"}} + }; + const unsigned int ACCEPTED_DIMENSION_MIN_SIZE = 2; + const unsigned int ACCEPTED_DIMENSION_MAX_SIZE = 2; - private: - // members - type::AronPCLPointCloudPtr type; - }; + private: + // members + type::AronPCLPointCloudPtr type; + }; } diff --git a/source/RobotAPI/libraries/aron/core/test/CMakeLists.txt b/source/RobotAPI/libraries/aron/core/test/CMakeLists.txt index 33657aed38683de124c5fd12174f15c1a72a9825..7eeffdbb49db4b321b77ed47fa1e58361d538094 100644 --- a/source/RobotAPI/libraries/aron/core/test/CMakeLists.txt +++ b/source/RobotAPI/libraries/aron/core/test/CMakeLists.txt @@ -41,14 +41,19 @@ armarx_enable_aron_file_generation_for_target( ${TEST_NAME} ARON_FILES xmls/HumanPoseTest.xml - xmls/SimpleDictTest.xml + xmls/DictTest.xml xmls/ListTest.xml - xmls/NaturalIK.xml - xmls/SimpleObjectTest.xml + xmls/NaturalIKTest.xml + xmls/ObjectTest.xml xmls/PrimitiveTest.xml - xmls/ImageTest.xml + xmls/IVTCByteImageTest.xml xmls/EigenMatrixTest.xml + xmls/EigenQuaternionTest.xml xmls/OpenCVMatTest.xml xmls/PCLPointCloudTest.xml + xmls/PositionTest.xml + xmls/OrientationTest.xml + xmls/PoseTest.xml + xmls/EnumTest.xml #ENABLE_DEBUG_INFO ) diff --git a/source/RobotAPI/libraries/aron/core/test/aronTest.cpp b/source/RobotAPI/libraries/aron/core/test/aronTest.cpp index 838c5922e905af4c68c5a5048e6ad37a84bda16d..1c25b3d5894dd2db032f88110f3641955e54b2fe 100644 --- a/source/RobotAPI/libraries/aron/core/test/aronTest.cpp +++ b/source/RobotAPI/libraries/aron/core/test/aronTest.cpp @@ -56,28 +56,31 @@ // Aron #include <RobotAPI/libraries/aron/core/Debug.h> -#include <RobotAPI/libraries/aron/core/AronRandomizer.h> +#include <RobotAPI/libraries/aron/core/Randomizer.h> + #include <RobotAPI/libraries/aron/core/io/dataIO/reader/navigator/NavigatorReader.h> +#include <RobotAPI/libraries/aron/core/io/dataIO/reader/nlohmannJSON/NlohmannJSONReader.h> #include <RobotAPI/libraries/aron/core/io/dataIO/writer/navigator/NavigatorWriter.h> #include <RobotAPI/libraries/aron/core/io/dataIO/writer/nlohmannJSON/NlohmannJSONWriter.h> -#include <RobotAPI/libraries/aron/core/io/dataIO/writer/rapidXML/AronDataRapidXMLWriter.h> -#include <RobotAPI/libraries/aron/core/io/dataIO/reader/nlohmannJSON/AronDataNlohmannJSONReader.h> // Files without code generation -#include "aronDataWithoutCodeGeneration.h" +//#include "aronDataWithoutCodeGeneration.h" // Generated File -#include <RobotAPI/libraries/aron/core/test/aron/NaturalIK.aron.generated.h> +#include <RobotAPI/libraries/aron/core/test/aron/NaturalIKTest.aron.generated.h> #include <RobotAPI/libraries/aron/core/test/aron/ListTest.aron.generated.h> -#include <RobotAPI/libraries/aron/core/test/aron/SimpleDictTest.aron.generated.h> +#include <RobotAPI/libraries/aron/core/test/aron/DictTest.aron.generated.h> #include <RobotAPI/libraries/aron/core/test/aron/PrimitiveTest.aron.generated.h> -#include <RobotAPI/libraries/aron/core/test/aron/SimpleObjectTest.aron.generated.h> -#include <RobotAPI/libraries/aron/core/test/aron/ImageTest.aron.generated.h> +#include <RobotAPI/libraries/aron/core/test/aron/ObjectTest.aron.generated.h> +#include <RobotAPI/libraries/aron/core/test/aron/IVTCByteImageTest.aron.generated.h> #include <RobotAPI/libraries/aron/core/test/aron/EigenMatrixTest.aron.generated.h> +#include <RobotAPI/libraries/aron/core/test/aron/EigenQuaternionTest.aron.generated.h> #include <RobotAPI/libraries/aron/core/test/aron/OpenCVMatTest.aron.generated.h> #include <RobotAPI/libraries/aron/core/test/aron/PCLPointCloudTest.aron.generated.h> - +#include <RobotAPI/libraries/aron/core/test/aron/PositionTest.aron.generated.h> +#include <RobotAPI/libraries/aron/core/test/aron/OrientationTest.aron.generated.h> +#include <RobotAPI/libraries/aron/core/test/aron/PoseTest.aron.generated.h> using namespace armarx; using namespace aron; @@ -85,16 +88,16 @@ using namespace aron; template <typename T> void runTestWithInstances(T& k1, T& k2) { - AronRandomizer r; + Randomizer r; std::cout << "\t getting type 1" << std::endl; typenavigator::ObjectNavigatorPtr k1_type_nav = k1.toInitialAronType(); - type::AronObjectTypePtr k1_type = k1_type_nav->toAronObjectTypePtr(); + type::AronObjectPtr k1_type = k1_type_nav->toAronObjectPtr(); BOOST_CHECK_NE(k1_type.get(), nullptr); std::cout << "\t getting type 2" << std::endl; typenavigator::ObjectNavigatorPtr k2_type_nav = k2.toInitialAronType(); - type::AronObjectTypePtr k2_type = k2_type_nav->toAronObjectTypePtr(); + type::AronObjectPtr k2_type = k2_type_nav->toAronObjectPtr(); BOOST_CHECK_NE(k2_type.get(), nullptr); std::cout << "\t getting aron 1" << std::endl; @@ -120,10 +123,12 @@ void runTestWithInstances(T& k1, T& k2) //std::cout << AronDebug::AronDataPtrToString(k2_aron) << std::endl; std::cout << "\t setting aron 1 from aron 2 and check for equality" << std::endl; + k1.fromAron(k2_aron_nav); BOOST_CHECK_EQUAL((k1 == k2), true); + //std::cout << "\t getting current type 1" << std::endl; //typenavigator::NavigatorPtr k1_current_type_nav = k1.toCurrentAronType(); //type::AronTypePtr k1_current_type = k1_current_type_nav->getResult(); @@ -135,23 +140,25 @@ void runTestWithInstances(T& k1, T& k2) //BOOST_CHECK_NE(k2_current_type.get(), nullptr); r.initializeRandomly(k1_aron_nav, k1_type_nav); + k1.fromAron(k1_aron); + std::cout << "\t check JSON export of k and k2 for equality" << std::endl; - armarx::aron::io::NlohmannJSONWriter json_writer_for_k1; - armarx::aron::io::NlohmannJSONWriter json_writer_for_k2; + armarx::aron::dataIO::writer::NlohmannJSONWriter json_writer_for_k1; + armarx::aron::dataIO::writer::NlohmannJSONWriter json_writer_for_k2; k1.write(json_writer_for_k1); nlohmann::json k1_aron_json = json_writer_for_k1.getResult(); std::string k1_aron_json_str = k1_aron_json.dump(4); - armarx::aron::io::NlohmannJSONWriter direct_json_writer_for_k1; - armarx::aron::io::Visitor::SetupWriterFromAronDataPtr(direct_json_writer_for_k1, k1_aron); + armarx::aron::dataIO::writer::NlohmannJSONWriter direct_json_writer_for_k1; + armarx::aron::dataIO::Visitor::SetupWriterFromAronDataPtr(direct_json_writer_for_k1, k1_aron); nlohmann::json direct_k1_aron_json = direct_json_writer_for_k1.getResult(); std::string direct_k1_aron_json_str = direct_k1_aron_json.dump(4); BOOST_CHECK_EQUAL((k1_aron_json_str == direct_k1_aron_json_str), true); - armarx::aron::io::AronDataNlohmannJSONReader json_reader_for_k2(k1_aron_json); + armarx::aron::dataIO::reader::NlohmannJSONReader json_reader_for_k2(k1_aron_json); k2.read(json_reader_for_k2); k2.write(json_writer_for_k2); @@ -161,20 +168,6 @@ void runTestWithInstances(T& k1, T& k2) //std::cout << "\t K1 as json: " << std::endl << k1_aron_json_str << std::endl; //std::cout << "\t K2 as json: " << std::endl << k2_aron_json_str << std::endl; BOOST_CHECK_EQUAL((k1_aron_json_str == k2_aron_json_str), true); - - //std::cout << "\t check XML export of k and k2 for equality" << std::endl; - //armarx::aron::io::AronDataRapidXMLWriter xml_writer1; - //armarx::aron::io::AronDataRapidXMLWriter xml_writer2; - - //k.write(xml_writer1); - //k_aron_rapid_xml = xml_writer1.getResult(); - - //k2.write(xml_writer2); - //k2_aron_xml = xml_writer2.getResult(); - - //std::cout << "\t K as XML: " << std::endl << k_aron_xml << std::endl; - //std::cout << "\t K2: " << std::endl << k2_aron_json << std::endl; - //BOOST_CHECK_EQUAL((k_aron_xml == k2_aron_xml), true);*/ } @@ -191,7 +184,7 @@ BOOST_AUTO_TEST_CASE(AronNaturalIKTest) Path memberReached(path, "reached"); Path memberJointValues(path, "jointValues"); Path indexJointValues0(memberJointValues, "0"); - Path indexJointValues1(memberJointValues, "1000"); + Path indexJointValues1(memberJointValues, "1"); BOOST_CHECK_EQUAL(path.toString(), "\\"); BOOST_CHECK_EQUAL(path.size(), 0); @@ -250,39 +243,35 @@ BOOST_AUTO_TEST_CASE(AronPrimitiveTest) runTestWithInstances<PrimitiveTest>(p, p2); } -BOOST_AUTO_TEST_CASE(AronSimpleClassTest) -{ - std::cout << "Running SimpleClass test" << std::endl; - SimpleClass o1; - SimpleClass o12; - runTestWithInstances<SimpleClass>(o1, o12); -} - BOOST_AUTO_TEST_CASE(AronObjectTest) { std::cout << "Running Object test" << std::endl; - ObjectTest o2; - ObjectTest o22; - runTestWithInstances<ObjectTest>(o2, o22); + ObjectTest1 o1; + ObjectTest1 o12; + runTestWithInstances<ObjectTest1>(o1, o12); + + ObjectTest2 o2; + ObjectTest2 o22; + runTestWithInstances<ObjectTest2>(o2, o22); } BOOST_AUTO_TEST_CASE(AronImageTest) { std::cout << "Running Image test" << std::endl; - ImageTest i; - ImageTest i2; - runTestWithInstances<ImageTest>(i, i2); + IVTCByteImageTest i; + IVTCByteImageTest i2; + runTestWithInstances<IVTCByteImageTest>(i, i2); } -BOOST_AUTO_TEST_CASE(AronImageChangeSizeTest) +/*BOOST_AUTO_TEST_CASE(AronImageChangeSizeTest) { std::cout << "Running Image test with changed sizes" << std::endl; - ImageTest ii; - ImageTest ii2; - ii.the_ivt_image->Set(100, 100, ii.the_ivt_image->type); - ii2.the_ivt_image->Set(10, 10, ii.the_ivt_image->type); - runTestWithInstances<ImageTest>(ii, ii2); -} + IVTCByteImageTest ii; + IVTCByteImageTest ii2; + ii.the_ivt_image.Set(100, 100, ii.the_ivt_image.type); + ii2.the_ivt_image.Set(10, 10, ii.the_ivt_image.type); + runTestWithInstances<IVTCByteImageTest>(ii, ii2); +}*/ BOOST_AUTO_TEST_CASE(AronEigenMatrixTest) { @@ -328,3 +317,35 @@ BOOST_AUTO_TEST_CASE(AronTests) AronNestedDataWithoutCodeGeneration rn2; runTestWithInstances<AronNestedDataWithoutCodeGeneration>(rn1, rn2); }*/ + +BOOST_AUTO_TEST_CASE(AronEigenQuaternionTest) +{ + std::cout << "Running EigenQuaternion test" << std::endl; + EigenQuaternionTest eq; + EigenQuaternionTest eq2; + runTestWithInstances<EigenQuaternionTest>(eq, eq2); +} + +BOOST_AUTO_TEST_CASE(AronPositionTest) +{ + std::cout << "Running Position test" << std::endl; + PositionTest pc; + PositionTest pc2; + runTestWithInstances<PositionTest>(pc, pc2); +} + +BOOST_AUTO_TEST_CASE(AronOrientationTest) +{ + std::cout << "Running Orientation test" << std::endl; + OrientationTest pc; + OrientationTest pc2; + runTestWithInstances<OrientationTest>(pc, pc2); +} + +BOOST_AUTO_TEST_CASE(AronPoseTest) +{ + std::cout << "Running Pose test" << std::endl; + PoseTest pc; + PoseTest pc2; + runTestWithInstances<PoseTest>(pc, pc2); +} diff --git a/source/RobotAPI/libraries/aron/core/test/xmls/BaseClass.xml b/source/RobotAPI/libraries/aron/core/test/xmls/BaseClass.xml index 8cab5e6fd4eb572192e7db5df327883760288327..57d4e6951e98ccb690b8e2c61e6730c067cf01e0 100644 --- a/source/RobotAPI/libraries/aron/core/test/xmls/BaseClass.xml +++ b/source/RobotAPI/libraries/aron/core/test/xmls/BaseClass.xml @@ -2,7 +2,7 @@ <?xml version="1.0" encoding="UTF-8" ?> <AronTypeDefinition> <GenerateTypes> - <GenerateType name='armarx::BaseClassTest'> + <GenerateObject name='armarx::BaseClassTest'> <ObjectChild key='base_class_member1'> <Bool /> @@ -24,6 +24,6 @@ </List> </ObjectChild> - </GenerateType> + </GenerateObject> </GenerateTypes> </AronTypeDefinition> diff --git a/source/RobotAPI/libraries/aron/core/test/xmls/DerivedClassTest.xml b/source/RobotAPI/libraries/aron/core/test/xmls/DerivedClassTest.xml index 4d06665c2ac40ebfcfcb4514e75bff8dc637ce68..de4be250d23c90f27d8198d890e7ef0576d672cb 100644 --- a/source/RobotAPI/libraries/aron/core/test/xmls/DerivedClassTest.xml +++ b/source/RobotAPI/libraries/aron/core/test/xmls/DerivedClassTest.xml @@ -8,12 +8,12 @@ <Include include="/home/fabian/Software/ArmarX/RobotAPI/source/RobotAPI/libraries/aron/test/xmls/BaseClass.xml" /> </AronIncludes> <GenerateTypes> - <GenerateType name='armarx::DerivedClass' extends="armarx::BaseClassTest"> + <GenerateObject name='armarx::DerivedClass' extends="armarx::BaseClassTest"> <ObjectChild key='derived_class_member1'> <Bool /> </ObjectChild> - </GenerateType> + </GenerateObject> </GenerateTypes> </AronTypeDefinition> diff --git a/source/RobotAPI/libraries/aron/core/test/xmls/SimpleDictTest.xml b/source/RobotAPI/libraries/aron/core/test/xmls/DictTest.xml similarity index 80% rename from source/RobotAPI/libraries/aron/core/test/xmls/SimpleDictTest.xml rename to source/RobotAPI/libraries/aron/core/test/xmls/DictTest.xml index 003b22dbaad241b3f3d93685f96a3d173183c9b8..fadec8226455e878c6a98ed7a76131c66a3944e6 100644 --- a/source/RobotAPI/libraries/aron/core/test/xmls/SimpleDictTest.xml +++ b/source/RobotAPI/libraries/aron/core/test/xmls/DictTest.xml @@ -2,12 +2,12 @@ <?xml version="1.0" encoding="UTF-8" ?> <AronTypeDefinition> <GenerateTypes> - <GenerateType name='armarx::DictTest'> + <Object name='armarx::DictTest'> <objectchild key='dict'> <Dict> <Float /> </Dict> </ObjectChild> - </GenerateType> + </Object> </GenerateTypes> </AronTypeDefinition> diff --git a/source/RobotAPI/libraries/aron/core/test/xmls/EigenMatrixTest.xml b/source/RobotAPI/libraries/aron/core/test/xmls/EigenMatrixTest.xml index 0656e2f56972af2f0fc0e0adc49d2e40a11df986..b3f5f6447c6fc6f3d3a8851e00578156ad4560b3 100644 --- a/source/RobotAPI/libraries/aron/core/test/xmls/EigenMatrixTest.xml +++ b/source/RobotAPI/libraries/aron/core/test/xmls/EigenMatrixTest.xml @@ -7,10 +7,22 @@ <AronIncludes> </AronIncludes> <GenerateTypes> - <GenerateType name='armarx::EigenMatrixTest'> - <ObjectChild key='the_eigen_matrix'> + <Object name='armarx::EigenMatrixTest'> + <ObjectChild key='the_short_eigen_matrix'> + <EigenMatrix rows="10" cols="25" type="short" /> + </ObjectChild> + <ObjectChild key='the_int_eigen_matrix'> <EigenMatrix rows="25" cols="25" type="int" /> </ObjectChild> - </GenerateType> + <ObjectChild key='the_long_eigen_matrix'> + <EigenMatrix rows="25" cols="10" type="long" /> + </ObjectChild> + <ObjectChild key='the_float_eigen_matrix'> + <EigenMatrix rows="1" cols="200" type="float" /> + </ObjectChild> + <ObjectChild key='the_double_eigen_matrix'> + <EigenMatrix rows="200" cols="1" type="double" /> + </ObjectChild> + </Object> </GenerateTypes> </AronTypeDefinition> diff --git a/source/RobotAPI/libraries/aron/core/test/xmls/EigenQuaternionTest.xml b/source/RobotAPI/libraries/aron/core/test/xmls/EigenQuaternionTest.xml new file mode 100644 index 0000000000000000000000000000000000000000..74eec8bbfaa61ed9f20b2a0e7f7cf08344884ea4 --- /dev/null +++ b/source/RobotAPI/libraries/aron/core/test/xmls/EigenQuaternionTest.xml @@ -0,0 +1,19 @@ +<!--Some fancy comment --> +<?xml version="1.0" encoding="UTF-8" ?> +<AronTypeDefinition> + <CodeIncludes> + <Include include="<Eigen/Core>" /> + </CodeIncludes> + <AronIncludes> + </AronIncludes> + <GenerateTypes> + <Object name='armarx::EigenQuaternionTest'> + <ObjectChild key='the_float_eigen_matrix'> + <EigenQuaternion type="float" /> + </ObjectChild> + <ObjectChild key='the_double_eigen_matrix'> + <EigenQuaternion type="double" /> + </ObjectChild> + </Object> + </GenerateTypes> +</AronTypeDefinition> diff --git a/source/RobotAPI/libraries/aron/core/test/xmls/EnumTest.xml b/source/RobotAPI/libraries/aron/core/test/xmls/EnumTest.xml new file mode 100644 index 0000000000000000000000000000000000000000..789959fc609e8c15b62733199439bd1506aae8dc --- /dev/null +++ b/source/RobotAPI/libraries/aron/core/test/xmls/EnumTest.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<AronTypeDefinition> + <GenerateTypes> + <IntEnum name="TheIntEnum"> + <EnumValue key="INT_ENUM_VALUE_0" value="0" /> + <EnumValue key="INT_ENUM_VALUE_1" value="1" /> + <EnumValue key="INT_ENUM_VALUE_2" value="2" /> + <EnumValue key="INT_ENUM_VALUE_3" value="3" /> + <EnumValue key="INT_ENUM_VALUE_4" value="4" /> + <EnumValue key="INT_ENUM_VALUE_5" value="5" /> + <EnumValue key="INT_ENUM_VALUE_6" value="6" /> + <EnumValue key="INT_ENUM_VALUE_7" value="7" /> + <EnumValue key="INT_ENUM_VALUE_8" value="8" /> + </IntEnum> + <Object name="TheObjectThatUsesTheIntEnum"> + <objectchild key="some_string"> + <string /> + </objectchild> + <objectchild key="the_int_enum"> + <TheIntEnum /> + </objectchild> + </Object> + </GenerateTypes> +</AronTypeDefinition> diff --git a/source/RobotAPI/libraries/aron/core/test/xmls/HumanPoseTest.xml b/source/RobotAPI/libraries/aron/core/test/xmls/HumanPoseTest.xml index 4a0948ed12871ce2010603ffaacb701ee2dfd9c9..78f4fd166c505e6e8b2d0cd4f4ac5c73f391d371 100644 --- a/source/RobotAPI/libraries/aron/core/test/xmls/HumanPoseTest.xml +++ b/source/RobotAPI/libraries/aron/core/test/xmls/HumanPoseTest.xml @@ -1,8 +1,7 @@ -<!--This class contains the data structure for OpenPoseEstimationResults --> <?xml version="1.0" encoding="UTF-8" ?> <AronTypeDefinition> <GenerateTypes> - <GenerateType name='armarx::OpenPoseEstimationResult'> + <Object name='armarx::HumanPoseTest'> <ObjectChild key='reached'> <Bool /> @@ -14,6 +13,6 @@ </List> </ObjectChild> - </GenerateType> + </Object> </GenerateTypes> </AronTypeDefinition> diff --git a/source/RobotAPI/libraries/aron/core/test/xmls/IVTCByteImageTest.xml b/source/RobotAPI/libraries/aron/core/test/xmls/IVTCByteImageTest.xml new file mode 100644 index 0000000000000000000000000000000000000000..286f6709eb711af46aeedde4e9ee0bec7641551f --- /dev/null +++ b/source/RobotAPI/libraries/aron/core/test/xmls/IVTCByteImageTest.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<AronTypeDefinition> + <GenerateTypes> + <Object name='armarx::IVTCByteImageTest'> + + <ObjectChild key='the_grayscale_image'> + <IVTCByteImage width="25" height="25" type="GrayScale" /> + </ObjectChild> + + <ObjectChild key='the_rgb_image'> + <IVTCByteImage width="1920" height="1080" type="RGB24" /> + </ObjectChild> + + </Object> + </GenerateTypes> +</AronTypeDefinition> diff --git a/source/RobotAPI/libraries/aron/core/test/xmls/ImageTest.xml b/source/RobotAPI/libraries/aron/core/test/xmls/ImageTest.xml deleted file mode 100644 index 074128ebef8a32e4b7b5d631ec2336f41d1c06ef..0000000000000000000000000000000000000000 --- a/source/RobotAPI/libraries/aron/core/test/xmls/ImageTest.xml +++ /dev/null @@ -1,16 +0,0 @@ -<!--Some fancy comment --> -<?xml version="1.0" encoding="UTF-8" ?> -<AronTypeDefinition> - <CodeIncludes> - <Include include="<Image/ByteImage.h>" /> - </CodeIncludes> - <AronIncludes> - </AronIncludes> - <GenerateTypes> - <GenerateType name='armarx::ImageTest'> - <ObjectChild key='the_ivt_image'> - <IVTCByteImage width="25" height="25" type="GrayScale" /> - </ObjectChild> - </GenerateType> - </GenerateTypes> -</AronTypeDefinition> diff --git a/source/RobotAPI/libraries/aron/core/test/xmls/ListTest.xml b/source/RobotAPI/libraries/aron/core/test/xmls/ListTest.xml index 0917c8ea0f34e98b1b250f11b7b94cef35f3f43c..1c8ed164015d99ad0b5eddc8881dc4d43d626c28 100644 --- a/source/RobotAPI/libraries/aron/core/test/xmls/ListTest.xml +++ b/source/RobotAPI/libraries/aron/core/test/xmls/ListTest.xml @@ -2,7 +2,7 @@ <?xml version="1.0" encoding="UTF-8" ?> <AronTypeDefinition> <GenerateTypes> - <GenerateType name='armarx::ListTest'> + <Object name='armarx::ListTest'> <ObjectChild key='floatList'> <List> <Float /> @@ -45,14 +45,14 @@ <Bool /> </ObjectChild> <ObjectChild key='element1'> - <Bool /> + <Int /> </ObjectChild> <ObjectChild key='element2'> - <Bool /> + <Double /> </ObjectChild> </Object> </List> </ObjectChild> - </GenerateType> + </Object> </GenerateTypes> </AronTypeDefinition> diff --git a/source/RobotAPI/libraries/aron/core/test/xmls/NaturalIK.xml b/source/RobotAPI/libraries/aron/core/test/xmls/NaturalIKTest.xml similarity index 84% rename from source/RobotAPI/libraries/aron/core/test/xmls/NaturalIK.xml rename to source/RobotAPI/libraries/aron/core/test/xmls/NaturalIKTest.xml index 87f43c9e43eb4f0e938b123c0e45693ba7824c4e..06dc659d12d955b30b2113ffe7125e2320d96127 100644 --- a/source/RobotAPI/libraries/aron/core/test/xmls/NaturalIK.xml +++ b/source/RobotAPI/libraries/aron/core/test/xmls/NaturalIKTest.xml @@ -2,7 +2,7 @@ <?xml version="1.0" encoding="UTF-8" ?> <AronTypeDefinition> <GenerateTypes> - <GenerateType name='armarx::NaturalIKResult'> + <Object name='armarx::NaturalIKResult'> <ObjectChild key='reached'> <Bool /> @@ -14,6 +14,6 @@ </List> </ObjectChild> - </GenerateType> + </Object> </GenerateTypes> </AronTypeDefinition> diff --git a/source/RobotAPI/libraries/aron/core/test/xmls/SimpleObjectTest.xml b/source/RobotAPI/libraries/aron/core/test/xmls/ObjectTest.xml similarity index 62% rename from source/RobotAPI/libraries/aron/core/test/xmls/SimpleObjectTest.xml rename to source/RobotAPI/libraries/aron/core/test/xmls/ObjectTest.xml index ee51a55a389a4fbd6833b7f13bf555795c4371bd..43903d1ce67236c564145ef79ed2732ff4fb522c 100644 --- a/source/RobotAPI/libraries/aron/core/test/xmls/SimpleObjectTest.xml +++ b/source/RobotAPI/libraries/aron/core/test/xmls/ObjectTest.xml @@ -3,34 +3,34 @@ <AronTypeDefinition> <GenerateTypes> - <GenerateType name='armarx::SimpleClass'> + <Object name='armarx::ObjectTest1'> <objectchild key='the_bool'> <bool /> </objectchild> - </GenerateType> + </Object> - <GenerateType name='armarx::ObjectTest'> + <Object name='armarx::ObjectTest2'> <objectchild key='local_object'> - <object name='OtherFancyObject'> - <objectchild key='blarg'> + <object name='LocalObjectTest1'> + <objectchild key='the_bool'> <bool /> </objectchild> - <objectchild key='other_blarg'> + <objectchild key='the_int'> <int /> </objectchild> </object> </ObjectChild> <objectchild key='another_local_object'> - <object name='VisionClass'> - <objectchild key='blarg'> + <object name='LocalObjectTest2'> + <objectchild key='the_bool'> <bool /> </objectchild> - <objectchild key='other_object'> + <objectchild key='the_int'> <int /> </objectchild> </object> </ObjectChild> - </GenerateType> + </Object> </GenerateTypes> </AronTypeDefinition> diff --git a/source/RobotAPI/libraries/aron/core/test/xmls/OpenCVMatTest.xml b/source/RobotAPI/libraries/aron/core/test/xmls/OpenCVMatTest.xml index f47a174059ccf876b1e1a9cae0b220c3212906a8..c5cfb1e95c41d72790a7a6a65b5d028adbeb0576 100644 --- a/source/RobotAPI/libraries/aron/core/test/xmls/OpenCVMatTest.xml +++ b/source/RobotAPI/libraries/aron/core/test/xmls/OpenCVMatTest.xml @@ -7,10 +7,19 @@ <AronIncludes> </AronIncludes> <GenerateTypes> - <GenerateType name='armarx::OpenCVMatTest'> - <ObjectChild key='the_opencv_matrix'> - <OpenCVMat dimensions="25, 25" type="CV_32S" /> + <Object name='armarx::OpenCVMatTest'> + <ObjectChild key='the_2d_opencv_matrix'> + <OpenCVMat dimensions="25, 25" type="64F" /> </ObjectChild> - </GenerateType> + <ObjectChild key='the_3d_opencv_matrix'> + <OpenCVMat dimensions="25, 25, 25" type="CV_32F" /> + </ObjectChild> + <ObjectChild key='the_4d_opencv_matrix'> + <OpenCVMat dimensions="25, 25, 25, 25" type="CV_32S" /> + </ObjectChild> + <ObjectChild key='the_5d_opencv_matrix'> + <OpenCVMat dimensions="25, 25, 25, 25, 25" type="16U" /> + </ObjectChild> + </Object> </GenerateTypes> </AronTypeDefinition> diff --git a/source/RobotAPI/libraries/aron/core/test/xmls/OrientationTest.xml b/source/RobotAPI/libraries/aron/core/test/xmls/OrientationTest.xml new file mode 100644 index 0000000000000000000000000000000000000000..c5c531e48855014722aa5ad91b29799c995eb098 --- /dev/null +++ b/source/RobotAPI/libraries/aron/core/test/xmls/OrientationTest.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<AronTypeDefinition> + <CodeIncludes> + <Include include="<Eigen/Core>" /> + </CodeIncludes> + + <GenerateTypes> + <Object name='armarx::OrientationTest'> + + <ObjectChild key='orientation'> + <Orientation /> + </ObjectChild> + + </Object> + </GenerateTypes> +</AronTypeDefinition> diff --git a/source/RobotAPI/libraries/aron/core/test/xmls/PCLPointCloudTest.xml b/source/RobotAPI/libraries/aron/core/test/xmls/PCLPointCloudTest.xml index b09c7f2ab2397454224f9db56c764919e781cc4c..dff170ce43a968424e05839de91ada689e49ecf1 100644 --- a/source/RobotAPI/libraries/aron/core/test/xmls/PCLPointCloudTest.xml +++ b/source/RobotAPI/libraries/aron/core/test/xmls/PCLPointCloudTest.xml @@ -8,10 +8,13 @@ <AronIncludes> </AronIncludes> <GenerateTypes> - <GenerateType name='armarx::PointCloudTest'> - <ObjectChild key='the_pcl_pointcloud'> + <Object name='armarx::PointCloudTest'> + <ObjectChild key='the_xyzrgb_pcl_pointcloud'> <PCLPointCloud width="25" height="25" type="PointXYZRGB" /> </ObjectChild> - </GenerateType> + <ObjectChild key='the_xyzrgba_pcl_pointcloud'> + <PCLPointCloud width="128" height="128" type="pcl::PointXYZRGBA" /> + </ObjectChild> + </Object> </GenerateTypes> </AronTypeDefinition> diff --git a/source/RobotAPI/libraries/aron/core/test/xmls/PoseTest.xml b/source/RobotAPI/libraries/aron/core/test/xmls/PoseTest.xml new file mode 100644 index 0000000000000000000000000000000000000000..4af320525509ee7ce05b0b5c60e22d14fd555f6b --- /dev/null +++ b/source/RobotAPI/libraries/aron/core/test/xmls/PoseTest.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<AronTypeDefinition> + <CodeIncludes> + <Include include="<Eigen/Core>" /> + </CodeIncludes> + <GenerateTypes> + <Object name='armarx::PoseTest'> + + <ObjectChild key='pose'> + <Pose /> + </ObjectChild> + + </Object> + </GenerateTypes> +</AronTypeDefinition> diff --git a/source/RobotAPI/libraries/aron/core/test/xmls/PositionTest.xml b/source/RobotAPI/libraries/aron/core/test/xmls/PositionTest.xml new file mode 100644 index 0000000000000000000000000000000000000000..64d9392fe8415b75ee59f896d3be7aa4b42bd9ae --- /dev/null +++ b/source/RobotAPI/libraries/aron/core/test/xmls/PositionTest.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<AronTypeDefinition> + <CodeIncludes> + <Include include="<Eigen/Core>" /> + </CodeIncludes> + <GenerateTypes> + <Object name='armarx::PositionTest'> + + <ObjectChild key='position'> + <Position /> + </ObjectChild> + + </Object> + </GenerateTypes> +</AronTypeDefinition> diff --git a/source/RobotAPI/libraries/aron/core/test/xmls/PrimitiveTest.xml b/source/RobotAPI/libraries/aron/core/test/xmls/PrimitiveTest.xml index d2dc7bb640b4e089a5508a055ada41352fd6539d..ea38c815ffb08531d29d1ae9401aba7ff72ba479 100644 --- a/source/RobotAPI/libraries/aron/core/test/xmls/PrimitiveTest.xml +++ b/source/RobotAPI/libraries/aron/core/test/xmls/PrimitiveTest.xml @@ -2,7 +2,7 @@ <?xml version="1.0" encoding="UTF-8" ?> <AronTypeDefinition> <GenerateTypes> - <GenerateType name='armarx::PrimitiveTest'> + <Object name='armarx::PrimitiveTest'> <objectchild key='the_int'> <int /> </ObjectChild> @@ -21,6 +21,9 @@ <objectchild key='the_bool'> <bool /> </ObjectChild> - </GenerateType> + <objectchild key='the_time'> + <time /> + </ObjectChild> + </Object> </GenerateTypes> </AronTypeDefinition>