}
}
-void PacketDef::GenRustStructSizeField(std::ostream& s) const {
- int size = 0;
- auto fields = fields_.GetFieldsWithoutTypes({
- BodyField::kFieldType,
- CountField::kFieldType,
- });
- for (int i = 0; i < fields.size(); i++) {
- size += fields[i]->GetSize().bits();
- }
- if (size % 8 != 0) {
- ERROR() << "Packet size is not a multiple of 8!\n";
- }
- s << size / 8;
-}
-
void PacketDef::GenRustStructImpls(std::ostream& s) const {
s << "impl " << name_ << "Data {";
}
s << "}\n";
- s << "pub fn get_size(&self) -> usize {";
- GenRustStructSizeField(s);
+ s << "fn get_size(&self) -> usize {";
+ GenSizeRetVal(s);
s << "}\n";
s << "}\n";
}
void GenRustStructFieldNames(std::ostream& s) const;
- void GenRustStructSizeField(std::ostream& s) const;
-
void GenRustStructImpls(std::ostream& s) const;
void GenRustAccessStructImpls(std::ostream& s) const;
const auto& vector_name = field_name + "_bytes";
const VectorField* vector = (VectorField*)sized_field;
if (vector->element_size_.empty() || vector->element_size_.has_dynamic()) {
- s << "let " << vector_name + " = self." << field_name << ".iter().fold(0, |acc, x| acc + x.get_size());";
+ s << "let " << vector_name + " = self." << field_name
+ << ".iter().fold(0, |acc, x| acc + x.get_total_size());";
} else {
s << "let " << vector_name + " = self." << field_name << ".len() * ((" << vector->element_size_ << ") / 8);";
}
field->GenRustWriter(s, start_field_offset, end_field_offset);
}
}
+
+void ParentDef::GenSizeRetVal(std::ostream& s) const {
+ int size = 0;
+ auto fields = fields_.GetFieldsWithoutTypes({
+ BodyField::kFieldType,
+ CountField::kFieldType,
+ });
+ for (int i = 0; i < fields.size(); i++) {
+ size += fields[i]->GetSize().bits();
+ }
+ if (size % 8 != 0) {
+ ERROR() << "size is not a multiple of 8!\n";
+ }
+ s << size / 8;
+
+ fields = fields_.GetFieldsWithTypes({
+ VectorField::kFieldType,
+ });
+ for (int i = 0; i < fields.size(); i++) {
+ const VectorField* vector = (VectorField*)fields[i];
+ if (vector->element_size_.empty() || vector->element_size_.has_dynamic()) {
+ s << " + self." << vector->GetName() << ".iter().fold(0, |acc, x| acc + x.get_total_size())";
+ } else {
+ s << " + (self." << vector->GetName() << ".len() * ((" << vector->element_size_ << ") / 8))";
+ }
+ }
+}
bool HasChildEnums() const;
void GenRustWriteToFields(std::ostream& s) const;
+
+ void GenSizeRetVal(std::ostream& s) const;
};
}
}
-void StructDef::GenRustSizeField(std::ostream& s) const {
- int size = 0;
- auto fields = fields_.GetFieldsWithoutTypes({
- BodyField::kFieldType,
- CountField::kFieldType,
- SizeField::kFieldType,
- });
- for (const auto& field : fields) {
- size += field->GetSize().bytes();
- }
- if (fields.size() > 0) {
- s << size;
- }
-}
-
void StructDef::GenRustDeclarations(std::ostream& s) const {
s << "#[derive(Debug, Clone)] ";
s << "pub struct " << name_ << "{";
GenRustWriteToFields(s);
s << "}\n";
- if (fields.size() > 0) {
- s << "pub fn get_size(&self) -> usize {";
- GenRustSizeField(s);
- s << "}";
- }
+ s << "fn get_total_size(&self) -> usize {";
+ GenSizeRetVal(s);
+ s << "}";
s << "}\n";
}
void GenRustFieldNames(std::ostream& s) const;
- void GenRustSizeField(std::ostream& s) const;
-
void GenRustDef(std::ostream& s) const;
private: