LLVM  4.0.0
StreamWriter.h
Go to the documentation of this file.
1 //===- StreamWriter.h - Writes bytes and objects to a stream ----*- C++ -*-===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #ifndef LLVM_DEBUGINFO_MSF_STREAMWRITER_H
11 #define LLVM_DEBUGINFO_MSF_STREAMWRITER_H
12 
13 #include "llvm/ADT/ArrayRef.h"
14 #include "llvm/ADT/StringRef.h"
18 #include "llvm/Support/Error.h"
19 #include <cstdint>
20 #include <type_traits>
21 
22 namespace llvm {
23 namespace msf {
24 
25 class StreamWriter {
26 public:
27  StreamWriter() = default;
28  explicit StreamWriter(WritableStreamRef Stream);
29 
31  Error writeInteger(uint8_t Int);
32  Error writeInteger(uint16_t Dest);
34  Error writeInteger(uint64_t Dest);
35  Error writeInteger(int8_t Int);
36  Error writeInteger(int16_t Dest);
37  Error writeInteger(int32_t Dest);
38  Error writeInteger(int64_t Dest);
43 
44  template <typename T> Error writeEnum(T Num) {
45  return writeInteger(
46  static_cast<typename std::underlying_type<T>::type>(Num));
47  }
48 
49  template <typename T> Error writeObject(const T &Obj) {
50  static_assert(!std::is_pointer<T>::value,
51  "writeObject should not be used with pointers, to write "
52  "the pointed-to value dereference the pointer before calling "
53  "writeObject");
54  return writeBytes(
55  ArrayRef<uint8_t>(reinterpret_cast<const uint8_t *>(&Obj), sizeof(T)));
56  }
57 
58  template <typename T> Error writeArray(ArrayRef<T> Array) {
59  if (Array.empty())
60  return Error::success();
61 
62  if (Array.size() > UINT32_MAX / sizeof(T))
63  return make_error<MSFError>(msf_error_code::insufficient_buffer);
64 
65  return writeBytes(
66  ArrayRef<uint8_t>(reinterpret_cast<const uint8_t *>(Array.data()),
67  Array.size() * sizeof(T)));
68  }
69 
70  template <typename T, typename U>
72  return writeStreamRef(Array.getUnderlyingStream());
73  }
74 
75  template <typename T> Error writeArray(FixedStreamArray<T> Array) {
76  return writeStreamRef(Array.getUnderlyingStream());
77  }
78 
79  void setOffset(uint32_t Off) { Offset = Off; }
80  uint32_t getOffset() const { return Offset; }
81  uint32_t getLength() const { return Stream.getLength(); }
82  uint32_t bytesRemaining() const { return getLength() - getOffset(); }
83 
84 private:
85  WritableStreamRef Stream;
86  uint32_t Offset = 0;
87 };
88 
89 } // end namespace msf
90 } // end namespace llvm
91 
92 #endif // LLVM_DEBUGINFO_MSF_STREAMWRITER_H
void setOffset(uint32_t Off)
Definition: StreamWriter.h:79
Error writeZeroString(StringRef Str)
Error writeArray(FixedStreamArray< T > Array)
Definition: StreamWriter.h:75
Error writeFixedString(StringRef Str)
Error writeArray(VarStreamArray< T, U > Array)
Definition: StreamWriter.h:71
Error writeStreamRef(ReadableStreamRef Ref)
Error writeObject(const T &Obj)
Definition: StreamWriter.h:49
#define T
ReadableStreamRef getUnderlyingStream() const
Definition: StreamArray.h:245
size_t size() const
size - Get the array size.
Definition: ArrayRef.h:141
Error writeBytes(ArrayRef< uint8_t > Buffer)
ReadableStreamRef getUnderlyingStream() const
Definition: StreamArray.h:104
uint32_t getLength() const
Definition: StreamRef.h:29
bool empty() const
empty - Check if the array is empty.
Definition: ArrayRef.h:136
Error writeInteger(uint8_t Int)
Error writeArray(ArrayRef< T > Array)
Definition: StreamWriter.h:58
static ErrorSuccess success()
Create a success value.
uint32_t getOffset() const
Definition: StreamWriter.h:80
uint32_t getLength() const
Definition: StreamWriter.h:81
Error writeEnum(T Num)
Definition: StreamWriter.h:44
Lightweight error class with error context and mandatory checking.
uint32_t bytesRemaining() const
Definition: StreamWriter.h:82
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:47
const T * data() const
Definition: ArrayRef.h:138