[Demangle] Add prepend functionality to OutputString

Implement the functionallity of prepend, required by D demangler.
Please read discussion https://reviews.llvm.org/D111414 for context.
See also https://reviews.llvm.org/D111947 .

Reviewed By: dblaikie, Geod24

Differential Revision: https://reviews.llvm.org/D111948
This commit is contained in:
Luís Ferreira 2021-10-26 16:23:27 -07:00 committed by David Blaikie
parent ca4ecf811f
commit 2d77b272a8
3 changed files with 40 additions and 0 deletions

View File

@ -95,6 +95,17 @@ public:
OutputBuffer &operator<<(StringView R) { return (*this += R); }
OutputBuffer prepend(StringView R) {
size_t Size = R.size();
grow(Size);
std::memmove(Buffer + Size, Buffer, CurrentPosition);
std::memcpy(Buffer, R.begin(), Size);
CurrentPosition += Size;
return *this;
}
OutputBuffer &operator<<(char C) { return (*this += C); }
OutputBuffer &operator<<(long long N) {

View File

@ -95,6 +95,17 @@ public:
OutputBuffer &operator<<(StringView R) { return (*this += R); }
OutputBuffer prepend(StringView R) {
size_t Size = R.size();
grow(Size);
std::memmove(Buffer + Size, Buffer, CurrentPosition);
std::memcpy(Buffer, R.begin(), Size);
CurrentPosition += Size;
return *this;
}
OutputBuffer &operator<<(char C) { return (*this += C); }
OutputBuffer &operator<<(long long N) {

View File

@ -60,3 +60,21 @@ TEST(OutputBufferTest, Insert) {
std::free(OB.getBuffer());
}
TEST(OutputBufferTest, Prepend) {
OutputBuffer OB;
OB.prepend("n");
EXPECT_EQ("n", toString(OB));
OB << "abc";
OB.prepend("def");
EXPECT_EQ("defnabc", toString(OB));
OB.setCurrentPosition(3);
OB.prepend("abc");
EXPECT_EQ("abcdef", toString(OB));
std::free(OB.getBuffer());
}