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 433 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
444 } | 444 } |
445 static inline RefType at(std::vector<T>* vec, size_t offset) { | 445 static inline RefType at(std::vector<T>* vec, size_t offset) { |
446 return vec->at(offset); | 446 return vec->at(offset); |
447 } | 447 } |
448 static inline void Resize(std::vector<T>* vec, size_t size) { | 448 static inline void Resize(std::vector<T>* vec, size_t size) { |
449 vec->resize(size); | 449 vec->resize(size); |
450 } | 450 } |
451 static inline void PushBack(std::vector<T>* vec, ForwardType value) { | 451 static inline void PushBack(std::vector<T>* vec, ForwardType value) { |
452 vec->push_back(value); | 452 vec->push_back(value); |
453 } | 453 } |
| 454 static inline void Clone(const std::vector<T>& src_vec, |
| 455 std::vector<T>* dest_vec) { |
| 456 dest_vec->assign(src_vec.begin(), src_vec.end()); |
| 457 } |
454 }; | 458 }; |
455 | 459 |
456 template <typename T> struct ArrayTraits<T, true> { | 460 template <typename T> struct ArrayTraits<T, true> { |
457 struct StorageType { | 461 struct StorageType { |
458 char buf[sizeof(T) + (8 - (sizeof(T) % 8)) % 8]; // Make 8-byte aligned. | 462 char buf[sizeof(T) + (8 - (sizeof(T) % 8)) % 8]; // Make 8-byte aligned. |
459 }; | 463 }; |
460 typedef T& RefType; | 464 typedef T& RefType; |
461 typedef const T& ConstRefType; | 465 typedef const T& ConstRefType; |
462 typedef T ForwardType; | 466 typedef T ForwardType; |
463 static inline void Initialize(std::vector<StorageType>* vec) { | 467 static inline void Initialize(std::vector<StorageType>* vec) { |
(...skipping 28 matching lines...) Expand all Loading... |
492 if (size <= vec->capacity()) { | 496 if (size <= vec->capacity()) { |
493 vec->resize(size); | 497 vec->resize(size); |
494 return; | 498 return; |
495 } | 499 } |
496 std::vector<StorageType> new_storage(size); | 500 std::vector<StorageType> new_storage(size); |
497 for (size_t i = 0; i < vec->size(); i++) | 501 for (size_t i = 0; i < vec->size(); i++) |
498 new (new_storage.at(i).buf) T(at(vec, i).Pass()); | 502 new (new_storage.at(i).buf) T(at(vec, i).Pass()); |
499 vec->swap(new_storage); | 503 vec->swap(new_storage); |
500 Finalize(&new_storage); | 504 Finalize(&new_storage); |
501 } | 505 } |
| 506 static inline void Clone(const std::vector<StorageType>& src_vec, |
| 507 std::vector<StorageType>* dest_vec) { |
| 508 Resize(dest_vec, src_vec.size()); |
| 509 for (size_t i = 0; i < src_vec.size(); ++i) |
| 510 at(dest_vec, i) = at(&src_vec, i).Clone(); |
| 511 } |
502 }; | 512 }; |
503 | 513 |
504 template <> struct WrapperTraits<String, false> { | 514 template <> struct WrapperTraits<String, false> { |
505 typedef String_Data* DataType; | 515 typedef String_Data* DataType; |
506 }; | 516 }; |
507 | 517 |
508 } // namespace internal | 518 } // namespace internal |
509 } // namespace mojo | 519 } // namespace mojo |
510 | 520 |
511 #endif // MOJO_PUBLIC_CPP_BINDINGS_LIB_ARRAY_INTERNAL_H_ | 521 #endif // MOJO_PUBLIC_CPP_BINDINGS_LIB_ARRAY_INTERNAL_H_ |
OLD | NEW |