Beispiel #1
0
        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();
        }
Beispiel #2
0
    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);
    }