Readability review.

Review URL: http://codereview.chromium.org/2729018
diff --git a/metrics/counter.cc b/metrics/counter.cc
index 58dbae4..b81a0d1 100644
--- a/metrics/counter.cc
+++ b/metrics/counter.cc
@@ -4,7 +4,7 @@
 
 #include "counter.h"
 
-#include <sys/file.h>
+#include <fcntl.h>
 
 #include <base/eintr_wrapper.h>
 #include <base/logging.h>
@@ -12,26 +12,28 @@
 namespace chromeos_metrics {
 
 // TaggedCounter::Record implementation.
-void TaggedCounter::Record::Init(int tag, int count) {
+void TaggedCounter::Record::Init(int32 tag, int32 count) {
   tag_ = tag;
   count_ = (count > 0) ? count : 0;
 }
 
-void TaggedCounter::Record::Add(int count) {
+void TaggedCounter::Record::Add(int32 count) {
   if (count <= 0)
     return;
 
-  count_ += count;
-
-  // Saturates on postive overflow.
-  if (count_ < 0) {
-    count_ = INT_MAX;
-  }
+  // Saturates on positive overflow.
+  int64 new_count = static_cast<int64>(count_) + static_cast<int64>(count);
+  if (new_count > kint32max)
+    count_ = kint32max;
+  else
+    count_ = static_cast<int32>(new_count);
 }
 
 // TaggedCounter implementation.
 TaggedCounter::TaggedCounter()
-    : filename_(NULL), reporter_(NULL), reporter_handle_(NULL),
+    : filename_(NULL),
+      reporter_(NULL),
+      reporter_handle_(NULL),
       record_state_(kRecordInvalid) {}
 
 TaggedCounter::~TaggedCounter() {}
@@ -45,7 +47,7 @@
   record_state_ = kRecordInvalid;
 }
 
-void TaggedCounter::Update(int tag, int count) {
+void TaggedCounter::Update(int32 tag, int32 count) {
   UpdateInternal(tag,
                  count,
                  false);  // No flush.
@@ -57,7 +59,7 @@
                  true);  // Do flush.
 }
 
-void TaggedCounter::UpdateInternal(int tag, int count, bool flush) {
+void TaggedCounter::UpdateInternal(int32 tag, int32 count, bool flush) {
   if (flush) {
     // Flushing but record is null, so nothing to do.
     if (record_state_ == kRecordNull)
@@ -104,11 +106,10 @@
     record_state_ = kRecordNullDirty;
     return;
   }
-
   record_state_ = kRecordNull;
 }
 
-void TaggedCounter::ReportRecord(int tag, bool flush) {
+void TaggedCounter::ReportRecord(int32 tag, bool flush) {
   // If no valid record, there's nothing to report.
   if (record_state_ != kRecordValid) {
     DCHECK_EQ(record_state_, kRecordNull);
@@ -126,7 +127,7 @@
   record_state_ = kRecordNullDirty;
 }
 
-void TaggedCounter::UpdateRecord(int tag, int count, bool flush) {
+void TaggedCounter::UpdateRecord(int32 tag, int32 count, bool flush) {
   if (flush) {
     DCHECK(record_state_ == kRecordNull || record_state_ == kRecordNullDirty);
     return;
diff --git a/metrics/counter.h b/metrics/counter.h
index 876b107..1cfcb51 100644
--- a/metrics/counter.h
+++ b/metrics/counter.h
@@ -5,6 +5,7 @@
 #ifndef METRICS_COUNTER_H_
 #define METRICS_COUNTER_H_
 
+#include <base/basictypes.h>
 #include <gtest/gtest_prod.h>  // for FRIEND_TEST
 
 namespace chromeos_metrics {
@@ -18,6 +19,11 @@
 // event counts.  The aggregated count is reported through the
 // callback when the counter is explicitly flushed or when data for a
 // new tag arrives.
+//
+// The primary reason for using an interface is to allow easier unit
+// testing in clients through mocking thus avoiding file access and
+// callbacks. Of course, it also enables alternative implementations
+// of the counter with additional features.
 class TaggedCounterInterface {
  public:
   // Callback type used for reporting aggregated or flushed data.
@@ -27,7 +33,7 @@
   // |handle| is the |reporter_handle| pointer passed through Init.
   // |tag| is the tag associated with the aggregated count.
   // |count| is aggregated count.
-  typedef void (*Reporter)(void* handle, int tag, int count);
+  typedef void (*Reporter)(void* handle, int32 tag, int32 count);
 
   virtual ~TaggedCounterInterface() {}
 
@@ -44,7 +50,7 @@
   // Adds |count| of events for the given |tag|. If there's an
   // existing aggregated count for a different tag, it's reported
   // through the reporter callback and discarded.
-  virtual void Update(int tag, int count) = 0;
+  virtual void Update(int32 tag, int32 count) = 0;
 
   // Reports the current aggregated count (if any) through the
   // reporter callback and discards it.
@@ -58,7 +64,7 @@
 
   // Implementation of interface methods.
   void Init(const char* filename, Reporter reporter, void* reporter_handle);
-  void Update(int tag, int count);
+  void Update(int32 tag, int32 count);
   void Flush();
 
  private:
@@ -89,25 +95,25 @@
 
     // Initializes with |tag| and |count|. If |count| is negative,
     // |count_| is set to 0.
-    void Init(int tag, int count);
+    void Init(int32 tag, int32 count);
 
     // Adds |count| to the current |count_|. Negative |count| is
     // ignored. In case of positive overflow, |count_| is saturated to
-    // INT_MAX.
-    void Add(int count);
+    // kint32max.
+    void Add(int32 count);
 
-    int tag() const { return tag_; }
-    int count() const { return count_; }
+    int32 tag() const { return tag_; }
+    int32 count() const { return count_; }
 
    private:
-    int tag_;
-    int count_;
+    int32 tag_;
+    int32 count_;
   };
 
   // Implementation of the Update and Flush methods. Goes through the
   // necessary steps to read, report, update, and sync the aggregated
   // record.
-  void UpdateInternal(int tag, int count, bool flush);
+  void UpdateInternal(int32 tag, int32 count, bool flush);
 
   // If the current cached record is invalid, reads it from persistent
   // storage specified through file descriptor |fd| and updates the
@@ -119,13 +125,13 @@
   // or the new |tag| is different than the old one, reports the
   // aggregated data through the reporter callback and resets the
   // cached record.
-  void ReportRecord(int tag, bool flush);
+  void ReportRecord(int32 tag, bool flush);
 
   // Updates the cached record given the new |tag| and |count|. This
   // method expects either a null cached record, or a valid cached
   // record with the same tag as |tag|. If |flush| is true, the method
   // asserts that the cached record is null and returns.
-  void UpdateRecord(int tag, int count, bool flush);
+  void UpdateRecord(int32 tag, int32 count, bool flush);
 
   // If the cached record state is dirty, updates the persistent
   // storage specified through file descriptor |fd| and switches the
diff --git a/metrics/counter_mock.h b/metrics/counter_mock.h
index 22327ac..baa97b0 100644
--- a/metrics/counter_mock.h
+++ b/metrics/counter_mock.h
@@ -24,3 +24,4 @@
 }  // namespace chromeos_metrics
 
 #endif  // METRICS_COUNTER_MOCK_H_
+
diff --git a/metrics/counter_test.cc b/metrics/counter_test.cc
index 605e859..fd5a389 100644
--- a/metrics/counter_test.cc
+++ b/metrics/counter_test.cc
@@ -62,8 +62,8 @@
   // Asserts that the record file contains the specified contents.
   testing::AssertionResult AssertRecord(const char* expr_tag,
                                         const char* expr_count,
-                                        int expected_tag,
-                                        int expected_count) {
+                                        int32 expected_tag,
+                                        int32 expected_count) {
     int fd = HANDLE_EINTR(open(kTestRecordFile, O_RDONLY));
     if (fd < 0) {
       testing::Message msg;
@@ -105,7 +105,7 @@
 
   // Adds a reporter call expectation that the specified tag/count
   // callback will be generated.
-  void ExpectReporterCall(int tag, int count) {
+  void ExpectReporterCall(int32 tag, int32 count) {
     EXPECT_CALL(reporter_, Call(_, tag, count))
         .Times(1)
         .RetiresOnSaturation();
@@ -113,7 +113,7 @@
 
   // The reporter callback forwards the call to the reporter mock so
   // that we can set call expectations.
-  static void Reporter(void* handle, int tag, int count) {
+  static void Reporter(void* handle, int32 tag, int32 count) {
     TaggedCounterTest* test = static_cast<TaggedCounterTest*>(handle);
     ASSERT_FALSE(NULL == test);
     test->reporter_.Call(handle, tag, count);
@@ -130,7 +130,7 @@
   }
 
   // Returns true if the counter log contains |pattern|, false otherwise.
-  bool LogContains(const std::string& pattern) {
+  bool LogContains(const std::string& pattern) const {
     return log_.find(pattern) != std::string::npos;
   }
 
@@ -141,7 +141,8 @@
   std::string log_;
 
   // Reporter mock to set callback expectations on.
-  StrictMock<MockFunction<void(void* handle, int tag, int count)> > reporter_;
+  StrictMock<MockFunction<void(void* handle,
+                               int32 tag, int32 count)> > reporter_;
 
   // Pointer to the current test fixture.
   static TaggedCounterTest* test_;
@@ -173,11 +174,11 @@
   record_.Add(/* count */ -2);
   EXPECT_EQ(15, record_.count());
 
-  record_.Add(/* count */ INT_MAX);
-  EXPECT_EQ(INT_MAX, record_.count());
+  record_.Add(/* count */ kint32max);
+  EXPECT_EQ(kint32max, record_.count());
 
   record_.Add(/* count */ 1);
-  EXPECT_EQ(INT_MAX, record_.count());
+  EXPECT_EQ(kint32max, record_.count());
 }
 
 TEST_F(TaggedCounterTest, BadFileLocation) {