CppWAMP
C++11 client library for the WAMP protocol
unorderedmap.hpp
Go to the documentation of this file.
1 /*------------------------------------------------------------------------------
2  Copyright Butterfly Energy Systems 2014-2015, 2022.
3  Distributed under the Boost Software License, Version 1.0.
4  http://www.boost.org/LICENSE_1_0.txt
5 ------------------------------------------------------------------------------*/
6 
7 #ifndef CPPWAMP_TYPES_UNORDEREDMAP_HPP
8 #define CPPWAMP_TYPES_UNORDEREDMAP_HPP
9 
10 //------------------------------------------------------------------------------
14 //------------------------------------------------------------------------------
15 
16 #include <unordered_map>
17 #include <utility>
18 #include "../api.hpp"
19 #include "../error.hpp"
20 #include "../variant.hpp"
21 
22 namespace wamp
23 {
24 
25 //------------------------------------------------------------------------------
28 //------------------------------------------------------------------------------
29 template <typename T>
30 void CPPWAMP_API convert(FromVariantConverter& conv,
31  std::unordered_map<String, T>& map)
32 {
33  const auto& variant = conv.variant();
34  if (!variant.is<Object>())
35  {
36  throw error::Conversion("Attempting to convert non-object variant "
37  "to std::unordered_map");
38  }
39 
40  std::unordered_map<String, T> newMap;
41  for (const auto& kv: variant.as<Object>())
42  {
43  try
44  {
45  newMap.emplace(kv.first, kv.second.to<T>());
46  }
47  catch (const error::Conversion& e)
48  {
49  std::string msg = e.what();
50  msg += " (for variant member \"" + kv.first + "\")";
51  throw error::Conversion(msg);
52  }
53  }
54  map = std::move(newMap);
55 }
56 
57 //------------------------------------------------------------------------------
60 //------------------------------------------------------------------------------
61 template <typename T>
62 void CPPWAMP_API convert(ToVariantConverter& conv,
63  std::unordered_map<String, T>& map)
64 {
65  Object obj;
66  for (const auto& kv: map)
67  {
68  obj.emplace(kv.first, Variant::from(kv.second));
69  }
70  conv.variant() = std::move(obj);
71 }
72 
73 
74 }
75 
76 #endif // CPPWAMP_TYPES_UNORDEREDMAP_HPP
wamp::FromVariantConverter::variant
const Variant & variant() const
Returns a constant reference to the wrapped variant.
Definition: variant.hpp:1384
wamp::Object
std::map< String, Variant > Object
Variant bound type for maps of variants.
Definition: variantdefs.hpp:52
wamp::ToVariantConverter::variant
Variant & variant()
Returns a reference to the wrapped variant.
Definition: variant.hpp:1208
wamp
Definition: anyhandler.hpp:36
wamp::ToVariantConverter
Wrapper around a destination Variant, used for conversions.
Definition: variant.hpp:604
wamp::FromVariantConverter
Wrapper around a source Variant, used for conversions.
Definition: variant.hpp:650
wamp::convert
void convert(TConverter &c, TValue &val)
General function for converting custom types to/from Variant.
Definition: variant.hpp:709
wamp::error::Conversion
Exception type thrown when converting a Variant to an invalid type.
Definition: error.hpp:106
wamp::Variant::from
static Variant from(TValue &&value)
Constructs a variant from a custom type.
Definition: variant.hpp:744