Merge "Packet: Refactor packet fields definition"
diff --git a/gd/packet/parser/fields/array_field.cc b/gd/packet/parser/fields/array_field.cc
index 2592b6c..37dea16 100644
--- a/gd/packet/parser/fields/array_field.cc
+++ b/gd/packet/parser/fields/array_field.cc
@@ -106,9 +106,14 @@
s << "}";
}
+std::string ArrayField::GetGetterFunctionName() const {
+ std::stringstream ss;
+ ss << "Get" << util::UnderscoreToCamelCase(GetName());
+ return ss.str();
+}
+
void ArrayField::GenGetter(std::ostream& s, Size start_offset, Size end_offset) const {
- s << GetDataType();
- s << " Get" << util::UnderscoreToCamelCase(GetName()) << "() {";
+ s << GetDataType() << " " << GetGetterFunctionName() << "() {";
s << "ASSERT(was_validated_);";
s << "size_t end_index = size();";
s << "auto to_bound = begin();";
@@ -122,13 +127,14 @@
s << "}\n";
}
-bool ArrayField::GenBuilderParameter(std::ostream& s) const {
+std::string ArrayField::GetBuilderParameterType() const {
+ std::stringstream ss;
if (element_field_->BuilderParameterMustBeMoved()) {
- s << "std::array<" << element_field_->GetDataType() << "," << array_size_ << "> " << GetName();
+ ss << "std::array<" << element_field_->GetDataType() << "," << array_size_ << ">";
} else {
- s << "const std::array<" << element_field_->GetDataType() << "," << array_size_ << ">& " << GetName();
+ ss << "const std::array<" << element_field_->GetDataType() << "," << array_size_ << ">&";
}
- return true;
+ return ss.str();
}
bool ArrayField::BuilderParameterMustBeMoved() const {
@@ -161,3 +167,11 @@
// Other than that there is nothing that arrays need to be validated on other than length so nothing needs to
// be done here.
}
+
+bool ArrayField::IsContainerField() const {
+ return true;
+}
+
+const PacketField* ArrayField::GetElementField() const {
+ return element_field_;
+}
diff --git a/gd/packet/parser/fields/array_field.h b/gd/packet/parser/fields/array_field.h
index 6e171e6..dd49f26 100644
--- a/gd/packet/parser/fields/array_field.h
+++ b/gd/packet/parser/fields/array_field.h
@@ -40,9 +40,11 @@
virtual void GenExtractor(std::ostream& s, int num_leading_bits, bool for_struct) const override;
+ virtual std::string GetGetterFunctionName() const override;
+
virtual void GenGetter(std::ostream& s, Size start_offset, Size end_offset) const override;
- virtual bool GenBuilderParameter(std::ostream& s) const override;
+ virtual std::string GetBuilderParameterType() const override;
virtual bool BuilderParameterMustBeMoved() const override;
@@ -56,6 +58,10 @@
virtual void GenValidator(std::ostream&) const override;
+ virtual bool IsContainerField() const override;
+
+ virtual const PacketField* GetElementField() const override;
+
const std::string name_;
const PacketField* element_field_{nullptr};
diff --git a/gd/packet/parser/fields/body_field.cc b/gd/packet/parser/fields/body_field.cc
index 4457348..5e00b68 100644
--- a/gd/packet/parser/fields/body_field.cc
+++ b/gd/packet/parser/fields/body_field.cc
@@ -35,10 +35,14 @@
void BodyField::GenExtractor(std::ostream&, int, bool) const {}
+std::string BodyField::GetGetterFunctionName() const {
+ return "";
+}
+
void BodyField::GenGetter(std::ostream&, Size, Size) const {}
-bool BodyField::GenBuilderParameter(std::ostream&) const {
- return false;
+std::string BodyField::GetBuilderParameterType() const {
+ return "";
}
bool BodyField::HasParameterValidator() const {
diff --git a/gd/packet/parser/fields/body_field.h b/gd/packet/parser/fields/body_field.h
index 8a2a90b..ce4ede7 100644
--- a/gd/packet/parser/fields/body_field.h
+++ b/gd/packet/parser/fields/body_field.h
@@ -34,9 +34,11 @@
virtual void GenExtractor(std::ostream& s, int num_leading_bits, bool for_struct) const override;
+ virtual std::string GetGetterFunctionName() const override;
+
virtual void GenGetter(std::ostream&, Size, Size) const override;
- virtual bool GenBuilderParameter(std::ostream&) const override;
+ virtual std::string GetBuilderParameterType() const override;
virtual bool HasParameterValidator() const override;
diff --git a/gd/packet/parser/fields/checksum_field.cc b/gd/packet/parser/fields/checksum_field.cc
index beab91a..4647992 100644
--- a/gd/packet/parser/fields/checksum_field.cc
+++ b/gd/packet/parser/fields/checksum_field.cc
@@ -32,6 +32,10 @@
void ChecksumField::GenExtractor(std::ostream&, int, bool) const {}
+std::string ChecksumField::GetGetterFunctionName() const {
+ return "";
+}
+
void ChecksumField::GenGetter(std::ostream&, Size, Size) const {}
bool ChecksumField::GenBuilderParameter(std::ostream&) const {
diff --git a/gd/packet/parser/fields/checksum_field.h b/gd/packet/parser/fields/checksum_field.h
index f6dfe46..c15f023 100644
--- a/gd/packet/parser/fields/checksum_field.h
+++ b/gd/packet/parser/fields/checksum_field.h
@@ -32,6 +32,8 @@
virtual void GenExtractor(std::ostream& s, int num_leading_bits, bool for_struct) const override;
+ virtual std::string GetGetterFunctionName() const override;
+
virtual void GenGetter(std::ostream& s, Size start_offset, Size end_offset) const override;
virtual bool GenBuilderParameter(std::ostream& s) const override;
diff --git a/gd/packet/parser/fields/checksum_start_field.cc b/gd/packet/parser/fields/checksum_start_field.cc
index a100aee..5531c5a 100644
--- a/gd/packet/parser/fields/checksum_start_field.cc
+++ b/gd/packet/parser/fields/checksum_start_field.cc
@@ -36,10 +36,14 @@
void ChecksumStartField::GenExtractor(std::ostream&, int, bool) const {}
+std::string ChecksumStartField::GetGetterFunctionName() const {
+ return "";
+}
+
void ChecksumStartField::GenGetter(std::ostream&, Size, Size) const {}
-bool ChecksumStartField::GenBuilderParameter(std::ostream&) const {
- return false;
+std::string ChecksumStartField::GetBuilderParameterType() const {
+ return "";
}
bool ChecksumStartField::HasParameterValidator() const {
diff --git a/gd/packet/parser/fields/checksum_start_field.h b/gd/packet/parser/fields/checksum_start_field.h
index 18a5956..c63806b 100644
--- a/gd/packet/parser/fields/checksum_start_field.h
+++ b/gd/packet/parser/fields/checksum_start_field.h
@@ -35,9 +35,11 @@
virtual void GenExtractor(std::ostream& s, int num_leading_bits, bool for_struct) const override;
+ virtual std::string GetGetterFunctionName() const override;
+
virtual void GenGetter(std::ostream& s, Size start_offset, Size end_offset) const override;
- virtual bool GenBuilderParameter(std::ostream&) const override;
+ virtual std::string GetBuilderParameterType() const override;
virtual bool HasParameterValidator() const override;
diff --git a/gd/packet/parser/fields/custom_field.cc b/gd/packet/parser/fields/custom_field.cc
index 3da3b5b..4e387f8 100644
--- a/gd/packet/parser/fields/custom_field.cc
+++ b/gd/packet/parser/fields/custom_field.cc
@@ -50,8 +50,14 @@
s << "}";
}
+std::string CustomField::GetGetterFunctionName() const {
+ std::stringstream ss;
+ ss << "Get" << util::UnderscoreToCamelCase(GetName());
+ return ss.str();
+}
+
void CustomField::GenGetter(std::ostream& s, Size start_offset, Size end_offset) const {
- s << "std::unique_ptr<" << GetDataType() << "> Get" << util::UnderscoreToCamelCase(GetName()) << "() const {";
+ s << "std::unique_ptr<" << GetDataType() << "> " << GetGetterFunctionName() << "() const {";
s << "ASSERT(was_validated_);";
s << "size_t end_index = size();";
s << "auto to_bound = begin();";
@@ -66,9 +72,8 @@
s << "}\n";
}
-bool CustomField::GenBuilderParameter(std::ostream& s) const {
- s << GetDataType() << " " << GetName();
- return true;
+std::string CustomField::GetBuilderParameterType() const {
+ return GetDataType();
}
bool CustomField::HasParameterValidator() const {
diff --git a/gd/packet/parser/fields/custom_field.h b/gd/packet/parser/fields/custom_field.h
index 6e07d94..621a3c8 100644
--- a/gd/packet/parser/fields/custom_field.h
+++ b/gd/packet/parser/fields/custom_field.h
@@ -35,9 +35,11 @@
virtual void GenExtractor(std::ostream& s, int num_leading_bits, bool for_struct) const override;
+ virtual std::string GetGetterFunctionName() const override;
+
virtual void GenGetter(std::ostream& s, Size start_offset, Size end_offset) const override;
- virtual bool GenBuilderParameter(std::ostream& s) const override;
+ virtual std::string GetBuilderParameterType() const override;
virtual bool HasParameterValidator() const override;
diff --git a/gd/packet/parser/fields/group_field.cc b/gd/packet/parser/fields/group_field.cc
index 95e6428..6c9ade9 100644
--- a/gd/packet/parser/fields/group_field.cc
+++ b/gd/packet/parser/fields/group_field.cc
@@ -48,13 +48,18 @@
ERROR(this) << "GenExtractor should never be called.";
}
+std::string GroupField::GetGetterFunctionName() const {
+ ERROR(this) << "GetGetterFunctionName should never be called.";
+ return "";
+}
+
void GroupField::GenGetter(std::ostream&, Size, Size) const {
ERROR(this) << "GenGetter should never be called.";
}
-bool GroupField::GenBuilderParameter(std::ostream&) const {
- ERROR(this) << "GenBuilderParameter should never be called";
- return false;
+std::string GroupField::GetBuilderParameterType() const {
+ ERROR(this) << "GetBuilderParameterType should never be called";
+ return "";
}
bool GroupField::HasParameterValidator() const {
diff --git a/gd/packet/parser/fields/group_field.h b/gd/packet/parser/fields/group_field.h
index b5344a7..57e0165 100644
--- a/gd/packet/parser/fields/group_field.h
+++ b/gd/packet/parser/fields/group_field.h
@@ -39,9 +39,11 @@
virtual void GenExtractor(std::ostream& s, int num_leading_bits, bool for_struct) const override;
+ virtual std::string GetGetterFunctionName() const override;
+
virtual void GenGetter(std::ostream&, Size, Size) const override;
- virtual bool GenBuilderParameter(std::ostream&) const override;
+ virtual std::string GetBuilderParameterType() const override;
virtual bool HasParameterValidator() const override;
diff --git a/gd/packet/parser/fields/packet_field.cc b/gd/packet/parser/fields/packet_field.cc
index 026e56f..7b0bdb7 100644
--- a/gd/packet/parser/fields/packet_field.cc
+++ b/gd/packet/parser/fields/packet_field.cc
@@ -72,6 +72,15 @@
return 0; // num_leading_bits
}
+bool PacketField::GenBuilderParameter(std::ostream& s) const {
+ auto param_type = GetBuilderParameterType();
+ if (param_type.empty()) {
+ return false;
+ }
+ s << param_type << " " << GetName();
+ return true;
+}
+
bool PacketField::BuilderParameterMustBeMoved() const {
return false;
}
@@ -83,3 +92,11 @@
void PacketField::GenBuilderParameterFromView(std::ostream& s) const {
s << "view.Get" << util::UnderscoreToCamelCase(GetName()) << "()";
}
+
+bool PacketField::IsContainerField() const {
+ return false;
+}
+
+const PacketField* PacketField::GetElementField() const {
+ return nullptr;
+}
diff --git a/gd/packet/parser/fields/packet_field.h b/gd/packet/parser/fields/packet_field.h
index 55313e6..d369a92 100644
--- a/gd/packet/parser/fields/packet_field.h
+++ b/gd/packet/parser/fields/packet_field.h
@@ -54,14 +54,20 @@
// Calculate field_begin and field_end using the given offsets and size, return the number of leading bits
virtual int GenBounds(std::ostream& s, Size start_offset, Size end_offset, Size size) const;
+ // Get the name of the getter function, return empty string if there is a getter function
+ virtual std::string GetGetterFunctionName() const = 0;
+
// Get parser getter definition. Start_offset points to the first bit of the
// field. end_offset is the first bit after the field. If an offset is empty
// that means that there was a field with an unknown size when trying to
// calculate the offset.
virtual void GenGetter(std::ostream& s, Size start_offset, Size end_offset) const = 0;
+ // Get the type of parameter used in Create(), return empty string if a parameter type was NOT generated
+ virtual std::string GetBuilderParameterType() const = 0;
+
// 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;
// Return true if the Builder parameter has to be moved.
virtual bool BuilderParameterMustBeMoved() const;
@@ -94,6 +100,13 @@
// see if they contain the correct value.
virtual void GenValidator(std::ostream& s) const = 0;
+ // Some fields are containers of other fields, e.g. array, vector, etc.
+ // Assume STL containers that support swap()
+ virtual bool IsContainerField() const;
+
+ // Get field of nested elements if this is a container field, nullptr if none
+ virtual const PacketField* GetElementField() const;
+
std::string GetDebugName() const override;
ParseLocation GetLocation() const override;
diff --git a/gd/packet/parser/fields/padding_field.cc b/gd/packet/parser/fields/padding_field.cc
index 0ae99c9..5f438f8 100644
--- a/gd/packet/parser/fields/padding_field.cc
+++ b/gd/packet/parser/fields/padding_field.cc
@@ -40,10 +40,14 @@
void PaddingField::GenExtractor(std::ostream&, int, bool) const {}
+std::string PaddingField::GetGetterFunctionName() const {
+ return "";
+}
+
void PaddingField::GenGetter(std::ostream&, Size, Size) const {}
-bool PaddingField::GenBuilderParameter(std::ostream&) const {
- return false;
+std::string PaddingField::GetBuilderParameterType() const {
+ return "";
}
bool PaddingField::HasParameterValidator() const {
diff --git a/gd/packet/parser/fields/padding_field.h b/gd/packet/parser/fields/padding_field.h
index 5c22c1a..bb99d42 100644
--- a/gd/packet/parser/fields/padding_field.h
+++ b/gd/packet/parser/fields/padding_field.h
@@ -37,9 +37,11 @@
virtual void GenExtractor(std::ostream& s, int num_leading_bits, bool for_struct) const override;
+ virtual std::string GetGetterFunctionName() const override;
+
virtual void GenGetter(std::ostream& s, Size start_offset, Size end_offset) const override;
- virtual bool GenBuilderParameter(std::ostream&) const override;
+ virtual std::string GetBuilderParameterType() const override;
virtual bool HasParameterValidator() const override;
diff --git a/gd/packet/parser/fields/payload_field.cc b/gd/packet/parser/fields/payload_field.cc
index a13a6de..c075996 100644
--- a/gd/packet/parser/fields/payload_field.cc
+++ b/gd/packet/parser/fields/payload_field.cc
@@ -58,8 +58,12 @@
ERROR(this) << __func__ << " should never be called. ";
}
+std::string PayloadField::GetGetterFunctionName() const {
+ return "GetPayload";
+}
+
void PayloadField::GenGetter(std::ostream& s, Size start_offset, Size end_offset) const {
- s << "PacketView<kLittleEndian> GetPayload() const {";
+ s << "PacketView<kLittleEndian> " << GetGetterFunctionName() << "() const {";
s << "ASSERT(was_validated_);";
s << "size_t end_index = size();";
s << "auto to_bound = begin();";
@@ -67,7 +71,7 @@
s << "return GetLittleEndianSubview(field_begin, field_end);";
s << "}\n\n";
- s << "PacketView<!kLittleEndian> GetPayloadBigEndian() const {";
+ s << "PacketView<!kLittleEndian> " << GetGetterFunctionName() << "BigEndian() const {";
s << "ASSERT(was_validated_);";
s << "size_t end_index = size();";
s << "auto to_bound = begin();";
@@ -76,8 +80,11 @@
s << "}\n";
}
-bool PayloadField::GenBuilderParameter(std::ostream& s) const {
- s << "std::unique_ptr<BasePacketBuilder> payload";
+std::string PayloadField::GetBuilderParameterType() const {
+ return "std::unique_ptr<BasePacketBuilder>";
+}
+
+bool PayloadField::BuilderParameterMustBeMoved() const {
return true;
}
diff --git a/gd/packet/parser/fields/payload_field.h b/gd/packet/parser/fields/payload_field.h
index 12cec07..11e6267 100644
--- a/gd/packet/parser/fields/payload_field.h
+++ b/gd/packet/parser/fields/payload_field.h
@@ -36,9 +36,13 @@
virtual void GenExtractor(std::ostream& s, int num_leading_bits, bool for_struct) const override;
+ virtual std::string GetGetterFunctionName() const override;
+
virtual void GenGetter(std::ostream& s, Size start_offset, Size end_offset) const override;
- virtual bool GenBuilderParameter(std::ostream& s) const override;
+ virtual std::string GetBuilderParameterType() const override;
+
+ virtual bool BuilderParameterMustBeMoved() const override;
virtual void GenBuilderParameterFromView(std::ostream& s) const override;
diff --git a/gd/packet/parser/fields/reserved_field.cc b/gd/packet/parser/fields/reserved_field.cc
index b0a62f1..0acf7b7 100644
--- a/gd/packet/parser/fields/reserved_field.cc
+++ b/gd/packet/parser/fields/reserved_field.cc
@@ -38,13 +38,17 @@
void ReservedField::GenExtractor(std::ostream&, int, bool) const {}
+std::string ReservedField::GetGetterFunctionName() const {
+ return "";
+}
+
void ReservedField::GenGetter(std::ostream&, Size, Size) const {
// There is no Getter for a reserved field
}
-bool ReservedField::GenBuilderParameter(std::ostream&) const {
+std::string ReservedField::GetBuilderParameterType() const {
// There is no builder parameter for a reserved field
- return false;
+ return "";
}
bool ReservedField::HasParameterValidator() const {
diff --git a/gd/packet/parser/fields/reserved_field.h b/gd/packet/parser/fields/reserved_field.h
index b2df0f1..7d36352 100644
--- a/gd/packet/parser/fields/reserved_field.h
+++ b/gd/packet/parser/fields/reserved_field.h
@@ -33,9 +33,11 @@
virtual void GenExtractor(std::ostream& s, int num_leading_bits, bool for_struct) const override;
+ virtual std::string GetGetterFunctionName() const override;
+
virtual void GenGetter(std::ostream&, Size, Size) const override;
- virtual bool GenBuilderParameter(std::ostream&) const override;
+ virtual std::string GetBuilderParameterType() const override;
virtual bool HasParameterValidator() const override;
diff --git a/gd/packet/parser/fields/scalar_field.cc b/gd/packet/parser/fields/scalar_field.cc
index 47b1a43..c6d2ecf 100644
--- a/gd/packet/parser/fields/scalar_field.cc
+++ b/gd/packet/parser/fields/scalar_field.cc
@@ -88,9 +88,14 @@
s << "*" << GetName() << "_ptr = static_cast<" << GetDataType() << ">(extracted_value);";
}
+std::string ScalarField::GetGetterFunctionName() const {
+ std::stringstream ss;
+ ss << "Get" << util::UnderscoreToCamelCase(GetName());
+ return ss.str();
+}
+
void ScalarField::GenGetter(std::ostream& s, Size start_offset, Size end_offset) const {
- s << GetDataType();
- s << " Get" << util::UnderscoreToCamelCase(GetName()) << "() const {";
+ s << GetDataType() << " " << GetGetterFunctionName() << "() const {";
s << "ASSERT(was_validated_);";
s << "auto to_bound = begin();";
int num_leading_bits = GenBounds(s, start_offset, end_offset, GetSize());
@@ -101,9 +106,8 @@
s << "}";
}
-bool ScalarField::GenBuilderParameter(std::ostream& s) const {
- s << GetDataType() << " " << GetName();
- return true;
+std::string ScalarField::GetBuilderParameterType() const {
+ return GetDataType();
}
bool ScalarField::HasParameterValidator() const {
diff --git a/gd/packet/parser/fields/scalar_field.h b/gd/packet/parser/fields/scalar_field.h
index 480dc28..65f897e 100644
--- a/gd/packet/parser/fields/scalar_field.h
+++ b/gd/packet/parser/fields/scalar_field.h
@@ -35,9 +35,11 @@
virtual void GenExtractor(std::ostream& s, int num_leading_bits, bool for_struct) const override;
+ virtual std::string GetGetterFunctionName() const override;
+
virtual void GenGetter(std::ostream& s, Size start_offset, Size end_offset) const override;
- virtual bool GenBuilderParameter(std::ostream& s) const override;
+ virtual std::string GetBuilderParameterType() const override;
virtual bool HasParameterValidator() const override;
diff --git a/gd/packet/parser/fields/struct_field.cc b/gd/packet/parser/fields/struct_field.cc
index 1a37d24..fbdafcf 100644
--- a/gd/packet/parser/fields/struct_field.cc
+++ b/gd/packet/parser/fields/struct_field.cc
@@ -44,8 +44,14 @@
s << GetDataType() << "::Parse(" << GetName() << "_ptr, " << GetName() << "_it);";
}
+std::string StructField::GetGetterFunctionName() const {
+ std::stringstream ss;
+ ss << "Get" << util::UnderscoreToCamelCase(GetName());
+ return ss.str();
+}
+
void StructField::GenGetter(std::ostream& s, Size start_offset, Size end_offset) const {
- s << GetDataType() << " Get" << util::UnderscoreToCamelCase(GetName()) << "() const {";
+ s << GetDataType() << " " << GetGetterFunctionName() << "() const {";
s << "ASSERT(was_validated_);";
s << "size_t end_index = size();";
s << "auto to_bound = begin();";
@@ -58,9 +64,8 @@
s << "}\n";
}
-bool StructField::GenBuilderParameter(std::ostream& s) const {
- s << GetDataType() << " " << GetName();
- return true;
+std::string StructField::GetBuilderParameterType() const {
+ return GetDataType();
}
bool StructField::HasParameterValidator() const {
diff --git a/gd/packet/parser/fields/struct_field.h b/gd/packet/parser/fields/struct_field.h
index 7f1d7d0..1f4f100 100644
--- a/gd/packet/parser/fields/struct_field.h
+++ b/gd/packet/parser/fields/struct_field.h
@@ -35,9 +35,11 @@
virtual void GenExtractor(std::ostream& s, int num_leading_bits, bool for_struct) const override;
+ virtual std::string GetGetterFunctionName() const override;
+
virtual void GenGetter(std::ostream& s, Size start_offset, Size end_offset) const override;
- virtual bool GenBuilderParameter(std::ostream& s) const override;
+ virtual std::string GetBuilderParameterType() const override;
virtual bool HasParameterValidator() const override;
diff --git a/gd/packet/parser/fields/variable_length_struct_field.cc b/gd/packet/parser/fields/variable_length_struct_field.cc
index c07bc2c..51a46e4 100644
--- a/gd/packet/parser/fields/variable_length_struct_field.cc
+++ b/gd/packet/parser/fields/variable_length_struct_field.cc
@@ -49,8 +49,14 @@
s << "}";
}
+std::string VariableLengthStructField::GetGetterFunctionName() const {
+ std::stringstream ss;
+ ss << "Get" << util::UnderscoreToCamelCase(GetName());
+ return ss.str();
+}
+
void VariableLengthStructField::GenGetter(std::ostream& s, Size start_offset, Size end_offset) const {
- s << "std::unique_ptr<" << type_name_ << "> Get" << util::UnderscoreToCamelCase(GetName()) << "() const {";
+ s << GetDataType() << " " << GetGetterFunctionName() << "() const {";
s << "ASSERT(was_validated_);";
s << "size_t end_index = size();";
s << "auto to_bound = begin();";
@@ -61,9 +67,8 @@
s << "}\n";
}
-bool VariableLengthStructField::GenBuilderParameter(std::ostream& s) const {
- s << GetDataType() << " " << GetName();
- return true;
+std::string VariableLengthStructField::GetBuilderParameterType() const {
+ return GetDataType();
}
bool VariableLengthStructField::BuilderParameterMustBeMoved() const {
diff --git a/gd/packet/parser/fields/variable_length_struct_field.h b/gd/packet/parser/fields/variable_length_struct_field.h
index 4b5d62b..0b1b97f 100644
--- a/gd/packet/parser/fields/variable_length_struct_field.h
+++ b/gd/packet/parser/fields/variable_length_struct_field.h
@@ -35,9 +35,11 @@
virtual void GenExtractor(std::ostream& s, int num_leading_bits, bool for_struct) const override;
+ virtual std::string GetGetterFunctionName() const override;
+
virtual void GenGetter(std::ostream& s, Size start_offset, Size end_offset) const override;
- virtual bool GenBuilderParameter(std::ostream& s) const override;
+ virtual std::string GetBuilderParameterType() const override;
virtual bool BuilderParameterMustBeMoved() const override;
diff --git a/gd/packet/parser/fields/vector_field.cc b/gd/packet/parser/fields/vector_field.cc
index 77fb546..ab47c4f 100644
--- a/gd/packet/parser/fields/vector_field.cc
+++ b/gd/packet/parser/fields/vector_field.cc
@@ -144,9 +144,14 @@
s << "}";
}
+std::string VectorField::GetGetterFunctionName() const {
+ std::stringstream ss;
+ ss << "Get" << util::UnderscoreToCamelCase(GetName());
+ return ss.str();
+}
+
void VectorField::GenGetter(std::ostream& s, Size start_offset, Size end_offset) const {
- s << GetDataType();
- s << " Get" << util::UnderscoreToCamelCase(GetName()) << "() {";
+ s << GetDataType() << " " << GetGetterFunctionName() << "() {";
s << "ASSERT(was_validated_);";
s << "size_t end_index = size();";
s << "auto to_bound = begin();";
@@ -160,13 +165,14 @@
s << "}\n";
}
-bool VectorField::GenBuilderParameter(std::ostream& s) const {
+std::string VectorField::GetBuilderParameterType() const {
+ std::stringstream ss;
if (element_field_->BuilderParameterMustBeMoved()) {
- s << "std::vector<" << element_field_->GetDataType() << "> " << GetName();
+ ss << "std::vector<" << element_field_->GetDataType() << ">";
} else {
- s << "const std::vector<" << element_field_->GetDataType() << ">& " << GetName();
+ ss << "const std::vector<" << element_field_->GetDataType() << ">&";
}
- return true;
+ return ss.str();
}
bool VectorField::BuilderParameterMustBeMoved() const {
@@ -216,3 +222,11 @@
const std::string& VectorField::GetSizeModifier() const {
return size_modifier_;
}
+
+bool VectorField::IsContainerField() const {
+ return true;
+}
+
+const PacketField* VectorField::GetElementField() const {
+ return element_field_;
+}
diff --git a/gd/packet/parser/fields/vector_field.h b/gd/packet/parser/fields/vector_field.h
index f8c1578..b2ae95d 100644
--- a/gd/packet/parser/fields/vector_field.h
+++ b/gd/packet/parser/fields/vector_field.h
@@ -41,9 +41,11 @@
virtual void GenExtractor(std::ostream& s, int num_leading_bits, bool for_struct) const override;
+ virtual std::string GetGetterFunctionName() const override;
+
virtual void GenGetter(std::ostream& s, Size start_offset, Size end_offset) const override;
- virtual bool GenBuilderParameter(std::ostream& s) const override;
+ virtual std::string GetBuilderParameterType() const override;
virtual bool BuilderParameterMustBeMoved() const override;
@@ -61,6 +63,10 @@
const std::string& GetSizeModifier() const;
+ virtual bool IsContainerField() const override;
+
+ virtual const PacketField* GetElementField() const override;
+
const std::string name_;
const PacketField* element_field_{nullptr};