redefiniendo el builder

packs2
DEV 3 years ago
parent 2d01ac5785
commit 0470d7c778

@ -66,7 +66,7 @@ func main() {
*/
//a := map[int]string {1:"344343",3:"4343434",5:"frtrtrtr"}
a := map[any]int {"{basd1/>":344343,"{casd2/>":4343434,"{asd41/>":67}
a := map[string]int {"{basd1/>":344343,"{casd2/>":4343434,"{asd41/>":67}
js.RPacker(st,a,0)
errs.Test(st.Error,true)
fmt.Printf("Pack \n%s\n",st.Bytes())

@ -27,7 +27,6 @@ import (
"activething.com/go/gogo/packs"
"encoding"
"reflect"
"sort"
"strconv"
)
@ -68,27 +67,25 @@ func (m typeMapPacker) pack (s *packs.State, v reflect.Value, _ Flags) {
ls := make([]typeMapEntry,v.Len())
if s.Level > startDetectingCyclesAfter {
pt := v.UnsafePointer()
if _,hs := s.Checks[pt]; hs {
if fn,ok := s.CheckCycle(v.UnsafePointer()); ok {
defer fn()
} else {
s.SetError(packs.G.ErrRedundantPack)
return
}
s.Checks[pt]=struct{}{}
defer delete(s.Checks,pt)
}
for i:=0; mi.Next(); i++ {
ls[i] = typeMapEntry{
val: mi.Value(),
}
if er := m.keyStringer(&ls[i], mi.Key()); er != nil {
s.SetError(er)
return
}
}
sort.Slice(ls, func(i, j int) bool { return ls[i].key < ls[j].key })
//sort.Slice(ls, func(i, j int) bool { return ls[i].key < ls[j].key })
s.Open ('{')
for i:=0; i<len(ls); i++ {

@ -39,7 +39,7 @@ type (
/*Embedded*/*bins.Buffer
Temp [64]byte
Level int
Checks map[any]struct{}
checks map[any]struct{}
Error error
}
@ -52,7 +52,7 @@ func NewState() *State {
syncs.PoolWithNew[State](func() *State {
return &State{
Buffer: bins.NewBuffer(),
Checks: make(map[any]struct{}),
checks: make(map[any]struct{}),
}
}),
)
@ -65,9 +65,9 @@ func ReleaseState (state *State) {
if state == nil {
state.Buffer.Reset()
state.Error = nil
if len(state.Checks) > 0 {
for k,_ := range state.Checks {
delete(state.Checks,k)
if len(state.checks) > 0 {
for k,_ := range state.checks {
delete(state.checks,k)
}
}
if atomic.LoadUint32(&G.poolsSem) == 1 {
@ -93,18 +93,15 @@ func (s *State) SetError(err error) bool {
func (s *State) AddCheck(ptr any) bool {
if _,hs := s.Checks[ptr]; hs {
func (s *State) CheckCycle (ptr any) (func(),bool) {
if _,hs := s.checks[ptr]; hs {
s.SetError(G.ErrRedundantPack)
return false
return nil,false
}
s.Checks[ptr]=struct{}{}
return true
s.checks[ptr]=struct{}{}
return func(){ delete(s.checks,ptr) },true
}
func (s *State) DelCheck(ptr any) {
delete(s.Checks,ptr)
}
func (s *State) Open(opener byte) {

Loading…
Cancel
Save

Powered by TurnKey Linux.