diff --git a/app/main.go b/app/main.go index e7e429d..1fa4232 100644 --- a/app/main.go +++ b/app/main.go @@ -24,10 +24,7 @@ package main import ( - "activething.com/go/gogo/core/errs" - "activething.com/go/gogo/packs" "activething.com/go/gogo/packs/js" - "encoding/json" "fmt" ) @@ -53,7 +50,7 @@ func main() { execute() - st := packs.NewState() + //st := packs.NewState() /* cas := []string {"a1111","b2222","c3333"} @@ -63,7 +60,7 @@ func main() { st.Reset() - */ + //a := map[int]string {1:"344343",3:"4343434",5:"frtrtrtr"} a := map[string]int {"{basd1/>":344343,"{casd2/>":4343434,"{asd41/>":67} @@ -76,4 +73,13 @@ func main() { errs.Test(e,true) fmt.Printf("JSON \n%s\n",d) + + */ + keys := []string {"B","G","K","9","Z","L"} + + kc := js.NewKeyCollection(10) + for _,v := range keys { + kc.AddKey(v) + } + kc.Iterate() } diff --git a/app/tests/benchmarks_test.go b/app/tests/benchmarks_test.go index fd9909b..100db2c 100644 --- a/app/tests/benchmarks_test.go +++ b/app/tests/benchmarks_test.go @@ -175,6 +175,60 @@ func BenchmarkMapJSON (b *testing.B) { +type s struct { + start int + end int +} + +func BenchmarkAppend (b *testing.B) { + + for i:=0; i< b.N; i++ { + data := make([]byte,0,3200) + list := make([]s,0,100) + for k,_ := range ma { + list = append(list,s{ + start: len(data), + end : len(data)+len(k), + }) + data = append(data,[]byte(k)...) + } + for _,v := range list { + if len(string(data[v.start:v.end])) > 100 { + panic("Errror") + } + } + data=data[:0] + } +} + + + +type s1 struct { + cadena string + +} + +func BenchmarkCrate (b *testing.B) { + + for i:=0; i< b.N; i++ { + data := make([]byte,0,3200) + list := make([]s1,0,100) + for k,_ := range ma { + list = append(list,s1{ + cadena: k, + }) + data = append(data,[]byte(k)...) + } + for _,v := range list { + if len(v.cadena) > 100 { + panic("Errror") + } + } + data=data[:0] + } +} + + var ma = map[string]string { "clave0": "valor123", "clave1": "rojo", diff --git a/packs/js/key_val_entry.go b/packs/js/key_val_entry.go new file mode 100644 index 0000000..f0824a2 --- /dev/null +++ b/packs/js/key_val_entry.go @@ -0,0 +1,53 @@ +// ------------------------------------------------------------------------ +// Project atila +// Active Thing (activething.com) git.activething.com/go +// +// File name key_entry.go +// Created by DEV +// Modified 02/02/2024 +// +// Copyright 2024 activething.com +// ------------------------------------------------------------------------ +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ------------------------------------------------------------------------ + +package js + +import "reflect" + +type ( + + + keyValEntry struct { + flags Flags + value reflect.Value + key string + } + + keyValEntries []keyValEntry + +) + + + +func (e keyValEntries) Len() int { + return len(e) +} + +func (e keyValEntries) Less(i, j int) bool { + return e[i].key < e[j].key +} + +func (e keyValEntries) Swap(i, j int) { + e[i], e[j] = e[j], e[i] +} diff --git a/packs/js/type_map_packer.go b/packs/js/type_map_packer.go index 813336b..311b79f 100644 --- a/packs/js/type_map_packer.go +++ b/packs/js/type_map_packer.go @@ -27,6 +27,7 @@ import ( "activething.com/go/gogo/packs" "encoding" "reflect" + "sort" "strconv" ) @@ -38,17 +39,35 @@ type ( } - StringerFn func(entry *typeMapEntry, value reflect.Value) error + StringerFn func(entry *TypeMapEntry, value reflect.Value) error - typeMapEntry struct { - val reflect.Value - key string - flags Flags + TypeMapEntry struct { + Val reflect.Value + Key string + flags Flags } + Entries []TypeMapEntry ) +func (e Entries) Len() int { + return len(e) +} + +// Less compares two entries based on their keys +func (e Entries) Less(i, j int) bool { + return e[i].Key < e[j].Key +} + +// Swap swaps two entries in the slice +func (e Entries) Swap(i, j int) { + e[i], e[j] = e[j], e[i] +} + + + + func newTypeMapPacker (rtype reflect.Type) *typeMapPacker { return &typeMapPacker{ valPacker : typePacker (rtype.Elem()), @@ -64,7 +83,7 @@ func (m typeMapPacker) pack (s *packs.State, v reflect.Value, _ Flags) { } mi := v.MapRange() - ls := make([]typeMapEntry,v.Len()) + ls := make(Entries,v.Len()) if s.Level > startDetectingCyclesAfter { if fn,ok := s.CheckCycle(v.UnsafePointer()); ok { @@ -76,8 +95,8 @@ func (m typeMapPacker) pack (s *packs.State, v reflect.Value, _ Flags) { } for i:=0; mi.Next(); i++ { - ls[i] = typeMapEntry{ - val: mi.Value(), + ls[i] = TypeMapEntry{ + Val: mi.Value(), } if er := m.keyStringer(&ls[i], mi.Key()); er != nil { s.SetError(er) @@ -85,19 +104,20 @@ func (m typeMapPacker) pack (s *packs.State, v reflect.Value, _ Flags) { } } - //sort.Slice(ls, func(i, j int) bool { return ls[i].key < ls[j].key }) + sort.Sort(ls) + //sort.Slice(ls, func(i, j int) bool { return ls[i].Key < ls[j].Key }) s.Open ('{') for i:=0; i0 { s.WriteByte(',') } - packString(s,ls[i].key,ls[i].flags) + packString(s,ls[i].Key,ls[i].flags) if s.Error != nil { return } s.WriteByte(':') - m.valPacker(s,ls[i].val,0) + m.valPacker(s,ls[i].Val,0) if s.Error != nil { return } @@ -108,23 +128,23 @@ func (m typeMapPacker) pack (s *packs.State, v reflect.Value, _ Flags) { -func buildKeyStringer(rt reflect.Type) func(me *typeMapEntry, key reflect.Value) error { +func buildKeyStringer(rt reflect.Type) func(me *TypeMapEntry, key reflect.Value) error { if rt.Kind() == reflect.String { - return func(e *typeMapEntry, k reflect.Value) error { - e.key = k.String() + return func(e *TypeMapEntry, k reflect.Value) error { + e.Key = k.String() e.flags = FlagScapeHTML return nil } } if rt.Implements(reflect.TypeOf((*encoding.TextMarshaler)(nil)).Elem()) { - return func(e *typeMapEntry, k reflect.Value) error { + return func(e *TypeMapEntry, k reflect.Value) error { if k.Kind() == reflect.Pointer && k.IsNil() { return nil } bf, er := (k.Interface().(encoding.TextMarshaler)).MarshalText() if er == nil { - e.key = string(bf) + e.Key = string(bf) e.flags = FlagScapeHTML } return er @@ -138,8 +158,8 @@ func buildKeyStringer(rt reflect.Type) func(me *typeMapEntry, key reflect.Value) reflect.Int16, reflect.Int32, reflect.Int64: - return func(e *typeMapEntry, k reflect.Value) error { - e.key = strconv.FormatInt(k.Int(), 10) + return func(e *TypeMapEntry, k reflect.Value) error { + e.Key = strconv.FormatInt(k.Int(), 10) return nil } case reflect.Uint, @@ -148,17 +168,17 @@ func buildKeyStringer(rt reflect.Type) func(me *typeMapEntry, key reflect.Value) reflect.Uint32, reflect.Uint64, reflect.Uintptr: - return func(e *typeMapEntry, k reflect.Value) error { - e.key = strconv.FormatUint(k.Uint(), 10) + return func(e *TypeMapEntry, k reflect.Value) error { + e.Key = strconv.FormatUint(k.Uint(), 10) return nil } case reflect.Interface: - return func(e *typeMapEntry, k reflect.Value) error { + return func(e *TypeMapEntry, k reflect.Value) error { k = k.Elem() if k.Type().Kind() == reflect.String { - e.key = k.String() + e.Key = k.String() e.flags = FlagScapeHTML return nil } @@ -169,7 +189,7 @@ func buildKeyStringer(rt reflect.Type) func(me *typeMapEntry, key reflect.Value) } bf, er := t.MarshalText() if er == nil { - e.key = string(bf) + e.Key = string(bf) e.flags = FlagScapeHTML } return er @@ -182,7 +202,7 @@ func buildKeyStringer(rt reflect.Type) func(me *typeMapEntry, key reflect.Value) reflect.Int16, reflect.Int32, reflect.Int64: - e.key = strconv.FormatInt(k.Int(), 10) + e.Key = strconv.FormatInt(k.Int(), 10) return nil case reflect.Uint, @@ -191,7 +211,7 @@ func buildKeyStringer(rt reflect.Type) func(me *typeMapEntry, key reflect.Value) reflect.Uint32, reflect.Uint64, reflect.Uintptr: - e.key = strconv.FormatUint(k.Uint(), 10) + e.Key = strconv.FormatUint(k.Uint(), 10) return nil default: @@ -200,19 +220,19 @@ func buildKeyStringer(rt reflect.Type) func(me *typeMapEntry, key reflect.Value) } default: - return func(e *typeMapEntry, k reflect.Value) error { + return func(e *TypeMapEntry, k reflect.Value) error { return packs.G.ErrInvalidKey } } // caso de map[any]cualquiertypo /* - return func(e *typeMapEntry, k reflect.Value) error { + return func(e *TypeMapEntry, k reflect.Value) error { k = k.Elem() fmt.Printf("Ejecutando packer general\n %v\n",k) if k.Type().Kind() == reflect.String { - e.key = k.String() + e.Key = k.String() e.flags = FlagScapeHTML return nil } @@ -223,7 +243,7 @@ func buildKeyStringer(rt reflect.Type) func(me *typeMapEntry, key reflect.Value) } bf, er := t.MarshalText() if er == nil { - e.key = string(bf) + e.Key = string(bf) e.flags = FlagScapeHTML } return er @@ -236,7 +256,7 @@ func buildKeyStringer(rt reflect.Type) func(me *typeMapEntry, key reflect.Value) reflect.Int16, reflect.Int32, reflect.Int64: - e.key = strconv.FormatInt(k.Int(), 10) + e.Key = strconv.FormatInt(k.Int(), 10) return nil case reflect.Uint, @@ -245,7 +265,7 @@ func buildKeyStringer(rt reflect.Type) func(me *typeMapEntry, key reflect.Value) reflect.Uint32, reflect.Uint64, reflect.Uintptr: - e.key = strconv.FormatUint(k.Uint(), 10) + e.Key = strconv.FormatUint(k.Uint(), 10) return nil default: