1d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton//===-- StreamBuffer.h ------------------------------------------*- C++ -*-===//
2d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton//
3d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton//                     The LLVM Compiler Infrastructure
4d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton//
5d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton// This file is distributed under the University of Illinois Open Source
6d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton// License. See LICENSE.TXT for details.
7d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton//
8d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton//===----------------------------------------------------------------------===//
9d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton
10d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton#ifndef liblldb_StreamBuffer_h_
11d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton#define liblldb_StreamBuffer_h_
12d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton
13d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton#include <stdio.h>
14d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton#include <string>
15d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton#include "llvm/ADT/SmallVector.h"
16d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton#include "lldb/Core/Stream.h"
17d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton
18d52d00f4edb746ba458a3e659699160952dc925eGreg Claytonnamespace lldb_private {
19d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton
20d52d00f4edb746ba458a3e659699160952dc925eGreg Claytontemplate <unsigned N>
21d52d00f4edb746ba458a3e659699160952dc925eGreg Claytonclass StreamBuffer : public Stream
22d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton{
23d52d00f4edb746ba458a3e659699160952dc925eGreg Claytonpublic:
24d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton    StreamBuffer () :
25d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton        Stream (0, 4, lldb::eByteOrderBig),
26d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton        m_packet ()
27d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton    {
28d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton    }
29d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton
30d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton
31d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton    StreamBuffer (uint32_t flags,
32d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton                  uint32_t addr_size,
33d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton                  lldb::ByteOrder byte_order) :
34d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton        Stream (flags, addr_size, byte_order),
35d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton        m_packet ()
36d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton    {
37d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton    }
38d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton
39d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton    virtual
40d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton    ~StreamBuffer ()
41d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton    {
42d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton    }
43d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton
44d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton    virtual void
45d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton    Flush ()
46d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton    {
47d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton        // Nothing to do when flushing a buffer based stream...
48d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton    }
49d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton
5036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    virtual size_t
51d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton    Write (const void *s, size_t length)
52d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton    {
53d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton        if (s && length)
54d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton            m_packet.append ((const char *)s, ((const char *)s) + length);
55d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton        return length;
56d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton    }
57d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton
58d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton    void
59d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton    Clear()
60d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton    {
61d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton        m_packet.clear();
62d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton    }
63d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton
64b924eb6c5250a9909dc55ac736d231f7ccae423bGreg Clayton    // Beware, this might not be NULL terminated as you can expect from
65b924eb6c5250a9909dc55ac736d231f7ccae423bGreg Clayton    // StringString as there may be random bits in the llvm::SmallVector. If
66b924eb6c5250a9909dc55ac736d231f7ccae423bGreg Clayton    // you are using this class to create a C string, be sure the call PutChar ('\0')
67b924eb6c5250a9909dc55ac736d231f7ccae423bGreg Clayton    // after you have created your string, or use StreamString.
68d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton    const char *
69d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton    GetData () const
70d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton    {
71d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton        return m_packet.data();
72d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton    }
73d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton
74d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton    size_t
75d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton    GetSize() const
76d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton    {
77d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton        return m_packet.size();
78d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton    }
79d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton
80d52d00f4edb746ba458a3e659699160952dc925eGreg Claytonprotected:
81d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton    llvm::SmallVector<char, N> m_packet;
82d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton
83d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton};
84d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton
85d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton} // namespace lldb_private
86d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton
87d52d00f4edb746ba458a3e659699160952dc925eGreg Clayton#endif  // #ifndef liblldb_StreamBuffer_h_
88