cvutSeq.h
上传用户:jiayuled
上传日期:2020-03-04
资源大小:9338k
文件大小:6k
源码类别:

OpenCV

开发平台:

C/C++

  1. #ifndef CVUT_SEQ_H
  2. #define CVUT_SEQ_H
  3. #include "cv.h"
  4. #include "highgui.h"
  5. #include <string>
  6. #include <iostream>
  7. using namespace std;
  8. namespace cvutSeq {
  9. /************************************************************************
  10. Seq
  11. *************************************************************************/
  12. template <typename T>
  13. class Seq {
  14. public:
  15. CvSeq* cvseq;
  16. CvMemStorage* storage;
  17. int is_sorted;
  18. public:
  19. /************************************************************************
  20.        constructor
  21. *************************************************************************/
  22. Seq(int seq_length = 0,int flag = 0) { 
  23. storage = cvCreateMemStorage(MAX(sizeof(T)*seq_length,1<<16));
  24. cvseq = cvCreateSeq(flag,sizeof(CvSeq),sizeof(T),storage);
  25. is_sorted=0;
  26. };
  27. Seq(Seq<T>& src) {
  28. cvReleaseMemStorage(&storage);
  29. cvseq = cvCloneSeq(src.cvseq,storage);
  30. is_sorted=0;
  31. };
  32. /************************************************************************
  33.        deconstructor
  34. *************************************************************************/
  35. ~Seq(){
  36. cvReleaseMemStorage(&storage);
  37. cvseq = NULL;
  38. };
  39. /************************************************************************
  40.        access seq element
  41. *************************************************************************/
  42. T& operator [](int index){
  43. if (index<0 || index>=cvseq->total) {
  44. cout<<"seq access out of range!n";
  45. exit(1);
  46. }
  47. return *(T*)cvGetSeqElem(cvseq,index);
  48. };
  49. /***********************************************************************
  50.        whether seq is empty
  51. ***********************************************************************/
  52. bool empty() {
  53. return (cvseq->total == 0)?true:false;
  54. }
  55. /************************************************************************
  56.        get the length of the seq
  57. *************************************************************************/
  58. int length(){
  59. return cvseq->total;
  60. };
  61. /************************************************************************
  62.        remove all elements in the seq
  63. *************************************************************************/
  64. void clear(){
  65. cvClearSeq(cvseq);
  66. };
  67. /************************************************************************
  68.        add an element at rear
  69. *************************************************************************/
  70. void push_back(T elem){
  71. cvSeqPush(cvseq,(void*)&elem);
  72. };
  73. /************************************************************************
  74.        add some elements at rear
  75. *************************************************************************/
  76. void push_back(T* src = NULL,int num = 0) {
  77. if (src != NULL) {
  78. cvSeqPushMulti(cvseq,(void*)src,num);
  79. }
  80. };
  81. /************************************************************************
  82.        remove the last element in the seq
  83. *************************************************************************/
  84. bool pop_back(){
  85. if (cvseq->total <= 0) {
  86. cout<<"Seq is empty! fail to pop back!n";
  87. return false;
  88. }
  89. cvSeqPop(cvseq);
  90. return true;
  91. };
  92. /************************************************************************
  93.        add an element at head
  94. *************************************************************************/
  95. void push_front(T elem) {
  96. cvSeqPushFront(cvseq,(void*)&elem);
  97. };
  98. /************************************************************************
  99.        remove an element at head
  100. *************************************************************************/
  101. bool pop_front() {
  102. if (cvseq->total <= 0) {
  103. cout<<"Seq is empty! fail to pop front!n";
  104. return false;
  105. }
  106. cvSeqPopFront(cvseq,NULL);
  107. return true;
  108. };
  109. /************************************************************************
  110.        insert at any position in the seq
  111. *************************************************************************/
  112. bool insert(int index,T elem) {
  113. if (index<0 || index>=cvseq->total) {
  114. cout<<"out of range! fail to insert!n";
  115. return false; 
  116. }
  117. cvSeqInsert(cvseq,index,(void*)&elem);
  118. return true;
  119. };
  120. /************************************************************************
  121.        remove an element at any position
  122. *************************************************************************/
  123. bool remove(int index) {
  124. if (cvseq->total < index+1) {
  125. cout<<"index out of range! fail to removen";
  126. return false;
  127. }
  128. cvSeqRemove(cvseq,index);
  129. return true;
  130. };
  131. /************************************************************************
  132.        invert the seq
  133. *************************************************************************/
  134. void reverse() {
  135. cvSeqInvert(cvseq);
  136. };
  137. /************************************************************************
  138.    sort seq
  139. *************************************************************************/
  140. static int cmp_func( const void* a, const void* b, void* userdata ) {
  141. return *(T*)a < *(T*)b ? -1 : *(T*)a > *(T*)b ? 1 : 0;
  142. };
  143. void sort() {
  144. cvSeqSort(cvseq,cmp_func);
  145. is_sorted=1;
  146. };
  147. /************************************************************************
  148.        search seq
  149. *************************************************************************/
  150. int find(T elem) {
  151. int index=-1;
  152. cvSeqSearch(cvseq,(void*)&elem,cmp_func,is_sorted,&index);
  153. return index;
  154. };
  155. }; /* class Seq */
  156. /************************************************************************
  157.        output seq
  158. *************************************************************************/
  159. template <typename T>
  160. ostream& operator << (ostream& out,Seq<T>& seq) {
  161. out<<'{';
  162. for (int i=0;i<seq.cvseq->total;i++) {
  163. out<<seq[i]<<' ';
  164. }
  165. out<<'}';
  166. return out;
  167. };
  168. } /* namespace cvutSeq */
  169. #endif /* CVUT_SEQ_H */