github.com/RomiChan/protobuf@v0.1.1-0.20230204044148-2ed269a2e54d/proto/encode.go (about)

     1  package proto
     2  
     3  import (
     4  	"unsafe"
     5  )
     6  
     7  func encodeZigZag64(v int64) uint64 {
     8  	return (uint64(v) << 1) ^ uint64(v>>63)
     9  }
    10  
    11  type encodeFunc = func([]byte, unsafe.Pointer, *structField) []byte
    12  
    13  func appendVarint(b []byte, v uint64) []byte {
    14  	switch {
    15  	case v < 1<<7:
    16  		b = append(b, byte(v))
    17  	case v < 1<<14:
    18  		b = append(b,
    19  			byte((v>>0)&0x7f|0x80),
    20  			byte(v>>7))
    21  	case v < 1<<21:
    22  		b = append(b,
    23  			byte((v>>0)&0x7f|0x80),
    24  			byte((v>>7)&0x7f|0x80),
    25  			byte(v>>14))
    26  	case v < 1<<28:
    27  		b = append(b,
    28  			byte((v>>0)&0x7f|0x80),
    29  			byte((v>>7)&0x7f|0x80),
    30  			byte((v>>14)&0x7f|0x80),
    31  			byte(v>>21))
    32  	case v < 1<<35:
    33  		b = append(b,
    34  			byte((v>>0)&0x7f|0x80),
    35  			byte((v>>7)&0x7f|0x80),
    36  			byte((v>>14)&0x7f|0x80),
    37  			byte((v>>21)&0x7f|0x80),
    38  			byte(v>>28))
    39  	case v < 1<<42:
    40  		b = append(b,
    41  			byte((v>>0)&0x7f|0x80),
    42  			byte((v>>7)&0x7f|0x80),
    43  			byte((v>>14)&0x7f|0x80),
    44  			byte((v>>21)&0x7f|0x80),
    45  			byte((v>>28)&0x7f|0x80),
    46  			byte(v>>35))
    47  	case v < 1<<49:
    48  		b = append(b,
    49  			byte((v>>0)&0x7f|0x80),
    50  			byte((v>>7)&0x7f|0x80),
    51  			byte((v>>14)&0x7f|0x80),
    52  			byte((v>>21)&0x7f|0x80),
    53  			byte((v>>28)&0x7f|0x80),
    54  			byte((v>>35)&0x7f|0x80),
    55  			byte(v>>42))
    56  	case v < 1<<56:
    57  		b = append(b,
    58  			byte((v>>0)&0x7f|0x80),
    59  			byte((v>>7)&0x7f|0x80),
    60  			byte((v>>14)&0x7f|0x80),
    61  			byte((v>>21)&0x7f|0x80),
    62  			byte((v>>28)&0x7f|0x80),
    63  			byte((v>>35)&0x7f|0x80),
    64  			byte((v>>42)&0x7f|0x80),
    65  			byte(v>>49))
    66  	case v < 1<<63:
    67  		b = append(b,
    68  			byte((v>>0)&0x7f|0x80),
    69  			byte((v>>7)&0x7f|0x80),
    70  			byte((v>>14)&0x7f|0x80),
    71  			byte((v>>21)&0x7f|0x80),
    72  			byte((v>>28)&0x7f|0x80),
    73  			byte((v>>35)&0x7f|0x80),
    74  			byte((v>>42)&0x7f|0x80),
    75  			byte((v>>49)&0x7f|0x80),
    76  			byte(v>>56))
    77  	default:
    78  		b = append(b,
    79  			byte((v>>0)&0x7f|0x80),
    80  			byte((v>>7)&0x7f|0x80),
    81  			byte((v>>14)&0x7f|0x80),
    82  			byte((v>>21)&0x7f|0x80),
    83  			byte((v>>28)&0x7f|0x80),
    84  			byte((v>>35)&0x7f|0x80),
    85  			byte((v>>42)&0x7f|0x80),
    86  			byte((v>>49)&0x7f|0x80),
    87  			byte((v>>56)&0x7f|0x80),
    88  			1)
    89  	}
    90  	return b
    91  }
    92  
    93  func appendVarintZigZag(b []byte, v int64) []byte {
    94  	return appendVarint(b, encodeZigZag64(v))
    95  }
    96  
    97  func encodeLE32(b []byte, v uint32) []byte {
    98  	return append(b,
    99  		byte(v>>0),
   100  		byte(v>>8),
   101  		byte(v>>16),
   102  		byte(v>>24))
   103  }
   104  
   105  func encodeLE64(b []byte, v uint64) []byte {
   106  	return append(b,
   107  		byte(v>>0),
   108  		byte(v>>8),
   109  		byte(v>>16),
   110  		byte(v>>24),
   111  		byte(v>>32),
   112  		byte(v>>40),
   113  		byte(v>>48),
   114  		byte(v>>56))
   115  }
   116  
   117  func appendTag(b []byte, f fieldNumber, t wireType) []byte {
   118  	return appendVarint(b, uint64(f)<<3|uint64(t))
   119  }