Loading system/gd/packet/parser/Android.bp +2 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ cc_binary_host { "fields/scalar_field.cc", "fields/size_field.cc", "fields/struct_field.cc", "fields/variable_length_struct_field.cc", "checksum_def.cc", "custom_field_def.cc", "enum_def.cc", Loading @@ -27,6 +28,7 @@ cc_binary_host { "packet_def.cc", "parent_def.cc", "struct_def.cc", "struct_parser_generator.cc", "main.cc", "language_y.yy", "language_l.ll", Loading system/gd/packet/parser/fields/all_fields.h +1 −0 Original line number Diff line number Diff line Loading @@ -32,4 +32,5 @@ #include "fields/scalar_field.h" #include "fields/size_field.h" #include "fields/struct_field.h" #include "fields/variable_length_struct_field.h" #include "fields/vector_field.h" system/gd/packet/parser/fields/array_field.cc +23 −2 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ #include "fields/array_field.h" #include "fields/custom_field.h" #include "fields/scalar_field.h" #include "util.h" const std::string ArrayField::kFieldType = "ArrayField"; Loading Loading @@ -52,6 +54,10 @@ Size ArrayField::GetSize() const { Size ArrayField::GetBuilderSize() const { if (!element_size_.empty() && !element_size_.has_dynamic()) { return GetSize(); } else if (element_field_->BuilderParameterMustBeMoved()) { std::string ret = "[this](){ size_t length = 0; for (const auto& elem : " + GetName() + "_) { length += elem->size() * 8; } return length; }()"; return ret; } else { std::string ret = "[this](){ size_t length = 0; for (const auto& elem : " + GetName() + "_) { length += elem.size() * 8; } return length; }()"; Loading @@ -73,8 +79,15 @@ void ArrayField::GenExtractor(std::ostream& s, int num_leading_bits) const { s << "while (" << element_field_->GetName() << "_it.NumBytesRemaining() > 0 "; s << " && ret_it < " << GetName() << "_ptr->end()) {"; } if (element_field_->BuilderParameterMustBeMoved()) { s << element_field_->GetDataType() << " " << element_field_->GetName() << "_ptr;"; } else { s << element_field_->GetDataType() << "* " << element_field_->GetName() << "_ptr = ret_it;"; } element_field_->GenExtractor(s, num_leading_bits); if (element_field_->BuilderParameterMustBeMoved()) { s << "*ret_it = std::move(" << element_field_->GetName() << "_ptr);"; } s << "ret_it++;"; s << "}"; } Loading @@ -96,10 +109,18 @@ void ArrayField::GenGetter(std::ostream& s, Size start_offset, Size end_offset) } bool ArrayField::GenBuilderParameter(std::ostream& s) const { if (element_field_->BuilderParameterMustBeMoved()) { s << "std::array<" << element_field_->GetDataType() << "," << array_size_ << "> " << GetName(); } else { s << "const std::array<" << element_field_->GetDataType() << "," << array_size_ << ">& " << GetName(); } return true; } bool ArrayField::BuilderParameterMustBeMoved() const { return element_field_->BuilderParameterMustBeMoved(); } bool ArrayField::GenBuilderMember(std::ostream& s) const { s << "std::array<" << element_field_->GetDataType() << "," << array_size_ << "> " << GetName(); return true; Loading system/gd/packet/parser/fields/array_field.h +3 −1 Original line number Diff line number Diff line Loading @@ -16,7 +16,7 @@ #pragma once #include "fields/all_fields.h" #include "fields/packet_field.h" #include "parse_location.h" #include "type_def.h" Loading @@ -42,6 +42,8 @@ class ArrayField : public PacketField { virtual bool GenBuilderParameter(std::ostream& s) const override; virtual bool BuilderParameterMustBeMoved() const override; virtual bool GenBuilderMember(std::ostream& s) const override; virtual bool HasParameterValidator() const override; Loading system/gd/packet/parser/fields/packet_field.cc +4 −0 Original line number Diff line number Diff line Loading @@ -68,6 +68,10 @@ int PacketField::GenBounds(std::ostream& s, Size start_offset, Size end_offset) return 0; // num_leading_bits } bool PacketField::BuilderParameterMustBeMoved() const { return false; } bool PacketField::GenBuilderMember(std::ostream& s) const { return GenBuilderParameter(s); } Loading Loading
system/gd/packet/parser/Android.bp +2 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ cc_binary_host { "fields/scalar_field.cc", "fields/size_field.cc", "fields/struct_field.cc", "fields/variable_length_struct_field.cc", "checksum_def.cc", "custom_field_def.cc", "enum_def.cc", Loading @@ -27,6 +28,7 @@ cc_binary_host { "packet_def.cc", "parent_def.cc", "struct_def.cc", "struct_parser_generator.cc", "main.cc", "language_y.yy", "language_l.ll", Loading
system/gd/packet/parser/fields/all_fields.h +1 −0 Original line number Diff line number Diff line Loading @@ -32,4 +32,5 @@ #include "fields/scalar_field.h" #include "fields/size_field.h" #include "fields/struct_field.h" #include "fields/variable_length_struct_field.h" #include "fields/vector_field.h"
system/gd/packet/parser/fields/array_field.cc +23 −2 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ #include "fields/array_field.h" #include "fields/custom_field.h" #include "fields/scalar_field.h" #include "util.h" const std::string ArrayField::kFieldType = "ArrayField"; Loading Loading @@ -52,6 +54,10 @@ Size ArrayField::GetSize() const { Size ArrayField::GetBuilderSize() const { if (!element_size_.empty() && !element_size_.has_dynamic()) { return GetSize(); } else if (element_field_->BuilderParameterMustBeMoved()) { std::string ret = "[this](){ size_t length = 0; for (const auto& elem : " + GetName() + "_) { length += elem->size() * 8; } return length; }()"; return ret; } else { std::string ret = "[this](){ size_t length = 0; for (const auto& elem : " + GetName() + "_) { length += elem.size() * 8; } return length; }()"; Loading @@ -73,8 +79,15 @@ void ArrayField::GenExtractor(std::ostream& s, int num_leading_bits) const { s << "while (" << element_field_->GetName() << "_it.NumBytesRemaining() > 0 "; s << " && ret_it < " << GetName() << "_ptr->end()) {"; } if (element_field_->BuilderParameterMustBeMoved()) { s << element_field_->GetDataType() << " " << element_field_->GetName() << "_ptr;"; } else { s << element_field_->GetDataType() << "* " << element_field_->GetName() << "_ptr = ret_it;"; } element_field_->GenExtractor(s, num_leading_bits); if (element_field_->BuilderParameterMustBeMoved()) { s << "*ret_it = std::move(" << element_field_->GetName() << "_ptr);"; } s << "ret_it++;"; s << "}"; } Loading @@ -96,10 +109,18 @@ void ArrayField::GenGetter(std::ostream& s, Size start_offset, Size end_offset) } bool ArrayField::GenBuilderParameter(std::ostream& s) const { if (element_field_->BuilderParameterMustBeMoved()) { s << "std::array<" << element_field_->GetDataType() << "," << array_size_ << "> " << GetName(); } else { s << "const std::array<" << element_field_->GetDataType() << "," << array_size_ << ">& " << GetName(); } return true; } bool ArrayField::BuilderParameterMustBeMoved() const { return element_field_->BuilderParameterMustBeMoved(); } bool ArrayField::GenBuilderMember(std::ostream& s) const { s << "std::array<" << element_field_->GetDataType() << "," << array_size_ << "> " << GetName(); return true; Loading
system/gd/packet/parser/fields/array_field.h +3 −1 Original line number Diff line number Diff line Loading @@ -16,7 +16,7 @@ #pragma once #include "fields/all_fields.h" #include "fields/packet_field.h" #include "parse_location.h" #include "type_def.h" Loading @@ -42,6 +42,8 @@ class ArrayField : public PacketField { virtual bool GenBuilderParameter(std::ostream& s) const override; virtual bool BuilderParameterMustBeMoved() const override; virtual bool GenBuilderMember(std::ostream& s) const override; virtual bool HasParameterValidator() const override; Loading
system/gd/packet/parser/fields/packet_field.cc +4 −0 Original line number Diff line number Diff line Loading @@ -68,6 +68,10 @@ int PacketField::GenBounds(std::ostream& s, Size start_offset, Size end_offset) return 0; // num_leading_bits } bool PacketField::BuilderParameterMustBeMoved() const { return false; } bool PacketField::GenBuilderMember(std::ostream& s) const { return GenBuilderParameter(s); } Loading