From 2c243c3e41a5557d57bfd232893591d9e99f145e Mon Sep 17 00:00:00 2001 From: Martchus Date: Sun, 6 Jun 2021 15:06:55 +0200 Subject: [PATCH] WIP: Add marker macros for versioning --- generator/tests/morestructs.h | 16 ++++++++++++++++ lib/CMakeLists.txt | 2 +- lib/versioning.h | 27 +++++++++++++++++++++++++++ 3 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 lib/versioning.h diff --git a/generator/tests/morestructs.h b/generator/tests/morestructs.h index d355236..14cf3b6 100644 --- a/generator/tests/morestructs.h +++ b/generator/tests/morestructs.h @@ -1,8 +1,11 @@ #ifndef REFLECTIVE_RAPIDJSON_TESTS_MORE_STRUCTS_H #define REFLECTIVE_RAPIDJSON_TESTS_MORE_STRUCTS_H +#define REFLECTIVE_RAPIDJSON_SHORT_MACROS + #include "../../lib/binary/serializable.h" #include "../../lib/json/serializable.h" +#include "../../lib/versioning.h" using namespace std; using namespace ReflectiveRapidJSON; @@ -67,4 +70,17 @@ struct PointerStruct : public BinarySerializable { std::shared_ptr s3; }; +/*! + * \brief The PointerStruct struct is used to test the behavior of the binary (de)serialization with smart pointer. + */ +struct VersionedStruct : public BinarySerializable { + std::uint32_t a, b; + +until_version(2): + std::uint32_t c, d; + +as_of_version(3): + std::uint32_t e, f; +}; + #endif // REFLECTIVE_RAPIDJSON_TESTS_MORE_STRUCTS_H diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt index f555b2a..7ff73cb 100644 --- a/lib/CMakeLists.txt +++ b/lib/CMakeLists.txt @@ -5,7 +5,7 @@ set(META_PROJECT_TYPE library) set(META_HEADER_ONLY_LIB ON) # add project files -set(HEADER_FILES traits.h) +set(HEADER_FILES traits.h versioning.h) set(SRC_FILES) set(TEST_HEADER_FILES) set(TEST_SRC_FILES) diff --git a/lib/versioning.h b/lib/versioning.h new file mode 100644 index 0000000..13019ae --- /dev/null +++ b/lib/versioning.h @@ -0,0 +1,27 @@ +#ifndef REFLECTIVE_RAPIDJSON_VERSIONING +#define REFLECTIVE_RAPIDJSON_VERSIONING + +namespace ReflectiveRapidJSON { + +#ifdef REFLECTIVE_RAPIDJSON_GENERATOR +#define REFLECTIVE_RAPIDJSON_CAT_1(a, b) a##b +#define REFLECTIVE_RAPIDJSON_CAT_2(a, b) REFLECTIVE_RAPIDJSON_CAT_1(a, b) +#define REFLECTIVE_RAPIDJSON_AS_OF_VERSION(version) \ + constexpr std::size_t REFLECTIVE_RAPIDJSON_CAT_2(rrjAsOfVersion, __COUNTER__) = version; \ + public +#define REFLECTIVE_RAPIDJSON_UNTIL_VERSION(version) \ + constexpr std::size_t REFLECTIVE_RAPIDJSON_CAT_2(rrjUntilVersion, __COUNTER__) = version; \ + public +#else +#define REFLECTIVE_RAPIDJSON_AS_OF_VERSION(version) public +#define REFLECTIVE_RAPIDJSON_UNTIL_VERSION(version) public +#endif + +#ifdef REFLECTIVE_RAPIDJSON_SHORT_MACROS +#define as_of_version(version) REFLECTIVE_RAPIDJSON_AS_OF_VERSION(version) +#define until_version(version) REFLECTIVE_RAPIDJSON_UNTIL_VERSION(version) +#endif + +} // namespace ReflectiveRapidJSON + +#endif // REFLECTIVE_RAPIDJSON_TRAITS