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