Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(56)

Side by Side Diff: base/json/json_value_converter.h

Issue 9289040: Remove reinterpret_cast on JSONValueConverter (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: omit base_export Created 8 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « base/base.gypi ('k') | base/json/json_value_converter.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef BASE_JSON_JSON_VALUE_CONVERTER_H_ 5 #ifndef BASE_JSON_JSON_VALUE_CONVERTER_H_
6 #define BASE_JSON_JSON_VALUE_CONVERTER_H_ 6 #define BASE_JSON_JSON_VALUE_CONVERTER_H_
7 #pragma once 7 #pragma once
8 8
9 #include <string> 9 #include <string>
10 #include <vector> 10 #include <vector>
11 11
12 #include "base/base_export.h"
13 #include "base/basictypes.h" 12 #include "base/basictypes.h"
14 #include "base/logging.h" 13 #include "base/logging.h"
15 #include "base/memory/scoped_ptr.h" 14 #include "base/memory/scoped_ptr.h"
16 #include "base/memory/scoped_vector.h" 15 #include "base/memory/scoped_vector.h"
17 #include "base/stl_util.h" 16 #include "base/stl_util.h"
18 #include "base/string16.h" 17 #include "base/string16.h"
19 #include "base/string_piece.h" 18 #include "base/string_piece.h"
20 #include "base/values.h" 19 #include "base/values.h"
21 20
22 // JSONValueConverter converts a JSON value into a C++ struct in a 21 // JSONValueConverter converts a JSON value into a C++ struct in a
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
85 // } 84 // }
86 // }; 85 // };
87 86
88 namespace base { 87 namespace base {
89 88
90 template <typename StructType> 89 template <typename StructType>
91 class JSONValueConverter; 90 class JSONValueConverter;
92 91
93 namespace internal { 92 namespace internal {
94 93
94 template<typename StructType>
95 class FieldConverterBase { 95 class FieldConverterBase {
96 public: 96 public:
97 BASE_EXPORT explicit FieldConverterBase(const std::string& path); 97 explicit FieldConverterBase(const std::string& path) : field_path_(path) {}
98 BASE_EXPORT virtual ~FieldConverterBase(); 98 virtual ~FieldConverterBase() {}
99 virtual bool ConvertField(const base::Value& value, void* obj) const = 0; 99 virtual bool ConvertField(const base::Value& value, StructType* obj)
100 const = 0;
100 const std::string& field_path() const { return field_path_; } 101 const std::string& field_path() const { return field_path_; }
101 102
102 private: 103 private:
103 std::string field_path_; 104 std::string field_path_;
104 DISALLOW_COPY_AND_ASSIGN(FieldConverterBase); 105 DISALLOW_COPY_AND_ASSIGN(FieldConverterBase);
105 }; 106 };
106 107
107 template <typename FieldType> 108 template <typename FieldType>
108 class ValueConverter { 109 class ValueConverter {
109 public: 110 public:
110 virtual ~ValueConverter() {} 111 virtual ~ValueConverter() {}
111 virtual bool Convert(const base::Value& value, FieldType* field) const = 0; 112 virtual bool Convert(const base::Value& value, FieldType* field) const = 0;
112 }; 113 };
113 114
114 template <typename StructType, typename FieldType> 115 template <typename StructType, typename FieldType>
115 class FieldConverter : public FieldConverterBase { 116 class FieldConverter : public FieldConverterBase<StructType> {
116 public: 117 public:
117 explicit FieldConverter(const std::string& path, 118 explicit FieldConverter(const std::string& path,
118 FieldType StructType::* field, 119 FieldType StructType::* field,
119 ValueConverter<FieldType>* converter) 120 ValueConverter<FieldType>* converter)
120 : FieldConverterBase(path), 121 : FieldConverterBase<StructType>(path),
121 field_pointer_(field), 122 field_pointer_(field),
122 value_converter_(converter) { 123 value_converter_(converter) {
123 } 124 }
124 125
125 virtual bool ConvertField( 126 virtual bool ConvertField(
126 const base::Value& value, void* obj) const OVERRIDE { 127 const base::Value& value, StructType* dst) const OVERRIDE {
127 StructType* dst = reinterpret_cast<StructType*>(obj);
128 return value_converter_->Convert(value, &(dst->*field_pointer_)); 128 return value_converter_->Convert(value, &(dst->*field_pointer_));
129 } 129 }
130 130
131 private: 131 private:
132 FieldType StructType::* field_pointer_; 132 FieldType StructType::* field_pointer_;
133 scoped_ptr<ValueConverter<FieldType> > value_converter_; 133 scoped_ptr<ValueConverter<FieldType> > value_converter_;
134 DISALLOW_COPY_AND_ASSIGN(FieldConverter); 134 DISALLOW_COPY_AND_ASSIGN(FieldConverter);
135 }; 135 };
136 136
137 template <typename FieldType> 137 template <typename FieldType>
(...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after
416 field, 416 field,
417 new internal::RepeatedMessageConverter<NestedType>)); 417 new internal::RepeatedMessageConverter<NestedType>));
418 } 418 }
419 419
420 bool Convert(const base::Value& value, StructType* output) const { 420 bool Convert(const base::Value& value, StructType* output) const {
421 const DictionaryValue* dictionary_value = NULL; 421 const DictionaryValue* dictionary_value = NULL;
422 if (!value.GetAsDictionary(&dictionary_value)) 422 if (!value.GetAsDictionary(&dictionary_value))
423 return false; 423 return false;
424 424
425 for(size_t i = 0; i < fields_.size(); ++i) { 425 for(size_t i = 0; i < fields_.size(); ++i) {
426 const internal::FieldConverterBase* field_converter = fields_[i]; 426 const internal::FieldConverterBase<StructType>* field_converter =
427 fields_[i];
427 base::Value* field = NULL; 428 base::Value* field = NULL;
428 if (dictionary_value->Get(field_converter->field_path(), &field)) { 429 if (dictionary_value->Get(field_converter->field_path(), &field)) {
429 if (!field_converter->ConvertField(*field, output)) { 430 if (!field_converter->ConvertField(*field, output)) {
430 DVLOG(1) << "failure at field " << field_converter->field_path(); 431 DVLOG(1) << "failure at field " << field_converter->field_path();
431 return false; 432 return false;
432 } 433 }
433 } 434 }
434 } 435 }
435 return true; 436 return true;
436 } 437 }
437 438
438 private: 439 private:
439 ScopedVector<internal::FieldConverterBase> fields_; 440 ScopedVector<internal::FieldConverterBase<StructType> > fields_;
440 441
441 DISALLOW_COPY_AND_ASSIGN(JSONValueConverter); 442 DISALLOW_COPY_AND_ASSIGN(JSONValueConverter);
442 }; 443 };
443 444
444 } // namespace base 445 } // namespace base
445 446
446 #endif // BASE_JSON_JSON_VALUE_CONVERTER_H_ 447 #endif // BASE_JSON_JSON_VALUE_CONVERTER_H_
OLDNEW
« no previous file with comments | « base/base.gypi ('k') | base/json/json_value_converter.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698