File: elsize.go

package info (click to toggle)
golang-github-tinylib-msgp 1.2.5-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 836 kB
  • sloc: makefile: 47
file content (128 lines) | stat: -rw-r--r-- 3,959 bytes parent folder | download | duplicates (2)
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
package msgp

func calcBytespec(v byte) bytespec {
	// single byte values
	switch v {

	case mnil:
		return bytespec{size: 1, extra: constsize, typ: NilType}
	case mfalse:
		return bytespec{size: 1, extra: constsize, typ: BoolType}
	case mtrue:
		return bytespec{size: 1, extra: constsize, typ: BoolType}
	case mbin8:
		return bytespec{size: 2, extra: extra8, typ: BinType}
	case mbin16:
		return bytespec{size: 3, extra: extra16, typ: BinType}
	case mbin32:
		return bytespec{size: 5, extra: extra32, typ: BinType}
	case mext8:
		return bytespec{size: 3, extra: extra8, typ: ExtensionType}
	case mext16:
		return bytespec{size: 4, extra: extra16, typ: ExtensionType}
	case mext32:
		return bytespec{size: 6, extra: extra32, typ: ExtensionType}
	case mfloat32:
		return bytespec{size: 5, extra: constsize, typ: Float32Type}
	case mfloat64:
		return bytespec{size: 9, extra: constsize, typ: Float64Type}
	case muint8:
		return bytespec{size: 2, extra: constsize, typ: UintType}
	case muint16:
		return bytespec{size: 3, extra: constsize, typ: UintType}
	case muint32:
		return bytespec{size: 5, extra: constsize, typ: UintType}
	case muint64:
		return bytespec{size: 9, extra: constsize, typ: UintType}
	case mint8:
		return bytespec{size: 2, extra: constsize, typ: IntType}
	case mint16:
		return bytespec{size: 3, extra: constsize, typ: IntType}
	case mint32:
		return bytespec{size: 5, extra: constsize, typ: IntType}
	case mint64:
		return bytespec{size: 9, extra: constsize, typ: IntType}
	case mfixext1:
		return bytespec{size: 3, extra: constsize, typ: ExtensionType}
	case mfixext2:
		return bytespec{size: 4, extra: constsize, typ: ExtensionType}
	case mfixext4:
		return bytespec{size: 6, extra: constsize, typ: ExtensionType}
	case mfixext8:
		return bytespec{size: 10, extra: constsize, typ: ExtensionType}
	case mfixext16:
		return bytespec{size: 18, extra: constsize, typ: ExtensionType}
	case mstr8:
		return bytespec{size: 2, extra: extra8, typ: StrType}
	case mstr16:
		return bytespec{size: 3, extra: extra16, typ: StrType}
	case mstr32:
		return bytespec{size: 5, extra: extra32, typ: StrType}
	case marray16:
		return bytespec{size: 3, extra: array16v, typ: ArrayType}
	case marray32:
		return bytespec{size: 5, extra: array32v, typ: ArrayType}
	case mmap16:
		return bytespec{size: 3, extra: map16v, typ: MapType}
	case mmap32:
		return bytespec{size: 5, extra: map32v, typ: MapType}
	}

	switch {

	// fixint
	case v >= mfixint && v < 0x80:
		return bytespec{size: 1, extra: constsize, typ: IntType}

	// fixstr gets constsize, since the prefix yields the size
	case v >= mfixstr && v < 0xc0:
		return bytespec{size: 1 + rfixstr(v), extra: constsize, typ: StrType}

	// fixmap
	case v >= mfixmap && v < 0x90:
		return bytespec{size: 1, extra: varmode(2 * rfixmap(v)), typ: MapType}

	// fixarray
	case v >= mfixarray && v < 0xa0:
		return bytespec{size: 1, extra: varmode(rfixarray(v)), typ: ArrayType}

	// nfixint
	case v >= mnfixint && uint16(v) < 0x100:
		return bytespec{size: 1, extra: constsize, typ: IntType}

	}

	// 0xC1 is unused per the spec and falls through to here,
	// everything else is covered above

	return bytespec{}
}

func getType(v byte) Type {
	return getBytespec(v).typ
}

// a valid bytespsec has
// non-zero 'size' and
// non-zero 'typ'
type bytespec struct {
	size  uint8   // prefix size information
	extra varmode // extra size information
	typ   Type    // type
	_     byte    // makes bytespec 4 bytes (yes, this matters)
}

// size mode
// if positive, # elements for composites
type varmode int8

const (
	constsize varmode = 0  // constant size (size bytes + uint8(varmode) objects)
	extra8    varmode = -1 // has uint8(p[1]) extra bytes
	extra16   varmode = -2 // has be16(p[1:]) extra bytes
	extra32   varmode = -3 // has be32(p[1:]) extra bytes
	map16v    varmode = -4 // use map16
	map32v    varmode = -5 // use map32
	array16v  varmode = -6 // use array16
	array32v  varmode = -7 // use array32
)