@@ -166,6 +166,13 @@ class BasicMessageBuilder {
166166 * Gets the message's user data pointer
167167 */
168168 void * user_data () const ;
169+
170+ /* *
171+ * Private data accessor (internal use only)
172+ */
173+ Message::InternalPtr internal () const ;
174+ Concrete& internal (Message::InternalPtr internal);
175+
169176private:
170177 void construct_buffer (BufferType& lhs, const BufferType& rhs);
171178 Concrete& get_concrete ();
@@ -176,11 +183,13 @@ class BasicMessageBuilder {
176183 BufferType payload_;
177184 std::chrono::milliseconds timestamp_{0 };
178185 void * user_data_;
186+ Message::InternalPtr internal_;
179187};
180188
181189template <typename T, typename C>
182190BasicMessageBuilder<T, C>::BasicMessageBuilder(std::string topic)
183- : topic_(std::move(topic)) {
191+ : topic_(std::move(topic)),
192+ user_data_ (nullptr ) {
184193}
185194
186195template <typename T, typename C>
@@ -190,16 +199,16 @@ BasicMessageBuilder<T, C>::BasicMessageBuilder(const Message& message)
190199 payload_(Buffer(message.get_payload().get_data(), message.get_payload().get_size())),
191200 timestamp_(message.get_timestamp() ? message.get_timestamp().get().get_timestamp() :
192201 std::chrono::milliseconds(0 )),
193- user_data_(message.get_user_data())
194- {
195-
202+ user_data_(message.get_user_data()),
203+ internal_(message.internal()) {
196204}
197205
198206template <typename T, typename C>
199207template <typename U, typename V>
200208BasicMessageBuilder<T, C>::BasicMessageBuilder(const BasicMessageBuilder<U, V>& rhs)
201209: topic_(rhs.topic()), partition_(rhs.partition()), timestamp_(rhs.timestamp()),
202- user_data_ (rhs.user_data()) {
210+ user_data_ (rhs.user_data()),
211+ internal_(rhs.internal()) {
203212 get_concrete ().construct_buffer (key_, rhs.key ());
204213 get_concrete ().construct_buffer (payload_, rhs.payload ());
205214}
@@ -292,6 +301,17 @@ void* BasicMessageBuilder<T, C>::user_data() const {
292301 return user_data_;
293302}
294303
304+ template <typename T, typename C>
305+ Message::InternalPtr BasicMessageBuilder<T, C>::internal() const {
306+ return internal_;
307+ }
308+
309+ template <typename T, typename C>
310+ C& BasicMessageBuilder<T, C>::internal(Message::InternalPtr internal) {
311+ internal_ = internal;
312+ return get_concrete ();
313+ }
314+
295315template <typename T, typename C>
296316void BasicMessageBuilder<T, C>::construct_buffer(T& lhs, const T& rhs) {
297317 lhs = rhs;
@@ -328,6 +348,15 @@ class MessageBuilder : public BasicMessageBuilder<Buffer, MessageBuilder> {
328348 void construct_buffer (Buffer& lhs, const T& rhs) {
329349 lhs = Buffer (rhs);
330350 }
351+
352+ MessageBuilder clone () const {
353+ return std::move (MessageBuilder (topic ()).
354+ key (Buffer (key ().get_data (), key ().get_size ())).
355+ payload (Buffer (payload ().get_data (), payload ().get_size ())).
356+ timestamp (timestamp ()).
357+ user_data (user_data ()).
358+ internal (internal ()));
359+ }
331360};
332361
333362/* *
0 commit comments