Changes imported from Abseil "staging" branch:
- d1a8e5ddbf9f96a4ca020260b21e03820c5ff966 Remove references to the non-existing StringPrintf API to... by Abseil Team <absl-team@google.com> - 64a422bc1620b29247a81fab2b08a7f23dfc1461 Add a copy and move constructor to FixedArray. This does... by Jon Cohen <cohenjon@google.com> GitOrigin-RevId: d1a8e5ddbf9f96a4ca020260b21e03820c5ff966 Change-Id: I4388bdf1260702f2847307abbac4bf265e8cf90f
This commit is contained in:
		
							parent
							
								
									eb5bbdda6c
								
							
						
					
					
						commit
						6365d1744b
					
				
					 5 changed files with 53 additions and 22 deletions
				
			
		| 
						 | 
					@ -33,6 +33,7 @@ cc_library(
 | 
				
			||||||
        "//absl/base:core_headers",
 | 
					        "//absl/base:core_headers",
 | 
				
			||||||
        "//absl/base:dynamic_annotations",
 | 
					        "//absl/base:dynamic_annotations",
 | 
				
			||||||
        "//absl/base:throw_delegate",
 | 
					        "//absl/base:throw_delegate",
 | 
				
			||||||
 | 
					        "//absl/memory",
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -42,7 +43,6 @@ cc_test(
 | 
				
			||||||
    copts = ABSL_TEST_COPTS + ["-fexceptions"],
 | 
					    copts = ABSL_TEST_COPTS + ["-fexceptions"],
 | 
				
			||||||
    deps = [
 | 
					    deps = [
 | 
				
			||||||
        ":fixed_array",
 | 
					        ":fixed_array",
 | 
				
			||||||
        "//absl/base:core_headers",
 | 
					 | 
				
			||||||
        "//absl/base:exception_testing",
 | 
					        "//absl/base:exception_testing",
 | 
				
			||||||
        "//absl/memory",
 | 
					        "//absl/memory",
 | 
				
			||||||
        "@com_google_googletest//:gtest_main",
 | 
					        "@com_google_googletest//:gtest_main",
 | 
				
			||||||
| 
						 | 
					@ -55,7 +55,6 @@ cc_test(
 | 
				
			||||||
    copts = ABSL_TEST_COPTS,
 | 
					    copts = ABSL_TEST_COPTS,
 | 
				
			||||||
    deps = [
 | 
					    deps = [
 | 
				
			||||||
        ":fixed_array",
 | 
					        ":fixed_array",
 | 
				
			||||||
        "//absl/base:core_headers",
 | 
					 | 
				
			||||||
        "//absl/base:exception_testing",
 | 
					        "//absl/base:exception_testing",
 | 
				
			||||||
        "//absl/memory",
 | 
					        "//absl/memory",
 | 
				
			||||||
        "@com_google_googletest//:gtest_main",
 | 
					        "@com_google_googletest//:gtest_main",
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -47,6 +47,7 @@
 | 
				
			||||||
#include "absl/base/macros.h"
 | 
					#include "absl/base/macros.h"
 | 
				
			||||||
#include "absl/base/optimization.h"
 | 
					#include "absl/base/optimization.h"
 | 
				
			||||||
#include "absl/base/port.h"
 | 
					#include "absl/base/port.h"
 | 
				
			||||||
 | 
					#include "absl/memory/memory.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace absl {
 | 
					namespace absl {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -107,6 +108,15 @@ class FixedArray {
 | 
				
			||||||
          ? kInlineBytesDefault / sizeof(value_type)
 | 
					          ? kInlineBytesDefault / sizeof(value_type)
 | 
				
			||||||
          : inlined;
 | 
					          : inlined;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  FixedArray(const FixedArray& other) : rep_(other.begin(), other.end()) {}
 | 
				
			||||||
 | 
					  FixedArray(FixedArray&& other) noexcept(
 | 
				
			||||||
 | 
					  // clang-format off
 | 
				
			||||||
 | 
					      absl::allocator_is_nothrow<std::allocator<value_type>>::value &&
 | 
				
			||||||
 | 
					  // clang-format on
 | 
				
			||||||
 | 
					          std::is_nothrow_move_constructible<value_type>::value)
 | 
				
			||||||
 | 
					      : rep_(std::make_move_iterator(other.begin()),
 | 
				
			||||||
 | 
					             std::make_move_iterator(other.end())) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Creates an array object that can store `n` elements.
 | 
					  // Creates an array object that can store `n` elements.
 | 
				
			||||||
  // Note that trivially constructible elements will be uninitialized.
 | 
					  // Note that trivially constructible elements will be uninitialized.
 | 
				
			||||||
  explicit FixedArray(size_type n) : rep_(n) {}
 | 
					  explicit FixedArray(size_type n) : rep_(n) {}
 | 
				
			||||||
| 
						 | 
					@ -126,11 +136,9 @@ class FixedArray {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  ~FixedArray() {}
 | 
					  ~FixedArray() {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Copy and move construction and assignment are deleted because (1) you can't
 | 
					  // Assignments are deleted because they break the invariant that the size of a
 | 
				
			||||||
  // copy or move an array, (2) assignment breaks the invariant that the size of
 | 
					  // `FixedArray` never changes.
 | 
				
			||||||
  // a `FixedArray` never changes, and (3) there's no clear answer as to what
 | 
					  void operator=(FixedArray&&) = delete;
 | 
				
			||||||
  // should happen to a moved-from `FixedArray`.
 | 
					 | 
				
			||||||
  FixedArray(const FixedArray&) = delete;
 | 
					 | 
				
			||||||
  void operator=(const FixedArray&) = delete;
 | 
					  void operator=(const FixedArray&) = delete;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // FixedArray::size()
 | 
					  // FixedArray::size()
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -27,6 +27,8 @@
 | 
				
			||||||
#include "absl/base/internal/exception_testing.h"
 | 
					#include "absl/base/internal/exception_testing.h"
 | 
				
			||||||
#include "absl/memory/memory.h"
 | 
					#include "absl/memory/memory.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					using ::testing::ElementsAreArray;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace {
 | 
					namespace {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Helper routine to determine if a absl::FixedArray used stack allocation.
 | 
					// Helper routine to determine if a absl::FixedArray used stack allocation.
 | 
				
			||||||
| 
						 | 
					@ -89,6 +91,41 @@ class ThreeInts {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int ThreeInts::counter = 0;
 | 
					int ThreeInts::counter = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEST(FixedArrayTest, CopyCtor) {
 | 
				
			||||||
 | 
					  absl::FixedArray<int, 10> on_stack(5);
 | 
				
			||||||
 | 
					  std::iota(on_stack.begin(), on_stack.end(), 0);
 | 
				
			||||||
 | 
					  absl::FixedArray<int, 10> stack_copy = on_stack;
 | 
				
			||||||
 | 
					  EXPECT_THAT(stack_copy, ElementsAreArray(on_stack));
 | 
				
			||||||
 | 
					  EXPECT_TRUE(IsOnStack(stack_copy));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  absl::FixedArray<int, 10> allocated(15);
 | 
				
			||||||
 | 
					  std::iota(allocated.begin(), allocated.end(), 0);
 | 
				
			||||||
 | 
					  absl::FixedArray<int, 10> alloced_copy = allocated;
 | 
				
			||||||
 | 
					  EXPECT_THAT(alloced_copy, ElementsAreArray(allocated));
 | 
				
			||||||
 | 
					  EXPECT_FALSE(IsOnStack(alloced_copy));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEST(FixedArrayTest, MoveCtor) {
 | 
				
			||||||
 | 
					  absl::FixedArray<std::unique_ptr<int>, 10> on_stack(5);
 | 
				
			||||||
 | 
					  for (int i = 0; i < 5; ++i) {
 | 
				
			||||||
 | 
					    on_stack[i] = absl::make_unique<int>(i);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  absl::FixedArray<std::unique_ptr<int>, 10> stack_copy = std::move(on_stack);
 | 
				
			||||||
 | 
					  for (int i = 0; i < 5; ++i) EXPECT_EQ(*(stack_copy[i]), i);
 | 
				
			||||||
 | 
					  EXPECT_EQ(stack_copy.size(), on_stack.size());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  absl::FixedArray<std::unique_ptr<int>, 10> allocated(15);
 | 
				
			||||||
 | 
					  for (int i = 0; i < 15; ++i) {
 | 
				
			||||||
 | 
					    allocated[i] = absl::make_unique<int>(i);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  absl::FixedArray<std::unique_ptr<int>, 10> alloced_copy =
 | 
				
			||||||
 | 
					      std::move(allocated);
 | 
				
			||||||
 | 
					  for (int i = 0; i < 15; ++i) EXPECT_EQ(*(alloced_copy[i]), i);
 | 
				
			||||||
 | 
					  EXPECT_EQ(allocated.size(), alloced_copy.size());
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
TEST(FixedArrayTest, SmallObjects) {
 | 
					TEST(FixedArrayTest, SmallObjects) {
 | 
				
			||||||
  // Small object arrays
 | 
					  // Small object arrays
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -46,8 +46,7 @@
 | 
				
			||||||
// You can convert to hexadecimal output rather than decimal output using the
 | 
					// You can convert to hexadecimal output rather than decimal output using the
 | 
				
			||||||
// `Hex` type contained here. To do so, pass `Hex(my_int)` as a parameter to
 | 
					// `Hex` type contained here. To do so, pass `Hex(my_int)` as a parameter to
 | 
				
			||||||
// `StrCat()` or `StrAppend()`. You may specify a minimum hex field width using
 | 
					// `StrCat()` or `StrAppend()`. You may specify a minimum hex field width using
 | 
				
			||||||
// a `PadSpec` enum, so the equivalent of `StringPrintf("%04x", my_int)` is
 | 
					// a `PadSpec` enum.
 | 
				
			||||||
// `absl::StrCat(absl::Hex(my_int, absl::kZeroPad4))`.
 | 
					 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// -----------------------------------------------------------------------------
 | 
					// -----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -45,17 +45,6 @@
 | 
				
			||||||
//   SubstituteAndAppend(&s, "My name is $0 and I am $1 years old.", "Bob", 5);
 | 
					//   SubstituteAndAppend(&s, "My name is $0 and I am $1 years old.", "Bob", 5);
 | 
				
			||||||
//   EXPECT_EQ("Hi. My name is Bob and I am 5 years old.", s);
 | 
					//   EXPECT_EQ("Hi. My name is Bob and I am 5 years old.", s);
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// Differences from `StringPrintf()`:
 | 
					 | 
				
			||||||
//   * The format std::string does not identify the types of arguments. Instead, the
 | 
					 | 
				
			||||||
//     arguments are implicitly converted to strings. See below for a list of
 | 
					 | 
				
			||||||
//     accepted types.
 | 
					 | 
				
			||||||
//   * Substitutions in the format std::string are identified by a '$' followed by a
 | 
					 | 
				
			||||||
//     single digit. You can use arguments out-of-order and use the same
 | 
					 | 
				
			||||||
//     argument multiple times.
 | 
					 | 
				
			||||||
//   * A '$$' sequence in the format std::string means output a literal '$'
 | 
					 | 
				
			||||||
//     character.
 | 
					 | 
				
			||||||
//   * `Substitute()` is significantly faster than `StringPrintf()`. For very
 | 
					 | 
				
			||||||
//     large strings, it may be orders of magnitude faster.
 | 
					 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// Supported types:
 | 
					// Supported types:
 | 
				
			||||||
//   * absl::string_view, std::string, const char* (null is equivalent to "")
 | 
					//   * absl::string_view, std::string, const char* (null is equivalent to "")
 | 
				
			||||||
| 
						 | 
					@ -157,8 +146,7 @@ class Arg {
 | 
				
			||||||
  Arg(bool value)  // NOLINT(runtime/explicit)
 | 
					  Arg(bool value)  // NOLINT(runtime/explicit)
 | 
				
			||||||
      : piece_(value ? "true" : "false") {}
 | 
					      : piece_(value ? "true" : "false") {}
 | 
				
			||||||
  // `void*` values, with the exception of `char*`, are printed as
 | 
					  // `void*` values, with the exception of `char*`, are printed as
 | 
				
			||||||
  // `StringPrintf()` with format "%p": e.g. ("0x<hex value>").
 | 
					  // "0x<hex value>". However, in the case of `nullptr`, "NULL" is printed.
 | 
				
			||||||
  // However, in the case of `nullptr`, "NULL" is printed.
 | 
					 | 
				
			||||||
  Arg(const void* value);  // NOLINT(runtime/explicit)
 | 
					  Arg(const void* value);  // NOLINT(runtime/explicit)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Arg(const Arg&) = delete;
 | 
					  Arg(const Arg&) = delete;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue