5#ifndef INCLUDE_GUARD_ARENE_BASE_ARENE_BASE_INLINE_CONTAINER_TESTING_UNIQUE_TEST_VALUE_HPP_
6#define INCLUDE_GUARD_ARENE_BASE_ARENE_BASE_INLINE_CONTAINER_TESTING_UNIQUE_TEST_VALUE_HPP_
8#include "arene/base/compiler_support/diagnostics.hpp"
9#include "arene/base/compiler_support/platform_queries.hpp"
10#include "arene/base/compiler_support/preprocessor.hpp"
11#include "arene/base/inline_container/testing/customization.hpp"
12#include "arene/base/stdlib_choice/cstddef.hpp"
13#include "arene/base/stdlib_choice/enable_if.hpp"
14#include "arene/base/stdlib_choice/ignore.hpp"
15#include "arene/base/stdlib_choice/terminate.hpp"
16#include "arene/base/type_info/type_name_string.hpp"
17#include "arene/base/type_traits/comparison_traits.hpp"
18#include "arene/base/type_traits/conditional.hpp"
20#if ARENE_IS_OFF(ARENE_STDLIB_LIBARENECXX)
25ARENE_IGNORE_ALL(
"-Wfloat-equal",
"exact equality is intended for floating point as we are testing uniqueness");
36template <
class T, std::size_t N,
class =
void>
37struct assert_test_values_are_unique;
42template <
class T,
class =
void>
43constexpr extern bool is_test_value_noexcept_usable_v =
false;
51constexpr extern bool is_test_value_noexcept_usable_v<
53 std::enable_if_t<is_equality_comparable_v<
decltype(test_value<T>(0U))>>> =
54 noexcept(test_value<T>(0U) == test_value<T>(0U));
63 constexpr auto operator()()
const noexcept ->
void {}
73template <
class T, std::size_t N>
74constexpr auto are_test_values_unique()
noexcept(is_test_value_noexcept_usable_v<T>) ->
bool {
75 using assert_unique_for_smaller_n = conditional_t<
78 assert_test_values_are_unique<T, N - 1U>>;
79 assert_unique_for_smaller_n{}();
81 auto const self_equal = test_value<T>(N) == test_value<T>(N);
83 auto equal_to_any_previous =
false;
84 for (
auto i = std::size_t{}; i < N; ++i) {
85 if (test_value<T>(i) == test_value<T>(N)) {
86 equal_to_any_previous =
true;
91 return self_equal && !equal_to_any_previous;
101template <
class T, std::size_t N,
class>
102struct assert_test_values_are_unique
110 auto operator()()
const noexcept(is_test_value_noexcept_usable_v<T>) ->
void
112 static auto const unique = [] {
113 if (!are_test_values_unique<T, N>()) {
114#if ARENE_IS_OFF(ARENE_STDLIB_LIBARENECXX)
116 <<
"ERROR: test requested unique values but "
117 <<
"'arene::base::testing::test_values<"
118 << arene::base::type_name_v<T>.c_str() <<
">("
121 <<
" duplicates an earlier test value\n";
129 std::ignore = unique;
139template <
class T, std::size_t N>
140struct assert_test_values_are_unique<
143 std::enable_if_t<(std::ignore = (test_value<T>(0U) == test_value<T>(0U)),
true)>>
146 static constexpr bool value = are_test_values_unique<T, N>();
154 constexpr auto operator()()
const noexcept ->
void
156 static_assert(value,
"test requested N unique values but 'arene::base::testing::test_values' produces duplicates");
178template <
class T, std::size_t N>
181 is_equality_comparable_v<
decltype(test_value<T>(N))>,
182 "if tests request a unique test value, the test value type must provide an equality operator"
184 detail::assert_test_values_are_unique<T, N>{}();
185 return test_value<T>(N);
Definition customization.hpp:36
constexpr auto unique_test_value() noexcept(detail::is_test_value_noexcept_usable_v< T >) ->
obtain the nth unique arene::base::testing::test_value
Definition unique_test_value.hpp:179
Definition array_exceptions_disabled.cpp:11
Copyright 2026, Toyota Motor Corporation.
Definition array_exceptions_disabled.cpp:10
ARENE_IGNORE_ALL("-Wfloat-equal", "exact equality is intended for floating point as we are testing uniqueness")