PEL: Support for going between PELs & registry

Add tables that allow one to go between how a PEL field actually shows
up in the PEL (raw bytes) and how it shows up in the message registry (a
string enumeration).  The tables also have a column to show a string
description of that value that can be used by the parser, though for now
those descriptions are all left at "TODO".

There only needs to be a table for a PEL field when there is a
corresponding message registry field that is a string enumeration, so
that when code looks up an error in the message registry it knows what
to fill in the PEL with.

Also provide APIs to look up a row in the table by either the PEL value
or the message registry value.

Signed-off-by: Matt Spinler <spinler@us.ibm.com>
Change-Id: Iac849bcd2b0449a8d03fac7eb067484e91d28259
diff --git a/test/openpower-pels/pel_values_test.cpp b/test/openpower-pels/pel_values_test.cpp
new file mode 100644
index 0000000..d44153c
--- /dev/null
+++ b/test/openpower-pels/pel_values_test.cpp
@@ -0,0 +1,24 @@
+#include "extensions/openpower-pels/pel_values.hpp"
+
+#include <gtest/gtest.h>
+
+using namespace openpower::pels::pel_values;
+
+TEST(PELFieldsTest, TestFindFields)
+{
+    auto s = findByValue(0x5D, subsystemValues);
+    ASSERT_NE(s, subsystemValues.end());
+    ASSERT_EQ(0x5D, std::get<fieldValuePos>(*s));
+    ASSERT_EQ("cec_service_network", std::get<registryNamePos>(*s));
+
+    s = findByName("cec_clocks", subsystemValues);
+    ASSERT_NE(s, subsystemValues.end());
+    ASSERT_EQ(0x58, std::get<fieldValuePos>(*s));
+    ASSERT_EQ("cec_clocks", std::get<registryNamePos>(*s));
+
+    s = findByValue(0xFF, subsystemValues);
+    ASSERT_EQ(s, subsystemValues.end());
+
+    s = findByName("foo", subsystemValues);
+    ASSERT_EQ(s, subsystemValues.end());
+}