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