separate and hide away implementation part into common/interfaceproxy.cpp

This commit is contained in:
Fischlurch 2009-01-06 06:18:13 +01:00
parent afcea26399
commit 24fe4bcb70
2 changed files with 99 additions and 98 deletions

View file

@ -84,3 +84,102 @@ namespace gui {
} // namespace gui
#include "common/instancehandle.hpp"
namespace lumiera {
namespace facade {
template<class IHA>
class Holder;
template<class FA, class I>
class Holder<InstanceHandle<I,FA> >
: Accessor<FA>,
protected FA
{
protected:
typedef InstanceHandle<I,FA> IHandle;
typedef Holder<IHandle> THolder;
typedef Proxy<IHandle> Proxy;
typedef Accessor<FA> Access;
static Proxy& open(IHandle& iha)
{
static char buff[sizeof(Proxy)];
Proxy* p = new(buff) Proxy(iha);
Access::implProxy_ = p;
return *p;
}
static void close()
{
if (!Access::implProxy_) return;
Proxy* p = static_cast<Proxy*> (Access::implProxy_);
Access::implProxy_ = 0;
p->~Proxy();
}
I& _i_;
Holder (IHandle& iha)
: _i_(iha.get())
{ }
};
template<class FA>
FA* Accessor<FA>::implProxy_;
struct XYZ
{
virtual ~XYZ(){}
virtual int zoing(int i) =0;
};
struct II {};
typedef InstanceHandle<II,XYZ> IIXYZ;
template<>
class Proxy<IIXYZ>
: public Holder<IIXYZ>
{
//----Proxy-Implementation-of-XYZ--------
virtual int
zoing (int i)
{
return (rand() % i);
}
public:
Proxy (IHandle iha) : THolder(iha) {}
};
template<class IHA>
void
openProxy (IHA& iha)
{
Proxy<IHA>::open(iha);
}
template<class IHA>
void
closeProxy (IHA& iha)
{
Proxy<IHA>::close();
}
} // namespace facade
} // namespace lumiera

View file

@ -120,102 +120,4 @@ namespace lumiera {
} // namespace lumiera
#include "common/instancehandle.hpp"
namespace lumiera {
namespace facade {
template<class IHA>
class Holder;
template<class FA, class I>
class Holder<InstanceHandle<I,FA> >
: Accessor<FA>,
protected FA
{
protected:
typedef InstanceHandle<I,FA> IHandle;
typedef Holder<IHandle> THolder;
typedef Proxy<IHandle> Proxy;
typedef Accessor<FA> Access;
static Proxy& open(IHandle& iha)
{
static char buff[sizeof(Proxy)];
Proxy* p = new(buff) Proxy(iha);
Access::implProxy_ = p;
return *p;
}
static void close()
{
if (!Access::implProxy_) return;
Proxy* p = static_cast<Proxy*> (Access::implProxy_);
Access::implProxy_ = 0;
p->~Proxy();
}
I& _i_;
Holder (IHandle& iha)
: _i_(iha.get())
{ }
};
template<class FA>
FA* Accessor<FA>::implProxy_;
struct XYZ
{
virtual ~XYZ(){}
virtual int zoing(int i) =0;
};
struct II {};
typedef InstanceHandle<II,XYZ> IIXYZ;
template<>
class Proxy<IIXYZ>
: public Holder<IIXYZ>
{
//----Proxy-Implementation-of-XYZ--------
virtual int
zoing (int i)
{
return (rand() % i);
}
public:
Proxy (IHandle iha) : THolder(iha) {}
};
template<class IHA>
void
openProxy (IHA& iha)
{
Proxy<IHA>::open(iha);
}
template<class IHA>
void
closeProxy (IHA& iha)
{
Proxy<IHA>::close();
}
} // namespace facade
} // namespace lumiera
#endif