etl/docs/utilities/utility.md
Roland Reichwein 49f690a921
Add safe integer comparisons (#1506)
Adding cmp_equal, cmp_not_equal, cmp_less, cmp_greater, cmp_less_equal,
cmp_greater_equal and in_range.

Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com>
2026-07-18 16:37:53 +02:00

10 KiB

title
Utility

{{< callout type="info">}} Header: utility.h
{{< /callout >}}

Useful utility functions and classes.

pair

template <typename T1, typename T2>
struct pair

Description
A clone of std::pair

C++03

template <typename T1, typename T2>
pair<T1, T2> make_pair(T1 a, T2 b)

C++11 and above

template <typename T1, typename T2>
pair<T1, T2> make_pair(T1&& a, T2&& b) 

Description
Returns a pair.


template <size_t Index, typename T1, typename T2>
struct tuple_element<Index, ETL_OR_STD::pair<T1, T2>>

Description
Specialisation for pair.
Gets the type in the pair at Index.
Static asserts if Index is not 0 or 1.
From: 20.40.1


template <typename T1, typename T2>
struct tuple_size<ETL_OR_STD::pair<T1, T2>>

Description
Specialisation for pair.
Gets the size of the pair, which is always 2.
Since:20.40.1

Template deduction guides

C++17 and above

template <typename T1, typename T2>
pair(T1, T2) ->pair<T1, T2>;

exchange

template <typename T, typename U = T>
T exchange(T& object, const U& new_value)

Description
Copies the new value to object and returns the old value.
Note: This is not an atomic operation.

Integer comparison functions

Safe comparison of integers of different signedness. Unlike the built-in comparison operators, negative signed integers always compare less than (and never equal to) unsigned integers, so the result is never affected by value-changing implicit conversions.
The arguments must be standard signed or unsigned integer types, including signed char and unsigned char. bool, char and the extended character types are not permitted.
When the STL is available and the compiler provides __cpp_lib_integer_comparison_functions (C++20), the std versions are used.
Since: 20.49.0

template <typename T, typename U>
constexpr bool cmp_equal(T t, U u) noexcept

Description
Returns true if t is equal to u.


template <typename T, typename U>
constexpr bool cmp_not_equal(T t, U u) noexcept

Description
Returns true if t is not equal to u.


template <typename T, typename U>
constexpr bool cmp_less(T t, U u) noexcept

Description
Returns true if t is less than u.


template <typename T, typename U>
constexpr bool cmp_greater(T t, U u) noexcept

Description
Returns true if t is greater than u.


template <typename T, typename U>
constexpr bool cmp_less_equal(T t, U u) noexcept

Description
Returns true if t is less than or equal to u.


template <typename T, typename U>
constexpr bool cmp_greater_equal(T t, U u) noexcept

Description
Returns true if t is greater than or equal to u.


template <typename R, typename T>
constexpr bool in_range(T t) noexcept

Description
Returns true if the value of t is in the range of values that can be represented by R, that is, if t can be converted to R without loss of its value.

add_const

template <typename T>
typename etl::add_const<T>::type& as_const(T& t)

Description
Returns a value of type T as a const T.

coordinate_2d

template <typename T>
struct coordinate_2d

Member types
T x;
T y;

in_place disambiguation tags.

struct in_place_t 
inline constexpr in_place_t in_place{}; // C++17

template <typename T> struct in_place_type_t 
template <typename T>
inline constexpr in_place_type_t<T> in_place_type{}; // C++17

template <size_t I> struct in_place_index_t 
template <size_t I>
inline constexpr in_place_index_t<I> in_place_index{}; // C++17

declval

template <typename T>
typename etl::add_rvalue_reference<T>::type declval() ETL_NOEXCEPT;

C++11

functor

For C++11 and above. From: 20.27.0

template <typename TReturn, typename... TParams>
class functor

Description
Wraps a free/global function in a functor.


constexpr functor(TReturn(*ptr_)(TParams...))

Constructs a functor from a function pointer.


constexpr TReturn operator()(TParams... args) const

Description
Function operator.
Calls the wrapped function with the forwarded parameters.

Example

int Function(int i)
{
  return i;
}

// Note that the functor deduces the template parameters.
constexpr etl::functor f(Function);

member_function_wrapper

For C++11 and above. From: 20.27.0

template <typename TReturn, typename... TParams>
class member_function_wrapper<TReturn(TParams...)>

Description
Wraps a member function in a static member function.


template <typename T, T& Instance, TReturn(T::* Method)(TParams...)>
static constexpr TReturn function(TParams... params)

Description
The static function that calls the member function.

Example

class MyClass
{
public:

  int MemberFunction(int i)
  {
    return 2 * i;
  }
};

MyClass test;

constexpr int(*pf)(int) 
        = &etl::member_function_wrapper<int(int)>::function<MyClass, test, &MyClass::MemberFunction>;

// Call
int result = pf(1);

functor_wrapper

For C++11 and above.
From: 20.27.0

template <typename TReturn, typename... TParams>
class functor_wrapper<TReturn(TParams...)>

Description
Wraps a functor in a static member function.


template <typename TFunctor, TFunctor& Instance>
static constexpr TReturn function(TParams... params)

Description
The static function that calls the member function.

Example

class MyClass
{
public:

  int operator()(int i)
  {
    return 2 * i;
  }
};

MyClass test;

constexpr int(*pf)(int) = &etl::functor_wrapper<int(int)>::function<MyClass, test>;

// Call
int result = pf(1);

functor_as_static

For C++17 and above. 20.40.0

Wraps a functor with a static free function at compile time. Creates a static member call that calls the specified functor.

template <auto& Instance>
struct functor_as_static

template <typename... TArgs>
static constexpr auto call(TArgs&&... args)

Description
Member static function that calls the functor

Example

struct Test
{
  int operator()(int i)
  {
    return 2 * i;
  }
};

Test test;

using fas_t = etl::functor_as_static<test>;
fas_t::call(1));

member_function_as_static

For C++17 and above.
From: 20.40.0

Wraps a member function with a static free function at compile time.
Creates a static member function that calls the specified member function.

template <auto Method, auto& Instance>
struct member_function_as_static 

template <typename... TArgs>
static constexpr auto call(TArgs&&... args)

Description
Member static function that calls the member function.

Example

struct Test
{
  int Function()(int i)
  {
    return 2 * i;
  }
};

Test test;

using mfas_t = etl::functor_as_static<&Test::Function, test>;
mfas_t::call(1));

member_function_as_functor

For C++17 and above.
From: 20.40.0

Wraps a member function with a functor at compile time.
Creates a functor that calls the specified member function.

template <auto Method, auto& Instance>
class member_function_as_functor

template <typename... TArgs>
constexpr auto operator()(TArgs&&... args) const

Description
Calls the functor.

Example

struct Test
{
  int Function()(int i)
  {
    return 2 * i;
  }
};

constexpr etl::member_function_as_functor<&Test::Function, test> mfaf;
mfaf(1);

function_as_functor

For C++17 and above.
From: 20.40.0

Wraps a function with a functor at compile time.
Creates a functor that calls the specified free function.

template <auto Function>
class function_as_functor

constexpr auto operator()(TArgs&&... args) const

Description
Calls the functor.

Example

int Function()(int i)
{
  return 2 * i;
}

constexpr etl::function_as_functor<Function> faf;
faf(1);

function_ptr_as_functor

For C++11 and above.
From: 20.40.0

Wraps a function pointer with a functor at run time.
Creates a functor that calls the specified free function.

template <typename TReturn, typename... TArgs>
class function_ptr_as_functor

constexpr function_ptr_as_functor(TReturn(*ptr_)(TArgs...))

Description
Construct from a function pointer.


constexpr TReturn operator()(TArgs... args) const

Description
Function operator.

Example

int Function()(int i)
{
  return 2 * i;
}

using function_type = decltype(Function);
constexpr function_type* fptr = Function;
constexpr etl::function_ptr_as_functor<function_type> fpaf(fptr)

integer_sequence

From: 20.14.0

template <typename T, T... Integers>
class integer_sequence

index_sequence

From: 20.14.0

template <size_t... Indices>
using index_sequence = etl::integer_sequence<size_t, Indices...>;
template <size_t N>
make_index_sequence

select1st & select2nd

select1st
A functor object that takes a single argument, a pair, and returns the pair::first element.


select2nd
A functor object that takes a single argument, a pair, and returns the pair::second element.

size_of_type

From: 20.36.0

template <typename T>
ETL_CONSTEXPR size_t size_of_type()

Description
Returns the size of the type defined in T.


template <typename T>
ETL_CONSTEXPR size_t size_of_type(const T&)

Description
Returns the size of the type defined in T.


ETL_SIZE_OF_OBJECT_TYPE(Object, Type)

Description
Returns the size of Type defined in the declared type of Object. C++11 and above.
From: 20.36.0

ETL_SIZE_OF_CLASS_TYPE(Class, Type)

Description
Returns the size of Type defined in Class. From: 20.36.0


nontype_t

Since 20.43.0

Wraps a non-type template parameter as a type.
Defines a value associated with the template type.

If ETL_FORCE_CPP11_NONTYPE is defined then the C++14 and below variant is used.

C++14 and below

template <typename T, T Value>
struct nontype_t;
using FortyTwo = etl::nontype_t<int, 42>;

C++17 and above

template <auto Value>
struct nontype_t;
using FortyTwo = etl::nontype_t<42>