summaryrefslogtreecommitdiff
path: root/absl/strings
diff options
context:
space:
mode:
authorGravatar Abseil Team <absl-team@google.com>2018-03-20 21:10:15 -0700
committerGravatar katzdm <katzdm@google.com>2018-03-21 10:51:50 -0400
commit4e2e6c5c0071e6430056a8ef0a6c8a1fe584d8ff (patch)
tree37fb874b61a1ef7dac7cc6efa36de0b2cc2f40d7 /absl/strings
parent506fb4b56a339314fde23802bd749dbc3b3c1c79 (diff)
Changes imported from Abseil "staging" branch:
- 1320147f7597a9490562d439ecea46faa1793a24 Support Hex formatting of pointers without forcing a cast... by Jorg Brown <jorg@google.com> - 13c793d6e14a52063c2d4ee327b6c976631b690e Add support for native WebAssembly llvm backend. by Abseil Team <absl-team@google.com> GitOrigin-RevId: 1320147f7597a9490562d439ecea46faa1793a24 Change-Id: Ibd4dbf288903ab45387932e5b11a28f5accdf166
Diffstat (limited to 'absl/strings')
-rw-r--r--absl/strings/str_cat.h27
-rw-r--r--absl/strings/str_cat_test.cc14
-rw-r--r--absl/strings/substitute_test.cc10
3 files changed, 40 insertions, 11 deletions
diff --git a/absl/strings/str_cat.h b/absl/strings/str_cat.h
index 0c33b6cc..e38369ca 100644
--- a/absl/strings/str_cat.h
+++ b/absl/strings/str_cat.h
@@ -127,21 +127,32 @@ struct Hex {
char fill;
template <typename Int>
- explicit Hex(Int v, PadSpec spec = absl::kNoPad,
- typename std::enable_if<sizeof(Int) == 1>::type* = nullptr)
+ explicit Hex(
+ Int v, PadSpec spec = absl::kNoPad,
+ typename std::enable_if<sizeof(Int) == 1 &&
+ !std::is_pointer<Int>::value>::type* = nullptr)
: Hex(spec, static_cast<uint8_t>(v)) {}
template <typename Int>
- explicit Hex(Int v, PadSpec spec = absl::kNoPad,
- typename std::enable_if<sizeof(Int) == 2>::type* = nullptr)
+ explicit Hex(
+ Int v, PadSpec spec = absl::kNoPad,
+ typename std::enable_if<sizeof(Int) == 2 &&
+ !std::is_pointer<Int>::value>::type* = nullptr)
: Hex(spec, static_cast<uint16_t>(v)) {}
template <typename Int>
- explicit Hex(Int v, PadSpec spec = absl::kNoPad,
- typename std::enable_if<sizeof(Int) == 4>::type* = nullptr)
+ explicit Hex(
+ Int v, PadSpec spec = absl::kNoPad,
+ typename std::enable_if<sizeof(Int) == 4 &&
+ !std::is_pointer<Int>::value>::type* = nullptr)
: Hex(spec, static_cast<uint32_t>(v)) {}
template <typename Int>
- explicit Hex(Int v, PadSpec spec = absl::kNoPad,
- typename std::enable_if<sizeof(Int) == 8>::type* = nullptr)
+ explicit Hex(
+ Int v, PadSpec spec = absl::kNoPad,
+ typename std::enable_if<sizeof(Int) == 8 &&
+ !std::is_pointer<Int>::value>::type* = nullptr)
: Hex(spec, static_cast<uint64_t>(v)) {}
+ template <typename Pointee>
+ explicit Hex(Pointee* v, PadSpec spec = absl::kNoPad)
+ : Hex(spec, reinterpret_cast<uintptr_t>(v)) {}
private:
Hex(PadSpec spec, uint64_t v)
diff --git a/absl/strings/str_cat_test.cc b/absl/strings/str_cat_test.cc
index 710113f8..c5a3526d 100644
--- a/absl/strings/str_cat_test.cc
+++ b/absl/strings/str_cat_test.cc
@@ -234,7 +234,7 @@ TEST(StrCat, CustomAllocator) {
TEST(StrCat, MaxArgs) {
std::string result;
- // Test 10 up to 26 arguments, the current maximum
+ // Test 10 up to 26 arguments, the old maximum
result = absl::StrCat(1, 2, 3, 4, 5, 6, 7, 8, 9, "a");
EXPECT_EQ(result, "123456789a");
result = absl::StrCat(1, 2, 3, 4, 5, 6, 7, 8, 9, "a", "b");
@@ -469,6 +469,12 @@ void CheckHexDec64(uint64_t v) {
long long llv = static_cast<long long>(ullv); // NOLINT(runtime/int)
CheckDec(llv, "%lld", "%0*lld", "%*lld");
+
+ if (sizeof(v) == sizeof(&v)) {
+ auto uintptr = static_cast<uintptr_t>(v);
+ void* ptr = reinterpret_cast<void*>(uintptr);
+ CheckHex(ptr, "%llx", "%0*llx", "%*llx");
+ }
}
void CheckHexDec32(uint32_t uv) {
@@ -476,6 +482,12 @@ void CheckHexDec32(uint32_t uv) {
CheckDec(uv, "%u", "%0*u", "%*u");
int32_t v = static_cast<int32_t>(uv);
CheckDec(v, "%d", "%0*d", "%*d");
+
+ if (sizeof(v) == sizeof(&v)) {
+ auto uintptr = static_cast<uintptr_t>(v);
+ void* ptr = reinterpret_cast<void*>(uintptr);
+ CheckHex(ptr, "%llx", "%0*llx", "%*llx");
+ }
}
void CheckAll(uint64_t v) {
diff --git a/absl/strings/substitute_test.cc b/absl/strings/substitute_test.cc
index a6d7d7b0..7c9af6b2 100644
--- a/absl/strings/substitute_test.cc
+++ b/absl/strings/substitute_test.cc
@@ -46,8 +46,14 @@ TEST(SubstituteTest, Substitute) {
// Pointer.
const int* int_p = reinterpret_cast<const int*>(0x12345);
std::string str = absl::Substitute("$0", int_p);
- EXPECT_EQ(absl::StrCat("0x", absl::Hex(reinterpret_cast<intptr_t>(int_p))),
- str);
+ EXPECT_EQ(absl::StrCat("0x", absl::Hex(int_p)), str);
+
+ // Volatile Pointer.
+ // Like C++ streamed I/O, such pointers implicitly become bool
+ volatile int vol = 237;
+ volatile int *volatile volptr = &vol;
+ str = absl::Substitute("$0", volptr);
+ EXPECT_EQ("true", str);
// null is special. StrCat prints 0x0. Substitute prints NULL.
const uint64_t* null_p = nullptr;