1package controller
2
3import (
4	"sync"
5	"sync/atomic"
6	"time"
7)
8
9type aint struct{ v uintptr }
10
11func (a *aint) add(d int) int {
12	if d < 0 {
13		return int(atomic.AddUintptr(&a.v, ^uintptr((d*-1)-1)))
14	}
15	return int(atomic.AddUintptr(&a.v, uintptr(d)))
16}
17func (a *aint) get() int {
18	return int(atomic.LoadUintptr(&a.v))
19}
20func (a *aint) set(i int) int {
21	return int(atomic.SwapUintptr(&a.v, uintptr(i)))
22}
23
24type abool struct{ v uint32 }
25
26func (a *abool) on() bool {
27	return atomic.LoadUint32(&a.v) != 0
28}
29func (a *abool) set(t bool) bool {
30	if t {
31		return atomic.SwapUint32(&a.v, 1) != 0
32	}
33	return atomic.SwapUint32(&a.v, 0) != 0
34}
35
36type astring struct {
37	mu sync.Mutex
38	v  string
39}
40
41func (a *astring) get() string {
42	a.mu.Lock()
43	p := a.v
44	a.mu.Unlock()
45	return p
46}
47func (a *astring) set(s string) string {
48	a.mu.Lock()
49	p := a.v
50	a.v = s
51	a.mu.Unlock()
52	return p
53}
54
55type atime struct {
56	mu sync.Mutex
57	v  time.Time
58}
59
60func (a *atime) get() time.Time {
61	a.mu.Lock()
62	p := a.v
63	a.mu.Unlock()
64	return p
65}
66func (a *atime) set(t time.Time) time.Time {
67	a.mu.Lock()
68	p := a.v
69	a.v = t
70	a.mu.Unlock()
71	return p
72}
73