.. title:: clang-tidy - performance-enum-size

performance-enum-size
=====================

Recommends the smallest possible underlying type for an ``enum`` or ``enum``
class based on the range of its enumerators. Analyzes the values of the
enumerators in an ``enum`` or ``enum`` class, including signed values, to
recommend the smallest possible underlying type that can represent all the
values of the ``enum``. The suggested underlying types are the integral types
``std::uint8_t``, ``std::uint16_t``, and ``std::uint32_t`` for unsigned types,
and ``std::int8_t``, ``std::int16_t``, and ``std::int32_t`` for signed types.
Using the suggested underlying types can help reduce the memory footprint of
the program and improve performance in some cases.

For example:

.. code-block:: c++

    // BEFORE
    enum Color {
        RED = -1,
        GREEN = 0,
        BLUE = 1
    };

    std::optional<Color> color_opt;

The `Color` ``enum`` uses the default underlying type, which is ``int`` in this
case, and its enumerators have values of -1, 0, and 1. Additionally, the
``std::optional<Color>`` object uses 8 bytes due to padding (platform
dependent).

.. code-block:: c++

    // AFTER
    enum Color : std::int8_t {
        RED = -1,
        GREEN = 0,
        BLUE = 1
    }

    std::optional<Color> color_opt;


In the revised version of the `Color` ``enum``, the underlying type has been
changed to ``std::int8_t``. The enumerator `RED` has a value of -1, which can
be represented by a signed 8-bit integer.

By using a smaller underlying type, the memory footprint of the `Color`
``enum`` is reduced from 4 bytes to 1 byte. The revised version of the
``std::optional<Color>`` object would only require 2 bytes (due to lack of
padding), since it contains a single byte for the `Color` ``enum`` and a single
byte for the ``bool`` flag that indicates whether the optional value is set.

Reducing the memory footprint of an ``enum`` can have significant benefits in
terms of memory usage and cache performance. However, it's important to
consider the trade-offs and potential impact on code readability and
maintainability.

Enums without enumerators (empty) are excluded from analysis.

Requires C++11 or above.
Does not provide auto-fixes.

Options
-------

.. option:: EnumIgnoreList

    Option is used to ignore certain enum types. It accepts a
    semicolon-separated list of (fully qualified) enum type names or regular
    expressions that match the enum type names. The default value is an empty
    string, which means no enums will be ignored.
