From 875b3b2cdda105c01af9a1330b1cb6a3f1e1b822 Mon Sep 17 00:00:00 2001 From: Alexey Lapshin Date: Mon, 8 Feb 2021 18:11:39 +0300 Subject: [PATCH] [Support] Add reserve() method to the raw_ostream. If resulting size of the output stream is already known, then the space for stream data could be preliminary allocated in some cases. f.e. raw_string_ostream could preallocate the space for the target string(it allows to avoid reallocations during writing into the stream). Differential Revision: https://reviews.llvm.org/D91693 --- llvm/include/llvm/Support/raw_ostream.h | 15 +++++++++++++++ llvm/unittests/Support/raw_ostream_test.cpp | 14 ++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/llvm/include/llvm/Support/raw_ostream.h b/llvm/include/llvm/Support/raw_ostream.h index 7d572fe..201a4a8 100644 --- a/llvm/include/llvm/Support/raw_ostream.h +++ b/llvm/include/llvm/Support/raw_ostream.h @@ -137,6 +137,13 @@ public: // Configuration Interface //===--------------------------------------------------------------------===// + /// If possible, pre-allocate \p ExtraSize bytes for stream data. + /// i.e. it extends internal buffers to keep additional ExtraSize bytes. + /// So that the stream could keep at least tell() + ExtraSize bytes + /// without re-allocations. reserveExtraSpace() does not change + /// the size/data of the stream. + virtual void reserveExtraSpace(uint64_t ExtraSize) {} + /// Set the stream to be buffered, with an automatically determined buffer /// size. void SetBuffered(); @@ -626,6 +633,10 @@ public: flush(); return OS; } + + void reserveExtraSpace(uint64_t ExtraSize) override { + OS.reserve(tell() + ExtraSize); + } }; /// A raw_ostream that writes to an SmallVector or SmallString. This is a @@ -659,6 +670,10 @@ public: /// Return a StringRef for the vector contents. StringRef str() const { return StringRef(OS.data(), OS.size()); } + + void reserveExtraSpace(uint64_t ExtraSize) override { + OS.reserve(tell() + ExtraSize); + } }; /// A raw_ostream that discards all output. diff --git a/llvm/unittests/Support/raw_ostream_test.cpp b/llvm/unittests/Support/raw_ostream_test.cpp index 6488bd7..78fdb04 100644 --- a/llvm/unittests/Support/raw_ostream_test.cpp +++ b/llvm/unittests/Support/raw_ostream_test.cpp @@ -455,4 +455,18 @@ TEST(raw_ostreamTest, flush_tied_to_stream_on_write) { TiedStream << "0"; EXPECT_EQ("acegostuv", TiedToBuffer); } + +TEST(raw_ostreamTest, reserve_stream) { + std::string Str; + raw_string_ostream OS(Str); + OS << "11111111111111111111"; + uint64_t CurrentPos = OS.tell(); + OS.reserveExtraSpace(1000); + EXPECT_TRUE(Str.capacity() >= CurrentPos + 1000); + OS << "hello"; + OS << 1; + OS << 'w' << 'o' << 'r' << 'l' << 'd'; + OS.flush(); + EXPECT_EQ("11111111111111111111hello1world", Str); +} } -- 2.7.4