summaryrefslogtreecommitdiff
path: root/source/compiler-core/slang-artifact-impl.h
diff options
context:
space:
mode:
Diffstat (limited to 'source/compiler-core/slang-artifact-impl.h')
-rw-r--r--source/compiler-core/slang-artifact-impl.h103
1 files changed, 96 insertions, 7 deletions
diff --git a/source/compiler-core/slang-artifact-impl.h b/source/compiler-core/slang-artifact-impl.h
index 35dbe5f98..79aad3b64 100644
--- a/source/compiler-core/slang-artifact-impl.h
+++ b/source/compiler-core/slang-artifact-impl.h
@@ -12,6 +12,89 @@
namespace Slang
{
+/* An adapter such that types which aren't derived from ICastable, can be used as such.
+
+With the following caveats.
+* the interfaces/objects of the adapter are checked *first*, so IUnknown will always be for the adapter
+* assumes when doing a queryInterface on the contained item
+*/
+class UnknownCastableAdapter : public ComBaseObject, public IUnknownCastableAdapter
+{
+public:
+ SLANG_COM_BASE_IUNKNOWN_ALL
+
+ // ICastable
+ SLANG_NO_THROW void* SLANG_MCALL castAs(const Guid& guid) SLANG_OVERRIDE;
+
+ // IUnknownCastableAdapter
+ virtual SLANG_NO_THROW ISlangUnknown* SLANG_MCALL getContained() SLANG_OVERRIDE { return m_contained; }
+
+ UnknownCastableAdapter(ISlangUnknown* unk):
+ m_contained(unk)
+ {
+ SLANG_ASSERT(unk);
+ }
+
+protected:
+ void* getInterface(const Guid& guid);
+ void* getObject(const Guid& guid);
+
+ ComPtr<ISlangUnknown> m_contained;
+
+ // We hold a cache for a single lookup to make things a little faster
+ void* m_found = nullptr;
+ Guid m_foundGuid;
+};
+
+class CastableList : public ComBaseObject, public ICastableList
+{
+public:
+ SLANG_COM_BASE_IUNKNOWN_ALL
+
+ // ICastable
+ SLANG_NO_THROW void* SLANG_MCALL castAs(const Guid& guid) SLANG_OVERRIDE;
+
+ // ICastableList
+ virtual Count SLANG_MCALL getCount() SLANG_OVERRIDE { return m_list.getCount(); }
+ virtual ICastable* SLANG_MCALL getAt(Index i) SLANG_OVERRIDE { return m_list[i]; }
+ virtual void SLANG_MCALL add(ICastable* castable) SLANG_OVERRIDE;
+ virtual void SLANG_MCALL addUnknown(ISlangUnknown* unk) SLANG_OVERRIDE;
+ virtual void SLANG_MCALL removeAt(Index i) SLANG_OVERRIDE;
+ virtual void SLANG_MCALL clear() SLANG_OVERRIDE;
+ virtual Index SLANG_MCALL indexOf(ICastable* castable) SLANG_OVERRIDE;
+ virtual Index SLANG_MCALL indexOfUnknown(ISlangUnknown* unk) SLANG_OVERRIDE;
+ virtual void* SLANG_MCALL find(const Guid& guid) SLANG_OVERRIDE;
+ virtual ICastable* const* SLANG_MCALL getBuffer() SLANG_OVERRIDE { return m_list.getBuffer(); }
+
+ virtual ~CastableList();
+
+protected:
+ void* getInterface(const Guid& guid);
+ void* getObject(const Guid& guid);
+
+ List<ICastable*> m_list;
+};
+
+class LazyCastableList
+{
+public:
+ void add(ICastable* castable);
+ Count getCount() const;
+ void removeAt(Index index);
+ void clear();
+ void clearAndDeallocate();
+ void* find(const Guid& guid);
+ ConstArrayView<ICastable*> getView() const;
+ Index indexOf(ICastable* castable) const;
+ Index indexOfUnknown(ISlangUnknown* unk) const;
+
+ ICastableList* requireList();
+ ICastableList* getList();
+
+protected:
+ ComPtr<ICastable> m_castable;
+};
+
class ArtifactList : public ComBaseObject, public IArtifactList
{
public:
@@ -86,12 +169,15 @@ public:
virtual SLANG_NO_THROW SlangResult SLANG_MCALL loadBlob(Keep keep, ISlangBlob** outBlob) SLANG_OVERRIDE;
virtual SLANG_NO_THROW SlangResult SLANG_MCALL requireFile(Keep keep, IFileArtifactRepresentation** outFileRep) SLANG_OVERRIDE;
virtual SLANG_NO_THROW const char* SLANG_MCALL getName() SLANG_OVERRIDE { return m_name.getBuffer(); }
- virtual SLANG_NO_THROW void* SLANG_MCALL findItemInterface(const Guid& uuid) SLANG_OVERRIDE;
- virtual SLANG_NO_THROW void* SLANG_MCALL findItemObject(const Guid& classGuid) SLANG_OVERRIDE;
- virtual SLANG_NO_THROW void SLANG_MCALL addItem(ISlangUnknown* intf) SLANG_OVERRIDE;
- virtual SLANG_NO_THROW ISlangUnknown* SLANG_MCALL getItemAt(Index i) SLANG_OVERRIDE { return m_items[i]; }
- virtual SLANG_NO_THROW void SLANG_MCALL removeItemAt(Index i) SLANG_OVERRIDE;
- virtual SLANG_NO_THROW Index SLANG_MCALL getItemCount() SLANG_OVERRIDE { return m_items.getCount(); }
+
+ virtual SLANG_NO_THROW void SLANG_MCALL addAssociated(ICastable* castable) SLANG_OVERRIDE;
+ virtual void* SLANG_MCALL SLANG_MCALL findAssociated(const Guid& unk) SLANG_OVERRIDE;
+ virtual ICastableList* SLANG_MCALL getAssociated() SLANG_OVERRIDE;
+
+ virtual SLANG_NO_THROW void SLANG_MCALL addRepresentation(IArtifactRepresentation* rep) SLANG_OVERRIDE;
+ virtual SLANG_NO_THROW void SLANG_MCALL addRepresentationUnknown(ISlangUnknown* rep) SLANG_OVERRIDE;
+ virtual void* SLANG_MCALL SLANG_MCALL findRepresentation(const Guid& guid) SLANG_OVERRIDE;
+ virtual ICastableList* SLANG_MCALL getRepresentations() SLANG_OVERRIDE;
/// Ctor
Artifact(const Desc& desc, const String& name) :
@@ -108,7 +194,10 @@ protected:
String m_name; ///< Name of this artifact
- List<ComPtr<ISlangUnknown>> m_items; ///< Associated items
+ LazyCastableList m_associated; ///< Associated items
+ LazyCastableList m_representations; ///< Representations
+
+ ComPtr<IArtifactList> m_children; ///< The children to this artifact
};
} // namespace Slang