yum-mirror/slang

Making it easier to work with shaders

git clone https://git.yummers.dev/yum-mirror/slang

Theresa FoleyCleanups related to RIFF support (#7041)4c76b2759

master
5.6 KiB222 linesraw
1#ifndef SLANG_CORE_WRITER_H
2#define SLANG_CORE_WRITER_H
3
4#include "slang-com-helper.h"
5#include "slang-com-ptr.h"
6#include "slang-list.h"
7#include "slang-string.h"
8
9#include <mutex>
10
11namespace Slang
12{
13
14class WriterHelper
15{
16public:
17    SLANG_ATTR_PRINTF(2, 3)
18    SlangResult print(const char* format, ...);
19    SlangResult put(const char* text);
20    SlangResult put(const UnownedStringSlice& text);
21    SLANG_FORCE_INLINE SlangResult write(const char* chars, size_t numChars)
22    {
23        return m_writer->write(chars, numChars);
24    }
25    SLANG_FORCE_INLINE void flush() { m_writer->flush(); }
26
27    ISlangWriter* getWriter() const { return m_writer; }
28
29    WriterHelper(ISlangWriter* writer)
30        : m_writer(writer)
31    {
32    }
33
34protected:
35    ISlangWriter* m_writer;
36};
37
38struct WriterFlag
39{
40    enum Enum : uint32_t
41    {
42        IsStatic = 0x1,  ///< Means non ref counted
43        IsConsole = 0x2, ///< True if console
44        IsUnowned = 0x4, ///< True if doesn't own contained type
45        AutoFlush = 0x8, ///< Automatically flushes after every call
46    };
47
48private:
49    WriterFlag() = delete;
50};
51typedef uint32_t WriterFlags;
52
53class BaseWriter : public ISlangWriter, public RefObject
54{
55public:
56    // ISlangUnknown
57    SLANG_REF_OBJECT_IUNKNOWN_QUERY_INTERFACE
58    SLANG_REF_OBJECT_IUNKNOWN_ADD_REF
59    SLANG_NO_THROW uint32_t SLANG_MCALL release() SLANG_OVERRIDE
60    {
61        return (m_flags & WriterFlag::IsStatic) ? (uint32_t)decreaseReference()
62                                                : (uint32_t)releaseReference();
63    }
64
65    // ISlangWriter - default impl
66    SLANG_NO_THROW virtual void SLANG_MCALL flush() SLANG_OVERRIDE {}
67    SLANG_NO_THROW virtual bool SLANG_MCALL isConsole() SLANG_OVERRIDE
68    {
69        return (m_flags & WriterFlag::IsConsole) != 0;
70    }
71    SLANG_NO_THROW virtual SlangResult SLANG_MCALL setMode(SlangWriterMode mode) SLANG_OVERRIDE
72    {
73        SLANG_UNUSED(mode);
74        return SLANG_FAIL;
75    }
76
77    BaseWriter(WriterFlags flags)
78        : m_flags(flags)
79    {
80    }
81
82protected:
83    ISlangUnknown* getInterface(const Guid& guid);
84    WriterFlags m_flags;
85};
86
87/* Implemented the append buffer part of the writer, such that calls to begin/endAppendBuffer are
88 * transformed into appropriate calls to write method */
89class AppendBufferWriter : public BaseWriter
90{
91public:
92    typedef BaseWriter Parent;
93
94    // ISlangWriter default impl for appendBuffer
95    SLANG_NO_THROW char* SLANG_MCALL beginAppendBuffer(size_t maxNumChars) SLANG_OVERRIDE;
96    SLANG_NO_THROW SlangResult SLANG_MCALL endAppendBuffer(char* buffer, size_t numChars)
97        SLANG_OVERRIDE;
98
99    AppendBufferWriter(WriterFlags flags)
100        : Parent(flags)
101    {
102    }
103
104protected:
105    List<char> m_appendBuffer;
106    std::mutex mutex;
107};
108
109class CallbackWriter : public AppendBufferWriter
110{
111public:
112    typedef AppendBufferWriter Parent;
113    // ISlangWriter
114    SLANG_NO_THROW char* SLANG_MCALL beginAppendBuffer(size_t maxNumChars) SLANG_OVERRIDE;
115    SLANG_NO_THROW virtual SlangResult SLANG_MCALL write(const char* chars, size_t numChars)
116        SLANG_OVERRIDE;
117
118    CallbackWriter(SlangDiagnosticCallback callback, const void* data, WriterFlags flags)
119        : Parent(flags), m_callback(callback), m_data(data)
120    {
121    }
122
123protected:
124    SlangDiagnosticCallback m_callback;
125    const void* m_data;
126};
127
128class FileWriter : public AppendBufferWriter
129{
130public:
131    typedef AppendBufferWriter Parent;
132    // ISlangWriter
133    SLANG_NO_THROW virtual SlangResult SLANG_MCALL write(const char* chars, size_t numChars)
134        SLANG_OVERRIDE;
135    SLANG_NO_THROW virtual void SLANG_MCALL flush() SLANG_OVERRIDE;
136    SLANG_NO_THROW virtual SlangResult SLANG_MCALL setMode(SlangWriterMode mode) SLANG_OVERRIDE;
137
138    static bool isFileConsole(FILE* file);
139    static WriterFlags getDefaultFlags(FILE* file)
140    {
141        return isFileConsole(file) ? WriterFlags(WriterFlag::IsConsole) : 0;
142    }
143
144    /// Ctor
145    FileWriter(FILE* file, WriterFlags flags)
146        : Parent(flags | getDefaultFlags(file)), m_file(file)
147    {
148    }
149
150    ///
151    static SlangResult create(
152        const char* filePath,
153        const char* writeOptions,
154        WriterFlags flags,
155        ComPtr<ISlangWriter>& outWriter);
156
157    static SlangResult createBinary(
158        const char* filePath,
159        WriterFlags flags,
160        ComPtr<ISlangWriter>& outWriter)
161    {
162        return create(filePath, "wb", flags, outWriter);
163    }
164    static SlangResult createText(
165        const char* filePath,
166        WriterFlags flags,
167        ComPtr<ISlangWriter>& outWriter)
168    {
169        return create(filePath, "w", flags, outWriter);
170    }
171
172    /// Dtor
173    ~FileWriter();
174
175protected:
176    FILE* m_file;
177};
178
179class StringWriter : public BaseWriter
180{
181public:
182    typedef BaseWriter Parent;
183    // ISlangWriter
184    SLANG_NO_THROW char* SLANG_MCALL beginAppendBuffer(size_t maxNumChars) SLANG_OVERRIDE;
185    SLANG_NO_THROW SlangResult SLANG_MCALL endAppendBuffer(char* buffer, size_t numChars)
186        SLANG_OVERRIDE;
187    SLANG_NO_THROW virtual SlangResult SLANG_MCALL write(const char* chars, size_t numChars)
188        SLANG_OVERRIDE;
189
190    /// Ctor
191    StringWriter(StringBuilder* builder, WriterFlags flags = 0)
192        : Parent(flags), m_builder(builder)
193    {
194    }
195    ~StringWriter() {}
196
197protected:
198    StringBuilder* m_builder;
199};
200
201class NullWriter : public AppendBufferWriter
202{
203public:
204    typedef AppendBufferWriter Parent;
205    // ISlangWriter
206    SLANG_NO_THROW virtual SlangResult SLANG_MCALL write(const char* chars, size_t numChars)
207        SLANG_OVERRIDE
208    {
209        SLANG_UNUSED(chars);
210        SLANG_UNUSED(numChars);
211        return SLANG_OK;
212    }
213    /// Ctor
214    NullWriter(WriterFlags flags)
215        : Parent(flags)
216    {
217    }
218};
219
220} // namespace Slang
221
222#endif // SLANG_TEXT_WRITER_H