General Utilities#

Generic Helpers#

#include <dplx/cncr/utils.hpp>
namespace dplx::cncr {}
template<typename Enum>
requires std::is_enum_v<Enum>
constexpr auto to_underlying(Enum value) noexcept -> std::underlying_type_t<Enum>#

A backport of C++23 to_underlying(Enum value).

Returns:

The underlying integer value with the deduced underlying type.

struct is_null_byte_fn#
constexpr auto operator()(std::byte const value) const noexcept -> bool#
Returns:

value == std::byte{}

constexpr auto is_null_byte(std::byte const value) noexcept -> bool#
Returns:

value == std::byte{}

struct is_non_null_byte_fn#
constexpr auto operator()(std::byte const value) const noexcept -> bool#
Returns:

value != std::byte{}

constexpr auto is_non_null_byte(std::byte const value) noexcept -> bool#
Returns:

value != std::byte{}

[[noreturn]] inline void unreachable() noexcept#

Calling this function explicitly invokes Undefined Behaviour. Therefore it can be used to inform the compiler about code invariants by calling it in places unreachable by the execution flow.

Warning

Only ever use this as a last resort in performance critical code after benchmarking the possible gains.

DPLX_ATTR_FORCE_INLINE#

Expands to something equivalent to inline with compiler specific hints to encourage inlining. It’s main use case are transparent forwarding wrapper functions.

Warning

Needs to be used sparingly in order to prevent machine code bloat.

DPLX_ATTR_NO_UNIQUE_ADDRESS#

Expands to [[no_unique_address]], a compiler specific equivalent or nothing if not supported by the current compiler.

See also

C++ Reference: no_unique_address

Lambda Overloading#

#include <dplx/overladed.hpp>
namespace dplx {}
template<typename ...Ts>
struct overloaded : Ts...#

Utility class for merging multiple lambdas into one functor:

auto overloadSet = overloaded{
    [](int) { printf("int"); },
    [](bool) { printf("bool"); }
};
overloadSet(true); // prints bool
overloadSet(0); // prints int