| /* |
| * Copyright (C) 2016 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #ifndef GAPIC_ENCODER_H |
| #define GAPIC_ENCODER_H |
| |
| #include "id.h" |
| #include "assert.h" |
| |
| #include <memory> |
| #include <stdint.h> |
| #include <string> |
| #include <unordered_map> |
| #include <vector> |
| |
| namespace gapic { |
| |
| namespace schema { |
| class Entity; |
| } |
| |
| class StreamWriter; |
| class Encodable; |
| class Encoder; |
| |
| class Encodable { |
| public: |
| virtual void Encode(Encoder* to) const = 0; |
| virtual const schema::Entity* Schema() const = 0; |
| }; |
| |
| // Encoder provides methods for encoding values to the provided StreamWriter |
| // using variable-length-encoding. |
| class Encoder { |
| public: |
| Encoder(std::shared_ptr<StreamWriter> output); |
| |
| void Bool(bool); |
| void Int8(int8_t); |
| void Uint8(uint8_t); |
| void Uint16(uint16_t); |
| void Int16(int16_t); |
| void Float32(float); |
| void Uint32(uint32_t); |
| void Int32(int32_t); |
| void Float64(double); |
| void Uint64(uint64_t); |
| void Int64(int64_t); |
| void Pointer(const void*); |
| void String(const char*); |
| void String(const std::string& str) { String(str.c_str()); } |
| void Data(const void* ptr, int32_t size); |
| void Id(const gapic::Id&); |
| void Entity(const schema::Entity*); |
| |
| void Encode(bool b) { Bool(b); } |
| void Encode(int8_t v) { Int8(v); } |
| void Encode(uint8_t v) { Uint8(v); } |
| void Encode(uint16_t v) { Uint16(v); } |
| void Encode(float v) { Float32(v); } |
| void Encode(uint32_t v) { Uint32(v); } |
| void Encode(int32_t v) { Int32(v); } |
| void Encode(double v) { Float64(v); } |
| void Encode(uint64_t v) { Uint64(v); } |
| void Encode(const char* v) { String(v); } |
| void Encode(const std::string& v) { String(v); } |
| void Encode(const gapic::Id& id) { Id(id); } |
| |
| void Struct(const Encodable& obj); |
| void Variant(const Encodable* obj); |
| void Object(const Encodable* obj); |
| |
| private: |
| std::unordered_map<gapic::Id, uint32_t> mIds; |
| std::unordered_map<const schema::Entity*, uint32_t> mEntities; |
| std::shared_ptr<StreamWriter> mOutput; |
| uint32_t mLastObjectId; |
| }; |
| |
| |
| } // namespace gapic |
| |
| #endif // GAPIC_ENCODER_H |