mirror of
https://github.com/KolibriOS/kolibrios.git
synced 2024-12-18 21:02:34 +03:00
4f5f25a6c2
git-svn-id: svn://kolibrios.org@1882 a494cfbc-eb01-0410-851d-a64ba20cac60
114 lines
2.8 KiB
C++
Executable File
114 lines
2.8 KiB
C++
Executable File
#ifndef SIGCXX_HANDLE_H
|
|
#define SIGCXX_HANDLE_H
|
|
#include <sigc++config.h>
|
|
|
|
#ifdef SIGC_CXX_NAMESPACES
|
|
namespace SigC
|
|
{
|
|
#endif
|
|
|
|
// Signiture for Handles
|
|
template <class Obj,class Scope_>
|
|
class Handle
|
|
{
|
|
protected:
|
|
Scope_ scope_;
|
|
public:
|
|
// access
|
|
Obj* obj()
|
|
{
|
|
return static_cast<Obj*>(scope_.cache());
|
|
}
|
|
Obj* obj() const
|
|
{
|
|
return static_cast<Obj*>(scope_.cache());
|
|
}
|
|
|
|
bool connected() const
|
|
{return (scope_.object()!=0);}
|
|
operator Obj*()
|
|
{return (obj());}
|
|
operator Obj*() const
|
|
{return (obj());}
|
|
|
|
Obj& operator*() const
|
|
{return *(obj());}
|
|
Obj* operator->() const
|
|
{return (obj());}
|
|
|
|
Scope_& scope()
|
|
{return scope_;}
|
|
const Scope_& scope() const
|
|
{return scope_;}
|
|
|
|
void disconnect()
|
|
{scope_.disconnect(0);}
|
|
|
|
// copy
|
|
Handle& operator =(Obj* obj)
|
|
{scope_.set(obj,obj,true); return *this;}
|
|
Handle& operator =(Obj& obj)
|
|
{scope_.set(&obj,&obj,false); return *this;}
|
|
#ifndef SIGC_CXX_TEMPLATE_CCTOR
|
|
Handle& operator =(const Handle& handle)
|
|
{
|
|
Obj *o=handle.obj();
|
|
scope_.set(o,o,false);
|
|
return *this;
|
|
}
|
|
#endif
|
|
template <class Obj2,class Scope2>
|
|
Handle& operator = (const Handle<Obj2,Scope2>& handle)
|
|
{
|
|
Obj *o=handle.obj();
|
|
scope_.set(o,o,false);
|
|
return *this;
|
|
}
|
|
|
|
// construct
|
|
Handle():scope_() {}
|
|
Handle(Obj *obj):scope_() {scope_.set(obj,obj,true);}
|
|
Handle(Obj &obj):scope_() {scope_.set(&obj,&obj,false);}
|
|
#ifndef SIGC_CXX_TEMPLATE_CCTOR
|
|
Handle(const Handle& handle)
|
|
:scope_()
|
|
{
|
|
Obj *o=handle.obj();
|
|
scope_.set(o,o,false);
|
|
}
|
|
#endif
|
|
template <class Obj2,class Scope2>
|
|
Handle(const Handle<Obj2,Scope2>& handle)
|
|
:scope_()
|
|
{
|
|
Obj *o=handle.obj();
|
|
scope_.set(o,o,false);
|
|
}
|
|
};
|
|
|
|
#define HANDLE_CTORS(X,T,P) \
|
|
public: \
|
|
X(T *t):Handle<T,P>(t) {} \
|
|
X(T &t):Handle<T,P>(t) {} \
|
|
template <class T2,class P2> \
|
|
X(const Handle<T2,P2> &h):Handle<T,P>(h) {} \
|
|
X& operator =(T *t) \
|
|
{return Handle<T,P>::operator=(t);} \
|
|
X& operator =(T &t) \
|
|
{return Handle<T,P>::operator=(t);} \
|
|
template <class T2,class P2> \
|
|
X& operator =(const Handle<T2,P2> &t) \
|
|
{return Handle<T,P>::operator=(t);}
|
|
|
|
//template <class T>
|
|
// class Ref:public Handle<T,Scopes::RefCount>
|
|
// {
|
|
// HANDLE_CTORS(Ref,T,Scopes::RefCount)
|
|
// };
|
|
|
|
#ifdef SIGC_CXX_NAMESPACES
|
|
} // namespace
|
|
#endif
|
|
|
|
#endif
|