diff -r f345bda72bc4 -r 43e37759235e Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/hashtableexample_8cpp-source.html --- a/Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/hashtableexample_8cpp-source.html Tue Mar 30 11:56:28 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,625 +0,0 @@ - -
-00001 // Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). -00002 // All rights reserved. -00003 // This component and the accompanying materials are made available -00004 // under the terms of "Eclipse Public License v1.0" -00005 // which accompanies this distribution, and is available -00006 // at the URL "http://www.eclipse.org/legal/epl-v10.html". -00007 // -00008 // Initial Contributors: -00009 // Nokia Corporation - initial contribution. -00010 // -00011 // Contributors: -00012 // -00013 // Description: -00014 // This example program demonstrates the use of hash table classes. -00015 // -00016 -00017 -00018 -00022 #include "hashtableexample.h" -00023 #include <e32hashtab.h> -00024 #include <e32math.h> -00025 -00029 CHashTableExample::CHashTableExample() -00030 { -00031 } -00032 -00033 void CHashTableExample::ConstructL() -00034 { -00035 iConsole = Console::NewL(KTitle, TSize(KConsFullScreen, KConsFullScreen)); -00036 iConsole->Printf(KWelcome); -00037 iConsole->Printf(KPressAKeyMsg ); -00038 iConsole->Getch(); -00039 } -00040 -00044 CHashTableExample::~CHashTableExample() -00045 { -00046 delete iConsole; -00047 iPointerArray.ResetAndDestroy(); -00048 } -00049 -00055 CHashTableExample* CHashTableExample::NewL() -00056 { -00057 CHashTableExample* self=new(ELeave)CHashTableExample(); -00058 CleanupStack::PushL(self); -00059 self->ConstructL(); -00060 CleanupStack::Pop(self); -00061 return self; -00062 } -00063 -00068 void CHashTableExample::ConstructDefaultHashSet() -00069 { -00070 // Construct hash set using default hash and identity functions for integer -00071 RHashSet<TInt> hashSetInt(); -00072 -00073 // Construct hash set using default hash and identity functions for 8bit descriptor -00074 RHashSet<TDesC8> hashSetDes8(); -00075 -00076 // Construct hash set using default hash and identity functions for 16bit descriptor -00077 RHashSet<TDesC16> hashSetDes16(); -00078 -00079 iConsole->Printf(KHashSet); -00080 iConsole->Printf(KConstruct); -00081 iConsole->Printf(KConstructDefaultHashSet); -00082 } -00083 -00087 struct TMyOwnObject -00088 { -00089 TInt iVar1; -00090 TInt iVar2; -00091 }; -00092 -00099 TUint32 MyHashFunction(const TMyOwnObject& aObject) -00100 { -00101 return DefaultHash::Integer(aObject.iVar1) + DefaultHash::Integer(aObject.iVar2 ); -00102 } -00103 -00111 TBool MyIdentityFunction(const TMyOwnObject& aObject1, const TMyOwnObject& aObject2) -00112 { -00113 return aObject1.iVar1 == aObject2.iVar1 && aObject1.iVar2 != aObject2.iVar2; -00114 } -00115 -00120 void CHashTableExample::ConstructOwnHashSet() -00121 { -00122 // Creates an object of custom hash function by using our created structure -00123 THashFunction32<TMyOwnObject> ownHashFunction(MyHashFunction); -00124 -00125 // Creates an object of identity function by using our created structure -00126 TIdentityRelation<TMyOwnObject> ownIdentityFunction(MyIdentityFunction); -00127 -00128 // Construct hash set by providing custom hash and identity function -00129 RHashSet<TMyOwnObject> ownHashSet(ownHashFunction, ownIdentityFunction); -00130 iConsole->Printf(KConstructOwnHashSet); -00131 } -00132 -00143 void CHashTableExample::OperationsToHashSetL() -00144 { -00145 // Declare a const integer value for the initial item to be stored -00146 const TInt startItem=1; -00147 -00148 // Declare a const integer value for the last item to be stored -00149 const TInt endItem=100; -00150 TInt itemToBeFound=120; -00151 TInt itemToBeRemoved=200; -00152 TInt64 items=1; -00153 -00154 iConsole->Printf(KOperation); -00155 -00156 // Creates an object of hash set using the template class RHashSet -00157 RHashSet<TInt> hashSet; -00158 -00159 // Push hash set on to the cleanup stack -00160 CleanupClosePushL(hashSet); -00161 -00162 // Insert random items to hash set -00163 for (TInt i=startItem; i<=endItem; ++i) -00164 { -00165 TInt res = Math::Rand(items); -00166 hashSet.InsertL(res); -00167 } -00168 -00169 iConsole->Printf(KInsertItemsToHashSet); -00170 -00171 // Search the set for a specified item -00172 TInt* result= hashSet.Find(itemToBeFound); -00173 -00174 // result is NULL if specified item is not found in the set -00175 if(result) -00176 { -00177 iConsole->Printf(KItemPresentInHashSet); -00178 } -00179 else -00180 { -00181 iConsole->Printf(KItemNotPresentInHashSet); -00182 } -00183 -00184 // Creates an object of TIter to iterate over the elements of hash set -00185 RHashSet<TInt>::TIter hashSetIter(hashSet); -00186 -00187 // Iterate over the items in the set -00188 // Creates an iterator object of type TIter -00189 for ( ; ;) -00190 { -00191 const TInt* res = hashSetIter.Next(); -00192 -00193 // Next() moves the iterator to the next item and returns it -00194 // Returns NULL if there are no more items -00195 if (!res) -00196 { -00197 break; -00198 } -00199 } -00200 -00201 iConsole->Printf(KIterateItemsFromHashSet); -00202 -00203 // Remove an item from hash set -00204 TInt res = hashSet.Remove(itemToBeRemoved); -00205 // Check if the item was successfully removed -00206 if(res) -00207 { -00208 iConsole->Printf(KItemPresentInHashSet); -00209 } -00210 else -00211 { -00212 iConsole->Printf(KItemNotPresentInHashSet); -00213 } -00214 -00215 iConsole->Printf(KRemoveItemsFromHashSet); -00216 -00217 // Close and cleanup hash set -00218 CleanupStack::PopAndDestroy(&hashSet); -00219 -00220 iConsole->Printf(KPressAKey); -00221 iConsole->Getch(); -00222 } -00223 -00228 void CHashTableExample::ConstructDefaultPtrHashSet() -00229 { -00230 // Construct hash set of pointers using default hash and identity functions for integer -00231 RPtrHashSet<TInt> ptrHashSetInt(); -00232 -00233 // Construct hash set of pointers using default hash and identity functions for 8bit descriptor -00234 RPtrHashSet<TDesC8> ptrHashSetDes8(); -00235 -00236 // Construct hash set of pointers using default hash and identity functions for 16bit descriptor -00237 RPtrHashSet<TDesC16> ptrHashSetDes16(); -00238 -00239 iConsole->Printf(KPtrHashSet); -00240 iConsole->Printf(KConstruct); -00241 iConsole->Printf(KConstructDefaultPtrHashSet); -00242 } -00243 -00248 void CHashTableExample::ConstructOwnPtrHashSet() -00249 { -00250 // Creates an object of custom hash function by using our created structure -00251 THashFunction32<TMyOwnObject> ownHashFunction(MyHashFunction); -00252 -00253 // Creates an object of identity relation by using our created structure -00254 TIdentityRelation<TMyOwnObject> ownIdentityFunction(MyIdentityFunction); -00255 -00256 // Construct hash set of pointers by providing custom hash and identity functions -00257 RPtrHashSet<TMyOwnObject> ownPtrHashSet(ownHashFunction, ownIdentityFunction); -00258 iConsole->Printf(KConstructOwnPtrHashSet); -00259 } -00260 -00266 void FindNumberInWords(const TInt& aNum, TDes& aDes) -00267 { -00268 TInt number = aNum; -00269 const TInt bufferSize=256; -00270 const TText* numbers[] = {_S("zero"), _S("one"), _S("two"),_S("three"),_S("four"),_S("five"),_S("six"),_S("seven"), -00271 _S("eight"),_S("nine"),_S("ten"),_S("eleven"),_S("twelve"),_S("thirteen"), -00272 _S("fourteen"),_S("fifteen"), _S("sixteen"),_S( "seventeen"),_S( "eighteen"), -00273 _S("nineteen"),_S( "twenty"),_S( "thirty"),_S( "forty"),_S( "fifty"),_S("sixty"), -00274 _S("seventy"),_S( "eighty"), _S("ninety"), _S("hundred"), _S("thousand") }; -00275 -00276 // Converts the words if the number is less than 20 -00277 if (number<20) -00278 { -00279 aDes.Copy(reinterpret_cast<const TUint16*> (numbers[number])); -00280 } -00281 -00282 // Converts the words if the number between 20 and 100 -00283 if (number<100 && number>=20) -00284 { -00285 TInt tens = number/10; -00286 TInt units = number%10; -00287 aDes.Copy(reinterpret_cast<const TUint16*> (numbers[tens-2+20])); -00288 if (units) -00289 { -00290 aDes.Append(' '); -00291 aDes.Append(TPtrC16(reinterpret_cast<const TUint16*> (numbers[units]))); -00292 } -00293 } -00294 -00295 // Converts the words if the number is between 100 and 1000 -00296 if (number<1000 && number>=100) -00297 { -00298 TInt hundreds = number/100; -00299 aDes.Copy(reinterpret_cast<const TUint16*> (numbers[hundreds])); -00300 aDes.Append(' '); -00301 aDes.Append(TPtrC16(reinterpret_cast<const TUint16*> (numbers[28]))); -00302 number%=100; -00303 if (number) -00304 { -00305 TBuf<bufferSize> buf; -00306 TDes& des1= buf; -00307 FindNumberInWords(number, des1); -00308 aDes.Append(KAnd); -00309 aDes+=des1; -00310 } -00311 } -00312 -00313 // Converts the words if the number is greater than or equal to 1000 -00314 if(number>=1000) -00315 { -00316 TInt hundreds = number/1000; -00317 aDes.Copy(reinterpret_cast<const TUint16*> (numbers[hundreds])); -00318 aDes.Append(' '); -00319 aDes.Append(TPtrC16(reinterpret_cast<const TUint16*> (numbers[29]))); -00320 number%=1000; -00321 if (number) -00322 { -00323 TBuf<bufferSize> buf; -00324 TDes& des1= buf; -00325 FindNumberInWords(number, des1); -00326 aDes.Append(KAnd); -00327 aDes+=des1; -00328 } -00329 } -00330 } -00331 -00342 void CHashTableExample::OperationsToPtrHashSetL() -00343 { -00344 // -00345 iConsole->Printf(KOperation); -00346 -00347 // First, set up some sample data to store in the hash -00348 // We're going to use strings for the numbers 0 to 1999 -00349 -00350 // Populate a string array temporarily with the sample data -00351 // We'll use the array to populate the set, and later on use it also -00352 // to populate a map -00353 const TInt KMaxItem=1200; -00354 const TInt KMaxBufferSize=256; -00355 TInt i=0; -00356 for (i=0; i<KMaxItem; ++i) -00357 { -00358 HBufC* hbuf = HBufC::NewLC(KMaxBufferSize); -00359 TPtr buf = hbuf->Des(); -00360 // FindNumberInWords gets a string representation of the specified integer -00361 FindNumberInWords(i, buf); -00362 iPointerArray.AppendL(hbuf); -00363 CleanupStack::Pop(hbuf); -00364 } -00365 -00366 // Now create a set and populate it with the data from the array -00367 -00368 // Creates an object of hash set of pointers for 16 bit data using the template class RPtrHashSet -00369 RPtrHashSet<TDesC16> ptrHashSet; -00370 // Push hash set of pointers on to the cleanup stack -00371 CleanupClosePushL(ptrHashSet); -00372 // Insert items to hash set of pointers from 16 bit descriptor array -00373 for (i=0; i<KMaxItem; ++i) -00374 { -00375 ptrHashSet.InsertL(iPointerArray[i]); -00376 } -00377 iConsole->Printf(KInsertItemsToPtrHashSet); -00378 -00379 // Search the set for a specified item -00380 TDesC16* item1 = ptrHashSet.Find(KFindItem); -00381 // item1 is NULL if KFindItem is not found in the set -00382 if (item1) -00383 { -00384 iConsole->Printf(KItemPresentInPtrHashSet); -00385 } -00386 else -00387 { -00388 iConsole->Printf(KItemNotPresentInPtrHashSet); -00389 } -00390 -00391 // Iterate over the items in the set -00392 // Creates an iterator object of type TIter -00393 RPtrHashSet<TDesC16>::TIter ptrHashSetIter(ptrHashSet); -00394 // Loop through the items -00395 for ( ; ; ) -00396 { -00397 const TDesC16* resNext = ptrHashSetIter.Next(); -00398 // Next() moves the iterator to the next item and returns it -00399 // Returns NULL if there are no more items -00400 if (!resNext) -00401 { -00402 break; -00403 } -00404 } -00405 iConsole->Printf(KIterateItemsFromPtrHashSet); -00406 -00407 // Remove an item from hash set -00408 TInt err = ptrHashSet.Remove(&KRemoveItem); -00409 // Check if the item was successfully removed -00410 if (err == KErrNone) -00411 { -00412 iConsole->Printf(KItemPresentInPtrHashSet); -00413 } -00414 else -00415 { -00416 iConsole->Printf(KItemNotPresentInPtrHashSet); -00417 } -00418 iConsole->Printf(KRemoveItemsFromPtrHashSet); -00419 -00420 // Close and cleanup hash set of pointers -00421 CleanupStack::PopAndDestroy(&ptrHashSet); -00422 -00423 iConsole->Printf(KPressAKey); -00424 iConsole->Getch(); -00425 } -00426 -00431 void CHashTableExample::ConstructDefaultHashMap() -00432 { -00433 // Construct hash map using default hash and identity functions for integer -00434 RHashMap<TInt, TInt> hashMapInt(); -00435 -00436 // Construct hash map using default hash and identity functions for 8 bit descriptor -00437 RHashMap<TDesC8, TDesC8> hashMapDes8(); -00438 -00439 // Construct hash map using default hash and identity functions for 16bit descriptor -00440 RHashMap<TDesC16, TDesC16> hashMapDes16(); -00441 -00442 iConsole->Printf(KHashMap); -00443 iConsole->Printf(KConstruct); -00444 iConsole->Printf(KConstructDeafultHashMap); -00445 } -00446 -00451 void CHashTableExample::ConstructOwnHashMap() -00452 { -00453 // Creates an object of custom hash function by using our created structure -00454 THashFunction32<TMyOwnObject> ownHashFunction(MyHashFunction); -00455 -00456 // Creates an object of identity function by using our created structure -00457 TIdentityRelation<TMyOwnObject> ownIdentityFunction(MyIdentityFunction); -00458 -00459 // Construct hash map by providing custom hash and identity function -00460 RHashMap<TMyOwnObject, TMyOwnObject> ownHashMap(ownHashFunction, ownIdentityFunction); -00461 iConsole->Printf(KConstructOwnHashMap); -00462 } -00463 -00474 void CHashTableExample::OperationsToHashMapL() -00475 { -00476 TInt maxItem=300; -00477 TInt itemToBeFound=150; -00478 TInt itemToBeRemoved=200; -00479 TInt64 items; -00480 -00481 iConsole->Printf(KOperation); -00482 -00483 // Creates an object of hash map using the template class RHashMap -00484 RHashMap<TInt, TInt> hashMap; -00485 -00486 // Push hash map on to the cleanup stack -00487 CleanupClosePushL(hashMap); -00488 -00489 // Insert items to hash map -00490 for (TInt i=0; i<maxItem; i++) -00491 { -00492 TInt res = Math::Rand(items); -00493 hashMap.InsertL(res*res, res); -00494 } -00495 -00496 iConsole->Printf(KInsertItemsToHashMap); -00497 -00498 // Search the map for a specified item -00499 TInt* result= hashMap.Find(itemToBeFound); -00500 -00501 // result is NULL if specified item is not found in the map -00502 if(result) -00503 { -00504 iConsole->Printf(KItemPresentInHashMap); -00505 } -00506 else -00507 { -00508 iConsole->Printf(KItemNotPresentInHashMap); -00509 } -00510 -00511 // Iterate over the items in the map -00512 // Creates an iterator object of type TIter -00513 RHashMap<TInt, TInt>::TIter hashMapIter(hashMap); -00514 -00515 for ( ; ; ) -00516 { -00517 const TInt* resNext = hashMapIter.NextKey(); -00518 if (!resNext) -00519 { -00520 break; -00521 } -00522 } -00523 -00524 iConsole->Printf(KIterateItemsFromHashMap); -00525 -00526 // Remove an item from hash map -00527 TInt res = hashMap.Remove(itemToBeRemoved); -00528 -00529 // Check if the item was successfully removed -00530 if(res) -00531 { -00532 iConsole->Printf(KItemPresentInHashMap); -00533 } -00534 else -00535 { -00536 iConsole->Printf(KItemNotPresentInHashMap); -00537 } -00538 -00539 iConsole->Printf(KRemoveItemsFromHashMap); -00540 -00541 // Close and cleanup hash map -00542 CleanupStack::PopAndDestroy(&hashMap); -00543 -00544 iConsole->Printf(KPressAKey); -00545 iConsole->Getch(); -00546 } -00547 -00552 void CHashTableExample::ConstructDefaultPtrHashMap() -00553 { -00554 // Construct hash map of pointers using default hash and identity functions for integer -00555 RPtrHashMap<TInt, TInt> ptrHashMapInt(); -00556 -00557 // Construct hash map of pointers using default hash and identity functions for 8bit descriptor -00558 RPtrHashMap<TDesC8, TDesC8> ptrHashMapDes8(); -00559 -00560 // Construct hash map of pointers using default hash and identity functions for 16bit descriptor -00561 RPtrHashMap<TDesC16, TDesC16> ptrHashMapDes16(); -00562 -00563 iConsole->Printf(KPtrHashMap); -00564 iConsole->Printf(KConstruct); -00565 iConsole->Printf(KConstructDeafultPtrHashMap); -00566 } -00567 -00572 void CHashTableExample::ConstructOwnPtrHashMap() -00573 { -00574 // Creates an object of custom hash function by using our created structure -00575 THashFunction32<TMyOwnObject> ownHashFunction(MyHashFunction); -00576 -00577 // Creates an object of identity function by using our created structure -00578 TIdentityRelation<TMyOwnObject> ownIdentityFunction(MyIdentityFunction); -00579 -00580 // Construct hash map of pointers by providing custom hash and identity function -00581 RPtrHashMap<TMyOwnObject, TMyOwnObject> ownPtrHashMap(ownHashFunction, ownIdentityFunction); -00582 iConsole->Printf(KConstructOwnPtrHashMap); -00583 } -00584 -00595 void CHashTableExample::OperationsToPtrHashMapL() -00596 { -00597 TInt i; -00598 TInt maxItem=200; -00599 -00600 iConsole->Printf(KOperation); -00601 -00602 // Creates an object of hash map of pointers using the template class RPtrHashMap -00603 RPtrHashMap<TDesC16, TDesC16> ptrHashMap; -00604 -00605 // Push hash map of pointers on to the cleanup stack -00606 CleanupClosePushL(ptrHashMap); -00607 -00608 // Insert items to hash map of pointers -00609 for (i=0; i<maxItem; ++i) -00610 { -00611 ptrHashMap.InsertL(iPointerArray[i], iPointerArray[i+1]); -00612 } -00613 -00614 iConsole->Printf(KInsertItemsToPtrHashMap); -00615 -00616 // Search the set for a specified item -00617 TDesC16* item1= ptrHashMap.Find(KFindItem); -00618 -00619 // item1 is NULL if KFindItem is not found in the map -00620 if(item1) -00621 { -00622 iConsole->Printf(KItemPresentInPtrHashMap); -00623 } -00624 else -00625 { -00626 iConsole->Printf(KItemNotPresentInPtrHashMap); -00627 } -00628 -00629 // Iterate over the items in the map -00630 // Creates an iterator object of type TIter -00631 RPtrHashMap<TDesC16, TDesC16>::TIter ptrHashMapIter(ptrHashMap); -00632 -00633 for ( ; ; ) -00634 { -00635 const TDesC16* resNext = ptrHashMapIter.NextKey(); -00636 // Next() moves the iterator to the next item and returns it -00637 // Returns NULL if there are no more items -00638 if (!resNext) -00639 { -00640 break; -00641 } -00642 } -00643 -00644 iConsole->Printf(KIterateItemsFromPtrHashMap); -00645 -00646 // Remove an item from hash map of pointers -00647 TInt res = ptrHashMap.Remove(&KRemoveItem); -00648 -00649 // Check if the item was successfully removed -00650 if(res) -00651 { -00652 iConsole->Printf(KItemPresentInPtrHashMap); -00653 } -00654 else -00655 { -00656 iConsole->Printf(KItemNotPresentInPtrHashMap); -00657 } -00658 -00659 iConsole->Printf(KRemoveItemsFromPtrHashMap); -00660 iConsole->Printf(KExitMsg); -00661 iConsole->Getch(); -00662 -00663 // Close and Cleanup hash map of pointers -00664 CleanupStack::PopAndDestroy(&ptrHashMap); -00665 } -00666 -00667 void MainL() -00668 { -00669 CHashTableExample* app= CHashTableExample::NewL(); -00670 CleanupStack::PushL(app); -00671 -00672 // Hash set -00673 app->ConstructDefaultHashSet(); -00674 app->ConstructOwnHashSet(); -00675 app->OperationsToHashSetL(); -00676 -00677 // Hash set of pointers -00678 app->ConstructDefaultPtrHashSet(); -00679 app->ConstructOwnPtrHashSet(); -00680 app->OperationsToPtrHashSetL(); -00681 -00682 // Hash map -00683 app->ConstructDefaultHashMap(); -00684 app->ConstructOwnHashMap(); -00685 app->OperationsToHashMapL(); -00686 -00687 // Hash map of pointers -00688 app->ConstructDefaultPtrHashMap(); -00689 app->ConstructOwnPtrHashMap(); -00690 app->OperationsToPtrHashMapL(); -00691 -00692 CleanupStack::PopAndDestroy(app); -00693 } -00694 -00695 GLDEF_C TInt E32Main() -00696 { -00697 __UHEAP_MARK; -00698 -00699 CTrapCleanup* cleanup = CTrapCleanup::New(); -00700 if(cleanup == NULL) -00701 { -00702 return KErrNoMemory; -00703 } -00704 TRAPD(err, MainL()); -00705 if(err !=KErrNone) -00706 { -00707 User::Panic(KFailed, err); -00708 } -00709 delete cleanup; -00710 -00711 __UHEAP_MARKEND; -00712 return KErrNone; -00713 } -00714 -00715 -00716 -00717 -00718 -00719 -00720 -