1+ using System ;
12using System . Collections . Generic ;
23using System . Diagnostics . CodeAnalysis ;
34using System . Linq ;
@@ -43,7 +44,7 @@ private static string GenerateIterIteratorInvokers(int i)
4344 public static void Iter<{{ Generator . TypeParameters [ i ] }} >(Iter it, {{ Generator . GetCallbackType ( callback , i ) }} callback)
4445 {
4546 Ecs.TableLock(it);
46- callback(it, {{ Generator . GetCallbackArguments ( i , callback ) }} );
47+ callback(it, {{ Generator . GetCallbackArguments ( callback , i ) }} );
4748 Ecs.TableUnlock(it);
4849 }
4950 """ ) ;
@@ -74,19 +75,45 @@ private static string GenerateEachIteratorInvokers(int i)
7475 {
7576 {{ Generator . GetCallbackCountVariable ( callback ) }}
7677
77- {{ Generator . IterPointerVariables [ i ] }}
78- {{ Generator . IterStepVariables [ i ] }}
78+ {{ Generator . FieldDataVariables [ i ] }}
79+ IterationTechnique flags = it.GetIterationTechnique( {{ i + 1 }} );
7980
8081 Ecs.TableLock(it);
81-
82- for (int i = 0; i < count; i++, {{ Generator . IterPointerIncrements [ i ] }} )
83- callback({{ Generator . GetCallbackSteppedArguments ( i , callback ) }} );
82+
83+ if ({{ Generator . ContainsReferenceTypes [ i ] }} )
84+ {
85+ if (flags == IterationTechnique.None)
86+ {{ IterationTechnique . Managed }} (it, count, callback, {{ Generator . FieldDataRefs [ i ] }} );
87+ else if (flags == IterationTechnique.Shared)
88+ {{ IterationTechnique . SharedManaged }} (it, count, callback, {{ Generator . FieldDataRefs [ i ] }} );
89+ else if (flags == IterationTechnique.Sparse)
90+ {{ IterationTechnique . SparseManaged }} (it, count, callback, {{ Generator . FieldDataRefs [ i ] }} );
91+ else if (flags == (IterationTechnique.Sparse | IterationTechnique.Shared))
92+ {{ IterationTechnique . SparseSharedManaged }} (it, count, callback, {{ Generator . FieldDataRefs [ i ] }} );
93+ }
94+ else
95+ {
96+ if (flags == IterationTechnique.None)
97+ {{ IterationTechnique . Unmanaged }} (it, count, callback, {{ Generator . FieldDataRefs [ i ] }} );
98+ else if (flags == IterationTechnique.Shared)
99+ {{ IterationTechnique . SharedUnmanaged }} (it, count, callback, {{ Generator . FieldDataRefs [ i ] }} );
100+ else if (flags == IterationTechnique.Sparse)
101+ {{ IterationTechnique . SparseUnmanaged }} (it, count, callback, {{ Generator . FieldDataRefs [ i ] }} );
102+ else if (flags == (IterationTechnique.Sparse | IterationTechnique.Shared))
103+ {{ IterationTechnique . SparseSharedUnmanaged }} (it, count, callback, {{ Generator . FieldDataRefs [ i ] }} );
104+ }
84105
85106 Ecs.TableUnlock(it);
107+
108+ return;
109+
110+ {{ GenerateEachInvokerIterators ( callback , i ) }}
86111 }
87112 """ ) ;
88113
89114 return $$ """
115+ using System;
116+ using System.Runtime.CompilerServices;
90117 using Flecs.NET.Utilities;
91118 using static Flecs.NET.Bindings.flecs;
92119
@@ -112,29 +139,47 @@ private static string GenerateFindIteratorInvokers(int i)
112139 {
113140 {{ Generator . GetCallbackCountVariable ( callback ) }}
114141
115- {{ Generator . IterPointerVariables [ i ] }}
116- {{ Generator . IterStepVariables [ i ] }}
142+ {{ Generator . FieldDataVariables [ i ] }}
143+ IterationTechnique flags = it.GetIterationTechnique( {{ i + 1 }} );
117144
118145 Ecs.TableLock(it);
119146
120147 Entity result = default;
121-
122- for (int i = 0; i < count; i++, {{ Generator . IterPointerIncrements [ i ] }} )
148+
149+ if ( {{ Generator . ContainsReferenceTypes [ i ] }} )
123150 {
124- if (!callback({{ Generator . GetCallbackSteppedArguments ( i , callback ) }} ))
125- continue;
126-
127- result = new Entity(it.Handle->world, it.Handle->entities[i]);
128- break;
151+ if (flags == IterationTechnique.None)
152+ result = {{ IterationTechnique . Managed }} (it, count, callback, {{ Generator . FieldDataRefs [ i ] }} );
153+ else if (flags == IterationTechnique.Shared)
154+ result = {{ IterationTechnique . SharedManaged }} (it, count, callback, {{ Generator . FieldDataRefs [ i ] }} );
155+ else if (flags == IterationTechnique.Sparse)
156+ result = {{ IterationTechnique . SparseManaged }} (it, count, callback, {{ Generator . FieldDataRefs [ i ] }} );
157+ else if (flags == (IterationTechnique.Sparse | IterationTechnique.Shared))
158+ result = {{ IterationTechnique . SparseSharedManaged }} (it, count, callback, {{ Generator . FieldDataRefs [ i ] }} );
159+ }
160+ else
161+ {
162+ if (flags == IterationTechnique.None)
163+ result = {{ IterationTechnique . Unmanaged }} (it, count, callback, {{ Generator . FieldDataRefs [ i ] }} );
164+ else if (flags == IterationTechnique.Shared)
165+ result = {{ IterationTechnique . SharedUnmanaged }} (it, count, callback, {{ Generator . FieldDataRefs [ i ] }} );
166+ else if (flags == IterationTechnique.Sparse)
167+ result = {{ IterationTechnique . SparseUnmanaged }} (it, count, callback, {{ Generator . FieldDataRefs [ i ] }} );
168+ else if (flags == (IterationTechnique.Sparse | IterationTechnique.Shared))
169+ result = {{ IterationTechnique . SparseSharedUnmanaged }} (it, count, callback, {{ Generator . FieldDataRefs [ i ] }} );
129170 }
130171
131172 Ecs.TableUnlock(it);
132173
133174 return result;
175+
176+ {{ GenerateFindInvokerIterators ( callback , i ) }}
134177 }
135178 """ ) ;
136179
137180 return $$ """
181+ using System;
182+ using System.Runtime.CompilerServices;
138183 using Flecs.NET.Utilities;
139184 using static Flecs.NET.Bindings.flecs;
140185
@@ -147,6 +192,39 @@ public static unsafe partial class Invoker
147192 """ ;
148193 }
149194
195+ private static string GenerateEachInvokerIterators ( Callback callback , int i )
196+ {
197+ IEnumerable < string > invokerIterators = Enum . GetValues ( typeof ( IterationTechnique ) ) . Cast < IterationTechnique > ( ) . Select ( ( IterationTechnique iterationTechnique ) => $$ """
198+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
199+ static void {{ iterationTechnique }} (Iter it, int count, {{ Generator . GetCallbackType ( callback , i ) }} callback, {{ Generator . FieldDataParameters [ i ] }} )
200+ {
201+ for (int i = 0; i < count; i++)
202+ callback({{ Generator . GetCallbackArguments ( callback , iterationTechnique , i ) }} );
203+ }
204+ """ ) ;
205+
206+ return string . Join ( Separator . DoubleNewLine , invokerIterators ) ;
207+ }
208+
209+ private static string GenerateFindInvokerIterators ( Callback callback , int i )
210+ {
211+ IEnumerable < string > invokerIterators = Enum . GetValues ( typeof ( IterationTechnique ) ) . Cast < IterationTechnique > ( ) . Select ( ( IterationTechnique iterationTechnique ) => $$ """
212+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
213+ static Entity {{ iterationTechnique }} (Iter it, int count, {{ Generator . GetCallbackType ( callback , i ) }} callback, {{ Generator . FieldDataParameters [ i ] }} )
214+ {
215+ for (int i = 0; i < count; i++)
216+ {
217+ if (callback({{ Generator . GetCallbackArguments ( callback , iterationTechnique , i ) }} ))
218+ return new Entity(it.Handle->world, it.Handle->entities[i]);
219+ }
220+
221+ return default;
222+ }
223+ """ ) ;
224+
225+ return string . Join ( Separator . DoubleNewLine , invokerIterators ) ;
226+ }
227+
150228 private static string GenerateIterIterableInvokers ( int i )
151229 {
152230 IEnumerable < string > invokers = Generator . CallbacksIter . Select ( ( Callback callback ) => $$ """
@@ -279,7 +357,7 @@ public static string GenerateFetchComponentInvokers(int i)
279357 bool hasComponents = Ecs.GetPointers<{{ Generator . TypeParameters [ i ] }} >(world, entity, record, table, pointers);
280358
281359 if (hasComponents)
282- callback({{ Generator . GetCallbackArguments ( i , callback ) }} );
360+ callback({{ Generator . GetCallbackArguments ( callback , i ) }} );
283361
284362 ecs_{{ Generator . GetInvokerName ( callback ) . ToLower ( ) }} _end(record);
285363
@@ -347,7 +425,7 @@ public static string GenerateFetchComponentInvokers(int i)
347425 Ecs.EnsurePointers<{{ Generator . TypeParameters [ i ] }} >(world, entity, pointers);
348426 }
349427
350- callback({{ Generator . GetCallbackArguments ( i , callback ) }} );
428+ callback({{ Generator . GetCallbackArguments ( callback , i ) }} );
351429
352430 if (!world.IsDeferred())
353431 Ecs.TableUnlock(world, table);
0 commit comments