summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/base/bitunion.hh46
-rw-r--r--src/base/bituniontest.cc14
2 files changed, 60 insertions, 0 deletions
diff --git a/src/base/bitunion.hh b/src/base/bitunion.hh
index 569d65031..b2a2ba806 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 std
};
}
+
+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 8781d2d5e..d7ed95bb8 100644
--- a/src/base/bituniontest.cc
+++ b/src/base/bituniontest.cc
@@ -270,3 +270,17 @@ TEST_F(BitUnionData, Templating)
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("");
+}