26 #include "proton/error.hpp"
28 #include "proton/type_traits.hpp"
29 #include "proton/object.hpp"
32 #ifndef PN_NO_CONTAINER_CONVERT
41 #include <forward_list>
42 #include <unordered_map>
43 #endif // PN_HAS_CPP11
45 #endif // PN_NO_CONTAINER_CONVERT
60 template<
class T, type_
id A>
struct cref {
62 static const type_id type;
64 cref(
const T& v) : value(v) {}
68 template <
class T, type_
id A>
const type_id cref<T, A>::type = A;
77 template <type_
id A,
class T> cref<T, A> as(
const T& value) {
return cref<T, A>(value); }
118 class encoder :
public object<pn_data_t> {
120 encoder(pn_data_t* e) : object<pn_data_t>(e) {}
130 PN_CPP_EXTERN
bool encode(
char* buffer,
size_t& size);
136 PN_CPP_EXTERN
void encode(std::string&);
139 PN_CPP_EXTERN std::string encode();
141 PN_CPP_EXTERN
class data data();
146 friend PN_CPP_EXTERN encoder operator<<(encoder, amqp_null);
147 friend PN_CPP_EXTERN encoder operator<<(encoder, amqp_boolean);
148 friend PN_CPP_EXTERN encoder operator<<(encoder, amqp_ubyte);
149 friend PN_CPP_EXTERN encoder operator<<(encoder, amqp_byte);
150 friend PN_CPP_EXTERN encoder operator<<(encoder, amqp_ushort);
151 friend PN_CPP_EXTERN encoder operator<<(encoder, amqp_short);
152 friend PN_CPP_EXTERN encoder operator<<(encoder, amqp_uint);
153 friend PN_CPP_EXTERN encoder operator<<(encoder, amqp_int);
154 friend PN_CPP_EXTERN encoder operator<<(encoder, amqp_char);
155 friend PN_CPP_EXTERN encoder operator<<(encoder, amqp_ulong);
156 friend PN_CPP_EXTERN encoder operator<<(encoder, amqp_long);
157 friend PN_CPP_EXTERN encoder operator<<(encoder, amqp_timestamp);
158 friend PN_CPP_EXTERN encoder operator<<(encoder, amqp_float);
159 friend PN_CPP_EXTERN encoder operator<<(encoder, amqp_double);
160 friend PN_CPP_EXTERN encoder operator<<(encoder, amqp_decimal32);
161 friend PN_CPP_EXTERN encoder operator<<(encoder, amqp_decimal64);
162 friend PN_CPP_EXTERN encoder operator<<(encoder, amqp_decimal128);
163 friend PN_CPP_EXTERN encoder operator<<(encoder, amqp_uuid);
164 friend PN_CPP_EXTERN encoder operator<<(encoder, amqp_string);
165 friend PN_CPP_EXTERN encoder operator<<(encoder, amqp_symbol);
166 friend PN_CPP_EXTERN encoder operator<<(encoder, amqp_binary);
167 friend PN_CPP_EXTERN encoder operator<<(encoder,
const message_id&);
168 friend PN_CPP_EXTERN encoder operator<<(encoder,
const annotation_key&);
169 friend PN_CPP_EXTERN encoder operator<<(encoder,
const value&);
170 friend PN_CPP_EXTERN encoder operator<<(encoder,
const scalar&);
183 friend PN_CPP_EXTERN encoder operator<<(encoder,
const start&);
186 friend PN_CPP_EXTERN encoder operator<<(encoder e, finish);
192 template <
class T, type_
id A>
friend PN_CPP_EXTERN encoder operator<<(encoder, cref<T, A>);
193 template <
class T>
friend encoder operator<<(encoder, cref<T, ARRAY>);
194 template <
class T>
friend encoder operator<<(encoder, cref<T, LIST>);
195 template <
class T>
friend encoder operator<<(encoder, cref<T, MAP>);
201 inline encoder operator<<(encoder e,
char* s) {
return e << amqp_string(s); }
202 inline encoder operator<<(encoder e,
const char* s) {
return e << amqp_string(s); }
203 inline encoder operator<<(encoder e,
const std::string& s) {
return e << amqp_string(s); }
207 typename enable_if<is_unknown_integer<T>::value, encoder>::type operator<<(encoder e, T i) {
208 typename integer_type<sizeof(T), is_signed<T>::value>::type v = i;
214 template <
class T> encoder operator<<(encoder e, cref<T, ARRAY> a) {
215 e << start::array(type_id_of<typename T::value_type>::value);
216 for (
typename T::const_iterator i = a.value.begin(); i != a.value.end(); ++i)
222 template <
class T> encoder operator<<(encoder e, cref<T, LIST> l) {
224 for (
typename T::const_iterator i = l.value.begin(); i != l.value.end(); ++i)
230 template <
class T> encoder operator<<(encoder e, cref<T, MAP> m){
232 for (
typename T::const_iterator i = m.value.begin(); i != m.value.end(); ++i) {
240 #ifndef PN_NO_CONTAINER_CONVERT
242 template <
class T,
class A> encoder operator<<(encoder e, const std::vector<T, A>& v) {
return e << as<ARRAY>(v); }
243 template <
class T,
class A> encoder operator<<(encoder e, const std::deque<T, A>& v) {
return e << as<ARRAY>(v); }
244 template <
class T,
class A> encoder operator<<(encoder e, const std::list<T, A>& v) {
return e << as<ARRAY>(v); }
247 template <
class A> encoder operator<<(encoder e, const std::vector<value, A>& v) {
return e << as<LIST>(v); }
248 template <
class A> encoder operator<<(encoder e, const std::deque<value, A>& v) {
return e << as<LIST>(v); }
249 template <
class A> encoder operator<<(encoder e, const std::list<value, A>& v) {
return e << as<LIST>(v); }
252 template <
class K,
class T,
class C,
class A> encoder operator<<(encoder e, const std::map<K, T, C, A>& v) {
return e << as<MAP>(v); }
257 template <
class T,
class A> encoder operator<<(encoder e, const std::forward_list<T, A>& v) {
return e << as<ARRAY>(v); }
258 template <
class T, std::
size_t N> encoder operator<<(encoder e, const std::array<T, N>& v) {
return e << as<ARRAY>(v); }
261 template <
class A> encoder operator<<(encoder e, const std::forward_list<value, A>& v) {
return e << as<LIST>(v); }
262 template <std::
size_t N> encoder operator<<(encoder e, const std::array<value, N>& v) {
return e << as<LIST>(v); }
265 template <
class K,
class T,
class C,
class A> encoder operator<<(encoder e, const std::unordered_map<K, T, C, A>& v) {
return e << as<MAP>(v); }
267 #endif // PN_HAS_CPP11
269 #endif // PN_NO_CONTAINER_CONVERT
Defines C++ types representing AMQP types.