DCCL v4
|
Base class for "repeated" (multiple value) static-typed (no dccl::any) field encoders/decoders. Use TypedFixedFieldCodec if your codec is fixed length (always uses the same number of bits on the wire). Use TypedFieldCodec if your fields are always singular ("optional" or "required"). Singular fields are default implemented in this codec by calls to the equivalent repeated function with an empty or single valued vector. More...
#include <dccl/field_codec_typed.h>
Public Types | |
using | wire_type = WireType |
using | field_type = FieldType |
Public Types inherited from dccl::TypedFieldCodec< WireType, WireType > | |
using | wire_type = WireType |
using | field_type = WireType |
Public Member Functions | |
virtual Bitset | encode_repeated (const std::vector< WireType > &wire_value)=0 |
Encode a repeated field. | |
virtual std::vector< WireType > | decode_repeated (Bitset *bits)=0 |
Decode a repeated field. | |
virtual unsigned | size_repeated (const std::vector< WireType > &wire_values)=0 |
Give the size of a repeated field. | |
unsigned | max_size_repeated () override=0 |
Give the max size of a repeated field. | |
unsigned | min_size_repeated () override=0 |
Give the min size of a repeated field. | |
Bitset | encode () override |
Encode an empty field. More... | |
Bitset | encode (const WireType &wire_value) override |
Encode a non-empty field. More... | |
WireType | decode (dccl::Bitset *bits) override |
Decode a field. If the field is empty (i.e. was encoded using the zero-argument encode()), throw NullValueException to indicate this. More... | |
unsigned | size () override |
Calculate the size (in bits) of an empty field. More... | |
unsigned | size (const WireType &wire_value) override |
Calculate the size (in bits) of a non-empty field. More... | |
unsigned | max_size () override |
Calculate maximum size of the field in bits. More... | |
unsigned | min_size () override |
Calculate minimum size of the field in bits. More... | |
Public Member Functions inherited from dccl::FieldCodecSelector< WireType, WireType > | |
virtual WireType | pre_encode (const WireType &field_value)=0 |
Convert from the FieldType representation (used in the Google Protobuf message) to the WireType representation (used with encode() and decode(), i.e. "on the wire"). More... | |
virtual WireType | post_decode (const WireType &wire_value)=0 |
Convert from the WireType representation (used with encode() and decode(), i.e. "on the wire") to the FieldType representation (used in the Google Protobuf message). More... | |
Public Member Functions inherited from dccl::FieldCodecBase | |
FieldCodecBase () | |
virtual | ~FieldCodecBase ()=default |
void | base_encode (Bitset *bits, const google::protobuf::Message &msg, MessagePart part, bool strict) |
Encode this part (body or head) of the base message. More... | |
void | base_size (unsigned *bit_size, const google::protobuf::Message &msg, MessagePart part) |
Calculate the size (in bits) of a part of the base message when it is encoded. More... | |
void | base_decode (Bitset *bits, google::protobuf::Message *msg, MessagePart part) |
Decode part of a message. More... | |
void | base_max_size (unsigned *bit_size, const google::protobuf::Descriptor *desc, MessagePart part) |
Calculate the maximum size of a message given its Descriptor alone (no data) More... | |
void | base_min_size (unsigned *bit_size, const google::protobuf::Descriptor *desc, MessagePart part) |
Calculate the minimum size of a message given its Descriptor alone (no data) More... | |
void | base_validate (const google::protobuf::Descriptor *desc, MessagePart part) |
Validate this part of the message to make sure all required extensions are set. More... | |
void | base_info (std::ostream *os, const google::protobuf::Descriptor *desc, MessagePart part) |
Get human readable information (size of fields, etc.) about this part of the DCCL message. More... | |
void | base_hash (std::size_t *hash, const google::protobuf::Descriptor *desc, MessagePart part) |
Provide a hash of the DCCL message definition to detect changes in the DCCL message. More... | |
std::string | name () const |
the name of the codec used to identifier it in the .proto custom option extension | |
google::protobuf::FieldDescriptor::Type | field_type () const |
the type exposed to the user in the original and decoded Protobuf messages More... | |
google::protobuf::FieldDescriptor::CppType | wire_type () const |
the C++ type used "on the wire". This is the type visible after pre_encode and before post_decode functions are called. More... | |
const google::protobuf::FieldDescriptor * | this_field () const |
Returns the FieldDescriptor (field schema meta-data) for this field. More... | |
const google::protobuf::Descriptor * | this_descriptor () const |
Returns the Descriptor (message schema meta-data) for the immediate parent Message. More... | |
const google::protobuf::Message * | this_message () |
const google::protobuf::Message * | root_message () |
const google::protobuf::Descriptor * | root_descriptor () const |
internal::MessageStackData & | message_data () |
const internal::MessageStackData & | message_data () const |
bool | has_codec_group () |
std::string | codec_group () |
int | codec_version () |
MessagePart | part () |
the part of the message currently being encoded (head or body) | |
bool | strict () |
void | set_force_use_required (bool force_required=true) |
Force the codec to always use the "required" field encoding, regardless of the FieldDescriptor setting. Useful when wrapping this codec in another that handles optional and repeated fields. | |
void | field_pre_encode (dccl::any *wire_value, const dccl::any &field_value) |
Pre-encodes a non-repeated (i.e. optional or required) field by converting the FieldType representation (the Google Protobuf representation) into the WireType representation (the type used in the encoded DCCL message). This allows for type-converting codecs. More... | |
void | field_pre_encode_repeated (std::vector< dccl::any > *wire_values, const std::vector< dccl::any > &field_values) |
Pre-encodes a repeated field. More... | |
void | field_encode (Bitset *bits, const dccl::any &field_value, const google::protobuf::FieldDescriptor *field) |
Encode a non-repeated field. More... | |
void | field_encode_repeated (Bitset *bits, const std::vector< dccl::any > &field_values, const google::protobuf::FieldDescriptor *field) |
Encode a repeated field. More... | |
void | field_size (unsigned *bit_size, const dccl::any &field_value, const google::protobuf::FieldDescriptor *field) |
Calculate the size of a field. More... | |
void | field_size_repeated (unsigned *bit_size, const std::vector< dccl::any > &field_values, const google::protobuf::FieldDescriptor *field) |
Calculate the size of a repeated field. More... | |
void | field_decode (Bitset *bits, dccl::any *field_value, const google::protobuf::FieldDescriptor *field) |
Decode a non-repeated field. More... | |
void | field_decode_repeated (Bitset *bits, std::vector< dccl::any > *field_values, const google::protobuf::FieldDescriptor *field) |
Decode a repeated field. More... | |
void | field_post_decode (const dccl::any &wire_value, dccl::any *field_value) |
Post-decodes a non-repeated (i.e. optional or required) field by converting the WireType (the type used in the encoded DCCL message) representation into the FieldType representation (the Google Protobuf representation). This allows for type-converting codecs. More... | |
void | field_post_decode_repeated (const std::vector< dccl::any > &wire_values, std::vector< dccl::any > *field_values) |
Post-decodes a repeated field. More... | |
void | field_max_size (unsigned *bit_size, const google::protobuf::FieldDescriptor *field) |
Calculate the upper bound on this field's size (in bits) More... | |
void | field_min_size (unsigned *bit_size, const google::protobuf::FieldDescriptor *field) |
Calculate the lower bound on this field's size (in bits) More... | |
void | field_validate (bool *b, const google::protobuf::FieldDescriptor *field) |
Validate this field, checking that all required option extensions are set (e.g. (dccl.field).max and (dccl.field).min for arithmetic codecs) More... | |
void | field_info (std::ostream *os, const google::protobuf::FieldDescriptor *field) |
Write human readable information about the field and its bounds to the provided stream. More... | |
void | field_hash (std::size_t *hash, const google::protobuf::FieldDescriptor *field) |
Provide a hash for this field definition. More... | |
dccl::DCCLFieldOptions | dccl_field_options () const |
Get the DCCL field option extension value for the current field. More... | |
void | require (bool b, const std::string &description) |
Essentially an assertion to be used in the validate() virtual method. More... | |
DynamicConditions & | dynamic_conditions (const google::protobuf::FieldDescriptor *field) |
FieldCodecManagerLocal & | manager () |
const FieldCodecManagerLocal & | manager () const |
virtual void | set_manager (FieldCodecManagerLocal *manager) |
Additional Inherited Members | |
Static Public Member Functions inherited from dccl::FieldCodecBase | |
static std::string | codec_group (const google::protobuf::Descriptor *desc) |
Protected Member Functions inherited from dccl::FieldCodecBase | |
bool | use_required () |
Whether to use the required or optional encoding. | |
virtual void | validate () |
Validate a field. Use require() inside your overloaded validate() to assert requirements or throw Exceptions directly as needed. | |
virtual std::string | info () |
Write field specific information (in addition to general information such as sizes that are automatically written by this class for all fields. More... | |
virtual std::size_t | hash () |
Generate a field specific hash to be combined with the descriptor hash. | |
virtual void | any_pre_encode_repeated (std::vector< dccl::any > *wire_values, const std::vector< dccl::any > &field_values) |
virtual void | any_post_decode_repeated (const std::vector< dccl::any > &wire_values, std::vector< dccl::any > *field_values) |
void | check_repeat_settings () const |
Base class for "repeated" (multiple value) static-typed (no dccl::any) field encoders/decoders. Use TypedFixedFieldCodec if your codec is fixed length (always uses the same number of bits on the wire). Use TypedFieldCodec if your fields are always singular ("optional" or "required"). Singular fields are default implemented in this codec by calls to the equivalent repeated function with an empty or single valued vector.
WireType | the type used for the encode and decode functions. This can be any C++ type, and is often the same as FieldType, unless a type conversion should be performed. The reason for using a different WireType and FieldType should be clear from the DefaultEnumCodec which uses DefaultNumericFieldCodec to do all the numerical encoding / decoding while DefaultEnumCodec does the type conversion (pre_encode() and post_decode()). |
FieldType | the type used in the Google Protobuf message that is exposed to the end-user Codec::decode(), Codec::encode(), etc. functions. |
Definition at line 223 of file field_codec_typed.h.
|
inlineoverridevirtual |
Decode a field. If the field is empty (i.e. was encoded using the zero-argument encode()), throw NullValueException to indicate this.
bits | Bits to use for decoding. |
Implements dccl::TypedFieldCodec< WireType, WireType >.
Definition at line 263 of file field_codec_typed.h.
|
inlineoverridevirtual |
Encode an empty field.
Implements dccl::TypedFieldCodec< WireType, WireType >.
Definition at line 248 of file field_codec_typed.h.
|
inlineoverridevirtual |
Encode a non-empty field.
wire_value | Value to encode. |
Implements dccl::TypedFieldCodec< WireType, WireType >.
Definition at line 254 of file field_codec_typed.h.
|
inlineoverridevirtual |
Calculate maximum size of the field in bits.
Implements dccl::FieldCodecBase.
Definition at line 286 of file field_codec_typed.h.
|
inlineoverridevirtual |
Calculate minimum size of the field in bits.
Implements dccl::FieldCodecBase.
Definition at line 288 of file field_codec_typed.h.
|
inlineoverridevirtual |
Calculate the size (in bits) of an empty field.
Implements dccl::TypedFieldCodec< WireType, WireType >.
Definition at line 275 of file field_codec_typed.h.
|
inlineoverridevirtual |
Calculate the size (in bits) of a non-empty field.
wire_value | Value to use when calculating the size of the field. If calculating the size requires encoding the field completely, cache the encoded value for a likely future call to encode() for the same wire_value. |
Implements dccl::TypedFieldCodec< WireType, WireType >.
Definition at line 281 of file field_codec_typed.h.