Export of internal Abseil changes.
-- 1edfe05ddddca43e7650b2d790df7c8498c0e588 by Abseil Team <absl-team@google.com>: Adding an assert to catch various misuses of std::optional. PiperOrigin-RevId: 249427865 -- 45463bbb7e59dfbc584b2f024368a63db98bd7a8 by CJ Johnson <johnsoncj@google.com>: Migrates internal member function GetAllocator() to GetAllocPtr() and changes the return type to pointer instead of reference to avoid unnecessary copy in DestroyElements(...) PiperOrigin-RevId: 249319571 -- 507835be22af85676143ee0c43a80a52bc32094c by Abseil Team <absl-team@google.com>: Fix -Wstring-conversion in GetEnvVar (Windows implementation). PiperOrigin-RevId: 249201897 GitOrigin-RevId: 1edfe05ddddca43e7650b2d790df7c8498c0e588 Change-Id: I9300131887ee507cf80d399c724cf87341e4f11a
This commit is contained in:
		
							parent
							
								
									a18fc7461e
								
							
						
					
					
						commit
						ce65f5ac3c
					
				
					 4 changed files with 31 additions and 31 deletions
				
			
		| 
						 | 
					@ -155,7 +155,7 @@ class InlinedVector {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Creates a copy of an `other` inlined vector using `other`'s allocator.
 | 
					  // Creates a copy of an `other` inlined vector using `other`'s allocator.
 | 
				
			||||||
  InlinedVector(const InlinedVector& other)
 | 
					  InlinedVector(const InlinedVector& other)
 | 
				
			||||||
      : InlinedVector(other, other.storage_.GetAllocator()) {}
 | 
					      : InlinedVector(other, *other.storage_.GetAllocPtr()) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Creates a copy of an `other` inlined vector using a specified allocator.
 | 
					  // Creates a copy of an `other` inlined vector using a specified allocator.
 | 
				
			||||||
  InlinedVector(const InlinedVector& other, const allocator_type& alloc)
 | 
					  InlinedVector(const InlinedVector& other, const allocator_type& alloc)
 | 
				
			||||||
| 
						 | 
					@ -189,7 +189,7 @@ class InlinedVector {
 | 
				
			||||||
  InlinedVector(InlinedVector&& other) noexcept(
 | 
					  InlinedVector(InlinedVector&& other) noexcept(
 | 
				
			||||||
      absl::allocator_is_nothrow<allocator_type>::value ||
 | 
					      absl::allocator_is_nothrow<allocator_type>::value ||
 | 
				
			||||||
      std::is_nothrow_move_constructible<value_type>::value)
 | 
					      std::is_nothrow_move_constructible<value_type>::value)
 | 
				
			||||||
      : storage_(other.storage_.GetAllocator()) {
 | 
					      : storage_(*other.storage_.GetAllocPtr()) {
 | 
				
			||||||
    if (other.storage_.GetIsAllocated()) {
 | 
					    if (other.storage_.GetIsAllocated()) {
 | 
				
			||||||
      // We can just steal the underlying buffer from the source.
 | 
					      // We can just steal the underlying buffer from the source.
 | 
				
			||||||
      // That leaves the source empty, so we clear its size.
 | 
					      // That leaves the source empty, so we clear its size.
 | 
				
			||||||
| 
						 | 
					@ -224,7 +224,7 @@ class InlinedVector {
 | 
				
			||||||
      absl::allocator_is_nothrow<allocator_type>::value)
 | 
					      absl::allocator_is_nothrow<allocator_type>::value)
 | 
				
			||||||
      : storage_(alloc) {
 | 
					      : storage_(alloc) {
 | 
				
			||||||
    if (other.storage_.GetIsAllocated()) {
 | 
					    if (other.storage_.GetIsAllocated()) {
 | 
				
			||||||
      if (alloc == other.storage_.GetAllocator()) {
 | 
					      if (*storage_.GetAllocPtr() == *other.storage_.GetAllocPtr()) {
 | 
				
			||||||
        // We can just steal the allocation from the source.
 | 
					        // We can just steal the allocation from the source.
 | 
				
			||||||
        storage_.SetAllocatedSize(other.size());
 | 
					        storage_.SetAllocatedSize(other.size());
 | 
				
			||||||
        storage_.SetAllocatedData(other.storage_.GetAllocatedData());
 | 
					        storage_.SetAllocatedData(other.storage_.GetAllocatedData());
 | 
				
			||||||
| 
						 | 
					@ -437,7 +437,7 @@ class InlinedVector {
 | 
				
			||||||
  // `InlinedVector::get_allocator()`
 | 
					  // `InlinedVector::get_allocator()`
 | 
				
			||||||
  //
 | 
					  //
 | 
				
			||||||
  // Returns a copy of the allocator of the inlined vector.
 | 
					  // Returns a copy of the allocator of the inlined vector.
 | 
				
			||||||
  allocator_type get_allocator() const { return storage_.GetAllocator(); }
 | 
					  allocator_type get_allocator() const { return *storage_.GetAllocPtr(); }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // ---------------------------------------------------------------------------
 | 
					  // ---------------------------------------------------------------------------
 | 
				
			||||||
  // InlinedVector Member Mutators
 | 
					  // InlinedVector Member Mutators
 | 
				
			||||||
| 
						 | 
					@ -794,19 +794,15 @@ class InlinedVector {
 | 
				
			||||||
  // deallocates the heap allocation if the inlined vector was allocated.
 | 
					  // deallocates the heap allocation if the inlined vector was allocated.
 | 
				
			||||||
  void clear() noexcept {
 | 
					  void clear() noexcept {
 | 
				
			||||||
    const bool is_allocated = storage_.GetIsAllocated();
 | 
					    const bool is_allocated = storage_.GetIsAllocated();
 | 
				
			||||||
 | 
					 | 
				
			||||||
    pointer the_data =
 | 
					    pointer the_data =
 | 
				
			||||||
        is_allocated ? storage_.GetAllocatedData() : storage_.GetInlinedData();
 | 
					        is_allocated ? storage_.GetAllocatedData() : storage_.GetInlinedData();
 | 
				
			||||||
 | 
					    inlined_vector_internal::DestroyElements(storage_.GetAllocPtr(), the_data,
 | 
				
			||||||
    inlined_vector_internal::DestroyElements(storage_.GetAllocator(), the_data,
 | 
					 | 
				
			||||||
                                             storage_.GetSize());
 | 
					                                             storage_.GetSize());
 | 
				
			||||||
 | 
					    storage_.SetInlinedSize(0);
 | 
				
			||||||
    if (is_allocated) {
 | 
					    if (is_allocated) {
 | 
				
			||||||
      AllocatorTraits::deallocate(storage_.GetAllocator(), the_data,
 | 
					      AllocatorTraits::deallocate(*storage_.GetAllocPtr(), the_data,
 | 
				
			||||||
                                  storage_.GetAllocatedCapacity());
 | 
					                                  storage_.GetAllocatedCapacity());
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
    storage_.SetInlinedSize(/* size = */ 0);
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // `InlinedVector::reserve()`
 | 
					  // `InlinedVector::reserve()`
 | 
				
			||||||
| 
						 | 
					@ -854,7 +850,7 @@ class InlinedVector {
 | 
				
			||||||
    // Reallocate storage and move elements.
 | 
					    // Reallocate storage and move elements.
 | 
				
			||||||
    // We can't simply use the same approach as above, because `assign()` would
 | 
					    // We can't simply use the same approach as above, because `assign()` would
 | 
				
			||||||
    // call into `reserve()` internally and reserve larger capacity than we need
 | 
					    // call into `reserve()` internally and reserve larger capacity than we need
 | 
				
			||||||
    pointer new_data = AllocatorTraits::allocate(storage_.GetAllocator(), s);
 | 
					    pointer new_data = AllocatorTraits::allocate(*storage_.GetAllocPtr(), s);
 | 
				
			||||||
    UninitializedCopy(std::make_move_iterator(storage_.GetAllocatedData()),
 | 
					    UninitializedCopy(std::make_move_iterator(storage_.GetAllocatedData()),
 | 
				
			||||||
                      std::make_move_iterator(storage_.GetAllocatedData() + s),
 | 
					                      std::make_move_iterator(storage_.GetAllocatedData() + s),
 | 
				
			||||||
                      new_data);
 | 
					                      new_data);
 | 
				
			||||||
| 
						 | 
					@ -880,7 +876,7 @@ class InlinedVector {
 | 
				
			||||||
      Destroy(storage_.GetAllocatedData(),
 | 
					      Destroy(storage_.GetAllocatedData(),
 | 
				
			||||||
              storage_.GetAllocatedData() + size());
 | 
					              storage_.GetAllocatedData() + size());
 | 
				
			||||||
      assert(begin() == storage_.GetAllocatedData());
 | 
					      assert(begin() == storage_.GetAllocatedData());
 | 
				
			||||||
      AllocatorTraits::deallocate(storage_.GetAllocator(),
 | 
					      AllocatorTraits::deallocate(*storage_.GetAllocPtr(),
 | 
				
			||||||
                                  storage_.GetAllocatedData(),
 | 
					                                  storage_.GetAllocatedData(),
 | 
				
			||||||
                                  storage_.GetAllocatedCapacity());
 | 
					                                  storage_.GetAllocatedCapacity());
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
| 
						 | 
					@ -895,7 +891,7 @@ class InlinedVector {
 | 
				
			||||||
  template <typename... Args>
 | 
					  template <typename... Args>
 | 
				
			||||||
  reference Construct(pointer p, Args&&... args) {
 | 
					  reference Construct(pointer p, Args&&... args) {
 | 
				
			||||||
    std::allocator_traits<allocator_type>::construct(
 | 
					    std::allocator_traits<allocator_type>::construct(
 | 
				
			||||||
        storage_.GetAllocator(), p, std::forward<Args>(args)...);
 | 
					        *storage_.GetAllocPtr(), p, std::forward<Args>(args)...);
 | 
				
			||||||
    return *p;
 | 
					    return *p;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -912,7 +908,7 @@ class InlinedVector {
 | 
				
			||||||
  // Destroy [`from`, `to`) in place.
 | 
					  // Destroy [`from`, `to`) in place.
 | 
				
			||||||
  void Destroy(pointer from, pointer to) {
 | 
					  void Destroy(pointer from, pointer to) {
 | 
				
			||||||
    for (pointer cur = from; cur != to; ++cur) {
 | 
					    for (pointer cur = from; cur != to; ++cur) {
 | 
				
			||||||
      std::allocator_traits<allocator_type>::destroy(storage_.GetAllocator(),
 | 
					      std::allocator_traits<allocator_type>::destroy(*storage_.GetAllocPtr(),
 | 
				
			||||||
                                                     cur);
 | 
					                                                     cur);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
#if !defined(NDEBUG)
 | 
					#if !defined(NDEBUG)
 | 
				
			||||||
| 
						 | 
					@ -943,7 +939,7 @@ class InlinedVector {
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pointer new_data =
 | 
					    pointer new_data =
 | 
				
			||||||
        AllocatorTraits::allocate(storage_.GetAllocator(), new_capacity);
 | 
					        AllocatorTraits::allocate(*storage_.GetAllocPtr(), new_capacity);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    UninitializedCopy(std::make_move_iterator(data()),
 | 
					    UninitializedCopy(std::make_move_iterator(data()),
 | 
				
			||||||
                      std::make_move_iterator(data() + s), new_data);
 | 
					                      std::make_move_iterator(data() + s), new_data);
 | 
				
			||||||
| 
						 | 
					@ -975,7 +971,7 @@ class InlinedVector {
 | 
				
			||||||
      // Move everyone into the new allocation, leaving a gap of `n` for the
 | 
					      // Move everyone into the new allocation, leaving a gap of `n` for the
 | 
				
			||||||
      // requested shift.
 | 
					      // requested shift.
 | 
				
			||||||
      pointer new_data =
 | 
					      pointer new_data =
 | 
				
			||||||
          AllocatorTraits::allocate(storage_.GetAllocator(), new_capacity);
 | 
					          AllocatorTraits::allocate(*storage_.GetAllocPtr(), new_capacity);
 | 
				
			||||||
      size_type index = position - begin();
 | 
					      size_type index = position - begin();
 | 
				
			||||||
      UninitializedCopy(std::make_move_iterator(data()),
 | 
					      UninitializedCopy(std::make_move_iterator(data()),
 | 
				
			||||||
                        std::make_move_iterator(data() + index), new_data);
 | 
					                        std::make_move_iterator(data() + index), new_data);
 | 
				
			||||||
| 
						 | 
					@ -1024,7 +1020,7 @@ class InlinedVector {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    size_type new_capacity = 2 * capacity();
 | 
					    size_type new_capacity = 2 * capacity();
 | 
				
			||||||
    pointer new_data =
 | 
					    pointer new_data =
 | 
				
			||||||
        AllocatorTraits::allocate(storage_.GetAllocator(), new_capacity);
 | 
					        AllocatorTraits::allocate(*storage_.GetAllocPtr(), new_capacity);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    reference new_element =
 | 
					    reference new_element =
 | 
				
			||||||
        Construct(new_data + s, std::forward<Args>(args)...);
 | 
					        Construct(new_data + s, std::forward<Args>(args)...);
 | 
				
			||||||
| 
						 | 
					@ -1038,7 +1034,7 @@ class InlinedVector {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  void InitAssign(size_type n) {
 | 
					  void InitAssign(size_type n) {
 | 
				
			||||||
    if (n > static_cast<size_type>(N)) {
 | 
					    if (n > static_cast<size_type>(N)) {
 | 
				
			||||||
      pointer new_data = AllocatorTraits::allocate(storage_.GetAllocator(), n);
 | 
					      pointer new_data = AllocatorTraits::allocate(*storage_.GetAllocPtr(), n);
 | 
				
			||||||
      storage_.SetAllocatedData(new_data);
 | 
					      storage_.SetAllocatedData(new_data);
 | 
				
			||||||
      storage_.SetAllocatedCapacity(n);
 | 
					      storage_.SetAllocatedCapacity(n);
 | 
				
			||||||
      UninitializedFill(storage_.GetAllocatedData(),
 | 
					      UninitializedFill(storage_.GetAllocatedData(),
 | 
				
			||||||
| 
						 | 
					@ -1053,7 +1049,7 @@ class InlinedVector {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  void InitAssign(size_type n, const_reference v) {
 | 
					  void InitAssign(size_type n, const_reference v) {
 | 
				
			||||||
    if (n > static_cast<size_type>(N)) {
 | 
					    if (n > static_cast<size_type>(N)) {
 | 
				
			||||||
      pointer new_data = AllocatorTraits::allocate(storage_.GetAllocator(), n);
 | 
					      pointer new_data = AllocatorTraits::allocate(*storage_.GetAllocPtr(), n);
 | 
				
			||||||
      storage_.SetAllocatedData(new_data);
 | 
					      storage_.SetAllocatedData(new_data);
 | 
				
			||||||
      storage_.SetAllocatedCapacity(n);
 | 
					      storage_.SetAllocatedCapacity(n);
 | 
				
			||||||
      UninitializedFill(storage_.GetAllocatedData(),
 | 
					      UninitializedFill(storage_.GetAllocatedData(),
 | 
				
			||||||
| 
						 | 
					@ -1126,7 +1122,7 @@ class InlinedVector {
 | 
				
			||||||
      // Both out of line, so just swap the tag, allocation, and allocator.
 | 
					      // Both out of line, so just swap the tag, allocation, and allocator.
 | 
				
			||||||
      storage_.SwapSizeAndIsAllocated(std::addressof(other.storage_));
 | 
					      storage_.SwapSizeAndIsAllocated(std::addressof(other.storage_));
 | 
				
			||||||
      storage_.SwapAllocatedSizeAndCapacity(std::addressof(other.storage_));
 | 
					      storage_.SwapAllocatedSizeAndCapacity(std::addressof(other.storage_));
 | 
				
			||||||
      swap(storage_.GetAllocator(), other.storage_.GetAllocator());
 | 
					      swap(*storage_.GetAllocPtr(), *other.storage_.GetAllocPtr());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      return;
 | 
					      return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					@ -1156,7 +1152,7 @@ class InlinedVector {
 | 
				
			||||||
                 a->storage_.GetInlinedData() + a_size);
 | 
					                 a->storage_.GetInlinedData() + a_size);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      storage_.SwapSizeAndIsAllocated(std::addressof(other.storage_));
 | 
					      storage_.SwapSizeAndIsAllocated(std::addressof(other.storage_));
 | 
				
			||||||
      swap(storage_.GetAllocator(), other.storage_.GetAllocator());
 | 
					      swap(*storage_.GetAllocPtr(), *other.storage_.GetAllocPtr());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      assert(b->size() == a_size);
 | 
					      assert(b->size() == a_size);
 | 
				
			||||||
      assert(a->size() == b_size);
 | 
					      assert(a->size() == b_size);
 | 
				
			||||||
| 
						 | 
					@ -1198,8 +1194,8 @@ class InlinedVector {
 | 
				
			||||||
    a->storage_.SetAllocatedData(b_data);
 | 
					    a->storage_.SetAllocatedData(b_data);
 | 
				
			||||||
    a->storage_.SetAllocatedCapacity(b_capacity);
 | 
					    a->storage_.SetAllocatedCapacity(b_capacity);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (a->storage_.GetAllocator() != b->storage_.GetAllocator()) {
 | 
					    if (*a->storage_.GetAllocPtr() != *b->storage_.GetAllocPtr()) {
 | 
				
			||||||
      swap(a->storage_.GetAllocator(), b->storage_.GetAllocator());
 | 
					      swap(*a->storage_.GetAllocPtr(), *b->storage_.GetAllocPtr());
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    assert(b->size() == a_size);
 | 
					    assert(b->size() == a_size);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -33,7 +33,7 @@ using IsAtLeastForwardIterator = std::is_convertible<
 | 
				
			||||||
    std::forward_iterator_tag>;
 | 
					    std::forward_iterator_tag>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
template <typename AllocatorType, typename ValueType, typename SizeType>
 | 
					template <typename AllocatorType, typename ValueType, typename SizeType>
 | 
				
			||||||
void DestroyElements(AllocatorType alloc, ValueType* destroy_first,
 | 
					void DestroyElements(AllocatorType* alloc_ptr, ValueType* destroy_first,
 | 
				
			||||||
                     SizeType destroy_size) {
 | 
					                     SizeType destroy_size) {
 | 
				
			||||||
  using AllocatorTraits = std::allocator_traits<AllocatorType>;
 | 
					  using AllocatorTraits = std::allocator_traits<AllocatorType>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -45,7 +45,7 @@ void DestroyElements(AllocatorType alloc, ValueType* destroy_first,
 | 
				
			||||||
  // NOTE: We assume destructors do not throw and thus make no attempt to roll
 | 
					  // NOTE: We assume destructors do not throw and thus make no attempt to roll
 | 
				
			||||||
  // back.
 | 
					  // back.
 | 
				
			||||||
  for (SizeType i = 0; i < destroy_size; ++i) {
 | 
					  for (SizeType i = 0; i < destroy_size; ++i) {
 | 
				
			||||||
    AllocatorTraits::destroy(alloc, destroy_first + i);
 | 
					    AllocatorTraits::destroy(*alloc_ptr, destroy_first + i);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef NDEBUG
 | 
					#ifndef NDEBUG
 | 
				
			||||||
| 
						 | 
					@ -104,10 +104,12 @@ class Storage {
 | 
				
			||||||
    return data_.allocated.allocated_capacity;
 | 
					    return data_.allocated.allocated_capacity;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  allocator_type& GetAllocator() { return metadata_.template get<0>(); }
 | 
					  allocator_type* GetAllocPtr() {
 | 
				
			||||||
 | 
					    return std::addressof(metadata_.template get<0>());
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const allocator_type& GetAllocator() const {
 | 
					  const allocator_type* GetAllocPtr() const {
 | 
				
			||||||
    return metadata_.template get<0>();
 | 
					    return std::addressof(metadata_.template get<0>());
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  void SetAllocatedSize(size_type size) {
 | 
					  void SetAllocatedSize(size_type size) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -190,7 +190,7 @@ bool GetEnvVar(const char* var_name, std::string* var_value) {
 | 
				
			||||||
  char buf[1024];
 | 
					  char buf[1024];
 | 
				
			||||||
  auto get_res = GetEnvironmentVariableA(var_name, buf, sizeof(buf));
 | 
					  auto get_res = GetEnvironmentVariableA(var_name, buf, sizeof(buf));
 | 
				
			||||||
  if (get_res >= sizeof(buf)) {
 | 
					  if (get_res >= sizeof(buf)) {
 | 
				
			||||||
    return "";
 | 
					    return false;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (get_res == 0) {
 | 
					  if (get_res == 0) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -421,7 +421,9 @@ class optional : private optional_internal::optional_data<T>,
 | 
				
			||||||
  //
 | 
					  //
 | 
				
			||||||
  // Accesses the underlying `T` value of an `optional`. If the `optional` is
 | 
					  // Accesses the underlying `T` value of an `optional`. If the `optional` is
 | 
				
			||||||
  // empty, behavior is undefined.
 | 
					  // empty, behavior is undefined.
 | 
				
			||||||
  constexpr const T& operator*() const & { return reference(); }
 | 
					  constexpr const T& operator*() const& {
 | 
				
			||||||
 | 
					    return ABSL_ASSERT(this->engaged_), reference();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
  T& operator*() & {
 | 
					  T& operator*() & {
 | 
				
			||||||
    assert(this->engaged_);
 | 
					    assert(this->engaged_);
 | 
				
			||||||
    return reference();
 | 
					    return reference();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue