diff options
Diffstat (limited to 'source/core')
| -rw-r--r-- | source/core/slang-rtti-info.h | 8 | ||||
| -rw-r--r-- | source/core/slang-rtti-util.cpp | 60 |
2 files changed, 67 insertions, 1 deletions
diff --git a/source/core/slang-rtti-info.h b/source/core/slang-rtti-info.h index 01c042511..58e557dd0 100644 --- a/source/core/slang-rtti-info.h +++ b/source/core/slang-rtti-info.h @@ -181,7 +181,7 @@ struct RttiInfo Enum, List, Dictionary, - + Optional, CountOf, }; @@ -296,6 +296,12 @@ SLANG_FORCE_INLINE StructRttiInfo::Flags combine( return StructRttiInfo::Flags(defaultValue) | flags; } +struct OptionalRttiInfo : public RttiInfo +{ + const RttiInfo* m_elementType; + uint32_t m_valueOffset; +}; + struct ListRttiInfo : public RttiInfo { const RttiInfo* m_elementType; diff --git a/source/core/slang-rtti-util.cpp b/source/core/slang-rtti-util.cpp index 92f45a3bf..01571cab1 100644 --- a/source/core/slang-rtti-util.cpp +++ b/source/core/slang-rtti-util.cpp @@ -336,6 +336,7 @@ RttiTypeFuncs RttiUtil::getDefaultTypeFuncs(const RttiInfo* rttiInfo) case RttiInfo::Kind::List: return ListFuncs::getFuncs(); case RttiInfo::Kind::Struct: + case RttiInfo::Kind::Optional: return StructArrayFuncs::getFuncs(); default: break; @@ -556,6 +557,10 @@ static bool _isStructDefault(const StructRttiInfo* type, const void* src) const OtherRttiInfo* otherRttiInfo = static_cast<const OtherRttiInfo*>(rttiInfo); return otherRttiInfo->m_isDefaultFunc && otherRttiInfo->m_isDefaultFunc(rttiInfo, src); } + case RttiInfo::Kind::Optional: + { + return *(const bool*)src == (_getIntDefaultValue(defaultValue) != 0); + } default: { return false; @@ -660,6 +665,11 @@ static bool _isStructDefault(const StructRttiInfo* type, const void* src) return true; } + case RttiInfo::Kind::Optional: + { + const OptionalRttiInfo* optionalRttiInfo = static_cast<const OptionalRttiInfo*>(type); + return canMemCpy(optionalRttiInfo->m_elementType); + } default: { return type->isBuiltIn(); @@ -723,6 +733,11 @@ static bool _isStructDefault(const StructRttiInfo* type, const void* src) return true; } + case RttiInfo::Kind::Optional: + { + const OptionalRttiInfo* optionalRttiInfo = static_cast<const OptionalRttiInfo*>(type); + return canZeroInit(optionalRttiInfo->m_elementType); + } default: { return type->isBuiltIn(); @@ -783,6 +798,11 @@ static bool _isStructDefault(const StructRttiInfo* type, const void* src) } while (structRttiInfo); return false; } + case RttiInfo::Kind::Optional: + { + const OptionalRttiInfo* optionalRttiInfo = static_cast<const OptionalRttiInfo*>(type); + return hasDtor(optionalRttiInfo->m_elementType); + } default: { return !type->isBuiltIn(); @@ -894,6 +914,19 @@ static bool _isStructDefault(const StructRttiInfo* type, const void* src) return; } + case RttiInfo::Kind::Optional: + { + const OptionalRttiInfo* optionalRttiInfo = + static_cast<const OptionalRttiInfo*>(rttiInfo); + ctorArray(typeMap, GetRttiInfo<bool>::get(), dst, stride, count); + ctorArray( + typeMap, + optionalRttiInfo->m_elementType, + dst + optionalRttiInfo->m_valueOffset, + stride, + count); + return; + } } SLANG_ASSERT(!"Unexpected"); @@ -1005,6 +1038,20 @@ static bool _isStructDefault(const StructRttiInfo* type, const void* src) return; } + case RttiInfo::Kind::Optional: + { + const OptionalRttiInfo* optionalRttiInfo = + static_cast<const OptionalRttiInfo*>(rttiInfo); + copyArray(typeMap, GetRttiInfo<bool>::get(), dst, src, stride, count); + copyArray( + typeMap, + optionalRttiInfo->m_elementType, + dst + optionalRttiInfo->m_valueOffset, + src + optionalRttiInfo->m_valueOffset, + stride, + count); + return; + } } SLANG_ASSERT(!"Unexpected"); @@ -1091,6 +1138,19 @@ static bool _isStructDefault(const StructRttiInfo* type, const void* src) return; } + case RttiInfo::Kind::Optional: + { + const OptionalRttiInfo* optionalRttiInfo = + static_cast<const OptionalRttiInfo*>(rttiInfo); + dtorArray(typeMap, GetRttiInfo<bool>::get(), dst, stride, count); + dtorArray( + typeMap, + optionalRttiInfo->m_elementType, + dst + optionalRttiInfo->m_valueOffset, + stride, + count); + return; + } } SLANG_ASSERT(!"Unexpected"); |
