24#include "field_codec_default_message.h" 
   28std::unordered_map<std::string, unsigned> dccl::v4::DefaultMessageCodec::MaxSize::oneofs_max_size;
 
   34void dccl::v4::DefaultMessageCodec::any_encode(Bitset* bits, 
const dccl::any& wire_value)
 
   36    if (is_empty(wire_value))
 
   38        *bits = Bitset(min_size());
 
   42        *bits = traverse_const_message<Encoder, Bitset>(wire_value);
 
   45            bits->push_front(
true); 
 
   49unsigned dccl::v4::DefaultMessageCodec::any_size(
const dccl::any& wire_value)
 
   51    if (is_empty(wire_value))
 
   57        unsigned size = traverse_const_message<Size, unsigned>(wire_value);
 
   60            const unsigned presence_bit = 1;
 
   68void dccl::v4::DefaultMessageCodec::any_decode(Bitset* bits, dccl::any* wire_value)
 
   72        auto* msg = dccl::any_cast<google::protobuf::Message*>(*wire_value);
 
   76            if (!bits->to_ulong())
 
   78                *wire_value = dccl::any();
 
   87        const google::protobuf::Descriptor* desc = msg->GetDescriptor();
 
   88        const google::protobuf::Reflection* refl = msg->GetReflection();
 
   91        std::vector<int> oneof_cases(desc->oneof_decl_count());
 
   92        for (
auto i = 0, n = desc->oneof_decl_count(); part() != HEAD && i < n; ++i)
 
   94            Bitset case_bits(bits);
 
   95            case_bits.get_more_bits(
oneof_size(desc->oneof_decl(i)));
 
   98            oneof_cases[i] = 
static_cast<int>(case_bits.to_ulong()) - 1;
 
  102        for (
int i = 0, n = desc->field_count(); i < n; ++i)
 
  104            const google::protobuf::FieldDescriptor* field_desc = desc->field(i);
 
  106            if (!check_field(field_desc))
 
  109            std::shared_ptr<FieldCodecBase> codec = find(field_desc);
 
  110            std::shared_ptr<internal::FromProtoCppTypeBase> helper =
 
  111                manager().type_helper().find(field_desc);
 
  113            if (field_desc->is_repeated())
 
  115                std::vector<dccl::any> field_values;
 
  116                if (field_desc->cpp_type() == google::protobuf::FieldDescriptor::CPPTYPE_MESSAGE)
 
  118                    unsigned max_repeat =
 
  119                        field_desc->options().GetExtension(dccl::field).max_repeat();
 
  120                    for (
unsigned j = 0, m = max_repeat; j < m; ++j)
 
  121                        field_values.emplace_back(refl->AddMessage(msg, field_desc));
 
  123                    codec->field_decode_repeated(bits, &field_values, field_desc);
 
  126                    for (
int j = field_values.size(), m = max_repeat; j < m; ++j)
 
  128                        refl->RemoveLast(msg, field_desc);
 
  134                    codec->field_decode_repeated(bits, &field_values, field_desc);
 
  135                    for (
auto& field_value : field_values)
 
  136                        helper->add_value(field_desc, msg, field_value);
 
  145                    if (field_desc->index_in_oneof() !=
 
  151                DynamicConditions& dc = dynamic_conditions(field_desc);
 
  152                if (dc.has_omit_if())
 
  155                    dc.regenerate(this_message(), root_message());
 
  160                dccl::any field_value;
 
  161                if (field_desc->cpp_type() == google::protobuf::FieldDescriptor::CPPTYPE_MESSAGE)
 
  164                    field_value = refl->MutableMessage(msg, field_desc);
 
  165                    codec->field_decode(bits, &field_value, field_desc);
 
  166                    if (is_empty(field_value))
 
  167                        refl->ClearField(msg, field_desc);
 
  172                    codec->field_decode(bits, &field_value, field_desc);
 
  173                    helper->set_value(field_desc, msg, field_value);
 
  178        std::vector<const google::protobuf::FieldDescriptor*> set_fields;
 
  179        refl->ListFields(*msg, &set_fields);
 
  182    catch (dccl::bad_any_cast& e)
 
  185            "Bad type given to traverse mutable, expecting google::protobuf::Message*, got " +
 
  186            std::string(wire_value->type().name())));
 
  190unsigned dccl::v4::DefaultMessageCodec::max_size()
 
  193    traverse_descriptor<MaxSize>(&u);
 
  197        const unsigned presence_bit = 1;
 
  204unsigned dccl::v4::DefaultMessageCodec::min_size()
 
  208        const unsigned presence_bit = 1;
 
  214        traverse_descriptor<MinSize>(&u);
 
  219void dccl::v4::DefaultMessageCodec::validate()
 
  222    traverse_descriptor<Validate>(&b);
 
  225std::string dccl::v4::DefaultMessageCodec::info()
 
  227    std::stringstream ss;
 
  228    traverse_descriptor<Info>(&ss);
 
  232std::size_t dccl::v4::DefaultMessageCodec::hash()
 
  234    std::size_t hash = 0;
 
  235    traverse_descriptor<Hash>(&hash);
 
  239bool dccl::v4::DefaultMessageCodec::check_field(
const google::protobuf::FieldDescriptor* field)
 
  248        if (dccl_field_options.omit()) 
 
  252        else if (message_data().current_part() == UNKNOWN) 
 
  254            if ((part() == HEAD && !dccl_field_options.in_head()) ||
 
  255                (part() == BODY && dccl_field_options.in_head()))
 
  260        else if (message_data().current_part() != part()) 
 
int containing_oneof_index(const google::protobuf::FieldDescriptor *field_desc)
Returns the index of the containing oneof of the given field, or -1 if the field is not part of a one...
 
bool is_part_of_oneof(const google::protobuf::FieldDescriptor *field_desc)
Checks whether a given field is part to a oneof or not.
 
int oneof_size(const google::protobuf::OneofDescriptor *oneof_desc)
Returns the number of bits needed to represent the oneof cases (including the unset case).