* 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>
5.9 KiB
| 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:
- Runs Cog on every
*_generator.hfile. - Compares each output against the corresponding file in
include/etl/private/. - 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
- Create
include/etl/generators/<name>_cpp03_generator.hwith Cog directives. - Add a corresponding entry to
generate.bat. - Run
generate.bat(or the equivalent Cog command) to produceinclude/etl/private/<name>_cpp03.h. - Commit both the generator and the generated output.
- 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 |