Skip to content

Commit a5d3eb5

Browse files
committed
refactoring the project structure
1 parent 888e99d commit a5d3eb5

File tree

9 files changed

+75
-53
lines changed

9 files changed

+75
-53
lines changed

bencode.go

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package bencode
2+
3+
import (
4+
"github.com/IncSW/go-bencode/internal/decoder"
5+
"github.com/IncSW/go-bencode/internal/encoder"
6+
)
7+
8+
func MarshalTo(dst []byte, data interface{}) ([]byte, error) {
9+
return encoder.MarshalTo(dst, data)
10+
}
11+
12+
func Marshal(data interface{}) ([]byte, error) {
13+
return encoder.MarshalTo(make([]byte, 512), data)
14+
}
15+
16+
func Unmarshal(data []byte) (interface{}, error) {
17+
return decoder.Unmarshal(data)
18+
}
File renamed without changes.
File renamed without changes.

unmarshaler.go renamed to internal/decoder/unmarshaler.go

+6-4
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1-
package bencode
1+
package decoder
22

33
import (
44
"bytes"
55
"errors"
66
"strconv"
7+
8+
"github.com/IncSW/go-bencode/internal"
79
)
810

911
func Unmarshal(data []byte) (interface{}, error) {
@@ -28,7 +30,7 @@ func (u *unmarshaler) unmarshal() (interface{}, error) {
2830
return nil, errors.New("bencode: invalid integer field")
2931
}
3032
index += u.cursor
31-
integer, err := strconv.ParseInt(b2s(u.data[u.cursor:index]), 10, 64)
33+
integer, err := strconv.ParseInt(internal.B2S(u.data[u.cursor:index]), 10, 64)
3234
if err != nil {
3335
return nil, err
3436
}
@@ -72,7 +74,7 @@ func (u *unmarshaler) unmarshal() (interface{}, error) {
7274
if err != nil {
7375
return nil, err
7476
}
75-
dictionary[b2s(key)] = value
77+
dictionary[internal.B2S(key)] = value
7678
}
7779

7880
default:
@@ -89,7 +91,7 @@ func (u *unmarshaler) unmarshalString() ([]byte, error) {
8991
return nil, errors.New("bencode: invalid string field")
9092
}
9193
index += u.cursor
92-
stringLength, err := strconv.ParseInt(b2s(u.data[u.cursor:index]), 10, 64)
94+
stringLength, err := strconv.ParseInt(internal.B2S(u.data[u.cursor:index]), 10, 64)
9395
if err != nil {
9496
return nil, err
9597
}

marshaler.go renamed to internal/encoder/encoder.go

+9-9
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
1-
package bencode
1+
package encoder
22

3-
import "fmt"
3+
import (
4+
"fmt"
5+
6+
"github.com/IncSW/go-bencode/internal"
7+
)
48

59
func prepareBuffer(result *[]byte, offset int, length int, neededLength int) int {
610
availableLength := length - offset
@@ -22,10 +26,6 @@ func prepareBuffer(result *[]byte, offset int, length int, neededLength int) int
2226
return length
2327
}
2428

25-
func Marshal(data interface{}) ([]byte, error) {
26-
return MarshalTo(make([]byte, 512), data)
27-
}
28-
2929
func MarshalTo(dst []byte, data interface{}) ([]byte, error) {
3030
if cap(dst) > len(dst) {
3131
dst = dst[:cap(dst)]
@@ -86,7 +86,7 @@ func marshal(data interface{}, result *[]byte, offset int, length int) (int, int
8686
return offset, length, nil
8787

8888
case string:
89-
offset, length = marshalBytes(s2b(value), result, offset, length)
89+
offset, length = marshalBytes(internal.S2B(value), result, offset, length)
9090
return offset, length, nil
9191

9292
case []interface{}:
@@ -143,10 +143,10 @@ func marshalDictionary(data map[string]interface{}, result *[]byte, offset int,
143143
for key, _ := range data {
144144
keys = append(keys, key)
145145
}
146-
sortStrings(keys)
146+
internal.SortStrings(keys)
147147

148148
for _, key := range keys {
149-
offset, length = marshalBytes(s2b(key), result, offset, length)
149+
offset, length = marshalBytes(internal.S2B(key), result, offset, length)
150150
var err error
151151
offset, length, err = marshal(data[key], result, offset, length)
152152
if err != nil {

encoder_int.go renamed to internal/encoder/int.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package bencode
1+
package encoder
22

33
import "unsafe"
44

internal/unsafe.go

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package internal
2+
3+
import (
4+
"reflect"
5+
"unsafe"
6+
)
7+
8+
// https://github.com/valyala/fastjson/blob/master/util.go
9+
10+
func B2S(b []byte) string {
11+
return *(*string)(unsafe.Pointer(&b))
12+
}
13+
14+
func S2B(s string) (b []byte) {
15+
strh := (*reflect.StringHeader)(unsafe.Pointer(&s))
16+
sh := (*reflect.SliceHeader)(unsafe.Pointer(&b))
17+
sh.Data = strh.Data
18+
sh.Len = strh.Len
19+
sh.Cap = strh.Len
20+
return b
21+
}

internal/utils.go

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package internal
2+
3+
import "sort"
4+
5+
const strSliceLen = 20
6+
7+
func SortStrings(ss []string) {
8+
if len(ss) <= strSliceLen {
9+
for i := 1; i < len(ss); i++ {
10+
for j := i; j > 0; j-- {
11+
if ss[j] >= ss[j-1] {
12+
break
13+
}
14+
ss[j], ss[j-1] = ss[j-1], ss[j]
15+
}
16+
}
17+
} else {
18+
sort.Strings(ss)
19+
}
20+
}

util.go

-39
This file was deleted.

0 commit comments

Comments
 (0)