package player import ( "encoding/base64" "math/bits" "gopkg.in/yaml.v3" ) type RoomSet struct { bits []byte } func (rs *RoomSet) Add(roomID int) { if roomID < 0 { return } byteIdx := roomID / 8 if byteIdx >= len(rs.bits) { nb := make([]byte, byteIdx+1) copy(nb, rs.bits) rs.bits = nb } rs.bits[byteIdx] |= 1 << (roomID % 8) } func (rs *RoomSet) Has(roomID int) bool { if roomID < 0 { return false } byteIdx := roomID / 8 return byteIdx < len(rs.bits) && rs.bits[byteIdx]&(1<<(roomID%8)) != 0 } func (rs *RoomSet) Len() int { n := 0 for _, b := range rs.bits { n += bits.OnesCount8(b) } return n } func (rs RoomSet) IsZero() bool { return len(rs.bits) == 0 } func (rs *RoomSet) Keys() []int { var keys []int for byteIdx, b := range rs.bits { if b == 0 { continue } base := byteIdx * 8 for bitIdx := 0; bitIdx < 8; bitIdx++ { if b&(1<