mimic++ v10.0.1
Loading...
Searching...
No Matches
SideEffectPolicies.hpp
Go to the documentation of this file.
1// Copyright Dominic (DNKpp) Koepke 2024-2026.
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_EXPECTATION_POLICIES_SIDE_EFFECT_POLICIES_HPP
7#define MIMICPP_EXPECTATION_POLICIES_SIDE_EFFECT_POLICIES_HPP
8
9#pragma once
10
11#include "mimic++/Fwd.hpp"
15
16#ifndef MIMICPP_DETAIL_IS_MODULE
17 #include <concepts>
18 #include <cstddef>
19 #include <functional>
20 #include <type_traits>
21 #include <utility>
22#endif
23
25{
26 template <typename Action>
28 {
29 public:
32
33 ~SideEffectAction() = default;
34
35 [[nodiscard]]
36 explicit constexpr SideEffectAction(Action&& action) noexcept(std::is_nothrow_move_constructible_v<Action>)
37 : m_Action{std::move(action)}
38 {
39 }
40
41 [[nodiscard]]
44
45 static constexpr bool is_satisfied() noexcept
46 {
47 return true;
48 }
49
50 template <typename Return, typename... Args>
51 [[nodiscard]]
52 static MatchResult matches(call::Info<Return, Args...> const& /*call*/) noexcept
53 {
54 return MatchSuccess{};
55 }
56
57 template <typename Return, typename... Args>
58 requires std::invocable<Action&, call::Info<Return, Args...> const&>
59 constexpr void consume(call::Info<Return, Args...> const& info)
60 noexcept(std::is_nothrow_invocable_v<Action&, call::Info<Return, Args...> const&>)
61 {
62 std::invoke(m_Action, info);
63 }
64
65 private:
66 Action m_Action;
67 };
68}
69
71{
92
100 template <std::size_t index, typename Action>
101 [[nodiscard]]
102 constexpr auto apply_arg(Action&& action)
103 noexcept(std::is_nothrow_constructible_v<std::remove_cvref_t<Action>, Action>)
104 {
105 using arg_selector_t = expectation::policies::detail::args_selector_fn<
106 std::add_lvalue_reference_t,
107 std::index_sequence<index>>;
108 using apply_strategy_t = expectation::policies::detail::arg_list_forward_apply_fn;
109
111 std::bind_front(
112 expectation::policies::detail::apply_args_fn{arg_selector_t{}, apply_strategy_t{}},
113 std::forward<Action>(action))};
114 }
115
126 template <std::size_t index, std::size_t... additionalIndices, typename Action>
127 [[nodiscard]]
128 constexpr auto apply_args(Action&& action)
129 noexcept(std::is_nothrow_constructible_v<std::remove_cvref_t<Action>, Action>)
130 {
131 using arg_selector_t = expectation::policies::detail::args_selector_fn<
132 std::add_lvalue_reference_t,
133 std::index_sequence<index, additionalIndices...>>;
134 using apply_strategy_t = expectation::policies::detail::arg_list_forward_apply_fn;
135
137 std::bind_front(
138 expectation::policies::detail::apply_args_fn{arg_selector_t{}, apply_strategy_t{}},
139 std::forward<Action>(action))};
140 }
141
148 template <typename Action>
149 [[nodiscard]]
150 constexpr auto apply_all(Action&& action)
151 noexcept(std::is_nothrow_constructible_v<std::remove_cvref_t<Action>, Action>)
152 {
153 using arg_selector_t = expectation::policies::detail::all_args_selector_fn<std::add_lvalue_reference_t>;
154 using apply_strategy_t = expectation::policies::detail::arg_list_forward_apply_fn;
155
157 std::bind_front(
158 expectation::policies::detail::apply_args_fn{arg_selector_t{}, apply_strategy_t{}},
159 std::forward<Action>(action))};
160 }
161
168 template <std::invocable Action>
169 [[nodiscard]]
170 constexpr auto invoke(Action&& action)
171 noexcept(std::is_nothrow_constructible_v<std::remove_cvref_t<Action>, Action>)
172 {
174 [fn = std::forward<Action>(action)]([[maybe_unused]] auto const& call) mutable noexcept(
175 std::is_nothrow_invocable_v<Action&>) {
176 std::invoke(fn);
177 }};
178 }
179
183}
184
185#endif
#define MIMICPP_DETAIL_MODULE_EXPORT
Definition Config.hpp:19
Definition Call.hpp:27
Definition SideEffectPolicies.hpp:28
constexpr void consume(call::Info< Return, Args... > const &info) noexcept(std::is_nothrow_invocable_v< Action &, call::Info< Return, Args... > const & >)
Definition SideEffectPolicies.hpp:59
constexpr SideEffectAction(Action &&action) noexcept(std::is_nothrow_move_constructible_v< Action >)
Definition SideEffectPolicies.hpp:36
SideEffectAction & operator=(SideEffectAction const &)=delete
static MatchResult matches(call::Info< Return, Args... > const &) noexcept
Definition SideEffectPolicies.hpp:52
SideEffectAction & operator=(SideEffectAction &&)=default
SideEffectAction(SideEffectAction const &)=delete
static constexpr bool is_satisfied() noexcept
Definition SideEffectPolicies.hpp:45
SideEffectAction(SideEffectAction &&)=default
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:150
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:102
constexpr auto invoke(Action &&action) noexcept(std::is_nothrow_constructible_v< std::remove_cvref_t< Action >, Action >)
Invokes the given function.
Definition SideEffectPolicies.hpp:170
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:128
Definition Call.hpp:24
Definition ArgumentList.hpp:24
std::variant< MatchSuccess, MatchFailure > MatchResult
Definition Common.hpp:41
Definition SideEffectPolicies.hpp:71
Definition Common.hpp:27