ipld-eth-server/vendor/github.com/ipfs/go-ipld-cbor/encoding/cloner.go

34 lines
671 B
Go

package encoding
import (
"sync"
refmt "github.com/polydawn/refmt"
"github.com/polydawn/refmt/obj/atlas"
)
// PooledCloner is a thread-safe pooled object cloner.
type PooledCloner struct {
pool sync.Pool
}
// NewPooledCloner returns a PooledCloner with the given atlas. Do not copy
// after use.
func NewPooledCloner(atl atlas.Atlas) PooledCloner {
return PooledCloner{
pool: sync.Pool{
New: func() interface{} {
return refmt.NewCloner(atl)
},
},
}
}
// Clone clones a into b using a cloner from the pool.
func (p *PooledCloner) Clone(a, b interface{}) error {
c := p.pool.Get().(refmt.Cloner)
err := c.Clone(a, b)
p.pool.Put(c)
return err
}