Path: blob/main/contrib/llvm-project/llvm/lib/Support/BinaryStreamRef.cpp
35232 views
//===- BinaryStreamRef.cpp - ----------------------------------------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#include "llvm/Support/BinaryStreamRef.h"9#include "llvm/Support/BinaryByteStream.h"1011using namespace llvm;1213namespace {1415class ArrayRefImpl : public BinaryStream {16public:17ArrayRefImpl(ArrayRef<uint8_t> Data, endianness Endian) : BBS(Data, Endian) {}1819llvm::endianness getEndian() const override { return BBS.getEndian(); }20Error readBytes(uint64_t Offset, uint64_t Size,21ArrayRef<uint8_t> &Buffer) override {22return BBS.readBytes(Offset, Size, Buffer);23}24Error readLongestContiguousChunk(uint64_t Offset,25ArrayRef<uint8_t> &Buffer) override {26return BBS.readLongestContiguousChunk(Offset, Buffer);27}28uint64_t getLength() override { return BBS.getLength(); }2930private:31BinaryByteStream BBS;32};3334class MutableArrayRefImpl : public WritableBinaryStream {35public:36MutableArrayRefImpl(MutableArrayRef<uint8_t> Data, endianness Endian)37: BBS(Data, Endian) {}3839// Inherited via WritableBinaryStream40llvm::endianness getEndian() const override { return BBS.getEndian(); }41Error readBytes(uint64_t Offset, uint64_t Size,42ArrayRef<uint8_t> &Buffer) override {43return BBS.readBytes(Offset, Size, Buffer);44}45Error readLongestContiguousChunk(uint64_t Offset,46ArrayRef<uint8_t> &Buffer) override {47return BBS.readLongestContiguousChunk(Offset, Buffer);48}49uint64_t getLength() override { return BBS.getLength(); }5051Error writeBytes(uint64_t Offset, ArrayRef<uint8_t> Data) override {52return BBS.writeBytes(Offset, Data);53}54Error commit() override { return BBS.commit(); }5556private:57MutableBinaryByteStream BBS;58};59} // namespace6061BinaryStreamRef::BinaryStreamRef(BinaryStream &Stream)62: BinaryStreamRefBase(Stream) {}63BinaryStreamRef::BinaryStreamRef(BinaryStream &Stream, uint64_t Offset,64std::optional<uint64_t> Length)65: BinaryStreamRefBase(Stream, Offset, Length) {}66BinaryStreamRef::BinaryStreamRef(ArrayRef<uint8_t> Data, endianness Endian)67: BinaryStreamRefBase(std::make_shared<ArrayRefImpl>(Data, Endian), 0,68Data.size()) {}69BinaryStreamRef::BinaryStreamRef(StringRef Data, endianness Endian)70: BinaryStreamRef(ArrayRef(Data.bytes_begin(), Data.bytes_end()), Endian) {}7172Error BinaryStreamRef::readBytes(uint64_t Offset, uint64_t Size,73ArrayRef<uint8_t> &Buffer) const {74if (auto EC = checkOffsetForRead(Offset, Size))75return EC;76return BorrowedImpl->readBytes(ViewOffset + Offset, Size, Buffer);77}7879Error BinaryStreamRef::readLongestContiguousChunk(80uint64_t Offset, ArrayRef<uint8_t> &Buffer) const {81if (auto EC = checkOffsetForRead(Offset, 1))82return EC;8384if (auto EC =85BorrowedImpl->readLongestContiguousChunk(ViewOffset + Offset, Buffer))86return EC;87// This StreamRef might refer to a smaller window over a larger stream. In88// that case we will have read out more bytes than we should return, because89// we should not read past the end of the current view.90uint64_t MaxLength = getLength() - Offset;91if (Buffer.size() > MaxLength)92Buffer = Buffer.slice(0, MaxLength);93return Error::success();94}9596WritableBinaryStreamRef::WritableBinaryStreamRef(WritableBinaryStream &Stream)97: BinaryStreamRefBase(Stream) {}9899WritableBinaryStreamRef::WritableBinaryStreamRef(WritableBinaryStream &Stream,100uint64_t Offset,101std::optional<uint64_t> Length)102: BinaryStreamRefBase(Stream, Offset, Length) {}103104WritableBinaryStreamRef::WritableBinaryStreamRef(MutableArrayRef<uint8_t> Data,105endianness Endian)106: BinaryStreamRefBase(std::make_shared<MutableArrayRefImpl>(Data, Endian),1070, Data.size()) {}108109Error WritableBinaryStreamRef::writeBytes(uint64_t Offset,110ArrayRef<uint8_t> Data) const {111if (auto EC = checkOffsetForWrite(Offset, Data.size()))112return EC;113114return BorrowedImpl->writeBytes(ViewOffset + Offset, Data);115}116117WritableBinaryStreamRef::operator BinaryStreamRef() const {118return BinaryStreamRef(*BorrowedImpl, ViewOffset, Length);119}120121/// For buffered streams, commits changes to the backing store.122Error WritableBinaryStreamRef::commit() { return BorrowedImpl->commit(); }123124125