31 #ifndef AUTOBAHN_WAMP_ARGUMENTS_HPP 32 #define AUTOBAHN_WAMP_ARGUMENTS_HPP 35 #include <msgpack.hpp> 37 #include <unordered_map> 42 using wamp_arguments = std::vector<msgpack::object>;
43 using wamp_kw_arguments = std::unordered_map<std::string, msgpack::object>;
45 static msgpack::zone EMPTY_ARGUMENTS_ZONE;
46 static msgpack::zone EMPTY_KW_ARGUMENTS_ZONE;
47 static const msgpack::object EMPTY_ARGUMENTS(std::array<msgpack::object, 0>(), &EMPTY_ARGUMENTS_ZONE);
48 static const msgpack::object EMPTY_KW_ARGUMENTS(wamp_kw_arguments(), &EMPTY_KW_ARGUMENTS_ZONE);
54 inline T value_for_key(
const msgpack::object&
object,
const std::string& key)
56 if (
object.type != msgpack::type::MAP) {
57 throw msgpack::type_error();
59 for (std::size_t i = 0; i <
object.via.map.size; ++i) {
60 const msgpack::object_kv& kv =
object.via.map.ptr[i];
61 if (kv.key.type == msgpack::type::STR && key.size() == kv.key.via.str.size
62 && key.compare(0, key.size(), kv.key.via.str.ptr, kv.key.via.str.size) == 0)
64 return kv.val.as<T>();
67 throw std::out_of_range(key +
" keyword argument doesn't exist");
71 inline T value_for_key(
const msgpack::object&
object,
const char* key)
73 if (
object.type != msgpack::type::MAP) {
74 throw msgpack::type_error();
76 std::size_t key_size = strlen(key);
77 for (std::size_t i = 0; i <
object.via.map.size; ++i) {
78 const msgpack::object_kv& kv =
object.via.map.ptr[i];
79 if (kv.key.type == msgpack::type::STR && key_size == kv.key.via.str.size
80 && memcmp(key, kv.key.via.str.ptr, key_size) == 0)
82 return kv.val.as<T>();
85 throw std::out_of_range(std::string(key) +
" keyword argument doesn't exist");
89 inline T value_for_key_or(
const msgpack::object&
object,
const std::string& key,
const T& fallback)
91 if (
object.type != msgpack::type::MAP) {
92 throw msgpack::type_error();
94 for (std::size_t i = 0; i <
object.via.map.size; ++i) {
95 const msgpack::object_kv& kv =
object.via.map.ptr[i];
96 if (kv.key.type == msgpack::type::STR && key.size() == kv.key.via.str.size
97 && key.compare(0, key.size(), kv.key.via.str.ptr, kv.key.via.str.size) == 0)
99 return kv.val.as<T>();
105 template <
typename T>
106 inline T value_for_key_or(
const msgpack::object&
object,
const char* key,
const T& fallback)
108 if (
object.type != msgpack::type::MAP) {
109 throw msgpack::type_error();
111 std::size_t key_size = strlen(key);
112 for (std::size_t i = 0; i <
object.via.map.size; ++i) {
113 const msgpack::object_kv& kv =
object.via.map.ptr[i];
114 if (kv.key.type == msgpack::type::STR && key_size == kv.key.via.str.size
115 && memcmp(key, kv.key.via.str.ptr, key_size) == 0)
117 return kv.val.as<T>();
124 #endif // AUTOBAHN_WAMP_ARGUMENTS_HPP