diff -r 000000000000 -r b16258d2340f applayerprotocols/wapbase/wutil/ATTRLUT.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/applayerprotocols/wapbase/wutil/ATTRLUT.cpp Tue Feb 02 01:09:52 2010 +0200 @@ -0,0 +1,239 @@ +// Copyright (c) 2000-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: +// Attribute Look-Up-Table +// The Attribute Lookup Table maintains a global set of unique IDs to be defined for document +// node attributes and language tags. It does this by generating a unique ID for any descriptor +// passed to it. This descriptor is in fact a pointer to a copy of the string. Once a string +// has been seen once, any further references to it will map back to the same ID (pointer) +// value. +// +// + +// system includes +// - +#include +#include + +// our include +// +#include + +// Hash table size +// +#define KHashModulo 32 + + +//============================================================== +// CAttributeLookupTableNode +//============================================================== + +// Internal node class +// +//##ModelId=3B666737014E +class CAttributeLookupTableNode : public CBase +{ +public: + //##ModelId=3B6667370176 + CAttributeLookupTableNode() : CBase() + { + //iDes = 0; + } + //##ModelId=3B666737016C + ~CAttributeLookupTableNode() + { + delete iDes; + } + //##ModelId=3B6667370165 + HBufC* iDes; +}; + + +//============================================================== +// CAttributeLookupTable +//============================================================== + +CAttributeLookupTable::CAttributeLookupTable() : CBase() + { + } + +/** Destructor. +*/ +EXPORT_C CAttributeLookupTable::~CAttributeLookupTable() + { + Reset(); + delete iList; + } + +void CAttributeLookupTable::ConstructL() + { + iList = new (ELeave) CArrayPtrFlat >( KHashModulo ); + iList->ResizeL( KHashModulo ); + for ( TInt i = 0; i < KHashModulo; i++ ) + { + (*iList)[i] = NULL; + } + } + +/** Allocates and constructs a new attribute lookup table. + +@return New attribute lookup table +*/ +EXPORT_C CAttributeLookupTable* CAttributeLookupTable::NewL() + { + CAttributeLookupTable* iLUT = new (ELeave) CAttributeLookupTable(); + CleanupStack::PushL( iLUT ); + iLUT->ConstructL(); + CleanupStack::Pop(); + return iLUT; + } + + +// Lookup with allocating +// +/** Gets a unique ID for a specified descriptor. + +If this is the first time the descriptor has been used, a new ID will be allocated. + +@return ID +@param aAttributeName Descriptor to get ID for +*/ +EXPORT_C const HBufC* CAttributeLookupTable::Des2IDL( const TDesC& aAttributeName ) + { + // lookup the attribute + CAttributeLookupTableNode* node = FindDes( aAttributeName ); + if ( node ) + return node->iDes; + + // create a new node at the end of the appropriate array + CAttributeLookupTableNode* newnode = new (ELeave) CAttributeLookupTableNode(); + CleanupStack::PushL( newnode ); + newnode->iDes = aAttributeName.AllocL(); + + TInt hash = Hash( aAttributeName ); + CArrayPtrSeg* list = iList->At( hash ); + if ( !list ) + list = iList->At( hash ) = new (ELeave) CArrayPtrSeg( 2 ); + + list->AppendL(newnode); + + CleanupStack::Pop(); // newnode + + return newnode->iDes; + } + + +// Lookup without allocating +// +/** Tests if an ID has been allocated for a specified descriptor. + +@return ID, or NULL if none has been allocated +@param aKey Descriptor to test +*/ +EXPORT_C const HBufC* CAttributeLookupTable::KeyExists( const TDesC& aKey ) + { + CAttributeLookupTableNode* node = FindDes( aKey ); + if ( node ) + return node->iDes; + return NULL; // 0 is an invalid ID + } + + +// Find the given descriptor in the hash table +// +CAttributeLookupTableNode* CAttributeLookupTable::FindDes( const TDesC& aAttributeName ) + { + CArrayPtrSeg* list = iList->At( Hash( aAttributeName ) ); + if ( list ) + { + TInt length=aAttributeName.Length(); + TInt count = list->Count(); + for ( TInt i = 0; i < count; i++ ) + { + CAttributeLookupTableNode* node = list->At(i); + if ( node->iDes->Length()==length && node->iDes->Compare( aAttributeName ) == 0 ) // ** CASE SENSITIVE ** + return node; + } + } + return NULL; + } + + +// Generate a hash value +// +TUint CAttributeLookupTable::Hash( const TDesC& aDes ) + { + // *** CASE SENSITIVE ** + TInt len=aDes.Length(); + TUint hash = 0; + const TText* ptr=aDes.Ptr(); + for ( TInt i = 0; i < len; i++ ) + hash = 131*hash + *ptr++; + return hash % KHashModulo; + } + + +// Empty the table +// +/** Clears all allocated IDs. +*/ +EXPORT_C void CAttributeLookupTable::Reset() + { + if ( iList ) + { + for ( TInt i = 0; i < iList->Count(); i++ ) + { + CArrayPtrSeg* list = iList->At( i ); + if ( list ) + { + list->ResetAndDestroy(); + delete list; + iList->At( i ) = 0; + } + } + } + } + + +// Debug hook +// +#if defined (_DEBUG) +EXPORT_C void CAttributeLookupTable::Debug(TDebugSelectorType aSelector, TAny* aParam1, TAny* /*aParam2*/) + { + switch(aSelector) + { + case EPrint: + { + RTest* console = REINTERPRET_CAST(RTest*,aParam1); + for ( TInt i = 0; i < iList->Count(); i++ ) + { + if ( i == 0 || (i%15) == 0 ) + console->Printf( _L("\n%d: "), i ); + TInt count = 0; + CArrayPtrSeg* list = iList->At(i); + if ( list ) + count = list->Count(); + console->Printf( _L("%d\t"), count ); + } + console->Printf( _L("\n") ); + break; + } + default: + break; + } + } +#else +EXPORT_C void CAttributeLookupTable::Debug(TDebugSelectorType /*aSelector*/, TAny* /*aParam1*/, TAny* /*aParam2*/) + { + } +#endif