xref: /aosp_15_r20/external/golang-protobuf/internal/set/ints.go (revision 1c12ee1efe575feb122dbf939ff15148a3b3e8f2)
1*1c12ee1eSDan Willemsen// Copyright 2018 The Go Authors. All rights reserved.
2*1c12ee1eSDan Willemsen// Use of this source code is governed by a BSD-style
3*1c12ee1eSDan Willemsen// license that can be found in the LICENSE file.
4*1c12ee1eSDan Willemsen
5*1c12ee1eSDan Willemsen// Package set provides simple set data structures for uint64s.
6*1c12ee1eSDan Willemsenpackage set
7*1c12ee1eSDan Willemsen
8*1c12ee1eSDan Willemsenimport "math/bits"
9*1c12ee1eSDan Willemsen
10*1c12ee1eSDan Willemsen// int64s represents a set of integers within the range of 0..63.
11*1c12ee1eSDan Willemsentype int64s uint64
12*1c12ee1eSDan Willemsen
13*1c12ee1eSDan Willemsenfunc (bs *int64s) Len() int {
14*1c12ee1eSDan Willemsen	return bits.OnesCount64(uint64(*bs))
15*1c12ee1eSDan Willemsen}
16*1c12ee1eSDan Willemsenfunc (bs *int64s) Has(n uint64) bool {
17*1c12ee1eSDan Willemsen	return uint64(*bs)&(uint64(1)<<n) > 0
18*1c12ee1eSDan Willemsen}
19*1c12ee1eSDan Willemsenfunc (bs *int64s) Set(n uint64) {
20*1c12ee1eSDan Willemsen	*(*uint64)(bs) |= uint64(1) << n
21*1c12ee1eSDan Willemsen}
22*1c12ee1eSDan Willemsenfunc (bs *int64s) Clear(n uint64) {
23*1c12ee1eSDan Willemsen	*(*uint64)(bs) &^= uint64(1) << n
24*1c12ee1eSDan Willemsen}
25*1c12ee1eSDan Willemsen
26*1c12ee1eSDan Willemsen// Ints represents a set of integers within the range of 0..math.MaxUint64.
27*1c12ee1eSDan Willemsentype Ints struct {
28*1c12ee1eSDan Willemsen	lo int64s
29*1c12ee1eSDan Willemsen	hi map[uint64]struct{}
30*1c12ee1eSDan Willemsen}
31*1c12ee1eSDan Willemsen
32*1c12ee1eSDan Willemsenfunc (bs *Ints) Len() int {
33*1c12ee1eSDan Willemsen	return bs.lo.Len() + len(bs.hi)
34*1c12ee1eSDan Willemsen}
35*1c12ee1eSDan Willemsenfunc (bs *Ints) Has(n uint64) bool {
36*1c12ee1eSDan Willemsen	if n < 64 {
37*1c12ee1eSDan Willemsen		return bs.lo.Has(n)
38*1c12ee1eSDan Willemsen	}
39*1c12ee1eSDan Willemsen	_, ok := bs.hi[n]
40*1c12ee1eSDan Willemsen	return ok
41*1c12ee1eSDan Willemsen}
42*1c12ee1eSDan Willemsenfunc (bs *Ints) Set(n uint64) {
43*1c12ee1eSDan Willemsen	if n < 64 {
44*1c12ee1eSDan Willemsen		bs.lo.Set(n)
45*1c12ee1eSDan Willemsen		return
46*1c12ee1eSDan Willemsen	}
47*1c12ee1eSDan Willemsen	if bs.hi == nil {
48*1c12ee1eSDan Willemsen		bs.hi = make(map[uint64]struct{})
49*1c12ee1eSDan Willemsen	}
50*1c12ee1eSDan Willemsen	bs.hi[n] = struct{}{}
51*1c12ee1eSDan Willemsen}
52*1c12ee1eSDan Willemsenfunc (bs *Ints) Clear(n uint64) {
53*1c12ee1eSDan Willemsen	if n < 64 {
54*1c12ee1eSDan Willemsen		bs.lo.Clear(n)
55*1c12ee1eSDan Willemsen		return
56*1c12ee1eSDan Willemsen	}
57*1c12ee1eSDan Willemsen	delete(bs.hi, n)
58*1c12ee1eSDan Willemsen}
59