redefiniendo el builder

packs2
DEV 3 years ago
parent c217571213
commit bc0d45885a

@ -30,6 +30,7 @@ import (
)
type (
Pool[T any] struct {
PoolStats

@ -25,8 +25,8 @@ package packs
import (
"activething.com/go/gogo/core/errs"
"activething.com/go/gogo/core/syncs"
"reflect"
"sync"
"time"
)
@ -34,10 +34,10 @@ var (
G = struct {
nodeSem uint32
nodePool *sync.Pool
nodePool *syncs.Pool[StateNode]
stateSem uint32
statePool *sync.Pool
statePool *syncs.Pool[State]
ErrInvalidNode errs.ErrCode
ErrInvalidElement errs.ErrCode
@ -47,7 +47,7 @@ var (
ErrValueRequired errs.ErrCode
ErrInvalidList errs.ErrCode
}{
ErrInvalidNode : errs.ErrCode("packs.invalid-Node"),
ErrInvalidNode : errs.ErrCode("packs.invalid-StateNode"),
ErrInvalidElement: errs.ErrCode("packs.invalid-element"),
ErrInvalidKey : errs.ErrCode("packs.invalid-key"),
ErrDuplicatedKey : errs.ErrCode("packs:duplicated-key"),

@ -23,13 +23,63 @@
package jjson
import (
"activething.com/go/gogo/core/opts"
"activething.com/go/gogo/core/syncs"
"activething.com/go/gogo/packs"
"encoding/json"
"sync/atomic"
"time"
)
type (
Builder struct {
options Options
encoder *json.Encoder
dateLayout string
scratch [64]byte
state *packs.State
}
)
func AcquireBuilder (options ...opts.OptionFnc[Builder]) *Builder {
if atomic.CompareAndSwapUint32(&G.sentinel,0,1) {
G.builderPool = syncs.NewPool[Builder](
syncs.PoolWithNew[Builder](func() *Builder {
return &Builder{
options : jsonOptionsDefaults,
state : packs.AcquireState(),
dateLayout: time.RFC822Z,
}
}),
)
}
return opts.Apply(G.builderPool.Get(),options...)
}
func ReleaseBuilder (builder *Builder) {
if builder != nil && atomic.LoadUint32(&G.sentinel) == 1 {
G.builderPool.Put(builder.reset())
}
}
func (b *Builder) Any (value any) {}
)
func (b *Builder) reset () *Builder {
//todo
b.options = jsonOptionsDefaults
b.encoder = nil
b.dateLayout = time.RFC822Z
b.state.Reset()
return b
}

@ -0,0 +1,84 @@
// ------------------------------------------------------------------------
// Project atila
// Active Thing (activething.com) git.activething.com/go
//
// File name gogo.go
// Created by DEV
// Modified 18/01/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 jjson
import (
"activething.com/go/gogo/core/syncs"
"unicode/utf8"
)
var (
G = struct {
sentinel uint32
builderPool *syncs.Pool[Builder]
hex string
jsonChars [utf8.RuneSelf]jsonCharAtt
sep byte
nullValue []byte
zeroValue []byte
trueValue []byte
falseValue []byte
mapEmpty []byte
listEmpty []byte
objectEmpty []byte
stringEmpty []byte
floatNaN []byte
floatInfPos []byte
floatInfNeg []byte
}{
hex: "0123456789abcdef",
jsonChars: initJSONChars(),
sep: ',',
nullValue: []byte{'n', 'u', 'l', 'l'},
zeroValue: []byte{'0'},
trueValue: []byte{'"','t', 'r', 'u', 'e','"'},
falseValue: []byte{'"','f', 'a', 'l', 's', 'e','"'},
mapEmpty: []byte{'{', '}'},
objectEmpty: []byte{'{', '}'},
listEmpty: []byte{'[', ']'},
stringEmpty: []byte{'"', '"'},
floatNaN: []byte{'"', 'N', 'a', 'N', '"'},
floatInfPos: []byte{'"', 'I', 'n', 'f', '"'},
floatInfNeg: []byte{'"', '-', 'I', 'n', 'f', '"'},
}
)
func initJSONChars() [utf8.RuneSelf]jsonCharAtt {
var tb = [utf8.RuneSelf]jsonCharAtt{
'"': jsonCharAttAllUnsafe,
'&': jsonCharAttHtmlUnsafe,
'<': jsonCharAttHtmlUnsafe,
'>': jsonCharAttHtmlUnsafe,
'\\': jsonCharAttAllUnsafe,
}
for i := 0; i <= 31; i++ {
tb[i] = jsonCharAttAllUnsafe
}
return tb
}

@ -0,0 +1,42 @@
// ------------------------------------------------------------------------
// Project atila
// Active Thing (activething.com) git.activething.com/go
//
// File name json_char_atts.go
// Created by DEV
// Modified 18/01/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 jjson
const (
jsonCharAttUnsafe jsonCharAtt = 1 << iota
jsonCharAttHtmlUnsafe
jsonCharAttAllUnsafe = jsonCharAttUnsafe | jsonCharAttHtmlUnsafe
)
type jsonCharAtt uint8
func (a jsonCharAtt) isUnsafe() bool {
return a&jsonCharAttUnsafe != 0
}
func (a jsonCharAtt) isHtmlUnsafe() bool {
return a&jsonCharAttHtmlUnsafe != 0
}

@ -0,0 +1,61 @@
// ------------------------------------------------------------------------
// Project atila
// Active Thing (activething.com) git.activething.com/go
//
// File name options.go
// Created by DEV
// Modified 18/01/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 jjson
const (
JSONOptionsQuote Options = 1 << iota
JSONOptionsEscapeHTML
JSONOptionsIgnoreKeys
JSONOptionsQuoteFloats
JSONOptionsIgnoreDefaults
jsonOptionsDefaults = JSONOptionsQuote | JSONOptionsEscapeHTML
)
type Options uint8
func (o Options) Quoted() bool {
return o&JSONOptionsQuote != 0
}
func (o Options) QuoteFloats() bool {
return o&JSONOptionsQuoteFloats != 0
}
func (o Options) EscapeHTML() bool {
return o&JSONOptionsEscapeHTML != 0
}
func (o Options) IgnoreKeys() bool {
return o&JSONOptionsIgnoreKeys != 0
}
func (o Options) IgnoreDefaults() bool {
return o&JSONOptionsIgnoreDefaults != 0
}

@ -0,0 +1,52 @@
// ------------------------------------------------------------------------
// Project atila
// Active Thing (activething.com) git.activething.com/go
//
// File name packer.go
// Created by DEV
// Modified 22/01/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 jjson
import "activething.com/go/gogo/core/errs"
type (
JSONPacker struct {}
)
func (p JSONPacker) Pack (value any) (d []byte, e error) {
dn := false
defer func (v *bool, er *error) {
if !(*v) {
*er = errs.ToError(recover())
}
}(&dn,&e)
bd := AcquireBuilder()
bd.Any(value)
dn = true
return bd.state.Bytes(),bd.state.Error
}

@ -24,7 +24,10 @@
package packs
type (
Packer interface {
Pack(value any) ([]byte, error)
}
)

@ -25,17 +25,17 @@ package packs
import (
"activething.com/go/gogo/core/bins"
"sync"
"activething.com/go/gogo/core/syncs"
"sync/atomic"
)
type (
State struct {
/*Embedded*/*bins.Buffer
Node *Node
Error error
State struct {
*bins.Buffer/*Embedded*/
Node *StateNode
Error error
}
)
@ -43,16 +43,16 @@ type (
func AcquireState () *State {
if atomic.CompareAndSwapUint32(&G.stateSem,0,1) {
G.statePool = &sync.Pool{
New: func() any {
return &State {
G.statePool = syncs.NewPool[State](
syncs.PoolWithNew[State](func() *State {
return &State{
Node : AcquireNode(nil, NodeKindValue, 0),
Buffer: bins.NewBuffer(),
}
},
}
}),
)
}
return G.statePool.Get().(*State)
return G.statePool.Get()
}

@ -25,42 +25,44 @@ package packs
import (
"activething.com/go/gogo/core/slices"
"sync"
"activething.com/go/gogo/core/syncs"
"sync/atomic"
)
type (
Node struct {
Parent *Node
Start int
Count int
Level int
Kind NodeKind
keys slices.String
StateNode struct {
Parent *StateNode
Start int
Count int
Level int
Kind NodeKind
keys slices.String
}
)
func AcquireNode(parent *Node, kind NodeKind, start int) *Node {
func AcquireNode(parent *StateNode, kind NodeKind, start int) *StateNode {
if atomic.CompareAndSwapUint32(&G.nodeSem, 0, 1) {
G.nodePool = &sync.Pool{
New: func() any {
return &Node{
G.nodePool = syncs.NewPool[StateNode](
syncs.PoolWithNew[StateNode](func()*StateNode{
return &StateNode{
Kind: NodeKindValue,
keys: make(slices.String, 0, 10),
}
},
}
}),
)
}
return (G.nodePool.Get().(*Node)).Init(parent, kind, start)
return G.nodePool.Get().Init(parent, kind, start)
}
func ReleaseNode(node *Node) {
func ReleaseNode(node *StateNode) {
if node != nil {
G.nodePool.Put(node.Reset())
}
}
func (n *Node) Init(parent *Node, kind NodeKind, start int) *Node {
func (n *StateNode) Init(parent *StateNode, kind NodeKind, start int) *StateNode {
n.Parent = parent
if parent != nil {
n.Level = parent.Level + 1
@ -74,7 +76,7 @@ func (n *Node) Init(parent *Node, kind NodeKind, start int) *Node {
return n
}
func (n *Node) Reset() *Node {
func (n *StateNode) Reset() *StateNode {
n.Parent = nil
n.keys = n.keys[:0]
return n
Loading…
Cancel
Save

Powered by TurnKey Linux.