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 @@ + + +
+ +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 } +