github.com/andy2046/gopie@v0.7.0/pkg/bitflag/bitflag.go (about)

     1  // Package bitflag implements bit flag.
     2  package bitflag
     3  
     4  // Flag is an 8 bits flag.
     5  type Flag byte
     6  
     7  const siz uint8 = 7
     8  
     9  // SetAll set all the flags.
    10  func (f *Flag) SetAll(opts ...Flag) {
    11  	for _, o := range opts {
    12  		*f |= o
    13  	}
    14  }
    15  
    16  // ToggleAll toggle (XOR) all the flags.
    17  func (f *Flag) ToggleAll(opts ...Flag) {
    18  	for _, o := range opts {
    19  		*f ^= o
    20  	}
    21  }
    22  
    23  // ClearAll clear all the flags.
    24  func (f *Flag) ClearAll(opts ...Flag) {
    25  	for _, o := range opts {
    26  		*f &^= o
    27  	}
    28  }
    29  
    30  // AreAllSet check if all the flags are set.
    31  func (f Flag) AreAllSet(opts ...Flag) bool {
    32  	for _, o := range opts {
    33  		if f&o == 0 {
    34  			return false
    35  		}
    36  	}
    37  	return true
    38  }
    39  
    40  // IsAnySet check if any one flag is set.
    41  func (f Flag) IsAnySet(opts ...Flag) bool {
    42  	for _, o := range opts {
    43  		if f&o > 0 {
    44  			return true
    45  		}
    46  	}
    47  	return false
    48  }
    49  
    50  // IsSet check if the bit at `n` is set.
    51  // `n` should be less than `8`.
    52  func (f Flag) IsSet(n uint8) bool {
    53  	if n > siz || f&(1<<n) == 0 {
    54  		return false
    55  	}
    56  	return true
    57  }
    58  
    59  // Set set a single bit at `n`.
    60  // `n` should be less than `8`.
    61  func (f *Flag) Set(n uint8) {
    62  	if n > siz {
    63  		return
    64  	}
    65  	*f |= (1 << n)
    66  }
    67  
    68  // Toggle toggle (XOR) a single bit at `n`.
    69  // `n` should be less than `8`.
    70  func (f *Flag) Toggle(n uint8) {
    71  	if n > siz {
    72  		return
    73  	}
    74  	*f ^= (1 << n)
    75  }
    76  
    77  // Clear clear a single bit at `n`.
    78  // `n` should be less than `8`.
    79  func (f *Flag) Clear(n uint8) {
    80  	if n > siz {
    81  		return
    82  	}
    83  	*f &^= (1 << n)
    84  }
    85  
    86  // Reset reset the flag.
    87  func (f *Flag) Reset() {
    88  	*f = 0
    89  }