server: un-inline various large functions

Save approximiately 70k (ARM32) of size from the generated library of
libphosphor-dbus.so by un-inlining various large functions.

Signed-off-by: Patrick Williams <patrick@stwcx.xyz>
Change-Id: Ie238ca7807960bf1577dcbb272226f197de84b01
diff --git a/src/server/interface.cpp b/src/server/interface.cpp
new file mode 100644
index 0000000..a72c656
--- /dev/null
+++ b/src/server/interface.cpp
@@ -0,0 +1,47 @@
+#include <sdbusplus/server/interface.hpp>
+
+namespace sdbusplus
+{
+
+namespace server
+{
+
+namespace interface
+{
+
+interface::interface(sdbusplus::bus::bus& bus, const char* path,
+                     const char* interf,
+                     const sdbusplus::vtable::vtable_t* vtable, void* context) :
+    _bus(bus.get(), bus.getInterface()),
+    _path(path), _interf(interf), _slot(nullptr), _intf(bus.getInterface()),
+    _interface_added(false)
+{
+    sd_bus_slot* slot = nullptr;
+    int r = _intf->sd_bus_add_object_vtable(_bus.get(), &slot, _path.c_str(),
+                                            _interf.c_str(), vtable, context);
+    if (r < 0)
+    {
+        throw exception::SdBusError(-r, "sd_bus_add_object_vtable");
+    }
+
+    _slot = decltype(_slot){slot};
+}
+
+interface::~interface()
+{
+    emit_removed();
+}
+
+void interface::property_changed(const char* property)
+{
+    std::array<const char*, 2> values = {property, nullptr};
+
+    // Note: Converting to use _strv version, could also mock two pointer
+    // use-case explicitly.
+    _intf->sd_bus_emit_properties_changed_strv(_bus.get(), _path.c_str(),
+                                               _interf.c_str(), values.data());
+}
+
+} // namespace interface
+} // namespace server
+} // namespace sdbusplus