Loading system/gd/packet/parser/gen_cpp.cc +1 −0 Original line number Diff line number Diff line Loading @@ -82,6 +82,7 @@ bool generate_cpp_headers_one_file( #include <cstdint> #include <functional> #include <optional> #include <sstream> #include <string> #include <type_traits> Loading system/gd/packet/parser/packet_def.cc +14 −1 Original line number Diff line number Diff line Loading @@ -44,9 +44,22 @@ void PacketDef::GenParserDefinition(std::ostream& s, bool generate_fuzzing, bool if (parent_ != nullptr) { s << "static " << name_ << "View Create(" << parent_->name_ << "View parent)"; s << "{ return " << name_ << "View(std::move(parent)); }"; // CreateOptional s << "static std::optional<" << name_ << "View> CreateOptional("; s << parent_->name_ << "View parent)"; s << "{ auto to_validate = " << name_ << "View::Create(std::move(parent));"; s << "if (to_validate.IsValid()) { return to_validate; }"; s << "else {return {};}}"; } else { s << "static " << name_ << "View Create(PacketView<" << (is_little_endian_ ? "" : "!") << "kLittleEndian> packet) "; s << "static " << name_ << "View Create(PacketView<"; s << (is_little_endian_ ? "" : "!") << "kLittleEndian> packet)"; s << "{ return " << name_ << "View(std::move(packet)); }"; // CreateOptional s << "static std::optional<" << name_ << "View> CreateOptional(PacketView<"; s << (is_little_endian_ ? "" : "!") << "kLittleEndian> packet)"; s << "{ auto to_validate = " << name_ << "View::Create(std::move(packet));"; s << "if (to_validate.IsValid()) { return to_validate; }"; s << "else {return {};}}"; } if (generate_fuzzing || generate_tests) { Loading system/gd/packet/parser/test/generated_packet_test.cc +23 −0 Original line number Diff line number Diff line Loading @@ -1965,6 +1965,29 @@ TEST(GeneratedPacketTest, testToStringOneFixedTypesStruct) { view.ToString()); } TEST(GeneratedPacketTest, testCreateOptional) { auto packet = ChildTwoTwoThreeBuilder::Create(); ASSERT_EQ(child_two_two_three.size(), packet->size()); std::shared_ptr<std::vector<uint8_t>> packet_bytes = std::make_shared<std::vector<uint8_t>>(); BitInserter it(*packet_bytes); packet->Serialize(it); PacketView<kLittleEndian> packet_bytes_view(packet_bytes); auto wrong_view = ParentView::CreateOptional(packet_bytes_view); ASSERT_FALSE(wrong_view.has_value()); auto parent_view = ParentTwoView::CreateOptional(packet_bytes_view); ASSERT_EQ(FourBits::TWO, parent_view->GetFourBits()); auto child_view = ChildTwoTwoView::CreateOptional(*parent_view); ASSERT_EQ(FourBits::THREE, child_view->GetMoreBits()); auto grandchild_view = ChildTwoTwoThreeView::CreateOptional(*child_view); ASSERT_TRUE(grandchild_view.has_value()); } } // namespace parser } // namespace packet } // namespace bluetooth Loading
system/gd/packet/parser/gen_cpp.cc +1 −0 Original line number Diff line number Diff line Loading @@ -82,6 +82,7 @@ bool generate_cpp_headers_one_file( #include <cstdint> #include <functional> #include <optional> #include <sstream> #include <string> #include <type_traits> Loading
system/gd/packet/parser/packet_def.cc +14 −1 Original line number Diff line number Diff line Loading @@ -44,9 +44,22 @@ void PacketDef::GenParserDefinition(std::ostream& s, bool generate_fuzzing, bool if (parent_ != nullptr) { s << "static " << name_ << "View Create(" << parent_->name_ << "View parent)"; s << "{ return " << name_ << "View(std::move(parent)); }"; // CreateOptional s << "static std::optional<" << name_ << "View> CreateOptional("; s << parent_->name_ << "View parent)"; s << "{ auto to_validate = " << name_ << "View::Create(std::move(parent));"; s << "if (to_validate.IsValid()) { return to_validate; }"; s << "else {return {};}}"; } else { s << "static " << name_ << "View Create(PacketView<" << (is_little_endian_ ? "" : "!") << "kLittleEndian> packet) "; s << "static " << name_ << "View Create(PacketView<"; s << (is_little_endian_ ? "" : "!") << "kLittleEndian> packet)"; s << "{ return " << name_ << "View(std::move(packet)); }"; // CreateOptional s << "static std::optional<" << name_ << "View> CreateOptional(PacketView<"; s << (is_little_endian_ ? "" : "!") << "kLittleEndian> packet)"; s << "{ auto to_validate = " << name_ << "View::Create(std::move(packet));"; s << "if (to_validate.IsValid()) { return to_validate; }"; s << "else {return {};}}"; } if (generate_fuzzing || generate_tests) { Loading
system/gd/packet/parser/test/generated_packet_test.cc +23 −0 Original line number Diff line number Diff line Loading @@ -1965,6 +1965,29 @@ TEST(GeneratedPacketTest, testToStringOneFixedTypesStruct) { view.ToString()); } TEST(GeneratedPacketTest, testCreateOptional) { auto packet = ChildTwoTwoThreeBuilder::Create(); ASSERT_EQ(child_two_two_three.size(), packet->size()); std::shared_ptr<std::vector<uint8_t>> packet_bytes = std::make_shared<std::vector<uint8_t>>(); BitInserter it(*packet_bytes); packet->Serialize(it); PacketView<kLittleEndian> packet_bytes_view(packet_bytes); auto wrong_view = ParentView::CreateOptional(packet_bytes_view); ASSERT_FALSE(wrong_view.has_value()); auto parent_view = ParentTwoView::CreateOptional(packet_bytes_view); ASSERT_EQ(FourBits::TWO, parent_view->GetFourBits()); auto child_view = ChildTwoTwoView::CreateOptional(*parent_view); ASSERT_EQ(FourBits::THREE, child_view->GetMoreBits()); auto grandchild_view = ChildTwoTwoThreeView::CreateOptional(*child_view); ASSERT_TRUE(grandchild_view.has_value()); } } // namespace parser } // namespace packet } // namespace bluetooth