aboutsummaryrefslogtreecommitdiffstats
path: root/vespalib/src/vespa/vespalib/util/bits.cpp
blob: 2d9848f3cdf1ac8e40a239544c9d300065f814b0 (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
// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
#include <vespa/vespalib/util/bits.h>

namespace vespalib {

uint8_t                Bits::_reverse[256];
Bits::ReverseTableInit Bits::_reverseTableInit;

void * Bits::reverse(void * srcDst, size_t sz)
{
    uint8_t *v(static_cast<uint8_t *>(srcDst));
    size_t i(0);
    for(; i < sz/2; i++) {
        v[i] = reverse(v[sz-1-i]);
    }
    return v;
}

void Bits::forceInitNow()
{
    ReverseTableInit now;
}

Bits::ReverseTableInit::ReverseTableInit()
{
    if (_reverse[128] == 0) {
        for (size_t i(0); i < 256; i++) {
            _reverse[i] = reverse(i);
        }
    }
}

uint8_t Bits::ReverseTableInit::reverse(uint8_t v)
{
    return ((v >> 7) & 0x01) |
           ((v >> 5) & 0x02) |
           ((v >> 3) & 0x04) |
           ((v >> 1) & 0x08) |
           ((v << 1) & 0x10) |
           ((v << 3) & 0x20) |
           ((v << 5) & 0x40) |
           ((v << 7) & 0x80);
}

}