ADTF
Loading...
Searching...
No Matches
runnable.h
Go to the documentation of this file.
1
7#pragma once
8#include "runnable_intf.h"
10
11namespace adtf
12{
13namespace base
14{
34 typename ANT_INTERFACE = ant::IRunnable,
35 typename FLASH_OR_ANT_INTERFACE = flash::IRunnable,
36 typename CALLABLE = flash::IRunnable::tRunFunction>
37class runnable : public ucom::object<ant::IRunnable, flash::IRunnable, ANT_INTERFACE, FLASH_OR_ANT_INTERFACE>
38{
39 static_assert(std::disjunction_v<
40 // bind expression → accept immediately, no is_invocable_r_v ever instantiated because MSVC
41 // limitations here to check type of parameters
42 std::is_bind_expression<std::decay_t<CALLABLE>>,
43 std::is_invocable_r<tResult, std::decay_t<CALLABLE>>,
44 std::is_invocable_r<tResult, std::decay_t<CALLABLE>, tNanoSeconds>,
45 std::is_invocable_r<tResult, std::decay_t<CALLABLE>, tTimeStamp>,
46 std::is_invocable_r<tResult,
47 std::decay_t<CALLABLE>,
50 const void*,
51 size_t>>,
52 "Instantiation of runnable requires a callable with a compatible signature: "
53 "tResult(void) or tResult(tNanoSeconds) or tResult(tTimeStamp) or "
54 "tResult(tNanoSeconds, ant::IRunnable::tActivationType, const void*, size_t)");
55
56 static_assert(std::is_base_of_v<ant::IRunnable, ANT_INTERFACE>,
57 "ANT_INTERFACE template parameter at runnable<DEFAULT_ACTIVATION_TYPE, ANT_INTERFACE, "
58 "FLASH_OR_ANT_INTERFACE, CALLABLE> must be derived from ant::IRunnable");
59
60 static_assert(std::is_base_of_v<flash::IRunnable, FLASH_OR_ANT_INTERFACE> ||
61 std::is_base_of_v<ant::IRunnable, FLASH_OR_ANT_INTERFACE>,
62 "FLASH_OR_ANT_INTERFACE template parameter at runnable<DEFAULT_ACTIVATION_TYPE, ANT_INTERFACE, "
63 "FLASH_OR_ANT_INTERFACE, CALLABLE> must be derived from flash::IRunnable or ant::IRunnable");
64
65protected:
67 std::decay_t<CALLABLE> m_fcRunFunc;
68
69public:
71 runnable() = delete;
72
77 runnable(CALLABLE&& fcRunFunc) noexcept:
78 m_fcRunFunc(std::forward<CALLABLE>(fcRunFunc)), m_ui32ActivationType(DEFAULT_ACTIVATION_TYPE)
79 {
80 }
81
89 template<typename CALLABLE_WITH_TIMSTAMP,
90 typename CALLABLE_TYPE = CALLABLE,
91 std::enable_if_t<std::is_same_v<std::decay_t<CALLABLE_TYPE>, flash::IRunnable::tRunFunction> &&
92 std::is_invocable_r_v<tResult, std::decay_t<CALLABLE_WITH_TIMSTAMP>, tTimeStamp>,
93 bool> = true>
94 runnable(CALLABLE_WITH_TIMSTAMP&& fcRunFunc) noexcept:
96 [fcRunFunc = std::forward<CALLABLE_WITH_TIMSTAMP>(fcRunFunc)](tNanoSeconds tmTrigger) noexcept -> tResult
97 {
98 RETURN_IF_FAILED(fcRunFunc(duration_cast<tTimeStamp>(tmTrigger)));
100 }),
101 m_ui32ActivationType(DEFAULT_ACTIVATION_TYPE)
102 {
103 }
104
110 runnable(CALLABLE&& fcRunFunc, ant::IRunnable::tActivationType ui32ActivationType) noexcept:
111 m_fcRunFunc(std::forward<CALLABLE>(fcRunFunc)), m_ui32ActivationType(ui32ActivationType)
112 {
113 }
114
116 ~runnable() override = default;
117
131 tResult Run(tTimeStamp tmTimeofActivation,
132 ant::IRunnable::tActivationType ui32ActivationType,
133 const void* pvUserData,
134 size_t nUserDataSize) override
135 {
136 return Run(duration_cast<tNanoSeconds>(tmTimeofActivation), ui32ActivationType, pvUserData, nUserDataSize);
137 }
138
152 tResult Run(tNanoSeconds tmTimeofActivation,
153 ant::IRunnable::tActivationType ui32ActivationType,
154 const void* pvUserData,
155 size_t nUserDataSize) override
156 {
157 if (m_ui32ActivationType == ui32ActivationType || m_ui32ActivationType == ant::IRunnable::RUN_UNSPECIFIED)
158 {
159 tResult oResult = ERR_NOT_INITIALIZED;
160 if constexpr (std::is_invocable_r_v<tResult, CALLABLE, tNanoSeconds, ant::IRunnable::tActivationType,
161 const void*, size_t>)
162 {
163 oResult = m_fcRunFunc(tmTimeofActivation, ui32ActivationType, pvUserData, nUserDataSize);
164 }
165 else if constexpr (std::is_invocable_r_v<tResult, CALLABLE, tTimeStamp>)
166 {
167 (void) pvUserData; // touch to avoid unused parameter warning
168 (void) nUserDataSize;
169 oResult = m_fcRunFunc(duration_cast<tTimeStamp>(tmTimeofActivation));
170 }
171 else if constexpr (std::is_invocable_r_v<tResult, CALLABLE, tNanoSeconds>)
172 {
173 (void) pvUserData; // touch to avoid unused parameter warning
174 (void) nUserDataSize;
175 oResult = m_fcRunFunc(tmTimeofActivation);
176 }
177 else if constexpr (std::is_invocable_r_v<tResult, CALLABLE>)
178 {
179 (void) tmTimeofActivation; // touch to avoid unused parameter warning
180 (void) ui32ActivationType;
181 (void) pvUserData;
182 (void) nUserDataSize;
183 oResult = m_fcRunFunc();
184 }
185 RETURN_IF_FAILED(oResult);
187 }
188 RETURN_ERROR(ERR_INVALID_ARG);
189 }
190
196 {
197 return m_ui32ActivationType;
198 }
199
200private:
202};
203
211template<typename CALLABLE, typename... ARGS>
212runnable(CALLABLE&&, ARGS&&...)
214
215namespace ant
216{
229 typename ANT_INTERFACE = ant::IRunnable,
230 typename CALLABLE = ant::IRunnable::tRunFunction>
232} // namespace ant
233
239#define ADTF_RUN_FUNCTION(_fcName_) \
240 [this](tTimeStamp tmTime) -> tResult \
241 { \
242 return _fcName_(tmTime); \
243 }
244
250#define ADTF_RUN_FUNCTION_NS(_fcName_) \
251 [this](adtf::base::flash::tNanoSeconds tmTime) -> tResult \
252 { \
253 return _fcName_(tmTime); \
254 }
255
256} // namespace base
257} // namespace adtf
A_UTILS_NS::cResult tResult
For backwards compatibility and to bring latest version into scope.
Definition result.h:736
#define RETURN_NOERROR
Return status ERR_NOERROR, which requires the calling function's return type to be tResult.
Definition result.h:29
#define RETURN_ERROR(code)
Return specific error code, which requires the calling function's return type to be tResult.
Definition result.h:42
Definition runnable_intf.h:27
std::function< tResult(tTimeStamp)> tRunFunction
Type definition of the function used to implement Run.
Definition runnable_intf.h:38
tActivationType
Definition runnable_intf.h:45
@ RUN_UNSPECIFIED
unspecified Run activation type.
Definition runnable_intf.h:47
Definition runnable_intf.h:112
std::function< tResult(tNanoSeconds)> tRunFunction
Type definition of the function used to implement Run.
Definition runnable_intf.h:123
Definition runnable.h:38
ant::IRunnable::tActivationType GetActivationType() const override
Definition runnable.h:195
runnable(CALLABLE &&fcRunFunc, ant::IRunnable::tActivationType ui32ActivationType) noexcept
Definition runnable.h:110
tResult Run(tTimeStamp tmTimeofActivation, ant::IRunnable::tActivationType ui32ActivationType, const void *pvUserData, size_t nUserDataSize) override
Definition runnable.h:131
tResult Run(tNanoSeconds tmTimeofActivation, ant::IRunnable::tActivationType ui32ActivationType, const void *pvUserData, size_t nUserDataSize) override
Definition runnable.h:152
runnable()=delete
CTOR.
runnable(CALLABLE_WITH_TIMSTAMP &&fcRunFunc) noexcept
Definition runnable.h:94
Definition object.h:397
Namespace for all functionality of the ADTF Base SDK provided since v3.0.
Definition adtf_class_version.h:16
adtf::base::runnable< DEFAULT_ACTIVATION_TYPE, ANT_INTERFACE, flash::IRunnable, CALLABLE > runnable
Definition runnable.h:231
Namespace for the ADTF Base SDK.
Definition adtf_base_type_traits.h:13
runnable(CALLABLE &&, ARGS &&...) -> runnable< ant::IRunnable::RUN_UNSPECIFIED, ant::IRunnable, flash::IRunnable, CALLABLE && >
DestinationTimeStamp duration_cast(const SourceTimeStamp &) noexcept
Duration cast base template to converted between different time resolution.
Definition chrono.h:155
Namespace for all functionality provided by ADTF and its SDKs.
Definition adtf_client_connector.h:14
A timestamp with nanosecond precision.
Definition chrono.h:23