Changeset View
Changeset View
Standalone View
Standalone View
llvm/include/llvm/Support/BinaryByteStream.h
Show All 32 Lines | public: | ||||
BinaryByteStream() = default; | BinaryByteStream() = default; | ||||
BinaryByteStream(ArrayRef<uint8_t> Data, llvm::support::endianness Endian) | BinaryByteStream(ArrayRef<uint8_t> Data, llvm::support::endianness Endian) | ||||
: Endian(Endian), Data(Data) {} | : Endian(Endian), Data(Data) {} | ||||
BinaryByteStream(StringRef Data, llvm::support::endianness Endian) | BinaryByteStream(StringRef Data, llvm::support::endianness Endian) | ||||
: Endian(Endian), Data(Data.bytes_begin(), Data.bytes_end()) {} | : Endian(Endian), Data(Data.bytes_begin(), Data.bytes_end()) {} | ||||
llvm::support::endianness getEndian() const override { return Endian; } | llvm::support::endianness getEndian() const override { return Endian; } | ||||
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 { | ||||
if (auto EC = checkOffsetForRead(Offset, Size)) | if (auto EC = checkOffsetForRead(Offset, Size)) | ||||
return EC; | return EC; | ||||
Buffer = Data.slice(Offset, Size); | Buffer = Data.slice(Offset, Size); | ||||
return Error::success(); | return Error::success(); | ||||
} | } | ||||
Error readLongestContiguousChunk(uint32_t Offset, | Error readLongestContiguousChunk(uint64_t Offset, | ||||
ArrayRef<uint8_t> &Buffer) override { | ArrayRef<uint8_t> &Buffer) override { | ||||
if (auto EC = checkOffsetForRead(Offset, 1)) | if (auto EC = checkOffsetForRead(Offset, 1)) | ||||
return EC; | return EC; | ||||
Buffer = Data.slice(Offset); | Buffer = Data.slice(Offset); | ||||
return Error::success(); | return Error::success(); | ||||
} | } | ||||
uint32_t getLength() override { return Data.size(); } | uint64_t getLength() override { return Data.size(); } | ||||
ArrayRef<uint8_t> data() const { return Data; } | ArrayRef<uint8_t> data() const { return Data; } | ||||
StringRef str() const { | StringRef str() const { | ||||
const char *CharData = reinterpret_cast<const char *>(Data.data()); | const char *CharData = reinterpret_cast<const char *>(Data.data()); | ||||
return StringRef(CharData, Data.size()); | return StringRef(CharData, Data.size()); | ||||
} | } | ||||
Show All 26 Lines | public: | ||||
MutableBinaryByteStream(MutableArrayRef<uint8_t> Data, | MutableBinaryByteStream(MutableArrayRef<uint8_t> Data, | ||||
llvm::support::endianness Endian) | llvm::support::endianness Endian) | ||||
: Data(Data), ImmutableStream(Data, Endian) {} | : Data(Data), ImmutableStream(Data, Endian) {} | ||||
llvm::support::endianness getEndian() const override { | llvm::support::endianness getEndian() const override { | ||||
return ImmutableStream.getEndian(); | return ImmutableStream.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 ImmutableStream.readBytes(Offset, Size, Buffer); | return ImmutableStream.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 ImmutableStream.readLongestContiguousChunk(Offset, Buffer); | return ImmutableStream.readLongestContiguousChunk(Offset, Buffer); | ||||
} | } | ||||
uint32_t getLength() override { return ImmutableStream.getLength(); } | uint64_t getLength() override { return ImmutableStream.getLength(); } | ||||
Error writeBytes(uint32_t Offset, ArrayRef<uint8_t> Buffer) override { | Error writeBytes(uint64_t Offset, ArrayRef<uint8_t> Buffer) override { | ||||
if (Buffer.empty()) | if (Buffer.empty()) | ||||
return Error::success(); | return Error::success(); | ||||
if (auto EC = checkOffsetForWrite(Offset, Buffer.size())) | if (auto EC = checkOffsetForWrite(Offset, Buffer.size())) | ||||
return EC; | return EC; | ||||
uint8_t *DataPtr = const_cast<uint8_t *>(Data.data()); | uint8_t *DataPtr = const_cast<uint8_t *>(Data.data()); | ||||
::memcpy(DataPtr + Offset, Buffer.data(), Buffer.size()); | ::memcpy(DataPtr + Offset, Buffer.data(), Buffer.size()); | ||||
Show All 19 Lines | public: | ||||
AppendingBinaryByteStream() = default; | AppendingBinaryByteStream() = default; | ||||
AppendingBinaryByteStream(llvm::support::endianness Endian) | AppendingBinaryByteStream(llvm::support::endianness Endian) | ||||
: Endian(Endian) {} | : Endian(Endian) {} | ||||
void clear() { Data.clear(); } | void clear() { Data.clear(); } | ||||
llvm::support::endianness getEndian() const override { return Endian; } | llvm::support::endianness getEndian() const override { return Endian; } | ||||
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 { | ||||
if (auto EC = checkOffsetForWrite(Offset, Buffer.size())) | if (auto EC = checkOffsetForWrite(Offset, Buffer.size())) | ||||
return EC; | return EC; | ||||
Buffer = makeArrayRef(Data).slice(Offset, Size); | Buffer = makeArrayRef(Data).slice(Offset, Size); | ||||
return Error::success(); | return Error::success(); | ||||
} | } | ||||
void insert(uint32_t Offset, ArrayRef<uint8_t> Bytes) { | void insert(uint64_t Offset, ArrayRef<uint8_t> Bytes) { | ||||
Data.insert(Data.begin() + Offset, Bytes.begin(), Bytes.end()); | Data.insert(Data.begin() + Offset, Bytes.begin(), Bytes.end()); | ||||
} | } | ||||
Error readLongestContiguousChunk(uint32_t Offset, | Error readLongestContiguousChunk(uint64_t Offset, | ||||
ArrayRef<uint8_t> &Buffer) override { | ArrayRef<uint8_t> &Buffer) override { | ||||
if (auto EC = checkOffsetForWrite(Offset, 1)) | if (auto EC = checkOffsetForWrite(Offset, 1)) | ||||
return EC; | return EC; | ||||
Buffer = makeArrayRef(Data).slice(Offset); | Buffer = makeArrayRef(Data).slice(Offset); | ||||
return Error::success(); | return Error::success(); | ||||
} | } | ||||
uint32_t getLength() override { return Data.size(); } | uint64_t getLength() override { return Data.size(); } | ||||
Error writeBytes(uint32_t Offset, ArrayRef<uint8_t> Buffer) override { | Error writeBytes(uint64_t Offset, ArrayRef<uint8_t> Buffer) override { | ||||
if (Buffer.empty()) | if (Buffer.empty()) | ||||
return Error::success(); | return Error::success(); | ||||
// This is well-defined for any case except where offset is strictly | // This is well-defined for any case except where offset is strictly | ||||
// greater than the current length. If offset is equal to the current | // greater than the current length. If offset is equal to the current | ||||
// length, we can still grow. If offset is beyond the current length, we | // length, we can still grow. If offset is beyond the current length, we | ||||
// would have to decide how to deal with the intermediate uninitialized | // would have to decide how to deal with the intermediate uninitialized | ||||
// bytes. So we punt on that case for simplicity and just say it's an | // bytes. So we punt on that case for simplicity and just say it's an | ||||
// error. | // error. | ||||
if (Offset > getLength()) | if (Offset > getLength()) | ||||
return make_error<BinaryStreamError>(stream_error_code::invalid_offset); | return make_error<BinaryStreamError>(stream_error_code::invalid_offset); | ||||
uint32_t RequiredSize = Offset + Buffer.size(); | uint64_t RequiredSize = Offset + Buffer.size(); | ||||
if (RequiredSize > Data.size()) | if (RequiredSize > Data.size()) | ||||
Data.resize(RequiredSize); | Data.resize(RequiredSize); | ||||
::memcpy(Data.data() + Offset, Buffer.data(), Buffer.size()); | ::memcpy(Data.data() + Offset, Buffer.data(), Buffer.size()); | ||||
return Error::success(); | return Error::success(); | ||||
} | } | ||||
Error commit() override { return Error::success(); } | Error commit() override { return Error::success(); } | ||||
▲ Show 20 Lines • Show All 41 Lines • ▼ Show 20 Lines | public: | ||||
FileBufferByteStream(std::unique_ptr<FileOutputBuffer> Buffer, | FileBufferByteStream(std::unique_ptr<FileOutputBuffer> Buffer, | ||||
llvm::support::endianness Endian) | llvm::support::endianness Endian) | ||||
: Impl(std::move(Buffer), Endian) {} | : Impl(std::move(Buffer), Endian) {} | ||||
llvm::support::endianness getEndian() const override { | llvm::support::endianness getEndian() const override { | ||||
return Impl.getEndian(); | return Impl.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 Impl.readBytes(Offset, Size, Buffer); | return Impl.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 Impl.readLongestContiguousChunk(Offset, Buffer); | return Impl.readLongestContiguousChunk(Offset, Buffer); | ||||
} | } | ||||
uint32_t getLength() override { return Impl.getLength(); } | uint64_t getLength() override { return Impl.getLength(); } | ||||
Error writeBytes(uint32_t Offset, ArrayRef<uint8_t> Data) override { | Error writeBytes(uint64_t Offset, ArrayRef<uint8_t> Data) override { | ||||
return Impl.writeBytes(Offset, Data); | return Impl.writeBytes(Offset, Data); | ||||
} | } | ||||
Error commit() override { return Impl.commit(); } | Error commit() override { return Impl.commit(); } | ||||
/// Returns a pointer to the start of the buffer. | /// Returns a pointer to the start of the buffer. | ||||
uint8_t *getBufferStart() const { return Impl.getBufferStart(); } | uint8_t *getBufferStart() const { return Impl.getBufferStart(); } | ||||
Show All 10 Lines |