Index: base/json/json_value_converter.h |
diff --git a/base/json/json_value_converter.h b/base/json/json_value_converter.h |
index 187c4c44db79dd81f8cfb9f2419a09412a1e316b..68ebfa23de65d359f4b411aa64a710f16878da2f 100644 |
--- a/base/json/json_value_converter.h |
+++ b/base/json/json_value_converter.h |
@@ -14,7 +14,7 @@ |
#include "base/base_export.h" |
#include "base/logging.h" |
#include "base/macros.h" |
-#include "base/memory/scoped_vector.h" |
+#include "base/memory/ptr_util.h" |
#include "base/strings/string16.h" |
#include "base/strings/string_piece.h" |
#include "base/values.h" |
@@ -65,9 +65,9 @@ |
// } |
// }; |
// |
-// For repeated field, we just assume ScopedVector for its container |
-// and you can put RegisterRepeatedInt or some other types. Use |
-// RegisterRepeatedMessage for nested repeated fields. |
+// For repeated field, we just assume std::vector<std::unique_ptr<ElementType>> |
+// for its container and you can put RegisterRepeatedInt or some other types. |
+// Use RegisterRepeatedMessage for nested repeated fields. |
// |
// Sometimes JSON format uses string representations for other types such |
// like enum, timestamp, or URL. You can use RegisterCustomField method |
@@ -247,12 +247,13 @@ class NestedValueConverter : public ValueConverter<NestedType> { |
}; |
template <typename Element> |
-class RepeatedValueConverter : public ValueConverter<ScopedVector<Element> > { |
+class RepeatedValueConverter |
+ : public ValueConverter<std::vector<std::unique_ptr<Element>>> { |
public: |
RepeatedValueConverter() {} |
bool Convert(const base::Value& value, |
- ScopedVector<Element>* field) const override { |
+ std::vector<std::unique_ptr<Element>>* field) const override { |
const base::ListValue* list = NULL; |
if (!value.GetAsList(&list)) { |
// The field is not a list. |
@@ -267,7 +268,7 @@ class RepeatedValueConverter : public ValueConverter<ScopedVector<Element> > { |
std::unique_ptr<Element> e(new Element); |
if (basic_converter_.Convert(*element, e.get())) { |
- field->push_back(e.release()); |
+ field->push_back(std::move(e)); |
} else { |
DVLOG(1) << "failure at " << i << "-th element"; |
return false; |
@@ -283,12 +284,12 @@ class RepeatedValueConverter : public ValueConverter<ScopedVector<Element> > { |
template <typename NestedType> |
class RepeatedMessageConverter |
- : public ValueConverter<ScopedVector<NestedType> > { |
+ : public ValueConverter<std::vector<std::unique_ptr<NestedType>>> { |
public: |
RepeatedMessageConverter() {} |
bool Convert(const base::Value& value, |
- ScopedVector<NestedType>* field) const override { |
+ std::vector<std::unique_ptr<NestedType>>* field) const override { |
const base::ListValue* list = NULL; |
if (!value.GetAsList(&list)) |
return false; |
@@ -301,7 +302,7 @@ class RepeatedMessageConverter |
std::unique_ptr<NestedType> nested(new NestedType); |
if (converter_.Convert(*element, nested.get())) { |
- field->push_back(nested.release()); |
+ field->push_back(std::move(nested)); |
} else { |
DVLOG(1) << "failure at " << i << "-th element"; |
return false; |
@@ -317,7 +318,7 @@ class RepeatedMessageConverter |
template <typename NestedType> |
class RepeatedCustomValueConverter |
- : public ValueConverter<ScopedVector<NestedType> > { |
+ : public ValueConverter<std::vector<std::unique_ptr<NestedType>>> { |
public: |
typedef bool(*ConvertFunc)(const base::Value* value, NestedType* field); |
@@ -325,7 +326,7 @@ class RepeatedCustomValueConverter |
: convert_func_(convert_func) {} |
bool Convert(const base::Value& value, |
- ScopedVector<NestedType>* field) const override { |
+ std::vector<std::unique_ptr<NestedType>>* field) const override { |
const base::ListValue* list = NULL; |
if (!value.GetAsList(&list)) |
return false; |
@@ -338,7 +339,7 @@ class RepeatedCustomValueConverter |
std::unique_ptr<NestedType> nested(new NestedType); |
if ((*convert_func_)(element, nested.get())) { |
- field->push_back(nested.release()); |
+ field->push_back(std::move(nested)); |
} else { |
DVLOG(1) << "failure at " << i << "-th element"; |
return false; |
@@ -364,41 +365,42 @@ class JSONValueConverter { |
void RegisterIntField(const std::string& field_name, |
int StructType::* field) { |
- fields_.push_back(new internal::FieldConverter<StructType, int>( |
+ fields_.push_back(MakeUnique<internal::FieldConverter<StructType, int>>( |
field_name, field, new internal::BasicValueConverter<int>)); |
} |
void RegisterStringField(const std::string& field_name, |
std::string StructType::* field) { |
- fields_.push_back(new internal::FieldConverter<StructType, std::string>( |
- field_name, field, new internal::BasicValueConverter<std::string>)); |
+ fields_.push_back( |
+ MakeUnique<internal::FieldConverter<StructType, std::string>>( |
+ field_name, field, new internal::BasicValueConverter<std::string>)); |
} |
void RegisterStringField(const std::string& field_name, |
string16 StructType::* field) { |
- fields_.push_back(new internal::FieldConverter<StructType, string16>( |
- field_name, field, new internal::BasicValueConverter<string16>)); |
+ fields_.push_back( |
+ MakeUnique<internal::FieldConverter<StructType, string16>>( |
+ field_name, field, new internal::BasicValueConverter<string16>)); |
} |
void RegisterBoolField(const std::string& field_name, |
bool StructType::* field) { |
- fields_.push_back(new internal::FieldConverter<StructType, bool>( |
+ fields_.push_back(MakeUnique<internal::FieldConverter<StructType, bool>>( |
field_name, field, new internal::BasicValueConverter<bool>)); |
} |
void RegisterDoubleField(const std::string& field_name, |
double StructType::* field) { |
- fields_.push_back(new internal::FieldConverter<StructType, double>( |
+ fields_.push_back(MakeUnique<internal::FieldConverter<StructType, double>>( |
field_name, field, new internal::BasicValueConverter<double>)); |
} |
template <class NestedType> |
void RegisterNestedField( |
const std::string& field_name, NestedType StructType::* field) { |
- fields_.push_back(new internal::FieldConverter<StructType, NestedType>( |
- field_name, |
- field, |
- new internal::NestedValueConverter<NestedType>)); |
+ fields_.push_back( |
+ MakeUnique<internal::FieldConverter<StructType, NestedType>>( |
+ field_name, field, new internal::NestedValueConverter<NestedType>)); |
} |
template <typename FieldType> |
@@ -406,10 +408,10 @@ class JSONValueConverter { |
const std::string& field_name, |
FieldType StructType::* field, |
bool (*convert_func)(const StringPiece&, FieldType*)) { |
- fields_.push_back(new internal::FieldConverter<StructType, FieldType>( |
- field_name, |
- field, |
- new internal::CustomFieldConverter<FieldType>(convert_func))); |
+ fields_.push_back( |
+ MakeUnique<internal::FieldConverter<StructType, FieldType>>( |
+ field_name, field, |
+ new internal::CustomFieldConverter<FieldType>(convert_func))); |
} |
template <typename FieldType> |
@@ -417,71 +419,76 @@ class JSONValueConverter { |
const std::string& field_name, |
FieldType StructType::* field, |
bool (*convert_func)(const base::Value*, FieldType*)) { |
- fields_.push_back(new internal::FieldConverter<StructType, FieldType>( |
- field_name, |
- field, |
- new internal::ValueFieldConverter<FieldType>(convert_func))); |
+ fields_.push_back( |
+ MakeUnique<internal::FieldConverter<StructType, FieldType>>( |
+ field_name, field, |
+ new internal::ValueFieldConverter<FieldType>(convert_func))); |
} |
- void RegisterRepeatedInt(const std::string& field_name, |
- ScopedVector<int> StructType::* field) { |
+ void RegisterRepeatedInt( |
+ const std::string& field_name, |
+ std::vector<std::unique_ptr<int>> StructType::*field) { |
fields_.push_back( |
- new internal::FieldConverter<StructType, ScopedVector<int> >( |
+ MakeUnique<internal::FieldConverter<StructType, |
+ std::vector<std::unique_ptr<int>>>>( |
field_name, field, new internal::RepeatedValueConverter<int>)); |
} |
- void RegisterRepeatedString(const std::string& field_name, |
- ScopedVector<std::string> StructType::* field) { |
+ void RegisterRepeatedString( |
+ const std::string& field_name, |
+ std::vector<std::unique_ptr<std::string>> StructType::*field) { |
fields_.push_back( |
- new internal::FieldConverter<StructType, ScopedVector<std::string> >( |
- field_name, |
- field, |
+ MakeUnique<internal::FieldConverter< |
+ StructType, std::vector<std::unique_ptr<std::string>>>>( |
+ field_name, field, |
new internal::RepeatedValueConverter<std::string>)); |
} |
- void RegisterRepeatedString(const std::string& field_name, |
- ScopedVector<string16> StructType::* field) { |
- fields_.push_back( |
- new internal::FieldConverter<StructType, ScopedVector<string16> >( |
- field_name, |
- field, |
- new internal::RepeatedValueConverter<string16>)); |
+ void RegisterRepeatedString( |
+ const std::string& field_name, |
+ std::vector<std::unique_ptr<string16>> StructType::*field) { |
+ fields_.push_back(MakeUnique<internal::FieldConverter< |
+ StructType, std::vector<std::unique_ptr<string16>>>>( |
+ field_name, field, new internal::RepeatedValueConverter<string16>)); |
} |
- void RegisterRepeatedDouble(const std::string& field_name, |
- ScopedVector<double> StructType::* field) { |
- fields_.push_back( |
- new internal::FieldConverter<StructType, ScopedVector<double> >( |
- field_name, field, new internal::RepeatedValueConverter<double>)); |
+ void RegisterRepeatedDouble( |
+ const std::string& field_name, |
+ std::vector<std::unique_ptr<double>> StructType::*field) { |
+ fields_.push_back(MakeUnique<internal::FieldConverter< |
+ StructType, std::vector<std::unique_ptr<double>>>>( |
+ field_name, field, new internal::RepeatedValueConverter<double>)); |
} |
- void RegisterRepeatedBool(const std::string& field_name, |
- ScopedVector<bool> StructType::* field) { |
- fields_.push_back( |
- new internal::FieldConverter<StructType, ScopedVector<bool> >( |
- field_name, field, new internal::RepeatedValueConverter<bool>)); |
+ void RegisterRepeatedBool( |
+ const std::string& field_name, |
+ std::vector<std::unique_ptr<bool>> StructType::*field) { |
+ fields_.push_back(MakeUnique<internal::FieldConverter< |
+ StructType, std::vector<std::unique_ptr<bool>>>>( |
+ field_name, field, new internal::RepeatedValueConverter<bool>)); |
} |
template <class NestedType> |
void RegisterRepeatedCustomValue( |
const std::string& field_name, |
- ScopedVector<NestedType> StructType::* field, |
+ std::vector<std::unique_ptr<NestedType>> StructType::*field, |
bool (*convert_func)(const base::Value*, NestedType*)) { |
fields_.push_back( |
- new internal::FieldConverter<StructType, ScopedVector<NestedType> >( |
- field_name, |
- field, |
+ MakeUnique<internal::FieldConverter< |
+ StructType, std::vector<std::unique_ptr<NestedType>>>>( |
+ field_name, field, |
new internal::RepeatedCustomValueConverter<NestedType>( |
convert_func))); |
} |
template <class NestedType> |
- void RegisterRepeatedMessage(const std::string& field_name, |
- ScopedVector<NestedType> StructType::* field) { |
+ void RegisterRepeatedMessage( |
+ const std::string& field_name, |
+ std::vector<std::unique_ptr<NestedType>> StructType::*field) { |
fields_.push_back( |
- new internal::FieldConverter<StructType, ScopedVector<NestedType> >( |
- field_name, |
- field, |
+ MakeUnique<internal::FieldConverter< |
+ StructType, std::vector<std::unique_ptr<NestedType>>>>( |
+ field_name, field, |
new internal::RepeatedMessageConverter<NestedType>)); |
} |
@@ -492,7 +499,7 @@ class JSONValueConverter { |
for (size_t i = 0; i < fields_.size(); ++i) { |
const internal::FieldConverterBase<StructType>* field_converter = |
- fields_[i]; |
+ fields_[i].get(); |
const base::Value* field = NULL; |
if (dictionary_value->Get(field_converter->field_path(), &field)) { |
if (!field_converter->ConvertField(*field, output)) { |
@@ -505,7 +512,8 @@ class JSONValueConverter { |
} |
private: |
- ScopedVector<internal::FieldConverterBase<StructType> > fields_; |
+ std::vector<std::unique_ptr<internal::FieldConverterBase<StructType>>> |
+ fields_; |
DISALLOW_COPY_AND_ASSIGN(JSONValueConverter); |
}; |