aboutsummaryrefslogtreecommitdiff
path: root/src/types.cpp
diff options
context:
space:
mode:
authorgingerBill <gingerBill@users.noreply.github.com>2026-01-29 10:48:05 +0000
committergingerBill <gingerBill@users.noreply.github.com>2026-01-29 10:49:26 +0000
commit07d814d9cf3bf2065e4122dba91817935dca7c60 (patch)
treee19ee510f617a487d8e6391b59bfaf121efd8e36 /src/types.cpp
parent4a7fb4666722b3ff45998c3bc11f03150a2fe53f (diff)
Add `struct #simple` to force a struct to use simple comparison if all of the fields "nearly simply comparable".
Diffstat (limited to 'src/types.cpp')
-rw-r--r--src/types.cpp25
1 files changed, 23 insertions, 2 deletions
diff --git a/src/types.cpp b/src/types.cpp
index 03ff95033..a7f2bfda2 100644
--- a/src/types.cpp
+++ b/src/types.cpp
@@ -163,6 +163,7 @@ struct TypeStruct {
bool is_packed : 1;
bool is_raw_union : 1;
bool is_all_or_none : 1;
+ bool is_simple : 1;
bool is_poly_specialized : 1;
std::atomic<bool> are_offsets_being_processed;
@@ -2708,6 +2709,9 @@ gb_internal bool is_type_simple_compare(Type *t) {
return is_type_simple_compare(t->Matrix.elem);
case Type_Struct:
+ if (t->Struct.is_simple) {
+ return true;
+ }
for_array(i, t->Struct.fields) {
Entity *f = t->Struct.fields[i];
if (!is_type_simple_compare(f->type)) {
@@ -2768,12 +2772,16 @@ gb_internal bool is_type_nearly_simple_compare(Type *t) {
case Type_SoaPointer:
case Type_Proc:
case Type_BitSet:
+ case Type_BitField:
return true;
case Type_Matrix:
return is_type_nearly_simple_compare(t->Matrix.elem);
case Type_Struct:
+ if (t->Struct.is_simple) {
+ return true;
+ }
for_array(i, t->Struct.fields) {
Entity *f = t->Struct.fields[i];
if (!is_type_nearly_simple_compare(f->type)) {
@@ -2795,6 +2803,17 @@ gb_internal bool is_type_nearly_simple_compare(Type *t) {
case Type_SimdVector:
return is_type_nearly_simple_compare(t->SimdVector.elem);
+ case Type_Tuple:
+ if (t->Tuple.variables.count == 1) {
+ return is_type_nearly_simple_compare(t->Tuple.variables[0]->type);
+ }
+ break;
+
+ case Type_Slice:
+ case Type_DynamicArray:
+ case Type_Map:
+ return false;
+
}
return false;
@@ -5110,9 +5129,11 @@ gb_internal gbString write_type_to_string(gbString str, Type *type, bool shortha
str = gb_string_appendc(str, ")");
}
- if (type->Struct.is_packed) str = gb_string_appendc(str, " #packed");
- if (type->Struct.is_raw_union) str = gb_string_appendc(str, " #raw_union");
+ if (type->Struct.is_packed) str = gb_string_appendc(str, " #packed");
+ if (type->Struct.is_raw_union) str = gb_string_appendc(str, " #raw_union");
if (type->Struct.custom_align != 0) str = gb_string_append_fmt(str, " #align %d", cast(int)type->Struct.custom_align);
+ if (type->Struct.is_all_or_none) str = gb_string_appendc(str, " #all_or_none");
+ if (type->Struct.is_simple) str = gb_string_appendc(str, " #simple");
str = gb_string_appendc(str, " {");