diff options
| author | jsmall-nvidia <jsmall@nvidia.com> | 2018-10-17 11:57:33 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-10-17 11:57:33 -0400 |
| commit | f9710d50bc675ddba51cc6d94b125ba1549708a8 (patch) | |
| tree | aec03343b18248d0751868ee3acc59ec99f8b416 /source/slang/default-file-system.h | |
| parent | 3e74d39f24fdfaa547ce900be177863e2bfe2dea (diff) | |
IncludeFileSystem -> DefaultFileSystem (#677)
Improvements in 'singleton'ness of DefaultFileSystem
Made WrapFileSystem a stand alone type - to remove 'odd' aspects of deriving from DefaultFileSystem (such as inheriting getSingleton method/fixing ref counting)
Simplified CompileRequest::loadFile - becauce fileSystemExt is always available.
Diffstat (limited to 'source/slang/default-file-system.h')
| -rw-r--r-- | source/slang/default-file-system.h | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/source/slang/default-file-system.h b/source/slang/default-file-system.h new file mode 100644 index 000000000..62d7cbfc5 --- /dev/null +++ b/source/slang/default-file-system.h @@ -0,0 +1,93 @@ +#ifndef SLANG_DEFAULT_FILE_SYSTEM_H_INCLUDED +#define SLANG_DEFAULT_FILE_SYSTEM_H_INCLUDED + +#include "../../slang.h" +#include "../../slang-com-helper.h" +#include "../../slang-com-ptr.h" + +namespace Slang +{ + +class DefaultFileSystem : public ISlangFileSystemExt +{ +public: + // ISlangUnknown + // override ref counting, as DefaultFileSystem is singleton + SLANG_IUNKNOWN_QUERY_INTERFACE + SLANG_NO_THROW uint32_t SLANG_MCALL addRef() SLANG_OVERRIDE { return 1; } + SLANG_NO_THROW uint32_t SLANG_MCALL release() SLANG_OVERRIDE { return 1; } + + // ISlangFileSystem + virtual SLANG_NO_THROW SlangResult SLANG_MCALL loadFile( + char const* path, + ISlangBlob** outBlob) SLANG_OVERRIDE; + + // ISlangFileSystemExt + virtual SLANG_NO_THROW SlangResult SLANG_MCALL getCanoncialPath( + const char* path, + ISlangBlob** canonicalPathOut) SLANG_OVERRIDE; + + virtual SLANG_NO_THROW SlangResult SLANG_MCALL calcRelativePath( + SlangPathType fromPathType, + const char* fromPath, + const char* path, + ISlangBlob** pathOut) SLANG_OVERRIDE; + + /// Get a default instance + static ISlangFileSystemExt* getSingleton() { return &s_singleton; } + +private: + /// Make so not constructable + DefaultFileSystem() {} + + ISlangUnknown* getInterface(const Guid& guid); + + static DefaultFileSystem s_singleton; +}; + +/* Wraps an ISlangFileSystem, and provides the extra methods required to make a ISlangFileSystemExt +interface, deferring to the contained file system to do reading. + +NOTE! That this behavior is the same as previously in that.... +1) calcRelativePath, just returns the path as processed by the Path:: methods +2) getCanonicalPath, just returns the input path as the 'canonical' path. This will be wrong with a file multiply referenced through paths with .. and or . but +doing it this way means it works as before and requires no new functions. +*/ +class WrapFileSystem : public ISlangFileSystemExt +{ +public: + // ISlangUnknown + SLANG_IUNKNOWN_ALL + + // ISlangFileSystem + virtual SLANG_NO_THROW SlangResult SLANG_MCALL loadFile( + char const* path, + ISlangBlob** outBlob) SLANG_OVERRIDE; + + // ISlangFileSystemExt + virtual SLANG_NO_THROW SlangResult SLANG_MCALL getCanoncialPath( + const char* path, + ISlangBlob** canonicalPathOut) SLANG_OVERRIDE; + + virtual SLANG_NO_THROW SlangResult SLANG_MCALL calcRelativePath( + SlangPathType fromPathType, + const char* fromPath, + const char* path, + ISlangBlob** pathOut) SLANG_OVERRIDE; + + /// Ctor + WrapFileSystem(ISlangFileSystem* fileSystem): + m_fileSystem(fileSystem) + { + } + +protected: + ISlangUnknown* getInterface(const Guid& guid); + + ComPtr<ISlangFileSystem> m_fileSystem; ///< The wrapped file system + uint32_t m_refCount = 0; +}; + +} + +#endif
\ No newline at end of file |
