#include "dbcc/dbc_iterator.h" #include #include namespace ad { namespace dbcc { DbcIterator::DbcIterator(const std::string &filePath) { std::ifstream file(filePath); if (file) { _parse(file); } file.close(); } DbcIterator::DbcIterator(std::istream &stream) { _parse(stream); } std::ostream &operator<<(std::ostream &out, DbcIterator &dbc) { for (auto &msg : dbc) { out << msg.name() << " " << msg.id() << std::endl; for (auto &sig : msg) { out << "Signal: " << sig.name() << " [" << (sig.isFloat() ? "float" : "int") << "] "; out << "To: "; for (auto to : sig.to()) { out << to << ", "; } out << sig.startBit() << "," << sig.length() << std::endl; out << "(" << sig.factor() << ", " << sig.offset() << ")" << std::endl; out << "[" << sig.minimum() << ", " << sig.maximum() << "]" << std::endl; if (sig.multiplexor() == Multiplexor::Multiplexed) { out << "#" << sig.multiplexedNumber() << "#" << std::endl; } else if (sig.multiplexor() == Multiplexor::Multiplexor) { out << "+Multiplexor+" << std::endl; } out << std::endl; } } return out; } void DbcIterator::_parse(std::istream &stream) { m_messages.clear(); do { Message msg; stream >> msg; if (stream.fail()) { stream.clear(); stream.ignore(std::numeric_limits::max(), '\n'); } else { m_messages.emplace_back(msg); m_messageIndex[msg.id()] = static_cast(m_messages.size() - 1); } } while (!stream.eof()); } } // namespace dbcc } // namespace ad