...
1
16
17 package groupcache
18
19 import (
20 "bytes"
21 "errors"
22 "io"
23 "strings"
24 )
25
26
27
28
29
30
31
32 type ByteView struct {
33
34 b []byte
35 s string
36 }
37
38
39 func (v ByteView) Len() int {
40 if v.b != nil {
41 return len(v.b)
42 }
43 return len(v.s)
44 }
45
46
47 func (v ByteView) ByteSlice() []byte {
48 if v.b != nil {
49 return cloneBytes(v.b)
50 }
51 return []byte(v.s)
52 }
53
54
55 func (v ByteView) String() string {
56 if v.b != nil {
57 return string(v.b)
58 }
59 return v.s
60 }
61
62
63 func (v ByteView) At(i int) byte {
64 if v.b != nil {
65 return v.b[i]
66 }
67 return v.s[i]
68 }
69
70
71 func (v ByteView) Slice(from, to int) ByteView {
72 if v.b != nil {
73 return ByteView{b: v.b[from:to]}
74 }
75 return ByteView{s: v.s[from:to]}
76 }
77
78
79 func (v ByteView) SliceFrom(from int) ByteView {
80 if v.b != nil {
81 return ByteView{b: v.b[from:]}
82 }
83 return ByteView{s: v.s[from:]}
84 }
85
86
87 func (v ByteView) Copy(dest []byte) int {
88 if v.b != nil {
89 return copy(dest, v.b)
90 }
91 return copy(dest, v.s)
92 }
93
94
95
96 func (v ByteView) Equal(b2 ByteView) bool {
97 if b2.b == nil {
98 return v.EqualString(b2.s)
99 }
100 return v.EqualBytes(b2.b)
101 }
102
103
104
105 func (v ByteView) EqualString(s string) bool {
106 if v.b == nil {
107 return v.s == s
108 }
109 l := v.Len()
110 if len(s) != l {
111 return false
112 }
113 for i, bi := range v.b {
114 if bi != s[i] {
115 return false
116 }
117 }
118 return true
119 }
120
121
122
123 func (v ByteView) EqualBytes(b2 []byte) bool {
124 if v.b != nil {
125 return bytes.Equal(v.b, b2)
126 }
127 l := v.Len()
128 if len(b2) != l {
129 return false
130 }
131 for i, bi := range b2 {
132 if bi != v.s[i] {
133 return false
134 }
135 }
136 return true
137 }
138
139
140 func (v ByteView) Reader() io.ReadSeeker {
141 if v.b != nil {
142 return bytes.NewReader(v.b)
143 }
144 return strings.NewReader(v.s)
145 }
146
147
148 func (v ByteView) ReadAt(p []byte, off int64) (n int, err error) {
149 if off < 0 {
150 return 0, errors.New("view: invalid offset")
151 }
152 if off >= int64(v.Len()) {
153 return 0, io.EOF
154 }
155 n = v.SliceFrom(int(off)).Copy(p)
156 if n < len(p) {
157 err = io.EOF
158 }
159 return
160 }
161
162
163 func (v ByteView) WriteTo(w io.Writer) (n int64, err error) {
164 var m int
165 if v.b != nil {
166 m, err = w.Write(v.b)
167 } else {
168 m, err = io.WriteString(w, v.s)
169 }
170 if err == nil && m < v.Len() {
171 err = io.ErrShortWrite
172 }
173 n = int64(m)
174 return
175 }
176
View as plain text