Export of internal Abseil changes.
-- b254aba40a65385deccd757480f8d7383f2f2f55 by CJ Johnson <johnsoncj@google.com>: Updates some of the assignment operators to dispatch to the `assign(ForwardIt, ForwardIt)` member function (and removing `AssignForwardRange(...)` as a result. PiperOrigin-RevId: 249030603 GitOrigin-RevId: b254aba40a65385deccd757480f8d7383f2f2f55 Change-Id: I6ba84c8e014d47de469691fa02f328df68066208
This commit is contained in:
		
							parent
							
								
									8a394b19c1
								
							
						
					
					
						commit
						a18fc7461e
					
				
					 1 changed files with 23 additions and 40 deletions
				
			
		| 
						 | 
				
			
			@ -448,24 +448,16 @@ class InlinedVector {
 | 
			
		|||
  // Replaces the contents of the inlined vector with copies of the elements in
 | 
			
		||||
  // the provided `std::initializer_list`.
 | 
			
		||||
  InlinedVector& operator=(std::initializer_list<value_type> list) {
 | 
			
		||||
    AssignForwardRange(list.begin(), list.end());
 | 
			
		||||
    assign(list.begin(), list.end());
 | 
			
		||||
    return *this;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Overload of `InlinedVector::operator=()` to replace the contents of the
 | 
			
		||||
  // inlined vector with the contents of `other`.
 | 
			
		||||
  InlinedVector& operator=(const InlinedVector& other) {
 | 
			
		||||
    if (ABSL_PREDICT_FALSE(this == std::addressof(other))) return *this;
 | 
			
		||||
 | 
			
		||||
    // Optimized to avoid reallocation.
 | 
			
		||||
    // Prefer reassignment to copy construction for elements.
 | 
			
		||||
    if (size() < other.size()) {  // grow
 | 
			
		||||
      reserve(other.size());
 | 
			
		||||
      std::copy(other.begin(), other.begin() + size(), begin());
 | 
			
		||||
      std::copy(other.begin() + size(), other.end(), std::back_inserter(*this));
 | 
			
		||||
    } else {  // maybe shrink
 | 
			
		||||
      erase(begin() + other.size(), end());
 | 
			
		||||
      std::copy(other.begin(), other.end(), begin());
 | 
			
		||||
    if (ABSL_PREDICT_TRUE(this != std::addressof(other))) {
 | 
			
		||||
      const_pointer other_data = other.data();
 | 
			
		||||
      assign(other_data, other_data + other.size());
 | 
			
		||||
    }
 | 
			
		||||
    return *this;
 | 
			
		||||
  }
 | 
			
		||||
| 
						 | 
				
			
			@ -528,7 +520,7 @@ class InlinedVector {
 | 
			
		|||
  // inlined vector with copies of the values in the provided
 | 
			
		||||
  // `std::initializer_list`.
 | 
			
		||||
  void assign(std::initializer_list<value_type> list) {
 | 
			
		||||
    AssignForwardRange(list.begin(), list.end());
 | 
			
		||||
    assign(list.begin(), list.end());
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Overload of `InlinedVector::assign()` to replace the contents of the
 | 
			
		||||
| 
						 | 
				
			
			@ -536,7 +528,24 @@ class InlinedVector {
 | 
			
		|||
  template <typename ForwardIterator,
 | 
			
		||||
            EnableIfAtLeastForwardIterator<ForwardIterator>* = nullptr>
 | 
			
		||||
  void assign(ForwardIterator first, ForwardIterator last) {
 | 
			
		||||
    AssignForwardRange(first, last);
 | 
			
		||||
    auto length = std::distance(first, last);
 | 
			
		||||
 | 
			
		||||
    // Prefer reassignment to copy construction for elements.
 | 
			
		||||
    if (static_cast<size_type>(length) <= size()) {
 | 
			
		||||
      erase(std::copy(first, last, begin()), end());
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    reserve(length);
 | 
			
		||||
    iterator out = begin();
 | 
			
		||||
    for (; out != end(); ++first, ++out) *out = *first;
 | 
			
		||||
    if (storage_.GetIsAllocated()) {
 | 
			
		||||
      UninitializedCopy(first, last, out);
 | 
			
		||||
      storage_.SetAllocatedSize(length);
 | 
			
		||||
    } else {
 | 
			
		||||
      UninitializedCopy(first, last, out);
 | 
			
		||||
      storage_.SetInlinedSize(length);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Overload of `InlinedVector::assign()` to replace the contents of the
 | 
			
		||||
| 
						 | 
				
			
			@ -1057,32 +1066,6 @@ class InlinedVector {
 | 
			
		|||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  template <typename ForwardIt>
 | 
			
		||||
  void AssignForwardRange(ForwardIt first, ForwardIt last) {
 | 
			
		||||
    static_assert(absl::inlined_vector_internal::IsAtLeastForwardIterator<
 | 
			
		||||
                      ForwardIt>::value,
 | 
			
		||||
                  "");
 | 
			
		||||
 | 
			
		||||
    auto length = std::distance(first, last);
 | 
			
		||||
 | 
			
		||||
    // Prefer reassignment to copy construction for elements.
 | 
			
		||||
    if (static_cast<size_type>(length) <= size()) {
 | 
			
		||||
      erase(std::copy(first, last, begin()), end());
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    reserve(length);
 | 
			
		||||
    iterator out = begin();
 | 
			
		||||
    for (; out != end(); ++first, ++out) *out = *first;
 | 
			
		||||
    if (storage_.GetIsAllocated()) {
 | 
			
		||||
      UninitializedCopy(first, last, out);
 | 
			
		||||
      storage_.SetAllocatedSize(length);
 | 
			
		||||
    } else {
 | 
			
		||||
      UninitializedCopy(first, last, out);
 | 
			
		||||
      storage_.SetInlinedSize(length);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  template <typename ForwardIt>
 | 
			
		||||
  void AppendForwardRange(ForwardIt first, ForwardIt last) {
 | 
			
		||||
    static_assert(absl::inlined_vector_internal::IsAtLeastForwardIterator<
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue