24#ifndef DCCL_NATIVE_PROTOBUF_20190218H 
   25#define DCCL_NATIVE_PROTOBUF_20190218H 
   27#include <google/protobuf/io/coded_stream.h> 
   28#include <google/protobuf/io/zero_copy_stream_impl_lite.h> 
   29#include <google/protobuf/unknown_field_set.h> 
   30#include <google/protobuf/wire_format_lite.h> 
   32#include <google/protobuf/stubs/common.h> 
   33#if GOOGLE_PROTOBUF_VERSION < 3008000 
   34#include <google/protobuf/wire_format_lite_inl.h>  
   37#include "../field_codec_fixed.h" 
   38#include "../field_codec_typed.h" 
   43namespace native_protobuf
 
   45template <
typename WireType, google::protobuf::
internal::WireFormatLite::FieldType DeclaredType>
 
   48    WireType decode(google::protobuf::io::CodedInputStream* input_stream)
 
   51        google::protobuf::internal::WireFormatLite::ReadPrimitive<WireType, DeclaredType>(
 
   52            input_stream, &value);
 
 
   57template <
typename WireType, google::protobuf::FieldDescriptor::Type DeclaredType>
 
   62template <
typename WireType>
 
   65                                     google::protobuf::internal::WireFormatLite::TYPE_INT64>
 
   67    unsigned byte_size(
const WireType& wire_value)
 
   69        return google::protobuf::internal::WireFormatLite::Int64Size(wire_value);
 
   71    void encode(WireType wire_value, std::vector<google::protobuf::uint8>* bytes)
 
   73        google::protobuf::internal::WireFormatLite::WriteInt64NoTagToArray(wire_value,
 
   76    bool is_varint() { 
return true; }
 
 
   79template <
typename WireType>
 
   82                                     google::protobuf::internal::WireFormatLite::TYPE_INT32>
 
   84    unsigned byte_size(
const WireType& wire_value)
 
   86        return google::protobuf::internal::WireFormatLite::Int32Size(wire_value);
 
   88    void encode(WireType wire_value, std::vector<google::protobuf::uint8>* bytes)
 
   90        google::protobuf::internal::WireFormatLite::WriteInt32NoTagToArray(wire_value,
 
   93    bool is_varint() { 
return true; }
 
 
   96template <
typename WireType>
 
   99                                     google::protobuf::internal::WireFormatLite::TYPE_UINT64>
 
  101    unsigned byte_size(
const WireType& wire_value)
 
  103        return google::protobuf::internal::WireFormatLite::UInt64Size(wire_value);
 
  105    void encode(WireType wire_value, std::vector<google::protobuf::uint8>* bytes)
 
  107        google::protobuf::internal::WireFormatLite::WriteUInt64NoTagToArray(wire_value,
 
  110    bool is_varint() { 
return true; }
 
 
  113template <
typename WireType>
 
  116                                     google::protobuf::internal::WireFormatLite::TYPE_UINT32>
 
  118    unsigned byte_size(
const WireType& wire_value)
 
  120        return google::protobuf::internal::WireFormatLite::UInt32Size(wire_value);
 
  122    void encode(WireType wire_value, std::vector<google::protobuf::uint8>* bytes)
 
  124        google::protobuf::internal::WireFormatLite::WriteUInt32NoTagToArray(wire_value,
 
  127    bool is_varint() { 
return true; }
 
 
  130template <
typename WireType>
 
  133                                     google::protobuf::internal::WireFormatLite::TYPE_SINT64>
 
  135    unsigned byte_size(
const WireType& wire_value)
 
  137        return google::protobuf::internal::WireFormatLite::SInt64Size(wire_value);
 
  139    void encode(WireType wire_value, std::vector<google::protobuf::uint8>* bytes)
 
  141        google::protobuf::internal::WireFormatLite::WriteSInt64NoTagToArray(wire_value,
 
  144    bool is_varint() { 
return true; }
 
 
  147template <
typename WireType>
 
  150                                     google::protobuf::internal::WireFormatLite::TYPE_SINT32>
 
  152    unsigned byte_size(
const WireType& wire_value)
 
  154        return google::protobuf::internal::WireFormatLite::SInt32Size(wire_value);
 
  156    void encode(WireType wire_value, std::vector<google::protobuf::uint8>* bytes)
 
  158        google::protobuf::internal::WireFormatLite::WriteSInt32NoTagToArray(wire_value,
 
  161    bool is_varint() { 
return true; }
 
 
  164template <
typename WireType>
 
  167                                     google::protobuf::internal::WireFormatLite::TYPE_ENUM>
 
  169    unsigned byte_size(
const WireType& wire_value)
 
  171        return google::protobuf::internal::WireFormatLite::EnumSize(wire_value);
 
  173    void encode(WireType wire_value, std::vector<google::protobuf::uint8>* bytes)
 
  175        google::protobuf::internal::WireFormatLite::WriteEnumNoTagToArray(wire_value, &(*bytes)[0]);
 
  177    bool is_varint() { 
return true; }
 
 
  180template <
typename WireType>
 
  183                                     google::protobuf::internal::WireFormatLite::TYPE_DOUBLE>
 
  185    unsigned byte_size(
const WireType& )
 
  187        return google::protobuf::internal::WireFormatLite::kDoubleSize;
 
  189    void encode(WireType wire_value, std::vector<google::protobuf::uint8>* bytes)
 
  191        google::protobuf::internal::WireFormatLite::WriteDoubleNoTagToArray(wire_value,
 
  194    bool is_varint() { 
return false; }
 
 
  197template <
typename WireType>
 
  200                                     google::protobuf::internal::WireFormatLite::TYPE_FLOAT>
 
  202    unsigned byte_size(
const WireType& )
 
  204        return google::protobuf::internal::WireFormatLite::kFloatSize;
 
  206    void encode(WireType wire_value, std::vector<google::protobuf::uint8>* bytes)
 
  208        google::protobuf::internal::WireFormatLite::WriteFloatNoTagToArray(wire_value,
 
  211    bool is_varint() { 
return false; }
 
 
  214template <
typename WireType>
 
  217                                     google::protobuf::internal::WireFormatLite::TYPE_BOOL>
 
  219    unsigned byte_size(
const WireType& )
 
  221        return google::protobuf::internal::WireFormatLite::kBoolSize;
 
  223    void encode(WireType wire_value, std::vector<google::protobuf::uint8>* bytes)
 
  225        google::protobuf::internal::WireFormatLite::WriteBoolNoTagToArray(wire_value, &(*bytes)[0]);
 
  227    bool is_varint() { 
return false; }
 
 
  230template <
typename WireType>
 
  233                                     google::protobuf::internal::WireFormatLite::TYPE_FIXED64>
 
  235    unsigned byte_size(
const WireType& )
 
  237        return google::protobuf::internal::WireFormatLite::kFixed64Size;
 
  239    void encode(WireType wire_value, std::vector<google::protobuf::uint8>* bytes)
 
  241        google::protobuf::internal::WireFormatLite::WriteFixed64NoTagToArray(wire_value,
 
  244    bool is_varint() { 
return false; }
 
 
  247template <
typename WireType>
 
  250                                     google::protobuf::internal::WireFormatLite::TYPE_FIXED32>
 
  252    unsigned byte_size(
const WireType& )
 
  254        return google::protobuf::internal::WireFormatLite::kFixed32Size;
 
  256    void encode(WireType wire_value, std::vector<google::protobuf::uint8>* bytes)
 
  258        google::protobuf::internal::WireFormatLite::WriteFixed32NoTagToArray(wire_value,
 
  261    bool is_varint() { 
return false; }
 
 
  264template <
typename WireType>
 
  267                                     google::protobuf::internal::WireFormatLite::TYPE_SFIXED64>
 
  269    unsigned byte_size(
const WireType& )
 
  271        return google::protobuf::internal::WireFormatLite::kSFixed64Size;
 
  273    void encode(WireType wire_value, std::vector<google::protobuf::uint8>* bytes)
 
  275        google::protobuf::internal::WireFormatLite::WriteSFixed64NoTagToArray(wire_value,
 
  278    bool is_varint() { 
return false; }
 
 
  281template <
typename WireType>
 
  284                                     google::protobuf::internal::WireFormatLite::TYPE_SFIXED32>
 
  286    unsigned byte_size(
const WireType& )
 
  288        return google::protobuf::internal::WireFormatLite::kSFixed32Size;
 
  290    void encode(WireType wire_value, std::vector<google::protobuf::uint8>* bytes)
 
  292        google::protobuf::internal::WireFormatLite::WriteSFixed32NoTagToArray(wire_value,
 
  295    bool is_varint() { 
return false; }
 
 
  298template <
typename WireType, google::protobuf::FieldDescriptor::Type DeclaredType,
 
  299          typename FieldType = WireType>
 
  303    unsigned presence_bit_size() { 
return this->
use_required() ? 0 : 1; }
 
  305    unsigned min_size()
 override 
  310            if (helper_.is_varint())
 
  313                return BITS_IN_BYTE * helper_.byte_size(WireType());
 
  318            return presence_bit_size();
 
  322    unsigned max_size()
 override 
  325        return std::max<unsigned>(size(std::numeric_limits<WireType>::min()),
 
  326                                  size(std::numeric_limits<WireType>::max()));
 
  329    unsigned size()
 override { 
return min_size(); }
 
  331    unsigned size(
const WireType& wire_value)
 override 
  333        unsigned data_bytes = helper_.byte_size(wire_value);
 
  334        unsigned size = presence_bit_size() + BITS_IN_BYTE * data_bytes;
 
  341        return Bitset(min_size(), 0);
 
  344    Bitset encode(
const WireType& wire_value)
 override 
  346        std::vector<google::protobuf::uint8> bytes(size(wire_value) / BITS_IN_BYTE, 0);
 
  348        helper_.encode(wire_value, &bytes);
 
  354            data_bits.resize(data_bits.size() + presence_bit_size());
 
  356            data_bits.
set(0, 
true); 
 
  361    WireType decode(
Bitset* bits)
 override 
  365            dccl::uint64 uint_value = (bits->template to<dccl::uint64>)();
 
  370            if (helper_.is_varint())
 
  373                bits->
get_more_bits(BITS_IN_BYTE * helper_.byte_size(WireType()));
 
  376        if (helper_.is_varint())
 
  383        google::protobuf::io::CodedInputStream input_stream(
 
  384            reinterpret_cast<const google::protobuf::uint8*
>(bytes.data()), bytes.size());
 
  386        return helper_.decode(&input_stream);
 
 
  395                                     const google::protobuf::EnumValueDescriptor*>
 
  398    int pre_encode(
const google::protobuf::EnumValueDescriptor* 
const& field_value) 
override;
 
  399    const google::protobuf::EnumValueDescriptor* post_decode(
const int& wire_value) 
override;
 
 
 
A variable size container of bits (subclassed from std::deque<bool>) with an optional hierarchy....
void get_more_bits(size_type num_bits)
Retrieve more bits from the parent Bitset.
bool test(size_type n) const
Test a bit (return its value)
std::string to_byte_string()
Returns the value of the Bitset to a byte string, where each character represents 8 bits of the Bitse...
Bitset & set(size_type n, bool val=true)
Set a bit to a given value.
void from_byte_stream(CharIterator begin, CharIterator end)
Sets the value of the Bitset to the contents of a byte string, where each character represents 8 bits...
bool use_required()
Whether to use the required or optional encoding.
Exception used to signal null (non-existent) value within field codecs during decode.
Base class for static-typed (no dccl::any) field encoders/decoders. Most single-valued user defined v...
Dynamic Compact Control Language namespace.
google::protobuf::uint64 uint64
an unsigned 64 bit integer