Gabe Black has uploaded this change for review. ( https://gem5-review.googlesource.com/9461

Change subject: base: Add a default output function for bitunion types.
......................................................................

base: Add a default output function for bitunion types.

This way printing bitunions with, for instance, DPRINTF actually prints
something useful. More specialized overloads will still allow printing
particular bitunion types in ways that might make more sense for that
particular type.

Change-Id: I92beb0ce07683ba8b318cf25aa73e0057e4a60ef
---
M src/base/bitunion.hh
M src/base/bituniontest.cc
2 files changed, 60 insertions(+), 0 deletions(-)



diff --git a/src/base/bitunion.hh b/src/base/bitunion.hh
index 569d650..b2a2ba8 100644
--- a/src/base/bitunion.hh
+++ b/src/base/bitunion.hh
@@ -32,7 +32,9 @@
 #define __BASE_BITUNION_HH__

 #include <functional>
+#include <iostream>
 #include <type_traits>
+#include <typeinfo>

 #include "base/bitfield.hh"

@@ -414,4 +416,48 @@
     };
 }

+
+namespace BitfieldBackend
+{
+namespace
+{
+    template<typename T>
+    std::ostream &
+    bitfieldBackendPrinter(std::ostream &os, const T &t)
+    {
+        os << t;
+        return os;
+    }
+
+ //Since BitUnions are generally numerical values and not character codes, + //these specializations attempt to ensure that they get cast to integers
+    //of the appropriate type before printing.
+    template <>
+    std::ostream &
+    bitfieldBackendPrinter(std::ostream &os, const char &t)
+    {
+        os << (const int)t;
+        return os;
+    }
+
+    template <>
+    std::ostream &
+    bitfieldBackendPrinter(std::ostream &os, const unsigned char &t)
+    {
+        os << (const unsigned int)t;
+        return os;
+    }
+}
+}
+
+//A default << operator which casts a bitunion to its underlying type and
+//passes it to BitfieldBackend::bitfieldBackendPrinter.
+template <typename T>
+std::ostream &
+operator << (std::ostream &os, const BitUnionType<T> &bu)
+{
+    return BitfieldBackend::bitfieldBackendPrinter(
+            os, (BitUnionBaseType<T>)bu);
+}
+
 #endif // __BASE_BITUNION_HH__
diff --git a/src/base/bituniontest.cc b/src/base/bituniontest.cc
index 8781d2d..d7ed95b 100644
--- a/src/base/bituniontest.cc
+++ b/src/base/bituniontest.cc
@@ -270,3 +270,17 @@
     is64 = std::is_same<BitUnionBaseType<Dummy32>, uint64_t>::value;
     EXPECT_FALSE(is64);
 }
+
+TEST_F(BitUnionData, Output)
+{
+    sixtyFour = 1234567812345678;
+    std::stringstream ss;
+    ss << sixtyFour;
+    EXPECT_EQ(ss.str(), "1234567812345678");
+    ss.str("");
+
+    EmptyEight eight = 65;
+    ss << eight;
+    EXPECT_EQ(ss.str(), "65");
+    ss.str("");
+}

--
To view, visit https://gem5-review.googlesource.com/9461
To unsubscribe, or for help writing mail filters, visit https://gem5-review.googlesource.com/settings

Gerrit-Project: public/gem5
Gerrit-Branch: master
Gerrit-Change-Id: I92beb0ce07683ba8b318cf25aa73e0057e4a60ef
Gerrit-Change-Number: 9461
Gerrit-PatchSet: 1
Gerrit-Owner: Gabe Black <[email protected]>
Gerrit-MessageType: newchange
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev

Reply via email to