Changeset View
Changeset View
Standalone View
Standalone View
llvm/lib/Support/BinaryStreamRef.cpp
Show All 15 Lines | |||||
class ArrayRefImpl : public BinaryStream { | class ArrayRefImpl : public BinaryStream { | ||||
public: | public: | ||||
ArrayRefImpl(ArrayRef<uint8_t> Data, endianness Endian) : BBS(Data, Endian) {} | ArrayRefImpl(ArrayRef<uint8_t> Data, endianness Endian) : BBS(Data, Endian) {} | ||||
llvm::support::endianness getEndian() const override { | llvm::support::endianness getEndian() const override { | ||||
return BBS.getEndian(); | return BBS.getEndian(); | ||||
} | } | ||||
Error readBytes(uint32_t Offset, uint32_t Size, | Error readBytes(uint64_t Offset, uint64_t Size, | ||||
ArrayRef<uint8_t> &Buffer) override { | ArrayRef<uint8_t> &Buffer) override { | ||||
return BBS.readBytes(Offset, Size, Buffer); | return BBS.readBytes(Offset, Size, Buffer); | ||||
} | } | ||||
Error readLongestContiguousChunk(uint32_t Offset, | Error readLongestContiguousChunk(uint64_t Offset, | ||||
ArrayRef<uint8_t> &Buffer) override { | ArrayRef<uint8_t> &Buffer) override { | ||||
return BBS.readLongestContiguousChunk(Offset, Buffer); | return BBS.readLongestContiguousChunk(Offset, Buffer); | ||||
} | } | ||||
uint32_t getLength() override { return BBS.getLength(); } | uint64_t getLength() override { return BBS.getLength(); } | ||||
private: | private: | ||||
BinaryByteStream BBS; | BinaryByteStream BBS; | ||||
}; | }; | ||||
class MutableArrayRefImpl : public WritableBinaryStream { | class MutableArrayRefImpl : public WritableBinaryStream { | ||||
public: | public: | ||||
MutableArrayRefImpl(MutableArrayRef<uint8_t> Data, endianness Endian) | MutableArrayRefImpl(MutableArrayRef<uint8_t> Data, endianness Endian) | ||||
: BBS(Data, Endian) {} | : BBS(Data, Endian) {} | ||||
// Inherited via WritableBinaryStream | // Inherited via WritableBinaryStream | ||||
llvm::support::endianness getEndian() const override { | llvm::support::endianness getEndian() const override { | ||||
return BBS.getEndian(); | return BBS.getEndian(); | ||||
} | } | ||||
Error readBytes(uint32_t Offset, uint32_t Size, | Error readBytes(uint64_t Offset, uint64_t Size, | ||||
ArrayRef<uint8_t> &Buffer) override { | ArrayRef<uint8_t> &Buffer) override { | ||||
return BBS.readBytes(Offset, Size, Buffer); | return BBS.readBytes(Offset, Size, Buffer); | ||||
} | } | ||||
Error readLongestContiguousChunk(uint32_t Offset, | Error readLongestContiguousChunk(uint64_t Offset, | ||||
ArrayRef<uint8_t> &Buffer) override { | ArrayRef<uint8_t> &Buffer) override { | ||||
return BBS.readLongestContiguousChunk(Offset, Buffer); | return BBS.readLongestContiguousChunk(Offset, Buffer); | ||||
} | } | ||||
uint32_t getLength() override { return BBS.getLength(); } | uint64_t getLength() override { return BBS.getLength(); } | ||||
Error writeBytes(uint32_t Offset, ArrayRef<uint8_t> Data) override { | Error writeBytes(uint64_t Offset, ArrayRef<uint8_t> Data) override { | ||||
return BBS.writeBytes(Offset, Data); | return BBS.writeBytes(Offset, Data); | ||||
} | } | ||||
Error commit() override { return BBS.commit(); } | Error commit() override { return BBS.commit(); } | ||||
private: | private: | ||||
MutableBinaryByteStream BBS; | MutableBinaryByteStream BBS; | ||||
}; | }; | ||||
} // namespace | } // namespace | ||||
BinaryStreamRef::BinaryStreamRef(BinaryStream &Stream) | BinaryStreamRef::BinaryStreamRef(BinaryStream &Stream) | ||||
: BinaryStreamRefBase(Stream) {} | : BinaryStreamRefBase(Stream) {} | ||||
BinaryStreamRef::BinaryStreamRef(BinaryStream &Stream, uint32_t Offset, | BinaryStreamRef::BinaryStreamRef(BinaryStream &Stream, uint64_t Offset, | ||||
Optional<uint32_t> Length) | Optional<uint64_t> Length) | ||||
: BinaryStreamRefBase(Stream, Offset, Length) {} | : BinaryStreamRefBase(Stream, Offset, Length) {} | ||||
BinaryStreamRef::BinaryStreamRef(ArrayRef<uint8_t> Data, endianness Endian) | BinaryStreamRef::BinaryStreamRef(ArrayRef<uint8_t> Data, endianness Endian) | ||||
: BinaryStreamRefBase(std::make_shared<ArrayRefImpl>(Data, Endian), 0, | : BinaryStreamRefBase(std::make_shared<ArrayRefImpl>(Data, Endian), 0, | ||||
Data.size()) {} | Data.size()) {} | ||||
BinaryStreamRef::BinaryStreamRef(StringRef Data, endianness Endian) | BinaryStreamRef::BinaryStreamRef(StringRef Data, endianness Endian) | ||||
: BinaryStreamRef(makeArrayRef(Data.bytes_begin(), Data.bytes_end()), | : BinaryStreamRef(makeArrayRef(Data.bytes_begin(), Data.bytes_end()), | ||||
Endian) {} | Endian) {} | ||||
Error BinaryStreamRef::readBytes(uint32_t Offset, uint32_t Size, | Error BinaryStreamRef::readBytes(uint64_t Offset, uint64_t Size, | ||||
ArrayRef<uint8_t> &Buffer) const { | ArrayRef<uint8_t> &Buffer) const { | ||||
if (auto EC = checkOffsetForRead(Offset, Size)) | if (auto EC = checkOffsetForRead(Offset, Size)) | ||||
return EC; | return EC; | ||||
return BorrowedImpl->readBytes(ViewOffset + Offset, Size, Buffer); | return BorrowedImpl->readBytes(ViewOffset + Offset, Size, Buffer); | ||||
} | } | ||||
Error BinaryStreamRef::readLongestContiguousChunk( | Error BinaryStreamRef::readLongestContiguousChunk( | ||||
uint32_t Offset, ArrayRef<uint8_t> &Buffer) const { | uint64_t Offset, ArrayRef<uint8_t> &Buffer) const { | ||||
if (auto EC = checkOffsetForRead(Offset, 1)) | if (auto EC = checkOffsetForRead(Offset, 1)) | ||||
return EC; | return EC; | ||||
if (auto EC = | if (auto EC = | ||||
BorrowedImpl->readLongestContiguousChunk(ViewOffset + Offset, Buffer)) | BorrowedImpl->readLongestContiguousChunk(ViewOffset + Offset, Buffer)) | ||||
return EC; | return EC; | ||||
// This StreamRef might refer to a smaller window over a larger stream. In | // This StreamRef might refer to a smaller window over a larger stream. In | ||||
// that case we will have read out more bytes than we should return, because | // that case we will have read out more bytes than we should return, because | ||||
// we should not read past the end of the current view. | // we should not read past the end of the current view. | ||||
uint32_t MaxLength = getLength() - Offset; | uint64_t MaxLength = getLength() - Offset; | ||||
if (Buffer.size() > MaxLength) | if (Buffer.size() > MaxLength) | ||||
Buffer = Buffer.slice(0, MaxLength); | Buffer = Buffer.slice(0, MaxLength); | ||||
return Error::success(); | return Error::success(); | ||||
} | } | ||||
WritableBinaryStreamRef::WritableBinaryStreamRef(WritableBinaryStream &Stream) | WritableBinaryStreamRef::WritableBinaryStreamRef(WritableBinaryStream &Stream) | ||||
: BinaryStreamRefBase(Stream) {} | : BinaryStreamRefBase(Stream) {} | ||||
WritableBinaryStreamRef::WritableBinaryStreamRef(WritableBinaryStream &Stream, | WritableBinaryStreamRef::WritableBinaryStreamRef(WritableBinaryStream &Stream, | ||||
uint32_t Offset, | uint64_t Offset, | ||||
Optional<uint32_t> Length) | Optional<uint64_t> Length) | ||||
: BinaryStreamRefBase(Stream, Offset, Length) {} | : BinaryStreamRefBase(Stream, Offset, Length) {} | ||||
WritableBinaryStreamRef::WritableBinaryStreamRef(MutableArrayRef<uint8_t> Data, | WritableBinaryStreamRef::WritableBinaryStreamRef(MutableArrayRef<uint8_t> Data, | ||||
endianness Endian) | endianness Endian) | ||||
: BinaryStreamRefBase(std::make_shared<MutableArrayRefImpl>(Data, Endian), | : BinaryStreamRefBase(std::make_shared<MutableArrayRefImpl>(Data, Endian), | ||||
0, Data.size()) {} | 0, Data.size()) {} | ||||
Error WritableBinaryStreamRef::writeBytes(uint64_t Offset, | |||||
Error WritableBinaryStreamRef::writeBytes(uint32_t Offset, | |||||
ArrayRef<uint8_t> Data) const { | ArrayRef<uint8_t> Data) const { | ||||
if (auto EC = checkOffsetForWrite(Offset, Data.size())) | if (auto EC = checkOffsetForWrite(Offset, Data.size())) | ||||
return EC; | return EC; | ||||
return BorrowedImpl->writeBytes(ViewOffset + Offset, Data); | return BorrowedImpl->writeBytes(ViewOffset + Offset, Data); | ||||
} | } | ||||
WritableBinaryStreamRef::operator BinaryStreamRef() const { | WritableBinaryStreamRef::operator BinaryStreamRef() const { | ||||
return BinaryStreamRef(*BorrowedImpl, ViewOffset, Length); | return BinaryStreamRef(*BorrowedImpl, ViewOffset, Length); | ||||
} | } | ||||
/// For buffered streams, commits changes to the backing store. | /// For buffered streams, commits changes to the backing store. | ||||
Error WritableBinaryStreamRef::commit() { return BorrowedImpl->commit(); } | Error WritableBinaryStreamRef::commit() { return BorrowedImpl->commit(); } |