25 #include "proton/error.hpp"
26 #include "proton/type_traits.hpp"
28 #include "proton/object.hpp"
31 #ifndef PN_NO_CONTAINER_CONVERT
40 #include <forward_list>
41 #include <unordered_map>
42 #endif // PN_HAS_CPP11
44 #endif // PN_NO_CONTAINER_CONVERT
64 assert_type(type_id t) : type(t) {}
154 class decoder :
public object<pn_data_t> {
156 decoder(pn_data_t* d) : object<pn_data_t>(d) {}
159 PN_CPP_EXTERN decoder(
const char* buffer,
size_t size);
162 PN_CPP_EXTERN decoder(
const std::string&);
165 PN_CPP_EXTERN
void decode(
const char* buffer,
size_t size);
168 PN_CPP_EXTERN
void decode(
const std::string&);
171 PN_CPP_EXTERN
bool more()
const;
176 PN_CPP_EXTERN type_id type()
const;
179 PN_CPP_EXTERN
void rewind();
182 PN_CPP_EXTERN
void skip();
185 PN_CPP_EXTERN
void backup();
187 PN_CPP_EXTERN
class data data();
194 PN_CPP_EXTERN
friend decoder operator>>(decoder, amqp_null);
195 PN_CPP_EXTERN
friend decoder operator>>(decoder, amqp_boolean&);
196 PN_CPP_EXTERN
friend decoder operator>>(decoder, amqp_ubyte&);
197 PN_CPP_EXTERN
friend decoder operator>>(decoder, amqp_byte&);
198 PN_CPP_EXTERN
friend decoder operator>>(decoder, amqp_ushort&);
199 PN_CPP_EXTERN
friend decoder operator>>(decoder, amqp_short&);
200 PN_CPP_EXTERN
friend decoder operator>>(decoder, amqp_uint&);
201 PN_CPP_EXTERN
friend decoder operator>>(decoder, amqp_int&);
202 PN_CPP_EXTERN
friend decoder operator>>(decoder, amqp_char&);
203 PN_CPP_EXTERN
friend decoder operator>>(decoder, amqp_ulong&);
204 PN_CPP_EXTERN
friend decoder operator>>(decoder, amqp_long&);
205 PN_CPP_EXTERN
friend decoder operator>>(decoder, amqp_timestamp&);
206 PN_CPP_EXTERN
friend decoder operator>>(decoder, amqp_float&);
207 PN_CPP_EXTERN
friend decoder operator>>(decoder, amqp_double&);
208 PN_CPP_EXTERN
friend decoder operator>>(decoder, amqp_decimal32&);
209 PN_CPP_EXTERN
friend decoder operator>>(decoder, amqp_decimal64&);
210 PN_CPP_EXTERN
friend decoder operator>>(decoder, amqp_decimal128&);
211 PN_CPP_EXTERN
friend decoder operator>>(decoder, amqp_uuid&);
212 PN_CPP_EXTERN
friend decoder operator>>(decoder, std::string&);
213 PN_CPP_EXTERN
friend decoder operator>>(decoder, message_id&);
214 PN_CPP_EXTERN
friend decoder operator>>(decoder, annotation_key&);
215 PN_CPP_EXTERN
friend decoder operator>>(decoder, value&);
216 PN_CPP_EXTERN
friend decoder operator>>(decoder, scalar&);
220 template <
class T> T extract() { T value; *
this >> value;
return value; }
248 PN_CPP_EXTERN
friend decoder operator>>(decoder, start&);
251 PN_CPP_EXTERN
friend decoder operator>>(decoder, finish);
254 PN_CPP_EXTERN
friend decoder operator>>(decoder,
struct skip);
257 PN_CPP_EXTERN
friend decoder operator>>(decoder, assert_type);
260 PN_CPP_EXTERN
friend decoder operator>>(decoder,
struct rewind);
263 PN_CPP_EXTERN
void check_type(type_id);
269 struct scope :
public start {
271 scope(decoder d) : decoder_(d) { decoder_ >> *
this; }
272 ~scope() { decoder_ >> finish(); }
277 typename enable_if<is_unknown_integer<T>::value, decoder>::type
278 operator>>(decoder d, T& i) {
279 typename integer_type<sizeof(T), is_signed<T>::value>::type v;
286 template <
class T>
struct ref {
287 ref(T& v) : value(v) {}
290 template <
class T>
struct sequence_ref :
public ref<T> { sequence_ref(T& v) : ref<T>(v) {} };
291 template <
class T>
struct map_ref :
public ref<T> { map_ref(T& v) : ref<T>(v) {} };
292 template <
class T>
struct pairs_ref :
public ref<T> { pairs_ref(T& v) : ref<T>(v) {} };
308 template <
class T> sequence_ref<T> to_sequence(T& v) {
return sequence_ref<T>(v); }
317 template <
class T> map_ref<T> to_map(T& v) {
return map_ref<T>(v); }
330 template <
class T> pairs_ref<T> to_pairs(T& v) {
return pairs_ref<T>(v); }
336 template <
class T> decoder operator>>(decoder d, sequence_ref<T> ref) {
338 if (s.is_described) d >> skip();
342 for (
typename T::iterator i = v.begin(); i != v.end(); ++i)
347 PN_CPP_EXTERN
void assert_map_scope(
const scope& s);
350 template <
class T> decoder operator>>(decoder d, map_ref<T> ref) {
355 for (
size_t i = 0; i < s.size/2; ++i) {
356 typename remove_const<typename T::key_type>::type k;
357 typename remove_const<typename T::mapped_type>::type v;
365 template <
class T> decoder operator>>(decoder d, pairs_ref<T> ref) {
371 for (
typename T::iterator i = m.begin(); i != m.end(); ++i) {
372 d >> i->first >> i->second;
377 #ifndef PN_NO_CONTAINER_CONVERT
380 template <
class T,
class A> decoder operator>>(decoder d, std::vector<T, A>& v) {
return d >> to_sequence(v); }
381 template <
class T,
class A> decoder operator>>(decoder d, std::deque<T, A>& v) {
return d >> to_sequence(v); }
382 template <
class T,
class A> decoder operator>>(decoder d, std::list<T, A>& v) {
return d >> to_sequence(v); }
385 template <
class K,
class T,
class C,
class A> decoder operator>>(decoder d, std::map<K, T, C, A>& v) {
return d >> to_map(v); }
390 template <
class T,
class A> decoder operator>>(decoder d, std::forward_list<T, A>& v) {
return d >> to_sequence(v); }
391 template <
class T, std::
size_t N> decoder operator>>(decoder d, std::array<T, N>& v) {
return d >> to_sequence(v); }
394 template <
class K,
class T,
class C,
class A> decoder operator>>(decoder d, std::unordered_map<K, T, C, A>& v) {
return d >> to_map(v); }
396 #endif // PN_HAS_CPP11
397 #endif // PN_NO_CONTAINER_CONVERT
Defines C++ types representing AMQP types.