summaryrefslogtreecommitdiffstats
path: root/source/core
diff options
context:
space:
mode:
Diffstat (limited to 'source/core')
-rw-r--r--source/core/slang-rtti-info.h8
-rw-r--r--source/core/slang-rtti-util.cpp60
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");