6#ifndef MIMICPP_CONTROL_POLICY_HPP
7#define MIMICPP_CONTROL_POLICY_HPP
24namespace mimicpp::detail
26 template <
typename... Sequences>
28 constexpr std::tuple<std::tuple<std::shared_ptr<Sequences>,
sequence::Id>...> make_sequence_entries(
29 const std::tuple<std::shared_ptr<Sequences>...>& sequences
35 std::tuple<std::tuple<std::shared_ptr<Sequences>,
sequence::Id>...> result{};
37 [&]<std::size_t... indices>([[maybe_unused]]
const std::index_sequence<indices...>)
noexcept
39 ((std::get<indices>(result) =
41 std::get<indices>(sequences),
42 std::get<indices>(sequences)->add(),
45 std::index_sequence_for<Sequences...>{});
53 TimesConfig() =
default;
56 constexpr TimesConfig(
const int min,
const int max)
62 throw std::invalid_argument{
63 "min must be less or equal to max and both must not be less than zero."
72 constexpr int min() const noexcept
78 constexpr int max() const noexcept
98 const auto& sequenceEntries
103 return state_saturated{
107 .sequences = std::apply(
108 [](
const auto&... entries)
110 return std::vector<sequence::Tag>{
111 std::get<0>(entries)->tag()...
119 std::vector<sequence::rating> ratings{};
121 [&](
const auto&... entries)
123 const auto distribute = [&](
auto& seq,
const sequence::Id id)
125 if (
const std::optional priority = seq->priority_of(
id))
127 ratings.emplace_back(
139 std::get<0>(entries),
140 std::get<1>(entries)));
146 return state_inapplicable{
150 .sequenceRatings = std::move(ratings),
155 return state_applicable{
159 .sequenceRatings = std::move(ratings),
164 template <
typename... Sequences>
172 const detail::TimesConfig& timesConfig,
173 const sequence::detail::Config<Sequences...>& sequenceConfig
175 : m_Min{timesConfig.min()},
176 m_Max{timesConfig.max()},
178 detail::make_sequence_entries(sequenceConfig.sequences())
181 update_sequence_states();
187 return m_Min <= m_Count
194 return m_Count == m_Max;
200 return m_Count < m_Max
202 [](
const auto&... entries)
noexcept
204 return (... && std::get<0>(entries)->is_consumable(std::get<1>(entries)));
214 [](
auto&... entries)
noexcept
216 (..., std::get<0>(entries)->consume(std::get<1>(entries)));
222 update_sequence_states();
228 return detail::make_control_state(
240 std::tuple<std::shared_ptr<Sequences>,
sequence::Id>...> m_Sequences{};
242 constexpr void update_sequence_states() noexcept
244 if (m_Count == m_Min)
247 [](
auto&... entries)
noexcept
249 (..., std::get<0>(entries)->set_satisfied(std::get<1>(entries)));
253 else if (m_Count == m_Max)
256 [](
auto&... entries)
noexcept
258 (..., std::get<0>(entries)->set_saturated(std::get<1>(entries)));
293 constexpr auto times(
const int min,
const int max)
295 return detail::TimesConfig{min, max};
308 constexpr auto times(
const int exactly)
310 return detail::TimesConfig(exactly, exactly);
325 return detail::TimesConfig{
327 std::numeric_limits<int>::max()
343 return detail::TimesConfig{
359 constexpr detail::TimesConfig config{
377 constexpr detail::TimesConfig config{
Definition ControlPolicy.hpp:166
control_state_t state() const
Definition ControlPolicy.hpp:226
constexpr void consume() noexcept
Definition ControlPolicy.hpp:209
constexpr bool is_satisfied() const noexcept
Definition ControlPolicy.hpp:185
constexpr ControlPolicy(const detail::TimesConfig ×Config, const sequence::detail::Config< Sequences... > &sequenceConfig) noexcept
Definition ControlPolicy.hpp:171
static constexpr std::size_t sequenceCount
Definition ControlPolicy.hpp:168
constexpr bool is_saturated() const noexcept
Definition ControlPolicy.hpp:192
constexpr bool is_applicable() const noexcept
Definition ControlPolicy.hpp:198
constexpr auto at_most(const int max)
Specifies a times policy with just an upper limit.
Definition ControlPolicy.hpp:341
constexpr auto times(const int min, const int max)
Specifies a times policy with a limit range.
Definition ControlPolicy.hpp:293
consteval auto twice() noexcept
Specifies a times policy with both limits set to 2.
Definition ControlPolicy.hpp:375
consteval auto once() noexcept
Specifies a times policy with both limits set to 1.
Definition ControlPolicy.hpp:357
constexpr auto at_least(const int min)
Specifies a times policy with just a lower limit.
Definition ControlPolicy.hpp:323
std::variant< state_inapplicable, state_applicable, state_saturated > control_state_t
Definition Reports.hpp:73
Definition ControlPolicy.hpp:267
Definition BoostTest.hpp:20