1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
|
// public
struct IDriverA {
virtual void f() = 0;
};
// caché ; penser aux dépendances cycliques -> FAQ
struct DriverAimpl : IDriverA {
..... implémentation des fonctions du driver A et ....
auto_lock a_le_droit(const proxyDriverA * p) const {
auto_lock al(mutex_);
if (p.getId() == last_id_)
return al;
else return auto_lock(0);
}
DriverAimpl() : last_id_(-1) {}
ProxyDriverA requestDriver() {
scoped_lock sl(mutex_);
return ProxyDriver(this, ++last_id_);
}
private:
type_mutex mutex_;
int last_id_;
};
// public
struct ProxyDriverA : IDriverA {
/*virtual*/ voif f() {
scoped_lock l(DAimpl-> a_le_droit(this));
if (l) {
implDA_ -> f();
}
}
ProxyDriverA( DriverAimpl * impl, int id ) : DAimpl_(impl), id_(id)
{}
int getId() const { return id_;} // seulement pour DriverAimpl
private:
DriverAimpl * implDA_; // def à inclure seulement dans le .cpp
// une decl en avant suffit sinon
int id_;
};
// Le singleton exposé
struct DA_manager : boost::noncopyable
{
static DA_manager & instance();
ProxyDriverA requestDriver() {
return DA_.requestDriver();
}
private:
DA_manager() {};
DriverAimpl DA_;
} |
Partager