OnixS C++ CME iLink 3 Binary Order Entry Handler 1.19.0
API Documentation
Loading...
Searching...
No Matches
MessageBatch.h
Go to the documentation of this file.
1// Copyright Onix Solutions Limited [OnixS]. All rights reserved.
2//
3// This software owned by Onix Solutions Limited [OnixS] and is
4// protected by copyright law and international copyright treaties.
5//
6// Access to and use of the software is governed by the terms of the applicable
7// OnixS Software Services Agreement (the Agreement) and Customer end user license
8// agreements granting a non-assignable, non-transferable and non-exclusive license
9// to use the software for it's own data processing purposes under the terms defined
10// in the Agreement.
11//
12// Except as otherwise granted within the terms of the Agreement, copying or
13// reproduction of any part of this source code or associated reference material
14// to any other location for further reproduction or redistribution, and any
15// amendments to this copyright notice, are expressly prohibited.
16//
17// Any reproduction or redistribution for sale or hiring of the Software not in
18// accordance with the terms of the Agreement is a violation of copyright law.
19//
20
21#pragma once
22
23#include <vector>
24
28
29namespace OnixS
30{
31 namespace CME
32 {
33 namespace iLink3
34 {
36 }
37 }
38}
39
41
42typedef std::vector<NetworkMessage> NetMessages;
43typedef std::pair<NetworkMessage*, NetworkMessage*> NetMessagesRange;
45
46#if defined (ONIXS_ILINK3_CXX11)
47
51template <typename MessageTypeT,
52size_t MaxMessageSize = GetMaxMessageSize<typename HeldAdapter<MessageTypeT>::SbeType, DefaultMaxGroupItems>::Size,
53typename MessageInitializer = FieldsInitPolicy>
55{
56public:
57
59 using MsgHolders = std::vector<MsgHolder>;
60
61 using iterator = typename MsgHolders::iterator;
62 using const_iterator = typename MsgHolders::const_iterator;
63
68 MessageBatch() = default;
69
74 explicit MessageBatch(size_t size) : batch_(size)
75 {
77 }
78
83 MessageBatch(std::initializer_list<MsgHolder> list) : batch_(list)
84 {
86 }
87
88 MessageBatch(const MessageBatch &) = delete;
89 MessageBatch & operator=(const MessageBatch &) = delete;
90
94 void add(const MsgHolder & msg)
95 {
96 batch_.push_back(msg);
97 }
98
107 {
108 netMsgs_.resize(batch_.size());
109
110 for (size_t counter = 0; counter < batch_.size(); ++counter)
111 netMsgs_[counter] = batch_[counter].toNetworkMessage();
112 }
113
114 MsgHolder & operator[](size_t index) { return batch_[index]; }
115 const MsgHolder & operator[](size_t index) const { return batch_[index]; }
116
117 size_t size() const { return batch_.size(); }
118
119 const_iterator begin() const { return batch_.begin(); }
120 iterator begin() { return batch_.begin(); }
121
122 const_iterator end() const { return batch_.end(); }
123 iterator end() { return batch_.end(); }
124
125private:
126
129
130 MsgHolders batch_;
131 NetMessages netMsgs_;
132};
133
141{
142public:
143
149
154 template <typename MessageTypeT,
155 size_t MaxMessageSize = GetMaxMessageSize<typename HeldAdapter<MessageTypeT>::SbeType, DefaultMaxGroupItems>::Size,
156 typename MessageInitializer = FieldsInitPolicy>
158 {
159 netMsgs_.reserve(batch.size());
160 for (auto & holder : batch)
161 netMsgs_.push_back(holder.toNetworkMessage());
162 }
163
164 template <typename MessageTypeT,
165 size_t MaxMessageSize = GetMaxMessageSize<typename HeldAdapter<MessageTypeT>::SbeType, DefaultMaxGroupItems>::Size,
166 typename MessageInitializer = FieldsInitPolicy>
168
173 template <typename MessageTypeT,
174 size_t MaxMessageSize = GetMaxMessageSize<typename HeldAdapter<MessageTypeT>::SbeType, DefaultMaxGroupItems>::Size,
175 typename MessageInitializer = FieldsInitPolicy>
177 {
178 netMsgs_.push_back(holder.toNetworkMessage());
179 }
180
181 template <typename MessageTypeT,
182 size_t MaxMessageSize = GetMaxMessageSize<typename HeldAdapter<MessageTypeT>::SbeType, DefaultMaxGroupItems>::Size,
183 typename MessageInitializer = FieldsInitPolicy>
185
189 void clear()
190 {
191 netMsgs_.clear();
192 }
193
197 NetMessagesRange getRange(size_t index) noexcept
198 {
199 assert(!netMsgs_.empty());
200 return {&*netMsgs_.begin(), &*(netMsgs_.begin() + index)};
201 }
202
205
206private:
207
210
211 NetMessages netMsgs_;
212};
213
215{
216public:
218 template <typename SbeMessageType, size_t MaxMessageSize, typename MessageInitializer>
219 static size_t calculateBatchSize(
221 {
222 return calculateBatchSize(msgs.netMsgs_);
223 }
224
226 template <typename SbeMessageType, size_t MaxMessageSize, typename MessageInitializer>
227 static size_t fitSize(
228 MessageBatch<SbeMessageType, MaxMessageSize, MessageInitializer> & msgs, size_t size = defaultMaxPacketSize()) noexcept
229 {
230 return calculateBatchSize(msgs) <= size;
231 }
232
234 static size_t calculateBatchSize(MessageBatchCombiner & msgs) noexcept
235 {
236 return calculateBatchSize(msgs.netMsgs_);
237 }
238
240 static bool fitSize(MessageBatchCombiner & msgs, size_t size = defaultMaxPacketSize()) noexcept
241 {
242 return calculateBatchSize(msgs) <= size;
243 }
244
245private:
247 static size_t calculateBatchSize(const NetMessages& msgs) noexcept;
248
250 static size_t defaultMaxPacketSize() noexcept;
251};
252
253#endif
254
#define ONIXS_ILINK3_MESSAGING_NAMESPACE_END
Definition ABI.h:144
#define ONIXS_ILINK3_MESSAGING_NAMESPACE_BEGIN
Definition ABI.h:140
#define ONIXS_ILINK3_EXPORTED_CLASS
Definition ABI.h:44
#define ONIXS_ILINK3_EXPORTED
Definition Compiler.h:145
static size_t calculateBatchSize(MessageBatchCombiner &msgs) noexcept
static bool fitSize(MessageBatchCombiner &msgs, size_t size=defaultMaxPacketSize()) noexcept
static size_t fitSize(MessageBatch< SbeMessageType, MaxMessageSize, MessageInitializer > &msgs, size_t size=defaultMaxPacketSize()) noexcept
static size_t calculateBatchSize(MessageBatch< SbeMessageType, MaxMessageSize, MessageInitializer > &msgs) noexcept
The class can be used to combine messages with different types to the batch for sending.
MessageBatchCombiner()=default
Creates an empty message batch combiner.
void add(MessageBatch< MessageTypeT, MaxMessageSize, MessageInitializer > &batch)
Adds the message batch to the array of combined messages.
void add(MessageBatch< MessageTypeT, MaxMessageSize, MessageInitializer > &&batch)=delete
MessageBatchCombiner & operator=(const MessageBatchCombiner &)=delete
MessageBatchCombiner(const MessageBatchCombiner &)=delete
void add(MessageHolder< MessageTypeT, MaxMessageSize, MessageInitializer > &holder)
Adds the message to the array of combined messages.
NetMessagesRange getRange(size_t index) noexcept
Provides a range of messages.
void clear()
Removes all combined messages.
void add(MessageHolder< MessageTypeT, MaxMessageSize, MessageInitializer > &&holder)=delete
MessageBatch(size_t size)
Creates a message batch with the given number of default constructed messages.
MessageHolder< MessageTypeT, MaxMessageSize, MessageInitializer > MsgHolder
void add(const MsgHolder &msg)
Appends a message to the end of the batch.
typename MsgHolders::const_iterator const_iterator
void updateHeaders()
Updates headers of SBE messages to be ready for sending.
MessageBatch & operator=(const MessageBatch &)=delete
const MsgHolder & operator[](size_t index) const
typename MsgHolders::iterator iterator
MessageBatch(const MessageBatch &)=delete
MessageBatch()=default
Creates an empty message batch.
MessageBatch(std::initializer_list< MsgHolder > list)
Creates a message batch from the initializer list.
Contains the SimpleOpenFramingHeader, the SBE message, and the data buffer.
An iLink 3 Session.
Definition Session.h:48
constexpr UInt8 DefaultMaxGroupItems
Default maximum number of repeating group items.
std::vector< NetworkMessage > NetMessages
std::pair< NetworkMessage *, NetworkMessage * > NetMessagesRange
The policy to create messages with null-initialized optional fields.