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

Side by Side Diff: mojo/public/cpp/bindings/lib/array_internal.h

Issue 1417843002: Simplify mojo::internal::ArrayTraits. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Created 5 years, 2 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 | « mojo/public/cpp/bindings/array.h ('k') | 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 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 <type_traits> 9 #include <type_traits>
10 #include <vector> 10 #include <vector>
(...skipping 475 matching lines...) Expand 10 before | Expand all | Expand 10 after
486 static_assert(sizeof(Array_Data<char>) == 8, "Bad sizeof(Array_Data)"); 486 static_assert(sizeof(Array_Data<char>) == 8, "Bad sizeof(Array_Data)");
487 487
488 // UTF-8 encoded 488 // UTF-8 encoded
489 typedef Array_Data<char> String_Data; 489 typedef Array_Data<char> String_Data;
490 490
491 template <typename T, bool kIsMoveOnlyType> 491 template <typename T, bool kIsMoveOnlyType>
492 struct ArrayTraits {}; 492 struct ArrayTraits {};
493 493
494 template <typename T> 494 template <typename T>
495 struct ArrayTraits<T, false> { 495 struct ArrayTraits<T, false> {
496 typedef T StorageType; 496 typedef typename std::vector<T>::const_reference ForwardType;
497 typedef typename std::vector<T>::reference RefType;
498 typedef typename std::vector<T>::const_reference ConstRefType;
499 typedef ConstRefType ForwardType;
500 static inline void Finalize(std::vector<T>* vec) {}
501 static inline ConstRefType at(const std::vector<T>* vec, size_t offset) {
502 return vec->at(offset);
503 }
504 static inline RefType at(std::vector<T>* vec, size_t offset) {
505 return vec->at(offset);
506 }
507 static inline void Resize(std::vector<T>* vec, size_t size) {
508 vec->resize(size);
509 }
510 static inline void PushBack(std::vector<T>* vec, ForwardType value) { 497 static inline void PushBack(std::vector<T>* vec, ForwardType value) {
511 vec->push_back(value); 498 vec->push_back(value);
512 } 499 }
513 static inline void Clone(const std::vector<T>& src_vec, 500 static inline void Clone(const std::vector<T>& src_vec,
514 std::vector<T>* dest_vec) { 501 std::vector<T>* dest_vec) {
515 dest_vec->assign(src_vec.begin(), src_vec.end()); 502 dest_vec->assign(src_vec.begin(), src_vec.end());
516 } 503 }
517 }; 504 };
518 505
519 template <typename T> 506 template <typename T>
520 struct ArrayTraits<T, true> { 507 struct ArrayTraits<T, true> {
521 struct StorageType {
522 char buf[sizeof(T) + (8 - (sizeof(T) % 8)) % 8]; // Make 8-byte aligned.
523 };
524 typedef T& RefType;
525 typedef const T& ConstRefType;
526 typedef T ForwardType; 508 typedef T ForwardType;
527 static inline void Finalize(std::vector<StorageType>* vec) { 509 static inline void PushBack(std::vector<T>* vec, T& value) {
528 for (size_t i = 0; i < vec->size(); ++i) 510 vec->push_back(value.Pass());
529 reinterpret_cast<T*>(vec->at(i).buf)->~T();
530 } 511 }
531 static inline ConstRefType at(const std::vector<StorageType>* vec, 512 static inline void Clone(const std::vector<T>& src_vec,
532 size_t offset) { 513 std::vector<T>* dest_vec) {
533 return *reinterpret_cast<const T*>(vec->at(offset).buf); 514 dest_vec->resize(src_vec.size());
534 }
535 static inline RefType at(std::vector<StorageType>* vec, size_t offset) {
536 return *reinterpret_cast<T*>(vec->at(offset).buf);
537 }
538 static inline void Resize(std::vector<StorageType>* vec, size_t size) {
539 size_t old_size = vec->size();
540 for (size_t i = size; i < old_size; i++)
541 reinterpret_cast<T*>(vec->at(i).buf)->~T();
542 ResizeStorage(vec, size);
543 for (size_t i = old_size; i < vec->size(); i++)
544 new (vec->at(i).buf) T();
545 }
546 static inline void PushBack(std::vector<StorageType>* vec, RefType value) {
547 size_t old_size = vec->size();
548 ResizeStorage(vec, old_size + 1);
549 new (vec->at(old_size).buf) T(value.Pass());
550 }
551 static inline void ResizeStorage(std::vector<StorageType>* vec, size_t size) {
552 if (size <= vec->capacity()) {
553 vec->resize(size);
554 return;
555 }
556 std::vector<StorageType> new_storage(size);
557 for (size_t i = 0; i < vec->size(); i++)
558 new (new_storage.at(i).buf) T(at(vec, i).Pass());
559 vec->swap(new_storage);
560 Finalize(&new_storage);
561 }
562 static inline void Clone(const std::vector<StorageType>& src_vec,
563 std::vector<StorageType>* dest_vec) {
564 Resize(dest_vec, src_vec.size());
565 for (size_t i = 0; i < src_vec.size(); ++i) 515 for (size_t i = 0; i < src_vec.size(); ++i)
566 at(dest_vec, i) = at(&src_vec, i).Clone(); 516 dest_vec->at(i) = src_vec.at(i).Clone();
567 } 517 }
568 }; 518 };
569 519
570 template <> 520 template <>
571 struct WrapperTraits<String, false> { 521 struct WrapperTraits<String, false> {
572 typedef String_Data* DataType; 522 typedef String_Data* DataType;
573 }; 523 };
574 524
575 } // namespace internal 525 } // namespace internal
576 } // namespace mojo 526 } // namespace mojo
577 527
578 #endif // MOJO_PUBLIC_CPP_BINDINGS_LIB_ARRAY_INTERNAL_H_ 528 #endif // MOJO_PUBLIC_CPP_BINDINGS_LIB_ARRAY_INTERNAL_H_
OLDNEW
« no previous file with comments | « mojo/public/cpp/bindings/array.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698