forked from orijtech/groupcache
-
Notifications
You must be signed in to change notification settings - Fork 12
/
codec.go
79 lines (64 loc) · 2.21 KB
/
codec.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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
/*
Copyright 2019 Vimeo Inc.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package galaxycache
// Codec includes both the BinaryMarshaler and BinaryUnmarshaler
// interfaces
type Codec interface {
MarshalBinary() ([]byte, error)
UnmarshalBinary(data []byte) error
}
// Note: to ensure that unmarshaling is a read-only operation, bytes
// are always cloned
func cloneBytes(b []byte) []byte {
tmp := make([]byte, len(b))
copy(tmp, b)
return tmp
}
// ByteCodec is a byte slice type that implements Codec
type ByteCodec []byte
// MarshalBinary on a ByteCodec returns the bytes
func (c *ByteCodec) MarshalBinary() ([]byte, error) {
return *c, nil
}
// UnmarshalBinary on a ByteCodec sets the ByteCodec to
// a copy of the provided data
func (c *ByteCodec) UnmarshalBinary(data []byte) error {
*c = cloneBytes(data)
return nil
}
// CopyingByteCodec is a byte slice type that implements Codec
// and returns a copy of the bytes when marshaled
type CopyingByteCodec []byte
// MarshalBinary on a CopyingByteCodec returns a copy of the bytes
func (c *CopyingByteCodec) MarshalBinary() ([]byte, error) {
return cloneBytes(*c), nil
}
// UnmarshalBinary on a CopyingByteCodec sets the ByteCodec to
// a copy of the provided data
func (c *CopyingByteCodec) UnmarshalBinary(data []byte) error {
*c = cloneBytes(data)
return nil
}
// StringCodec is a string type that implements Codec
type StringCodec string
// MarshalBinary on a StringCodec returns the bytes underlying
// the string
func (c *StringCodec) MarshalBinary() ([]byte, error) {
return []byte(*c), nil
}
// UnmarshalBinary on a StringCodec sets the StringCodec to
// a stringified copy of the provided data
func (c *StringCodec) UnmarshalBinary(data []byte) error {
*c = StringCodec(data)
return nil
}