diff -r f345bda72bc4 -r 43e37759235e Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/circularbuffer_8cpp_source.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/circularbuffer_8cpp_source.html Tue Mar 30 16:16:55 2010 +0100 @@ -0,0 +1,403 @@ + + + + +TB9.2 Example Applications: examples/Base/BufsAndStrings/circularbufferexample/circularbuffer.cpp Source File + + + + + +

examples/Base/BufsAndStrings/circularbufferexample/circularbuffer.cpp

Go to the documentation of this file.
00001 // Copyright (c) 2008-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 circular buffer API.
+00015 //
+00016 
+00017 
+00018 
+00022 #include "circularbuffer.h"
+00023 
+00024 // Literals.
+00025 _LIT(KPressAKey, "\n\tPress any key to continue....");
+00026 _LIT(KConstruct,"\n\n ****Construct****");
+00027 _LIT(KAdd,"\n ****Add objects****\n");
+00028 _LIT(KNumberOfObjects,"\nNumber of objects in the circular buffer: %d\n");
+00029 _LIT(KAddFailed,"\nElement cannot be added because the circular buffer is full\n");
+00030 _LIT(KRemove,"\n ****Remove objects****\n"); 
+00031 
+00032 
+00036 TMyClass::TMyClass(){};
+00040 TMyClass::TMyClass(const TDesC& aDes)
+00041         { 
+00042         iBuf = aDes;
+00043         }
+00048 const TDesC& TMyClass::GetBuf()
+00049         {
+00050         return iBuf;
+00051         }
+00056 void TMyClass::SetBuf(const TDesC& aDes)
+00057         {
+00058         iBuf = aDes;
+00059         }
+00060         
+00064 CCircularBufferExample::CCircularBufferExample()
+00065         {
+00066         }
+00067 
+00071 void CCircularBufferExample::ConstructL()
+00072         {
+00073         _LIT(KTitle, "Circular Buffer Example" );
+00074         iConsole = Console::NewL(KTitle, TSize(KConsFullScreen, KConsFullScreen));
+00075         
+00076         _LIT(KWelcome, "\n   Welcome to the circular buffer example application");
+00077         iConsole->Printf(KWelcome);
+00078         
+00079         _LIT(KPressAKeyMsg, "\n\n Press any key to step through the example\n");
+00080         iConsole->Printf(KPressAKeyMsg );
+00081         iConsole->Getch();
+00082         }
+00083 
+00087 CCircularBufferExample::~CCircularBufferExample()
+00088         {
+00089         delete iConsole;
+00090         }
+00091 
+00097 CCircularBufferExample* CCircularBufferExample::NewL()
+00098         {
+00099         CCircularBufferExample* self=new(ELeave)CCircularBufferExample();
+00100         CleanupStack::PushL(self);
+00101         self->ConstructL();
+00102         CleanupStack::Pop(self);
+00103         return self;
+00104         }
+00108 void CCircularBufferExample::CircularBufferOfIntsL()
+00109         {
+00110         _LIT(KCircularBufferForInt,"\n *****Circular buffer for integers*****");
+00111         iConsole->Printf(KCircularBufferForInt);
+00112         
+00113         // Creates a circular buffer containing integers.
+00114         CCirBuffer* circularBuffer = new(ELeave)CCirBuffer;
+00115         // Push the circular buffer onto the cleanup stack.
+00116         CleanupStack::PushL(circularBuffer);
+00117         const TInt KMaxElements = 4;
+00118         // Sets the maximum capacity of this circular buffer.
+00119         circularBuffer->SetLengthL(KMaxElements);  // Maximum capacity is KMaxElements.
+00120                 
+00121         iConsole->Printf(KConstruct);
+00122         _LIT(KConstructCircularBuffer, "\n Construction of circular buffer containing integers is successful");
+00123         iConsole->Printf(KConstructCircularBuffer);             
+00124 
+00125         
+00126         iConsole->Printf(KAdd);
+00127         TUint element[6]= {1, 2, 3, 4, 5, 6};
+00128         iConsole->Printf(KNumberOfObjects, circularBuffer->Count());
+00129                 
+00130         _LIT(KAddedElements,"Added Element: %d\n");
+00131         TInt result=circularBuffer->Put(element[0]); // Add integers to the circular buffer.
+00132         User::LeaveIfError(result);
+00133         iConsole->Printf(KAddedElements,element[0]);
+00134         iConsole->Printf(KNumberOfObjects, circularBuffer->Count());            
+00135         
+00136         // Add multiple integers to the circular buffer.
+00137         TUint numberOfObjects= 3;
+00138         for(TUint index=1;index<=numberOfObjects; index++)
+00139                 {
+00140                 result= circularBuffer->Put(element[index]);
+00141                 User::LeaveIfError(result);
+00142                 // Print the element added to the circular buffer.
+00143                 iConsole->Printf(KAddedElements,element[index]);
+00144                 iConsole->Printf(KNumberOfObjects, circularBuffer->Count());                    
+00145                 }
+00146         
+00147         _LIT(KAddIntegersToCircularBuffer,"\nAdding integers to circular buffer is successful");
+00148         iConsole->Printf(KAddIntegersToCircularBuffer);
+00149         
+00150         iConsole->Printf(KPressAKey);
+00151         iConsole->Getch();
+00152         
+00153         _LIT(KTryingAddToCircularBuffer,"\nTrying to add when buffer is full.");
+00154         iConsole->Printf(KTryingAddToCircularBuffer);
+00155         result=circularBuffer->Put(element[4]);
+00156         ASSERT(result == KErrGeneral);
+00157         iConsole->Printf(KAddFailed);
+00158         
+00159         // Remove integers from circular buffer.
+00160         iConsole->Printf(KRemove);
+00161         iConsole->Printf(KNumberOfObjects, circularBuffer->Count());
+00162 
+00163         result = circularBuffer->Get();
+00164         _LIT(KElementRemoved,"Removed Element: %d\n");
+00165         User::LeaveIfError(result);
+00166         ASSERT( (TUint) result == element[0]);
+00167         // Print the element removed from the circular buffer.
+00168         iConsole->Printf(KElementRemoved, result);
+00169         iConsole->Printf(KNumberOfObjects, circularBuffer->Count());
+00170         
+00171 
+00172         result = circularBuffer->Get();
+00173         User::LeaveIfError(result);
+00174         ASSERT((TUint)result == element[1]);
+00175         // Print the element removed from the circular buffer.
+00176         iConsole->Printf(KElementRemoved, result);
+00177         iConsole->Printf(KNumberOfObjects, circularBuffer->Count());
+00178         
+00179         //Add remaining elements from array to buffer.
+00180         for(TUint index=4;index<=5; index++)
+00181                 {
+00182                 result= circularBuffer->Put(element[index]);
+00183                 User::LeaveIfError(result);
+00184                 iConsole->Printf(KAddedElements,element[index]);
+00185                 iConsole->Printf(KNumberOfObjects, circularBuffer->Count());
+00186                 }
+00187         iConsole->Printf(KPressAKey);
+00188         iConsole->Getch();
+00189         _LIT(KNewLine,"\n");
+00190         iConsole->Printf(KNewLine);
+00191         // Remove multiple integers from the circular buffer.
+00192         for(TUint index=2;index<=5; index++)
+00193                 {
+00194                 result= circularBuffer->Get();// Removed integer is element[index].
+00195                 User::LeaveIfError(result);
+00196                 ASSERT((TUint)result == element[index]);
+00197                 // Print the elements removed from the circular buffer.
+00198                 iConsole->Printf(KElementRemoved,result);
+00199                 iConsole->Printf(KNumberOfObjects, circularBuffer->Count());
+00200                 }
+00201 
+00202         _LIT(KRemoveIntegersFromCircularBuffer,"\nRemoving integers from the circular buffer is successful");
+00203         iConsole->Printf(KRemoveIntegersFromCircularBuffer);
+00204         iConsole->Printf(KPressAKey);
+00205         iConsole->Getch();
+00206 
+00207         //Pop the circular buffer off the cleanup stack and destroy it.
+00208         CleanupStack::PopAndDestroy(circularBuffer);
+00209         }
+00210 
+00215 void CCircularBufferExample::CircularBufferOfMyObjectsL()
+00216         {
+00217         _LIT(KCircularBufferForMyObject,"\n *****Circular buffer of objects of user defined class TMyClass*****");
+00218         iConsole->Printf(KCircularBufferForMyObject);
+00219                 
+00220         // Create a circular buffer containing instances of TMyClass.
+00221         CCirBuf<TMyClass>* circularBuffer=new(ELeave) CCirBuf<TMyClass>;
+00222         // Push the circular buffer onto the cleanup stack.
+00223         CleanupStack::PushL(circularBuffer);
+00224         // Set the maximum capacity of this circular buffer.
+00225         const TInt KMaxElements = 4;
+00226         circularBuffer->SetLengthL(KMaxElements); // Maximum capacity is KMaxElements.
+00227         iConsole->Printf(KConstruct);
+00228         
+00229         _LIT(KConstructCircularBufferForMyObject, "\n Construction of circular buffer of user defined class is successful\n");
+00230         iConsole->Printf(KConstructCircularBufferForMyObject);  
+00231         
+00232         iConsole->Printf(KAdd);
+00233         // Creates an array of object of TMyClass.      
+00234         TMyClass myObjectsToAdd[6];
+00235 
+00236         _LIT(KBuffer1,"first");
+00237         myObjectsToAdd[0].SetBuf(KBuffer1);
+00238         _LIT(KBuffer2,"second");
+00239         myObjectsToAdd[1].SetBuf(KBuffer2);
+00240         _LIT(KBuffer3,"third");
+00241         myObjectsToAdd[2].SetBuf(KBuffer3);
+00242         _LIT(KBuffer4,"fourth");
+00243         myObjectsToAdd[3].SetBuf(KBuffer4);
+00244         _LIT(KBuffer5,"fifth");
+00245         myObjectsToAdd[4].SetBuf(KBuffer5);
+00246         _LIT(KBuffer6,"sixth");
+00247         myObjectsToAdd[5].SetBuf(KBuffer6);
+00248         
+00249         _LIT(KAddedMyObjectElements,"\nTMyClass object added is: ");
+00250         _LIT(KPrintMsgFormat," \"%S\" ");
+00251         
+00252         TInt result= circularBuffer->Add(&myObjectsToAdd[0]); // Add a TMyClass to the circular buffer.
+00253         User::LeaveIfError(result);
+00254         ASSERT(result==1);
+00255         iConsole->Printf(KAddedMyObjectElements);
+00256         iConsole->Printf(KPrintMsgFormat,&(myObjectsToAdd[0].GetBuf()));
+00257         iConsole->Printf(KNumberOfObjects, circularBuffer->Count());
+00258         
+00259         
+00260         _LIT(KAddedMultipleMyObjectElements,"\nTMyClass objects added are : ");
+00261         // Add multiple TMyClasss to the circular buffer
+00262         result= circularBuffer->Add(&myObjectsToAdd[1], 3); // Add three objects to circular buffer.
+00263         User::LeaveIfError(result);
+00264         ASSERT(result == 3); //Making sure 3 objects are added.
+00265         iConsole->Printf(KAddedMultipleMyObjectElements);
+00266         iConsole->Printf(KPrintMsgFormat,&(myObjectsToAdd[1].GetBuf()));
+00267         iConsole->Printf(KPrintMsgFormat,&(myObjectsToAdd[2].GetBuf()));
+00268         iConsole->Printf(KPrintMsgFormat,&(myObjectsToAdd[3].GetBuf()));
+00269         iConsole->Printf(KNumberOfObjects, circularBuffer->Count());
+00270         
+00271         _LIT(KAddMyObjectsToCircularBuffer,"\nAdding objects of TMyClasss to circular buffer is successful");
+00272         iConsole->Printf(KAddMyObjectsToCircularBuffer);
+00273         iConsole->Printf(KPressAKey);
+00274         iConsole->Getch();
+00275         
+00276         
+00277         //Array to hold removed elements from circular buffer.
+00278         TMyClass myRemovedObjects[6];
+00279         _LIT(KRemovedMultipleMyObjectElements,"\nTMyClass objects removed are: ");
+00280         
+00281         // Remove multiple TMyClasss from the circular buffer.
+00282         result= circularBuffer->Remove(&myRemovedObjects[0],2);
+00283         ASSERT(result == 2);
+00284         iConsole->Printf(KRemovedMultipleMyObjectElements);
+00285         iConsole->Printf(KPrintMsgFormat,&(myRemovedObjects[0].GetBuf()));
+00286         iConsole->Printf(KPrintMsgFormat,&(myRemovedObjects[1].GetBuf()));
+00287         iConsole->Printf(KNumberOfObjects, circularBuffer->Count());    
+00288 
+00289         // Add two elements to circular buffer
+00290         result= circularBuffer->Add(&myObjectsToAdd[4],2);
+00291         User::LeaveIfError(result);
+00292         ASSERT(result == 2);
+00293         iConsole->Printf(KAddedMultipleMyObjectElements);
+00294         iConsole->Printf(KPrintMsgFormat,&(myObjectsToAdd[4].GetBuf()));
+00295         iConsole->Printf(KPrintMsgFormat,&(myObjectsToAdd[5].GetBuf()));
+00296         iConsole->Printf(KNumberOfObjects, circularBuffer->Count());
+00297         
+00298         // Remove multiple TMyClasss from the circular buffer.
+00299         result= circularBuffer->Remove(&myRemovedObjects[2],4);
+00300         ASSERT(result == 4);
+00301         iConsole->Printf(KRemovedMultipleMyObjectElements);
+00302         iConsole->Printf(KPrintMsgFormat,&(myRemovedObjects[2].GetBuf()));
+00303         iConsole->Printf(KPrintMsgFormat,&(myRemovedObjects[3].GetBuf()));
+00304         iConsole->Printf(KPrintMsgFormat,&(myRemovedObjects[4].GetBuf()));
+00305         iConsole->Printf(KPrintMsgFormat,&(myRemovedObjects[5].GetBuf()));
+00306         iConsole->Printf(KNumberOfObjects, circularBuffer->Count());    
+00307         
+00308         for(TInt index=0;index<6;index++)
+00309                 {
+00310                 // The removed objects are same as added ones and are in order.
+00311                 ASSERT(myRemovedObjects[index].GetBuf() == myObjectsToAdd[index].GetBuf());
+00312                 }
+00313         
+00314         _LIT(KRemoveMyObjectsFromCircularBuffer,"\nRemoving TMyClass objects from circular buffer is successful");
+00315         iConsole->Printf(KRemoveMyObjectsFromCircularBuffer);
+00316         iConsole->Printf(KPressAKey);
+00317         iConsole->Getch();
+00318         
+00319         //Pop the circular buffer off the cleanup stack and destroy it.
+00320         CleanupStack::PopAndDestroy(circularBuffer);
+00321         }
+00322 
+00326 void CCircularBufferExample::CircularBufferOfRClasssL()
+00327         {
+00328         _LIT(KCircularBufferForRBuf,"\n *****Circular buffer of R Class*****");
+00329         iConsole->Printf(KCircularBufferForRBuf);
+00330         // Creates a circular buffer containing RBuf.
+00331         CCirBuf<RBuf>* circularBuffer=new(ELeave)CCirBuf<RBuf>;
+00332         // Push the circular buffer onto the cleanup stack.
+00333         CleanupStack::PushL(circularBuffer);
+00334         
+00335         const TInt KMaxElements = 2;
+00336         // Sets the maximum capacity of this circular buffer.
+00337         circularBuffer->SetLengthL(KMaxElements);// max capacity is KMaxElements
+00338         iConsole->Printf(KConstruct);
+00339         _LIT(KConstructCircularBufferForRBuf, "\n Construction of circular buffer of R Class is successful");
+00340         iConsole->Printf(KConstructCircularBufferForRBuf);              
+00341 
+00342         RBuf bufToAdd1;
+00343         _LIT(KBuffer1,"11111");
+00344         // Create an buffer descriptor and assign KBuffer1 data to the descriptor.
+00345         bufToAdd1.CreateL(KBuffer1);
+00346 
+00347         iConsole->Printf(KNumberOfObjects, circularBuffer->Count());
+00348         
+00349         _LIT(KAddedElements,"Added Element: ");
+00350         iConsole->Printf(KAdd);
+00351         TInt result=circularBuffer->Add(&bufToAdd1); // Add a Rbuf object to the circular buffer.
+00352         User::LeaveIfError(result);
+00353         ASSERT(result == 1);
+00354         iConsole->Printf(KAddedElements);
+00355         iConsole->Printf(bufToAdd1);
+00356         iConsole->Printf(KNumberOfObjects, circularBuffer->Count());            
+00357         
+00358         _LIT(KBuffer2,"22222");
+00359         RBuf bufToAdd2;
+00360         // Create an buffer descriptor and assign KBuffer2 data to the descriptor.
+00361         bufToAdd2.CreateL(KBuffer2);
+00362         
+00363         result=circularBuffer->Add(&bufToAdd2); // Add a Rbuf object to the circular buffer.
+00364         User::LeaveIfError(result);
+00365         ASSERT(result == 1);
+00366         iConsole->Printf(KAddedElements);
+00367         iConsole->Printf(bufToAdd2);
+00368         iConsole->Printf(KNumberOfObjects, circularBuffer->Count());            
+00369         
+00370         _LIT(KAddRBufferToCircularBuffer,"\nAdding to circular buffer of R Class is successful\n");
+00371         iConsole->Printf(KAddRBufferToCircularBuffer);
+00372         
+00373         RBuf bufToRemove;
+00374         iConsole->Printf(KRemove);
+00375         _LIT(KElementRemoved,"Removed Element: ");
+00376         
+00377         result=circularBuffer->Remove(&bufToRemove); //bufToRemove will point to bufToAdd1 location.
+00378         ASSERT(result == 1);
+00379         iConsole->Printf(KElementRemoved);
+00380         iConsole->Printf(bufToRemove);
+00381         iConsole->Printf(KNumberOfObjects, circularBuffer->Count());            
+00382 
+00383         
+00384         bufToAdd2.Close(); 
+00385         bufToRemove.Close(); 
+00386         CleanupStack::PopAndDestroy(circularBuffer);
+00387         _LIT(KPressAnyKeyToExit,"\nPress any key to exit ");
+00388         iConsole->Printf(KPressAnyKeyToExit);
+00389         iConsole->Getch();
+00390         }
+00391 
+00392 
+00393 void MainL()
+00394         {
+00395         CCircularBufferExample* app= CCircularBufferExample::NewL();
+00396         CleanupStack::PushL(app);
+00397         
+00398         // Circular buffer containing integers.
+00399         app->CircularBufferOfIntsL();
+00400 
+00401         // Circular buffer containing TMyClasss.
+00402         app->CircularBufferOfMyObjectsL();
+00403         
+00404         // Circular buffer containing RBuf 
+00405         app->CircularBufferOfRClasssL();
+00406         CleanupStack::PopAndDestroy(app);
+00407         } 
+00408 
+00409 GLDEF_C TInt E32Main()
+00410         {
+00411         __UHEAP_MARK;
+00412 
+00413         CTrapCleanup* cleanup = CTrapCleanup::New();
+00414         if(cleanup == NULL)
+00415                 {
+00416                 return KErrNoMemory;
+00417                 }
+00418         TRAPD(err, MainL());
+00419         if(err !=KErrNone)
+00420                 {
+00421                 _LIT(KFailed, "\nFailed to complete");
+00422                 User::Panic(KFailed, err);
+00423                 }       
+00424         delete cleanup;
+00425 
+00426         __UHEAP_MARKEND;
+00427         return KErrNone;
+00428         }
+
+
Generated by  + +doxygen 1.6.2
+ +