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

Side by Side Diff: base/containers/small_map.h

Issue 1738883004: Support for move-only types in SmallMap. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase Created 4 years, 9 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 | base/containers/small_map_unittest.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_CONTAINERS_SMALL_MAP_H_ 5 #ifndef BASE_CONTAINERS_SMALL_MAP_H_
6 #define BASE_CONTAINERS_SMALL_MAP_H_ 6 #define BASE_CONTAINERS_SMALL_MAP_H_
7 7
8 #include <stddef.h> 8 #include <stddef.h>
9 9
10 #include <map> 10 #include <map>
(...skipping 499 matching lines...) Expand 10 before | Expand all | Expand 10 after
510 size_ = 0; 510 size_ = 0;
511 } 511 }
512 512
513 // Invalidates iterators. 513 // Invalidates iterators.
514 void erase(const iterator& position) { 514 void erase(const iterator& position) {
515 if (size_ >= 0) { 515 if (size_ >= 0) {
516 int i = position.array_iter_ - array_; 516 int i = position.array_iter_ - array_;
517 array_[i].Destroy(); 517 array_[i].Destroy();
518 --size_; 518 --size_;
519 if (i != size_) { 519 if (i != size_) {
520 array_[i].Init(*array_[size_]); 520 array_[i].InitFromMove(std::move(array_[size_]));
521 array_[size_].Destroy(); 521 array_[size_].Destroy();
522 } 522 }
523 } else { 523 } else {
524 map_->erase(position.hash_iter_); 524 map_->erase(position.hash_iter_);
525 } 525 }
526 } 526 }
527 527
528 size_t erase(const key_type& key) { 528 size_t erase(const key_type& key) {
529 iterator iter = find(key); 529 iterator iter = find(key);
530 if (iter == end()) return 0u; 530 if (iter == end()) return 0u;
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
587 ManualConstructor<value_type> dummy_; 587 ManualConstructor<value_type> dummy_;
588 ManualConstructor<value_type> array_[kArraySize]; 588 ManualConstructor<value_type> array_[kArraySize];
589 ManualConstructor<NormalMap> map_; 589 ManualConstructor<NormalMap> map_;
590 }; 590 };
591 591
592 void ConvertToRealMap() { 592 void ConvertToRealMap() {
593 // Move the current elements into a temporary array. 593 // Move the current elements into a temporary array.
594 ManualConstructor<value_type> temp_array[kArraySize]; 594 ManualConstructor<value_type> temp_array[kArraySize];
595 595
596 for (int i = 0; i < kArraySize; i++) { 596 for (int i = 0; i < kArraySize; i++) {
597 temp_array[i].Init(*array_[i]); 597 temp_array[i].InitFromMove(std::move(array_[i]));
598 array_[i].Destroy(); 598 array_[i].Destroy();
599 } 599 }
600 600
601 // Initialize the map. 601 // Initialize the map.
602 size_ = -1; 602 size_ = -1;
603 functor_(&map_); 603 functor_(&map_);
604 604
605 // Insert elements into it. 605 // Insert elements into it.
606 for (int i = 0; i < kArraySize; i++) { 606 for (int i = 0; i < kArraySize; i++) {
607 map_->insert(*temp_array[i]); 607 map_->insert(std::move(*temp_array[i]));
608 temp_array[i].Destroy(); 608 temp_array[i].Destroy();
609 } 609 }
610 } 610 }
611 611
612 // Helpers for constructors and destructors. 612 // Helpers for constructors and destructors.
613 void InitFrom(const SmallMap& src) { 613 void InitFrom(const SmallMap& src) {
614 functor_ = src.functor_; 614 functor_ = src.functor_;
615 size_ = src.size_; 615 size_ = src.size_;
616 if (src.size_ >= 0) { 616 if (src.size_ >= 0) {
617 for (int i = 0; i < size_; i++) { 617 for (int i = 0; i < size_; i++) {
(...skipping 26 matching lines...) Expand all
644 typename Functor> 644 typename Functor>
645 inline bool SmallMap<NormalMap, kArraySize, EqualKey, 645 inline bool SmallMap<NormalMap, kArraySize, EqualKey,
646 Functor>::iterator::operator!=( 646 Functor>::iterator::operator!=(
647 const const_iterator& other) const { 647 const const_iterator& other) const {
648 return other != *this; 648 return other != *this;
649 } 649 }
650 650
651 } // namespace base 651 } // namespace base
652 652
653 #endif // BASE_CONTAINERS_SMALL_MAP_H_ 653 #endif // BASE_CONTAINERS_SMALL_MAP_H_
OLDNEW
« no previous file with comments | « no previous file | base/containers/small_map_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698