!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
As of zserio 2.5.0, there is a built-in C++-
Reflection emitter.
This project is NOT MAINTAINED anymore.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
################################################
## ### ##
## ## ##
####### ## ## ## ### ##
## ## ######### ## ##
## ## ## ###
## ####### ## ##
## ## ## ##
## ### ### ##
################################## #########
Z S E R I O C + + R E F L E C T I O NZsr provides a c++ runtime reflection layer for zserio generated c++ modules.
mkdir build && cd build
cmake -DZSERIO_RT_DIR=<path/to/zserio/compiler/extensions/cpp/runtime/src> ..
cmake --build .ctest .In your project CMakeLists.txt, call the add_zserio_module function to generate and
build a zserio c++ module with reflection metadata. Assuming zswag is a Git submodule of your project,
consider the following sample CMakeLists.txt:
project(myapp)
# This is how C++ will know about the zswag lib
# and its dependencies, such as zserio.
add_subdirectory(zswag)
add_zserio_module(<module-name>
ROOT <zserio module source root>
ENTRY <entrypoint zserio source. e.G. "main.zs">
TOP_LEVEL_PKG <optional: top level package name>)This will create two CMake targets <module-name> and <module-name>-reflection, the latter linking to the former.
To link against the generated zserio module, just link against <module-name>-reflection.
Zsr stores its top-level reflection metadata in a global list that can be accessed by calling zsr::packages().
Reflection metadata types and their hierarchy can be found in runtime/zsr/types.hpp.
There are various other utility functions available. Check the respective source files for more information:
- runtime/zsr/find.hpp – Functions for finding and resolving types
zsr::find: Find a reflection metadata object (Compound/Service Method/Field etc.) for a particular identifier.
- runtime/zsr/getset.hpp – Functions for getting and setting nested fields, and instantiating compounds.
zsr::get: Read a compound (nested) field value by name.zsr::set: Set a compound (nested) field value by name.zsr::make: Conveniently instantiate a compound with inline (nested) field value assignments. Note: Usezsr::Compound::initializeif your compound requires initialization parameters.
- runtime/zsr/introspectable-json.hpp – JSON export
zsr::serialize: Returns a JSON stream object from which a JSON string can be retrieved. Note: For standard binary serialization, usezsr::Compound::write.
Usage example:
#include "zsr/reflection-main.hpp" /* Metadata root */
#include "zsr/find.hpp" /* Find utilities */
#include "zsr/getset.hpp" /* Get/set utilities */
#include "zsr/introspectable-json.hpp" /* JSON export */
...
/* Finding a compound named "Test" */
auto compound = zsr::find<zsr::Compound>(zsr::packages(), "pkg.Test");
/* Finding field "a" of compound "A" */
auto field = zsr::find<zsr::Field>(zsr::packages(), "pkg.A.a");
/* Instantiate compound "Test" */
auto instance = compound->alloc();
/* Set some field */
zsr::set(instance, "field_a", "My Value");
/* Convert to JSON */
auto json = zsr::serialize(instance).str();
For more examples, have a look at the unit-tests under: runtime/test/zserio.