Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/coding
diff options
context:
space:
mode:
authorArsentiy Milchakov <milcars@mapswithme.com>2018-10-31 15:09:05 +0300
committerRoman Kuznetsov <r.kuznetsow@gmail.com>2018-10-31 16:01:09 +0300
commitd5166aed5779e9ffbd751ba3837a65a391512483 (patch)
tree2cb50d1993fe4af4ec4cd9d55eb2c2adfdc5922a /coding
parentb415753017fb208eea396e1b2c274fd385d0c147 (diff)
Notification manager review fixes + eye unsubscribe fix
Diffstat (limited to 'coding')
-rw-r--r--coding/serdes_json.hpp32
1 files changed, 26 insertions, 6 deletions
diff --git a/coding/serdes_json.hpp b/coding/serdes_json.hpp
index 4541bfb2ee..e6af971567 100644
--- a/coding/serdes_json.hpp
+++ b/coding/serdes_json.hpp
@@ -13,6 +13,7 @@
#include <cstdint>
#include <cstdlib>
#include <cstring>
+#include <deque>
#include <memory>
#include <type_traits>
#include <unordered_set>
@@ -34,10 +35,22 @@ auto is_iterable_checker(int) -> decltype(
template <typename T>
std::false_type is_iterable_checker(...);
+
+template <typename T>
+auto is_dynamic_sequence_checker(int) -> decltype(
+ std::declval<T &>().resize(0),
+ std::declval<T &>()[0],
+ std::true_type {});
+
+template <typename T>
+std::false_type is_dynamic_sequence_checker(...);
} // namespace impl
template <typename T>
using is_iterable = decltype(impl::is_iterable_checker<T>(0));
+
+template <typename T>
+using is_dynamic_sequence = decltype(impl::is_dynamic_sequence_checker<T>(0));
} // namespace traits
template <typename T>
@@ -52,6 +65,13 @@ using EnableIfEnum = std::enable_if_t<std::is_enum<T>::value>;
template <typename T>
using EnableIfNotEnum = std::enable_if_t<!std::is_enum<T>::value>;
+template <typename T>
+using EnableIfVectorOrDeque = std::enable_if_t<traits::is_dynamic_sequence<T>::value &&
+ !std::is_same<std::string, T>::value>;
+
+template <typename T>
+using EnableIfNotVectorOrDeque = std::enable_if_t<!traits::is_dynamic_sequence<T>::value>;
+
template<typename Sink>
class SerializerJson
{
@@ -218,20 +238,20 @@ public:
void operator()(double & d, char const * name = nullptr) { FromJsonObjectOrValue(d, name); }
void operator()(std::string & s, char const * name = nullptr) { FromJsonObjectOrValue(s, name); }
- template <typename T>
- void operator()(std::vector<T> & vs, char const * name = nullptr)
+ template <typename T, EnableIfVectorOrDeque<T> * = nullptr>
+ void operator()(T & dest, char const * name = nullptr)
{
json_t * outerContext = SaveContext(name);
if (!json_is_array(m_json))
MYTHROW(base::Json::Exception, ("The field", name, "must contain a json array."));
- vs.resize(json_array_size(m_json));
- for (size_t index = 0; index < vs.size(); ++index)
+ dest.resize(json_array_size(m_json));
+ for (size_t index = 0; index < dest.size(); ++index)
{
json_t * context = SaveContext();
m_json = json_array_get(context, index);
- (*this)(vs[index]);
+ (*this)(dest[index]);
RestoreContext(context);
}
@@ -287,7 +307,7 @@ public:
RestoreContext(outerContext);
}
- template <typename R, EnableIfNotEnum<R> * = nullptr>
+ template <typename R, EnableIfNotEnum<R> * = nullptr, EnableIfNotVectorOrDeque<R> * = nullptr>
void operator()(R & r, char const * name = nullptr)
{
json_t * context = SaveContext(name);