1 #ifndef PROTON_CODEC_DECODER_HPP 
    2 #define PROTON_CODEC_DECODER_HPP 
   25 #include "../internal/data.hpp" 
   26 #include "../internal/type_traits.hpp" 
   27 #include "../types_fwd.hpp" 
   30 #include <proton/type_compat.h> 
   61     explicit decoder(
const data& d, 
bool exact=
false) : data(d), exact_(exact) {}
 
   65     PN_CPP_EXTERN 
explicit decoder(
const internal::value_base&, 
bool exact=
false);
 
   69     PN_CPP_EXTERN 
void decode(
const char* buffer, 
size_t size);
 
   73     PN_CPP_EXTERN 
void decode(
const std::string&);
 
   91     PN_CPP_EXTERN 
decoder& operator>>(
bool&);
 
   92     PN_CPP_EXTERN 
decoder& operator>>(uint8_t&);
 
   93     PN_CPP_EXTERN 
decoder& operator>>(int8_t&);
 
   94     PN_CPP_EXTERN 
decoder& operator>>(uint16_t&);
 
   95     PN_CPP_EXTERN 
decoder& operator>>(int16_t&);
 
   96     PN_CPP_EXTERN 
decoder& operator>>(uint32_t&);
 
   97     PN_CPP_EXTERN 
decoder& operator>>(int32_t&);
 
   98     PN_CPP_EXTERN 
decoder& operator>>(
wchar_t&);
 
   99     PN_CPP_EXTERN 
decoder& operator>>(uint64_t&);
 
  100     PN_CPP_EXTERN 
decoder& operator>>(int64_t&);
 
  102     PN_CPP_EXTERN 
decoder& operator>>(
float&);
 
  103     PN_CPP_EXTERN 
decoder& operator>>(
double&);
 
  108     PN_CPP_EXTERN 
decoder& operator>>(std::string&);
 
  114     PN_CPP_EXTERN 
decoder& operator>>(internal::value_base&);
 
  115     PN_CPP_EXTERN 
decoder& operator>>(
null&);
 
  116     PN_CPP_EXTERN 
decoder& operator>>(decltype(
nullptr)&);
 
  130     template <
class T> 
struct sequence_ref { T& ref; sequence_ref(T& r) : ref(r) {} };
 
  131     template <
class T> 
struct associative_ref { T& ref; associative_ref(T& r) : ref(r) {} };
 
  132     template <
class T> 
struct pair_sequence_ref { T& ref;  pair_sequence_ref(T& r) : ref(r) {} };
 
  134     template <
class T> 
static sequence_ref<T> sequence(T& x) { 
return sequence_ref<T>(x); }
 
  135     template <
class T> 
static associative_ref<T> associative(T& x) { 
return associative_ref<T>(x); }
 
  136     template <
class T> 
static pair_sequence_ref<T> pair_sequence(T& x) { 
return pair_sequence_ref<T>(x); }
 
  145         if (s.is_described) next();
 
  146         r.ref.resize(s.size);
 
  147         for (
typename T::iterator i = r.ref.begin(); i != r.ref.end(); ++i)
 
  154         using namespace internal;
 
  159         for (
size_t i = 0; i < s.size/2; ++i) {
 
  160             typename remove_const<typename T::key_type>::type k;
 
  161             typename remove_const<typename T::mapped_type>::type v;
 
  171         using namespace internal;
 
  176         for (
size_t i = 0; i < s.size/2; ++i) {
 
  177             typedef typename T::value_type value_type;
 
  178             typename remove_const<typename value_type::first_type>::type k;
 
  179             typename remove_const<typename value_type::second_type>::type v;
 
  181             r.ref.push_back(value_type(k, v));
 
  188     template <
class T, 
class U> 
decoder& extract(T& x, U (*
get)(pn_data_t*));
 
  206 template <
class T> 
typename internal::enable_if<internal::is_unknown_integer<T>::value, 
decoder&>::type
 
  208     using namespace internal;
 
  209     typename integer_type<
sizeof(T), is_signed<T>::value>::type v;
 
A key for use with AMQP annotation maps.
Definition: annotation_key.hpp:38
Arbitrary binary data.
Definition: binary.hpp:40
Unsettled API - A stream-like decoder from AMQP bytes to C++ values.
Definition: decoder.hpp:56
decoder & operator>>(start &)
Start decoding a container type, such as an ARRAY, LIST or MAP.
decoder & operator>>(const finish &)
Finish decoding a container type, and move on to the next value in the stream.
void decode(const char *buffer, size_t size)
Decode AMQP data from a buffer and add it to the end of the decoders stream.
void decode(const std::string &)
Decode AMQP data from a std::string and add it to the end of the decoders stream.
decoder & operator>>(associative_ref< T > r)
Extract an AMQP MAP to a C++ associative container.
Definition: decoder.hpp:153
bool more()
Return true if there are more value to extract at the current level.
decoder & operator>>(sequence_ref< T > r)
Extract any AMQP sequence (ARRAY, LIST or MAP) to a C++ sequence container of T if the elements types...
Definition: decoder.hpp:142
decoder(const data &d, bool exact=false)
Wrap a Proton C data object.
Definition: decoder.hpp:61
decoder & operator>>(pair_sequence_ref< T > r)
Extract an AMQP MAP to a C++ push_back sequence of pairs preserving encoded order.
Definition: decoder.hpp:170
decoder(const internal::value_base &, bool exact=false)
Attach decoder to a proton::value.
type_id next_type()
Get the type of the next value that will be read by operator>>.
A 128-bit decimal floating-point value.
Definition: decimal.hpp:52
A 32-bit decimal floating-point value.
Definition: decimal.hpp:46
A 64-bit decimal floating-point value.
Definition: decimal.hpp:49
An AMQP message ID.
Definition: message_id.hpp:47
An AMQP message.
Definition: message.hpp:50
A holder for an instance of any scalar AMQP type.
Definition: scalar.hpp:37
A string that represents the AMQP symbol type.
Definition: symbol.hpp:35
A 64-bit timestamp in milliseconds since the Unix epoch.
Definition: timestamp.hpp:35
A 16-byte universally unique identifier.
Definition: uuid.hpp:37
Unsettled API - Shared codec functions.
internal::enable_if< internal::is_unknown_integer< T >::value, decoder & >::type operator>>(decoder &d, T &i)
operator>> for integer types that are not covered by the standard overrides.
Definition: decoder.hpp:207
Unsettled API - Finish inserting or extracting a complex type.
Definition: common.hpp:57
Unsettled API - Start encoding a complex type.
Definition: common.hpp:34
The main Proton namespace.
Definition: annotation_key.hpp:33
T get(const scalar &s)
Get a contained value of type T.
Definition: scalar.hpp:60
type_id
An identifier for AMQP types.
Definition: type_id.hpp:37
@ MAP
A sequence of key-value pairs.
Definition: type_id.hpp:62
void assert_type_equal(type_id want, type_id got)
Throw a conversion_error if want != got with a message including the names of the types.