diff -r 89d6a7a84779 -r 25a17d01db0c Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/_dynamic_arrays_8cpp-source.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/_dynamic_arrays_8cpp-source.html Fri Jan 22 18:26:19 2010 +0000 @@ -0,0 +1,1308 @@ + +
+00001 // Copyright (c) 2000-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 // Examples to demonstrate arrays +00015 // +00016 +00017 #include "CommonFramework.h" +00018 #include <e32math.h> +00019 #include <e32std.h> +00020 +00021 _LIT(KMsgNewLine,"\n"); +00022 _LIT(KMsgPressAnyKey," (press any key to continue)\n"); +00023 _LIT(KFormat1,"X%u"); +00024 +00025 const TText* firstElement = _S("DynamicArray: first"); +00026 const TText* secondElement = _S("Example Code: second"); +00027 const TText* thirdElement = _S("ArrayKeys Ex: third"); +00028 +00029 // +00030 // A T type class used in the example demonstrating the: +00031 // CArrayFixFlat class +00032 // +00033 class TElement +00034 { +00035 public : +00036 TElement(); +00037 public : +00038 TBuf<4> iData; +00039 }; +00040 +00041 TElement::TElement() +00042 { +00043 _LIT(KTextBase,"BASE"); +00044 iData = KTextBase; +00045 } +00046 +00047 class CArrayElement +00048 { +00049 public : +00050 CArrayElement(); +00051 TBool operator==(const CArrayElement& aElement) const; +00052 public : +00053 TBuf<4> iData; +00054 }; +00055 +00056 CArrayElement::CArrayElement() +00057 { +00058 _LIT(KTextBase,"BASE"); +00059 iData = KTextBase; +00060 } +00061 +00062 TBool CArrayElement::operator==(const CArrayElement& aElement) const +00063 { +00064 return (iData == aElement.iData); +00065 } +00066 +00067 // +00068 // A CBase derived class used in the example demonstrating the CArrayPtrFlat +00069 // array +00070 // +00071 class CElement : public CBase +00072 { +00073 public : +00074 CElement(); +00075 ~CElement(); +00076 void SetTextL(const TDesC& aText); +00077 public : +00078 HBufC* iBuf; +00079 }; +00080 +00081 CElement::CElement() +00082 { +00083 } +00084 +00085 CElement::~CElement() +00086 { +00087 delete iBuf; +00088 } +00089 +00094 void CElement::SetTextL(const TDesC& aText) +00095 { +00096 if (!iBuf) +00097 { +00098 // The buffer is not created. +00099 // Hence, create the heap buffer. +00100 // Set the length of CElement::iBuf to the length of aText. +00101 iBuf = HBufC::NewL(aText.Length()); +00102 } +00103 +00104 else if(iBuf->Length() != aText.Length() ) +00105 { +00106 // The Buffer exists but is a different size to the input text. +00107 iBuf = iBuf->ReAllocL(aText.Length()); +00108 } +00109 // Copy the contents of aText to iBuf. +00110 *iBuf = aText; +00111 } +00112 +00113 TInt Order64Bit(const TInt64& aLeft, const TInt64& aRight) +00114 { +00115 if (aLeft<aRight) +00116 return -1; +00117 if (aLeft==aRight) +00118 return 0; +00119 return 1; +00120 } +00121 +00128 class TIntPtrElement +00129 { +00130 public : +00131 TIntPtrElement(); +00132 void SetIntPtr(TInt* aPtr); +00133 public : +00134 TBuf<4> iData; +00139 TInt* iIntPtr; +00140 }; +00141 +00145 TIntPtrElement::TIntPtrElement() +00146 { +00147 _LIT(KTextBase,"BASE"); +00148 iData = KTextBase; +00149 } +00150 +00155 void TIntPtrElement::SetIntPtr(TInt* aPtr) +00156 { +00157 iIntPtr = aPtr; +00158 } +00166 class TKeyTIntPtr : public TKeyArrayFix +00167 { +00168 public: +00169 TKeyTIntPtr(TInt aOffset, TKeyCmpText aType); +00170 TKeyTIntPtr(TInt aOffset, TKeyCmpNumeric aType); +00171 TAny* At(TInt aIndex); +00172 }; +00173 +00179 TKeyTIntPtr::TKeyTIntPtr(TInt aOffset, TKeyCmpText aType):TKeyArrayFix(aOffset,aType) +00180 { +00181 } +00182 +00187 TKeyTIntPtr::TKeyTIntPtr(TInt aOffset, TKeyCmpNumeric aType):TKeyArrayFix(aOffset,aType) +00188 { +00189 } +00190 +00197 TAny* TKeyTIntPtr::At(TInt aIndex) +00198 { +00199 if (aIndex==KIndexPtr) +00200 { +00201 return((TUint8 *)iPtr+iKeyOffset); +00202 } +00203 // Get the address of the array element. +00204 TIntPtrElement* ptr = (TIntPtrElement *)(iBase->Ptr(aIndex*sizeof(TIntPtrElement)).Ptr()+iKeyOffset); +00205 // The TIntPtrElement::iIntPtr points to the key. +00206 // Return the key. +00207 return(ptr->iIntPtr); +00208 } +00209 +00214 void PrintFixIntPtrArray(CArrayFixFlat<TIntPtrElement>& aFixFlat) +00215 { +00216 _LIT(KMsgContentsIntPtr,"Contents of the array of TIntPtrElement objects.\n"); +00217 console->Printf(KMsgContentsIntPtr); +00218 for (TInt forix = 0; forix < aFixFlat.Count(); forix++) +00219 { +00220 console->Printf(KMsgNewLine); +00221 _LIT(KMsgBuf,"Index: %d\n Descriptor:"); +00222 console->Printf(KMsgBuf,forix); +00223 console->Printf(aFixFlat[forix].iData); +00224 _LIT(KMsgInt,"\t\tInteger Value: %d"); +00225 console->Printf(KMsgInt,*(aFixFlat[forix].iIntPtr)); +00226 } +00227 console->Printf(KMsgNewLine); +00228 } +00229 +00234 void PrintFixArray(CArrayFixFlat<TElement>& aFixFlat) +00235 { +00236 for (TInt forix = 0; forix < aFixFlat.Count(); forix++) +00237 { +00238 console->Printf(KMsgNewLine); +00239 console->Printf(aFixFlat[forix].iData); +00240 } +00241 console->Printf(KMsgNewLine); +00242 } +00243 +00248 void PrintPtrArray(CArrayPtrFlat<CElement>* aPtrFlat) +00249 { +00250 _LIT(KCommonFormat4,"\n%S"); +00251 for (TInt forix = 0; forix < aPtrFlat->Count(); forix++) +00252 { +00253 console->Printf(KCommonFormat4,((*aPtrFlat)[forix])->iBuf); +00254 } +00255 } +00256 +00260 class TMySwap : public TSwap +00261 { +00262 public: +00263 TMySwap(CArrayFixFlat<TElement>* aArray); +00264 void Swap(TInt aLeft,TInt aRight); +00265 private: +00266 // The Swap() function is defined for this array. +00267 CArrayFixFlat<TElement>* iArray; +00268 }; +00269 +00273 TMySwap::TMySwap(CArrayFixFlat<TElement>* aArray):iArray(aArray) +00274 { +00275 } +00276 +00282 void TMySwap::Swap(TInt aLeft,TInt aRight) +00283 { +00284 TBuf<4> tbuf(iArray->At(aLeft).iData); +00285 iArray->At(aLeft).iData.Copy(iArray->At(aRight).iData); +00286 iArray->At(aRight).iData.Copy(tbuf); +00287 } +00288 +00294 void DemoPakArrayFindL(CArrayPak<TText>& aPakFlat) +00295 { +00296 // Append TText strings to the aPakFlat array. +00297 +00298 // The length of the string to be appended is increased by one +00299 // to insert the '\0' character at the end of the TText string. +00300 // This is needed as the '\0' character is absent in descriptors. +00301 aPakFlat.AppendL(*firstElement,(User::StringLength(firstElement)+1)*sizeof(TText)); +00302 +00303 // Insert the second element into the array. +00304 aPakFlat.AppendL(*secondElement,(User::StringLength(secondElement)+1)*sizeof(TText)); +00305 +00306 // Insert the third element into the array. +00307 aPakFlat.AppendL(*thirdElement,(User::StringLength(thirdElement)+1)*sizeof(TText)); +00308 +00309 // Print the array elements. +00310 _LIT(KCommonFormat7,"Array Contents"); +00311 console->Printf(KCommonFormat7); +00312 console->Printf(KMsgPressAnyKey); +00313 console->Getch(); +00314 +00315 TInt length = aPakFlat.Count(); +00316 for(TInt ix = 0; ix < length; ix++) +00317 { +00318 console->Printf(TPtrC(&aPakFlat[ix])); +00319 console->Printf(KMsgNewLine); +00320 } +00321 +00322 // Find an element in the array. +00323 _LIT(KMsgFind,"\n--->Find"); +00324 console->Printf(KMsgFind); +00325 _LIT(KMsgFindElement,"\nSearching the array for:"); +00326 console->Printf(KMsgFindElement); +00327 +00328 // The descriptor, buf contains the string "Code". +00329 // The CArrayPak::Find() function will try to find this string in the array. +00330 console->Printf(TPtrC(thirdElement)); +00331 +00332 // The key to find the element. +00333 // The length of the key is set to 12. +00334 // Thus, first 12 characters of all strings are compared with the key. +00335 TKeyArrayPak keypak(0,ECmpNormal,12); +00336 +00337 // Initialise the index to -1. +00338 TInt index = -1; +00339 +00340 // Perform the search. +00341 if(aPakFlat.Find(*thirdElement,keypak,index) == 0) +00342 { +00343 // Successful search. +00344 // The index variable holds the index of the element found. +00345 _LIT(KElementFound,"\nElement found at %d\n"); +00346 console->Printf(KElementFound,index); +00347 } +00348 else +00349 { +00350 // Unsuccessful search. +00351 // The element is not found. +00352 _LIT(KElementNotFound,"\nElement not found"); +00353 console->Printf(KElementNotFound); +00354 } +00355 } +00356 +00362 void DemoVarArraySortL(CArrayVar<TText>& aVarFlat) +00363 { +00364 // Append TText strings to the aVarFlat array. +00365 +00366 // The length of the string to be appended is increased by one +00367 // to insert the '\0' character at the end of the TText string. +00368 // This is needed as the '\0' character is absent in descriptors. +00369 aVarFlat.AppendL(*firstElement,(User::StringLength(firstElement)+1)*sizeof(TText)); +00370 +00371 // Insert the second and third elements into the array. +00372 aVarFlat.AppendL(*secondElement,(User::StringLength(secondElement)+1)*sizeof(TText)); +00373 aVarFlat.AppendL(*thirdElement,(User::StringLength(thirdElement)+1)*sizeof(TText)); +00374 +00375 // Print the array elements. +00376 _LIT(KCommonFormat6,"Array Contents [Before Sort]"); +00377 console->Printf(KCommonFormat6); +00378 +00379 console->Printf(KMsgPressAnyKey); +00380 console->Getch(); +00381 +00382 TInt length = aVarFlat.Count(); +00383 for(TInt ix = 0; ix < length; ix++) +00384 { +00385 console->Printf(TPtrC(&aVarFlat[ix])); +00386 console->Printf(KMsgNewLine); +00387 } +00388 +00389 // The key to find the element. +00390 // The length of the key is set to 12. +00391 // Thus, first 12 characters of the string are compared with the key. +00392 TKeyArrayVar keyvar(0,ECmpFolded,12); +00393 +00394 // Sort the array using the TKeyArrayVar key. +00395 aVarFlat.Sort(keyvar); +00396 +00397 // Print the sorted array elements. +00398 _LIT(KMsgSort,"\n--->Sort"); +00399 console->Printf(KMsgSort); +00400 console->Printf(KMsgPressAnyKey); +00401 console->Getch(); +00402 +00403 for(TInt ix = 0; ix < length; ix++) +00404 { +00405 console->Printf(TPtrC(&aVarFlat[ix])); +00406 console->Printf(KMsgNewLine); +00407 } +00408 } +00413 void DemoFlatArrayL(CArrayFixFlat<TElement>& aFixFlat) +00414 { +00415 TElement theElement; +00416 +00417 TInt value; +00418 for (value = 0; value < 3; value++) +00419 { +00420 theElement.iData.Format(KFormat1,value); +00421 aFixFlat.AppendL(theElement); +00422 } +00423 +00424 // Show length of each element. +00425 // The length of each element of the array is the size of the +00426 // TElement class. +00427 _LIT(KCommonFormat2,"\nLength()=%d"); +00428 console->Printf(KCommonFormat2,aFixFlat.Length()); +00429 +00430 // Show number of elements. +00431 _LIT(KCommonFormat3,"\nCount()=%d"); +00432 console->Printf(KCommonFormat3,aFixFlat.Count()); +00433 +00434 // Show each element +00435 PrintFixArray(aFixFlat); +00436 // +00437 // InsertL * * * * * * * * * +00438 // +00439 _LIT(KMsgInsert,"\n\n--->InsertL"); +00440 console->Printf(KMsgInsert); +00441 _LIT(KMsgPressAnyKey," (press any key to continue)\n"); +00442 console->Printf(KMsgPressAnyKey); +00443 console->Getch(); +00444 +00445 // Insert elements +00446 // ... at the beginning, +00447 _LIT(KMsgBEG,"BEG"); +00448 theElement.iData = KMsgBEG; +00449 aFixFlat.InsertL(0,theElement); +00450 +00451 // ... near the middle, +00452 _LIT(KMsgMID,"MID"); +00453 theElement.iData = KMsgMID; +00454 aFixFlat.InsertL(2,theElement); +00455 +00456 // ... at the end. +00457 // This is the same as using the AppendL() function +00458 _LIT(KMsgEND,"END"); +00459 theElement.iData = KMsgEND; +00460 aFixFlat.InsertL(aFixFlat.Count(),theElement); +00461 +00462 // Show number of elements +00463 _LIT(KCommonFormat5,"Count()=%d"); +00464 console->Printf(KCommonFormat5,aFixFlat.Count()); +00465 +00466 // Show each element +00467 PrintFixArray(aFixFlat); +00468 +00469 // Define the key to sort the array. +00470 // The data member of the TElement class, iData, is the key. +00471 TKeyArrayFix keyfix(_FOFF(TElement,iData),ECmpFolded); +00472 +00473 // Sort the array. +00474 aFixFlat.Sort(keyfix); +00475 +00476 // Print the sorted array. +00477 _LIT(KMsgSort,"\n--->Sort"); +00478 console->Printf(KMsgSort); +00479 console->Printf(KMsgPressAnyKey); +00480 console->Getch(); +00481 +00482 PrintFixArray(aFixFlat); +00483 +00484 // +00485 // Delete * * * * * * * * * +00486 // +00487 _LIT(KMsgDelete,"\n\n--->Delete"); +00488 console->Printf(KMsgDelete); +00489 console->Printf(KMsgPressAnyKey); +00490 console->Getch(); +00491 +00492 // Delete the 2nd, 4th and 5th elements. Note: +00493 // +00494 // 1. We use position to identify the elements (i.e. offset) +00495 // 2. As elements are deleted, the position of other +00496 // elements changes. +00497 +00498 aFixFlat.Delete(1); // delete the 2nd +00499 aFixFlat.Delete(2,2); // delete what are now the 3rd and 4th +00500 +00501 aFixFlat.Compress(); // compress the array +00502 +00503 // Show number of elements +00504 console->Printf(KCommonFormat5,aFixFlat.Count()); +00505 +00506 // Show each element +00507 PrintFixArray(aFixFlat); +00508 // +00509 // Reset * * * * * * * * * +00510 // +00511 _LIT(KMsgReset,"\n\n--->Reset"); +00512 console->Printf(KMsgReset); +00513 console->Printf(KMsgPressAnyKey); +00514 console->Getch(); +00515 +00516 // reset the array (i.e. empty it) +00517 aFixFlat.Reset(); +00518 +00519 // Show number of elements +00520 console->Printf(KCommonFormat5,aFixFlat.Count()); +00521 +00522 // Show each element +00523 PrintFixArray(aFixFlat); +00524 +00525 // +00526 // ExpandL & ExtendL * * * * * * * * * +00527 // +00528 _LIT(KMsgExpandExtend,"\n\n--->ExpandL & ExtendL"); +00529 console->Printf(KMsgExpandExtend); +00530 console->Printf(KMsgPressAnyKey); +00531 console->Getch(); +00532 +00533 // re-build the array +00534 _LIT(KFormat6,"%u"); +00535 for (value = 0; value < 3; value++) +00536 { +00537 theElement.iData.Format(KFormat6,value); +00538 aFixFlat.AppendL(theElement); +00539 } +00540 // Expand by constructing a new element at position 1. +00541 // Extend the array. +00542 // +00543 // Note the use of the TElement default constructor +00544 // in both cases +00545 aFixFlat.ExpandL(1); +00546 aFixFlat.ExtendL(); +00547 +00548 // Show number of elements +00549 console->Printf(KCommonFormat5,aFixFlat.Count()); +00550 +00551 // Show each element +00552 PrintFixArray(aFixFlat); +00553 +00554 // +00555 // ResizeL * * * * * * * * * * * * +00556 // +00557 _LIT(KMsgResize,"\n\n--->ResizeL"); +00558 console->Printf(KMsgResize); +00559 console->Printf(KMsgPressAnyKey); +00560 console->Getch(); +00561 +00562 // Resize the array so that it only contains +00563 // one element +00564 aFixFlat.ResizeL(1); +00565 +00566 // Resize so that it contains 3 elements. +00567 // The two new elements are bit-wise copies +00568 // of a TElement object constructed using +00569 // its default constructor. +00570 aFixFlat.ResizeL(3); +00571 +00572 // Resize so that it contains 5 elements. +00573 // The two new elements are bit-wise copies of +00574 // the TElement object passed through +00575 // the reference. +00576 _LIT(KMsgXXX,"XXX"); +00577 theElement.iData = KMsgXXX; +00578 aFixFlat.ResizeL(5,theElement); +00579 +00580 // Show number of elements +00581 console->Printf(KCommonFormat5,aFixFlat.Count()); +00582 +00583 // Show each element +00584 PrintFixArray(aFixFlat); +00585 +00586 // +00587 // SetReserveL * * * * * * * * * * * * +00588 // +00589 _LIT(KMsgSetReserve,"\n\n--->SetReserveL"); +00590 console->Printf(KMsgSetReserve); +00591 console->Printf(KMsgPressAnyKey); +00592 console->Getch(); +00593 +00594 // Reserve sufficient space to append another +00595 // five elements. +00596 // This function may leave if there is +00597 // insufficient memory. +00598 // NOTE: this does NOT increase the number of +00599 // elements in the array. +00600 aFixFlat.SetReserveL(5); +00601 +00602 // We can now append five elements and be sure that +00603 // no leave will occur. +00604 _LIT(KMsgDoubleAtoE,"AABBCCDDEE"); +00605 TBufC<10> source(KMsgDoubleAtoE); +00606 TInt forix; +00607 for (forix = 0; forix < source.Length(); forix+=2) +00608 { +00609 theElement.iData = source.Mid(forix,2); +00610 aFixFlat.AppendL(theElement); +00611 } +00612 +00613 // Show number of elements +00614 console->Printf(KCommonFormat5,aFixFlat.Count()); +00615 +00616 // Show each element +00617 PrintFixArray(aFixFlat); +00618 +00619 // An object of the TMySwap class. +00620 // It is used to swap two elements of the array. +00621 TMySwap swap(&aFixFlat); +00622 +00623 // Swap the first and the last element of the array. +00624 swap.Swap(0,(aFixFlat.Count() - 1)); +00625 +00626 // Print the array. +00627 _LIT(KMsgSwap,"\n--->Swap [First and Last element]"); +00628 console->Printf(KMsgSwap); +00629 console->Printf(KMsgPressAnyKey); +00630 console->Getch(); +00631 +00632 PrintFixArray(aFixFlat); +00633 console->Printf(KMsgPressAnyKey); +00634 console->Getch(); +00635 } +00636 +00641 void DemoPtrArrayL(CArrayPtrFlat<CElement>& aPtrFlat) +00642 { +00643 CElement* ptr; +00644 ptr = new (ELeave) CElement; +00645 _LIT(KMsgFirstElement,"First Element"); +00646 ptr->SetTextL(KMsgFirstElement); +00647 aPtrFlat.AppendL(ptr); +00648 +00649 +00650 ptr = new (ELeave) CElement; +00651 _LIT(KMsgSecondElement,"Second Element"); +00652 ptr->SetTextL(KMsgSecondElement); +00653 aPtrFlat.AppendL(ptr); +00654 +00655 +00656 ptr = new (ELeave) CElement; +00657 _LIT(KMsgThirdElement,"Third Element"); +00658 ptr->SetTextL(KMsgThirdElement); +00659 aPtrFlat.AppendL(ptr); +00660 +00661 +00662 // Show length of each element +00663 _LIT(KCommonFormat2,"\nLength()=%d"); +00664 console->Printf(KCommonFormat2,aPtrFlat.Length()); +00665 +00666 // Show number of elements +00667 _LIT(KCommonFormat3,"\nCount()=%d"); +00668 console->Printf(KCommonFormat3,aPtrFlat.Count()); +00669 +00670 // Show each element +00671 PrintPtrArray(&aPtrFlat); +00672 // +00673 // InsertL * * * * * * * * * +00674 // +00675 _LIT(KMsgInsert,"\n\n--->InsertL"); +00676 console->Printf(KMsgInsert); +00677 console->Printf(KMsgPressAnyKey); +00678 console->Getch(); +00679 +00680 // Insert an element at the beginning +00681 // of the array. +00682 +00683 ptr = new (ELeave) CElement; +00684 _LIT(KMsgInsertedBeg,"Inserted @ beginning Element"); +00685 ptr->SetTextL(KMsgInsertedBeg); +00686 aPtrFlat.InsertL(0,ptr); +00687 +00688 // Show number of elements +00689 _LIT(KCommonFormat5,"Count()=%d"); +00690 console->Printf(KCommonFormat5,aPtrFlat.Count()); +00691 +00692 // Show each element +00693 PrintPtrArray(&aPtrFlat); +00694 +00695 // +00696 // Delete * * * * * * * * * +00697 // +00698 _LIT(KMsgDelete,"\n\n--->Delete"); +00699 console->Printf(KMsgDelete); +00700 console->Printf(KMsgPressAnyKey); +00701 console->Getch(); +00702 +00703 // Delete the last two elements from the array BUT +00704 // first we must get a reference to those elements +00705 // (pointers to CElement objects) otherwise +00706 // the CElement objects are orphaned. +00707 // +00708 // Here, we destroy those CElement objects. +00709 // +00710 // There are two alternative ways of indexing into +00711 // the array, using either At() or the [] operator +00712 +00713 // NOTE that the code below could be compressed to: +00714 // +00715 // delete (*ptrflat)[aPtrFlat.Count()-1]; +00716 // delete (*ptrflat)[aPtrFlat.Count()-2]; +00717 // aPtrFlat.Delete(aPtrFlat.Count()-2,2); +00718 +00719 TInt index = -1; +00720 index = aPtrFlat.Count(); +00721 +00722 ptr = aPtrFlat[--index]; +00723 aPtrFlat.Delete(index); +00724 delete ptr; +00725 +00726 ptr = aPtrFlat.At(--index); +00727 aPtrFlat.Delete(index); +00728 delete ptr; +00729 +00730 // Show number of elements +00731 console->Printf(KCommonFormat5,aPtrFlat.Count()); +00732 +00733 // Show each element +00734 PrintPtrArray(&aPtrFlat); +00735 +00736 // +00737 // At & the [] operator * * * * * * * * * * * * +00738 // +00739 _LIT(KMsgAt,"\n\n--->At() and the operator []"); +00740 console->Printf(KMsgAt); +00741 console->Printf(KMsgPressAnyKey); +00742 console->Getch(); +00743 +00744 // Make a change to the object pointed to by the first element in the array +00745 _LIT(KMsgNewTextFirst,"New text for the first CElement"); +00746 _LIT(KMsgNewTextSecond,"New text for the second CElement"); +00747 aPtrFlat[0]->SetTextL(KMsgNewTextFirst); +00748 aPtrFlat.At(1)->SetTextL(KMsgNewTextSecond); +00749 +00750 // Show number of elements +00751 console->Printf(KCommonFormat5,aPtrFlat.Count()); +00752 +00753 // Show each element +00754 PrintPtrArray(&aPtrFlat); +00755 +00756 // +00757 // ResetAndDestroy * * * * * * * * * +00758 // +00759 _LIT(KMsgResetDestroy,"\n\n--->ResetAndDestroy"); +00760 console->Printf(KMsgResetDestroy); +00761 console->Printf(KMsgPressAnyKey); +00762 console->Getch(); +00763 +00764 // destroy all of the CElement objects and reset the +00765 // array. +00766 aPtrFlat.ResetAndDestroy(); +00767 +00768 // Show number of elements +00769 console->Printf(KCommonFormat3,aPtrFlat.Count()); +00770 +00771 // Show each element +00772 PrintPtrArray(&aPtrFlat); +00773 +00774 console->Printf(KMsgNewLine); +00775 } +00776 +00782 void DemoTKeyDerivedL(CArrayFixFlat<TIntPtrElement>& aFixFlat) +00783 { +00784 TIntPtrElement theIntPtrElement; +00785 +00786 // Create pointers to integers. +00787 TInt* ptrInt1 = new(ELeave)TInt(10); +00788 CleanupStack::PushL(ptrInt1); +00789 TInt* ptrInt2 = new(ELeave)TInt(0); +00790 CleanupStack::PushL(ptrInt2); +00791 TInt* ptrInt3 = new(ELeave)TInt(5); +00792 CleanupStack::PushL(ptrInt3); +00793 +00794 // Create an array of pointers. +00795 TInt* ptrInt[3] = {ptrInt1,ptrInt2,ptrInt3}; +00796 +00797 // Append elements into the ptrElementArray array. +00798 TInt value; +00799 for (value = 0; value < 3; value++) +00800 { +00801 theIntPtrElement.iData.Format(KFormat1,value); +00802 theIntPtrElement.SetIntPtr(ptrInt[value]); +00803 aFixFlat.AppendL(theIntPtrElement); +00804 } +00805 +00806 // Print the contents of the array. +00807 PrintFixIntPtrArray(aFixFlat); +00808 +00809 // Define the key to find an element in the array. +00810 // Use the TKey derived class, TKeyTIntPtr to do this. +00811 TKeyTIntPtr keyIntPtr(_FOFF(TIntPtrElement,iIntPtr),ECmpTInt); +00812 +00813 _LIT(KMsgFind,"\n--->Find"); +00814 console->Printf(KMsgFind); +00815 console->Printf(KMsgPressAnyKey); +00816 console->Getch(); +00817 +00818 // Initialise to -1. +00819 // Its value will be set to 0 if the Search is successful. +00820 TInt index = -1; +00821 +00822 // Perform the search. +00823 TInt res = aFixFlat.Find ( +00824 theIntPtrElement, // The object whose +00825 // key is used for comparison. +00826 keyIntPtr, // The key object that +00827 // defines the property of the key. +00828 index +00829 ); +00830 +00831 if(res == 0) +00832 { +00833 // The index variable holds the index of the element found. +00834 _LIT(KElementFound,"\nElement found at index: %d\n"); +00835 console->Printf(KElementFound,index); +00836 } +00837 +00838 else +00839 { +00840 // The element is not found. +00841 _LIT(KElementNotFound,"\nElement not found"); +00842 console->Printf(KElementNotFound); +00843 } +00844 +00845 CleanupStack::PopAndDestroy(3, ptrInt1); // ptrInt3, ptrInt2 and ptrInt1. +00846 } +00847 +00852 void DemoRArrayL(RArray<CArrayElement>& aArray) +00853 { +00854 CArrayElement arrayElement; +00855 +00856 // +00857 // AppendL * * * * * * * * * +00858 // +00859 _LIT(KMsgAppend,"\n\n--->AppendL"); +00860 console->Printf(KMsgAppend); +00861 +00862 console->Printf(KMsgPressAnyKey); +00863 console->Getch(); +00864 +00865 TInt value; +00866 for (value = 0; value < 3; value++) +00867 { +00868 // Formats and copies text into this descriptor, replacing any existing data. +00869 arrayElement.iData.Format(KFormat1,value); +00870 aArray.AppendL(arrayElement); // leaves with one of the system wide error codes, if the operation fails. +00871 } +00872 +00873 // Show number of elements +00874 _LIT(KCommonFormat3,"\nCount()=%d"); +00875 console->Printf(KCommonFormat3,aArray.Count()); +00876 +00877 // Show each element +00878 TInt forix; +00879 _LIT(KCommonFormat4,"\n%S"); +00880 for (forix = 0; forix < aArray.Count(); forix++) +00881 { +00882 console->Printf(KCommonFormat4,&(aArray)[forix].iData); +00883 } +00884 +00885 // +00886 // InsertL * * * * * * * * * +00887 // +00888 _LIT(KMsgInsert,"\n\n--->InsertL"); +00889 console->Printf(KMsgInsert); +00890 console->Printf(KMsgPressAnyKey); +00891 console->Getch(); +00892 +00893 // Inserts objects into the array at a specified position. +00894 // It increases the size of the dynamic array. +00895 // This function leaves with one of the system error codes, if the operation fails. +00896 +00897 // Insert arrayElements +00898 // ... at the beginning, +00899 _LIT(KMsgBEG,"BEG"); +00900 arrayElement.iData = KMsgBEG; +00901 aArray.InsertL(arrayElement, 0); +00902 +00903 // ... near the middle, +00904 _LIT(KMsgMID,"MID"); +00905 arrayElement.iData = KMsgMID; +00906 aArray.InsertL(arrayElement, 2); +00907 +00908 // ... at the end. +00909 // This is the same as using the AppendL() function +00910 _LIT(KMsgEND,"END"); +00911 arrayElement.iData = KMsgEND; +00912 aArray.InsertL(arrayElement,aArray.Count()); +00913 +00914 // Show number of elements +00915 _LIT(KCommonFormat5,"Count()=%d"); +00916 console->Printf(KCommonFormat5,aArray.Count()); +00917 +00918 // +00919 // Access elements * * * * * * * * * +00920 // +00921 _LIT(KMsgAccess,"\n\n--->Access"); +00922 console->Printf(KMsgAccess); +00923 console->Printf(KMsgPressAnyKey); +00924 console->Getch(); +00925 +00926 // Show each element +00927 for (forix = 0; forix < aArray.Count(); forix++) +00928 console->Printf(KCommonFormat4,&(aArray)[forix].iData); +00929 +00930 // +00931 // Delete * * * * * * * * * +00932 // +00933 _LIT(KMsgDelete,"\n\n--->Delete"); +00934 console->Printf(KMsgDelete); +00935 console->Printf(KMsgPressAnyKey); +00936 console->Getch(); +00937 +00938 TInt index2; +00939 index2 = aArray.Count(); +00940 +00941 // Removes the objects at a specified position from the array. +00942 // It shrinks the array. +00943 +00944 // Delete the last element +00945 arrayElement = (aArray)[--index2]; +00946 aArray.Remove(index2); +00947 +00948 // Show number of elements +00949 console->Printf(KCommonFormat5,aArray.Count()); +00950 +00951 // Show each element +00952 for (forix = 0; forix < aArray.Count(); forix++) +00953 console->Printf(KCommonFormat4,&(aArray)[forix].iData); +00954 +00955 // +00956 // Find * * * * * * * * * +00957 // +00958 _LIT(KMsgFind,"\n\n--->Find in various ways"); +00959 console->Printf(KMsgFind); +00960 console->Printf(KMsgPressAnyKey); +00961 console->Getch(); +00962 +00963 TInt pos =0; +00964 +00965 // Find a particular element in different ways. +00966 arrayElement = (aArray)[--index2]; +00967 +00968 _LIT(KCommonFormat6,"\nElement %S is found at position %d"); +00969 +00970 // Finds the first object in the array which matches the specified object using a sequential search and a matching algorithm. +00971 pos=aArray.Find(arrayElement, TIdentityRelation<CArrayElement>()); +00972 console->Printf(KCommonFormat6, &(aArray)[pos].iData, pos); +00973 +00974 // Finds the last object in the array which matches the specified object using a sequential search and a matching algorithm. +00975 pos=aArray.FindReverse(arrayElement, TIdentityRelation<CArrayElement>()); +00976 console->Printf(KCommonFormat6, &(aArray)[pos].iData, pos); +00977 +00978 // Finds the object in the array which matches the specified object using a binary search technique.It assumes that objects are in signed key order +00979 pos=aArray.FindInSignedKeyOrder(arrayElement); +00980 console->Printf(KCommonFormat6,&(aArray)[pos].iData, pos); +00981 +00982 // Finds the object in the array which matches the specified object using a binary search technique. It assumes that objects are in unsigned key order. +00983 pos=aArray.FindInUnsignedKeyOrder(arrayElement); +00984 console->Printf(KCommonFormat6,&(aArray)[pos].iData, pos); +00985 +00986 // Finds the object in the array which matches the specified object using a binary search technique.In case of more than one matching element, finds last +00987 // match as specified in the second parameter.It assumes that objects are in signed key order +00988 pos=aArray.SpecificFindInSignedKeyOrder(arrayElement, EArrayFindMode_Last); +00989 console->Printf(KCommonFormat6,&(aArray)[pos].iData, pos); +00990 +00991 // Finds the object in the array which matches the specified object using a binary search technique.In case of more than one matching element, finds last +00992 // match as specified in the second parameter.It assumes that objects are in unsigned key order +00993 pos=aArray.SpecificFindInUnsignedKeyOrder(arrayElement, EArrayFindMode_Last); +00994 console->Printf(KCommonFormat6,&(aArray)[pos].iData, pos); +00995 +00996 // Closes the array and frees all memory allocated to the array +00997 aArray.Close(); +00998 } +00999 +01000 void DemoRArraySort() +01001 { +01002 // +01003 // Sort * * * * * * * * * +01004 // +01005 _LIT(KSortFind,"\n\n--->Sort"); +01006 console->Printf(KSortFind); +01007 console->Printf(KMsgPressAnyKey); +01008 console->Getch(); +01009 +01010 TLinearOrder<TInt64> Int64Order(Order64Bit); +01011 TInt count=10; +01012 +01013 // Construct two arrays of 64-bit signed integer type objects. +01014 // Append random objects to first array. +01015 // Sort all objects of first array in the second array +01016 +01017 RArray<TInt64> firstArray(count); +01018 RArray<TInt64> secondArray(count); +01019 +01020 for (TInt j=0; j<count; j++) +01021 { +01022 TInt64 x=(TInt64)(((TUint)Math::Random() %count)); +01023 +01024 firstArray.Append(x); +01025 secondArray.InsertInOrderAllowRepeats(x,Int64Order); +01026 } +01027 +01028 // Show the initial array elements of first array. +01029 _LIT(KInitialArrayElements,"\nInitial array elements are:"); +01030 console->Printf(KInitialArrayElements); +01031 +01032 _LIT(KCommonFormat7," %d"); +01033 TInt forix; +01034 for (forix = 0; forix < count; forix++) +01035 console->Printf(KCommonFormat7,firstArray[forix]); +01036 +01037 // Sorts the objects within the array using the specified TLinearOrder +01038 secondArray.Sort(Int64Order); +01039 +01040 // Show sorted array elements of second array +01041 _LIT(KSortedArrayElements,"\nSorted array elements are:"); +01042 console->Printf(KSortedArrayElements); +01043 for (forix = 0; forix < count; forix++) +01044 console->Printf(KCommonFormat7,secondArray[forix]); +01045 +01046 console->Getch(); +01047 console->Printf(KMsgNewLine); +01048 +01049 // Closes both the arrays and frees all the memory allocated to these arrays +01050 firstArray.Close(); +01051 secondArray.Close(); +01052 } +01053 +01054 void DemoRPointerArrayL(RPointerArray<CElement>& aPointerArray) +01055 { +01056 CElement* elementptr; +01057 +01058 // +01059 // AppendL * * * * * * * * * +01060 // +01061 _LIT(KMsgAppend,"\n\n--->AppendL"); +01062 console->Printf(KMsgAppend); +01063 console->Printf(KMsgPressAnyKey); +01064 console->Getch(); +01065 +01066 // Append the first element. +01067 elementptr = new (ELeave) CElement; +01068 _LIT(KMsgFirstElement,"First Element"); +01069 elementptr->SetTextL(KMsgFirstElement); +01070 aPointerArray.AppendL(elementptr); +01071 +01072 // Append the second element. +01073 elementptr = new (ELeave) CElement; +01074 _LIT(KMsgSecondElement,"Second Element"); +01075 elementptr->SetTextL(KMsgSecondElement); +01076 aPointerArray.AppendL(elementptr); +01077 +01078 // Append the third element. +01079 elementptr = new (ELeave) CElement; +01080 _LIT(KMsgThirdElement,"Third Element"); +01081 elementptr->SetTextL(KMsgThirdElement); +01082 aPointerArray.AppendL(elementptr); +01083 +01084 // Show number of elements +01085 _LIT(KCommonFormat3,"\nCount()=%d"); +01086 console->Printf(KCommonFormat3,aPointerArray.Count()); +01087 +01088 // Show each element +01089 _LIT(KCommonFormat4,"\n%S"); +01090 TInt forix; +01091 for (forix = 0; forix < aPointerArray.Count(); forix++) +01092 { +01093 console->Printf(KCommonFormat4,aPointerArray[forix]->iBuf); +01094 } +01095 +01096 // +01097 // InsertL * * * * * * * * * +01098 // +01099 _LIT(KMsgInsert,"\n\n--->InsertL"); +01100 console->Printf(KMsgInsert); +01101 console->Printf(KMsgPressAnyKey); +01102 console->Getch(); +01103 +01104 // Inserts objects into the array at a specified position. +01105 // It increases the size of the dynamic array. +01106 +01107 // Insert an element at the beginning +01108 // of the array +01109 elementptr = new (ELeave) CElement; +01110 _LIT(KMsgInsertedBeg,"Inserted @ beginning Element"); +01111 elementptr->SetTextL(KMsgInsertedBeg); +01112 aPointerArray.InsertL(elementptr, 0); +01113 +01114 // Show number of elements +01115 _LIT(KCommonFormat5,"Count()=%d"); +01116 console->Printf(KCommonFormat5,aPointerArray.Count()); +01117 +01118 // +01119 // Access * * * * * * * * * +01120 // +01121 // Show each element +01122 for (forix = 0; forix < aPointerArray.Count(); forix++) +01123 { +01124 console->Printf(KCommonFormat4,aPointerArray[forix]->iBuf); +01125 } +01126 +01127 // +01128 // Delete * * * * * * * * * +01129 // +01130 _LIT(KMsgDelete,"\n\n--->Delete"); +01131 console->Printf(KMsgDelete); +01132 console->Printf(KMsgPressAnyKey); +01133 console->Getch(); +01134 +01135 // Delete the last elements from the array BUT +01136 // first we must get a reference to the element +01137 // (pointers to CElement objects) otherwise +01138 // the CElement objects are orphaned. +01139 // +01140 // Here, we destroy the CElement object. It shrinks the array. +01141 // +01142 // Use [] operator for indexing in to the array. +01143 TInt index1; +01144 index1 = aPointerArray.Count(); +01145 +01146 elementptr = aPointerArray[--index1]; +01147 aPointerArray.Remove(index1); +01148 delete elementptr; +01149 +01150 // Show number of elements +01151 console->Printf(KCommonFormat5,aPointerArray.Count()); +01152 +01153 // Show each element +01154 for (forix = 0; forix < aPointerArray.Count(); forix++) +01155 { +01156 console->Printf(KCommonFormat4,aPointerArray[forix]->iBuf); +01157 } +01158 +01159 // +01160 // Find * * * * * * * * * +01161 // +01162 _LIT(KMsgFind,"\n--->Find"); +01163 console->Printf(KMsgFind); +01164 console->Printf(KMsgPressAnyKey); +01165 console->Getch(); +01166 +01167 elementptr = aPointerArray[index1-2]; +01168 +01169 _LIT(KCommonFormat8,"\nElement found at position %d"); +01170 +01171 // Finds the first object pointer in the array which matches the specified object pointer, using a sequential search. +01172 TInt result=aPointerArray.Find(elementptr); +01173 console->Printf(KCommonFormat8, result); +01174 +01175 // Finds the last object pointer in the array which matches the specified object pointer, using a sequential search. +01176 result=aPointerArray.FindReverse(elementptr); +01177 console->Printf(KCommonFormat8, result); +01178 +01179 // Finds the object pointer in the array that matches the specified object pointer, using a binary search technique. +01180 // It assumes that object pointers in the array are in address order. +01181 result=aPointerArray.FindInAddressOrder(elementptr); +01182 console->Printf(KCommonFormat8, result); +01183 +01184 // +01185 // Sort * * * * * * * * * +01186 // +01187 _LIT(KSortFind,"\n\n--->Sort"); +01188 console->Printf(KSortFind); +01189 console->Printf(KMsgPressAnyKey); +01190 console->Getch(); +01191 +01192 // ResetAndDestroy * * * * * * * * * +01193 // +01194 _LIT(KMsgResetDestroy,"\n\n--->ResetAndDestroy"); +01195 console->Printf(KMsgResetDestroy); +01196 console->Printf(KMsgPressAnyKey); +01197 console->Getch(); +01198 +01199 // Empties the array and deletes the referenced objects. +01200 // It frees all memory allocated to the array and resets the internal state so that it is ready to be reused. +01201 aPointerArray.ResetAndDestroy(); +01202 } +01203 +01204 void DemoSortRPointerArray() +01205 { +01206 // Construct two arrays of TAny pointer objects. +01207 // Append random objects to first pointer array. +01208 // Sort all objects of first array in the second pointer array. +01209 RPointerArray<TAny> firstpointerarray; +01210 RPointerArray<TAny> secondpointerarray; +01211 +01212 TInt count = 10; +01213 for (TInt i=0; i<count; i++) +01214 { +01215 TAny* x=(TAny*)(((TUint)Math::Random() %count)); +01216 firstpointerarray.Append(x); +01217 secondpointerarray.InsertInAddressOrderAllowRepeats(x); +01218 } +01219 +01220 // Show initial array elements of first array +01221 _LIT(KInitialArrayElements,"\nInitial array elements are:"); +01222 console->Printf(KInitialArrayElements); +01223 +01224 _LIT(KCommonFormat7,"Array Contents %d \n"); +01225 TInt forix; +01226 for (forix = 0; forix < count; forix++) +01227 { +01228 console->Printf(KCommonFormat7,firstpointerarray[forix]); +01229 } +01230 +01231 // Sorts the object pointers within the array into address order +01232 secondpointerarray.SortIntoAddressOrder(); +01233 +01234 // Show sorted array elements of second array +01235 _LIT(KSortedArrayElements,"\nSorted array elements are:"); +01236 console->Printf(KSortedArrayElements); +01237 for (forix = 0; forix < count; forix++) +01238 { +01239 console->Printf(KCommonFormat7,secondpointerarray[forix]); +01240 } +01241 +01242 // Closes the arrays and frees all memory allocated to it +01243 firstpointerarray.Close(); +01244 secondpointerarray.Close(); +01245 } +01246 // Do the example +01247 LOCAL_C void doExampleL() +01248 { +01249 //************************************************************ +01250 // Demonstrate a general fixed length array using +01251 // a flat buffer +01252 //************************************************************ +01253 +01254 CArrayFixFlat<TElement>* fixflat; +01255 // Construct array of TElement objects where the iData +01256 // data member of each element contains "X0", "X1", etc +01257 // Uses the AppendL() function to add the members +01258 // and the [] operator to access elements. +01259 fixflat = new (ELeave) CArrayFixFlat<TElement>(3); +01260 CleanupStack::PushL(fixflat); +01261 +01262 // Demonstrate the CArrayFixFlat array. +01263 DemoFlatArrayL(*fixflat); +01264 +01265 // Delete the fixflat array. +01266 CleanupStack::PopAndDestroy(fixflat); // fixflat +01267 //************************************************************ +01268 // Demonstrate an array of pointers to CBase +01269 // derived objects. Uses the specialised array CArrayPtrFlat +01270 //************************************************************ +01271 _LIT(KMsgArrayOfPointers,"\nARRAYS OF POINTERS (to CBase derived objects)\n"); +01272 console->Printf(KMsgArrayOfPointers); +01273 +01274 CArrayPtrFlat<CElement>* ptrflat; +01275 +01276 // Construct an array of four CElement objects each +01277 // containing the text "First" "second" etc +01278 // Uses the AppendL() function to add the members +01279 // and the [] operator to access elements. +01280 ptrflat = new (ELeave) CArrayPtrFlat<CElement>(16); +01281 CleanupStack::PushL(ptrflat); +01282 +01283 // Demonstrate the CArrayPtrFlat array. +01284 DemoPtrArrayL(*ptrflat); +01285 +01286 // Delete the array. +01287 CleanupStack::PopAndDestroy(ptrflat); // ptrflat +01288 +01289 //************************************************************ +01290 // Demonstrate Variable and Packed arrays +01291 // Use TKey to sort these arrays +01292 //************************************************************ +01293 _LIT(KMsgVarArray,"\n\nVAR ARRAY\n\n"); +01294 console->Printf(KMsgVarArray); +01295 +01296 // Create a Var array. +01297 CArrayVarFlat<TText>* varflat = new (ELeave) CArrayVarFlat<TText>(3); +01298 CleanupStack::PushL(varflat); +01299 +01300 // Demonstrate the CArrayVarFlat array. +01301 DemoVarArraySortL(*varflat); +01302 +01303 // Delete the array. +01304 CleanupStack::PopAndDestroy(varflat); // varflat +01305 +01306 _LIT(KMsgPakArray,"\n\nPAK ARRAY\n\n"); +01307 console->Printf(KMsgPakArray); +01308 +01309 // Create a TKeyArrayPak array. +01310 CArrayPakFlat<TText>* pakflat = new (ELeave) CArrayPakFlat<TText>(3); +01311 CleanupStack::PushL(pakflat); +01312 +01313 // Demonstrate the CArrayPakFlat array. +01314 DemoPakArrayFindL(*pakflat); +01315 +01316 // Delete the array. +01317 CleanupStack::PopAndDestroy(pakflat); // pakflat, +01318 +01319 //************************************************************ +01320 // Demonstrate the CArrayFix::Find() function using the +01321 // TKey derived class TKeyTIntPtr. +01322 //************************************************************ +01323 _LIT(KMsgTKeyDerived,"\nTKEY DERIVED CLASS\n"); +01324 console->Printf(KMsgPressAnyKey); +01325 console->Getch(); +01326 +01327 console->Printf(KMsgTKeyDerived); +01328 CArrayFixFlat<TIntPtrElement>* ptrElementArray; +01329 // Construct array of TIntPtrElement objects where the iData +01330 // data member of each element contains "X0", "X1", etc +01331 // Uses the AppendL() function to add the members +01332 // and the [] operator to access elements. +01333 ptrElementArray = new (ELeave) CArrayFixFlat<TIntPtrElement>(3); +01334 CleanupStack::PushL(ptrElementArray); +01335 +01336 // Demonstrate the use of TKey derived class. +01337 DemoTKeyDerivedL(*ptrElementArray); +01338 +01339 CleanupStack::PopAndDestroy(ptrElementArray); // ptrElementArray, +01340 +01341 //***************************************************************** +01342 // Demonstrate an array of type RArray for elements of the same size +01343 //***************************************************************** +01344 +01345 _LIT(KMsgForRArray,"\n*******Arrays of fixed length objects******"); +01346 console->Printf(KMsgForRArray); +01347 +01348 RArray<CArrayElement>* array; +01349 +01350 // Construct array of CArrayElement objects where the iData +01351 // data member of each element contains "X0", "X1", etc. +01352 // The elements of the array are instances of a class, +01353 // so this is a template class. Refer to the definition of +01354 // element CArrayElement above. +01355 // Uses the AppendL() function to add the members +01356 // and the [] operator to access elements. +01357 array = new (ELeave) RArray<CArrayElement>(16); // Initialise the array granularity to 16 +01358 CleanupStack::PushL(array); +01359 // Demonstrate the use of RArray. +01360 DemoRArrayL(*array); +01361 +01362 CleanupStack::PopAndDestroy(array); +01363 // Demonstrates sorting of the RArray. +01364 DemoRArraySort(); +01365 +01366 +01367 //****************************************************************************** +01368 // Demonstrate a simple and efficient array of pointers to objects RPointerArray +01369 //****************************************************************************** +01370 +01371 _LIT(KMsgForRPointerArray,"\n*******Array of pointers to objects******"); +01372 console->Printf(KMsgForRPointerArray); +01373 +01374 RPointerArray<CElement>* ptrarray; +01375 +01376 // Construct an array of four CElement objects each +01377 // containing the text "First", "Second" etc +01378 // Uses the AppendL() function to add the members +01379 // and the [] operator to access elements. +01380 // It leaves with one of the system wide error codes, if the operation fails. +01381 ptrarray = new (ELeave) RPointerArray<CElement>(16); // Initialise the array granularity to 16 +01382 CleanupStack::PushL(array); +01383 // Demonstrate the use of RPointerArray. +01384 DemoRPointerArrayL(*ptrarray); +01385 CleanupStack::PopAndDestroy(ptrarray); +01386 // Demonstrates sorting of the RPointerArray. +01387 DemoSortRPointerArray(); +01388 } +01389 +