1// Copyright 2017, OpenCensus Authors
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//     http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14//
15
16// Package tagencoding contains the tag encoding
17// used interally by the stats collector.
18package tagencoding // import "go.opencensus.io/internal/tagencoding"
19
20// Values represent the encoded buffer for the values.
21type Values struct {
22	Buffer     []byte
23	WriteIndex int
24	ReadIndex  int
25}
26
27func (vb *Values) growIfRequired(expected int) {
28	if len(vb.Buffer)-vb.WriteIndex < expected {
29		tmp := make([]byte, 2*(len(vb.Buffer)+1)+expected)
30		copy(tmp, vb.Buffer)
31		vb.Buffer = tmp
32	}
33}
34
35// WriteValue is the helper method to encode Values from map[Key][]byte.
36func (vb *Values) WriteValue(v []byte) {
37	length := len(v) & 0xff
38	vb.growIfRequired(1 + length)
39
40	// writing length of v
41	vb.Buffer[vb.WriteIndex] = byte(length)
42	vb.WriteIndex++
43
44	if length == 0 {
45		// No value was encoded for this key
46		return
47	}
48
49	// writing v
50	copy(vb.Buffer[vb.WriteIndex:], v[:length])
51	vb.WriteIndex += length
52}
53
54// ReadValue is the helper method to decode Values to a map[Key][]byte.
55func (vb *Values) ReadValue() []byte {
56	// read length of v
57	length := int(vb.Buffer[vb.ReadIndex])
58	vb.ReadIndex++
59	if length == 0 {
60		// No value was encoded for this key
61		return nil
62	}
63
64	// read value of v
65	v := make([]byte, length)
66	endIdx := vb.ReadIndex + length
67	copy(v, vb.Buffer[vb.ReadIndex:endIdx])
68	vb.ReadIndex = endIdx
69	return v
70}
71
72// Bytes returns a reference to already written bytes in the Buffer.
73func (vb *Values) Bytes() []byte {
74	return vb.Buffer[:vb.WriteIndex]
75}
76