6 #include <aws/common/common.h>
11 #include <aws/io/socket.h>
12 #include <aws/mqtt/mqtt.h>
18 #include <unordered_map>
23 struct aws_byte_cursor;
24 struct aws_socket_options;
35 using IStream = std::basic_istream<char, std::char_traits<char>>;
40 using QOS = aws_mqtt_qos;
48 template <
typename K,
typename V>
51 template <
typename K,
typename V>
53 template <
typename T>
using Vector = std::vector<T, StlAllocator<T>>;
54 template <
typename T>
using List = std::list<T, StlAllocator<T>>;
72 template <
typename RawType,
typename TargetType>
using TypeConvertor = std::function<TargetType(RawType)>;
78 template <
typename RawType,
typename TargetType>
82 size_t cnt = aws_array_list_length(array);
83 for (
size_t i = 0; i < cnt; i++)
86 aws_array_list_get_at(array, &t, i);
87 v.emplace_back(conv(t));
96 template <
typename RawType,
typename TargetType>
100 size_t cnt = aws_array_list_length(array);
101 for (
size_t i = 0; i < cnt; i++)
104 aws_array_list_get_at(array, &t, i);
105 v.emplace_back(TargetType(t));
116 size_t cnt = aws_array_list_length(array);
117 for (
size_t i = 0; i < cnt; i++)
120 aws_array_list_get_at(array, &t, i);
128 return StringView(
reinterpret_cast<char *
>(bc.ptr), bc.len);
134 bc.ptr = (uint8_t *)(sv.
data());
142 aws_mem_release(allocator, t);
145 template <
typename T,
typename... Args> T *
New(
Allocator *allocator, Args &&...args)
147 T *t =
reinterpret_cast<T *
>(aws_mem_acquire(allocator,
sizeof(T)));
150 return new (t) T(std::forward<Args>(args)...);
153 template <
typename T,
typename... Args> std::shared_ptr<T>
MakeShared(
Allocator *allocator, Args &&...args)
155 T *t =
reinterpret_cast<T *
>(aws_mem_acquire(allocator,
sizeof(T)));
158 new (t) T(std::forward<Args>(args)...);
160 return std::shared_ptr<T>(t, [allocator](T *obj) {
Delete(obj, allocator); });
163 template <
typename T>
using ScopedResource = std::unique_ptr<T, std::function<void(T *)>>;
168 typename std::enable_if<std::is_base_of<Base, Derived>::value,
bool>::type =
true>
171 const auto &deleter = derived.get_deleter();
173 derived.release(), [deleter](Base *base) { deleter(static_cast<Derived *>(base)); });
179 typename std::enable_if<!std::is_base_of<Base, Derived>::value,
bool>::type =
true>
180 ScopedResource<Base>
SafeSuperCast(ScopedResource<Derived> derived)
183 static_assert(std::is_base_of<Base, Derived>::value,
"Base must be a base class of Derived");
190 typename std::enable_if<std::is_base_of<Base, Derived>::value,
bool>::type =
true>
199 typename std::enable_if<!std::is_base_of<Base, Derived>::value,
bool>::type =
true>
200 ScopedResource<Derived>
SafeSubCast(ScopedResource<Base> base)
203 static_assert(std::is_base_of<Base, Derived>::value,
"Base must be a base class of Derived");