OnixS C++ ICE Binary Order Entry Handler 1.0.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
32
34
35typedef std::vector<NetworkMessage> NetMessages;
36typedef std::pair<NetworkMessage*, NetworkMessage*> NetMessagesRange;
38
42template <typename MessageTypeT,
44typename MessageInitializer = FieldsInitPolicy>
46{
47public:
48
50 using MsgHolders = std::vector<MsgHolder>;
51
52 using iterator = typename MsgHolders::iterator;
53 using const_iterator = typename MsgHolders::const_iterator;
54
59 MessageBatch() = default;
60
65 explicit MessageBatch(size_t size) : batch_(size)
66 {
68 }
69
74 MessageBatch(std::initializer_list<MsgHolder> list) : batch_(list)
75 {
77 }
78
79 MessageBatch(const MessageBatch &) = delete;
80 MessageBatch & operator=(const MessageBatch &) = delete;
81
85 void add(const MsgHolder & msg)
86 {
87 batch_.push_back(msg);
88 }
89
98 {
99 netMsgs_.resize(batch_.size());
100
101 for (size_t counter = 0; counter < batch_.size(); ++counter)
102 netMsgs_[counter] = batch_[counter].toNetworkMessage();
103 }
104
105 MsgHolder & operator[](size_t index) { return batch_[index]; }
106 const MsgHolder & operator[](size_t index) const { return batch_[index]; }
107
108 size_t size() const { return batch_.size(); }
109
110 const_iterator begin() const { return batch_.begin(); }
111 iterator begin() { return batch_.begin(); }
112
113 const_iterator end() const { return batch_.end(); }
114 iterator end() { return batch_.end(); }
115
116private:
117
118 friend class ONIXS_ICEBOE_NAMESPACE::Session;
119 friend class ONIXS_ICEBOE_MESSAGING_NAMESPACE::MessageBatchChecker;
120
121 MsgHolders batch_;
122 NetMessages netMsgs_;
123};
124
132{
133public:
134
140
145 template <typename MessageTypeT,
147 typename MessageInitializer = FieldsInitPolicy>
149 {
150 netMsgs_.reserve(batch.size());
151 for (auto & holder : batch)
152 netMsgs_.push_back(holder.toNetworkMessage());
153 }
154
155 template <typename MessageTypeT,
157 typename MessageInitializer = FieldsInitPolicy>
159
164 template <typename MessageTypeT,
166 typename MessageInitializer = FieldsInitPolicy>
168 {
169 netMsgs_.push_back(holder.toNetworkMessage());
170 }
171
172 template <typename MessageTypeT,
174 typename MessageInitializer = FieldsInitPolicy>
176
180 void clear()
181 {
182 netMsgs_.clear();
183 }
184
188 NetMessagesRange getRange(size_t index) noexcept
189 {
190 assert(!netMsgs_.empty());
191 return {&*netMsgs_.begin(), &*(netMsgs_.begin() + index)};
192 }
193
196
197private:
198
199 friend class ONIXS_ICEBOE_NAMESPACE::Session;
200 friend class ONIXS_ICEBOE_MESSAGING_NAMESPACE::MessageBatchChecker;
201
202 NetMessages netMsgs_;
203};
204
206{
207public:
209 template <typename SbeMessageType, size_t MaxMessageSize, typename MessageInitializer>
210 static size_t calculateBatchSize(
212 {
213 return calculateBatchSize(msgs.netMsgs_);
214 }
215
217 template <typename SbeMessageType, size_t MaxMessageSize, typename MessageInitializer>
218 static size_t fitSize(
219 MessageBatch<SbeMessageType, MaxMessageSize, MessageInitializer> & msgs, size_t size = defaultMaxPacketSize()) noexcept
220 {
221 return calculateBatchSize(msgs) <= size;
222 }
223
225 static size_t calculateBatchSize(MessageBatchCombiner & msgs) noexcept
226 {
227 return calculateBatchSize(msgs.netMsgs_);
228 }
229
231 static bool fitSize(MessageBatchCombiner & msgs, size_t size = defaultMaxPacketSize()) noexcept
232 {
233 return calculateBatchSize(msgs) <= size;
234 }
235
236private:
238 static size_t calculateBatchSize(const NetMessages& msgs) noexcept;
239
241 static size_t defaultMaxPacketSize() noexcept;
242};
243
#define ONIXS_ICEBOE_MESSAGING_NAMESPACE_BEGIN
Definition ABI.h:102
#define ONIXS_ICEBOE_NAMESPACE_BEGIN
Definition ABI.h:94
#define ONIXS_ICEBOE_EXPORTED_CLASS
Definition ABI.h:41
#define ONIXS_ICEBOE_NAMESPACE_END
Definition ABI.h:98
#define ONIXS_ICEBOE_MESSAGING_NAMESPACE_END
Definition ABI.h:106
#define ONIXS_ICEBOE_EXPORTED
Definition Compiler.h:153
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.
MsgHolder & operator[](size_t index)
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.
std::vector< MsgHolder > MsgHolders
MessageBatch(std::initializer_list< MsgHolder > list)
Creates a message batch from the initializer list.
Contains the SimpleOpenFramingHeader, the SBE message, and the data buffer.
NetworkMessage toNetworkMessage() noexcept
constexpr UInt8 DefaultMaxGroupItems
Default maximum number of repeating group items.
constexpr std::enable_if<!details::HasMemberTraits< Value >::value, size_t >::type size() noexcept
Definition Memory.h:303
std::vector< NetworkMessage > NetMessages
std::pair< NetworkMessage *, NetworkMessage * > NetMessagesRange
The policy to create messages with null-initialized optional fields.