diff -r 000000000000 -r dfb7c4ff071f commsfwsupport/commselements/virtualconstructors/inc/vc.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/commsfwsupport/commselements/virtualconstructors/inc/vc.h Thu Dec 17 09:22:25 2009 +0200 @@ -0,0 +1,103 @@ +// Copyright (c) 2005-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: +// + +/** + @file + @internalTechnology +*/ + +#ifndef SYMBIAN_VC_H +#define SYMBIAN_VC_H + +#include +#include +#include // for TImplementationProxy + +//VIP == "virtual-ctor in place" + +#define DECLARE_MVIP_CTR(class_name) \ + static class_name* PlacementNew(TDes8& aBuff); + +#define DEFINE_MVIP_CTR(class_name) \ +class_name* class_name::PlacementNew(TDes8& aBuff) \ + { \ + return new(aBuff) class_name; \ + } + +#define MVIP_CTR_ENTRY(aInterfaceUid, aMessageClass) {{aInterfaceUid},(TProxyNewLPtr)(aMessageClass::PlacementNew)} + +namespace Meta +{ + struct STypeId; +} + +namespace VC +{ + +class CVirtualCtorBase : public CBase + { +public: + IMPORT_C CVirtualCtorBase(); + IMPORT_C ~CVirtualCtorBase(); + IMPORT_C void RegisterInterfaceL(TUid aInterfaceId, TInt aNumCtors, const TImplementationProxy* aCtorTable); + IMPORT_C void DeregisterInterface(TUid aInterfaceId); + IMPORT_C TBool IsInterfaceRegistered(TUid aInterfaceId) const; + +protected: + IMPORT_C TProxyNewLPtr FindRawCtor(const Meta::STypeId& aType) const; + +private: + class TCtorTable + { + public: + TCtorTable(TUid aInterfaceId, TInt aNumCtors, const TImplementationProxy* aCtorTable) + : iInterfaceId(aInterfaceId), + iNumCtors(aNumCtors), + iRegisteredCount(1), + iCtorTable(aCtorTable) + { + } + public: + TUid iInterfaceId; + TInt iNumCtors; + mutable TInt iRegisteredCount; + const TImplementationProxy* iCtorTable; + }; + typedef RArray TCtorTableList; + TCtorTableList iCtorTableList; +private: + const TCtorTable* FindCtorTable(TUid aInterfaceId, TInt& aIndex) const; + }; + +typedef TAny* (*TInPlaceNewPtr)(TDes8& aBuff); + +class CVirtualCtorInPlace : public CVirtualCtorBase + { +public: + //Constructs only from the type + IMPORT_C TAny* New(const Meta::STypeId& aType, TDes8& aBuff) const; + + inline const TInPlaceNewPtr FindCtor(const Meta::STypeId& aType) const + { + return reinterpret_cast(FindRawCtor(aType)); + } + }; + + +} //namespace VC + +#endif +//SYMBIAN_VC_H +