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

Commit 5e1b29f7 authored by Myles Watson's avatar Myles Watson
Browse files

PDL: Use GenBounds for Structs

Test: bluetooth_packet_parser_test
Change-Id: Ibb6e7bd441b8fd19f17818dc74ac4aff10b519a4
parent 91b45f60
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -93,6 +93,7 @@ void ArrayField::GenExtractor(std::ostream& s, Size start_offset, Size end_offse
void ArrayField::GenGetter(std::ostream& s, Size start_offset, Size end_offset) const {
void ArrayField::GenGetter(std::ostream& s, Size start_offset, Size end_offset) const {
  s << GetDataType();
  s << GetDataType();
  s << " Get" << util::UnderscoreToCamelCase(GetName()) << "() {";
  s << " Get" << util::UnderscoreToCamelCase(GetName()) << "() {";
  s << "ASSERT(was_validated_);";


  GenExtractor(s, start_offset, end_offset);
  GenExtractor(s, start_offset, end_offset);


+2 −2
Original line number Original line Diff line number Diff line
@@ -48,8 +48,8 @@ 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 {
void CustomField::GenGetter(std::ostream& s, Size start_offset, Size end_offset) const {
  s << "std::vector<" << GetDataType() << ">";
  s << "std::vector<" << GetDataType() << "> Get" << util::UnderscoreToCamelCase(GetName()) << "() const {";
  s << " Get" << util::UnderscoreToCamelCase(GetName()) << "() const {";
  s << "ASSERT(was_validated_);";


  GenExtractor(s, start_offset, end_offset);
  GenExtractor(s, start_offset, end_offset);
  s << "return vec;";
  s << "return vec;";
+14 −8
Original line number Original line Diff line number Diff line
@@ -45,16 +45,22 @@ void PacketField::GenBounds(std::ostream& s, Size start_offset, Size end_offset,
    ERROR(this) << "Can not find the bounds of a field at a non byte-aligned offset." << start_offset << end_offset;
    ERROR(this) << "Can not find the bounds of a field at a non byte-aligned offset." << start_offset << end_offset;
  }
  }


  s << "ASSERT(was_validated_);";
  if (!start_offset.empty()) {

    s << "size_t field_begin = (" << start_offset << ") / 8;";
    s << "size_t field_begin = (" << start_offset << ") / 8;";
  } else {
    s << "size_t field_begin = size() - (" << end_offset << " + " << field_size << ") / 8;";
  }


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


bool PacketField::GenBuilderMember(std::ostream& s) const {
bool PacketField::GenBuilderMember(std::ostream& s) const {
+1 −0
Original line number Original line Diff line number Diff line
@@ -59,6 +59,7 @@ class PacketField : public Loggable {
  // Generate the parameter for Create(), return true if a parameter was added.
  // Generate the parameter for Create(), return true if a parameter was added.
  virtual bool GenBuilderParameter(std::ostream& s) const = 0;
  virtual bool GenBuilderParameter(std::ostream& s) const = 0;


  // Generate the actual storage for the parameter, return true if it was added.
  virtual bool GenBuilderMember(std::ostream& s) const;
  virtual bool GenBuilderMember(std::ostream& s) const;


  // Returns whether or not the field must be validated.
  // Returns whether or not the field must be validated.
+2 −0
Original line number Original line Diff line number Diff line
@@ -60,11 +60,13 @@ void PayloadField::GenExtractor(std::ostream&, Size, Size) const {


void PayloadField::GenGetter(std::ostream& s, Size start_offset, Size end_offset) const {
void PayloadField::GenGetter(std::ostream& s, Size start_offset, Size end_offset) const {
  s << "PacketView<kLittleEndian> GetPayload() const {";
  s << "PacketView<kLittleEndian> GetPayload() const {";
  s << "ASSERT(was_validated_);";
  GenBounds(s, start_offset, end_offset, GetSize());
  GenBounds(s, start_offset, end_offset, GetSize());
  s << "return GetLittleEndianSubview(field_begin, field_end);";
  s << "return GetLittleEndianSubview(field_begin, field_end);";
  s << "}\n\n";
  s << "}\n\n";


  s << "PacketView<!kLittleEndian> GetPayloadBigEndian() const {";
  s << "PacketView<!kLittleEndian> GetPayloadBigEndian() const {";
  s << "ASSERT(was_validated_);";
  GenBounds(s, start_offset, end_offset, GetSize());
  GenBounds(s, start_offset, end_offset, GetSize());
  s << "return GetBigEndianSubview(field_begin, field_end);";
  s << "return GetBigEndianSubview(field_begin, field_end);";
  s << "}\n";
  s << "}\n";
Loading