Add SDEvent delegate

Add an sd-event interface abstraction to facilitate
mocking and unit test.

Signed-off-by: Brad Bishop <bradleyb@fuzziesquirrel.com>
Change-Id: I5880617565fc6eab54335adc30033d4b132568f8
diff --git a/src/sdevent.hpp b/src/sdevent.hpp
new file mode 100644
index 0000000..be8b510
--- /dev/null
+++ b/src/sdevent.hpp
@@ -0,0 +1,82 @@
+#pragma once
+
+#include "sdevent/event.hpp"
+#include "sdevent/timer.hpp"
+
+namespace phosphor
+{
+namespace dbus
+{
+namespace monitoring
+{
+
+/** @class SDEvent
+ *  @brief SDEventType access delegate implementation for sdevent.
+ */
+class SDEvent
+{
+    protected:
+        /** @brief Share a single event loop amongst users. */
+        static auto& getEvent()
+        {
+            static auto event = sdevent::event::newDefault();
+            return event;
+        }
+
+    public:
+        /** @brief Wrapper for sd_event_now. */
+        static auto now()
+        {
+            return getEvent().now();
+        }
+};
+
+/** @class SDEventTimer
+ *  @brief TimerType access delegate implementation for sdevent.
+ */
+class SDEventTimer : public SDEvent
+{
+    public:
+        SDEventTimer() = delete;
+        SDEventTimer(const SDEventTimer&) = default;
+        SDEventTimer(SDEventTimer&&) = default;
+        SDEventTimer& operator=(const SDEventTimer&) = default;
+        SDEventTimer& operator=(SDEventTimer&&) = default;
+        ~SDEventTimer() = default;
+
+        explicit SDEventTimer(
+            const sdevent::event::timer::Timer::Callback& callback)
+            : timer(getEvent(), callback) {}
+
+        /** @brief Update a timer expiration. */
+        void update(
+            const std::chrono::steady_clock::time_point& expires)
+        {
+            timer.setTime(expires);
+        }
+
+        /** @brief Query timer state. */
+        auto enabled()
+        {
+            return timer.enabled() != SD_EVENT_OFF;
+        }
+
+        /** @brief Enable a timer. */
+        void enable()
+        {
+            timer.enable(SD_EVENT_ONESHOT);
+        }
+
+        /** @brief Disable a timer. */
+        void disable()
+        {
+            timer.enable(SD_EVENT_OFF);
+        }
+
+    private:
+        sdevent::event::timer::Timer timer;
+};
+
+} // namespace monitoring
+} // namespace dbus
+} // namespace phosphor
diff --git a/src/templates/generated.mako.hpp b/src/templates/generated.mako.hpp
index 9e89983..914b065 100644
--- a/src/templates/generated.mako.hpp
+++ b/src/templates/generated.mako.hpp
@@ -10,6 +10,7 @@
 #include "method.hpp"
 #include "propertywatchimpl.hpp"
 #include "sdbusplus.hpp"
+#include "sdevent.hpp"
 
 using namespace std::string_literals;