mirror of
				https://github.com/superseriousbusiness/gotosocial.git
				synced 2025-11-03 21:02:24 -06:00 
			
		
		
		
	
		
			
	
	
		
			48 lines
		
	
	
	
		
			1.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			48 lines
		
	
	
	
		
			1.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| 
								 | 
							
								package atomics
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import "sync/atomic"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Bool provides user-friendly means of performing atomic operations on bool types.
							 | 
						||
| 
								 | 
							
								type Bool uint32
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// NewBool will return a new Bool instance initialized with zero value.
							 | 
						||
| 
								 | 
							
								func NewBool() *Bool {
							 | 
						||
| 
								 | 
							
									return new(Bool)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Store will atomically store bool value in address contained within i.
							 | 
						||
| 
								 | 
							
								func (b *Bool) Store(val bool) {
							 | 
						||
| 
								 | 
							
									atomic.StoreUint32((*uint32)(b), fromBool(val))
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Load will atomically load bool value at address contained within i.
							 | 
						||
| 
								 | 
							
								func (b *Bool) Load() bool {
							 | 
						||
| 
								 | 
							
									return toBool(atomic.LoadUint32((*uint32)(b)))
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// CAS performs a compare-and-swap for a(n) bool value at address contained within i.
							 | 
						||
| 
								 | 
							
								func (b *Bool) CAS(cmp, swp bool) bool {
							 | 
						||
| 
								 | 
							
									return atomic.CompareAndSwapUint32((*uint32)(b), fromBool(cmp), fromBool(swp))
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Swap atomically stores new bool value into address contained within i, and returns previous value.
							 | 
						||
| 
								 | 
							
								func (b *Bool) Swap(swp bool) bool {
							 | 
						||
| 
								 | 
							
									return toBool(atomic.SwapUint32((*uint32)(b), fromBool(swp)))
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// toBool converts uint32 value to bool.
							 | 
						||
| 
								 | 
							
								func toBool(u uint32) bool {
							 | 
						||
| 
								 | 
							
									if u == 0 {
							 | 
						||
| 
								 | 
							
										return false
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									return true
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// fromBool converts from bool to uint32 value.
							 | 
						||
| 
								 | 
							
								func fromBool(b bool) uint32 {
							 | 
						||
| 
								 | 
							
									if b {
							 | 
						||
| 
								 | 
							
										return 1
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									return 0
							 | 
						||
| 
								 | 
							
								}
							 |