Skip to content

Commit

Permalink
Fixed bug in BlockCopy which caused a slice bounds panics for indexes…
Browse files Browse the repository at this point in the history
… out of bounds
  • Loading branch information
feyeleanor committed Nov 24, 2011
1 parent c5b7317 commit 181d3a0
Show file tree
Hide file tree
Showing 38 changed files with 244 additions and 77 deletions.
10 changes: 6 additions & 4 deletions complex128.go
Original file line number Diff line number Diff line change
Expand Up @@ -230,11 +230,13 @@ func (s C128Slice) String() (t string) {
}

func (s C128Slice) BlockCopy(destination, source, count int) {
end := source + count
if end > len(s) {
end = len(s)
if destination < len(s) {
if end := destination + count; end >= len(s) {
copy(s[destination:], s[source:])
} else {
copy(s[destination : end], s[source:])
}
}
copy(s[destination:], s[source:end])
}

func (s C128Slice) BlockClear(start, count int) {
Expand Down
7 changes: 7 additions & 0 deletions complex128_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -257,8 +257,15 @@ func TestC128SliceBlockCopy(t *testing.T) {
}
}

ConfirmBlockCopy(C128Slice{}, 0, 0, 1, C128Slice{})
ConfirmBlockCopy(C128Slice{}, 1, 0, 1, C128Slice{})
ConfirmBlockCopy(C128Slice{}, 0, 1, 1, C128Slice{})

ConfirmBlockCopy(C128Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 0, 0, 4, C128Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9})
ConfirmBlockCopy(C128Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 9, 9, 4, C128Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9})
ConfirmBlockCopy(C128Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 9, 0, 4, C128Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 0})
ConfirmBlockCopy(C128Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 10, 0, 4, C128Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9})
ConfirmBlockCopy(C128Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 10, 10, 4, C128Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9})
ConfirmBlockCopy(C128Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 5, 2, 4, C128Slice{0, 1, 2, 3, 4, 2, 3, 4, 5, 9})
ConfirmBlockCopy(C128Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 2, 5, 4, C128Slice{0, 1, 5, 6, 7, 8, 6, 7, 8, 9})
}
Expand Down
10 changes: 6 additions & 4 deletions complex64.go
Original file line number Diff line number Diff line change
Expand Up @@ -230,11 +230,13 @@ func (s C64Slice) String() (t string) {
}

func (s C64Slice) BlockCopy(destination, source, count int) {
end := source + count
if end > len(s) {
end = len(s)
if destination < len(s) {
if end := destination + count; end >= len(s) {
copy(s[destination:], s[source:])
} else {
copy(s[destination : end], s[source:])
}
}
copy(s[destination:], s[source:end])
}

func (s C64Slice) BlockClear(start, count int) {
Expand Down
7 changes: 7 additions & 0 deletions complex64_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -257,8 +257,15 @@ func TestC64SliceBlockCopy(t *testing.T) {
}
}

ConfirmBlockCopy(C64Slice{}, 0, 0, 1, C64Slice{})
ConfirmBlockCopy(C64Slice{}, 1, 0, 1, C64Slice{})
ConfirmBlockCopy(C64Slice{}, 0, 1, 1, C64Slice{})

ConfirmBlockCopy(C64Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 0, 0, 4, C64Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9})
ConfirmBlockCopy(C64Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 9, 9, 4, C64Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9})
ConfirmBlockCopy(C64Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 9, 0, 4, C64Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 0})
ConfirmBlockCopy(C64Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 10, 0, 4, C64Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9})
ConfirmBlockCopy(C64Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 10, 10, 4, C64Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9})
ConfirmBlockCopy(C64Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 5, 2, 4, C64Slice{0, 1, 2, 3, 4, 2, 3, 4, 5, 9})
ConfirmBlockCopy(C64Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 2, 5, 4, C64Slice{0, 1, 5, 6, 7, 8, 6, 7, 8, 9})
}
Expand Down
10 changes: 6 additions & 4 deletions float32.go
Original file line number Diff line number Diff line change
Expand Up @@ -230,11 +230,13 @@ func (s F32Slice) String() (t string) {
}

func (s F32Slice) BlockCopy(destination, source, count int) {
end := source + count
if end > len(s) {
end = len(s)
if destination < len(s) {
if end := destination + count; end >= len(s) {
copy(s[destination:], s[source:])
} else {
copy(s[destination : end], s[source:])
}
}
copy(s[destination:], s[source:end])
}

func (s F32Slice) BlockClear(start, count int) {
Expand Down
7 changes: 7 additions & 0 deletions float32_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -290,8 +290,15 @@ func TestF32SliceBlockCopy(t *testing.T) {
}
}

ConfirmBlockCopy(F32Slice{}, 0, 0, 1, F32Slice{})
ConfirmBlockCopy(F32Slice{}, 1, 0, 1, F32Slice{})
ConfirmBlockCopy(F32Slice{}, 0, 1, 1, F32Slice{})

ConfirmBlockCopy(F32Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 0, 0, 4, F32Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9})
ConfirmBlockCopy(F32Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 9, 9, 4, F32Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9})
ConfirmBlockCopy(F32Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 9, 0, 4, F32Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 0})
ConfirmBlockCopy(F32Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 10, 0, 4, F32Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9})
ConfirmBlockCopy(F32Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 10, 10, 4, F32Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9})
ConfirmBlockCopy(F32Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 5, 2, 4, F32Slice{0, 1, 2, 3, 4, 2, 3, 4, 5, 9})
ConfirmBlockCopy(F32Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 2, 5, 4, F32Slice{0, 1, 5, 6, 7, 8, 6, 7, 8, 9})
}
Expand Down
10 changes: 6 additions & 4 deletions float64.go
Original file line number Diff line number Diff line change
Expand Up @@ -230,11 +230,13 @@ func (s F64Slice) String() (t string) {
}

func (s F64Slice) BlockCopy(destination, source, count int) {
end := source + count
if end > len(s) {
end = len(s)
if destination < len(s) {
if end := destination + count; end >= len(s) {
copy(s[destination:], s[source:])
} else {
copy(s[destination : end], s[source:])
}
}
copy(s[destination:], s[source:end])
}

func (s F64Slice) BlockClear(start, count int) {
Expand Down
7 changes: 7 additions & 0 deletions float64_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -290,8 +290,15 @@ func TestF64SliceBlockCopy(t *testing.T) {
}
}

ConfirmBlockCopy(F64Slice{}, 0, 0, 1, F64Slice{})
ConfirmBlockCopy(F64Slice{}, 1, 0, 1, F64Slice{})
ConfirmBlockCopy(F64Slice{}, 0, 1, 1, F64Slice{})

ConfirmBlockCopy(F64Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 0, 0, 4, F64Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9})
ConfirmBlockCopy(F64Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 9, 9, 4, F64Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9})
ConfirmBlockCopy(F64Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 9, 0, 4, F64Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 0})
ConfirmBlockCopy(F64Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 10, 0, 4, F64Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9})
ConfirmBlockCopy(F64Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 10, 10, 4, F64Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9})
ConfirmBlockCopy(F64Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 5, 2, 4, F64Slice{0, 1, 2, 3, 4, 2, 3, 4, 5, 9})
ConfirmBlockCopy(F64Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 2, 5, 4, F64Slice{0, 1, 5, 6, 7, 8, 6, 7, 8, 9})
}
Expand Down
10 changes: 6 additions & 4 deletions int.go
Original file line number Diff line number Diff line change
Expand Up @@ -237,11 +237,13 @@ func (s ISlice) String() (t string) {
}

func (s ISlice) BlockCopy(destination, source, count int) {
end := source + count
if end > len(s) {
end = len(s)
if destination < len(s) {
if end := destination + count; end >= len(s) {
copy(s[destination:], s[source:])
} else {
copy(s[destination : end], s[source:])
}
}
copy(s[destination:], s[source:end])
}

func (s ISlice) BlockClear(start, count int) {
Expand Down
10 changes: 6 additions & 4 deletions int16.go
Original file line number Diff line number Diff line change
Expand Up @@ -237,11 +237,13 @@ func (s I16Slice) String() (t string) {
}

func (s I16Slice) BlockCopy(destination, source, count int) {
end := source + count
if end > len(s) {
end = len(s)
if destination < len(s) {
if end := destination + count; end >= len(s) {
copy(s[destination:], s[source:])
} else {
copy(s[destination : end], s[source:])
}
}
copy(s[destination:], s[source:end])
}

func (s I16Slice) BlockClear(start, count int) {
Expand Down
7 changes: 7 additions & 0 deletions int16_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -290,8 +290,15 @@ func TestI16SliceBlockCopy(t *testing.T) {
}
}

ConfirmBlockCopy(I16Slice{}, 0, 0, 1, I16Slice{})
ConfirmBlockCopy(I16Slice{}, 1, 0, 1, I16Slice{})
ConfirmBlockCopy(I16Slice{}, 0, 1, 1, I16Slice{})

ConfirmBlockCopy(I16Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 0, 0, 4, I16Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9})
ConfirmBlockCopy(I16Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 9, 9, 4, I16Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9})
ConfirmBlockCopy(I16Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 9, 0, 4, I16Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 0})
ConfirmBlockCopy(I16Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 10, 0, 4, I16Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9})
ConfirmBlockCopy(I16Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 10, 10, 4, I16Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9})
ConfirmBlockCopy(I16Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 5, 2, 4, I16Slice{0, 1, 2, 3, 4, 2, 3, 4, 5, 9})
ConfirmBlockCopy(I16Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 2, 5, 4, I16Slice{0, 1, 5, 6, 7, 8, 6, 7, 8, 9})
}
Expand Down
10 changes: 6 additions & 4 deletions int32.go
Original file line number Diff line number Diff line change
Expand Up @@ -237,11 +237,13 @@ func (s I32Slice) String() (t string) {
}

func (s I32Slice) BlockCopy(destination, source, count int) {
end := source + count
if end > len(s) {
end = len(s)
if destination < len(s) {
if end := destination + count; end >= len(s) {
copy(s[destination:], s[source:])
} else {
copy(s[destination : end], s[source:])
}
}
copy(s[destination:], s[source:end])
}

func (s I32Slice) BlockClear(start, count int) {
Expand Down
7 changes: 7 additions & 0 deletions int32_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -290,8 +290,15 @@ func TestI32SliceBlockCopy(t *testing.T) {
}
}

ConfirmBlockCopy(I32Slice{}, 0, 0, 1, I32Slice{})
ConfirmBlockCopy(I32Slice{}, 1, 0, 1, I32Slice{})
ConfirmBlockCopy(I32Slice{}, 0, 1, 1, I32Slice{})

ConfirmBlockCopy(I32Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 0, 0, 4, I32Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9})
ConfirmBlockCopy(I32Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 9, 9, 4, I32Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9})
ConfirmBlockCopy(I32Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 9, 0, 4, I32Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 0})
ConfirmBlockCopy(I32Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 10, 0, 4, I32Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9})
ConfirmBlockCopy(I32Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 10, 10, 4, I32Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9})
ConfirmBlockCopy(I32Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 5, 2, 4, I32Slice{0, 1, 2, 3, 4, 2, 3, 4, 5, 9})
ConfirmBlockCopy(I32Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 2, 5, 4, I32Slice{0, 1, 5, 6, 7, 8, 6, 7, 8, 9})
}
Expand Down
10 changes: 6 additions & 4 deletions int64.go
Original file line number Diff line number Diff line change
Expand Up @@ -237,11 +237,13 @@ func (s I64Slice) String() (t string) {
}

func (s I64Slice) BlockCopy(destination, source, count int) {
end := source + count
if end > len(s) {
end = len(s)
if destination < len(s) {
if end := destination + count; end >= len(s) {
copy(s[destination:], s[source:])
} else {
copy(s[destination : end], s[source:])
}
}
copy(s[destination:], s[source:end])
}

func (s I64Slice) BlockClear(start, count int) {
Expand Down
7 changes: 7 additions & 0 deletions int64_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -290,8 +290,15 @@ func TestI64SliceBlockCopy(t *testing.T) {
}
}

ConfirmBlockCopy(I64Slice{}, 0, 0, 1, I64Slice{})
ConfirmBlockCopy(I64Slice{}, 1, 0, 1, I64Slice{})
ConfirmBlockCopy(I64Slice{}, 0, 1, 1, I64Slice{})

ConfirmBlockCopy(I64Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 0, 0, 4, I64Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9})
ConfirmBlockCopy(I64Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 9, 9, 4, I64Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9})
ConfirmBlockCopy(I64Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 9, 0, 4, I64Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 0})
ConfirmBlockCopy(I64Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 10, 0, 4, I64Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9})
ConfirmBlockCopy(I64Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 10, 10, 4, I64Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9})
ConfirmBlockCopy(I64Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 5, 2, 4, I64Slice{0, 1, 2, 3, 4, 2, 3, 4, 5, 9})
ConfirmBlockCopy(I64Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 2, 5, 4, I64Slice{0, 1, 5, 6, 7, 8, 6, 7, 8, 9})
}
Expand Down
10 changes: 6 additions & 4 deletions int8.go
Original file line number Diff line number Diff line change
Expand Up @@ -237,11 +237,13 @@ func (s I8Slice) String() (t string) {
}

func (s I8Slice) BlockCopy(destination, source, count int) {
end := source + count
if end > len(s) {
end = len(s)
if destination < len(s) {
if end := destination + count; end >= len(s) {
copy(s[destination:], s[source:])
} else {
copy(s[destination : end], s[source:])
}
}
copy(s[destination:], s[source:end])
}

func (s I8Slice) BlockClear(start, count int) {
Expand Down
7 changes: 7 additions & 0 deletions int8_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -290,8 +290,15 @@ func TestI8SliceBlockCopy(t *testing.T) {
}
}

ConfirmBlockCopy(I8Slice{}, 0, 0, 1, I8Slice{})
ConfirmBlockCopy(I8Slice{}, 1, 0, 1, I8Slice{})
ConfirmBlockCopy(I8Slice{}, 0, 1, 1, I8Slice{})

ConfirmBlockCopy(I8Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 0, 0, 4, I8Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9})
ConfirmBlockCopy(I8Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 9, 9, 4, I8Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9})
ConfirmBlockCopy(I8Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 9, 0, 4, I8Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 0})
ConfirmBlockCopy(I8Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 10, 0, 4, I8Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9})
ConfirmBlockCopy(I8Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 10, 10, 4, I8Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9})
ConfirmBlockCopy(I8Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 5, 2, 4, I8Slice{0, 1, 2, 3, 4, 2, 3, 4, 5, 9})
ConfirmBlockCopy(I8Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 2, 5, 4, I8Slice{0, 1, 5, 6, 7, 8, 6, 7, 8, 9})
}
Expand Down
3 changes: 3 additions & 0 deletions int_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -292,6 +292,9 @@ func TestISliceBlockCopy(t *testing.T) {

ConfirmBlockCopy(ISlice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 0, 0, 4, ISlice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9})
ConfirmBlockCopy(ISlice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 9, 9, 4, ISlice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9})
ConfirmBlockCopy(ISlice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 9, 0, 4, ISlice{0, 1, 2, 3, 4, 5, 6, 7, 8, 0})
ConfirmBlockCopy(ISlice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 10, 0, 4, ISlice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9})
ConfirmBlockCopy(ISlice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 10, 10, 4, ISlice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9})
ConfirmBlockCopy(ISlice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 5, 2, 4, ISlice{0, 1, 2, 3, 4, 2, 3, 4, 5, 9})
ConfirmBlockCopy(ISlice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 2, 5, 4, ISlice{0, 1, 5, 6, 7, 8, 6, 7, 8, 9})
}
Expand Down
10 changes: 6 additions & 4 deletions reflected.go
Original file line number Diff line number Diff line change
Expand Up @@ -267,11 +267,13 @@ func (s RSlice) String() (t string) {
}

func (s RSlice) BlockCopy(destination, source, count int) {
end := source + count
if end > s.Len() {
end = s.Len()
if destination < s.Len() {
end := destination + count
if end > s.Len() {
end = s.Len()
}
reflect.Copy(s.Slice(destination, end), s.Slice(source, s.Len()))
}
reflect.Copy(s.Slice(destination, s.Len()), s.Slice(source, end))
}

func (s RSlice) BlockClear(start, count int) {
Expand Down
7 changes: 7 additions & 0 deletions reflected_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -300,8 +300,15 @@ func TestRSliceBlockCopy(t *testing.T) {
}
}

ConfirmBlockCopy(RList(), 0, 0, 1, RList())
ConfirmBlockCopy(RList(), 1, 0, 1, RList())
ConfirmBlockCopy(RList(), 0, 1, 1, RList())

ConfirmBlockCopy(RList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9), 0, 0, 4, RList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9))
ConfirmBlockCopy(RList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9), 9, 9, 4, RList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9))
ConfirmBlockCopy(RList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9), 9, 0, 4, RList(0, 1, 2, 3, 4, 5, 6, 7, 8, 0))
ConfirmBlockCopy(RList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9), 10, 0, 4, RList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9))
ConfirmBlockCopy(RList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9), 10, 10, 4, RList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9))
ConfirmBlockCopy(RList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9), 5, 2, 4, RList(0, 1, 2, 3, 4, 2, 3, 4, 5, 9))
ConfirmBlockCopy(RList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9), 2, 5, 4, RList(0, 1, 5, 6, 7, 8, 6, 7, 8, 9))
}
Expand Down
10 changes: 6 additions & 4 deletions slice.go
Original file line number Diff line number Diff line change
Expand Up @@ -153,11 +153,13 @@ func (s Slice) String() (t string) {
}

func (s Slice) BlockCopy(destination, source, count int) {
end := source + count
if end > len(s) {
end = len(s)
if destination < len(s) {
if end := destination + count; end >= len(s) {
copy(s[destination:], s[source:])
} else {
copy(s[destination : end], s[source:])
}
}
copy(s[destination:], s[source:end])
}

func (s Slice) BlockClear(start, count int) {
Expand Down
9 changes: 8 additions & 1 deletion slice_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -230,8 +230,15 @@ func TestSliceBlockCopy(t *testing.T) {
}
}

ConfirmBlockCopy(Slice{}, 0, 0, 1, Slice{})
ConfirmBlockCopy(Slice{}, 1, 0, 1, Slice{})
ConfirmBlockCopy(Slice{}, 0, 1, 1, Slice{})

ConfirmBlockCopy(Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 0, 0, 4, Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9})
ConfirmBlockCopy(Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 9, 9, 4, Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9})
ConfirmBlockCopy(Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 0, 9, 4, Slice{9, 1, 2, 3, 4, 5, 6, 7, 8, 9})
ConfirmBlockCopy(Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 9, 0, 4, Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 0})
ConfirmBlockCopy(Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 10, 0, 4, Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9})
ConfirmBlockCopy(Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 10, 10, 4, Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9})
ConfirmBlockCopy(Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 5, 2, 4, Slice{0, 1, 2, 3, 4, 2, 3, 4, 5, 9})
ConfirmBlockCopy(Slice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 2, 5, 4, Slice{0, 1, 5, 6, 7, 8, 6, 7, 8, 9})
}
Expand Down
10 changes: 6 additions & 4 deletions string.go
Original file line number Diff line number Diff line change
Expand Up @@ -209,11 +209,13 @@ func (s SSlice) String() (t string) {
}

func (s SSlice) BlockCopy(destination, source, count int) {
end := source + count
if end > len(s) {
end = len(s)
if destination < len(s) {
if end := destination + count; end >= len(s) {
copy(s[destination:], s[source:])
} else {
copy(s[destination : end], s[source:])
}
}
copy(s[destination:], s[source:end])
}

func (s SSlice) BlockClear(start, count int) {
Expand Down
Loading

0 comments on commit 181d3a0

Please sign in to comment.