mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-24 11:00:11 +01:00
clover: Define an intrusive smart reference class.
Tested-by: Tom Stellard <thomas.stellard@amd.com>
This commit is contained in:
parent
9ae0bd3829
commit
1b9fb2fd91
1 changed files with 66 additions and 0 deletions
|
|
@ -133,6 +133,72 @@ namespace clover {
|
|||
return ref;
|
||||
}
|
||||
|
||||
///
|
||||
/// Intrusive smart reference for objects that implement the
|
||||
/// clover::ref_counter interface.
|
||||
///
|
||||
template<typename T>
|
||||
class intrusive_ref {
|
||||
public:
|
||||
intrusive_ref(T &o) : p(&o) {
|
||||
p->retain();
|
||||
}
|
||||
|
||||
intrusive_ref(const intrusive_ref &ref) :
|
||||
intrusive_ref(*ref.p) {
|
||||
}
|
||||
|
||||
intrusive_ref(intrusive_ref &&ref) :
|
||||
p(ref.p) {
|
||||
ref.p = NULL;
|
||||
}
|
||||
|
||||
~intrusive_ref() {
|
||||
if (p && p->release())
|
||||
delete p;
|
||||
}
|
||||
|
||||
intrusive_ref &
|
||||
operator=(intrusive_ref ref) {
|
||||
std::swap(ref.p, p);
|
||||
return *this;
|
||||
}
|
||||
|
||||
bool
|
||||
operator==(const intrusive_ref &ref) const {
|
||||
return p == ref.p;
|
||||
}
|
||||
|
||||
bool
|
||||
operator!=(const intrusive_ref &ref) const {
|
||||
return p != ref.p;
|
||||
}
|
||||
|
||||
T &
|
||||
operator()() const {
|
||||
return *p;
|
||||
}
|
||||
|
||||
operator T &() const {
|
||||
return *p;
|
||||
}
|
||||
|
||||
private:
|
||||
T *p;
|
||||
};
|
||||
|
||||
///
|
||||
/// Transfer the caller's ownership of a reference-counted object
|
||||
/// to a clover::intrusive_ref smart reference.
|
||||
///
|
||||
template<typename T>
|
||||
inline intrusive_ref<T>
|
||||
transfer(T &o) {
|
||||
intrusive_ref<T> ref { o };
|
||||
o.release();
|
||||
return ref;
|
||||
}
|
||||
|
||||
///
|
||||
/// Class that implements the usual pointer interface but in fact
|
||||
/// contains the object it seems to be pointing to.
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue