aboutsummaryrefslogtreecommitdiffstats
path: root/vendor/github.com/allegro/bigcache/encoding.go
blob: 4d434e5dce0a2d71aee9a97c1c89ffd8654c2b37 (plain) (blame)
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
package bigcache

import (
    "encoding/binary"
)

const (
    timestampSizeInBytes = 8                                                       // Number of bytes used for timestamp
    hashSizeInBytes      = 8                                                       // Number of bytes used for hash
    keySizeInBytes       = 2                                                       // Number of bytes used for size of entry key
    headersSizeInBytes   = timestampSizeInBytes + hashSizeInBytes + keySizeInBytes // Number of bytes used for all headers
)

func wrapEntry(timestamp uint64, hash uint64, key string, entry []byte, buffer *[]byte) []byte {
    keyLength := len(key)
    blobLength := len(entry) + headersSizeInBytes + keyLength

    if blobLength > len(*buffer) {
        *buffer = make([]byte, blobLength)
    }
    blob := *buffer

    binary.LittleEndian.PutUint64(blob, timestamp)
    binary.LittleEndian.PutUint64(blob[timestampSizeInBytes:], hash)
    binary.LittleEndian.PutUint16(blob[timestampSizeInBytes+hashSizeInBytes:], uint16(keyLength))
    copy(blob[headersSizeInBytes:], key)
    copy(blob[headersSizeInBytes+keyLength:], entry)

    return blob[:blobLength]
}

func readEntry(data []byte) []byte {
    length := binary.LittleEndian.Uint16(data[timestampSizeInBytes+hashSizeInBytes:])

    // copy on read
    dst := make([]byte, len(data)-int(headersSizeInBytes+length))
    copy(dst, data[headersSizeInBytes+length:])

    return dst
}

func readTimestampFromEntry(data []byte) uint64 {
    return binary.LittleEndian.Uint64(data)
}

func readKeyFromEntry(data []byte) string {
    length := binary.LittleEndian.Uint16(data[timestampSizeInBytes+hashSizeInBytes:])

    // copy on read
    dst := make([]byte, length)
    copy(dst, data[headersSizeInBytes:headersSizeInBytes+length])

    return bytesToString(dst)
}

func readHashFromEntry(data []byte) uint64 {
    return binary.LittleEndian.Uint64(data[timestampSizeInBytes:])
}

func resetKeyFromEntry(data []byte) {
    binary.LittleEndian.PutUint64(data[timestampSizeInBytes:], 0)
}