diff -r f5050f1da672 -r 04becd199f91 javauis/m2g_akn/inc/JcfAutoPtr.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/javauis/m2g_akn/inc/JcfAutoPtr.h Tue Apr 27 16:30:29 2010 +0300 @@ -0,0 +1,147 @@ +/* +* 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: +* +*/ + +#ifndef JCFAUTOPTR_H +#define JCFAUTOPTR_H + +#include + +/** + * Functionality of this auto ptr class is same as stl's auto_ptr class + * except this works with cleanup stack. + * Implementation of the example operation with "traditional" way: + * void bar() + * { + * CFoo* myFoo = CFoo::NewL(); + * CleanupStack::PushL(myFoo); + * myFoo->DoSomeThingL(); + * CleanupStack::PopAndDestroy(1); //myFoo + * } + * Implementation of the same function with auto pointer class: + * void bar() + * { + * jcfcommon::auto_ptr myFoo(CFoo::NewL()); + * myFoo->DoSomeThingL(); + * } + * + */ +namespace jcfcommon +{ + +template class auto_ptr +{ +public: + typedef X element_type; + + auto_ptr(X* aPtr = 0): iPtr(aPtr),iCloseCalledFlag(EFalse) + { + CleanupStack::PushL(TCleanupItem(Close, (void*)this)); + } + + /** + * Copy constructor was commented out because current + * implementation doesn't support situation where auto_ptr + * is returned as return value of the function. Problem is that + * orig. auto_ptr is deleted when getBar() operation has been + * executed and this deleted local reference has been stored to the + * cleanup stack. + * E.g: + * void foo() + * { + * auto_ptr barObj = getBar(); + * . + * . + * . + * User::Leave(KErrNotFound); + * } + */ + /*auto_ptr(auto_ptr& aPtr): iPtr(aPtr.release()) + { + CleanupStack::PushL(TCleanupItem(Close, (void*)this)); + }*/ + + auto_ptr& operator=(auto_ptr& aRhs) + { + if (&aRhs != this) + { + delete iPtr; + iPtr = aRhs.release(); + } + return (*this); + } + + ~auto_ptr() + { + if (!iCloseCalledFlag) + { + CleanupStack::Pop(); + delete iPtr; + } + } + + X& operator *() const + { + return *iPtr; + } + X* operator ->() const + { + return iPtr; + } + + X* get() const + { + return iPtr; + } + + X* release() + { + X* result = iPtr; + iPtr = 0; + return result; + } + + void reset(X* aPtr = 0) + { + if (aPtr != iPtr) + { + delete iPtr; + iPtr = aPtr; + } + } + +private: + static void Close(void* aPtr) + { + auto_ptr* self = (auto_ptr*)aPtr; + delete self->iPtr; + self->iPtr = 0; + self->iCloseCalledFlag = ETrue; + } + + //Not implemented. + auto_ptr(auto_ptr& aPtr); + +private: + X* iPtr; + TBool iCloseCalledFlag; +}; + +}//end jcfcommon + +#endif // JCFAUTOPTR_H + +