zlist.hb 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. #ifndef _ZLIST_HPP_
  2. #define _ZLIST_HPP_
  3. #include <assert.h>
  4. #include <array>
  5. #include "point.h"
  6. NAMESPACE_POINT_BEGIN(NAMESPACE_POINT)
  7. template<typename T,int SIZE>
  8. struct zlist
  9. {
  10. std::array<T,SIZE>*buf;
  11. uint32_t bpos;
  12. uint32_t epos;
  13. zlist()
  14. :buf(nullptr)
  15. ,bpos(0)
  16. ,epos(0)
  17. {
  18. buf=new std::array<T,SIZE>();
  19. }
  20. ~zlist()
  21. {
  22. delete buf;
  23. }
  24. void clear()
  25. {
  26. bpos=epos;
  27. }
  28. int index(uint32_t p)const
  29. {
  30. return p&(SIZE-1);
  31. }
  32. void push(const T&o)
  33. {
  34. if(size()>=SIZE) skip(1);
  35. buf->at(index(epos++))=o;
  36. }
  37. void rpush(const T&o)
  38. {
  39. if(size()>=SIZE) rskip(1);
  40. buf->at(index(--bpos))=o;
  41. }
  42. T& grow()
  43. {
  44. if(size()>=SIZE) skip(1);
  45. ++epos;
  46. return rat(0);
  47. }
  48. T& rgrow()
  49. {
  50. if(size()>=SIZE) rskip(1);
  51. --bpos;
  52. return at(0);
  53. }
  54. template<typename Pred>
  55. int find_if(const Pred&p)const
  56. {
  57. for(int i=0,len=size();i<len;i++)
  58. {
  59. if(p((*this)[i]))
  60. return i;
  61. }
  62. return -1;
  63. }
  64. template<typename Pred>
  65. int find_last_if(const Pred&p)const
  66. {
  67. for(int i=0,len=size();i<len;i++)
  68. {
  69. if(p((*this)(i)))
  70. {
  71. return len-i-1;
  72. }
  73. }
  74. return -1;
  75. }
  76. template<typename Pred>
  77. void skip_if(const Pred&p)
  78. {
  79. while(!empty())
  80. {
  81. if(!p(at(0)))
  82. break;
  83. skip(1);
  84. }
  85. }
  86. template<typename Pred>
  87. void for_each(const Pred&p)
  88. {
  89. for(unsigned i=bpos;i<epos;i++)
  90. p(buf->at(index(i)));
  91. }
  92. void skip(int count)
  93. {
  94. assert(count<=(int)size());
  95. bpos+=count;
  96. }
  97. void rskip(int count)
  98. {
  99. assert(count<=(int)size());
  100. epos-=count;
  101. }
  102. bool empty()const
  103. {
  104. return epos==bpos;
  105. }
  106. int size()const
  107. {
  108. return epos-bpos;
  109. }
  110. T&at(int i)
  111. {
  112. assert(i<(int)size());
  113. return buf->at(index(bpos+i));
  114. }
  115. const T&at(int i) const
  116. {
  117. assert(i<(int)size());
  118. return buf->at(index(bpos+i));
  119. }
  120. T&rat(int i)
  121. {
  122. assert(i<(int)size());
  123. return buf->at(index(epos-i-1));
  124. }
  125. const T&rat(int i) const
  126. {
  127. assert(i<(int)size());
  128. return buf->at(index(epos-i-1));
  129. }
  130. T&operator[](int i)
  131. {
  132. return at(i);
  133. }
  134. const T&operator[](int i) const
  135. {
  136. return at(i);
  137. }
  138. T&operator()(int i)
  139. {
  140. return rat(i);
  141. }
  142. const T&operator()(int i) const
  143. {
  144. return rat(i);
  145. }
  146. };
  147. NAMESPACE_POINT_END(NAMESPACE_POINT)
  148. #endif