#ifndef PASTELSYS_LIST_SPLICE_HPP
#define PASTELSYS_LIST_SPLICE_HPP
#include "pastel/sys/list.h"
namespace Pastel
{
    template <
        typename Settings,
        template <typename> class Customization>
    List<Settings, Customization>& 
        List<Settings, Customization>::splice(
        const ConstIterator& to,
        List& fromSet,
        const ConstIterator& begin,
        const ConstIterator& end)
    {
        integer count = 0;
        if (this != &fromSet)
        {
            count = std::distance(begin, end);
        }
        return splice(to, fromSet, begin, end, count);
    }
    template <
        typename Settings,
        template <typename> class Customization>
    List<Settings, Customization>& 
        List<Settings, Customization>::splice(
        const ConstIterator& to,
        List& fromSet,
        const ConstIterator& begin,
        const ConstIterator& end,
        integer count)
    {
        ASSERT_OP(count, >=, 0);
        Node* toNode = (Node*)to.base();
        Node* fromBegin = (Node*)begin.base();
        Node* fromEnd = (Node*)end.base();
        ASSERT(toNode);
        ASSERT(fromBegin);
        ASSERT(fromEnd);
        if (fromBegin == fromEnd ||
            toNode == fromBegin)
        {
            // Nothing to do.
            return *this;
        }
        // Remove range [from, toNode[ from fromSet.
        Node* fromBeginPrevious = fromBegin->prev();
        ASSERT(fromBeginPrevious);
        Node* fromEndPrevious = fromEnd->prev();
        ASSERT(fromEndPrevious);
        fromSet.linkNodes(fromBeginPrevious, fromEnd);
        // Insert the range intoNode this
        Node* thisPrevious = toNode->prev();
        ASSERT(thisPrevious);
        linkNodes(thisPrevious, fromBegin);
        linkNodes(fromEndPrevious, toNode);
        // Update sizes
        size_ += count;
        fromSet.size_ -= count;
        return *this;
    }
}
#endif