Listing 1
// Encapsulates a lint issue (ie. warning, error) class Issue { public: Issue(int number, int severity) : m_number(number), m_severity(severity), m_count(0) {} // Register a file with this issue void addFile(const File* pFile) { assert(pFile != NULL); m_files.push_back(pFile); ++m_count; } int getNumber() const { return m_number; } int getSeverity() const { return m_severity; } int getCount() const { return m_count; } private: friend bool operator<(const Issue& lhs, const Issue& rhs); typedef std::vector<const File*> FileList; int m_number; // Lint issue number int m_severity; // The severity level of this lint issue int m_count; // Total number of occurrences of this lint issue FileList m_files; // List of all files that contain this lint issue }; // Encapsulates a source code file with possibly many lint issues class File { public: File(const std::string& filename) : m_filename(filename), m_severityScore(0), m_severestIssueNumber(UNUSED_ISSUE_NUMBER) {} // Registers a lint issue with this file void addIssue(const Issue* pIssue) { assert(pIssue != NULL); m_issues.push_back(pIssue); int issueNumber = pIssue->getNumber(); int severity = getSeverity(issueNumber); if ( m_severestIssueNumber == UNUSED_ISSUE_NUMBER || severity > getSeverity(m_severestIssueNumber) ) { m_severestIssueNumber = issueNumber; } m_severityScore += severity; } const std::string& getFilename() const { return m_filename; } int getSeverityScore() const { return m_severityScore; } int getSeverestIssueNumber() const { return m_severestIssueNumber; } private: friend bool operator<(const File& lhs, const File& rhs); typedef std::vector<const Issue*> IssueList; std::string m_filename; // The name of this source code module int m_severityScore; // The accumulated severity score int m_severestIssueNumber; // The issue number with the highest severity IssueList m_issues; // List of all Lint issues contained in this file };