diff -r 4ea6f81c838a -r 0e9bb658ef58 widgetmodel/alfwidgetmodel/inc/autoarrayptr.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/widgetmodel/alfwidgetmodel/inc/autoarrayptr.h Wed Sep 01 12:23:18 2010 +0100 @@ -0,0 +1,226 @@ +/* +* Copyright (c) 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: AutoPtr class for array. +* +*/ + + +/** + * Holds reference to an auto_arrayptr. Prevents unsafe copying + * + * ?more_complete_description + * + * @lib ?library + * @since S60 ?S60_version *** for example, S60 v3.0 + */ + + template + struct auto_arrayptr_ref + { + Y* iPtr; + + explicit + auto_arrayptr_ref(Y* aPtr): iPtr(aPtr) { } + }; + +/** + * Auto pointer template implementation for C++ arrays + * + * ?more_complete_description + * + * @lib ?library + * @since S60 ?S60_version *** for example, S60 v3.0 + */ + template + class auto_arrayptr + { + private: + X* iPtr; + + public: + + typedef X element_type; + + /** + * Constructor. + * + * @since S60 ?S60_version + * @param ?arg1 ?description + * @param ?arg2 ?description + * @return ?description + */ + explicit + auto_arrayptr(X* p = 0) throw() : iPtr(p) { } + /** + * Copy argument a to this object. Owned pointer ownership is transferred to this. + * + * @since S60 ?S60_version + * @param ?arg1 ?description + * @param ?arg2 ?description + * @return ?description + */ + + auto_arrayptr(auto_arrayptr& a) throw() : iPtr(a.release()) { } + /** + * Copy argument a to this object. Owned pointer ownership is transferred to this. + * + * @since S60 ?S60_version + * @param ?arg1 ?description + * @param ?arg2 ?description + * @return ?description + */ + + template + auto_arrayptr(auto_arrayptr& a) throw() : iPtr(a.release()) { } + + /** + * Assign argument a to this object. If this already owned pointer that pointer is deleted. + * + * @since S60 ?S60_version + * @param ?arg1 ?description + * @param ?arg2 ?description + * @return ?description + */ + auto_arrayptr& operator=(auto_arrayptr& a) throw() + { + reset(a.release()); + return *this; + } + /** + * Assign argument a to this object. If this already owned pointer that pointer is deleted. + * + * @since S60 ?S60_version + * @param ?arg1 ?description + * @param ?arg2 ?description + * @return ?description + */ + + template + auto_arrayptr& operator=(auto_arrayptr& a) throw() + { + reset(a.release()); + return *this; + } + /** + * Deletes the underlying pointer. + * + * @since S60 ?S60_version + * @param ?arg1 ?description + * @param ?arg2 ?description + * @return ?description + */ + ~auto_arrayptr() { delete [] iPtr; } + + /** + * Return owned pointer + * + * @since S60 ?S60_version + * @param ?arg1 ?description + * @param ?arg2 ?description + * @return ?description + */ + + X* get() const throw() { return iPtr; } + /** + * Releases ownership of the managed pointer and returns that pointer. + * The *this object is left holding a null pointer. + * + * @since S60 ?S60_version + * @param ?arg1 ?description + * @param ?arg2 ?description + * @return ?description + */ + + X* release() throw() + { + X* tmp = iPtr; + iPtr = 0; + return tmp; + } + + /** + * Reset managed pointer. Deletes previously owned pointer. + * The *this object is holding given pointer. + * + * @since S60 ?S60_version + * @param ?arg1 ?description + * @param ?arg2 ?description + * @return ?description + */ + void reset(X* aPtr = 0) throw() + { + if (aPtr != iPtr) + { + delete [] iPtr; + iPtr = aPtr; + } + } + + + /** + * Constructor for value object.Uses type conversion function. + * + * @since S60 ?S60_version + * @param ?arg1 ?description + * @param ?arg2 ?description + * @return ?description + */ + auto_arrayptr(auto_arrayptr_ref aRef) throw() + : iPtr(aRef.iPtr) { } + + /** + * Assign argument a (value object) to this object. If this already owned pointer that pointer is deleted. + * Uses type conversion function. + * + * @since S60 ?S60_version + * @param ?arg1 ?description + * @param ?arg2 ?description + * @return ?description + */ + auto_arrayptr& operator=(auto_arrayptr_ref aRef) throw() + { + if (aRef.iPtr != this->get()) + { + delete [] iPtr; + iPtr = aRef.iPtr; + } + return *this; + } + + /** + * Type conversion. Constructs an auto_arrayptr_ref from *this and returns it. + * + * @since S60 ?S60_version + * @param ?arg1 ?description + * @param ?arg2 ?description + * @return ?description + */ + template + operator auto_arrayptr_ref() throw() + { return auto_arrayptr_ref(this->release()); } + + /** + * Type conversion. Constructs a new auto_arrayptr using the underlying pointer held by *this. + * Calls release() on *this, so *this no longer possesses the pointer. + * Returns the new auto_arrayptr. + * + * @since S60 ?S60_version + * @param ?arg1 ?description + * @param ?arg2 ?description + * @return ?description + */ + template + operator auto_arrayptr() throw() + { return auto_arrayptr(this->release()); } + }; \ No newline at end of file