Skip to content

ndsev/zserio-cpp17

Repository files navigation

runtime - doc

C++17 Extension

This extension implements a C++17 generator for Zserio.

Motivation

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.

Advantages

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:5 and bit:7 types are stored in the same C++ uint8_t type), this approach also involves implementing dedicated C++ Zserio types for all Zserio built-in types within the C++ runtime library.

Current State

The Design Document acts as the primary source of information about the C++17 generator design and is updated regularly.

Current state (17.10.2024):

  • The class for optional members have been implemented in the runtime library header Optional.h
  • The class for choice members have been implemented in the runtime library header Variant.h
  • The classes for all Zserio types have been implemented in the runtime library header Types.h
  • The generator partially supports the following Zserio types:
    • Enumeration types
    • Bitmask types
    • Constants
    • Structure types (only Data)
    • Choice types (only Data)
    • Union types (only Data)

How to Get the C++17 Generator

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-java8 artifact for Zserio bundle jar
  • Alternatively, download zserio-runtime-cpp artifact for Zserio runtime library

For example, the Zserio bundle jar (17.10.2024) can be downloaded from here and Zserio runtime library (17.10.2024) can be downloaded from here.

How to Run the C++17 Generator

Run the Zserio C++17 generator using the following steps:

  • Unzip zserio-java8 to get zserio.jar binary
  • Run the command java -jar zserio.jar schema_name.zs -cpp17 output_directory_name