diff options
Diffstat (limited to 'cpp/include/Ice/ObserverHelper.h')
-rw-r--r-- | cpp/include/Ice/ObserverHelper.h | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/cpp/include/Ice/ObserverHelper.h b/cpp/include/Ice/ObserverHelper.h new file mode 100644 index 00000000000..3803b9e5b6a --- /dev/null +++ b/cpp/include/Ice/ObserverHelper.h @@ -0,0 +1,104 @@ +// ********************************************************************** +// +// Copyright (c) 2003-2012 ZeroC, Inc. All rights reserved. +// +// This copy of Ice is licensed to you under the terms described in the +// ICE_LICENSE file included in this distribution. +// +// ********************************************************************** + +#ifndef ICE_OBSERVERHELPER_H +#define ICE_OBSERVERHELPER_H + +#include <Ice/ObserverF.h> + +namespace IceInternal +{ + +class ObserverHelper : public IceUtil::noncopyable +{ +protected: + + void attach(const Ice::Instrumentation::ObserverPtr&); + void detach(const Ice::Instrumentation::ObserverPtr&); + void failed(const Ice::Instrumentation::ObserverPtr&, const std::string&); +}; + +template<typename T = Ice::Instrumentation::Observer> class ObserverHelperT : public ObserverHelper +{ +public: + + typedef IceInternal::Handle<T> TPtr; + + ObserverHelperT() + { + } + + ~ObserverHelperT() + { + if(_observer) + { + ObserverHelper::detach(_observer); + } + } + + operator bool() const + { + return _observer; + } + + T* operator->() const + { + return _observer.get(); + } + + void + attach(const TPtr& o) + { + if(_observer) + { + ObserverHelper::detach(_observer); + } + _observer = o; + if(_observer) + { + ObserverHelper::attach(_observer); + } + } + + T* get() const + { + return _observer.get(); + } + + void adopt(ObserverHelperT& other) + { + _observer = other._observer; + other._observer = 0; + } + + void detach() + { + if(_observer) + { + ObserverHelper::detach(_observer); + _observer = 0; + } + } + + void failed(const std::string& reason) + { + if(_observer) + { + ObserverHelper::failed(_observer, reason); + } + } + +protected: + + TPtr _observer; +}; + +} + +#endif |