[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:
parent
ca4ecf811f
commit
2d77b272a8
|
@ -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) {
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue