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