message.hpp (77e62c83d54e15716b16dcaae403b273665f0d50) | message.hpp (377e76abd1f1deb498e8495c61fb160675584eec) |
---|---|
1// Copyright (c) Benjamin Kietzman (github.com/bkietz) 2// 3// Distributed under the Boost Software License, Version 1.0. (See accompanying 4// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 5 6#ifndef DBUS_MESSAGE_HPP 7#define DBUS_MESSAGE_HPP 8 --- 160 unchanged lines hidden (view full) --- 169 170template <typename Element> 171typename boost::enable_if<is_fixed_type<Element>, message::packer&>::type 172operator<<(message::packer& p, const Element& e) { 173 p.iter_.append_basic(element<Element>::code, &e); 174 return p; 175} 176 | 1// Copyright (c) Benjamin Kietzman (github.com/bkietz) 2// 3// Distributed under the Boost Software License, Version 1.0. (See accompanying 4// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 5 6#ifndef DBUS_MESSAGE_HPP 7#define DBUS_MESSAGE_HPP 8 --- 160 unchanged lines hidden (view full) --- 169 170template <typename Element> 171typename boost::enable_if<is_fixed_type<Element>, message::packer&>::type 172operator<<(message::packer& p, const Element& e) { 173 p.iter_.append_basic(element<Element>::code, &e); 174 return p; 175} 176 |
177// Specialization used to represent "dict" in dbus. 178// TODO(ed) generalize for all "map like" types instead of using vector |
|
177template <typename Key, typename Value> 178message::packer& operator<<(message::packer& p, 179 const std::vector<std::pair<Key, Value>>& v) { 180 message::packer sub; | 179template <typename Key, typename Value> 180message::packer& operator<<(message::packer& p, 181 const std::vector<std::pair<Key, Value>>& v) { 182 message::packer sub; |
181 char signature[] = {'{', element<Key>::code, element<Value>::code, '}', 0}; 182 183 p.iter_.open_container(DBUS_TYPE_ARRAY, signature, sub.iter_); | 183 static const constexpr auto sig = 184 element_signature<std::vector<std::pair<Key, Value>>>::code; 185 static_assert(std::tuple_size<decltype(sig)>::value > 2, 186 "Signature size must be greater than 2 characters long"); 187 // Skip over the array part "a" of the signature to get the element signature. 188 // Open container expects JUST the portion after the "a" 189 p.iter_.open_container(sig[0], &sig[1], sub.iter_); |
184 for (auto& element : v) { 185 sub << element; 186 } 187 188 p.iter_.close_container(sub.iter_); 189 return p; 190} 191 192template <typename Element> 193message::packer& operator<<(message::packer& p, const std::vector<Element>& v) { 194 message::packer sub; | 190 for (auto& element : v) { 191 sub << element; 192 } 193 194 p.iter_.close_container(sub.iter_); 195 return p; 196} 197 198template <typename Element> 199message::packer& operator<<(message::packer& p, const std::vector<Element>& v) { 200 message::packer sub; |
195 char signature[] = {element<Element>::code, 0}; 196 p.iter_.open_container(element<std::vector<Element>>::code, signature, 197 sub.iter_); | 201 static const constexpr auto signature = 202 element_signature<std::vector<Element>>::code; 203 static_assert(std::tuple_size<decltype(signature)>::value > 2, 204 "Signature size must be greater than 2 characters long"); 205 p.iter_.open_container(signature[0], &signature[1], sub.iter_); |
198 for (auto& element : v) { 199 sub << element; 200 } 201 202 p.iter_.close_container(sub.iter_); 203 return p; 204} 205 --- 15 unchanged lines hidden (view full) --- 221 222inline message::packer& operator<<(message::packer& p, const string& e) { 223 const char* c = e.c_str(); 224 return p << c; 225} 226 227inline message::packer& operator<<(message::packer& p, const dbus_variant& v) { 228 // Get the dbus typecode of the variant being packed | 206 for (auto& element : v) { 207 sub << element; 208 } 209 210 p.iter_.close_container(sub.iter_); 211 return p; 212} 213 --- 15 unchanged lines hidden (view full) --- 229 230inline message::packer& operator<<(message::packer& p, const string& e) { 231 const char* c = e.c_str(); 232 return p << c; 233} 234 235inline message::packer& operator<<(message::packer& p, const dbus_variant& v) { 236 // Get the dbus typecode of the variant being packed |
229 char type = boost::apply_visitor( 230 [&](auto val) { return element<decltype(val)>::code; }, v); 231 char signature[] = {type, 0}; | 237 const char* type = boost::apply_visitor( 238 [&](auto val) { 239 static const constexpr auto sig = 240 element_signature<decltype(val)>::code; 241 static_assert(std::tuple_size<decltype(sig)>::value == 2, 242 "Element signature for dbus_variant too long. Expected " 243 "length of 1"); 244 return &sig[0]; 245 }, 246 v); |
232 233 message::packer sub; | 247 248 message::packer sub; |
234 p.iter_.open_container(element<dbus_variant>::code, signature, sub.iter_); | 249 p.iter_.open_container(element<dbus_variant>::code, type, sub.iter_); |
235 boost::apply_visitor([&](auto val) { sub << val; }, v); 236 p.iter_.close_container(sub.iter_); 237 238 return p; 239} 240 241template <typename Element> 242message::unpacker operator>>(message m, Element& e) { --- 80 unchanged lines hidden --- | 250 boost::apply_visitor([&](auto val) { sub << val; }, v); 251 p.iter_.close_container(sub.iter_); 252 253 return p; 254} 255 256template <typename Element> 257message::unpacker operator>>(message m, Element& e) { --- 80 unchanged lines hidden --- |