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

Side by Side Diff: base/values.cc

Issue 2815303002: Improve performance of base::ListValue::Append* (Closed)
Patch Set: Rebase Created 3 years, 8 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 | « no previous file | no next file » | 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 #include "base/values.h" 5 #include "base/values.h"
6 6
7 #include <string.h> 7 #include <string.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <cmath> 10 #include <cmath>
(...skipping 1058 matching lines...) Expand 10 before | Expand all | Expand 10 after
1069 } 1069 }
1070 1070
1071 bool ListValue::Set(size_t index, Value* in_value) { 1071 bool ListValue::Set(size_t index, Value* in_value) {
1072 return Set(index, WrapUnique(in_value)); 1072 return Set(index, WrapUnique(in_value));
1073 } 1073 }
1074 1074
1075 bool ListValue::Set(size_t index, std::unique_ptr<Value> in_value) { 1075 bool ListValue::Set(size_t index, std::unique_ptr<Value> in_value) {
1076 if (!in_value) 1076 if (!in_value)
1077 return false; 1077 return false;
1078 1078
1079 if (index >= list_->size()) { 1079 if (index >= list_->size())
1080 // Pad out any intermediate indexes with null settings 1080 list_->resize(index + 1);
1081 while (index > list_->size()) 1081
1082 Append(MakeUnique<Value>()); 1082 (*list_)[index] = std::move(*in_value);
1083 Append(std::move(in_value));
1084 } else {
1085 (*list_)[index] = std::move(*in_value);
1086 }
1087 return true; 1083 return true;
1088 } 1084 }
1089 1085
1090 bool ListValue::Get(size_t index, const Value** out_value) const { 1086 bool ListValue::Get(size_t index, const Value** out_value) const {
1091 if (index >= list_->size()) 1087 if (index >= list_->size())
1092 return false; 1088 return false;
1093 1089
1094 if (out_value) 1090 if (out_value)
1095 *out_value = &(*list_)[index]; 1091 *out_value = &(*list_)[index];
1096 1092
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
1227 *out_value = MakeUnique<Value>(std::move(*iter)); 1223 *out_value = MakeUnique<Value>(std::move(*iter));
1228 1224
1229 return list_->erase(iter); 1225 return list_->erase(iter);
1230 } 1226 }
1231 1227
1232 void ListValue::Append(std::unique_ptr<Value> in_value) { 1228 void ListValue::Append(std::unique_ptr<Value> in_value) {
1233 list_->push_back(std::move(*in_value)); 1229 list_->push_back(std::move(*in_value));
1234 } 1230 }
1235 1231
1236 void ListValue::AppendBoolean(bool in_value) { 1232 void ListValue::AppendBoolean(bool in_value) {
1237 Append(MakeUnique<Value>(in_value)); 1233 list_->emplace_back(in_value);
1238 } 1234 }
1239 1235
1240 void ListValue::AppendInteger(int in_value) { 1236 void ListValue::AppendInteger(int in_value) {
1241 Append(MakeUnique<Value>(in_value)); 1237 list_->emplace_back(in_value);
1242 } 1238 }
1243 1239
1244 void ListValue::AppendDouble(double in_value) { 1240 void ListValue::AppendDouble(double in_value) {
1245 Append(MakeUnique<Value>(in_value)); 1241 list_->emplace_back(in_value);
1246 } 1242 }
1247 1243
1248 void ListValue::AppendString(StringPiece in_value) { 1244 void ListValue::AppendString(StringPiece in_value) {
1249 Append(MakeUnique<Value>(in_value)); 1245 list_->emplace_back(in_value);
1250 } 1246 }
1251 1247
1252 void ListValue::AppendString(const string16& in_value) { 1248 void ListValue::AppendString(const string16& in_value) {
1253 Append(MakeUnique<Value>(in_value)); 1249 list_->emplace_back(in_value);
1254 } 1250 }
1255 1251
1256 void ListValue::AppendStrings(const std::vector<std::string>& in_values) { 1252 void ListValue::AppendStrings(const std::vector<std::string>& in_values) {
1257 for (std::vector<std::string>::const_iterator it = in_values.begin(); 1253 list_->reserve(list_->size() + in_values.size());
1258 it != in_values.end(); ++it) { 1254 for (const auto& in_value : in_values)
1259 AppendString(*it); 1255 list_->emplace_back(in_value);
1260 }
1261 } 1256 }
1262 1257
1263 void ListValue::AppendStrings(const std::vector<string16>& in_values) { 1258 void ListValue::AppendStrings(const std::vector<string16>& in_values) {
1264 for (std::vector<string16>::const_iterator it = in_values.begin(); 1259 list_->reserve(list_->size() + in_values.size());
1265 it != in_values.end(); ++it) { 1260 for (const auto& in_value : in_values)
1266 AppendString(*it); 1261 list_->emplace_back(in_value);
1267 }
1268 } 1262 }
1269 1263
1270 bool ListValue::AppendIfNotPresent(std::unique_ptr<Value> in_value) { 1264 bool ListValue::AppendIfNotPresent(std::unique_ptr<Value> in_value) {
1271 DCHECK(in_value); 1265 DCHECK(in_value);
1272 if (std::find(list_->begin(), list_->end(), *in_value) != list_->end()) 1266 if (std::find(list_->begin(), list_->end(), *in_value) != list_->end())
1273 return false; 1267 return false;
1274 1268
1275 list_->push_back(std::move(*in_value)); 1269 list_->push_back(std::move(*in_value));
1276 return true; 1270 return true;
1277 } 1271 }
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
1315 } 1309 }
1316 1310
1317 std::ostream& operator<<(std::ostream& out, const Value::Type& type) { 1311 std::ostream& operator<<(std::ostream& out, const Value::Type& type) {
1318 if (static_cast<int>(type) < 0 || 1312 if (static_cast<int>(type) < 0 ||
1319 static_cast<size_t>(type) >= arraysize(kTypeNames)) 1313 static_cast<size_t>(type) >= arraysize(kTypeNames))
1320 return out << "Invalid Type (index = " << static_cast<int>(type) << ")"; 1314 return out << "Invalid Type (index = " << static_cast<int>(type) << ")";
1321 return out << Value::GetTypeName(type); 1315 return out << Value::GetTypeName(type);
1322 } 1316 }
1323 1317
1324 } // namespace base 1318 } // namespace base
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698