Qpid Proton C++ API 0.40.0
 
Loading...
Searching...
No Matches
encoder.hpp
Go to the documentation of this file.
1#ifndef PROTON_CODEC_ENCODER_HPP
2#define PROTON_CODEC_ENCODER_HPP
3
4/*
5 *
6 * Licensed to the Apache Software Foundation (ASF) under one
7 * or more contributor license agreements. See the NOTICE file
8 * distributed with this work for additional information
9 * regarding copyright ownership. The ASF licenses this file
10 * to you under the Apache License, Version 2.0 (the
11 * "License"); you may not use this file except in compliance
12 * with the License. You may obtain a copy of the License at
13 *
14 * http://www.apache.org/licenses/LICENSE-2.0
15 *
16 * Unless required by applicable law or agreed to in writing,
17 * software distributed under the License is distributed on an
18 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
19 * KIND, either express or implied. See the License for the
20 * specific language governing permissions and limitations
21 * under the License.
22 *
23 */
24
25#include "../internal/data.hpp"
26#include "../internal/type_traits.hpp"
27#include "../types_fwd.hpp"
28#include "./common.hpp"
29
30#include <proton/type_compat.h>
31
34
35namespace proton {
36class scalar_base;
37
38namespace internal{
39class value_base;
40}
41
42namespace codec {
43
50class encoder : public internal::data {
51 public:
53 explicit encoder(const data& d) : data(d) {}
54
56 PN_CPP_EXTERN explicit encoder(internal::value_base& v);
57
66 PN_CPP_EXTERN bool encode(char* buffer, size_t& size);
67
70 PN_CPP_EXTERN void encode(std::string&);
71
74 PN_CPP_EXTERN std::string encode();
75
78 PN_CPP_EXTERN encoder& operator<<(bool);
79 PN_CPP_EXTERN encoder& operator<<(uint8_t);
80 PN_CPP_EXTERN encoder& operator<<(int8_t);
81 PN_CPP_EXTERN encoder& operator<<(uint16_t);
82 PN_CPP_EXTERN encoder& operator<<(int16_t);
83 PN_CPP_EXTERN encoder& operator<<(uint32_t);
84 PN_CPP_EXTERN encoder& operator<<(int32_t);
85 PN_CPP_EXTERN encoder& operator<<(wchar_t);
86 PN_CPP_EXTERN encoder& operator<<(uint64_t);
87 PN_CPP_EXTERN encoder& operator<<(int64_t);
88 PN_CPP_EXTERN encoder& operator<<(timestamp);
89 PN_CPP_EXTERN encoder& operator<<(float);
90 PN_CPP_EXTERN encoder& operator<<(double);
91 PN_CPP_EXTERN encoder& operator<<(decimal32);
92 PN_CPP_EXTERN encoder& operator<<(decimal64);
93 PN_CPP_EXTERN encoder& operator<<(decimal128);
94 PN_CPP_EXTERN encoder& operator<<(const uuid&);
95 PN_CPP_EXTERN encoder& operator<<(const std::string&);
96 PN_CPP_EXTERN encoder& operator<<(const symbol&);
97 PN_CPP_EXTERN encoder& operator<<(const binary&);
98 PN_CPP_EXTERN encoder& operator<<(const scalar_base&);
99 PN_CPP_EXTERN encoder& operator<<(const null&);
100 PN_CPP_EXTERN encoder& operator<<(decltype(nullptr));
102
107 PN_CPP_EXTERN encoder& operator<<(const internal::value_base&);
108
110 PN_CPP_EXTERN encoder& operator<<(const start&);
111
113 PN_CPP_EXTERN encoder& operator<<(const finish&);
114
116
117 // Undefined template to prevent pointers being implicitly converted to bool.
118 template <class T> void* operator<<(const T*);
119
120 template <class T> struct list_cref { T& ref; list_cref(T& r) : ref(r) {} };
121 template <class T> struct map_cref { T& ref; map_cref(T& r) : ref(r) {} };
122
123 template <class T> struct array_cref {
124 start array_start;
125 T& ref;
126 array_cref(T& r, type_id el, bool described) : array_start(ARRAY, el, described), ref(r) {}
127 };
128
129 template <class T> static list_cref<T> list(T& x) { return list_cref<T>(x); }
130 template <class T> static map_cref<T> map(T& x) { return map_cref<T>(x); }
131 template <class T> static array_cref<T> array(T& x, type_id element, bool described=false) {
132 return array_cref<T>(x, element, described);
133 }
134
135 template <class T> encoder& operator<<(const map_cref<T>& x) {
136 internal::state_guard sg(*this);
137 *this << start::map();
138 for (typename T::const_iterator i = x.ref.begin(); i != x.ref.end(); ++i)
139 *this << i->first << i->second;
140 *this << finish();
141 return *this;
142 }
143
144 template <class T> encoder& operator<<(const list_cref<T>& x) {
145 internal::state_guard sg(*this);
146 *this << start::list();
147 for (typename T::const_iterator i = x.ref.begin(); i != x.ref.end(); ++i)
148 *this << *i;
149 *this << finish();
150 return *this;
151 }
152
153 template <class T> encoder& operator<<(const array_cref<T>& x) {
154 internal::state_guard sg(*this);
155 *this << x.array_start;
156 for (typename T::const_iterator i = x.ref.begin(); i != x.ref.end(); ++i)
157 *this << *i;
158 *this << finish();
159 return *this;
160 }
162
163 private:
164 template<class T, class U> encoder& insert(const T& x, int (*put)(pn_data_t*, U));
165 void check(long result);
166};
167
169inline encoder& operator<<(encoder& e, const char* s) { return e << std::string(s); }
170
172template <class T> typename std::enable_if<internal::is_unknown_integer<T>::value, encoder&>::type
173operator<<(encoder& e, T i) {
174 using namespace internal;
175 return e << static_cast<typename integer_type<sizeof(T), std::is_signed<T>::value>::type>(i);
176}
177
179
180namespace is_encodable_impl { // Protect the world from fallback operator<<
181
182using namespace internal;
183
184sfinae::no operator<<(encoder const&, const sfinae::any_t &); // Fallback
185
186template<typename T> struct is_encodable : public sfinae {
187 static yes test(encoder&);
188 static no test(...); // Failed test, no match.
189 static encoder* e;
190 static const T* t;
191 static bool const value = sizeof(test(*e << *t)) == sizeof(yes);
192};
193
194// Avoid recursion
195template <> struct is_encodable<value> : public std::true_type {};
196
197} // is_encodable_impl
198
199using is_encodable_impl::is_encodable;
200
201// Metafunction to test if a class looks like an encodable map from K to T.
202template <class M, class K, class T, class Enable = void>
203struct is_encodable_map : public std::false_type {};
204
205template <class M, class K, class T> struct is_encodable_map<
206 M, K, T, typename std::enable_if<
207 std::is_same<K, typename M::key_type>::value &&
208 std::is_same<T, typename M::mapped_type>::value &&
209 is_encodable<M>::value
210 >::type
211 > : public std::true_type {};
212
213
215
216} // codec
217} // proton
218
219#endif
Arbitrary binary data.
Definition binary.hpp:40
Unsettled API - A stream-like encoder from C++ values to AMQP bytes.
Definition encoder.hpp:50
bool encode(char *buffer, size_t &size)
Encode the current values into buffer and update size to reflect the number of bytes encoded.
encoder & operator<<(const internal::value_base &)
Insert a proton::value.
encoder(const data &d)
Wrap Proton-C data object.
Definition encoder.hpp:53
encoder & operator<<(const start &)
Start a complex type.
encoder(internal::value_base &v)
Encoder into v. Clears any current value in v.
void encode(std::string &)
Encode the current values into a std::string and resize the string if necessary.
std::string encode()
Encode the current values into a std::string.
encoder & operator<<(const finish &)
Finish a complex type.
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
The type of the AMQP null value.
Definition null.hpp:38
The base class for scalar types.
Definition scalar_base.hpp:60
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
A holder for any AMQP value, simple or complex.
Definition value.hpp:57
Unsettled API - Shared codec functions.
encoder & operator<<(encoder &e, const std::deque< T, A > &x)
std::deque<T> for most T is encoded as an amqp::ARRAY (same type elements)
Definition deque.hpp:37
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
type_id
An identifier for AMQP types.
Definition type_id.hpp:37
@ ARRAY
A sequence of values of the same type.
Definition type_id.hpp:60
std::ostream & operator<<(std::ostream &, const binary &)
Print a binary value.