stats: allow printing vectors on a single line
authorNilay Vaish <nilay@cs.wisc.edu>
Sun, 9 Jun 2013 12:29:57 +0000 (07:29 -0500)
committerNilay Vaish <nilay@cs.wisc.edu>
Sun, 9 Jun 2013 12:29:57 +0000 (07:29 -0500)
This patch adds a new flag to specify if the data values for a given vector
should be printed in one line in the stats.txt file. The default behavior
will be to print the data in multiple lines. It makes changes to print
functions to enforce this behavior.

src/base/stats/info.hh
src/base/stats/text.cc

index 98e811747f82ba156fdd39e331f3d74262209e37..b2ba41485349786561b07a30fdfb3e97616ceba4 100644 (file)
@@ -57,6 +57,8 @@ const FlagsType dist =          0x0080;
 const FlagsType nozero =        0x0100;
 /** Don't print if this is NAN */
 const FlagsType nonan =         0x0200;
+/** Print all values on a single line. Useful only for histograms. */
+const FlagsType oneline =       0x0400;
 
 /** Mask of flags that can't be set directly */
 const FlagsType __reserved =    init | display;
index 870b16f790975a5bc40735234bba5b1381c8f5d5..86f657e6e3cd4bdc09ab94593d00fdf1f89e77d4 100644 (file)
@@ -194,7 +194,7 @@ struct ScalarPrint
     Result cdf;
 
     void update(Result val, Result total);
-    void operator()(ostream &stream) const;
+    void operator()(ostream &stream, bool oneLine = false) const;
 };
 
 void
@@ -208,7 +208,7 @@ ScalarPrint::update(Result val, Result total)
 }
 
 void
-ScalarPrint::operator()(ostream &stream) const
+ScalarPrint::operator()(ostream &stream, bool oneLine) const
 {
     if ((flags.isSet(nozero) && value == 0.0) ||
         (flags.isSet(nonan) && std::isnan(value)))
@@ -222,14 +222,19 @@ ScalarPrint::operator()(ostream &stream) const
     if (!std::isnan(cdf))
         ccprintf(cdfstr, "%.2f%%", cdf * 100.0);
 
-    ccprintf(stream, "%-40s %12s %10s %10s", name,
-             ValueToString(value, precision), pdfstr.str(), cdfstr.str());
+    if (oneLine) {
+        ccprintf(stream, " |%12s %10s %10s",
+                 ValueToString(value, precision), pdfstr.str(), cdfstr.str());
+    } else {
+        ccprintf(stream, "%-40s %12s %10s %10s", name,
+                 ValueToString(value, precision), pdfstr.str(), cdfstr.str());
 
-    if (descriptions) {
-        if (!desc.empty())
-            ccprintf(stream, " # %s", desc);
+        if (descriptions) {
+            if (!desc.empty())
+                ccprintf(stream, " # %s", desc);
+        }
+        stream << endl;
     }
-    stream << endl;
 }
 
 struct VectorPrint
@@ -279,15 +284,31 @@ VectorPrint::operator()(std::ostream &stream) const
         return;
     }
 
-    for (off_type i = 0; i < _size; ++i) {
-        if (havesub && (i >= subnames.size() || subnames[i].empty()))
-            continue;
+    if ((!flags.isSet(nozero)) || (total != 0)) {
+        if (flags.isSet(oneline)) {
+            ccprintf(stream, "%-40s", name);
+            print.flags = print.flags & (~nozero);
+        }
+
+        for (off_type i = 0; i < _size; ++i) {
+            if (havesub && (i >= subnames.size() || subnames[i].empty()))
+                continue;
 
-        print.name = base + (havesub ? subnames[i] : to_string(i));
-        print.desc = subdescs.empty() ? desc : subdescs[i];
+            print.name = base + (havesub ? subnames[i] : to_string(i));
+            print.desc = subdescs.empty() ? desc : subdescs[i];
 
-        print.update(vec[i], _total);
-        print(stream);
+            print.update(vec[i], _total);
+            print(stream, flags.isSet(oneline));
+        }
+
+        if (flags.isSet(oneline)) {
+            if (descriptions) {
+                if (!desc.empty())
+                    ccprintf(stream, " # %s", desc);
+            }
+
+            stream << endl;
+        }
     }
 
     if (flags.isSet(::Stats::total)) {
@@ -298,6 +319,10 @@ VectorPrint::operator()(std::ostream &stream) const
         print.value = total;
         print(stream);
     }
+
+    if (flags.isSet(oneline) && ((!flags.isSet(nozero)) || (total != 0))) {
+        stream << endl;
+    }
 }
 
 struct DistPrint