Add property watches

Property watches cache DBus property values given an externally
supplied index of property names and paths, in an externally
supplied storage location.

Change-Id: I155081da88c3ab0e4f6a13b012fc9719203b1888
Signed-off-by: Brad Bishop <bradleyb@fuzziesquirrel.com>
diff --git a/src/templates/generated.mako.hpp b/src/templates/generated.mako.hpp
index 7c6e527..0911e3a 100644
--- a/src/templates/generated.mako.hpp
+++ b/src/templates/generated.mako.hpp
@@ -4,6 +4,9 @@
 
 #include <array>
 #include <string>
+#include "data_types.hpp"
+#include "propertywatchimpl.hpp"
+#include "sdbusplus.hpp"
 
 using namespace std::string_literals;
 
@@ -77,6 +80,69 @@
         return properties;
     }
 };
+
+struct ConfigPropertyStorage
+{
+    using Storage = std::array<any_ns::any, ${len(instances)}>;
+
+    static auto& get()
+    {
+        static Storage storage;
+        return storage;
+    }
+};
+
+struct ConfigPropertyIndicies
+{
+    using PropertyIndicies = std::array<PropertyIndex, ${len(instancegroups)}>;
+
+    static auto& get()
+    {
+        static const PropertyIndicies propertyIndicies =
+        {
+            {
+% for g in instancegroups:
+                {
+    % for i in g.members:
+                    {
+                        PropertyIndex::key_type
+                        {
+                            ConfigPaths::get()[${i[0]}],
+                            ConfigInterfaces::get()[${i[2]}],
+                            ConfigProperties::get()[${i[3]}]
+                        },
+                        PropertyIndex::mapped_type
+                        {
+                            ConfigMeta::get()[${i[1]}],
+                            ConfigMeta::get()[${i[4]}],
+                            ConfigPropertyStorage::get()[${i[5]}]
+                        },
+                    },
+    % endfor
+                },
+% endfor
+            }
+        };
+        return propertyIndicies;
+    }
+};
+
+struct ConfigPropertyWatches
+{
+    using PropertyWatches = std::array<std::unique_ptr<Watch>, ${len(watches)}>;
+
+    static auto& get()
+    {
+        static const PropertyWatches propertyWatches =
+        {
+% for w in watches:
+            std::make_unique<PropertyWatchOfType<${w.datatype}, SDBusPlus>>(
+                ConfigPropertyIndicies::get()[${w.instances}]),
+% endfor
+        };
+        return propertyWatches;
+    }
+};
 } // namespace monitoring
 } // namespace dbus
 } // namespace phosphor