github.com/moontrade/unsafe@v0.9.1/memory/heap/class.go (about)

     1  package heap
     2  
     3  import "math/bits"
     4  
     5  type Class struct {
     6  	Index uint16
     7  	Shift uint16
     8  	Size  uint32
     9  }
    10  
    11  func (cls Class) Set(bitmap uint32) uint32 {
    12  	return bitmap | (1 << cls.Shift)
    13  }
    14  
    15  func (cls Class) Set64(bitmap uint64) uint64 {
    16  	return bitmap | (1 << cls.Shift)
    17  }
    18  
    19  func (cls Class) Unset(bitmap uint32) uint32 {
    20  	return bitmap & ^(1 << cls.Shift)
    21  }
    22  
    23  func (cls Class) Unset64(bitmap uint64) uint64 {
    24  	return bitmap & ^(1 << cls.Shift)
    25  }
    26  
    27  func (cls Class) Search(bitmap uint32) int {
    28  	return bits.LeadingZeros32(bitmap<<cls.Index) + int(cls.Index)
    29  }
    30  
    31  func (cls Class) Search64(bitmap uint64) int {
    32  	return bits.LeadingZeros64(bitmap<<cls.Index) + int(cls.Index)
    33  }
    34  
    35  // alignUp rounds n up to a multiple of a. a must be a power of 2.
    36  func alignUp(n, a uintptr) uintptr {
    37  	return (n + a - 1) &^ (a - 1)
    38  }
    39  
    40  // alignDown rounds n down to a multiple of a. a must be a power of 2.
    41  func alignDown(n, a uintptr) uintptr {
    42  	return n &^ (a - 1)
    43  }
    44  
    45  // divRoundUp returns ceil(n / a).
    46  func divRoundUp(n, a uintptr) uintptr {
    47  	// a is generally a power of two. This will get inlined and
    48  	// the compiler will optimize the division.
    49  	return (n + a - 1) / a
    50  }