Mesa (master): clover: Define an intrusive smart reference class.
Francisco Jerez
currojerez at kemper.freedesktop.org
Fri Feb 21 11:58:20 UTC 2014
Module: Mesa
Branch: master
Commit: 1b9fb2fd9129f834f041efe7f96e83998477c78b
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=1b9fb2fd9129f834f041efe7f96e83998477c78b
Author: Francisco Jerez <currojerez at riseup.net>
Date: Tue Feb 18 13:20:07 2014 +0100
clover: Define an intrusive smart reference class.
Tested-by: Tom Stellard <thomas.stellard at amd.com>
---
src/gallium/state_trackers/clover/util/pointer.hpp | 66 ++++++++++++++++++++
1 file changed, 66 insertions(+)
diff --git a/src/gallium/state_trackers/clover/util/pointer.hpp b/src/gallium/state_trackers/clover/util/pointer.hpp
index b7a633b5..98823aa 100644
--- a/src/gallium/state_trackers/clover/util/pointer.hpp
+++ b/src/gallium/state_trackers/clover/util/pointer.hpp
@@ -134,6 +134,72 @@ namespace clover {
}
///
+ /// 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.
///
More information about the mesa-commit
mailing list