@@ -8,12 +8,17 @@ import (
8
8
cbg "github.com/whyrusleeping/cbor-gen"
9
9
)
10
10
11
+ var keyZero = []byte ("0" )
12
+ var keyOne = []byte ("1" )
13
+
11
14
func (t * Pointer ) MarshalCBOR (w io.Writer ) error {
12
15
if t .Link != cid .Undef && len (t .KVs ) > 0 {
13
16
return fmt .Errorf ("hamt Pointer cannot have both a link and KVs" )
14
17
}
15
18
16
- if err := cbg .CborWriteHeader (w , cbg .MajMap , 1 ); err != nil {
19
+ scratch := make ([]byte , 9 )
20
+
21
+ if err := cbg .WriteMajorTypeHeaderBuf (scratch , w , cbg .MajMap , 1 ); err != nil {
17
22
return err
18
23
}
19
24
@@ -22,28 +27,28 @@ func (t *Pointer) MarshalCBOR(w io.Writer) error {
22
27
// Refmt (and the general IPLD data model currently) can't deal
23
28
// with non string keys. So we have this weird restriction right now
24
29
// hoping to be able to use integer keys soon
25
- if err := cbg .CborWriteHeader ( w , cbg .MajTextString , 1 ); err != nil {
30
+ if err := cbg .WriteMajorTypeHeaderBuf ( scratch , w , cbg .MajTextString , 1 ); err != nil {
26
31
return err
27
32
}
28
33
29
- if _ , err := w .Write ([] byte ( "0" ) ); err != nil {
34
+ if _ , err := w .Write (keyZero ); err != nil {
30
35
return err
31
36
}
32
37
33
- if err := cbg .WriteCid ( w , t .Link ); err != nil {
38
+ if err := cbg .WriteCidBuf ( scratch , w , t .Link ); err != nil {
34
39
return err
35
40
}
36
41
} else {
37
42
// key for KVs is "1"
38
- if err := cbg .CborWriteHeader ( w , cbg .MajTextString , 1 ); err != nil {
43
+ if err := cbg .WriteMajorTypeHeaderBuf ( scratch , w , cbg .MajTextString , 1 ); err != nil {
39
44
return err
40
45
}
41
46
42
- if _ , err := w .Write ([] byte ( "1" ) ); err != nil {
47
+ if _ , err := w .Write (keyOne ); err != nil {
43
48
return err
44
49
}
45
50
46
- if err := cbg .CborWriteHeader ( w , cbg .MajArray , uint64 (len (t .KVs ))); err != nil {
51
+ if err := cbg .WriteMajorTypeHeaderBuf ( scratch , w , cbg .MajArray , uint64 (len (t .KVs ))); err != nil {
47
52
return err
48
53
}
49
54
@@ -58,7 +63,9 @@ func (t *Pointer) MarshalCBOR(w io.Writer) error {
58
63
}
59
64
60
65
func (t * Pointer ) UnmarshalCBOR (br io.Reader ) error {
61
- maj , extra , err := cbg .CborReadHeader (br )
66
+ scratch := make ([]byte , 8 )
67
+
68
+ maj , extra , err := cbg .CborReadHeaderBuf (br , scratch )
62
69
if err != nil {
63
70
return err
64
71
}
@@ -70,7 +77,7 @@ func (t *Pointer) UnmarshalCBOR(br io.Reader) error {
70
77
return fmt .Errorf ("Pointers should be a single element map" )
71
78
}
72
79
73
- maj , val , err := cbg .CborReadHeader (br )
80
+ maj , val , err := cbg .CborReadHeaderBuf (br , scratch )
74
81
if err != nil {
75
82
return err
76
83
}
@@ -83,21 +90,20 @@ func (t *Pointer) UnmarshalCBOR(br io.Reader) error {
83
90
return fmt .Errorf ("map keys in pointers must be a single byte long" )
84
91
}
85
92
86
- var b [1 ]byte
87
- if _ , err := io .ReadFull (br , b [:]); err != nil {
93
+ if _ , err := io .ReadAtLeast (br , scratch [:1 ], 1 ); err != nil {
88
94
return err
89
95
}
90
96
91
- switch string ( b [:]) {
92
- case "0" :
97
+ switch scratch [ 0 ] {
98
+ case '0' :
93
99
c , err := cbg .ReadCid (br )
94
100
if err != nil {
95
101
return err
96
102
}
97
103
t .Link = c
98
104
return nil
99
- case "1" :
100
- maj , length , err := cbg .CborReadHeader (br )
105
+ case '1' :
106
+ maj , length , err := cbg .CborReadHeaderBuf (br , scratch )
101
107
if err != nil {
102
108
return err
103
109
}
0 commit comments