summaryrefslogtreecommitdiff
path: root/cpp/include/Ice/ObserverHelper.h
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/include/Ice/ObserverHelper.h')
-rw-r--r--cpp/include/Ice/ObserverHelper.h104
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