inc/glxpointer.h
branchRCL_3
changeset 59 8e5f6eea9c9f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/inc/glxpointer.h	Tue Aug 31 15:14:51 2010 +0300
@@ -0,0 +1,149 @@
+/*
+* Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:   Smart pointer
+*
+*/
+
+
+
+#ifndef T_GLXPOINTER_H
+#define T_GLXPOINTER_H
+
+#include "glxpanic.h"
+
+/**
+ *  TGlxPointer
+ *
+ *  Smart pointer class. Template that can house any object
+ *
+ *  @lib None
+ */
+template <class T>
+class TGlxPointer {
+private:
+	T*			pointer;
+ 	const void*	iOwns;		// Defined as void* instead of TBool so that can use <pointer> directly as boolean value
+
+public:
+	/** 
+	 * Default constructor
+	 */
+	TGlxPointer() {
+		pointer = NULL;
+		iOwns = 0;
+	}
+
+	/** 
+	 * Constructor T*
+	 */
+	explicit TGlxPointer(T* pointer) {
+		this->pointer = pointer;
+		iOwns = pointer;
+	}
+
+	/** 
+	 * Constructor
+	 */
+	TGlxPointer(const TGlxPointer<T>& ptrObj) { // Should not be const, but without this, ARM compiler refuses
+		iOwns = ptrObj.iOwns;
+		pointer = const_cast<TGlxPointer<T>&>(ptrObj).Release(); 
+	}
+
+	/** 
+	 * Destructor
+	 */
+	~TGlxPointer() {
+		if (iOwns) {
+			__ASSERT_DEBUG(pointer != NULL, Panic(EGlxPanicIllegalState));
+			delete pointer; 
+		}
+	}
+
+	/** 
+	 * Operator =
+	 */
+	TGlxPointer<T>& operator=(TGlxPointer<T>& ptrObj) {
+		if (this != &ptrObj) {
+			if (iOwns && pointer != ptrObj.pointer) {
+				delete this->pointer;
+			}
+			iOwns = ptrObj.iOwns; 
+			pointer = ptrObj.Release(); 
+		}
+		return *this; 
+	}
+
+	/** 
+	 * Operator =
+	 */
+	TGlxPointer<T>& operator=(T* pointer) {
+		if (iOwns && pointer != this->pointer) {
+			delete this->pointer;
+		}
+		iOwns = pointer;
+		this->pointer = pointer;
+		return *this; 
+	}
+ 
+	/** 
+	 * operator*
+	 */
+	inline T& operator*() const {
+		__ASSERT_DEBUG(pointer != NULL, Panic(EGlxPanicNullPointer));
+		return *pointer; 
+	}
+
+	/** 
+	 * operator ->
+	 */
+	inline T* operator->() const {
+		__ASSERT_DEBUG(pointer != NULL, Panic(EGlxPanicNullPointer));
+		return pointer; 
+	}
+
+	/** 
+	 * Ptr
+	 */
+	inline T* Ptr() const {
+		return pointer; 
+	}
+
+	/** 
+	 * Release
+	 * Return the pointer and release ownership
+	 */
+	T* Release() {
+		iOwns = 0;
+		return pointer; 
+	}
+
+	/** 
+	 * Owns
+	 * Returns ETrue if the object owns the pointer
+	 */
+	inline TBool Owns() const {
+		return (TBool)iOwns;
+	}
+
+	/** 
+	 * PtrRef
+	 * Return a reference to the pointer 
+	 */
+	inline T*& PtrRef() {
+		__ASSERT_DEBUG(pointer != NULL, Panic(EGlxPanicNullPointer));
+		return pointer; 
+	}
+};
+
+#endif // T_GLXPOINTER_H