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

Commit 36545c9a authored by Myles Watson's avatar Myles Watson Committed by android-build-merger
Browse files

Merge "PDL: Test fixed-size struct fields" am: e3cc0a4d am: 83d3d4af am: 4df87196

am: 1c61716b

Change-Id: I65ac551d28167d15833c2d313fe067d73090f245
parents d6968642 1c61716b
Loading
Loading
Loading
Loading
+9 −8
Original line number Diff line number Diff line
@@ -69,22 +69,21 @@ std::string ArrayField::GetDataType() const {
void ArrayField::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 + field_begin;";

  // Add the element size so that we will extract as many elements as we can.
  s << GetDataType() << " ret;";
  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 = ret.begin();";
    s << "while (it + sizeof(" << type << ") <= subview.end()) {";
    s << GetDataType() << "::iterator ret_it = value.begin();";
    s << "while (it + sizeof(" << type << ") <= begin_it + field_end) {";
    s << "*ret_it = it.extract<" << type << ">();";
    s << "ret_it++;";
    s << "}";
  } else {
    s << "std::size_t ret_idx = 0;";
    s << "while (it < subview.end()) {";
    s << "it = " << type_def_->name_ << "::ParseArray(ret, &ret_idx, it);";
    s << "while (it < begin_it + field_end) {";
    s << "it = " << type_def_->name_ << "::ParseArray(value, &ret_idx, it);";
    s << "ret_idx++;";
    s << "}";
  }
@@ -94,10 +93,12 @@ void ArrayField::GenGetter(std::ostream& s, Size start_offset, Size end_offset)
  s << GetDataType();
  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);

  s << "return ret;";
  s << "return value;";
  s << "}\n";
}

+2 −0
Original line number Diff line number Diff line
@@ -30,6 +30,8 @@ std::string ChecksumField::GetDataType() const {
  return type_name_;
}

void ChecksumField::GenExtractor(std::ostream&, Size, Size) const {}

void ChecksumField::GenGetter(std::ostream&, Size, Size) const {}

bool ChecksumField::GenBuilderParameter(std::ostream&) const {
+2 −0
Original line number Diff line number Diff line
@@ -30,6 +30,8 @@ class ChecksumField : public ScalarField {

  virtual std::string GetDataType() const override;

  virtual void GenExtractor(std::ostream& s, Size start_offset, Size end_offset) const override;

  virtual void GenGetter(std::ostream& s, Size start_offset, Size end_offset) const override;

  virtual bool GenBuilderParameter(std::ostream& s) const override;
+1 −0
Original line number Diff line number Diff line
@@ -50,6 +50,7 @@ void CustomField::GenExtractor(std::ostream& s, Size start_offset, Size end_offs
void CustomField::GenGetter(std::ostream& s, Size start_offset, Size end_offset) const {
  s << "std::vector<" << 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;";
+2 −2
Original line number Diff line number Diff line
@@ -48,11 +48,11 @@ void PacketField::GenBounds(std::ostream& s, Size start_offset, Size end_offset,
  if (!start_offset.empty()) {
    s << "size_t field_begin = (" << start_offset << ") / 8;";
  } else {
    s << "size_t field_begin = size() - (" << end_offset << " + " << field_size << ") / 8;";
    s << "size_t field_begin = end_index - (" << end_offset << " + " << field_size << ") / 8;";
  }

  if (!end_offset.empty()) {
    s << "size_t field_end = size() - (" << end_offset << ") / 8;";
    s << "size_t field_end = end_index - (" << end_offset << ") / 8;";
    // If the field has a known size, use the minimum for the end
    if (!field_size.empty()) {
      s << "size_t field_sized_end = field_begin + (" << field_size << ") / 8;";
Loading