diff options
author | Abseil Team <absl-team@google.com> | 2018-09-11T18·22-0700 |
---|---|---|
committer | Gennadiy Civil <misterg@google.com> | 2018-09-11T18·28-0400 |
commit | 02451914b9ad5320f81f56a89f3eef1f8683227c (patch) | |
tree | 99b17555d1d04114190048a9fca05841ac39287e /absl/strings/internal/str_format/bind.h | |
parent | 921fd5cf02ec0d665439a790148d59faa7d4a72c (diff) |
Export of internal Abseil changes.
-- 74c1330e29f1501f2738258faf9ec4564395c90a by Gennadiy Civil <misterg@google.com>: Merging https://github.com/abseil/abseil-cpp/pull/166 PiperOrigin-RevId: 212487256 -- 4ac236574ff8fb3cc1125505292b0bd8c8192da9 by Abseil Team <absl-team@google.com>: Allow c_move to take rvalue containers. PiperOrigin-RevId: 212458618 -- ce94e23984870db666d4c91623ae45b3c60b5b61 by Matt Armstrong <marmstrong@google.com>: Internal change. PiperOrigin-RevId: 212153041 -- 7d88d286821c5839934756dd63a704ed162c49cb by Chris Kennelly <ckennelly@google.com>: Internal change PiperOrigin-RevId: 211982309 -- ddae814b3f609948c20551ea3d80bf51b973f480 by Abseil Team <absl-team@google.com>: Remove unused argument from InlinedVector's AllocatorAndTag This is not part of InlinedVector's public interface. PiperOrigin-RevId: 211973017 -- 051fbfd81648a8da66c62c6603af63038d709c15 by Abseil Team <absl-team@google.com>: Minor performance fix PiperOrigin-RevId: 211820453 -- c205cb2add7400bc8caf2131cb700eea560b7dbf by Laramie Leavitt <lar@google.com>: Make absl::Span a tiny bit more consistent. Add constexper to equivalent absl::Span members as described by http://open-std.org/JTC1/SC22/WG21/docs/papers/2018/p0122r7.pdf * Span constructor use consistently delegate to Span(ptr, length) * Mark more member methods as constexpr. * Use data() and size() consistently in member methods. PiperOrigin-RevId: 211707244 -- 55500c9e941f2f58f4a95c121f32772408866eee by Derek Mauro <dmauro@google.com>: Stop catching polymorphic exception types by value. GCC 8 emits a warning for this. PiperOrigin-RevId: 211684466 GitOrigin-RevId: 74c1330e29f1501f2738258faf9ec4564395c90a Change-Id: Iceab4a5b30ee35d82ef494830262ad29c028cb0a
Diffstat (limited to 'absl/strings/internal/str_format/bind.h')
-rw-r--r-- | absl/strings/internal/str_format/bind.h | 32 |
1 files changed, 20 insertions, 12 deletions
diff --git a/absl/strings/internal/str_format/bind.h b/absl/strings/internal/str_format/bind.h index 9d3d67c63470..a503b19bb675 100644 --- a/absl/strings/internal/str_format/bind.h +++ b/absl/strings/internal/str_format/bind.h @@ -33,13 +33,21 @@ class UntypedFormatSpecImpl { public: UntypedFormatSpecImpl() = delete; - explicit UntypedFormatSpecImpl(string_view s) : str_(s), pc_() {} + explicit UntypedFormatSpecImpl(string_view s) + : data_(s.data()), size_(s.size()) {} explicit UntypedFormatSpecImpl( const str_format_internal::ParsedFormatBase* pc) - : pc_(pc) {} - string_view str() const { return str_; } + : data_(pc), size_(~size_t{}) {} + + bool has_parsed_conversion() const { return size_ == ~size_t{}; } + + string_view str() const { + assert(!has_parsed_conversion()); + return string_view(static_cast<const char*>(data_), size_); + } const str_format_internal::ParsedFormatBase* parsed_conversion() const { - return pc_; + assert(has_parsed_conversion()); + return static_cast<const str_format_internal::ParsedFormatBase*>(data_); } template <typename T> @@ -48,8 +56,8 @@ class UntypedFormatSpecImpl { } private: - string_view str_; - const str_format_internal::ParsedFormatBase* pc_; + const void* data_; + size_t size_; }; template <typename T, typename...> @@ -144,28 +152,28 @@ class Streamable { }; // for testing -std::string Summarize(const UntypedFormatSpecImpl& format, +std::string Summarize(UntypedFormatSpecImpl format, absl::Span<const FormatArgImpl> args); bool BindWithPack(const UnboundConversion* props, absl::Span<const FormatArgImpl> pack, BoundConversion* bound); bool FormatUntyped(FormatRawSinkImpl raw_sink, - const UntypedFormatSpecImpl& format, + UntypedFormatSpecImpl format, absl::Span<const FormatArgImpl> args); -std::string& AppendPack(std::string* out, const UntypedFormatSpecImpl& format, +std::string& AppendPack(std::string* out, UntypedFormatSpecImpl format, absl::Span<const FormatArgImpl> args); -inline std::string FormatPack(const UntypedFormatSpecImpl& format, +inline std::string FormatPack(const UntypedFormatSpecImpl format, absl::Span<const FormatArgImpl> args) { std::string out; AppendPack(&out, format, args); return out; } -int FprintF(std::FILE* output, const UntypedFormatSpecImpl& format, +int FprintF(std::FILE* output, UntypedFormatSpecImpl format, absl::Span<const FormatArgImpl> args); -int SnprintF(char* output, size_t size, const UntypedFormatSpecImpl& format, +int SnprintF(char* output, size_t size, UntypedFormatSpecImpl format, absl::Span<const FormatArgImpl> args); // Returned by Streamed(v). Converts via '%s' to the string created |