1//===-- StreamBuffer.h ------------------------------------------*- C++ -*-===// 2// 3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4// See https://llvm.org/LICENSE.txt for license information. 5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6// 7//===----------------------------------------------------------------------===// 8 9#ifndef LLDB_CORE_STREAMBUFFER_H 10#define LLDB_CORE_STREAMBUFFER_H 11 12#include "lldb/Utility/Stream.h" 13#include "llvm/ADT/SmallVector.h" 14#include <cstdio> 15#include <string> 16 17namespace lldb_private { 18 19template <unsigned N> class StreamBuffer : public Stream { 20public: 21 StreamBuffer() : Stream(0, 4, lldb::eByteOrderBig), m_packet() {} 22 23 StreamBuffer(uint32_t flags, uint32_t addr_size, lldb::ByteOrder byte_order) 24 : Stream(flags, addr_size, byte_order), m_packet() {} 25 26 ~StreamBuffer() override = default; 27 28 void Flush() override { 29 // Nothing to do when flushing a buffer based stream... 30 } 31 32 void Clear() { m_packet.clear(); } 33 34 // Beware, this might not be NULL terminated as you can expect from 35 // StringString as there may be random bits in the llvm::SmallVector. If you 36 // are using this class to create a C string, be sure the call PutChar ('\0') 37 // after you have created your string, or use StreamString. 38 const char *GetData() const { return m_packet.data(); } 39 40 size_t GetSize() const { return m_packet.size(); } 41 42protected: 43 llvm::SmallVector<char, N> m_packet; 44 45 size_t WriteImpl(const void *s, size_t length) override { 46 if (s && length) 47 m_packet.append((const char *)s, ((const char *)s) + length); 48 return length; 49 } 50}; 51 52} // namespace lldb_private 53 54#endif // LLDB_CORE_STREAMBUFFER_H 55