#define __BASE_BITUNION_HH__
#include <functional>
+#include <iostream>
#include <type_traits>
+#include <typeinfo>
#include "base/bitfield.hh"
};
}
+
+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__
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("");
+}