This extension implements a C++17 generator for Zserio.
Zserio already provides a C++ generator which uses the C++11 standard.
The user experience with the current C++ generator has led to new ideas and enhancements that could improve the usability of the generated code. Additionally, as time flies, users have requested support for the more modern C++17 standard. However, such changes to the generated code would break backward compatibility with existing user applications, which is undesirable. Therefore, this brand new C++17 generator with an incompatible API has been developed.
The following two main features of a C++17 generator offer significant advantages over the current C++ generator:
-
Implementation of the Parameterized Types
New C++17 generator implements Zserio Structures, Choices, and Unions using a new Data View abstraction. This new abstraction naturally solves tge implementation of Parameterized Types without the need for two-phase initialization or custom copy and move constructors.
-
Implementation of the Templates
New C++17 generator implements Zserio templates using C++ native templates. To distinguish which Zserio native type is used as a template argument (e.g. Zserio
bit:5andbit:7types are stored in the same C++uint8_ttype), this approach also involves implementing dedicated C++ Zserio types for all Zserio built-in types within the C++ runtime library.
Zserio C++17 generator supports the following platforms:
- 64-bit Linux
- 32-bit Linux
- 64-bit Windows
Zserio C++17 generator supports the following C++ compilers:
- g++ 11.4.0
- clang 14.0.0
- clang 18.1.3
- MinGW 11.2.0
- MSVC 2022
Although newer C++ compilers are not tested, they should work as well as long as they are backward compatible.
The Design Document acts as the primary source of information about the C++17 generator design.
The Command Line Parameters section lists command line parameters related to the C++17 generator.
The generator fully supports the Zserio language and Zserio templates are generated as native C++ templates.
Download the latest Zserio bundle jar (together with Zserio runtime library) from the GitHub action artifacts using the following steps:
- Go to the Actions page
- Click on the latest Linux workflow
- Scroll down to the Artifacts
- Download
zserio-java8artifact for Zserio bundle jar - Alternatively, download
zserio-runtime-cppartifact for Zserio runtime library
Run the Zserio C++17 generator using the following steps:
- Unzip
zserio-java8to getzserio.jarbinary - Run the command
java -jar zserio.jar schema_name.zs -cpp17 output_directory_name
java -jar zserio.jar
[-cpp17 <output directory>]
[-setCppAllocator <allocator>]
[-setTopLevelPackage <package>]
[-src <source directory>]
[-withSourcesAmalgamation|-withoutSourcesAmalgamation]
[-withTypeInfoCode|-withoutTypeInfoCode]
<input file>
-cpp17
Zserio will generate C++17 API into a given output directory.
-setCppAllocator
Sets the C++ allocator type to be used in generated code. Possible values: std (default), pmr, ppmr.
std stands for std::allocator class implemented in standard C++ library.
pmr stands for std::pmr::polymorphic_allocator class implemented in standard C++ library.
ppmr stands for zserio::pmr::PropagatingPolymorphicAllocator class implemented in
Zserio C++ runtime library.
-setTopLevelPackage
Sets the top level package for generated Java sources and top level namespace for generated C++ sources.
Parameter
-setTopLevelPackage appl.Zserioforces all generated Java sources to be in the packageappl.Zserioand all generated C++ sources to be in the namespaceappl::Zserio.
-src
Defines the root directory for the input file and all imported packages. If this option is missing, the default
value is the current working directory. Currently, only one source directory can be specified. A list of
directories as in the Java CLASSPATH is not supported.
If the source path is
C:\zserioand the input file iscom\acme\foo.zs, Zserio will try parsingC:\zserio\com\acme\foo.zs. Iffoo.zscontains the declarationimport com.acme.bar.*, Zserio will try parsingC:\zserio\com\acme\bar.zs.
-withSourcesAmalgamation|-withoutSourcesAmalgamation
Enables/disables amalgamation of generated C++ sources. By default the code for each zserio object is placed in one header and one source file. When amalgamation is enabled, C++ sources will be automatically amalgamated to speed up C++ compilation time. C++ sources generated in different subdirectories will be amalgamated separately. Thus, if amalgamation is enabled, each generated subdirectory will contain only one C++ source module.
-withTypeInfoCode|-withoutTypeInfoCode
Enables/disables generation of type information code. By default is disabled.