package raw

// ElementMapper provides an identity mapping by default.
//
// This can be replaced to provide a struct that maps elements to linker
// objects, if they are not the same. An ElementMapper is not typically
// required if: Linker is left as is, Element is left as is, or Linker and
// Element are the same type.
type packetElementMapper struct{}

// linkerFor maps an Element to a Linker.
//
// This default implementation should be inlined.
//
//go:nosplit
func (packetElementMapper) linkerFor(elem *packet) *packet { return elem }

// List is an intrusive list. Entries can be added to or removed from the list
// in O(1) time and with no additional memory allocations.
//
// The zero value for List is an empty list ready to use.
//
// To iterate over a list (where l is a List):
//      for e := l.Front(); e != nil; e = e.Next() {
// 		// do something with e.
//      }
//
// +stateify savable
type packetList struct {
	head *packet
	tail *packet
}

// Reset resets list l to the empty state.
func (l *packetList) Reset() {
	l.head = nil
	l.tail = nil
}

// Empty returns true iff the list is empty.
func (l *packetList) Empty() bool {
	return l.head == nil
}

// Front returns the first element of list l or nil.
func (l *packetList) Front() *packet {
	return l.head
}

// Back returns the last element of list l or nil.
func (l *packetList) Back() *packet {
	return l.tail
}

// PushFront inserts the element e at the front of list l.
func (l *packetList) PushFront(e *packet) {
	packetElementMapper{}.linkerFor(e).SetNext(l.head)
	packetElementMapper{}.linkerFor(e).SetPrev(nil)

	if l.head != nil {
		packetElementMapper{}.linkerFor(l.head).SetPrev(e)
	} else {
		l.tail = e
	}

	l.head = e
}

// PushBack inserts the element e at the back of list l.
func (l *packetList) PushBack(e *packet) {
	packetElementMapper{}.linkerFor(e).SetNext(nil)
	packetElementMapper{}.linkerFor(e).SetPrev(l.tail)

	if l.tail != nil {
		packetElementMapper{}.linkerFor(l.tail).SetNext(e)
	} else {
		l.head = e
	}

	l.tail = e
}

// PushBackList inserts list m at the end of list l, emptying m.
func (l *packetList) PushBackList(m *packetList) {
	if l.head == nil {
		l.head = m.head
		l.tail = m.tail
	} else if m.head != nil {
		packetElementMapper{}.linkerFor(l.tail).SetNext(m.head)
		packetElementMapper{}.linkerFor(m.head).SetPrev(l.tail)

		l.tail = m.tail
	}

	m.head = nil
	m.tail = nil
}

// InsertAfter inserts e after b.
func (l *packetList) InsertAfter(b, e *packet) {
	a := packetElementMapper{}.linkerFor(b).Next()
	packetElementMapper{}.linkerFor(e).SetNext(a)
	packetElementMapper{}.linkerFor(e).SetPrev(b)
	packetElementMapper{}.linkerFor(b).SetNext(e)

	if a != nil {
		packetElementMapper{}.linkerFor(a).SetPrev(e)
	} else {
		l.tail = e
	}
}

// InsertBefore inserts e before a.
func (l *packetList) InsertBefore(a, e *packet) {
	b := packetElementMapper{}.linkerFor(a).Prev()
	packetElementMapper{}.linkerFor(e).SetNext(a)
	packetElementMapper{}.linkerFor(e).SetPrev(b)
	packetElementMapper{}.linkerFor(a).SetPrev(e)

	if b != nil {
		packetElementMapper{}.linkerFor(b).SetNext(e)
	} else {
		l.head = e
	}
}

// Remove removes e from l.
func (l *packetList) Remove(e *packet) {
	prev := packetElementMapper{}.linkerFor(e).Prev()
	next := packetElementMapper{}.linkerFor(e).Next()

	if prev != nil {
		packetElementMapper{}.linkerFor(prev).SetNext(next)
	} else {
		l.head = next
	}

	if next != nil {
		packetElementMapper{}.linkerFor(next).SetPrev(prev)
	} else {
		l.tail = prev
	}
}

// Entry is a default implementation of Linker. Users can add anonymous fields
// of this type to their structs to make them automatically implement the
// methods needed by List.
//
// +stateify savable
type packetEntry struct {
	next *packet
	prev *packet
}

// Next returns the entry that follows e in the list.
func (e *packetEntry) Next() *packet {
	return e.next
}

// Prev returns the entry that precedes e in the list.
func (e *packetEntry) Prev() *packet {
	return e.prev
}

// SetNext assigns 'entry' as the entry that follows e in the list.
func (e *packetEntry) SetNext(elem *packet) {
	e.next = elem
}

// SetPrev assigns 'entry' as the entry that precedes e in the list.
func (e *packetEntry) SetPrev(elem *packet) {
	e.prev = elem
}
