about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAbseil Team <absl-team@google.com>2019-05-16T14·40-0700
committerAndy Soffer <asoffer@google.com>2019-05-16T19·48-0400
commitdaf381e8535a1f1f1b8a75966a74e7cca63dee89 (patch)
treed2914ddce7cd62d2e9696e5448dd40884c4d3c26
parentfa00c321073c7ea40a4fc3dfc8a06309eae3d025 (diff)
Export of internal Abseil changes.
--
6fca451d74e509671f0996e15ea05008f73c9957 by Eric Fiselier <ericwf@google.com>:

Support vector<bool>::reference and ::const_reference
in absl::Substitute.

PiperOrigin-RevId: 248524270

--
a4b298c74acb8ae0688ed681052593623d8021c7 by Abseil Team <absl-team@google.com>:

Clarify that a static `SpinLock` using the `LinkerInitialized` constructor is
initialized in non-cooperative mode.

PiperOrigin-RevId: 248386381
GitOrigin-RevId: 6fca451d74e509671f0996e15ea05008f73c9957
Change-Id: I13d54c2034695e7677170cdc7b86384b7d7d9cb5
-rw-r--r--absl/base/internal/spinlock.h6
-rw-r--r--absl/strings/substitute.h13
-rw-r--r--absl/strings/substitute_test.cc12
3 files changed, 29 insertions, 2 deletions
diff --git a/absl/base/internal/spinlock.h b/absl/base/internal/spinlock.h
index 4a31639975e9..940f56af39c8 100644
--- a/absl/base/internal/spinlock.h
+++ b/absl/base/internal/spinlock.h
@@ -57,8 +57,10 @@ class LOCKABLE SpinLock {
   //
   //    static SpinLock lock(base_internal::kLinkerInitialized);
   //
-  // When intialized using this constructor, we depend on the fact
-  // that the linker has already initialized the memory appropriately.
+  // When initialized using this constructor, we depend on the fact
+  // that the linker has already initialized the memory appropriately. The lock
+  // is initialized in non-cooperative mode.
+  //
   // A SpinLock constructed like this can be freely used from global
   // initializers without worrying about the order in which global
   // initializers run.
diff --git a/absl/strings/substitute.h b/absl/strings/substitute.h
index 507bc4ff295f..32dec30b63a0 100644
--- a/absl/strings/substitute.h
+++ b/absl/strings/substitute.h
@@ -69,6 +69,8 @@
 
 #include <cstring>
 #include <string>
+#include <type_traits>
+#include <vector>
 
 #include "absl/base/macros.h"
 #include "absl/base/port.h"
@@ -151,6 +153,17 @@ class Arg {
   Arg(Hex hex);  // NOLINT(runtime/explicit)
   Arg(Dec dec);  // NOLINT(runtime/explicit)
 
+  // vector<bool>::reference and const_reference require special help to
+  // convert to `AlphaNum` because it requires two user defined conversions.
+  template <typename T,
+            absl::enable_if_t<
+                std::is_class<T>::value &&
+                (std::is_same<T, std::vector<bool>::reference>::value ||
+                 std::is_same<T, std::vector<bool>::const_reference>::value)>* =
+                nullptr>
+  Arg(T value)  // NOLINT(google-explicit-constructor)
+      : Arg(static_cast<bool>(value)) {}
+
   // `void*` values, with the exception of `char*`, are printed as
   // "0x<hex value>". However, in the case of `nullptr`, "NULL" is printed.
   Arg(const void* value);  // NOLINT(runtime/explicit)
diff --git a/absl/strings/substitute_test.cc b/absl/strings/substitute_test.cc
index f6568906ce64..e27abb177274 100644
--- a/absl/strings/substitute_test.cc
+++ b/absl/strings/substitute_test.cc
@@ -15,6 +15,7 @@
 #include "absl/strings/substitute.h"
 
 #include <cstdint>
+#include <vector>
 
 #include "gtest/gtest.h"
 #include "absl/strings/str_cat.h"
@@ -172,6 +173,17 @@ TEST(SubstituteTest, SubstituteAndAppend) {
   EXPECT_EQ("a b c d e f g h i j", str);
 }
 
+TEST(SubstituteTest, VectorBoolRef) {
+  std::vector<bool> v = {true, false};
+  const auto& cv = v;
+  EXPECT_EQ("true false true false",
+            absl::Substitute("$0 $1 $2 $3", v[0], v[1], cv[0], cv[1]));
+
+  std::string str = "Logic be like: ";
+  absl::SubstituteAndAppend(&str, "$0 $1 $2 $3", v[0], v[1], cv[0], cv[1]);
+  EXPECT_EQ("Logic be like: true false true false", str);
+}
+
 #ifdef GTEST_HAS_DEATH_TEST
 
 TEST(SubstituteDeathTest, SubstituteDeath) {