1 /*
2 * Copyright 2021 Google LLC
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16 #include "varint.h"
17
18 #include <cstdint>
19
Encode32(char * sptr,uint32_t v)20 char* Varint::Encode32(char* sptr, uint32_t v) {
21 return Encode32Inline(sptr, v);
22 }
23
Encode64(char * sptr,uint64_t v)24 char* Varint::Encode64(char* sptr, uint64_t v) {
25 if (v < (1u << 28)) {
26 return Varint::Encode32(sptr, v);
27 } else {
28 // Operate on characters as unsigneds
29 unsigned char* ptr = reinterpret_cast<unsigned char*>(sptr);
30 // Rather than computing four subresults and or'ing each with 0x80,
31 // we can do two ors now. (Doing one now wouldn't work.)
32 const uint32_t x32 = v | (1 << 7) | (1 << 21);
33 const uint32_t y32 = v | (1 << 14) | (1 << 28);
34 *(ptr++) = x32;
35 *(ptr++) = y32 >> 7;
36 *(ptr++) = x32 >> 14;
37 *(ptr++) = y32 >> 21;
38 if (v < (1ull << 35)) {
39 *(ptr++) = v >> 28;
40 return reinterpret_cast<char*>(ptr);
41 } else {
42 *(ptr++) = (v >> 28) | (1 << 7);
43 return Varint::Encode32(reinterpret_cast<char*>(ptr), v >> 35);
44 }
45 }
46 }
47