diff --git a/src/client/pv/pvAccess.h b/src/client/pv/pvAccess.h index 7c3a535..7b93216 100644 --- a/src/client/pv/pvAccess.h +++ b/src/client/pv/pvAccess.h @@ -385,6 +385,10 @@ public: virtual std::tr1::shared_ptr getChannelProvider() = 0; virtual void cancel() = 0; + + //! Allocate a no-op ChannelFind. This is sufficient for most, if not all, ChannelProvider implementations. + //! Holds only a weak_ptr + static ChannelFind::shared_pointer buildDummy(const std::tr1::shared_ptr& provider); }; /** diff --git a/src/client/pvAccess.cpp b/src/client/pvAccess.cpp index e78f740..9089683 100644 --- a/src/client/pvAccess.cpp +++ b/src/client/pvAccess.cpp @@ -430,7 +430,6 @@ ChannelRequester::shared_pointer DefaultChannelRequester::build() return ret; } - MonitorElement::MonitorElement(epics::pvData::PVStructurePtr const & pvStructurePtr) : pvStructurePtr(pvStructurePtr) ,changedBitSet(epics::pvData::BitSet::create(static_cast(pvStructurePtr->getNumberFields()))) @@ -438,3 +437,26 @@ MonitorElement::MonitorElement(epics::pvData::PVStructurePtr const & pvStructure {} }} // namespace epics::pvAccess + +namespace { + +struct DummyChannelFind : public epics::pvAccess::ChannelFind { + epics::pvAccess::ChannelProvider::weak_pointer provider; + DummyChannelFind(const epics::pvAccess::ChannelProvider::shared_pointer& provider) : provider(provider) {} + virtual ~DummyChannelFind() {} + virtual void destroy() OVERRIDE FINAL {} + virtual epics::pvAccess::ChannelProvider::shared_pointer getChannelProvider() OVERRIDE FINAL { return provider.lock(); } + virtual void cancel() OVERRIDE FINAL {} +}; + +} + +namespace epics {namespace pvAccess { + +ChannelFind::shared_pointer ChannelFind::buildDummy(const ChannelProvider::shared_pointer& provider) +{ + std::tr1::shared_ptr ret(new DummyChannelFind(provider)); + return ret; +} + +}} // namespace epics::pvAccess