From daf381e8535a1f1f1b8a75966a74e7cca63dee89 Mon Sep 17 00:00:00 2001 From: Abseil Team Date: Thu, 16 May 2019 07:40:15 -0700 Subject: Export of internal Abseil changes. -- 6fca451d74e509671f0996e15ea05008f73c9957 by Eric Fiselier : Support vector::reference and ::const_reference in absl::Substitute. PiperOrigin-RevId: 248524270 -- a4b298c74acb8ae0688ed681052593623d8021c7 by Abseil Team : Clarify that a static `SpinLock` using the `LinkerInitialized` constructor is initialized in non-cooperative mode. PiperOrigin-RevId: 248386381 GitOrigin-RevId: 6fca451d74e509671f0996e15ea05008f73c9957 Change-Id: I13d54c2034695e7677170cdc7b86384b7d7d9cb5 --- absl/base/internal/spinlock.h | 6 ++++-- absl/strings/substitute.h | 13 +++++++++++++ absl/strings/substitute_test.cc | 12 ++++++++++++ 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/absl/base/internal/spinlock.h b/absl/base/internal/spinlock.h index 4a316399..940f56af 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 507bc4ff..32dec30b 100644 --- a/absl/strings/substitute.h +++ b/absl/strings/substitute.h @@ -69,6 +69,8 @@ #include #include +#include +#include #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::reference and const_reference require special help to + // convert to `AlphaNum` because it requires two user defined conversions. + template ::value && + (std::is_same::reference>::value || + std::is_same::const_reference>::value)>* = + nullptr> + Arg(T value) // NOLINT(google-explicit-constructor) + : Arg(static_cast(value)) {} + // `void*` values, with the exception of `char*`, are printed as // "0x". 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 f6568906..e27abb17 100644 --- a/absl/strings/substitute_test.cc +++ b/absl/strings/substitute_test.cc @@ -15,6 +15,7 @@ #include "absl/strings/substitute.h" #include +#include #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 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) { -- cgit v1.2.3