44 template <
typename Holder>
47 template <
typename ExpectedHolder,
typename Holder,
bool = IsMessageHolder<UnqualifiedMessageHolder<Holder>>::value>
51 template <
typename ExpectedHolder,
typename Holder>
53 typename ExpectedHolder::MessageHolderBase::MessageType, typename UnqualifiedMessageHolder<Holder>::MessageHolderBase::MessageType>
56 template <
typename ExpectedHolder,
typename Holder>
58 HasExpectedMessageType<ExpectedHolder, Holder>::value && !std::is_const<typename std::remove_reference<Holder>::type>::value>
61 template <
typename ExpectedHolder,
typename Holder>
64 template <
typename ExpectedHolder>
67 template <
typename Holder>
73 message->setTransactTime(transactTime);
79 template <
typename ExpectedHolder,
typename Holder>
84 message, eventIndicator, transactTime);
88 typename Holder,
typename ExpectedHolder,
89 typename Operation = MessageInitializationOperation<ExpectedHolder>,
90 typename... Arguments>
100 template <
typename EntryCount>
103 if (count == (std::numeric_limits<EntryCount>::max)())
104 throw std::runtime_error(
"Entry count limit exceeded");
106 return static_cast<EntryCount
>(count + 1);
109 template <
typename Group,
typename Resize>
112 const auto index = group.size();
114 return resizedGroup[index];
117 template <
typename Range>
123 template <
typename Range>
124 auto rangeEnd(Range& range) ->
decltype(end(range))
136 template <Messaging::UpdateAction::Enum Action,
typename Holder,
typename Tuple>
139 typename MakeIndexSequence<std::tuple_size<
typename std::decay<Tuple>::type>::value>::Type()))
142 message, std::forward<Tuple>(arguments),
143 typename MakeIndexSequence<std::tuple_size<
typename std::decay<Tuple>::type>::value>::Type());
149 std::get<Indices>(std::forward<Tuple>(arguments))...))
154 template <Messaging::UpdateAction::Enum Action,
typename Tuple>
157 typename MakeIndexSequence<std::tuple_size<
typename std::decay<Tuple>::type>::value>::Type()))
160 std::forward<Tuple>(arguments),
161 typename MakeIndexSequence<std::tuple_size<
typename std::decay<Tuple>::type>::value>::Type());
164 template <
typename Operation>
169 : operations_(
std::move(operations))
173 template <
typename Holder>
175 ->
decltype(std::declval<const Operation&>().apply(message), std::declval<Holder&>())
177 for (
const auto& operation : operations_)
178 operation.apply(message);
184 std::vector<Operation> operations_;
187 template <Messaging::UpdateAction::Enum Action,
typename Iterator,
typename Sentinel,
typename Projection>
191 using Operation =
typename std::decay<decltype(makeProjectedEntryOperation<Action>(projection(*first)))>::type;
193 std::vector<Operation> operations;
194 for (; first != last; ++first)
200 template <Messaging::UpdateAction::Enum Action,
typename Range,
typename Projection>
209 template <Messaging::UpdateAction::Enum Action,
typename Range,
typename Projection>
215 , projection_(&projection)
224 : range_(other.range_)
225 , projection_(other.projection_)
226 , consumed_(other.consumed_)
228 other.consumed_ =
true;
232 std::declval<Range&>(), std::declval<Projection&>()))
241 Projection* projection_;
245 template <Messaging::UpdateAction::Enum Action,
typename Holder,
typename Iterator,
typename Sentinel,
typename Projection>
248 static_cast<bool>(std::declval<Iterator&>() != std::declval<Sentinel&>()),
249 ++std::declval<Iterator&>(),
251 std::declval<Holder&>()
254 for (; first != last; ++first)
281template <Messaging::UpdateAction::Enum Action,
typename Holder,
typename Range,
typename Projection>
282auto addEntries(Holder& message, Range&& range, Projection&& projection)
305template <Messaging::UpdateAction::Enum Action,
typename Range,
typename Projection>
307auto entries(Range&& range, Projection&& projection)
309 Action,
typename std::remove_reference<Range>::type,
typename std::remove_reference<Projection>::type>
311 return {range, projection};
328 ->
decltype(recipe.append(std::move(stage).materialize()))
330 auto operation = std::move(stage).materialize();
331 return recipe.append(std::move(operation));
348 ->
decltype(std::move(recipe).append(std::move(stage).materialize()))
350 auto operation = std::move(stage).materialize();
351 return std::move(recipe).append(std::move(operation));
#define ONIXS_CME_MDH_TESTING_NAMESPACE_END
#define ONIXS_CME_MDH_TESTING_NAMESPACE_BEGIN
#define ONIXS_CMEMDH_NODISCARD
The time point without the time-zone information.
Owns a reusable recipe for constructing a held test message.
auto apply(Holder &message) const -> decltype(std::declval< const Operation & >().apply(message), std::declval< Holder & >())
EntryRangeOperation(std::vector< Operation > operations)
EntryRangeStage(Range &range, Projection &projection) noexcept
EntryRangeStage(EntryRangeStage &&other) noexcept
EntryRangeStage & operator=(const EntryRangeStage &)=delete
EntryRangeStage(const EntryRangeStage &)=delete
auto materialize() &&-> decltype(makeEntryRangeOperation< Action >(std::declval< Range & >(), std::declval< Projection & >()))
auto makeInitializationRecipe(Arguments &&... arguments) -> typename std::enable_if< IsMutableMessageHolder< ExpectedHolder, Holder >::value, decltype(makeMessageRecipe< typename std::decay< Holder >::type >(makeMessageOperation< Operation >(std::forward< Arguments >(arguments)...)))>::type
auto addEntriesFromIterators(Holder &message, Iterator first, Sentinel last, Projection &&projection) -> decltype(static_cast< bool >(std::declval< Iterator & >() !=std::declval< Sentinel & >()),++std::declval< Iterator & >(), appendProjectedEntry< Action >(message, std::declval< Projection & >()(*std::declval< Iterator & >())), std::declval< Holder & >())
typename std::enable_if< IsMutableMessageHolder< ExpectedHolder, Holder >::value, Holder & >::type EnableMutableMessageHolder
MessageRecipe< Holder, typename std::decay< Operation >::type > makeMessageRecipe(Operation &&operation)
typename std::remove_cv< typename std::remove_reference< Holder >::type >::type UnqualifiedMessageHolder
auto makeProjectedEntryOperationArguments(Tuple &&arguments, IndexSequence< Indices... >) -> decltype(makeContextualEntryOperation< Action >(std::get< Indices >(std::forward< Tuple >(arguments))...))
auto makeContextualEntryOperation(Arguments &&... arguments) -> decltype(makeMessageOperation< ContextualEntryOperation< Action > >(std::forward< Arguments >(arguments)...))
auto makeProjectedEntryOperation(Tuple &&arguments) -> decltype(makeProjectedEntryOperationArguments< Action >(std::forward< Tuple >(arguments), typename MakeIndexSequence< std::tuple_size< typename std::decay< Tuple >::type >::value >::Type()))
MessageOperation< Operation, typename std::decay< Arguments >::type... > makeMessageOperation(Arguments &&... arguments)
auto makeEntryRangeOperationFromIterators(Iterator first, Sentinel last, Projection &projection) -> EntryRangeOperation< typename std::decay< decltype(makeProjectedEntryOperation< Action >(projection(*first)))>::type >
auto appendProjectedEntry(Holder &message, Tuple &&arguments) -> decltype(appendProjectedEntryArguments< Action >(message, std::forward< Tuple >(arguments), typename MakeIndexSequence< std::tuple_size< typename std::decay< Tuple >::type >::value >::Type()))
auto appendProjectedEntryArguments(Holder &message, Tuple &&arguments, IndexSequence< Indices... >) -> decltype(ContextualEntryOperation< Action >::apply(message, std::get< Indices >(std::forward< Tuple >(arguments))...))
auto initializeMessage(Holder &message, EventFlags::Bits eventIndicator, Messaging::Timestamp transactTime) noexcept -> EnableMutableMessageHolder< ExpectedHolder, Holder >
auto makeEntryRangeOperation(Range &range, Projection &projection) -> decltype(makeEntryRangeOperationFromIterators< Action >(rangeBegin(range), rangeEnd(range), projection))
EntryCount checkedIncrementedEntryCount(EntryCount count)
auto rangeEnd(Range &range) -> decltype(end(range))
Group::Entry appendGroupEntry(Group group, Resize resize)
auto rangeBegin(Range &range) -> decltype(begin(range))
auto operator|(Holder &message, details::DeferredMessageOperation< Factory > &&deferredOperation) -> typename std::enable_if< !details::IsMessageRecipe< typename std::decay< Holder >::type >::value, decltype(std::move(deferredOperation).materialize().apply(message), message)>::type
Materializes and applies a deferred message operation to a named holder.
auto entries(Range &&range, Projection &&projection) -> details::EntryRangeStage< Action, typename std::remove_reference< Range >::type, typename std::remove_reference< Projection >::type >
Creates a reusable-recipe stage from projected range values.
auto addEntries(Holder &message, Range &&range, Projection &&projection) -> decltype(details::addEntriesFromIterators< Action >(message, details::rangeBegin(range), details::rangeEnd(range), std::forward< Projection >(projection)))
Appends entries projected from an input range.
MatchEventIndicator type.
Messaging::MatchEventIndicator::Bits Bits
Protocol storage type for combined event flags.
static auto apply(Holder &message, Arguments &&... arguments) -> decltype(EntryOperationSelector< typename std::decay< Holder >::type::MessageType >::template apply< Action >(message, std::forward< Arguments >(arguments)...))
static auto apply(Holder &message, EventFlags::Bits eventIndicator, Messaging::Timestamp transactTime) noexcept -> EnableMutableMessageHolder< ExpectedHolder, Holder >