public static void ClusterSort(NativeArray <Fragment> fragments, NativeArray <float> distances) { if (fragments.Length == 0) { return; } NativeArray <Element> elements = new NativeArray <Element>(fragments.Length, Allocator.Persistent, NativeArrayOptions.UninitializedMemory); Element * elementsPtr = (Element *)elements.GetUnsafePtr(); Fragment *fragmentsPtr = (Fragment *)fragments.GetUnsafePtr(); float * distancePtr = (float *)distances.GetUnsafePtr(); Element newElement; newElement.sign = 0; newElement.policy = new Fragment(); newElement.leftValue = -1; newElement.rightValue = -1; for (int i = 0; i < elements.Length; ++i) { newElement.sign = distancePtr[i]; newElement.policy = fragmentsPtr[i]; elementsPtr[i] = newElement; } for (int i = 1; i < fragments.Length; ++i) { int currentIndex = 0; STARTFIND: Element * currentIndexValue = elementsPtr + currentIndex; if ((elementsPtr + i)->sign < currentIndexValue->sign) { if (currentIndexValue->leftValue < 0) { currentIndexValue->leftValue = i; } else { currentIndex = currentIndexValue->leftValue; goto STARTFIND; } } else { if (currentIndexValue->rightValue < 0) { currentIndexValue->rightValue = i; } else { currentIndex = currentIndexValue->rightValue; goto STARTFIND; } } } int start = 0; Iterate(0, ref start, elements, fragments); elements.Dispose(); }
static int foo(int n) { Element *root = null; for (int i = 0; i < n; i++) { byte * pb = stackalloc byte[16]; Element *p = (Element *)pb; p->Value = i; p->Next = root; root = p; } int sum = 0; while (root != null) { sum += root->Value; root = root->Next; } return(sum); }