Multiple inheritance considered harmful
This commit is contained in:
parent
d07ff84f5c
commit
a83ffd4821
|
@ -13,7 +13,7 @@ using namespace Kernel;
|
||||||
|
|
||||||
Object::~Object()
|
Object::~Object()
|
||||||
{
|
{
|
||||||
for (Object_identity * oi = first(); oi; oi = first())
|
for (Object_identity * oi = list.first(); oi; oi = list.first())
|
||||||
oi->invalidate();
|
oi->invalidate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -24,18 +24,18 @@ Object::~Object()
|
||||||
|
|
||||||
void Object_identity::invalidate()
|
void Object_identity::invalidate()
|
||||||
{
|
{
|
||||||
for (Object_identity_reference * oir = first(); oir; oir = first())
|
for (Object_identity_reference * oir = list.first(); oir; oir = list.first())
|
||||||
oir->invalidate();
|
oir->invalidate();
|
||||||
|
|
||||||
if (_object) {
|
if (_object) {
|
||||||
_object->remove(this);
|
_object->list.remove(this);
|
||||||
_object = nullptr;
|
_object = nullptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Object_identity::Object_identity(Object & object)
|
Object_identity::Object_identity(Object & object)
|
||||||
: _object(&object) { _object->insert(this); }
|
: _object(&object) { _object->list.insert(this); }
|
||||||
|
|
||||||
|
|
||||||
Object_identity::~Object_identity() { invalidate(); }
|
Object_identity::~Object_identity() { invalidate(); }
|
||||||
|
@ -50,7 +50,7 @@ Object_identity_reference::find(Pd &pd)
|
||||||
{
|
{
|
||||||
if (!_identity) return nullptr;
|
if (!_identity) return nullptr;
|
||||||
|
|
||||||
for (Object_identity_reference * oir = _identity->first();
|
for (Object_identity_reference * oir = _identity->list.first();
|
||||||
oir; oir = oir->next())
|
oir; oir = oir->next())
|
||||||
if (&pd == &(oir->_pd)) return oir;
|
if (&pd == &(oir->_pd)) return oir;
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
@ -79,7 +79,7 @@ Object_identity_reference * Object_identity_reference::factory(void * dst,
|
||||||
|
|
||||||
|
|
||||||
void Object_identity_reference::invalidate() {
|
void Object_identity_reference::invalidate() {
|
||||||
if (_identity) _identity->remove(this);
|
if (_identity) _identity->list.remove(this);
|
||||||
_identity = nullptr;
|
_identity = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -88,7 +88,7 @@ Object_identity_reference::Object_identity_reference(Object_identity *oi,
|
||||||
Pd &pd)
|
Pd &pd)
|
||||||
: _capid(pd.capid_alloc().alloc()), _identity(oi), _pd(pd), _in_utcbs(0)
|
: _capid(pd.capid_alloc().alloc()), _identity(oi), _pd(pd), _in_utcbs(0)
|
||||||
{
|
{
|
||||||
if (_identity) _identity->insert(this);
|
if (_identity) _identity->list.insert(this);
|
||||||
_pd.cap_tree().insert(this);
|
_pd.cap_tree().insert(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -71,18 +71,16 @@ namespace Kernel
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
struct Kernel::Object : private Object_identity_list
|
class Kernel::Object
|
||||||
{
|
{
|
||||||
using Object_identity_list::remove;
|
Object_identity_list list { };
|
||||||
using Object_identity_list::insert;
|
|
||||||
|
|
||||||
virtual ~Object();
|
virtual ~Object();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class Kernel::Object_identity
|
class Kernel::Object_identity
|
||||||
: public Object_identity_list::Element,
|
: public Object_identity_list::Element
|
||||||
public Kernel::Object_identity_reference_list
|
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
@ -96,6 +94,8 @@ class Kernel::Object_identity
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
Kernel::Object_identity_reference_list list { };
|
||||||
|
|
||||||
Object_identity(Object & object);
|
Object_identity(Object & object);
|
||||||
~Object_identity();
|
~Object_identity();
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue