added support for onChange report

Report is now notified when metric changes and updates reading values.

Tested:
  - Added new unit tests
  - OnChange report updates Readings when metric values changes

Change-Id: I3be9ef7aa0486cb15bac627aa1de5cc632613b3b
Signed-off-by: Krzysztof Grobelny <krzysztof.grobelny@intel.com>
diff --git a/src/metric.hpp b/src/metric.hpp
index 859315e..b627b4e 100644
--- a/src/metric.hpp
+++ b/src/metric.hpp
@@ -2,8 +2,11 @@
 
 #include "interfaces/clock.hpp"
 #include "interfaces/metric.hpp"
+#include "interfaces/metric_listener.hpp"
 #include "interfaces/sensor.hpp"
 #include "interfaces/sensor_listener.hpp"
+#include "metrics/collection_data.hpp"
+#include "types/collection_duration.hpp"
 
 class Metric :
     public interfaces::Metric,
@@ -14,28 +17,22 @@
     Metric(Sensors sensors, OperationType operationType, std::string id,
            CollectionTimeScope, CollectionDuration,
            std::unique_ptr<interfaces::Clock>);
-    ~Metric();
 
     void initialize() override;
     void deinitialize() override;
     std::vector<MetricValue> getReadings() const override;
-    void sensorUpdated(interfaces::Sensor&, Milliseconds) override;
     void sensorUpdated(interfaces::Sensor&, Milliseconds,
                        double value) override;
     LabeledMetricParameters dumpConfiguration() const override;
     uint64_t sensorCount() const override;
+    void registerForUpdates(interfaces::MetricListener& listener) override;
+    void unregisterFromUpdates(interfaces::MetricListener& listener) override;
+    void updateReadings(Milliseconds) override;
+    bool isTimerRequired() const override;
 
   private:
-    class CollectionData;
-    class DataPoint;
-    class DataInterval;
-    class DataStartup;
-
-    static std::vector<std::unique_ptr<CollectionData>>
-        makeCollectionData(size_t size, OperationType, CollectionTimeScope,
-                           CollectionDuration);
-
-    CollectionData& findAssociatedData(const interfaces::Sensor& notifier);
+    metrics::CollectionData&
+        findAssociatedData(const interfaces::Sensor& notifier);
 
     std::string id;
     std::vector<MetricValue> readings;
@@ -43,6 +40,7 @@
     OperationType operationType;
     CollectionTimeScope collectionTimeScope;
     CollectionDuration collectionDuration;
-    std::vector<std::unique_ptr<CollectionData>> collectionAlgorithms;
+    std::vector<std::unique_ptr<metrics::CollectionData>> collectionAlgorithms;
     std::unique_ptr<interfaces::Clock> clock;
+    std::vector<std::reference_wrapper<interfaces::MetricListener>> listeners;
 };