OSDN Git Service

new repo
[bytom/vapor.git] / vendor / golang.org / x / text / unicode / runenames / gen_bits.go
1 // Copyright 2016 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
4
5 // +build ignore
6
7 package main
8
9 // This file contains code common to gen.go and the package code.
10
11 // The mapping from rune to string (i.e. offset and length in the data string)
12 // is encoded as a two level table. The first level maps from contiguous rune
13 // ranges [runeOffset, runeOffset+runeLength) to entries. Entries are either
14 // direct (for repeated names such as "<CJK Ideograph>") or indirect (for runs
15 // of unique names such as "SPACE", "EXCLAMATION MARK", "QUOTATION MARK", ...).
16 //
17 // Each first level table element is 64 bits. The runeOffset (21 bits) and
18 // runeLength (16 bits) take the 37 high bits. The entry takes the 27 low bits,
19 // with directness encoded in the least significant bit.
20 //
21 // A direct entry encodes a dataOffset (18 bits) and dataLength (8 bits) in the
22 // data string. 18 bits is too short to encode the entire data string's length,
23 // but the data string's contents are arranged so that all of the few direct
24 // entries' offsets come before all of the many indirect entries' offsets.
25 //
26 // An indirect entry encodes a dataBase (10 bits) and a table1Offset (16 bits).
27 // The table1Offset is the start of a range in the second level table. The
28 // length of that range is the same as the runeLength.
29 //
30 // Each second level table element is 16 bits, an index into data, relative to
31 // a bias equal to (dataBase << dataBaseUnit). That (bias + index) is the
32 // (dataOffset + dataLength) in the data string. The dataOffset is implied by
33 // the previous table element (with the same implicit bias).
34
35 const (
36         bitsRuneOffset = 21
37         bitsRuneLength = 16
38         bitsDataOffset = 18
39         bitsDataLength = 8
40         bitsDirect     = 1
41
42         bitsDataBase     = 10
43         bitsTable1Offset = 16
44
45         shiftRuneOffset = 0 + bitsDirect + bitsDataLength + bitsDataOffset + bitsRuneLength
46         shiftRuneLength = 0 + bitsDirect + bitsDataLength + bitsDataOffset
47         shiftDataOffset = 0 + bitsDirect + bitsDataLength
48         shiftDataLength = 0 + bitsDirect
49         shiftDirect     = 0
50
51         shiftDataBase     = 0 + bitsDirect + bitsTable1Offset
52         shiftTable1Offset = 0 + bitsDirect
53
54         maskRuneLength = 1<<bitsRuneLength - 1
55         maskDataOffset = 1<<bitsDataOffset - 1
56         maskDataLength = 1<<bitsDataLength - 1
57         maskDirect     = 1<<bitsDirect - 1
58
59         maskDataBase     = 1<<bitsDataBase - 1
60         maskTable1Offset = 1<<bitsTable1Offset - 1
61
62         dataBaseUnit = 10
63 )