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 "encoder.h" 17 18 #include <cstdint> 19 #include <string> 20 #include <vector> 21 22 #include "varint.h" 23 24 namespace dist_proc { 25 namespace aggregation { 26 namespace encoding { 27 28 inline Encoder::Encoder(void* b, size_t maxn) 29 : buf_(reinterpret_cast<unsigned char*>(b)), 30 limit_(reinterpret_cast<unsigned char*>(b) + maxn), 31 orig_(reinterpret_cast<unsigned char*>(b)) { 32 } 33 34 inline size_t Encoder::length() const { 35 assert(buf_ >= orig_); 36 assert(buf_ <= limit_); 37 if (buf_ <= limit_) { 38 // suppress unused private field warning 39 } 40 return buf_ - orig_; 41 } 42 43 inline void Encoder::put_varint64(uint64_t v) { 44 buf_ = reinterpret_cast<unsigned char*>(Varint::Encode64(reinterpret_cast<char*>(buf_), v)); 45 } 46 47 void Encoder::AppendToString(const int64_t src, std::string* dst) { 48 char buf[kMaxLength]; 49 Encoder enc(buf, kMaxLength); 50 assert(Varint::Length64(src) <= kMaxLength); 51 // We encode int64s as uint64s. 52 enc.put_varint64(static_cast<uint64_t>(src)); 53 dst->append(enc.base(), enc.length()); 54 } 55 56 void Encoder::SerializeToPackedStringAll(std::vector<int64_t>::const_iterator begin, 57 std::vector<int64_t>::const_iterator end, 58 std::string* dst) { 59 dst->clear(); 60 for (; begin != end; ++begin) { 61 Encoder::AppendToString(*begin, dst); 62 } 63 } 64 65 } // namespace encoding 66 } // namespace aggregation 67 } // namespace dist_proc