diff options
| -rw-r--r-- | source/slang/slang-syntax.cpp | 11 | ||||
| -rw-r--r-- | source/slang/slang-syntax.h | 17 |
2 files changed, 27 insertions, 1 deletions
diff --git a/source/slang/slang-syntax.cpp b/source/slang/slang-syntax.cpp index e41e5517c..d74e3a993 100644 --- a/source/slang/slang-syntax.cpp +++ b/source/slang/slang-syntax.cpp @@ -12,7 +12,7 @@ namespace Slang bool BasicExpressionType::EqualsImpl(Type * type) { - auto basicType = dynamicCast<const BasicExpressionType>(type); + auto basicType = as<BasicExpressionType>(type); return basicType && basicType->baseType == this->baseType; } @@ -85,6 +85,15 @@ bool SyntaxClassBase::isSubClassOfImpl(SyntaxClassBase const& super) const return false; } +NodeBase* _dynamicCastImpl(NodeBase* node, SyntaxClassBase const& toClass) +{ + if(!node) return nullptr; + if(node->getClass().isSubClassOfImpl(toClass)) + return node; + return nullptr; +} + + void Type::accept(IValVisitor* visitor, void* extra) { accept((ITypeVisitor*)visitor, extra); diff --git a/source/slang/slang-syntax.h b/source/slang/slang-syntax.h index 86cc4b902..35c21227c 100644 --- a/source/slang/slang-syntax.h +++ b/source/slang/slang-syntax.h @@ -541,6 +541,23 @@ namespace Slang return SyntaxClass<T>::getClass(); } + NodeBase* _dynamicCastImpl(NodeBase* node, SyntaxClassBase const& toClass); + + template<typename T> + T* dynamicCast(NodeBase* node) + { + return (T*) _dynamicCastImpl(node, getClass<T>()); + } + + template<typename T> + const T* dynamicCast(const NodeBase* node) { return dynamicCast<T>(const_cast<NodeBase*>(node)); } + + template<typename T> + T* as(NodeBase* node) { return dynamicCast<T>(node); } + + template<typename T> + const T* as(const NodeBase* node) { return dynamicCast<T>(const_cast<NodeBase*>(node)); } + struct SubstitutionSet { RefPtr<Substitutions> substitutions; |
