Main Page | Class Hierarchy | Alphabetical List | Data Structures | File List | Data Fields | Globals | Related Pages | Examples

vetBufferLink.h

00001 
00032 #ifndef __VETLIB_VETBUFFERLINK_H__
00033  #define __VETLIB_VETBUFFERLINK_H__
00034 
00035  #include "../vetBuffer.h"
00036 
00037 
00038 #define VETDEF_FPS_MAX                  1000  /* maximum number of frames per second */
00039 
00040 #define VETRET_FRAME_NOT_FOUND      8254
00041 
00042 
00043 template<class T>
00044 class vetBufferLink : public vetBuffer<T>
00045  {
00046         protected:
00047 
00048 
00049                 struct frameNode {
00050                         T* data;
00051                         struct frameNode * prev;
00052                         struct frameNode * next;
00053                  };
00054 
00055                 frameNode* v_first;
00056                 frameNode* v_current;
00057                 frameNode* v_last;
00058 
00059 
00060 
00061         public:
00062 
00063 
00067                 vetBufferLink() : vetBuffer<T>()
00068                  {
00069                         INFO("vetBufferLink::vetBufferLink()  : vetBuffer() [CONTRUCTOR]")
00070 
00071                         v_first = NULL;
00072                         v_current = NULL;
00073                         v_last = NULL;
00074 
00075                         reset();
00076                  }
00077 
00081                 ~vetBufferLink()
00082                  {
00083                         INFO("vetBufferLink::~vetBufferLink() [DESTRUCTOR]")
00084 
00085                         if ( v_first == NULL)
00086                                 return;
00087 
00088                         v_current = v_first->next;
00089 
00090                  }
00091 
00097                 VETRESULT reset()
00098                  {
00099                         INFO("int vetBufferLink::reset() [SET DEFAULT PARAMETERS]")
00100 
00101                         v_first = NULL;
00102                         v_current = NULL;
00103                         v_last = NULL;
00104                         v_fcount = 0;
00105 
00106                         return VETRET_OK;
00107                  }
00108 
00114                 VETRESULT deleteFrames()
00115                  {
00116                         if ( v_first != NULL)
00117                          {
00118                                 v_current = v_first->next;
00119 
00120                                 while ( v_current != NULL ) {
00121 //BUGBUGBUG
00122                                         delete v_current->prev;
00123                                         delete v_current->data;
00124                                         v_current = v_current->next;
00125                                  }
00126 
00127                                 delete v_last->data;
00128                                 delete v_last;
00129                          }
00130                         else
00131                                 return VETRET_ILLEGAL_USE;
00132 
00133                         return reset();
00134                  }
00135 
00136 
00137 
00138 
00139 
00149                 VETRESULT addFrame(T* newFrame)
00150                  {
00151                         if ( &newFrame == NULL)
00152                                 return VETRET_PARAM_ERR;
00153 
00154                         if ( v_fcount == 0) {
00155                                 v_first = new frameNode;
00156                                 v_first->next = NULL;
00157                                 v_first->prev = NULL;
00158 
00159                                 if ( copyData )
00160                                         v_first->data = new T(*newFrame);
00161                                 else
00162                                         v_first->data = newFrame;
00163 
00164                                 v_current = v_first;
00165                                 v_last = v_first;
00166                                 ++v_fcount;
00167                                 return VETRET_OK;
00168                          }
00169 
00170                         frameNode* v_newlast = new frameNode;
00171 
00172                         if ( copyData )
00173                                 v_newlast->data = new T(*newFrame);
00174                         else
00175                                 v_newlast->data = newFrame;
00176 
00177                         v_newlast->prev = v_last;
00178                         v_newlast->next = NULL;
00179                         v_last->next = v_newlast;
00180                         v_last = v_newlast;
00181                         ++v_fcount;
00182 
00183                         return VETRET_OK;
00184                  }
00185 
00196                 VETRESULT insertFrame(long index, T* newFrame)
00197                  {
00198                         if ( v_fcount == 0 && index != 0)
00199                                 return VETRET_ILLEGAL_USE;
00200 
00201                         if ( &newFrame == NULL)
00202                                 return VETRET_PARAM_ERR;
00203 
00204                         if ( v_fcount == 0 )
00205                                 return addFrame(newFrame);
00206 
00207                         if ( index == v_fcount-1 )
00208                                 return addFrame(newFrame);
00209 
00210                         if ( index == 0 )
00211                          {
00212                                 frameNode* v_newNode = new frameNode;
00213 
00214                                 if ( copyData )
00215                                         v_newNode->data = new T(*newFrame);
00216                                 else
00217                                         v_newNode->data = newFrame;
00218 
00219                                 v_newNode->prev = NULL;
00220                                 v_newNode->next = v_first;
00221                                 v_first->prev = v_newNode;
00222                                 v_first = v_newNode;
00223                                 ++v_fcount;
00224                                 return VETRET_OK;
00225                          }
00226 
00227                         frameNode* iterFrame;
00228                         iterFrame = v_first;
00229                         long i = 0;
00230                         while ( iterFrame )
00231                          {
00232                                 if ( i == index )
00233                                  {
00234                                         frameNode* v_newNode = new frameNode;
00235 
00236                                         if ( copyData )
00237                                                 v_newNode->data = new T(*newFrame);
00238                                         else
00239                                                 v_newNode->data = newFrame;
00240 
00241                                         v_newNode->prev = iterFrame->prev;
00242                                         v_newNode->next = iterFrame;
00243                                         iterFrame->prev->next = v_newNode;
00244                                         iterFrame->prev = v_newNode;
00245                                         ++v_fcount;
00246                                         return VETRET_OK;
00247                                  }
00248                                 iterFrame = iterFrame->next;
00249                                 i++;
00250                          }
00251 
00252                         return VETRET_INTERNAL_ERR;
00253                  }
00254 
00265                 VETRESULT updateFrame(T* oldFrame, T* newFrame, bool removeold)
00266                  {
00267                         if ( v_fcount == 0)
00268                                 return VETRET_ILLEGAL_USE;
00269 
00270                         if ( &oldFrame == NULL || newFrame == NULL )
00271                                 return VETRET_PARAM_ERR;
00272 
00273                         frameNode* iterFrame;
00274                         iterFrame = v_first;
00275 
00276                         while ( iterFrame  )
00277                          {
00278                                 if ( iterFrame->data == oldFrame )
00279                                  {
00280                                         if (removeold)
00281                                                 delete oldFrame;
00282 
00283                                         if ( copyData )
00284                                                 iterFrame->data = new T(*newFrame);
00285                                         else
00286                                                 iterFrame->data = newFrame;
00287 
00288                                         return VETRET_OK;
00289                                  }
00290                                 iterFrame = iterFrame->next;
00291                          }
00292 
00293                         return VETRET_FRAME_NOT_FOUND;
00294                  }
00295 
00306                 VETRESULT updateFrame(long index, T* newFrame, bool removeold)
00307                  {
00308                         if ( v_fcount == 0)
00309                                 return VETRET_ILLEGAL_USE;
00310 
00311                         if ( &newFrame == NULL)
00312                                 return VETRET_PARAM_ERR;
00313 
00314                         if ( index > v_fcount-1 )
00315                                 return VETRET_PARAM_ERR;
00316 
00317                         long distEnd = v_fcount - index;
00318                                 frameNode* iterFrame;
00319 
00320                         if ( index < distEnd )
00321                          {
00322                                 iterFrame = v_first;
00323                                 long i = 0;
00324                                 while ( iterFrame  )
00325                                  {
00326                                         if ( i == index )
00327                                          {
00328                                                         if ( removeold )
00329                                                                 delete iterFrame->data;
00330 
00331                                                         if ( copyData )
00332                                                                 iterFrame->data = new T(*newFrame);
00333                                                         else
00334                                                                 iterFrame->data = newFrame;
00335 
00336                                                         return VETRET_OK;
00337                                          }
00338                                         iterFrame = iterFrame->next;
00339                                         i++;
00340                                  }
00341                          }
00342                         else
00343                          {
00344                                 iterFrame = v_last;
00345                                 long i = v_fcount-1;
00346                                 while ( iterFrame  )
00347                                  {
00348                                         if ( i == index )
00349                                          {
00350                                                 delete iterFrame->data;
00351                                                 iterFrame->data = newFrame;
00352                                                 return VETRET_OK;
00353                                          }
00354                                         iterFrame = iterFrame->prev;
00355                                         i--;
00356                                  }
00357                          }
00358 
00359                         return VETRET_FRAME_NOT_FOUND;
00360                  }
00361 
00370                 VETRESULT removeFrame(T* frameToDelete, bool freeData = false)
00371                  {
00372                         if ( v_fcount == 0)
00373                                 return VETRET_ILLEGAL_USE;
00374 
00375                         if ( frameToDelete == NULL)
00376                                 return VETRET_PARAM_ERR;
00377 
00378                         if ( v_fcount == 1)
00379                          {
00380                                 delete v_first;
00381                                 v_first = NULL;
00382                                 v_current = NULL;
00383                                 v_last = NULL;
00384                                 v_fcount = 0;
00385                          }
00386 
00387                         if ( v_first->data == frameToDelete )
00388                          {
00389                                 v_first = v_first->next;
00390                                 delete v_first->prev;
00391                                 v_first->prev = NULL;
00392                                 --v_fcount;
00393                                 return VETRET_OK;
00394                           }
00395                         else if ( v_last->data == frameToDelete)
00396                          {
00397                                 v_last = v_last->prev;
00398                                 delete v_last->next;
00399                                 v_last->next = NULL;
00400                                 --v_fcount;
00401                                 return VETRET_OK;
00402                          }
00403 
00404                         frameNode* iterFrame;
00405                         iterFrame = v_first->next;
00406                         while ( iterFrame  )
00407                          {
00408                                 if ( iterFrame->data == frameToDelete )
00409                                  {
00410                                         if ( freeData )
00411                                                 delete frameToDelete;
00412 
00413                                         iterFrame->data = NULL;
00414                                         iterFrame->prev->next = iterFrame->next;
00415                                         iterFrame->next->prev = iterFrame->prev;
00416 
00417                                         delete iterFrame;
00418                                         --v_fcount;
00419 
00420                                         return VETRET_OK;
00421                                  }
00422                                 iterFrame = iterFrame->next;
00423                          }
00424 
00425                         return VETRET_FRAME_NOT_FOUND;
00426 
00427                  }
00428 
00437                 VETRESULT removeFrame(long index, bool freeData = false)
00438                  {
00439                         if ( v_fcount == 0)
00440                                 return VETRET_ILLEGAL_USE;
00441 
00442                         if ( index >= v_fcount)
00443                                 return VETRET_PARAM_ERR;
00444 
00445                         if ( index == 0)
00446                          {
00447                                 v_first->next = v_first;
00448                                 delete v_first->prev;
00449                                 v_first->prev = NULL;
00450                                 return VETRET_OK;
00451                          }
00452                         else if ( index == v_fcount-1)
00453                          {
00454                                 v_last->prev = v_last;
00455                                 delete v_last->next;
00456                                 v_last->next = NULL;
00457                                 return VETRET_OK;
00458                          }
00459 
00460 
00461                         frameNode* iterFrame;
00462                         iterFrame = v_first->next;
00463                         long i = 0;
00464                         while ( iterFrame  )
00465                          {
00466                                 if ( i == index )
00467                                  {
00468                                         if ( freeData )
00469                                                 delete iterFrame->data;
00470 
00471                                         iterFrame->data = NULL;
00472                                         iterFrame->prev->next = iterFrame->next;
00473                                         iterFrame->next->prev = iterFrame->prev;
00474 
00475                                         delete iterFrame;
00476                                         --v_fcount;
00477 
00478                                         return VETRET_OK;
00479                                  }
00480                                 iterFrame = iterFrame->next;
00481                                 i++;
00482                          }
00483 
00484                         return VETRET_FRAME_NOT_FOUND;
00485                  }
00486 
00492                 T* getCurrentFrame()
00493                  {
00494                         if ( v_fcount == 0)
00495                                 throw "Video is Empty.";
00496 
00497                         return v_current->data;
00498                  }
00499 
00505                 T* getPreviousFrame()
00506                  {
00507                         if ( v_fcount == 0)
00508                                 throw "Video is Empty.";
00509 
00510                                 if ( v_current->prev == NULL )
00511                                 throw "Out of range.";
00512 
00513                         return v_current->prev->data;
00514 
00515                  }
00516 
00522                 T* getNextFrame()
00523                  {
00524                         if ( v_fcount == 0)
00525                                 throw "Video is Empty.";
00526 
00527                                 if ( v_current->next == NULL )
00528                                 throw "Out of range.";
00529 
00530                         return v_current->next->data;
00531 
00532                  }
00533 
00539                 T* getFirstFrame()
00540                  {
00541                         if ( v_fcount == 0)
00542                                 throw "Video is Empty.";
00543 
00544                         return v_first->data;
00545                  }
00546 
00547 
00553                 T* getLastFrame()
00554                  {
00555                         if ( v_fcount == 0)
00556                                 throw "Video is Empty.";
00557 
00558                         return v_last->data;
00559                  }
00560 
00566                 long getCurrentFrameIndex() const
00567                  {
00568                                 frameNode* iterFrame;
00569                                 iterFrame = v_first;
00570                                 long i = 0;
00571                                 while ( iterFrame  )
00572                                  {
00573                                         if ( iterFrame->data == v_current->data )
00574                                                 return i;
00575 
00576                                         iterFrame = iterFrame->next;
00577                                         i++;
00578                                  }
00579 
00580                         return -1;
00581                  }
00582 
00583 
00591                 T* getFrame(long index)
00592                  {
00593                         if ( v_fcount == 0)
00594                                 throw "Video is Empty.";
00595 
00596                         if ( index < 0 || index >= v_fcount )
00597                                 throw "Out of range";
00598 
00599                         long distEnd = v_fcount - index;
00600 
00601                         if ( index < distEnd )
00602                          {
00603 
00604                                 frameNode* iterFrame;
00605                                 iterFrame = v_first;
00606                                 long i = 0;
00607                                 while ( iterFrame  )
00608                                  {
00609                                         if ( i == index )
00610                                                 return iterFrame->data;
00611 
00612                                         iterFrame = iterFrame->next;
00613                                         i++;
00614                                  }
00615 
00616                          }
00617                         else
00618                          {
00619                                 frameNode* iterFrame;
00620                                 iterFrame = v_last;
00621                                 long i = v_fcount-1;
00622                                 while ( iterFrame  )
00623                                  {
00624                                         if ( i == index )
00625                                                 return iterFrame->data;
00626                                         iterFrame = iterFrame->prev;
00627                                         i--;
00628                                  }
00629 
00630                          }
00631 
00632                         throw "Index not found, internal error.";
00633                  }
00634 
00641                 VETRESULT goToNextFrame()
00642                  {
00643                         if ( v_fcount == 0)
00644                                 return VETRET_ILLEGAL_USE;
00645 
00646                         if ( v_current->next == NULL )
00647                                 return VETRET_ILLEGAL_USE;
00648 
00649                                 v_current = v_current->next;
00650 
00651                         return VETRET_OK;
00652                  }
00653 
00660                 VETRESULT goToPreviousFrame()
00661                  {
00662                         if ( v_fcount == 0)
00663                                 return VETRET_ILLEGAL_USE;
00664 
00665                         if ( v_current->prev == NULL )
00666                                 return VETRET_ILLEGAL_USE;
00667 
00668                         v_current = v_current->prev;
00669 
00670                         return VETRET_OK;
00671                  }
00672 
00678                 VETRESULT goToFirstFrame()
00679                  {
00680                         if ( v_fcount == 0)
00681                                 return VETRET_ILLEGAL_USE;
00682 
00683                         v_current = v_first;
00684 
00685                         return VETRET_OK;
00686                  }
00687 
00693                 VETRESULT goToLastFrame()
00694                  {
00695                         if ( v_fcount == 0)
00696                                 return VETRET_ILLEGAL_USE;
00697 
00698                         v_current = v_last;
00699 
00700                         return VETRET_OK;
00701                  }
00702 
00711                 VETRESULT goToFrame(long index)
00712                  {
00713                         if ( v_fcount == 0)
00714                                 return VETRET_ILLEGAL_USE;
00715 
00716                         if ( index < 0 || index >= v_fcount )
00717                                 return VETRET_PARAM_ERR;
00718 
00719                         long distEnd = v_fcount - index;
00720 
00721                         if ( index < distEnd )
00722                          {
00723                                 frameNode* iterFrame;
00724                                 iterFrame = v_first;
00725                                 long i = 0;
00726                                 while ( iterFrame  )
00727                                  {
00728                                         if ( i == index )
00729                                          {
00730                                                 v_current = iterFrame;
00731                                                 return VETRET_OK;
00732                                          }
00733                                         iterFrame = iterFrame->next;
00734                                         i++;
00735                                  }
00736 
00737                          }
00738                         else
00739                          {
00740                                 frameNode* iterFrame;
00741                                 iterFrame = v_last;
00742                                 long i = v_fcount-1;
00743                                 while ( iterFrame  )
00744                                  {
00745                                         if ( i == index )
00746                                          {
00747                                                 v_current = iterFrame;
00748                                                 return VETRET_OK;
00749                                          }
00750                                         iterFrame = iterFrame->prev;
00751                                         i--;
00752                                  }
00753 
00754                          }
00755 
00756                         return VETRET_INTERNAL_ERR;
00757                  }
00758 
00767                 VETRESULT goToStepFrame(long offset)
00768                  {
00769                         if ( v_fcount == 0 || offset == 0 )
00770                                 return VETRET_ILLEGAL_USE;
00771 
00772                         if ( offset >= v_fcount  || offset <= -v_fcount )
00773                                 return VETRET_PARAM_ERR;
00774 
00775                         frameNode* iterFrame;
00776                         iterFrame = v_current;
00777 
00778                         if ( offset > 0 )
00779                          {
00780                                 long i = 0;
00781                                 while ( iterFrame  )
00782                                  {
00783                                         if ( i == offset )
00784                                          {
00785                                                 v_current = iterFrame;
00786                                                 return VETRET_OK;
00787                                          }
00788                                         iterFrame = iterFrame->next;
00789                                         i++;
00790                                  }
00791 
00792                          }
00793                         else
00794                          {
00795                                 long i = v_fcount-1;
00796                                 while ( iterFrame  )
00797                                  {
00798                                         if ( i == offset )
00799                                          {
00800                                                 v_current = iterFrame;
00801                                                 return VETRET_OK;
00802                                          }
00803                                         iterFrame = iterFrame->prev;
00804                                         i--;
00805                                  }
00806 
00807                          }
00808 
00809                         return VETRET_INTERNAL_ERR;
00810                  }
00811 
00812 
00813 
00814 
00815 
00816  };
00817 
00818 
00819 #endif /* __VETLIB_VETBUFFERLINK_H__ */
00820 

Generated on Tue Jan 24 11:58:58 2006 for VETLib by  doxygen 1.4.4