mirror of
https://github.com/RPCS3/llvm.git
synced 2025-01-09 13:41:47 +00:00
Add some helpers for manipulating BinaryStreamRefs.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@303297 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
81c9a2995b
commit
f0bbaf15bf
@ -258,6 +258,8 @@ public:
|
||||
/// \returns the next byte in the stream.
|
||||
uint8_t peek() const;
|
||||
|
||||
Error padToAlignment(uint32_t Align);
|
||||
|
||||
std::pair<BinaryStreamReader, BinaryStreamReader>
|
||||
split(uint32_t Offset) const;
|
||||
|
||||
|
@ -57,16 +57,35 @@ public:
|
||||
return Result;
|
||||
}
|
||||
|
||||
/// Return a new BinaryStreamRef with only the first \p N elements remaining.
|
||||
RefType keep_front(uint32_t N) const {
|
||||
/// Return a new BinaryStreamRef with the first \p N elements removed.
|
||||
RefType drop_back(uint32_t N) const {
|
||||
if (!BorrowedImpl)
|
||||
return RefType();
|
||||
|
||||
N = std::min(N, Length);
|
||||
RefType Result(static_cast<const RefType &>(*this));
|
||||
Result.Length = N;
|
||||
Result.Length -= N;
|
||||
return Result;
|
||||
}
|
||||
|
||||
/// Return a new BinaryStreamRef with only the first \p N elements remaining.
|
||||
RefType keep_front(uint32_t N) const {
|
||||
assert(N <= getLength());
|
||||
return drop_back(getLength() - N);
|
||||
}
|
||||
|
||||
/// Return a new BinaryStreamRef with only the last \p N elements remaining.
|
||||
RefType keep_back(uint32_t N) const {
|
||||
assert(N <= getLength());
|
||||
return drop_front(getLength() - N);
|
||||
}
|
||||
|
||||
/// Return a new BinaryStreamRef with the first and last \p N elements
|
||||
/// removed.
|
||||
RefType drop_symmetric(uint32_t N) const {
|
||||
return drop_front(N).drop_back(N);
|
||||
}
|
||||
|
||||
/// Return a new BinaryStreamRef with the first \p Offset elements removed,
|
||||
/// and retaining exactly \p Len elements.
|
||||
RefType slice(uint32_t Offset, uint32_t Len) const {
|
||||
|
@ -95,6 +95,11 @@ Error BinaryStreamReader::skip(uint32_t Amount) {
|
||||
return Error::success();
|
||||
}
|
||||
|
||||
Error BinaryStreamReader::padToAlignment(uint32_t Align) {
|
||||
uint32_t NewOffset = alignTo(Offset, Align);
|
||||
return skip(NewOffset - Offset);
|
||||
}
|
||||
|
||||
uint8_t BinaryStreamReader::peek() const {
|
||||
ArrayRef<uint8_t> Buffer;
|
||||
auto EC = Stream.readBytes(Offset, 1, Buffer);
|
||||
|
@ -289,6 +289,39 @@ TEST_F(BinaryStreamTest, StreamRefBounds) {
|
||||
}
|
||||
}
|
||||
|
||||
TEST_F(BinaryStreamTest, DropOperations) {
|
||||
std::vector<uint8_t> InputData = {1, 2, 3, 4, 5, 4, 3, 2, 1};
|
||||
auto RefData = makeArrayRef(InputData);
|
||||
initializeInput(InputData, 1);
|
||||
|
||||
ArrayRef<uint8_t> Result;
|
||||
BinaryStreamRef Original(InputData, support::little);
|
||||
ASSERT_EQ(InputData.size(), Original.getLength());
|
||||
|
||||
EXPECT_NO_ERROR(Original.readBytes(0, InputData.size(), Result));
|
||||
EXPECT_EQ(RefData, Result);
|
||||
|
||||
auto Dropped = Original.drop_front(2);
|
||||
EXPECT_NO_ERROR(Dropped.readBytes(0, Dropped.getLength(), Result));
|
||||
EXPECT_EQ(RefData.drop_front(2), Result);
|
||||
|
||||
Dropped = Original.drop_back(2);
|
||||
EXPECT_NO_ERROR(Dropped.readBytes(0, Dropped.getLength(), Result));
|
||||
EXPECT_EQ(RefData.drop_back(2), Result);
|
||||
|
||||
Dropped = Original.keep_front(2);
|
||||
EXPECT_NO_ERROR(Dropped.readBytes(0, Dropped.getLength(), Result));
|
||||
EXPECT_EQ(RefData.take_front(2), Result);
|
||||
|
||||
Dropped = Original.keep_back(2);
|
||||
EXPECT_NO_ERROR(Dropped.readBytes(0, Dropped.getLength(), Result));
|
||||
EXPECT_EQ(RefData.take_back(2), Result);
|
||||
|
||||
Dropped = Original.drop_symmetric(2);
|
||||
EXPECT_NO_ERROR(Dropped.readBytes(0, Dropped.getLength(), Result));
|
||||
EXPECT_EQ(RefData.drop_front(2).drop_back(2), Result);
|
||||
}
|
||||
|
||||
// Test that we can write to a BinaryStream without a StreamWriter.
|
||||
TEST_F(BinaryStreamTest, MutableBinaryByteStreamBounds) {
|
||||
std::vector<uint8_t> InputData = {'T', 'e', 's', 't', '\0'};
|
||||
|
Loading…
Reference in New Issue
Block a user