--- title: "Utility" --- {{< callout type="info">}} Header: `utility.h` {{< /callout >}} Useful utility functions and classes. ## pair ```cpp template struct pair ``` **Description** A clone of std::pair **C++03** ```cpp template pair make_pair(T1 a, T2 b) ``` **C++11 and above** ```cpp template pair make_pair(T1&& a, T2&& b) ``` **Description** Returns a pair. --- ```cpp template struct tuple_element> ``` **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` --- ```cpp template struct tuple_size> ``` **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** ```cpp template pair(T1, T2) ->pair; ``` ## exchange ```cpp template 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. ## add_const ```cpp template typename etl::add_const::type& as_const(T& t) ``` **Description** Returns a value of type `T` as a `const T`. ## coordinate_2d ```cpp template struct coordinate_2d ``` **Member types** `T x;` `T y;` ## in_place disambiguation tags. ```cpp struct in_place_t ``` ```cpp inline constexpr in_place_t in_place{}; // C++17 ``` --- ```cpp template struct in_place_type_t ``` ```cpp template inline constexpr in_place_type_t in_place_type{}; // C++17 ``` --- ```cpp template struct in_place_index_t ``` ```cpp template inline constexpr in_place_index_t in_place_index{}; // C++17 ``` ## declval ```cpp template typename etl::add_rvalue_reference::type declval() ETL_NOEXCEPT; ``` C++11 ## functor For C++11 and above. From: `20.27.0` ```cpp template class functor ``` **Description** Wraps a free/global function in a functor. --- ```cpp constexpr functor(TReturn(*ptr_)(TParams...)) ``` Constructs a functor from a function pointer. --- ```cpp constexpr TReturn operator()(TParams... args) const ``` **Description** Function operator. Calls the wrapped function with the forwarded parameters. ### Example ```cpp void 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` ```cpp template class member_function_wrapper ``` **Description** Wraps a member function in a static member function. --- ```cpp template static constexpr TReturn function(TParams... params) ``` **Description** The static function that calls the member function. ### Example ```cpp class MyClass { public: int MemberFunction(int i) { return 2 * i; } }; MyClass test; constexpr int(*pf)(int) = &etl::member_function_wrapper::function; // Call int result = pf(1); ``` ## functor_wrapper For C++11 and above. From: `20.27.0` ```cpp template class functor_wrapper ``` **Description** Wraps a functor in a static member function. --- ```cpp template static constexpr TReturn function(TParams... params) ``` **Description** The static function that calls the member function. ### Example ```cpp class MyClass { public: int operator()(int i) { return 2 * i; } }; MyClass test; constexpr int(*pf)(int) = &etl::functor_wrapper::function; // 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. ```cpp template struct functor_as_static ``` --- ```cpp template static constexpr auto call(TArgs&&... args) ``` **Description** Member static function that calls the functor ### Example ```cpp struct Test { int operator()(int i) { return 2 * i; } }; Test test; using fas_t = etl::functor_as_static; 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. ```cpp template struct member_function_as_static ``` --- ```cpp template static constexpr auto call(TArgs&&... args) ``` **Description** Member static function that calls the member function. ### Example ```cpp 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. ```cpp template class member_function_as_functor ``` --- ```cpp template constexpr auto operator()(TArgs&&... args) const ``` **Description** Calls the functor. ### Example ```cpp 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. ```cpp template class function_as_functor ``` --- ```cpp constexpr auto operator()(TArgs&&... args) const ``` **Description** Calls the functor. ### Example ```cpp int Function()(int i) { return 2 * i; } constexpr etl::function_as_functor 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. ```cpp template class function_ptr_as_functor ``` --- ```cpp constexpr function_ptr_as_functor(TReturn(*ptr_)(TArgs...)) ``` **Description** Construct from a function pointer. --- ```cpp constexpr TReturn operator()(TArgs... args) const ``` **Description** Function operator. ### Example ```cpp int Function()(int i) { return 2 * i; } using function_type = decltype(Function); constexpr function_type* fptr = Function; constexpr etl::function_ptr_as_functor fpaf(fptr) ``` ## integer_sequence From: `20.14.0` ```cpp template class integer_sequence ``` ## index_sequence From: `20.14.0` ```cpp template using index_sequence = etl::integer_sequence; ``` ```cpp template 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` ```cpp template ETL_CONSTEXPR size_t size_of_type() ``` **Description** Returns the size of the type defined in `T`. --- ```cpp template ETL_CONSTEXPR size_t size_of_type(const T&) ``` **Description** Returns the size of the type defined in `T`. --- ```cpp 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` ```cpp 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** ```cpp template struct nontype_t; ``` ```cpp using FortyTwo = etl::nontype_t; ``` **C++17 and above** ```cpp template struct nontype_t; ``` ```cpp using FortyTwo = etl::nontype_t<42> ```