github.com/go-xe2/third@v1.0.3/golang.org/x/text/unicode/runenames/gen_bits.go (about)

     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  )