summaryrefslogtreecommitdiffstats
path: root/manager.hpp
diff options
context:
space:
mode:
authorMarri Devender Rao <devenrao@in.ibm.com>2017-09-02 04:43:42 -0500
committerMarri Devender Rao <devenrao@in.ibm.com>2017-09-29 04:35:30 -0500
commitfa23d704bd8f0f940ac2dbe055db1763c977005d (patch)
tree8456b771ee9204c2c3287880697252d27d23554a /manager.hpp
parent86ad3c67615c6bad065dc3a2a55d703daf8163e0 (diff)
downloadphosphor-inventory-manager-fa23d704bd8f0f940ac2dbe055db1763c977005d.tar.gz
phosphor-inventory-manager-fa23d704bd8f0f940ac2dbe055db1763c977005d.zip
Add support for type-only interfaces
Modify Maker template for type-only interfaces that do not have properties. Resolves openbmc/openbmc#1786 Change-Id: I2c48b37cf273943a0c696f6b92db0bc901a1c9b4 Signed-off-by: Marri Devender Rao <devenrao@in.ibm.com>
Diffstat (limited to 'manager.hpp')
-rw-r--r--manager.hpp128
1 files changed, 97 insertions, 31 deletions
diff --git a/manager.hpp b/manager.hpp
index e6c60a3..624eb60 100644
--- a/manager.hpp
+++ b/manager.hpp
@@ -45,6 +45,92 @@ struct PropertiesVariant<T, typename std::enable_if<std::is_object<T>::value>::t
template <typename T>
using PropertiesVariantType = typename PropertiesVariant<T>::Type;
+template <typename T, typename U = int>
+struct HasProperties : std::false_type
+{
+};
+
+template <typename T>
+struct HasProperties <T,
+ decltype((void) std::declval<typename T::PropertiesVariant>(), 0)> :
+ std::true_type
+{
+};
+
+template <typename T, std::enable_if_t<HasProperties<T>::value, bool> = true>
+any_ns::any propMake(
+ sdbusplus::bus::bus& bus, const char* path, const Interface& props)
+{
+ using InterfaceVariant =
+ std::map<std::string, PropertiesVariantType<T>>;
+
+ InterfaceVariant v;
+ for (const auto& p : props)
+ {
+ v.emplace(
+ p.first,
+ convertVariant<PropertiesVariantType<T>>(p.second));
+ }
+
+ return any_ns::any(std::make_shared<T>(bus, path, v));
+}
+
+template <typename T, std::enable_if_t<!HasProperties<T>::value, bool> = false>
+any_ns::any propMake(
+ sdbusplus::bus::bus& bus, const char* path, const Interface& props)
+{
+ return any_ns::any(std::make_shared<T>(bus, path));
+}
+
+template <typename T, std::enable_if_t<HasProperties<T>::value, bool> = true>
+void propAssign(const Interface& props, any_ns::any& holder)
+{
+ auto& iface = *any_ns::any_cast<std::shared_ptr<T> &>(holder);
+ for (const auto& p : props)
+ {
+ iface.setPropertyByName(
+ p.first, convertVariant<PropertiesVariantType<T>>(p.second));
+ }
+}
+
+template <typename T, std::enable_if_t<!HasProperties<T>::value, bool> = false>
+void propAssign(const Interface& props, any_ns::any& holder)
+{
+}
+
+template <typename T, std::enable_if_t<HasProperties<T>::value, bool> = true>
+void propSerialize(
+ const std::string& path, const std::string& iface,
+ const any_ns::any& holder)
+{
+ const auto& object =
+ *any_ns::any_cast<const std::shared_ptr<T> &>(holder);
+ cereal::serialize(path, iface, object);
+}
+
+template <typename T, std::enable_if_t<!HasProperties<T>::value, bool> = false>
+void propSerialize(
+ const std::string& path, const std::string& iface,
+ const any_ns::any& holder)
+{
+ cereal::serialize(path, iface);
+}
+
+template <typename T, std::enable_if_t<HasProperties<T>::value, bool> = true>
+void propDeSerialize(
+ const std::string& path, const std::string& iface, any_ns::any& holder)
+{
+ auto& object = *any_ns::any_cast<std::shared_ptr<T> &>(holder);
+ cereal::deserialize(path, iface, object);
+}
+
+template <typename T, std::enable_if_t<!HasProperties<T>::value, bool> = false>
+void propDeSerialize(
+ const std::string& path, const std::string& iface, any_ns::any& holder)
+{
+}
+
+
/** @struct MakeInterface
* @brief Adapt an sdbusplus interface proxy.
*
@@ -58,49 +144,29 @@ template <typename T>
struct MakeInterface
{
static any_ns::any make(
- sdbusplus::bus::bus& bus,
- const char* path,
- const Interface& props)
+ sdbusplus::bus::bus& bus, const char* path, const Interface& props)
{
- using InterfaceVariant =
- std::map<std::string, PropertiesVariantType<T>>;
-
- InterfaceVariant v;
-
- for (const auto& p : props)
- {
- v.emplace(
- p.first,
- convertVariant<PropertiesVariantType<T>>(p.second));
- }
-
- return any_ns::any(std::make_shared<T>(bus, path, v));
+ return propMake<T>(bus, path, props);
}
static void assign(const Interface& props, any_ns::any& holder)
{
- auto& iface = *any_ns::any_cast<std::shared_ptr<T> &>(holder);
- for (const auto& p : props)
- {
- iface.setPropertyByName(
- p.first, convertVariant<PropertiesVariantType<T>>(p.second));
- }
+ propAssign<T>(props, holder);
}
- static void serialize(const std::string& path, const std::string& iface,
- const any_ns::any& holder)
+ static void serialize(
+ const std::string& path, const std::string& iface,
+ const any_ns::any& holder)
{
- const auto& object =
- *any_ns::any_cast<const std::shared_ptr<T> &>(holder);
- cereal::serialize(path, iface, object);
+ propSerialize<T>(path, iface, holder);
}
- static void deserialize(const std::string& path, const std::string& iface,
- any_ns::any& holder)
+ static void deserialize(
+ const std::string& path, const std::string& iface, any_ns::any& holder)
{
- auto& object = *any_ns::any_cast<std::shared_ptr<T> &>(holder);
- cereal::deserialize(path, iface, object);
+ propDeSerialize<T>(path, iface, holder);
}
+
};
/** @class Manager
OpenPOWER on IntegriCloud