etl/docs/source/generators.md
John Wellbelove 4a88884b39
Issue/add hugo support for documentation (#1449)
* Add ranges

* Initial Hugo setup

* Work in progress

* Added selection for local or remote site

* Updated to 'light' theme

* Changed to using Hextra Hugo theme

* Changed to using Hextra Hugo theme

* Changed to Hextra Hugo theme

* Change to Hextra Hugo theme

* Updated Hugo setup.

* Updated Hugo setup.

# Conflicts:
#	docs/releases/_index.md

* Work in progress

* Added new fonts

Added new documentation

* Latest documentation updates

* Latest documentation updates

# Conflicts:
#	docs/containers/array.md
#	docs/containers/array_view.md
#	docs/containers/array_wrapper.md
#	docs/containers/bip_buffer_spsc_atomic.md
#	docs/containers/bitset.md
#	docs/containers/indirect_vector.md
#	docs/containers/vector.md
#	docs/getting-started/compilers.md

* Added bloom_filter markdown doc

* Added more documentation

Updated CSS for light and dark modes

* Fixed some menus

Added mode documentation files

* Updated CSS rules

Added badges to home page
Added uniqur_ptr + pool tutorial

* Fixed formatting on the home page markdown

Modified light amd dark code formatting

* Updated unique_ptr-with-pool

* Added container and shared message tutorials

* Updates to documentation

* Added const_multimap

* Updated source-formatting.md

* Added initial raw text files form Web site editor

* Innore coverage build directory

* Exported raw text documentation files from the web site editor

* Hugo updates

* Added Hugo intalation and markdown descriptions

* More addition to the documentation

* Added closure.md and updates to delegate.md

* Added format.md

* Added documentation for etl::delegate_observable, etl::function, Base64 codec

* Added io_port documentation

* Added basic_format_spec

* Added documentation for string_stream and string utilities.

* Added more documentation

Updated the documentation CSS

* Added documentation for clocks, day, duration

* Added more documentation for chrono classes

Updated callouts

* More chrono documentation

* Completed chrono documentation

* Maths functions documentation

* Completed maths documentation

* Completed maths documentation

* Completed maths documentation

* Completed maths documentation

* Added multiple documentation files

* Added iterator.md

* Added debug_count.md and versions.md

* Added debug_count.md and versions.md

* Added more documentation

* More documentation

* Added some design pattern documentation

Modified some of the layout files
Modified the About documentation

* Converted more documentation pages

Modified the site CSS

* Added more documentation

Moced some documentation files to new directories

* Added more documentation

Tweaks to CSS

* Added callback_timer_deferred_locked documentation

* Added callback_timer_locked documentation

* More documentation updates

* More documentation updates

* More documentation updates

* New documentation files.

Harmonised file name format

* New documentation files.

* Multiple document updates

* Multiple document updates

* Final conversion of web pages

* Updates before PR

* Updates before PR

* Updates before PR

# Conflicts:
#	docs/blog/_index.md

* Final pre PR updates

* Updates to message framework documentation

* Renamed directory

* Fix spelling

* Added author and date to blog files

Moved documentation files merged from development

* Fixed 'Description' typo

* Fix typos

# Conflicts:
#	docs/IO/io_port.md
#	docs/containers/sets/const-multiset.md
#	docs/containers/sets/const-set.md
#	docs/maths/correlation.md
#	docs/maths/gamma.md

* Renamed two files to lower case

* Minor renaming

* Added author and date

* Updated callout on bresenham_line.md

Added support for showing the ETL version on the documentation first page, by copying the version.txt file as a hugo asset.
Updated the Python 'update_release.py' to copy 'version.txt'

* Replace space in filename with hyphen.

Added more information to hugo-commands.md

* Replace space in filename with hyphen.

Added more information to hugo-commands.md

# Conflicts:
#	docs/getting-started/view-the-docs-locally/hugo-commands.md

* Added a link to pseudo_moving_average.md

* Updated title pages for groups

* Fixed missing 404 for non-existent pages

* Fixed coordinate variable names in the 'Calculating the intersection' example

---------

Co-authored-by: Roland Reichwein <Roland.Reichwein@bmw.de>
Co-authored-by: John Wellbelove <john.wellbelove@etlcpp.com>
Co-authored-by: John Wellbelove <john.wellbelove@etlcpp.co.uk>
2026-06-06 13:12:44 +01:00

5.9 KiB
Raw Blame History

title weight
Code Generation for Pre-C++11 Support 5

ETL supports C++03 (also referred to as C++98) environments where variadic templates, constexpr, and other modern features are unavailable. To provide equivalent functionality, certain headers are generated using Cog, a Python-based code generation tool that embeds Python snippets inside source files.

This document explains how the code generation system works and how to regenerate the headers if you modify a generator template.


Overview

Directory Contents
include/etl/generators/ Generator templates (*_generator.h) and batch scripts
include/etl/private/ Generated output (*_cpp03.h) committed to the repository
scripts/generator_test.py CI script that verifies generators match committed files

The generator templates contain embedded Python code (delimited by [[[cog and ]]]) that produces the repetitive C++03 boilerplate. Cog processes these templates and writes the expanded output to include/etl/private/.


Generated Headers

The following C++03 compatibility headers are generated:

Generator Output Purpose
fsm_fwd_decl_cpp03_generator.h fsm_fwd_decl_cpp03.h FSM forward declarations
fsm_friend_decl_cpp03_generator.h fsm_friend_decl_cpp03.h FSM friend declarations
fsm_cpp03_generator.h fsm_cpp03.h Finite state machine implementation
message_router_cpp03_generator.h message_router_cpp03.h Message router
message_packet_cpp03_generator.h message_packet_cpp03.h Message packet
largest_type_cpp03_generator.h largest_type_cpp03.h Largest type metafunction
largest_alignment_cpp03_generator.h largest_alignment_cpp03.h Largest alignment metafunction
largest_cpp03_generator.h largest_cpp03.h Largest type/size utilities
smallest_cpp03_generator.h smallest_cpp03.h Smallest type/size utilities
type_traits_cpp03_generator.h type_traits_cpp03.h Type traits (is_one_of, etc.)
type_lookup_cpp03_generator.h type_lookup_cpp03.h Type lookup metafunction
type_select_cpp03_generator.h type_select_cpp03.h Type selection metafunction
variant_pool_cpp03_generator.h variant_pool_cpp03.h Variant pool

Generator Parameters

Cog variables control how many template parameter overloads are generated:

Variable Default Used by
Handlers 16 FSM and message router generators
NTypes 16 Type utility generators (largest, smallest, lookup, select, variant pool)
IsOneOf 16 Type traits generator (is_one_of)

These defaults produce overloads supporting up to 16 types or handlers, which is sufficient for most embedded applications while keeping compile times reasonable.


Prerequisites

  • Python 3

  • cogapp install via:

    pip install cogapp
    

Regenerating Headers

Using the batch scripts (Windows)

Each generator has a corresponding .bat file in include/etl/generators/:

cd include/etl/generators
generate.bat          # Regenerate all headers
generate_fsm.bat      # Regenerate FSM headers only
generate_smallest.bat # Regenerate smallest_cpp03.h only
# etc.

Manual invocation

Run Cog directly from the include/etl/generators/ directory:

cd include/etl/generators

# Example: regenerate smallest_cpp03.h
python3 -m cogapp -d -e -o../private/smallest_cpp03.h -DNTypes=16 smallest_cpp03_generator.h

# Example: regenerate fsm_cpp03.h
python3 -m cogapp -d -e -o../private/fsm_cpp03.h -DHandlers=16 fsm_cpp03_generator.h

Cog options used:

Option Meaning
-d Delete the generator markers from output
-e Warn if the input file has no generator markers
-o<file> Write output to the specified file
-D<var>=<value> Define a Cog variable

Regenerating all headers

The generate.bat script regenerates every header:

cd include/etl/generators
./generate.bat   # Windows
# or run the commands manually on Linux/macOS

On Linux/macOS you can run the commands from generate.bat directly in your shell (they are standard python3 -m cogapp invocations).


Verifying Generators

After modifying a generator template, verify the output matches the committed file:

python3 scripts/generator_test.py

This script:

  1. Runs Cog on every *_generator.h file.
  2. Compares each output against the corresponding file in include/etl/private/.
  3. Reports success or failure.

The generator.yml GitHub Actions workflow runs this automatically on every push and pull request.


How Generators Work

A generator template contains standard C++ code interspersed with Cog directives. For example, from smallest_cpp03_generator.h:

/*[[[cog
import cog
cog.outl("template <typename T1, ")
for n in range(2, int(NTypes)):
    cog.out("typename T%s = void, " % n)
cog.outl("typename T%s = void>" % int(NTypes))
]]]*/
// Generated code appears here after running Cog
/*[[[end]]]*/

When Cog processes this file with -DNTypes=16, the Python code executes and outputs the expanded template parameter list supporting 16 types.


Adding a New Generator

  1. Create include/etl/generators/<name>_cpp03_generator.h with Cog directives.
  2. Add a corresponding entry to generate.bat.
  3. Run generate.bat (or the equivalent Cog command) to produce include/etl/private/<name>_cpp03.h.
  4. Commit both the generator and the generated output.
  5. Verify with python3 scripts/generator_test.py.

Troubleshooting

Problem Solution
ModuleNotFoundError: No module named 'cogapp' Install Cog: pip install cogapp
Generator output differs from committed file Regenerate and commit the updated output
Need more than 16 types/handlers Change -DNTypes= or -DHandlers= and regenerate