diff options
author | Arsentiy Milchakov <milcars@mapswithme.com> | 2018-10-31 15:09:05 +0300 |
---|---|---|
committer | Roman Kuznetsov <r.kuznetsow@gmail.com> | 2018-10-31 16:01:09 +0300 |
commit | d5166aed5779e9ffbd751ba3837a65a391512483 (patch) | |
tree | 2cb50d1993fe4af4ec4cd9d55eb2c2adfdc5922a /coding | |
parent | b415753017fb208eea396e1b2c274fd385d0c147 (diff) |
Notification manager review fixes + eye unsubscribe fix
Diffstat (limited to 'coding')
-rw-r--r-- | coding/serdes_json.hpp | 32 |
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); |