changeset 5692:d920f0fa2f04 sr-v2

User generic serializer for serialization, too.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Mon, 12 Feb 2024 13:53:32 +0100
parents 9d2e74225104
children 9e9cedae718a
files pkg/mesh/meshserialize.go pkg/mesh/meshserialize_v1.go pkg/mesh/meshserialize_v2.go
diffstat 3 files changed, 56 insertions(+), 69 deletions(-) [+]
line wrap: on
line diff
--- 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))
+	}
+}
--- 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,
--- 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,