-
Notifications
You must be signed in to change notification settings - Fork 110
/
append_only.go
50 lines (41 loc) · 1.17 KB
/
append_only.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package pointcloud
import (
"errors"
"github.com/golang/geo/r3"
)
// NewAppendOnlyOnlyPointsPointCloud creates a point cloud that only can be appended to and iterated.
// It also can't have any meta data with it.
func NewAppendOnlyOnlyPointsPointCloud(allocSize int) PointCloud {
return &appendOnlyOnlyPointsPointCloud{
points: make([]r3.Vector, 0, allocSize),
}
}
type appendOnlyOnlyPointsPointCloud struct {
points []r3.Vector
}
func (pc *appendOnlyOnlyPointsPointCloud) Size() int {
return len(pc.points)
}
func (pc *appendOnlyOnlyPointsPointCloud) MetaData() MetaData {
panic(1)
}
func (pc *appendOnlyOnlyPointsPointCloud) Set(p r3.Vector, d Data) error {
if d != nil {
return errors.New("no data supported in appendOnlyOnlyPointsPointCloud")
}
pc.points = append(pc.points, p)
return nil
}
func (pc *appendOnlyOnlyPointsPointCloud) At(x, y, z float64) (Data, bool) {
panic("can't At appendOnlyOnlyPointsPointCloud")
}
func (pc *appendOnlyOnlyPointsPointCloud) Iterate(numBatches, myBatch int, fn func(p r3.Vector, d Data) bool) {
for idx, p := range pc.points {
if numBatches > 0 && idx%numBatches != myBatch {
continue
}
if !fn(p, nil) {
return
}
}
}