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 }