| Index: ipc/ipc_message_utils.h
|
| diff --git a/ipc/ipc_message_utils.h b/ipc/ipc_message_utils.h
|
| index 2d51c984aa0c0fdf005b355c989bfb6774b72bf0..5f03606811f18153886b4327a47c2233c12db8d4 100644
|
| --- a/ipc/ipc_message_utils.h
|
| +++ b/ipc/ipc_message_utils.h
|
| @@ -17,10 +17,12 @@
|
| #include <tuple>
|
| #include <vector>
|
|
|
| +#include "base/containers/flat_map.h"
|
| #include "base/containers/small_map.h"
|
| #include "base/containers/stack_container.h"
|
| #include "base/files/file.h"
|
| #include "base/format_macros.h"
|
| +#include "base/numerics/safe_conversions.h"
|
| #include "base/optional.h"
|
| #include "base/strings/string16.h"
|
| #include "base/strings/string_util.h"
|
| @@ -899,10 +901,10 @@ template <typename NormalMap,
|
| int kArraySize,
|
| typename EqualKey,
|
| typename MapInit>
|
| -struct ParamTraits<base::SmallMap<NormalMap, kArraySize, EqualKey, MapInit> > {
|
| - typedef base::SmallMap<NormalMap, kArraySize, EqualKey, MapInit> param_type;
|
| - typedef typename param_type::key_type K;
|
| - typedef typename param_type::data_type V;
|
| +struct ParamTraits<base::small_map<NormalMap, kArraySize, EqualKey, MapInit>> {
|
| + using param_type = base::small_map<NormalMap, kArraySize, EqualKey, MapInit>;
|
| + using K = typename param_type::key_type;
|
| + using V = typename param_type::data_type;
|
| static void GetSize(base::PickleSizer* sizer, const param_type& p) {
|
| GetParamSize(sizer, static_cast<int>(p.size()));
|
| typename param_type::const_iterator iter;
|
| @@ -936,7 +938,53 @@ struct ParamTraits<base::SmallMap<NormalMap, kArraySize, EqualKey, MapInit> > {
|
| return true;
|
| }
|
| static void Log(const param_type& p, std::string* l) {
|
| - l->append("<base::SmallMap>");
|
| + l->append("<base::small_map>");
|
| + }
|
| +};
|
| +
|
| +template <class Key, class Mapped, class Compare>
|
| +struct ParamTraits<base::flat_map<Key, Mapped, Compare>> {
|
| + using param_type = base::flat_map<Key, Mapped, Compare>;
|
| + static void GetSize(base::PickleSizer* sizer, const param_type& p) {
|
| + DCHECK(base::IsValueInRangeForNumericType<int>(p.size()));
|
| + GetParamSize(sizer, static_cast<int>(p.size()));
|
| + for (const auto& iter : p) {
|
| + GetParamSize(sizer, iter.first);
|
| + GetParamSize(sizer, iter.second);
|
| + }
|
| + }
|
| + static void Write(base::Pickle* m, const param_type& p) {
|
| + DCHECK(base::IsValueInRangeForNumericType<int>(p.size()));
|
| + WriteParam(m, static_cast<int>(p.size()));
|
| + for (const auto& iter : p) {
|
| + WriteParam(m, iter.first);
|
| + WriteParam(m, iter.second);
|
| + }
|
| + }
|
| + static bool Read(const base::Pickle* m,
|
| + base::PickleIterator* iter,
|
| + param_type* r) {
|
| + int size;
|
| + if (!iter->ReadLength(&size))
|
| + return false;
|
| +
|
| + // Construct by creating in a vector and moving into the flat_map. Properly
|
| + // serialized flat_maps will be in-order so this will be O(n). Incorrectly
|
| + // serialized ones will still be handled properly.
|
| + std::vector<typename param_type::value_type> vect;
|
| + vect.resize(size);
|
| + for (int i = 0; i < size; ++i) {
|
| + if (!ReadParam(m, iter, &vect[i].first))
|
| + return false;
|
| + if (!ReadParam(m, iter, &vect[i].second))
|
| + return false;
|
| + }
|
| +
|
| + *r = param_type(std::move(vect), base::KEEP_FIRST_OF_DUPES);
|
| + return true;
|
| + }
|
| + static void Log(const param_type& p, std::string* l) {
|
| + l->append("<base::flat_map>");
|
| }
|
| };
|
|
|
|
|