Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8d6fc629 authored by Myles Watson's avatar Myles Watson Committed by Jakub Pawlowski
Browse files

PDL: Use Subrange to avoid endian switches

Bug: 138260498
Test: bluetooth_packet_parser_test
Change-Id: I369e442a054fe0d1eeee561e61250601b4b85611
parent 1bdec93e
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -41,8 +41,7 @@ std::string CustomField::GetDataType() const {

void CustomField::GenExtractor(std::ostream& s, Size start_offset, Size end_offset) const {
  GenBounds(s, start_offset, end_offset, Size());
  s << " auto subview = GetLittleEndianSubview(field_begin, field_end); ";
  s << "auto it = subview.begin();";
  s << "auto it = begin_it.Subrange(field_begin, field_end - field_begin);";
  s << "std::unique_ptr<" << GetDataType() << "> ptr = std::make_unique<" << GetDataType() << ">();";
  s << GetDataType() << "::Parse(ptr.get(), it);";
}
@@ -51,6 +50,7 @@ void CustomField::GenGetter(std::ostream& s, Size start_offset, Size end_offset)
  s << "std::unique_ptr<" << GetDataType() << "> Get" << util::UnderscoreToCamelCase(GetName()) << "() const {";
  s << "ASSERT(was_validated_);";
  s << "size_t end_index = size();";
  s << "auto begin_it = begin();";

  GenExtractor(s, start_offset, end_offset);
  s << "return ptr;";
+2 −2
Original line number Diff line number Diff line
@@ -49,8 +49,7 @@ void StructField::GenExtractor(std::ostream& s, Size start_offset, Size end_offs
  } else {
    GenBounds(s, start_offset, end_offset, Size());
  }
  s << " auto subview = GetLittleEndianSubview(field_begin, field_end); ";
  s << "auto it = subview.begin();";
  s << "auto it = begin_it.Subrange(field_begin, field_end - field_begin); ";
  s << "std::unique_ptr<" << GetDataType() << "> one = std::make_unique<" << GetDataType() << ">();";
  s << GetDataType() << "::Parse(one.get(), it);";
}
@@ -63,6 +62,7 @@ void StructField::GenGetter(std::ostream& s, Size start_offset, Size end_offset)
  }
  s << "ASSERT(was_validated_);";
  s << "size_t end_index = size();";
  s << "auto begin_it = begin();";
  GenExtractor(s, start_offset, end_offset);

  if (size_ != -1) {
+4 −4
Original line number Diff line number Diff line
@@ -94,17 +94,16 @@ std::string VectorField::GetDataType() const {
void VectorField::GenExtractor(std::ostream& s, Size start_offset, Size end_offset) const {
  GenBounds(s, start_offset, end_offset, GetSize());

  s << " auto subview = GetLittleEndianSubview(field_begin, field_end); ";
  s << "auto it = subview.begin();";
  s << "auto it = begin_it.Subrange(field_begin, field_end - field_begin);";

  s << GetDataType() << " ret;";
  if (element_size_ != -1) {
    std::string type = (type_def_ != nullptr) ? type_def_->name_ : util::GetTypeForSize(element_size_);
    s << "while (it + sizeof(" << type << ") <= subview.end()) {";
    s << "while (it.NumBytesRemaining() >= sizeof(" << type << ")) {";
    s << "ret.push_back(it.extract<" << type << ">());";
    s << "}";
  } else {
    s << "while (it < subview.end()) {";
    s << "while (it.NumBytesRemaining() > 0) {";
    s << type_def_->name_ << " instance;";
    s << "it = " << type_def_->name_ << "::Parse(&instance, it);";
    s << "ret.push_back(instance);";
@@ -117,6 +116,7 @@ void VectorField::GenGetter(std::ostream& s, Size start_offset, Size end_offset)
  s << " Get" << util::UnderscoreToCamelCase(GetName()) << "() {";
  s << "ASSERT(was_validated_);";
  s << "size_t end_index = size();";
  s << "auto begin_it = begin();";

  GenExtractor(s, start_offset, end_offset);