mimic++ v9.2.1
Loading...
Searching...
No Matches
SideEffectPolicies.hpp
Go to the documentation of this file.
1// Copyright Dominic (DNKpp) Koepke 2024 - 2025.
2// Distributed under the Boost Software License, Version 1.0.
3// (See accompanying file LICENSE_1_0.txt or copy at
4// https://www.boost.org/LICENSE_1_0.txt)
5
6#ifndef MIMICPP_POLICIES_SIDE_EFFECT_POLICIES_HPP
7#define MIMICPP_POLICIES_SIDE_EFFECT_POLICIES_HPP
8
9#pragma once
10
11#include "mimic++/Fwd.hpp"
14
15#ifndef MIMICPP_DETAIL_IS_MODULE
16 #include <concepts>
17 #include <cstddef>
18 #include <functional>
19 #include <optional>
20 #include <type_traits>
21 #include <utility>
22#endif
23
25{
26 template <typename Action>
28 {
29 public:
30 ~SideEffectAction() = default;
31
32 [[nodiscard]]
33 explicit constexpr SideEffectAction(
34 Action&& action) noexcept(std::is_nothrow_move_constructible_v<Action>)
35 : m_Action{std::move(action)}
36 {
37 }
38
41
42 [[nodiscard]]
45
46 static constexpr bool is_satisfied() noexcept
47 {
48 return true;
49 }
50
51 template <typename Return, typename... Args>
52 [[nodiscard]]
53 static constexpr bool matches(const call::Info<Return, Args...>&) noexcept
54 {
55 return true;
56 }
57
58 [[nodiscard]]
59 static std::nullopt_t describe() noexcept
60 {
61 return std::nullopt;
62 }
63
64 template <typename Return, typename... Args>
65 requires std::invocable<Action&, const call::Info<Return, Args...>&>
66 constexpr void consume(const call::Info<Return, Args...>& info)
67 noexcept(std::is_nothrow_invocable_v<Action&, const call::Info<Return, Args...>&>)
68 {
69 std::invoke(m_Action, info);
70 }
71
72 private:
73 Action m_Action;
74 };
75}
76
78{
99
107 template <std::size_t index, typename Action>
108 [[nodiscard]]
109 constexpr auto apply_arg(Action&& action)
110 noexcept(std::is_nothrow_constructible_v<std::remove_cvref_t<Action>, Action>)
111 {
112 using arg_selector_t = detail::args_selector_fn<
113 std::add_lvalue_reference_t,
114 std::index_sequence<index>>;
115 using apply_strategy_t = detail::arg_list_forward_apply_fn;
116
118 std::bind_front(
119 detail::apply_args_fn{
120 arg_selector_t{},
121 apply_strategy_t{}},
122 std::forward<Action>(action))};
123 }
124
135 template <std::size_t index, std::size_t... additionalIndices, typename Action>
136 [[nodiscard]]
137 constexpr auto apply_args(Action&& action)
138 noexcept(std::is_nothrow_constructible_v<std::remove_cvref_t<Action>, Action>)
139 {
140 using arg_selector_t = detail::args_selector_fn<
141 std::add_lvalue_reference_t,
142 std::index_sequence<index, additionalIndices...>>;
143 using apply_strategy_t = detail::arg_list_forward_apply_fn;
144
146 std::bind_front(
147 detail::apply_args_fn{
148 arg_selector_t{},
149 apply_strategy_t{}},
150 std::forward<Action>(action))};
151 }
152
159 template <typename Action>
160 [[nodiscard]]
161 constexpr auto apply_all(Action&& action)
162 noexcept(std::is_nothrow_constructible_v<std::remove_cvref_t<Action>, Action>)
163 {
164 using arg_selector_t = detail::all_args_selector_fn<std::add_lvalue_reference_t>;
165 using apply_strategy_t = detail::arg_list_forward_apply_fn;
166
168 std::bind_front(
169 detail::apply_args_fn{
170 arg_selector_t{},
171 apply_strategy_t{}},
172 std::forward<Action>(action))};
173 }
174
181 template <std::invocable Action>
182 [[nodiscard]]
183 constexpr auto invoke(Action&& action)
184 noexcept(std::is_nothrow_constructible_v<std::remove_cvref_t<Action>, Action>)
185 {
187 [fn = std::forward<Action>(action)]([[maybe_unused]] const auto& call) mutable noexcept(
188 std::is_nothrow_invocable_v<Action&>) {
189 std::invoke(fn);
190 }};
191 }
192
196}
197
198#endif
#define MIMICPP_DETAIL_MODULE_EXPORT
Definition Config.hpp:19
Definition Call.hpp:27
Definition SideEffectPolicies.hpp:28
static constexpr bool matches(const call::Info< Return, Args... > &) noexcept
Definition SideEffectPolicies.hpp:53
static std::nullopt_t describe() noexcept
Definition SideEffectPolicies.hpp:59
constexpr void consume(const call::Info< Return, Args... > &info) noexcept(std::is_nothrow_invocable_v< Action &, const call::Info< Return, Args... > & >)
Definition SideEffectPolicies.hpp:66
SideEffectAction & operator=(const SideEffectAction &)=delete
static constexpr bool is_satisfied() noexcept
Definition SideEffectPolicies.hpp:46
SideEffectAction(SideEffectAction &&)=default
constexpr SideEffectAction(Action &&action) noexcept(std::is_nothrow_move_constructible_v< Action >)
Definition SideEffectPolicies.hpp:33
SideEffectAction & operator=(SideEffectAction &&)=default
SideEffectAction(const SideEffectAction &)=delete
constexpr auto apply_all(Action &&action) noexcept(std::is_nothrow_constructible_v< std::remove_cvref_t< Action >, Action >)
Applies all arguments on the given action.
Definition SideEffectPolicies.hpp:161
constexpr auto apply_arg(Action &&action) noexcept(std::is_nothrow_constructible_v< std::remove_cvref_t< Action >, Action >)
Applies the argument at the specified index on the given action.
Definition SideEffectPolicies.hpp:109
constexpr auto invoke(Action &&action) noexcept(std::is_nothrow_constructible_v< std::remove_cvref_t< Action >, Action >)
Invokes the given function.
Definition SideEffectPolicies.hpp:183
constexpr auto apply_args(Action &&action) noexcept(std::is_nothrow_constructible_v< std::remove_cvref_t< Action >, Action >)
Applies the arguments at the specified index and in that order on the given action.
Definition SideEffectPolicies.hpp:137
Definition Call.hpp:24
Definition ArgRequirementPolicies.hpp:28
Definition SideEffectPolicies.hpp:78