blob: 63cccacedbb9c3dfb10de7b7c664d607e062b7f8 [file] [log] [blame]
Jonathan Hart828908c2020-04-15 14:23:45 -07001/*
2 * Copyright (c) 2008 The Board of Trustees of The Leland Stanford Junior University
3 * Copyright (c) 2011, 2012 Open Networking Foundation
4 * Copyright 2013, Big Switch Networks, Inc. This library was generated by the LoxiGen Compiler.
5 * Copyright 2018, Red Hat, Inc.
6 */
Don Newton98fd8812019-09-23 15:15:02 -04007package goloxi
8
9import (
10 "encoding/binary"
11)
12
13type Decoder struct {
14 buffer []byte
15 offset int
16 baseOffset int
17}
18
19func NewDecoder(data []byte) *Decoder {
20 return &Decoder{
21 buffer: data,
22 }
23}
24
25func (d *Decoder) ReadByte() byte {
26 c := d.buffer[d.offset]
27 d.offset++
28 return c
29}
30
31func (d *Decoder) ReadUint8() uint8 {
32 i := uint8(d.buffer[d.offset])
33 d.offset++
34 return i
35}
36
37func (d *Decoder) ReadUint16() uint16 {
38 i := binary.BigEndian.Uint16(d.buffer[d.offset : d.offset+2])
39 d.offset += 2
40 return i
41}
42
43func (d *Decoder) ReadUint32() uint32 {
44 i := binary.BigEndian.Uint32(d.buffer[d.offset : d.offset+4])
45 d.offset += 4
46 return i
47}
48
49func (d *Decoder) ReadUint64() uint64 {
50 i := binary.BigEndian.Uint64(d.buffer[d.offset : d.offset+8])
51 d.offset += 8
52 return i
53}
54
55func (d *Decoder) ReadUint128() Uint128 {
56 hi := binary.BigEndian.Uint64(d.buffer[d.offset : d.offset+8])
57 lo := binary.BigEndian.Uint64(d.buffer[d.offset+8 : d.offset+16])
58 d.offset += 16
59 return Uint128{
60 Hi: hi,
61 Lo: lo,
62 }
63}
64
65func (d *Decoder) Skip(n int) {
66 d.offset += n
67}
68
69func (d *Decoder) SkipAlign() {
70 d.offset += (d.baseOffset+d.offset+7)/8*8 - d.baseOffset - d.offset
71}
72
73func (d *Decoder) Read(n int) []byte {
74 data := d.buffer[d.offset : d.offset+n]
75 d.offset += n
76 return data
77}
78
79func (d *Decoder) Length() int {
80 return len(d.buffer) - d.offset
81}
82
83func (d *Decoder) Bytes() []byte {
84 return d.buffer[d.offset:]
85}
86
87func (d *Decoder) Offset() int {
88 return d.offset
89}
90
91func (d *Decoder) BaseOffset() int {
92 return d.baseOffset
93}
94
95func (d *Decoder) SliceDecoder(length, rewind int) *Decoder {
96 newDecoder := NewDecoder(d.buffer[d.offset : d.offset+length-rewind])
97 newDecoder.baseOffset = d.offset + d.baseOffset
98 d.offset += length - rewind
99 return newDecoder
100}