Skip to content

Commit 0d7e28e

Browse files
committedMay 23, 2022
add deep copy feature
1 parent ab50626 commit 0d7e28e

37 files changed

+1630
-2
lines changed
 

‎container/garray/garray_normal_any.go

+12
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414

1515
"github.com/gogf/gf/v2/errors/gcode"
1616
"github.com/gogf/gf/v2/errors/gerror"
17+
"github.com/gogf/gf/v2/internal/deepcopy"
1718
"github.com/gogf/gf/v2/internal/empty"
1819
"github.com/gogf/gf/v2/internal/json"
1920
"github.com/gogf/gf/v2/internal/rwmutex"
@@ -820,3 +821,14 @@ func (a *Array) Walk(f func(value interface{}) interface{}) *Array {
820821
func (a *Array) IsEmpty() bool {
821822
return a.Len() == 0
822823
}
824+
825+
// DeepCopy implements interface for deep copy of current type.
826+
func (a *Array) DeepCopy() interface{} {
827+
a.mu.RLock()
828+
defer a.mu.RUnlock()
829+
newSlice := make([]interface{}, len(a.array))
830+
for i, v := range a.array {
831+
newSlice[i] = deepcopy.Copy(v)
832+
}
833+
return NewArrayFrom(newSlice, a.mu.IsSafe())
834+
}

‎container/garray/garray_normal_int.go

+9
Original file line numberDiff line numberDiff line change
@@ -799,3 +799,12 @@ func (a *IntArray) Walk(f func(value int) int) *IntArray {
799799
func (a *IntArray) IsEmpty() bool {
800800
return a.Len() == 0
801801
}
802+
803+
// DeepCopy implements interface for deep copy of current type.
804+
func (a *IntArray) DeepCopy() interface{} {
805+
a.mu.RLock()
806+
defer a.mu.RUnlock()
807+
newSlice := make([]int, len(a.array))
808+
copy(newSlice, a.array)
809+
return NewIntArrayFrom(newSlice, a.mu.IsSafe())
810+
}

‎container/garray/garray_normal_str.go

+9
Original file line numberDiff line numberDiff line change
@@ -812,3 +812,12 @@ func (a *StrArray) Walk(f func(value string) string) *StrArray {
812812
func (a *StrArray) IsEmpty() bool {
813813
return a.Len() == 0
814814
}
815+
816+
// DeepCopy implements interface for deep copy of current type.
817+
func (a *StrArray) DeepCopy() interface{} {
818+
a.mu.RLock()
819+
defer a.mu.RUnlock()
820+
newSlice := make([]string, len(a.array))
821+
copy(newSlice, a.array)
822+
return NewStrArrayFrom(newSlice, a.mu.IsSafe())
823+
}

‎container/garray/garray_sorted_any.go

+12
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"math"
1313
"sort"
1414

15+
"github.com/gogf/gf/v2/internal/deepcopy"
1516
"github.com/gogf/gf/v2/internal/empty"
1617
"github.com/gogf/gf/v2/internal/json"
1718
"github.com/gogf/gf/v2/internal/rwmutex"
@@ -796,3 +797,14 @@ func (a *SortedArray) getComparator() func(a, b interface{}) int {
796797
}
797798
return a.comparator
798799
}
800+
801+
// DeepCopy implements interface for deep copy of current type.
802+
func (a *SortedArray) DeepCopy() interface{} {
803+
a.mu.RLock()
804+
defer a.mu.RUnlock()
805+
newSlice := make([]interface{}, len(a.array))
806+
for i, v := range a.array {
807+
newSlice[i] = deepcopy.Copy(v)
808+
}
809+
return NewSortedArrayFrom(newSlice, a.comparator, a.mu.IsSafe())
810+
}

‎container/garray/garray_sorted_int.go

+9
Original file line numberDiff line numberDiff line change
@@ -744,3 +744,12 @@ func (a *SortedIntArray) getComparator() func(a, b int) int {
744744
}
745745
return a.comparator
746746
}
747+
748+
// DeepCopy implements interface for deep copy of current type.
749+
func (a *SortedIntArray) DeepCopy() interface{} {
750+
a.mu.RLock()
751+
defer a.mu.RUnlock()
752+
newSlice := make([]int, len(a.array))
753+
copy(newSlice, a.array)
754+
return NewSortedIntArrayFrom(newSlice, a.mu.IsSafe())
755+
}

‎container/garray/garray_sorted_str.go

+9
Original file line numberDiff line numberDiff line change
@@ -757,3 +757,12 @@ func (a *SortedStrArray) getComparator() func(a, b string) int {
757757
}
758758
return a.comparator
759759
}
760+
761+
// DeepCopy implements interface for deep copy of current type.
762+
func (a *SortedStrArray) DeepCopy() interface{} {
763+
a.mu.RLock()
764+
defer a.mu.RUnlock()
765+
newSlice := make([]string, len(a.array))
766+
copy(newSlice, a.array)
767+
return NewSortedStrArrayFrom(newSlice, a.mu.IsSafe())
768+
}

‎container/glist/glist.go

+21
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"bytes"
1313
"container/list"
1414

15+
"github.com/gogf/gf/v2/internal/deepcopy"
1516
"github.com/gogf/gf/v2/internal/json"
1617
"github.com/gogf/gf/v2/internal/rwmutex"
1718
"github.com/gogf/gf/v2/util/gconv"
@@ -546,3 +547,23 @@ func (l *List) UnmarshalValue(value interface{}) (err error) {
546547
l.PushBacks(array)
547548
return err
548549
}
550+
551+
// DeepCopy implements interface for deep copy of current type.
552+
func (l *List) DeepCopy() interface{} {
553+
l.mu.RLock()
554+
defer l.mu.RUnlock()
555+
556+
if l.list == nil {
557+
return nil
558+
}
559+
var (
560+
length = l.list.Len()
561+
values = make([]interface{}, length)
562+
)
563+
if length > 0 {
564+
for i, e := 0, l.list.Front(); i < length; i, e = i+1, e.Next() {
565+
values[i] = deepcopy.Copy(e.Value)
566+
}
567+
}
568+
return NewFrom(values, l.mu.IsSafe())
569+
}

‎container/gmap/gmap_hash_any_any_map.go

+13-1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ package gmap
88

99
import (
1010
"github.com/gogf/gf/v2/container/gvar"
11+
"github.com/gogf/gf/v2/internal/deepcopy"
1112
"github.com/gogf/gf/v2/internal/empty"
1213
"github.com/gogf/gf/v2/internal/json"
1314
"github.com/gogf/gf/v2/internal/rwmutex"
@@ -72,7 +73,7 @@ func (m *AnyAnyMap) Map() map[interface{}]interface{} {
7273
return data
7374
}
7475

75-
// MapCopy returns a copy of the underlying data of the hash map.
76+
// MapCopy returns a shallow copy of the underlying data of the hash map.
7677
func (m *AnyAnyMap) MapCopy() map[interface{}]interface{} {
7778
m.mu.RLock()
7879
defer m.mu.RUnlock()
@@ -497,3 +498,14 @@ func (m *AnyAnyMap) UnmarshalValue(value interface{}) (err error) {
497498
}
498499
return
499500
}
501+
502+
// DeepCopy implements interface for deep copy of current type.
503+
func (m *AnyAnyMap) DeepCopy() interface{} {
504+
m.mu.RLock()
505+
defer m.mu.RUnlock()
506+
data := make(map[interface{}]interface{}, len(m.data))
507+
for k, v := range m.data {
508+
data[k] = deepcopy.Copy(v)
509+
}
510+
return NewFrom(data, m.mu.IsSafe())
511+
}

‎container/gmap/gmap_hash_int_any_map.go

+12
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ package gmap
99

1010
import (
1111
"github.com/gogf/gf/v2/container/gvar"
12+
"github.com/gogf/gf/v2/internal/deepcopy"
1213
"github.com/gogf/gf/v2/internal/empty"
1314
"github.com/gogf/gf/v2/internal/json"
1415
"github.com/gogf/gf/v2/internal/rwmutex"
@@ -499,3 +500,14 @@ func (m *IntAnyMap) UnmarshalValue(value interface{}) (err error) {
499500
}
500501
return
501502
}
503+
504+
// DeepCopy implements interface for deep copy of current type.
505+
func (m *IntAnyMap) DeepCopy() interface{} {
506+
m.mu.RLock()
507+
defer m.mu.RUnlock()
508+
data := make(map[int]interface{}, len(m.data))
509+
for k, v := range m.data {
510+
data[k] = deepcopy.Copy(v)
511+
}
512+
return NewIntAnyMapFrom(data, m.mu.IsSafe())
513+
}

‎container/gmap/gmap_hash_int_int_map.go

+11
Original file line numberDiff line numberDiff line change
@@ -470,3 +470,14 @@ func (m *IntIntMap) UnmarshalValue(value interface{}) (err error) {
470470
}
471471
return
472472
}
473+
474+
// DeepCopy implements interface for deep copy of current type.
475+
func (m *IntIntMap) DeepCopy() interface{} {
476+
m.mu.RLock()
477+
defer m.mu.RUnlock()
478+
data := make(map[int]int, len(m.data))
479+
for k, v := range m.data {
480+
data[k] = v
481+
}
482+
return NewIntIntMapFrom(data, m.mu.IsSafe())
483+
}

‎container/gmap/gmap_hash_int_str_map.go

+11
Original file line numberDiff line numberDiff line change
@@ -470,3 +470,14 @@ func (m *IntStrMap) UnmarshalValue(value interface{}) (err error) {
470470
}
471471
return
472472
}
473+
474+
// DeepCopy implements interface for deep copy of current type.
475+
func (m *IntStrMap) DeepCopy() interface{} {
476+
m.mu.RLock()
477+
defer m.mu.RUnlock()
478+
data := make(map[int]string, len(m.data))
479+
for k, v := range m.data {
480+
data[k] = v
481+
}
482+
return NewIntStrMapFrom(data, m.mu.IsSafe())
483+
}

‎container/gmap/gmap_hash_str_any_map.go

+12
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ package gmap
99

1010
import (
1111
"github.com/gogf/gf/v2/container/gvar"
12+
"github.com/gogf/gf/v2/internal/deepcopy"
1213
"github.com/gogf/gf/v2/internal/empty"
1314
"github.com/gogf/gf/v2/internal/json"
1415
"github.com/gogf/gf/v2/internal/rwmutex"
@@ -485,3 +486,14 @@ func (m *StrAnyMap) UnmarshalValue(value interface{}) (err error) {
485486
m.data = gconv.Map(value)
486487
return
487488
}
489+
490+
// DeepCopy implements interface for deep copy of current type.
491+
func (m *StrAnyMap) DeepCopy() interface{} {
492+
m.mu.RLock()
493+
defer m.mu.RUnlock()
494+
data := make(map[string]interface{}, len(m.data))
495+
for k, v := range m.data {
496+
data[k] = deepcopy.Copy(v)
497+
}
498+
return NewStrAnyMapFrom(data, m.mu.IsSafe())
499+
}

‎container/gmap/gmap_hash_str_int_map.go

+11
Original file line numberDiff line numberDiff line change
@@ -474,3 +474,14 @@ func (m *StrIntMap) UnmarshalValue(value interface{}) (err error) {
474474
}
475475
return
476476
}
477+
478+
// DeepCopy implements interface for deep copy of current type.
479+
func (m *StrIntMap) DeepCopy() interface{} {
480+
m.mu.RLock()
481+
defer m.mu.RUnlock()
482+
data := make(map[string]int, len(m.data))
483+
for k, v := range m.data {
484+
data[k] = v
485+
}
486+
return NewStrIntMapFrom(data, m.mu.IsSafe())
487+
}

‎container/gmap/gmap_hash_str_str_map.go

+11
Original file line numberDiff line numberDiff line change
@@ -463,3 +463,14 @@ func (m *StrStrMap) UnmarshalValue(value interface{}) (err error) {
463463
m.data = gconv.MapStrStr(value)
464464
return
465465
}
466+
467+
// DeepCopy implements interface for deep copy of current type.
468+
func (m *StrStrMap) DeepCopy() interface{} {
469+
m.mu.RLock()
470+
defer m.mu.RUnlock()
471+
data := make(map[string]string, len(m.data))
472+
for k, v := range m.data {
473+
data[k] = v
474+
}
475+
return NewStrStrMapFrom(data, m.mu.IsSafe())
476+
}

‎container/gmap/gmap_list_map.go

+17
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212

1313
"github.com/gogf/gf/v2/container/glist"
1414
"github.com/gogf/gf/v2/container/gvar"
15+
"github.com/gogf/gf/v2/internal/deepcopy"
1516
"github.com/gogf/gf/v2/internal/empty"
1617
"github.com/gogf/gf/v2/internal/json"
1718
"github.com/gogf/gf/v2/internal/rwmutex"
@@ -590,3 +591,19 @@ func (m *ListMap) UnmarshalValue(value interface{}) (err error) {
590591
}
591592
return
592593
}
594+
595+
// DeepCopy implements interface for deep copy of current type.
596+
func (m *ListMap) DeepCopy() interface{} {
597+
m.mu.RLock()
598+
defer m.mu.RUnlock()
599+
data := make(map[interface{}]interface{}, len(m.data))
600+
if m.list != nil {
601+
var node *gListMapNode
602+
m.list.IteratorAsc(func(e *glist.Element) bool {
603+
node = e.Value.(*gListMapNode)
604+
data[node.key] = deepcopy.Copy(node.value)
605+
return true
606+
})
607+
}
608+
return NewListMapFrom(data, m.mu.IsSafe())
609+
}

‎container/gset/gset_any_set.go

+11
Original file line numberDiff line numberDiff line change
@@ -510,3 +510,14 @@ func (set *Set) UnmarshalValue(value interface{}) (err error) {
510510
}
511511
return
512512
}
513+
514+
// DeepCopy implements interface for deep copy of current type.
515+
func (set *Set) DeepCopy() interface{} {
516+
set.mu.RLock()
517+
defer set.mu.RUnlock()
518+
data := make(map[interface{}]struct{}, len(set.data))
519+
for k, v := range set.data {
520+
data[k] = v
521+
}
522+
return NewFrom(data, set.mu.IsSafe())
523+
}

‎container/gset/gset_int_set.go

+15
Original file line numberDiff line numberDiff line change
@@ -469,3 +469,18 @@ func (set *IntSet) UnmarshalValue(value interface{}) (err error) {
469469
}
470470
return
471471
}
472+
473+
// DeepCopy implements interface for deep copy of current type.
474+
func (set *IntSet) DeepCopy() interface{} {
475+
set.mu.RLock()
476+
defer set.mu.RUnlock()
477+
var (
478+
slice = make([]int, len(set.data))
479+
index = 0
480+
)
481+
for k := range set.data {
482+
slice[index] = k
483+
index++
484+
}
485+
return NewIntSetFrom(slice, set.mu.IsSafe())
486+
}

‎container/gset/gset_str_set.go

+15
Original file line numberDiff line numberDiff line change
@@ -499,3 +499,18 @@ func (set *StrSet) UnmarshalValue(value interface{}) (err error) {
499499
}
500500
return
501501
}
502+
503+
// DeepCopy implements interface for deep copy of current type.
504+
func (set *StrSet) DeepCopy() interface{} {
505+
set.mu.RLock()
506+
defer set.mu.RUnlock()
507+
var (
508+
slice = make([]string, len(set.data))
509+
index = 0
510+
)
511+
for k := range set.data {
512+
slice[index] = k
513+
index++
514+
}
515+
return NewStrSetFrom(slice, set.mu.IsSafe())
516+
}

‎container/gtype/gtype_bool.go

+5
Original file line numberDiff line numberDiff line change
@@ -96,3 +96,8 @@ func (v *Bool) UnmarshalValue(value interface{}) error {
9696
v.Set(gconv.Bool(value))
9797
return nil
9898
}
99+
100+
// DeepCopy implements interface for deep copy of current type.
101+
func (v *Bool) DeepCopy() interface{} {
102+
return NewBool(v.Val())
103+
}

‎container/gtype/gtype_byte.go

+5
Original file line numberDiff line numberDiff line change
@@ -75,3 +75,8 @@ func (v *Byte) UnmarshalValue(value interface{}) error {
7575
v.Set(gconv.Byte(value))
7676
return nil
7777
}
78+
79+
// DeepCopy implements interface for deep copy of current type.
80+
func (v *Byte) DeepCopy() interface{} {
81+
return NewByte(v.Val())
82+
}

‎container/gtype/gtype_bytes.go

+9-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ func NewBytes(value ...[]byte) *Bytes {
3030
return t
3131
}
3232

33-
// Clone clones and returns a new concurrent-safe object for []byte type.
33+
// Clone clones and returns a new shallow copy object for []byte type.
3434
func (v *Bytes) Clone() *Bytes {
3535
return NewBytes(v.Val())
3636
}
@@ -83,3 +83,11 @@ func (v *Bytes) UnmarshalValue(value interface{}) error {
8383
v.Set(gconv.Bytes(value))
8484
return nil
8585
}
86+
87+
// DeepCopy implements interface for deep copy of current type.
88+
func (v *Bytes) DeepCopy() interface{} {
89+
oldBytes := v.Val()
90+
newBytes := make([]byte, len(oldBytes))
91+
copy(newBytes, oldBytes)
92+
return NewBytes(newBytes)
93+
}

‎container/gtype/gtype_float32.go

+5
Original file line numberDiff line numberDiff line change
@@ -87,3 +87,8 @@ func (v *Float32) UnmarshalValue(value interface{}) error {
8787
v.Set(gconv.Float32(value))
8888
return nil
8989
}
90+
91+
// DeepCopy implements interface for deep copy of current type.
92+
func (v *Float32) DeepCopy() interface{} {
93+
return NewFloat32(v.Val())
94+
}

0 commit comments

Comments
 (0)