changeset 5691:9d2e74225104 sr-v2

Some refactoring to clean up deserialization.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Mon, 12 Feb 2024 12:48:07 +0100
parents da9720b4aa42
children d920f0fa2f04
files pkg/mesh/meshserialize.go pkg/mesh/meshserialize_v1.go pkg/mesh/meshserialize_v2.go
diffstat 3 files changed, 94 insertions(+), 64 deletions(-) [+]
line wrap: on
line diff
--- a/pkg/mesh/meshserialize.go	Mon Feb 12 10:49:20 2024 +0100
+++ b/pkg/mesh/meshserialize.go	Mon Feb 12 12:48:07 2024 +0100
@@ -20,6 +20,8 @@
 	"encoding/binary"
 	"fmt"
 	"io"
+
+	"gemma.intevation.de/gemma/pkg/log"
 )
 
 const Version = 1
@@ -116,6 +118,21 @@
 	}
 }
 
+// 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,
+	t T,
+	fns ...func(T, *bufio.Reader) error,
+) error {
+	for _, fn := range fns {
+		if err := fn(t, r); err != nil {
+			return err
+		}
+	}
+	return nil
+}
+
 func (s *STRTree) serializeEntries(w io.Writer) error {
 	return binary.Write(w, binary.LittleEndian, uint8(s.Entries))
 }
@@ -135,3 +152,28 @@
 	}
 	return t.Max.Write(w)
 }
+
+func (t *Tin) deserializeExtent(r *bufio.Reader) error {
+	if err := t.Min.Read(r); err != nil {
+		return err
+	}
+	if err := t.Max.Read(r); err != nil {
+		return err
+	}
+	log.Infof("BBOX: [[%f, %f, %f], [%f, %f, %f]]\n",
+		t.Min.X, t.Min.Y, t.Min.Z,
+		t.Max.X, t.Max.Y, t.Max.Z)
+	return nil
+}
+
+func (t *Tin) serializeEPSG(w io.Writer) error {
+	return binary.Write(w, binary.LittleEndian, t.EPSG)
+}
+
+func (t *Tin) deserializeEPSG(r *bufio.Reader) error {
+	if err := binary.Read(r, binary.LittleEndian, &t.EPSG); err != nil {
+		return err
+	}
+	log.Infof("EPSG: %d\n", t.EPSG)
+	return nil
+}
--- a/pkg/mesh/meshserialize_v1.go	Mon Feb 12 10:49:20 2024 +0100
+++ b/pkg/mesh/meshserialize_v1.go	Mon Feb 12 12:48:07 2024 +0100
@@ -93,7 +93,7 @@
 }
 
 func (t *Tin) serializeV1(w io.Writer) error {
-	if err := binary.Write(w, binary.LittleEndian, t.EPSG); err != nil {
+	if err := t.serializeEPSG(w); err != nil {
 		return err
 	}
 	if err := t.serializeExtent(w); err != nil {
@@ -102,14 +102,14 @@
 	if err := t.serializeVerticesV1(w); err != nil {
 		return err
 	}
+	return t.serializeTrianglesV1(w)
+}
+
+func (t *Tin) serializeTrianglesV1(w io.Writer) error {
 	if err := binary.Write(
 		w, binary.LittleEndian, uint32(len(t.Triangles))); err != nil {
 		return err
 	}
-	return t.serializeTrianglesV1(w)
-}
-
-func (t *Tin) serializeTrianglesV1(w io.Writer) error {
 	var buf [binary.MaxVarintLen32]byte
 	var written int
 	var last int32
@@ -137,20 +137,17 @@
 		w, binary.LittleEndian, uint32(len(t.Vertices))); err != nil {
 		return err
 	}
-
 	var err error
 	vwrite := func(v float64) {
 		if err == nil {
 			err = binary.Write(w, binary.LittleEndian, math.Float64bits(v))
 		}
 	}
-
 	for _, v := range t.Vertices {
 		vwrite(v.X)
 		vwrite(v.Y)
 		vwrite(v.Z)
 	}
-
 	if err != nil {
 		return err
 	}
@@ -158,31 +155,34 @@
 	return nil
 }
 
+func (s *STRTree) deserializeV1(r *bufio.Reader) error {
+	return deserializer(r, s,
+		(*STRTree).deserializeTinV1,
+		(*STRTree).deserializeEntries,
+		(*STRTree).deserializeIndexV1,
+		(*STRTree).deserializeBBoxesV1,
+	)
+}
+
 func (s *STRTree) deserializeBBoxesV1(r *bufio.Reader) error {
-
 	var numBBoxes int32
 	if err := binary.Read(r, binary.LittleEndian, &numBBoxes); err != nil {
 		return err
 	}
-
 	bboxes := make([]Box2D, numBBoxes)
 	s.bboxes = bboxes
-
 	var err error
-
 	read := func(v *float64) {
 		if err == nil {
 			err = binary.Read(r, binary.LittleEndian, v)
 		}
 	}
-
 	for i := range bboxes {
 		read(&bboxes[i].X1)
 		read(&bboxes[i].Y1)
 		read(&bboxes[i].X2)
 		read(&bboxes[i].Y2)
 	}
-
 	return err
 }
 
@@ -193,7 +193,6 @@
 	}
 	index := make([]int32, numIndex)
 	s.index = index
-
 	var last int32
 	for i := range index {
 		v, err := binary.ReadVarint(r)
@@ -204,74 +203,50 @@
 		index[i] = value
 		last = value
 	}
-
 	return nil
 }
 
-func (s *STRTree) deserializeV1(r *bufio.Reader) error {
+func (s *STRTree) deserializeTinV1(r *bufio.Reader) error {
 	s.tin = new(Tin)
-	if err := s.tin.deserializeV1(r); err != nil {
-		return err
-	}
-	if err := s.deserializeEntries(r); err != nil {
-		return err
-	}
-	if err := s.deserializeIndexV1(r); err != nil {
-		return err
-	}
-	return s.deserializeBBoxesV1(r)
+	return s.tin.deserializeV1(r)
 }
 
 // deserializeV1 restores a TIN from a binary representation.
 func (t *Tin) deserializeV1(r *bufio.Reader) error {
-
-	if err := binary.Read(r, binary.LittleEndian, &t.EPSG); err != nil {
-		return err
-	}
-
-	log.Infof("EPSG: %d\n", t.EPSG)
+	return deserializer(r, t,
+		(*Tin).deserializeEPSG,
+		(*Tin).deserializeExtent,
+		(*Tin).deserializeVerticesV1,
+		(*Tin).deserializeTrianglesV1,
+	)
+}
 
-	if err := t.Min.Read(r); err != nil {
-		return err
-	}
-
-	if err := t.Max.Read(r); err != nil {
-		return err
-	}
-
-	log.Infof("BBOX: [[%f, %f, %f], [%f, %f, %f]]\n",
-		t.Min.X, t.Min.Y, t.Min.Z,
-		t.Max.X, t.Max.Y, t.Max.Z)
-
+func (t *Tin) deserializeVerticesV1(r *bufio.Reader) error {
 	var numVertices uint32
 	if err := binary.Read(r, binary.LittleEndian, &numVertices); err != nil {
 		return err
 	}
-
 	log.Infof("vertices: %d\n", numVertices)
-
 	vertices := make([]Vertex, numVertices)
 	t.Vertices = vertices
-
 	for i := range vertices {
 		if err := vertices[i].Read(r); err != nil {
 			return err
 		}
 	}
+	return nil
+}
 
+func (t *Tin) deserializeTrianglesV1(r *bufio.Reader) error {
 	var numTriangles uint32
 	if err := binary.Read(r, binary.LittleEndian, &numTriangles); err != nil {
 		return err
 	}
-
 	log.Infof("triangles: %d\n", numTriangles)
-
 	indices := make([]int32, 3*numTriangles)
 	triangles := make([][]int32, numTriangles)
 	t.Triangles = triangles
-
 	var last int32
-
 	for i := range triangles {
 		tri := indices[:3]
 		indices = indices[3:]
@@ -286,6 +261,5 @@
 			last = value
 		}
 	}
-
 	return nil
 }
--- a/pkg/mesh/meshserialize_v2.go	Mon Feb 12 10:49:20 2024 +0100
+++ b/pkg/mesh/meshserialize_v2.go	Mon Feb 12 12:48:07 2024 +0100
@@ -55,7 +55,7 @@
 }
 
 func (t *Tin) serializeV2(w io.Writer) error {
-	if err := binary.Write(w, binary.LittleEndian, t.EPSG); err != nil {
+	if err := t.serializeEPSG(w); err != nil {
 		return err
 	}
 	if err := t.serializeExtent(w); err != nil {
@@ -162,17 +162,17 @@
 
 func (s *STRTree) deserializeV2(r *bufio.Reader) error {
 	// The header is already skipped here.
+	return deserializer(r, s,
+		(*STRTree).deserializeTinV2,
+		(*STRTree).deserializeEntries,
+		(*STRTree).deserializeIndexV2,
+		(*STRTree).deserializeBBoxesV2,
+	)
+}
+
+func (s *STRTree) deserializeTinV2(r *bufio.Reader) error {
 	s.tin = new(Tin)
-	if err := s.tin.deserializeV2(r); err != nil {
-		return err
-	}
-	if err := s.deserializeEntries(r); err != nil {
-		return err
-	}
-	if err := s.deserializeIndexV2(r); err != nil {
-		return err
-	}
-	return s.deserializeBBoxesV2(r)
+	return s.tin.deserializeV2(r)
 }
 
 func (s *STRTree) deserializeBBoxesV2(r *bufio.Reader) error {
@@ -186,6 +186,20 @@
 }
 
 func (t *Tin) deserializeV2(r *bufio.Reader) error {
+	return deserializer(r, t,
+		(*Tin).deserializeEPSG,
+		(*Tin).deserializeExtent,
+		(*Tin).deserializeVerticesV2,
+		(*Tin).deserializeTrianglesV2,
+	)
+}
+
+func (t *Tin) deserializeVerticesV2(r *bufio.Reader) error {
+	// TODO: implement me!
+	return errors.New("not implemented, yet")
+}
+
+func (t *Tin) deserializeTrianglesV2(r *bufio.Reader) error {
 	// TODO: implement me!
 	return errors.New("not implemented, yet")
 }