PahoMqttCpp
MQTT C++ Client for POSIX and Windows
Loading...
Searching...
No Matches
buffer_ref.h
Go to the documentation of this file.
1
7
8/*******************************************************************************
9 * Copyright (c) 2017-2024 Frank Pagliughi <fpagliughi@mindspring.com>
10 *
11 * All rights reserved. This program and the accompanying materials
12 * are made available under the terms of the Eclipse Public License v2.0
13 * and Eclipse Distribution License v1.0 which accompany this distribution.
14 *
15 * The Eclipse Public License is available at
16 * http://www.eclipse.org/legal/epl-v20.html
17 * and the Eclipse Distribution License is available at
18 * http://www.eclipse.org/org/documents/edl-v10.php.
19 *
20 * Contributors:
21 * Frank Pagliughi - initial implementation and documentation
22 *******************************************************************************/
23
24#ifndef __mqtt_buffer_ref_h
25#define __mqtt_buffer_ref_h
26
27#include <cstring>
28#include <iostream>
29
30#include "mqtt/types.h"
31
32namespace mqtt {
33
35
59template <typename T>
61{
62public:
67 using value_type = T;
72 using blob = std::basic_string<value_type>;
77 using pointer_type = std::shared_ptr<const blob>;
78
79private:
81 pointer_type data_;
82
83public:
87 buffer_ref() = default;
92 buffer_ref(const buffer_ref& buf) = default;
97 buffer_ref(buffer_ref&& buf) = default;
102 buffer_ref(const blob& b) : data_{std::make_shared<blob>(b)} {}
108 buffer_ref(blob&& b) : data_{std::make_shared<blob>(std::move(b))} {}
116 buffer_ref(const pointer_type& p) : data_(p) {}
124 buffer_ref(pointer_type&& p) : data_(std::move(p)) {}
130 buffer_ref(const value_type* buf, size_t n) : data_{std::make_shared<blob>(buf, n)} {}
136 buffer_ref(const char* buf)
137 : buffer_ref(reinterpret_cast<const value_type*>(buf), std::strlen(buf)) {
138 static_assert(
139 sizeof(char) == sizeof(T), "can only use C arr with char or byte buffers"
140 );
141 }
142
148 buffer_ref& operator=(const buffer_ref& rhs) = default;
154 buffer_ref& operator=(buffer_ref&& rhs) = default;
164 data_.reset(new blob(b));
165 return *this;
166 }
167
176 data_.reset(new blob(std::move(b)));
177 return *this;
178 }
179
184 buffer_ref& operator=(const char* cstr) {
185 static_assert(
186 sizeof(char) == sizeof(T), "can only use C arr with char or byte buffers"
187 );
188 data_.reset(new blob(reinterpret_cast<const value_type*>(cstr), strlen(cstr)));
189 return *this;
190 }
191
200 template <typename OT>
202 static_assert(
203 sizeof(OT) == sizeof(T), "Can only assign buffers if values the same size"
204 );
205 data_.reset(new blob(reinterpret_cast<const value_type*>(rhs.data()), rhs.size()));
206 return *this;
207 }
208
211 void reset() { data_.reset(); }
219 explicit operator bool() const { return bool(data_); }
227 bool is_null() const { return !data_; }
233 bool empty() const { return !data_ || data_->empty(); }
238 const value_type* data() const { return data_->data(); }
243 size_t size() const { return data_->size(); }
248 size_t length() const { return data_->length(); }
253 const blob& str() const { return *data_; }
258 const blob& to_string() const { return str(); }
264 const char* c_str() const { return data_->c_str(); }
269 const pointer_type& ptr() const { return data_; }
275 const value_type& operator[](size_t i) const { return (*data_)[i]; }
276};
277
285template <typename T>
286std::ostream& operator<<(std::ostream& os, const buffer_ref<T>& buf) {
287 if (!buf.empty())
288 os.write(buf.data(), buf.size());
289 return os;
290}
291
293
298
306
308} // namespace mqtt
309
310#endif // __mqtt_buffer_ref_h
Definition buffer_ref.h:61
buffer_ref(const char *buf)
Definition buffer_ref.h:136
buffer_ref(pointer_type &&p)
Definition buffer_ref.h:124
T value_type
Definition buffer_ref.h:67
buffer_ref & operator=(blob &&b)
Definition buffer_ref.h:175
buffer_ref & operator=(const buffer_ref &rhs)=default
buffer_ref & operator=(buffer_ref &&rhs)=default
buffer_ref()=default
buffer_ref(const buffer_ref &buf)=default
const char * c_str() const
Definition buffer_ref.h:264
size_t size() const
Definition buffer_ref.h:243
buffer_ref & operator=(const buffer_ref< OT > &rhs)
Definition buffer_ref.h:201
bool is_null() const
Definition buffer_ref.h:227
buffer_ref & operator=(const blob &b)
Definition buffer_ref.h:163
const value_type * data() const
Definition buffer_ref.h:238
const blob & to_string() const
Definition buffer_ref.h:258
std::basic_string< value_type > blob
Definition buffer_ref.h:72
const value_type & operator[](size_t i) const
Definition buffer_ref.h:275
const blob & str() const
Definition buffer_ref.h:253
std::shared_ptr< const blob > pointer_type
Definition buffer_ref.h:77
const pointer_type & ptr() const
Definition buffer_ref.h:269
size_t length() const
Definition buffer_ref.h:248
buffer_ref(const blob &b)
Definition buffer_ref.h:102
buffer_ref & operator=(const char *cstr)
Definition buffer_ref.h:184
buffer_ref(const value_type *buf, size_t n)
Definition buffer_ref.h:130
buffer_ref(buffer_ref &&buf)=default
void reset()
Definition buffer_ref.h:211
buffer_ref(const pointer_type &p)
Definition buffer_ref.h:116
bool empty() const
Definition buffer_ref.h:233
buffer_ref(blob &&b)
Definition buffer_ref.h:108
Definition async_client.h:60
buffer_ref< char > binary_ref
Definition buffer_ref.h:305
std::ostream & operator<<(std::ostream &os, const buffer_ref< T > &buf)
Definition buffer_ref.h:286
buffer_ref< char > string_ref
Definition buffer_ref.h:297