// SPDX-License-Identifier: MIT #ifndef DBC_STATEMENT_HANDLER_H #define DBC_STATEMENT_HANDLER_H #include "dbc_database.h" #include "typefactory.h" #include #include /** Mutable state belonging to one file parse. Handlers do not retain it. */ struct DbcParseContext { DbcDatabase &database; FrameInfo *currentFrame = nullptr; }; class DbcStatementHandler { public: virtual ~DbcStatementHandler() = default; virtual void Handle (const std::string &line, DbcParseContext &context) const = 0; }; class DbcFrameHandler : public DbcStatementHandler { public: void Handle (const std::string &line, DbcParseContext &context) const override; private: static FrameInfo ParseFrameLine (const std::string &line); }; class DbcSignalHandler : public DbcStatementHandler { public: void Handle (const std::string &line, DbcParseContext &context) const override; private: static SignalInfo ParseSignalLine (const std::string &line); }; class DbcCommentHandler : public DbcStatementHandler { public: void Handle (const std::string &line, DbcParseContext &context) const override; private: static void ParseCommentLine (const std::string &line, DbcDatabase &database); }; /** Exact-key dispatch to handlers created once per registration via TypeFactory. */ class DbcStatementDispatcher { public: DbcStatementDispatcher(); template void RegisterType (const std::string &keyword) { m_factory.registerType (keyword); m_handlers.insert_or_assign (keyword, m_factory.create (keyword)); } /** Returns false for an unregistered keyword; input must be trimmed. */ bool Dispatch (const std::string &line, DbcParseContext &context) const; private: TypeFactory m_factory; std::unordered_map > m_handlers; }; #endif /* DBC_STATEMENT_HANDLER_H */