# HG changeset patch # User Sascha L. Teichmann # Date 1707742412 -3600 # Node ID d920f0fa2f04ab3ac5465a7f13c1cbafde9d8ad5 # Parent 9d2e742251044d971898f680503fe22ad2e677f1 User generic serializer for serialization, too. diff -r 9d2e74225104 -r d920f0fa2f04 pkg/mesh/meshserialize.go --- a/pkg/mesh/meshserialize.go Mon Feb 12 12:48:07 2024 +0100 +++ b/pkg/mesh/meshserialize.go Mon Feb 12 13:53:32 2024 +0100 @@ -118,15 +118,15 @@ } } -// deserializer is a generic function to apply a chain of -// deserializer function to an object given a reader. -func deserializer[T any]( - r *bufio.Reader, +// serializer is a generic function to apply a chain of +// serializer/deserializer functions to an object given a reader. +func serializer[T, S any]( + s S, t T, - fns ...func(T, *bufio.Reader) error, + fns ...func(T, S) error, ) error { for _, fn := range fns { - if err := fn(t, r); err != nil { + if err := fn(t, s); err != nil { return err } } @@ -177,3 +177,16 @@ log.Infof("EPSG: %d\n", t.EPSG) return nil } + +func serializeHeader() func(*STRTree, io.Writer) error { + return func(_ *STRTree, w io.Writer) error { + _, err := w.Write([]byte(magicHeader)) + return err + } +} + +func serializeVersion(version int) func(*STRTree, io.Writer) error { + return func(_ *STRTree, w io.Writer) error { + return binary.Write(w, binary.LittleEndian, uint32(version)) + } +} diff -r 9d2e74225104 -r d920f0fa2f04 pkg/mesh/meshserialize_v1.go --- a/pkg/mesh/meshserialize_v1.go Mon Feb 12 12:48:07 2024 +0100 +++ b/pkg/mesh/meshserialize_v1.go Mon Feb 12 13:53:32 2024 +0100 @@ -23,26 +23,23 @@ ) func (s *STRTree) serializeV1(w io.Writer) error { - if err := s.tin.serializeV1(w); err != nil { - return err - } - if err := s.serializeEntries(w); err != nil { - return err - } - if err := s.serializeIndexV1(w); err != nil { - return err - } - return s.serializeBBoxesV1(w) + return serializer(w, s, + (*STRTree).serializeTinV1, + (*STRTree).serializeEntries, + (*STRTree).serializeIndexV1, + (*STRTree).serializeBBoxesV1, + ) +} + +func (s *STRTree) serializeTinV1(w io.Writer) error { + return s.tin.serializeV1(w) } func (s *STRTree) serializeBBoxesV1(w io.Writer) error { - if err := binary.Write(w, binary.LittleEndian, int32(len(s.bboxes))); err != nil { return err } - var err error - write := func(v float64) { if err == nil { err = binary.Write(w, binary.LittleEndian, math.Float64bits(v)) @@ -54,21 +51,16 @@ write(box.X2) write(box.Y2) } - return err } func (s *STRTree) serializeIndexV1(w io.Writer) error { - if err := binary.Write(w, binary.LittleEndian, int32(len(s.index))); err != nil { return err } - var buf [binary.MaxVarintLen32]byte - var last int32 var written int - for _, x := range s.index { delta := x - last n := binary.PutVarint(buf[:], int64(delta)) @@ -81,28 +73,22 @@ } last = x } - log.Infof("compressed index in bytes: %d %.2f (%d %.2f)\n", written, float64(written)/(1024*1024), 4*len(s.index), float64(4*len(s.index))/(1024*1024), ) - return nil } func (t *Tin) serializeV1(w io.Writer) error { - if err := t.serializeEPSG(w); err != nil { - return err - } - if err := t.serializeExtent(w); err != nil { - return err - } - if err := t.serializeVerticesV1(w); err != nil { - return err - } - return t.serializeTrianglesV1(w) + return serializer(w, t, + (*Tin).serializeEPSG, + (*Tin).serializeExtent, + (*Tin).serializeV1, + (*Tin).serializeTrianglesV1, + ) } func (t *Tin) serializeTrianglesV1(w io.Writer) error { @@ -156,7 +142,7 @@ } func (s *STRTree) deserializeV1(r *bufio.Reader) error { - return deserializer(r, s, + return serializer(r, s, (*STRTree).deserializeTinV1, (*STRTree).deserializeEntries, (*STRTree).deserializeIndexV1, @@ -213,7 +199,7 @@ // deserializeV1 restores a TIN from a binary representation. func (t *Tin) deserializeV1(r *bufio.Reader) error { - return deserializer(r, t, + return serializer(r, t, (*Tin).deserializeEPSG, (*Tin).deserializeExtent, (*Tin).deserializeVerticesV1, diff -r 9d2e74225104 -r d920f0fa2f04 pkg/mesh/meshserialize_v2.go --- a/pkg/mesh/meshserialize_v2.go Mon Feb 12 12:48:07 2024 +0100 +++ b/pkg/mesh/meshserialize_v2.go Mon Feb 12 13:53:32 2024 +0100 @@ -32,39 +32,27 @@ func unquant(x int64) float64 { return float64(x) / quantScale } func (s *STRTree) serializeV2(w io.Writer) error { - // Write header - if _, err := w.Write([]byte(magicHeader)); err != nil { - return err - } - // Write version - if err := binary.Write(w, binary.LittleEndian, uint32(2)); err != nil { - return err - } + return serializer(w, s, + serializeHeader(), + serializeVersion(2), + (*STRTree).serializeTinV2, + (*STRTree).serializeEntries, + (*STRTree).serializeIndexV2, + (*STRTree).serializeBBoxesV2, + ) +} - // Write the mesh itself - if err := s.tin.serializeV2(w); err != nil { - return err - } - if err := s.serializeEntries(w); err != nil { - return err - } - if err := s.serializeIndexV2(w); err != nil { - return err - } - return s.serializeBBoxesV2(w) +func (s *STRTree) serializeTinV2(w io.Writer) error { + return s.tin.serializeV2(w) } func (t *Tin) serializeV2(w io.Writer) error { - if err := t.serializeEPSG(w); err != nil { - return err - } - if err := t.serializeExtent(w); err != nil { - return err - } - if err := t.serializeVerticesV2(w); err != nil { - return err - } - return t.serializeTrianglesV2(w) + return serializer(w, t, + (*Tin).serializeEPSG, + (*Tin).serializeExtent, + (*Tin).serializeVerticesV2, + (*Tin).serializeTrianglesV2, + ) } func zigZag(buf []byte, w io.Writer, x int64) error { @@ -162,7 +150,7 @@ func (s *STRTree) deserializeV2(r *bufio.Reader) error { // The header is already skipped here. - return deserializer(r, s, + return serializer(r, s, (*STRTree).deserializeTinV2, (*STRTree).deserializeEntries, (*STRTree).deserializeIndexV2, @@ -186,7 +174,7 @@ } func (t *Tin) deserializeV2(r *bufio.Reader) error { - return deserializer(r, t, + return serializer(r, t, (*Tin).deserializeEPSG, (*Tin).deserializeExtent, (*Tin).deserializeVerticesV2,