aboutsummaryrefslogtreecommitdiff
path: root/slice
diff options
context:
space:
mode:
Diffstat (limited to 'slice')
-rw-r--r--slice/slice.go91
-rw-r--r--slice/slice_test.go67
2 files changed, 0 insertions, 158 deletions
diff --git a/slice/slice.go b/slice/slice.go
deleted file mode 100644
index e5b959e..0000000
--- a/slice/slice.go
+++ /dev/null
@@ -1,91 +0,0 @@
-package slice
-
-import (
- "fmt"
- "reflect"
-)
-
-type Slice []interface{}
-
-type Del int
-
-type Ins struct {
- Idx int
- Value []interface{}
-}
-
-type insData struct {
- idx int
- count int
-}
-
-type Delta struct {
- Del []Del
- Ins []Ins
-}
-
-func (d Delta) String() string {
- data := make([]insData, len(d.Ins))
- for i, ins := range d.Ins {
- data[i] = insData{ins.Idx, len(ins.Value)}
- }
- return fmt.Sprintf("{Del: %d Ins: %+v}", d.Del, data)
-}
-
-func Patch(source Slice, delta Delta) (target Slice) {
- // apply Del part from patch to source into temp
- size := len(source) - len(delta.Del)
- temp := make(Slice, size)
- fill := 0
- prev := 0
- for _, del := range delta.Del {
- di := int(del)
- copy(temp[fill:], source[prev:di])
- fill += di - prev
- prev = di + 1
- }
- copy(temp[fill:], source[prev:])
- // apply Ins part from patch to temp into target
- for _, ins := range delta.Ins {
- size += len(ins.Value)
- }
- target = make(Slice, size)
- fill = 0
- prev = 0
- tpos := 0
- for _, ins := range delta.Ins {
- offset := ins.Idx - prev
- copy(target[fill:], temp[tpos:tpos+offset])
- fill += offset
- tpos += offset
- copy(target[fill:], ins.Value)
- fill += len(ins.Value)
- prev = ins.Idx + len(ins.Value)
- }
- copy(target[fill:], temp[tpos:])
- return
-}
-
-func Diff(source Slice, target Slice) (delta Delta) {
- var si, ti int
- var found bool
- for ; si < len(source); si++ {
- for i := ti; i < len(target); i++ {
- found = reflect.DeepEqual(target[i], source[si])
- if found {
- if i != ti {
- delta.Ins = append(delta.Ins, Ins{ti, target[ti:i]})
- }
- ti = i + 1
- break
- }
- }
- if !found {
- delta.Del = append(delta.Del, Del(si))
- }
- }
- if ti < len(target) {
- delta.Ins = append(delta.Ins, Ins{ti, target[ti:]})
- }
- return
-}
diff --git a/slice/slice_test.go b/slice/slice_test.go
deleted file mode 100644
index 8cb2a68..0000000
--- a/slice/slice_test.go
+++ /dev/null
@@ -1,67 +0,0 @@
-package slice_test
-
-import (
- "testing"
-
- "github.com/n-peugnet/dna-backup/slice"
- "github.com/n-peugnet/dna-backup/testutils"
-)
-
-func TestPatch(t *testing.T) {
- source := slice.Slice{1, 2, 3, 4}
- target := slice.Slice{2, 5, 3, 6, 4, 7, 8}
- patch := slice.Diff(source, target)
- testutils.AssertSame(t, []slice.Del{0}, patch.Del, "Patch del part")
- testutils.AssertSame(t, []slice.Ins{
- {1, slice.Slice{5}},
- {3, slice.Slice{6}},
- {5, slice.Slice{7, 8}},
- }, patch.Ins, "Patch ins part")
- actual := slice.Patch(source, patch)
- testutils.AssertSame(t, target, actual, "Target obtained from patch application")
-}
-
-func TestEmptyPatch(t *testing.T) {
- source := slice.Slice{1, 2, 3, 4}
- target := slice.Slice{1, 2, 3, 4}
- patch := slice.Diff(source, target)
- testutils.AssertSame(t, *new([]slice.Del), patch.Del, "Patch del part")
- testutils.AssertSame(t, *new([]slice.Ins), patch.Ins, "Patch ins part")
- actual := slice.Patch(source, patch)
- testutils.AssertSame(t, target, actual, "Target obtained from patch application")
-}
-
-type i struct {
- int
-}
-
-func TestStruct(t *testing.T) {
- c1, c2, c3, c4, c5, c6, c7, c8 := &i{1}, &i{2}, &i{3}, &i{4}, &i{5}, &i{6}, &i{7}, &i{8}
- source := slice.Slice{c1, c2, c3, c4}
- target := slice.Slice{&i{5}, c2, c5, c6, &i{4}, c7, &i{8}}
- patch := slice.Diff(source, target)
- testutils.AssertSame(t, []slice.Del{0, 2}, patch.Del, "Patch del part")
- testutils.AssertSame(t, []slice.Ins{
- {0, slice.Slice{c5}},
- {2, slice.Slice{c5, c6}},
- {5, slice.Slice{c7, c8}},
- }, patch.Ins, "Patch ins part")
- actual := slice.Patch(source, patch)
- testutils.AssertSame(t, target, actual, "Target obtained from patch application")
-}
-
-func TestDeltaString(t *testing.T) {
- delta := slice.Delta{
- Del: []slice.Del{0, 3, 4},
- Ins: []slice.Ins{
- {2, slice.Slice{6, 7, 8}},
- {5, slice.Slice{5}},
- },
- }
- testutils.AssertSame(
- t,
- "{Del: [0 3 4] Ins: [{idx:2 count:3} {idx:5 count:1}]}",
- delta.String(),
- "Delta string representation",
- )
-}