CppWAMP
C++11 client library for the WAMP protocol
unorderedset.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_UNORDEREDSET_HPP
8 #define CPPWAMP_TYPES_UNORDEREDSET_HPP
9 
10 //------------------------------------------------------------------------------
14 //------------------------------------------------------------------------------
15 
16 #include <unordered_set>
17 #include "../api.hpp"
18 #include "../error.hpp"
19 #include "../variant.hpp"
20 
21 namespace wamp
22 {
23 
24 //------------------------------------------------------------------------------
27 //------------------------------------------------------------------------------
28 template <typename T>
29 CPPWAMP_API void convert(FromVariantConverter& conv, std::unordered_set<T>& set)
30 {
31  const auto& variant = conv.variant();
32  if (!variant.is<Array>())
33  {
34  throw error::Conversion("Attempting to convert non-array variant "
35  "to std::unordered_set");
36  }
37 
38  std::unordered_set<T> newSet;
39  const auto& array = variant.as<Array>();
40  for (Array::size_type i=0; i<array.size(); ++i)
41  {
42  try
43  {
44  newSet.emplace(array[i].to<T>());
45  }
46  catch (const error::Conversion& e)
47  {
48  std::string msg = e.what();
49  msg += " (for element #" + std::to_string(i) + ")";
50  throw error::Conversion(msg);
51  }
52  }
53  set = std::move(newSet);
54 }
55 
56 //------------------------------------------------------------------------------
59 //------------------------------------------------------------------------------
60 template <typename T>
61 CPPWAMP_API void convert(ToVariantConverter& conv, std::unordered_set<T>& set)
62 {
63  Array array;
64  for (const auto& elem: set)
65  {
66  array.emplace_back(Variant::from(elem));
67  }
68  conv.variant() = std::move(array);
69 }
70 
71 } // namespace wamp
72 
73 #endif // CPPWAMP_TYPES_UNORDEREDSET_HPP
wamp::FromVariantConverter::variant
const Variant & variant() const
Returns a constant reference to the wrapped variant.
Definition: variant.hpp:1384
wamp::TypeId::array
@ array
For Variant::Array.
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::Array
std::vector< Variant > Array
Variant bound type for arrays of variants.
Definition: variantdefs.hpp:51
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