//===- StreamWriter.h - Writes bytes and objects to a stream ----*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #ifndef LLVM_DEBUGINFO_MSF_STREAMWRITER_H #define LLVM_DEBUGINFO_MSF_STREAMWRITER_H #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/StringRef.h" #include "llvm/DebugInfo/MSF/MSFError.h" #include "llvm/DebugInfo/MSF/StreamArray.h" #include "llvm/DebugInfo/MSF/StreamRef.h" #include "llvm/Support/Error.h" #include #include namespace llvm { namespace msf { class StreamWriter { public: StreamWriter() = default; explicit StreamWriter(WritableStreamRef Stream); Error writeBytes(ArrayRef Buffer); Error writeInteger(uint8_t Int); Error writeInteger(uint16_t Dest); Error writeInteger(uint32_t Dest); Error writeInteger(uint64_t Dest); Error writeInteger(int8_t Int); Error writeInteger(int16_t Dest); Error writeInteger(int32_t Dest); Error writeInteger(int64_t Dest); Error writeZeroString(StringRef Str); Error writeFixedString(StringRef Str); Error writeStreamRef(ReadableStreamRef Ref); Error writeStreamRef(ReadableStreamRef Ref, uint32_t Size); template Error writeEnum(T Num) { return writeInteger( static_cast::type>(Num)); } template Error writeObject(const T &Obj) { static_assert(!std::is_pointer::value, "writeObject should not be used with pointers, to write " "the pointed-to value dereference the pointer before calling " "writeObject"); return writeBytes( ArrayRef(reinterpret_cast(&Obj), sizeof(T))); } template Error writeArray(ArrayRef Array) { if (Array.empty()) return Error::success(); if (Array.size() > UINT32_MAX / sizeof(T)) return make_error(msf_error_code::insufficient_buffer); return writeBytes( ArrayRef(reinterpret_cast(Array.data()), Array.size() * sizeof(T))); } template Error writeArray(VarStreamArray Array) { return writeStreamRef(Array.getUnderlyingStream()); } template Error writeArray(FixedStreamArray Array) { return writeStreamRef(Array.getUnderlyingStream()); } void setOffset(uint32_t Off) { Offset = Off; } uint32_t getOffset() const { return Offset; } uint32_t getLength() const { return Stream.getLength(); } uint32_t bytesRemaining() const { return getLength() - getOffset(); } private: WritableStreamRef Stream; uint32_t Offset = 0; }; } // end namespace msf } // end namespace llvm #endif // LLVM_DEBUGINFO_MSF_STREAMWRITER_H