diff options
| author | jsmall-nvidia <jsmall@nvidia.com> | 2022-08-26 20:32:53 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-08-26 20:32:53 -0400 |
| commit | 5c2c2cfc9918bb43225159e67a851e196e17759a (patch) | |
| tree | 216009d02afe9dc17b074fdd394141ef71472268 /source/core/slang-blob.cpp | |
| parent | ef067bef2f2188a4b3c420cbcd8d223874888ed2 (diff) | |
DownstreamCompileOptions using POD types (#2381)
* #include an absolute path didn't work - because paths were taken to always be relative.
* Make DownstreamCompileOptions use POD types.
* CharSliceAllocator -> SliceAllocator
Added SliceConverter
CharSliceCaster -> SliceCaster
* First attempt at zero terminating around blobs.
* Fix clang warning.
* Add SlangTerminatedChars
Make Blob implementations support it.
Make most blobs 'terminated'.
* Fix bug setting up sourceFiles for CommandLineDownstreamCompiler.
* Traffic in TerminatedCharSlice for sourceFiles.
Use ArtifactDesc to generate temporary file names for source.
* Fix typo in testing for shared library/C++.
Diffstat (limited to 'source/core/slang-blob.cpp')
| -rw-r--r-- | source/core/slang-blob.cpp | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/source/core/slang-blob.cpp b/source/core/slang-blob.cpp index 0da8f6292..6cf5214cc 100644 --- a/source/core/slang-blob.cpp +++ b/source/core/slang-blob.cpp @@ -33,6 +33,104 @@ void* BlobBase::castAs(const SlangUUID& guid) return getObject(guid); } +/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! StringBlob !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */ + +void* StringBlob::castAs(const SlangUUID& guid) +{ + if (auto intf = getInterface(guid)) + { + return intf; + } + return getObject(guid); +} + +void* StringBlob::getObject(const Guid& guid) +{ + // Can allow accessing the contained String + if (guid == getTypeGuid()) + { + return this; + } + // Can always be accessed as terminated char* + if (guid == SlangTerminatedChars::getTypeGuid()) + { + return const_cast<char*>(m_string.getBuffer()); + } + return nullptr; +} + +/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! RawBlob !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */ + +void* RawBlob::castAs(const SlangUUID& guid) +{ + if (auto intf = getInterface(guid)) + { + return intf; + } + return getObject(guid); +} + +void* RawBlob::getObject(const Guid& guid) +{ + // If the data has 0 termination, we can return the pointer + if (guid == SlangTerminatedChars::getTypeGuid() && m_data.isTerminated()) + { + return (char*)m_data.getData(); + } + return nullptr; +} + +/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ScopeBlob !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */ + +void* ScopeBlob::castAs(const SlangUUID& guid) +{ + if (auto intf = getInterface(guid)) + { + return intf; + } + if (auto obj = getObject(guid)) + { + return obj; + } + + // If the contained thing is castable, ask it + if (m_castable) + { + return m_castable->castAs(guid); + } + + return nullptr; +} + +/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ListBlob !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */ + +void* ListBlob::castAs(const SlangUUID& guid) +{ + if (auto intf = getInterface(guid)) + { + return intf; + } + return getObject(guid); +} + +void* ListBlob::getObject(const Guid& guid) +{ + // If the data is terminated return the pointer + if (guid == SlangTerminatedChars::getTypeGuid()) + { + const auto count = m_data.getCount(); + if (m_data.getCapacity() > count) + { + auto buf = m_data.getBuffer(); + if (buf[count] == 0) + { + return (char*)buf; + } + } + } + return nullptr; +} + /* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! StaticBlob !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */ SlangResult StaticBlob::queryInterface(SlangUUID const& guid, void** outObject) |
