25namespace sequoia::testing
28 template<
class Advisor>
31 template<
class R,
class Advisor,
class T>
34 using return_type = R;
38 template<
class R,
class Advisor,
class T>
41 using return_type = R;
45 template<
class R,
class Advisor,
class T>
48 using return_type = R;
52 template<
class R,
class Advisor,
class T>
55 using return_type = R;
60 template<
class Advisor,
class T>
63 constexpr static bool utilize{
false};
66 template<
class Advisor,
class T>
67 requires std::invocable<Advisor, T, T>
70 constexpr static bool utilize{
true};
76 template<
class Advisor,
class T>
77 requires std::invocable<Advisor, T, T> &&
requires {
78 std::declval<decltype(&Advisor::operator())>();
80 struct advisor_analyser<Advisor, T>
83 using type = std::remove_cvref_t<
typename advisor_invoke_type<
decltype(&Advisor::operator())>::type>;
85 constexpr static bool utilize{std::is_same_v<std::common_type_t<type, std::remove_cvref_t<T>>, type>};
88 template<
class Advisor,
class T>
89 inline constexpr bool use_advisor_v{advisor_analyser<Advisor, T>::utilize};
125 template<
class Advisor>
129 using sequoia_advisor_type = Advisor;
131 tutor(Advisor a, std::string prefix=
"Advice: ")
132 : m_Advisor{std::move(a)}
133 , m_Prefix{std::move(prefix)}
137 requires use_advisor_v<Advisor, T>
139 std::string operator()(
const T& value,
const T& prediction)
const
141 return m_Advisor(value, prediction);
145 const std::string& prefix()
const noexcept
151 std::string m_Prefix;
161 template<
class Tutor>
162 inline constexpr bool is_teacher_v{
163 requires {
typename std::remove_cvref_t<Tutor>::sequoia_advisor_type; }
171 requires (
sizeof...(U) > 0u)
172 && is_teacher_v<
decltype(std::get<
sizeof...(U) - 1>(std::declval<std::tuple<std::remove_cvref_t<U>&...>>()))>
184 template<
class Advisor,
class T>
188 template<
class Advisor,
class T>
189 requires std::is_invocable_r_v<std::string, tutor<Advisor>, T, T>
192 m_Advice = advisor(value, prediction);
193 m_Prefix = advisor.prefix();
196 std::string& append_to(std::string& message)
const;
198 std::string m_Advice{}, m_Prefix{};
201 std::string& append_advice(std::string& message,
const advice_data& adviceData);
Concepts which are sufficiently general to appear in the sequoia namespace.
A collection of functions for formatting test output.
Traits which are sufficiently general to appear in the sequoia namespace.
Helper for generating advice strings.
Definition: Advice.hpp:182
class template used to wrap function objects which proffer advice.
Definition: Advice.hpp:127
meta utility for determining whether a particular Advisor should be used for a given type
Definition: Advice.hpp:62
meta utility for garnering invocation and return types from an Advisor
Definition: Advice.hpp:29
Definition: Advice.hpp:168
Represents the absence of advice.
Definition: Advice.hpp:93