etl/docs/utilities/type-id.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

3.7 KiB
Raw Blame History

title
type_id

{{< callout type="info">}} Header: type_id.h
Since: TBC
{{< /callout >}}

Below is a concise, technical overview of the etl::type_id facility, suitable for design documentation or code review context.

Overview:

etl::type_id is a lightweight, RTTI-free mechanism for uniquely identifying C++ types at runtime. It is designed for environments where standard RTTI (typeid, std::type_info) is unavailable, undesirable, or too costly—such as embedded systems or performance-constrained platforms.

The implementation guarantees uniqueness per type within a program image while remaining constexpr-friendly and requiring no dynamic allocation.

Design Concept

The core idea is to associate each distinct type T with the address of a unique static object. That address serves as the types identifier.

This is achieved through:

template <typename T>
struct type_id_anchor
{
  static char value;
};

Each instantiation of type_id_anchor<T> owns its own static char value, and the address of that variable is guaranteed to be unique for each distinct T. The address is stable for the lifetime of the program.

Key Components

Type Normalization

When requesting a type ID via type_id::get<T>(), the type is first normalised:

using type = typename etl::remove_cvref<T>::type;

This ensures that:

  • T, const T, T&, and T&& all map to the same type_id
  • Only the underlying type identity matters

Type ID Generation

template <typename T>
static ETL_CONSTEXPR type_id get() ETL_NOEXCEPT;
  • Returns a type_id that uniquely represents T
  • Internally stores the address of type_id_anchor<T>::value
  • Requires no RTTI, no dynamic memory, and no runtime registration

Invalid Type ID

static ETL_CONSTEXPR type_id invalid_id() ETL_NOEXCEPT;
  • Represents an invalid or uninitialised type ID
  • Implemented as a null pointer (id == nullptr)
  • Default constructor produces this state

type_id Class Semantics

Storage

const void* id;
  • The identifier is stored as a pointer
  • Comparison is purely pointer comparison (fast and deterministic)

Supported Operations

Operation Behavior
Equality (==) True if both type IDs refer to the same type
Inequality (!=) Logical negation of equality
Ordering (<) Pointer comparison (useful for ordered containers)
Boolean conversion true if valid, false if invalid
Integer conversion Explicit conversion to intptr_t / uintptr_t

Copy and Assignment

  • Copyable and assignable
  • Copy semantics preserve identity (pointer value)

Guarantees and Properties

  • Uniqueness: Each distinct type has exactly one unique type_id
  • Stability: Type IDs remain valid for the entire program lifetime
  • Zero overhead: No dynamic allocation, no lookup tables
  • RTTI-free: Suitable for builds with RTTI disabled
  • Comparable: Can be used as keys in associative containers

Typical Use Cases

  • Type-safe containers (e.g., variant, any, message buses)
  • Plugin or component systems
  • Compile-time / runtime type discrimination in embedded systems
  • Replacement for std::type_index in restricted environments

Summary

etl::type_id provides a robust, minimal, and efficient alternative to C++ RTTI by encoding type identity as the address of a unique static object. Its design is particularly well-suited to embedded and low-level systems where determinism, performance, and binary size are critical.