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

Commit 0dd87d6f authored by Myles Watson's avatar Myles Watson
Browse files

PDL: Parse with pointers instead of vectors

Bug: 138260498
Test: bluetooth_packet_parser_test
Change-Id: I65385e3a63b8e67f1aab7dfd89e9410709e94eaf
parent fd1d181f
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -33,10 +33,10 @@ class CustomTypeChecker {
  template <class C, size_t (C::*)() const>
  struct SizeChecker {};

  template <class C, Iterator<true> (*)(std::vector<C>& vec, Iterator<true> it)>
  template <class C, Iterator<true> (*)(C* vec, Iterator<true> it)>
  struct ParseChecker {};

  template <class C, Iterator<false> (*)(std::vector<C>& vec, Iterator<false> it)>
  template <class C, Iterator<false> (*)(C* vec, Iterator<false> it)>
  struct ParseCheckerBigEndian {};

  template <class C>
+7 −11
Original line number Diff line number Diff line
@@ -71,22 +71,18 @@ void ArrayField::GenExtractor(std::ostream& s, Size start_offset, Size end_offse

  s << "auto it = begin_it + field_begin;";

  // Add the element size so that we will extract as many elements as we can.
  s << GetDataType() << " value;";
  if (element_size_ != -1) {
  std::string type = (type_def_ != nullptr) ? type_def_->name_ : util::GetTypeForSize(element_size_);
  s << GetDataType() << "::iterator ret_it = value.begin();";
    s << "while (it + sizeof(" << type << ") <= begin_it + field_end) {";
  if (element_size_ != -1) {
    s << "while (it + sizeof(" << type << ") <= begin_it + field_end && ret_it < value.end()) {";
    s << "*ret_it = it.extract<" << type << ">();";
    s << "ret_it++;";
    s << "}";
  } else {
    s << "std::size_t ret_idx = 0;";
    s << "while (it < begin_it + field_end) {";
    s << "it = " << type_def_->name_ << "::ParseArray(value, &ret_idx, it);";
    s << "ret_idx++;";
    s << "}";
    s << "while (it < begin_it + field_end && ret_it < value.end()) {";
    s << "it = " << type_def_->name_ << "::Parse(ret_it, it);";
  }
  s << "ret_it++;";
  s << "}";
}

void ArrayField::GenGetter(std::ostream& s, Size start_offset, Size end_offset) const {
+4 −4
Original line number Diff line number Diff line
@@ -43,17 +43,17 @@ void CustomField::GenExtractor(std::ostream& s, Size start_offset, Size end_offs
  GenBounds(s, start_offset, end_offset, Size());
  s << " auto subview = GetLittleEndianSubview(field_begin, field_end); ";
  s << "auto it = subview.begin();";
  s << "std::vector<" << GetDataType() << "> vec;";
  s << GetDataType() << "::Parse(vec, it);";
  s << "std::unique_ptr<" << GetDataType() << "> ptr = std::make_unique<" << GetDataType() << ">();";
  s << GetDataType() << "::Parse(ptr.get(), it);";
}

void CustomField::GenGetter(std::ostream& s, Size start_offset, Size end_offset) const {
  s << "std::vector<" << GetDataType() << "> Get" << util::UnderscoreToCamelCase(GetName()) << "() const {";
  s << "std::unique_ptr<" << GetDataType() << "> Get" << util::UnderscoreToCamelCase(GetName()) << "() const {";
  s << "ASSERT(was_validated_);";
  s << "size_t end_index = size();";

  GenExtractor(s, start_offset, end_offset);
  s << "return vec;";
  s << "return ptr;";
  s << "}\n";
}

+5 −5
Original line number Diff line number Diff line
@@ -51,15 +51,15 @@ void StructField::GenExtractor(std::ostream& s, Size start_offset, Size end_offs
  }
  s << " auto subview = GetLittleEndianSubview(field_begin, field_end); ";
  s << "auto it = subview.begin();";
  s << "std::vector<" << GetDataType() << "> vec;";
  s << GetDataType() << "::Parse(vec, it);";
  s << "std::unique_ptr<" << GetDataType() << "> one = std::make_unique<" << GetDataType() << ">();";
  s << GetDataType() << "::Parse(one.get(), it);";
}

void StructField::GenGetter(std::ostream& s, Size start_offset, Size end_offset) const {
  if (size_ != -1) {
    s << GetDataType() << " Get" << util::UnderscoreToCamelCase(GetName()) << "() const {";
  } else {
    s << "std::vector<" << GetDataType() << "> Get" << util::UnderscoreToCamelCase(GetName()) << "() const {";
    s << "std::unique_ptr<" << GetDataType() << "> Get" << util::UnderscoreToCamelCase(GetName()) << "() const {";
  }
  s << "ASSERT(was_validated_);";
  s << "size_t end_index = size();";
@@ -67,9 +67,9 @@ void StructField::GenGetter(std::ostream& s, Size start_offset, Size end_offset)
  GenExtractor(s, start_offset, end_offset);

  if (size_ != -1) {
    s << "return vec[0];";
    s << "return *one;";
  } else {
    s << "return vec;";
    s << "return one;";
  }
  s << "}\n";
}
+3 −2
Original line number Diff line number Diff line
@@ -97,7 +97,6 @@ void VectorField::GenExtractor(std::ostream& s, Size start_offset, Size end_offs
  s << " auto subview = GetLittleEndianSubview(field_begin, field_end); ";
  s << "auto it = subview.begin();";

  // Add the element size so that we will extract as many elements as we can.
  s << GetDataType() << " ret;";
  if (element_size_ != -1) {
    std::string type = (type_def_ != nullptr) ? type_def_->name_ : util::GetTypeForSize(element_size_);
@@ -106,7 +105,9 @@ void VectorField::GenExtractor(std::ostream& s, Size start_offset, Size end_offs
    s << "}";
  } else {
    s << "while (it < subview.end()) {";
    s << "it = " << type_def_->name_ << "::Parse(ret, it);";
    s << type_def_->name_ << " instance;";
    s << "it = " << type_def_->name_ << "::Parse(&instance, it);";
    s << "ret.push_back(instance);";
    s << "}";
  }
}
Loading