summaryrefslogtreecommitdiff
path: root/source/slang/default-file-system.h
diff options
context:
space:
mode:
authorjsmall-nvidia <jsmall@nvidia.com>2018-10-17 11:57:33 -0400
committerGitHub <noreply@github.com>2018-10-17 11:57:33 -0400
commitf9710d50bc675ddba51cc6d94b125ba1549708a8 (patch)
treeaec03343b18248d0751868ee3acc59ec99f8b416 /source/slang/default-file-system.h
parent3e74d39f24fdfaa547ce900be177863e2bfe2dea (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.h93
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