Add postream for ostream-ing packets more reliably.
diff --git a/Eigen/src/Core/GenericPacketMath.h b/Eigen/src/Core/GenericPacketMath.h
index 94b1858..71862fa 100644
--- a/Eigen/src/Core/GenericPacketMath.h
+++ b/Eigen/src/Core/GenericPacketMath.h
@@ -1562,6 +1562,37 @@
return (Packet)pand(result, peven_mask(result)); // atan2 0 atan2 0 ...
}
+#ifndef EIGEN_NO_IO
+
+template <typename Packet>
+class StreamablePacket {
+ public:
+ using Scalar = typename unpacket_traits<Packet>::type;
+ StreamablePacket(const Packet& packet) { pstoreu(v_, packet); }
+
+ friend std::ostream& operator<<(std::ostream& os, const StreamablePacket& packet) {
+ os << "{" << packet.v_[0];
+ for (int i = 1; i < unpacket_traits<Packet>::size; ++i) {
+ os << "," << packet.v_[i];
+ }
+ os << "}";
+ return os;
+ }
+
+ private:
+ Scalar v_[unpacket_traits<Packet>::size];
+};
+
+/**
+ * \internal \returns an intermediary that can be used to ostream packets, e.g. for debugging.
+ */
+template <typename Packet>
+StreamablePacket<Packet> postream(const Packet& packet) {
+ return StreamablePacket<Packet>(packet);
+}
+
+#endif // EIGEN_NO_IO
+
} // end namespace internal
} // end namespace Eigen
diff --git a/test/packet_ostream.h b/test/packet_ostream.h
deleted file mode 100644
index 4a3ee9c..0000000
--- a/test/packet_ostream.h
+++ /dev/null
@@ -1,24 +0,0 @@
-#ifndef TEST_PACKET_OSTREAM
-#define TEST_PACKET_OSTREAM
-
-#include <type_traits>
-#include <ostream>
-
-// Include this header to be able to print Packets while debugging.
-
-template <typename Packet,
- typename EnableIf = std::enable_if_t<(Eigen::internal::unpacket_traits<Packet>::vectorizable ||
- Eigen::internal::unpacket_traits<Packet>::size > 1)> >
-std::ostream& operator<<(std::ostream& os, const Packet& packet) {
- using Scalar = typename Eigen::internal::unpacket_traits<Packet>::type;
- Scalar v[Eigen::internal::unpacket_traits<Packet>::size];
- Eigen::internal::pstoreu(v, packet);
- os << "{" << v[0];
- for (int i = 1; i < Eigen::internal::unpacket_traits<Packet>::size; ++i) {
- os << "," << v[i];
- }
- os << "}";
- return os;
-}
-
-#endif // TEST_PACKET_OSTREAM
\ No newline at end of file
diff --git a/test/packetmath.cpp b/test/packetmath.cpp
index ed39509..7333ad8 100644
--- a/test/packetmath.cpp
+++ b/test/packetmath.cpp
@@ -10,7 +10,6 @@
#include "packetmath_test_shared.h"
#include "random_without_cast_overflow.h"
-#include "packet_ostream.h"
template <typename T>
inline T REF_ADD(const T& a, const T& b) {
@@ -630,6 +629,7 @@
negate_test<Scalar, Packet>(data1, data2, ref, PacketSize);
CHECK_CWISE1_IF(PacketTraits::HasReciprocal, REF_RECIPROCAL, internal::preciprocal);
CHECK_CWISE1(numext::conj, internal::pconj);
+
CHECK_CWISE1_IF(PacketTraits::HasSign, numext::sign, internal::psign);
for (int offset = 0; offset < 3; ++offset) {