Use std::any
Replace holder types with std::any.
Change-Id: I0cd8c2804ad4bff79a0cfe93589e699afb095e5f
Signed-off-by: Brad Bishop <bradleyb@fuzziesquirrel.com>
diff --git a/manager.hpp b/manager.hpp
index 9d83ee8..7127ec5 100644
--- a/manager.hpp
+++ b/manager.hpp
@@ -36,18 +36,13 @@
template <typename T>
struct MakeInterface
{
- static std::unique_ptr<details::holder::Base> make(
+ static any_ns::any make(
sdbusplus::bus::bus& bus,
const char* path,
const Interface& props)
{
// TODO: pass props to import constructor...
- using HolderType = holder::Holder<std::unique_ptr<T>>;
- return HolderType::template make_unique<HolderType>(
- std::forward<std::unique_ptr<T>>(
- std::make_unique<T>(
- std::forward<decltype(bus)>(bus),
- std::forward<decltype(path)>(path))));
+ return any_ns::any(std::make_shared<T>(bus, path));
}
};
} // namespace details
@@ -128,8 +123,7 @@
decltype(auto) invokeMethod(const char* path, const char* interface,
U&& member, Args&& ...args)
{
- auto& holder = getInterface<std::unique_ptr<T>>(path, interface);
- auto& iface = *holder.get();
+ auto& iface = getInterface<T>(path, interface);
return (iface.*member)(std::forward<Args>(args)...);
}
@@ -142,8 +136,7 @@
using SigArg = SigArgs::value_type::element_type;
private:
- using HolderPtr = std::unique_ptr<details::holder::Base>;
- using InterfaceComposite = std::map<std::string, HolderPtr>;
+ using InterfaceComposite = std::map<std::string, any_ns::any>;
using ObjectReferences = std::map<std::string, InterfaceComposite>;
using Events = std::vector<EventInfo>;
@@ -165,9 +158,9 @@
*
* @returns A weak reference to the holder instance.
*/
- details::holder::Base& getInterfaceHolder(
+ const any_ns::any& getInterfaceHolder(
const char*, const char*) const;
- details::holder::Base& getInterfaceHolder(
+ any_ns::any& getInterfaceHolder(
const char*, const char*);
/** @brief Provides weak references to interface holders.
@@ -184,15 +177,13 @@
auto& getInterface(const char* path, const char* interface)
{
auto& holder = getInterfaceHolder(path, interface);
- return static_cast <
- details::holder::Holder<T>& >(holder);
+ return *any_ns::any_cast<std::shared_ptr<T> &>(holder);
}
template<typename T>
auto& getInterface(const char* path, const char* interface) const
{
auto& holder = getInterfaceHolder(path, interface);
- return static_cast <
- const details::holder::Holder<T>& >(holder);
+ return *any_ns::any_cast<T>(holder);
}
/** @brief Provided for testing only. */