Add vtable support

The sd-bus interfaces for creating a VTABLE require C-only syntax, which
prevents them from being used in C++ code.  Create constexpr wrappers
that emit VTABLE entries so that a VTABLE can be created in C++ code.

Change-Id: I22892de1e87448ab9dce48034c9f030bc5bab9af
Signed-off-by: Patrick Williams <patrick@stwcx.xyz>
diff --git a/test/vtable/vtable.cpp b/test/vtable/vtable.cpp
new file mode 100644
index 0000000..8b11366
--- /dev/null
+++ b/test/vtable/vtable.cpp
@@ -0,0 +1,30 @@
+#include <sdbusplus/vtable.hpp>
+#include <cassert>
+
+static const sdbusplus::vtable::vtable_t example[] =
+    {
+        sdbusplus::vtable::start(),
+        sdbusplus::vtable::method((const char*)1, (const char*)2,
+                                  (const char*)3,
+                                  (sd_bus_message_handler_t)4),
+        sdbusplus::vtable::signal((const char*)5, (const char*)6),
+        sdbusplus::vtable::property((const char*)7, (const char*)8,
+                                    (sd_bus_property_get_t)9,
+                                    sdbusplus::vtable::property_::const_),
+        sdbusplus::vtable::property((const char*)10, (const char*)11,
+                                    (sd_bus_property_get_t)12,
+                                    (sd_bus_property_set_t)13),
+        sdbusplus::vtable::property_o((const char*)14, (const char*)15, 16),
+        sdbusplus::vtable::end()
+    };
+
+extern const sd_bus_vtable example2[];
+extern const size_t example2_size;
+
+int main(int argc, char** argv)
+{
+    assert(sizeof(example) == example2_size);
+    assert(0 == memcmp(example, example2, example2_size));
+
+    return 0;
+};
diff --git a/test/vtable/vtable_c.c b/test/vtable/vtable_c.c
new file mode 100644
index 0000000..442d6c7
--- /dev/null
+++ b/test/vtable/vtable_c.c
@@ -0,0 +1,21 @@
+#include <systemd/sd-bus.h>
+
+
+const sd_bus_vtable example2[] =
+    {
+        SD_BUS_VTABLE_START(0),
+        SD_BUS_METHOD((const char*)1, (const char*)2,
+                      (const char*)3, (sd_bus_message_handler_t)4, 0),
+        SD_BUS_SIGNAL((const char*)5, (const char*)6, 0),
+        SD_BUS_PROPERTY((const char*)7, (const char*)8,
+                        (sd_bus_property_get_t)9, 0,
+                        SD_BUS_VTABLE_PROPERTY_CONST),
+        SD_BUS_WRITABLE_PROPERTY((const char*)10, (const char*)11,
+                                 (sd_bus_property_get_t)12,
+                                 (sd_bus_property_set_t)13, 0, 0),
+        SD_BUS_PROPERTY((const char*)14, (const char*)15, NULL, 16, 0),
+        SD_BUS_VTABLE_END,
+    };
+
+const size_t example2_size = sizeof(example2);
+