[structs]: added generic copynew

This commit is contained in:
Jean-Philippe Bossuat
2023-04-06 10:40:23 +02:00
parent cc79a939d8
commit dbb72479f0
4 changed files with 110 additions and 12 deletions

View File

@@ -14,10 +14,29 @@ import (
// Map is a struct storing a map of any element indexed by an Integer.
type Map[V constraints.Integer, T any] map[V]*T
// CopyNew creates a copy of the oject.
func (m Map[V, T]) CopyNew() *Map[V, T] {
var mcpy = make(Map[V, T])
codec := Codec[T]{}
var err error
for key, object := range m {
if mcpy[key], err = codec.CopynewWrapper(object); err != nil {
panic(err)
}
}
return &mcpy
}
// BinarySize returns the size in bytes that the object once marshalled into a binary form.
func (m Map[V, T]) BinarySize() (size int) {
size = 4 // #Ct
codec := Codec[T]{}
var inc int
var err error
for _, v := range m {
@@ -49,6 +68,8 @@ func (m *Map[V, T]) Read(p []byte) (n int, err error) {
return n, fmt.Errorf("cannot Read: len(p)=%d < %d", len(p), m.BinarySize())
}
codec := Codec[T]{}
mi := *m
binary.LittleEndian.PutUint32(p[n:], uint32(len(mi)))
@@ -92,6 +113,8 @@ func (m *Map[V, T]) WriteTo(w io.Writer) (n int64, err error) {
n += int64(inc1)
codec := Codec[T]{}
for _, key := range utils.GetSortedKeys(mi) {
if inc1, err = buffer.WriteUint64(w, uint64(key)); err != nil {
@@ -131,6 +154,8 @@ func (m *Map[V, T]) Write(p []byte) (n int, err error) {
size := int(binary.LittleEndian.Uint32(p[n:]))
n += 4
codec := Codec[T]{}
for i := 0; i < size; i++ {
idx := V(binary.LittleEndian.Uint64(p[n:]))
@@ -173,6 +198,8 @@ func (m *Map[V, T]) ReadFrom(r io.Reader) (n int64, err error) {
n += int64(inc1)
codec := Codec[T]{}
for i := 0; i < int(size); i++ {
var key uint64