github.com/wfusion/gofusion@v1.1.14/common/utils/clone/atomic_go119.go (about)

     1  // Copyright 2019 Huan Du. All rights reserved.
     2  // Licensed under the MIT license that can be found in the LICENSE file.
     3  
     4  //go:build go1.19
     5  // +build go1.19
     6  
     7  package clone
     8  
     9  import (
    10  	"reflect"
    11  	"sync/atomic"
    12  )
    13  
    14  func init() {
    15  	SetCustomFunc(reflect.TypeOf(atomic.Bool{}), func(allocator *Allocator, old, new reflect.Value) {
    16  		if !old.CanAddr() {
    17  			return
    18  		}
    19  
    20  		// Clone value inside atomic.Bool.
    21  		oldValue := old.Addr().Interface().(*atomic.Bool)
    22  		newValue := new.Addr().Interface().(*atomic.Bool)
    23  		v := oldValue.Load()
    24  		newValue.Store(v)
    25  	})
    26  	SetCustomFunc(reflect.TypeOf(atomic.Int32{}), func(allocator *Allocator, old, new reflect.Value) {
    27  		if !old.CanAddr() {
    28  			return
    29  		}
    30  
    31  		// Clone value inside atomic.Int32.
    32  		oldValue := old.Addr().Interface().(*atomic.Int32)
    33  		newValue := new.Addr().Interface().(*atomic.Int32)
    34  		v := oldValue.Load()
    35  		newValue.Store(v)
    36  	})
    37  	SetCustomFunc(reflect.TypeOf(atomic.Int64{}), func(allocator *Allocator, old, new reflect.Value) {
    38  		if !old.CanAddr() {
    39  			return
    40  		}
    41  
    42  		// Clone value inside atomic.Int64.
    43  		oldValue := old.Addr().Interface().(*atomic.Int64)
    44  		newValue := new.Addr().Interface().(*atomic.Int64)
    45  		v := oldValue.Load()
    46  		newValue.Store(v)
    47  	})
    48  	SetCustomFunc(reflect.TypeOf(atomic.Uint32{}), func(allocator *Allocator, old, new reflect.Value) {
    49  		if !old.CanAddr() {
    50  			return
    51  		}
    52  
    53  		// Clone value inside atomic.Uint32.
    54  		oldValue := old.Addr().Interface().(*atomic.Uint32)
    55  		newValue := new.Addr().Interface().(*atomic.Uint32)
    56  		v := oldValue.Load()
    57  		newValue.Store(v)
    58  	})
    59  	SetCustomFunc(reflect.TypeOf(atomic.Uint64{}), func(allocator *Allocator, old, new reflect.Value) {
    60  		if !old.CanAddr() {
    61  			return
    62  		}
    63  
    64  		// Clone value inside atomic.Uint64.
    65  		oldValue := old.Addr().Interface().(*atomic.Uint64)
    66  		newValue := new.Addr().Interface().(*atomic.Uint64)
    67  		v := oldValue.Load()
    68  		newValue.Store(v)
    69  	})
    70  	SetCustomFunc(reflect.TypeOf(atomic.Uintptr{}), func(allocator *Allocator, old, new reflect.Value) {
    71  		if !old.CanAddr() {
    72  			return
    73  		}
    74  
    75  		// Clone value inside atomic.Uintptr.
    76  		oldValue := old.Addr().Interface().(*atomic.Uintptr)
    77  		newValue := new.Addr().Interface().(*atomic.Uintptr)
    78  		v := oldValue.Load()
    79  		newValue.Store(v)
    80  	})
    81  }