PAGED void moveElements()

in rtl/inc/karray.h [442:498]


    PAGED void moveElements(ULONG from, ULONG to, ULONG number)
    {
        if (from == to || number == 0)
        {
            return;
        }
        else if constexpr(__is_trivially_copyable(T))
        {
            memmove(_p + to, _p + from, number * sizeof(T));
        }
        else if (from < to)
        {
            WIN_ASSERT(m_numElements == from + number);

            ULONG delta = to - from;
            ULONG i;

            for (i = to + number; i - 1 >= m_numElements; i--)
            {
                new (wistd::addressof(_p[i - 1])) T(wistd::move(_p[i - delta - 1]));
            }

            for (; i > to; i--)
            {
                _p[i - 1].~T();
                new (wistd::addressof(_p[i - 1])) T(wistd::move(_p[i - delta - 1]));
            }

            for (; i > from; i--)
            {
                _p[i - 1].~T();
            }
        }
        else
        {
            WIN_ASSERT(m_numElements == from + number);

            ULONG delta = from - to;
            ULONG i;

            for (i = to; i < from; i++)
            {
                new (wistd::addressof(_p[i])) T(wistd::move(_p[i + delta]));
            }

            for (; i < to + number; i++)
            {
                _p[i].~T();
                new (wistd::addressof(_p[i])) T(wistd::move(_p[i + delta]));
            }

            for (; i < from + number; i++)
            {
                _p[i].~T();
            }
        }
    }