| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 MOJO_PUBLIC_CPP_BINDINGS_LIB_ARRAY_INTERNAL_H_ | 5 #ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_ARRAY_INTERNAL_H_ |
| 6 #define MOJO_PUBLIC_CPP_BINDINGS_LIB_ARRAY_INTERNAL_H_ | 6 #define MOJO_PUBLIC_CPP_BINDINGS_LIB_ARRAY_INTERNAL_H_ |
| 7 | 7 |
| 8 #include <new> | 8 #include <new> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| (...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 283 | 283 |
| 284 // UTF-8 encoded | 284 // UTF-8 encoded |
| 285 typedef Array_Data<char> String_Data; | 285 typedef Array_Data<char> String_Data; |
| 286 | 286 |
| 287 template <typename T, bool kIsMoveOnlyType> struct ArrayTraits {}; | 287 template <typename T, bool kIsMoveOnlyType> struct ArrayTraits {}; |
| 288 | 288 |
| 289 template <typename T> struct ArrayTraits<T, false> { | 289 template <typename T> struct ArrayTraits<T, false> { |
| 290 typedef T StorageType; | 290 typedef T StorageType; |
| 291 typedef typename std::vector<T>::reference RefType; | 291 typedef typename std::vector<T>::reference RefType; |
| 292 typedef typename std::vector<T>::const_reference ConstRefType; | 292 typedef typename std::vector<T>::const_reference ConstRefType; |
| 293 typedef ConstRefType ForwardType; |
| 293 static inline void Initialize(std::vector<T>* vec) { | 294 static inline void Initialize(std::vector<T>* vec) { |
| 294 } | 295 } |
| 295 static inline void Finalize(std::vector<T>* vec) { | 296 static inline void Finalize(std::vector<T>* vec) { |
| 296 } | 297 } |
| 297 static inline ConstRefType at(const std::vector<T>* vec, size_t offset) { | 298 static inline ConstRefType at(const std::vector<T>* vec, size_t offset) { |
| 298 return vec->at(offset); | 299 return vec->at(offset); |
| 299 } | 300 } |
| 300 static inline RefType at(std::vector<T>* vec, size_t offset) { | 301 static inline RefType at(std::vector<T>* vec, size_t offset) { |
| 301 return vec->at(offset); | 302 return vec->at(offset); |
| 302 } | 303 } |
| 304 static inline void Resize(std::vector<T>* vec, size_t size) { |
| 305 vec->resize(size); |
| 306 } |
| 307 static inline void PushBack(std::vector<T>* vec, ForwardType value) { |
| 308 vec->push_back(value); |
| 309 } |
| 303 }; | 310 }; |
| 304 | 311 |
| 305 template <typename T> struct ArrayTraits<T, true> { | 312 template <typename T> struct ArrayTraits<T, true> { |
| 306 struct StorageType { | 313 struct StorageType { |
| 307 char buf[sizeof(T) + (8 - (sizeof(T) % 8)) % 8]; // Make 8-byte aligned. | 314 char buf[sizeof(T) + (8 - (sizeof(T) % 8)) % 8]; // Make 8-byte aligned. |
| 308 }; | 315 }; |
| 309 typedef T& RefType; | 316 typedef T& RefType; |
| 310 typedef const T& ConstRefType; | 317 typedef const T& ConstRefType; |
| 318 typedef T ForwardType; |
| 311 static inline void Initialize(std::vector<StorageType>* vec) { | 319 static inline void Initialize(std::vector<StorageType>* vec) { |
| 312 for (size_t i = 0; i < vec->size(); ++i) | 320 for (size_t i = 0; i < vec->size(); ++i) |
| 313 new (vec->at(i).buf) T(); | 321 new (vec->at(i).buf) T(); |
| 314 } | 322 } |
| 315 static inline void Finalize(std::vector<StorageType>* vec) { | 323 static inline void Finalize(std::vector<StorageType>* vec) { |
| 316 for (size_t i = 0; i < vec->size(); ++i) | 324 for (size_t i = 0; i < vec->size(); ++i) |
| 317 reinterpret_cast<T*>(vec->at(i).buf)->~T(); | 325 reinterpret_cast<T*>(vec->at(i).buf)->~T(); |
| 318 } | 326 } |
| 319 static inline ConstRefType at(const std::vector<StorageType>* vec, | 327 static inline ConstRefType at(const std::vector<StorageType>* vec, |
| 320 size_t offset) { | 328 size_t offset) { |
| 321 return *reinterpret_cast<const T*>(vec->at(offset).buf); | 329 return *reinterpret_cast<const T*>(vec->at(offset).buf); |
| 322 } | 330 } |
| 323 static inline RefType at(std::vector<StorageType>* vec, size_t offset) { | 331 static inline RefType at(std::vector<StorageType>* vec, size_t offset) { |
| 324 return *reinterpret_cast<T*>(vec->at(offset).buf); | 332 return *reinterpret_cast<T*>(vec->at(offset).buf); |
| 325 } | 333 } |
| 334 static inline void Resize(std::vector<StorageType>* vec, size_t size) { |
| 335 size_t old_size = vec->size(); |
| 336 for (size_t i = size; i < old_size; i++) |
| 337 reinterpret_cast<T*>(vec->at(i).buf)->~T(); |
| 338 ResizeStorage(vec, size); |
| 339 for (size_t i = old_size; i < vec->size(); i++) |
| 340 new (vec->at(i).buf) T(); |
| 341 } |
| 342 static inline void PushBack(std::vector<StorageType>* vec, RefType value) { |
| 343 size_t old_size = vec->size(); |
| 344 ResizeStorage(vec, old_size + 1); |
| 345 new (vec->at(old_size).buf) T(value.Pass()); |
| 346 } |
| 347 static inline void ResizeStorage(std::vector<StorageType>* vec, size_t size) { |
| 348 if (size <= vec->capacity()) { |
| 349 vec->resize(size); |
| 350 return; |
| 351 } |
| 352 std::vector<StorageType> new_storage(size); |
| 353 for (size_t i = 0; i < vec->size(); i++) |
| 354 new (new_storage.at(i).buf) T(at(vec, i).Pass()); |
| 355 vec->swap(new_storage); |
| 356 Finalize(&new_storage); |
| 357 } |
| 326 }; | 358 }; |
| 327 | 359 |
| 328 template <> struct WrapperTraits<String, false> { | 360 template <> struct WrapperTraits<String, false> { |
| 329 typedef String_Data* DataType; | 361 typedef String_Data* DataType; |
| 330 }; | 362 }; |
| 331 | 363 |
| 332 } // namespace internal | 364 } // namespace internal |
| 333 } // namespace mojo | 365 } // namespace mojo |
| 334 | 366 |
| 335 #endif // MOJO_PUBLIC_CPP_BINDINGS_LIB_ARRAY_INTERNAL_H_ | 367 #endif // MOJO_PUBLIC_CPP_BINDINGS_LIB_ARRAY_INTERNAL_H_ |
| OLD | NEW |