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
};