numeric/endian: Add packed integer endian types

This makes it trivial to write packed structs for wire level
serialization.

Change-Id: I117eb6a80494c3ddca2a6924fd76be7df7365228
Signed-off-by: William A. Kennington III <wak@google.com>
diff --git a/test/numeric/endian.cpp b/test/numeric/endian.cpp
index d8f2ae8..8160753 100644
--- a/test/numeric/endian.cpp
+++ b/test/numeric/endian.cpp
@@ -1,6 +1,7 @@
 #include <stdplus/numeric/endian.hpp>
 
 #include <array>
+#include <cstring>
 
 #include <gtest/gtest.h>
 
@@ -21,4 +22,36 @@
     EXPECT_EQ(40, ntoh(hton(40)));
 }
 
+TEST(EndianPacked, Uint8)
+{
+    uint8_unt n = 0;
+    EXPECT_EQ(n.value(), 0);
+    EXPECT_EQ(n, 0);
+
+    n = 15;
+    EXPECT_EQ(n.value(), 15);
+    EXPECT_EQ(n, 15);
+}
+
+TEST(EndianPacked, Uint32)
+{
+    uint32_unt n = 0;
+    EXPECT_EQ(n.value(), 0);
+    EXPECT_EQ(n, 0);
+
+    n = 15;
+    EXPECT_EQ(n.value(), 15);
+    EXPECT_EQ(n, 15);
+}
+
+TEST(EndianPacked, ValidateUnderlying)
+{
+    uint32_ubt b(15);
+    uint32_ult l = {};
+    EXPECT_EQ(b, 15);
+    EXPECT_EQ(l, 0);
+    std::memcpy(&l, &b, sizeof(l));
+    EXPECT_EQ(0x0f000000, l);
+}
+
 } // namespace stdplus