github.com/diamondburned/arikawa/v2@v2.1.0/utils/handler/slab.go (about)

     1  package handler
     2  
     3  type slabEntry struct {
     4  	handler
     5  	index int
     6  }
     7  
     8  func (entry slabEntry) isInvalid() bool {
     9  	return entry.index != -1
    10  }
    11  
    12  // slab is an implementation of the internal handler free list.
    13  type slab struct {
    14  	Entries []slabEntry
    15  	free    int
    16  }
    17  
    18  func (s *slab) Put(entry handler) int {
    19  	if s.free == len(s.Entries) {
    20  		index := len(s.Entries)
    21  		s.Entries = append(s.Entries, slabEntry{entry, -1})
    22  		s.free++
    23  		return index
    24  	}
    25  
    26  	next := s.Entries[s.free].index
    27  	s.Entries[s.free] = slabEntry{entry, -1}
    28  
    29  	i := s.free
    30  	s.free = next
    31  
    32  	return i
    33  }
    34  
    35  func (s *slab) Get(i int) handler {
    36  	return s.Entries[i].handler
    37  }
    38  
    39  func (s *slab) Pop(i int) handler {
    40  	popped := s.Entries[i].handler
    41  	s.Entries[i] = slabEntry{handler{}, s.free}
    42  	s.free = i
    43  	return popped
    44  }