Mem Continuous.cpp 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. /******************************************************************************/
  2. #include "stdafx.h"
  3. namespace EE{
  4. /******************************************************************************/
  5. void _Memc::_reset(Int elm_size, void (*_new)(Ptr elm), void (*_del)(Ptr elm))
  6. {
  7. T.~_Memc();
  8. new(this)_Memc(elm_size, _new, _del);
  9. }
  10. _Memc::_Memc(Int elm_size, void (*_new)(Ptr elm), void (*_del)(Ptr elm))
  11. {
  12. T._elms =0;
  13. T._elm_size=elm_size;
  14. T._max_elms=0;
  15. T._data =null;
  16. T._new =_new;
  17. T._del =_del;
  18. }
  19. /******************************************************************************/
  20. void _Memc::del()
  21. {
  22. clear();
  23. Free (_data);
  24. _max_elms=0;
  25. }
  26. void _Memc::clear()
  27. {
  28. if(_del)REPA(T)_del(T[i]);
  29. _elms=0;
  30. }
  31. /******************************************************************************/
  32. void _Memc::reserve(Int num)
  33. {
  34. if(num>_max_elms)
  35. {
  36. if(!initialized())Exit("Attempting to create an object of zero size in 'Memc' container.\nThe container is not initialized or it is abstract and 'replaceClass' hasn't been called.");
  37. _max_elms=CeilPow2(num);
  38. _Realloc(_data, _max_elms*elmSize(), elms()*elmSize());
  39. }
  40. }
  41. void _Memc::setNum(Int num)
  42. {
  43. MAX(num, 0);
  44. if (num>elms()) // add elements
  45. {
  46. reserve(num);
  47. Int old_elms=elms(); _elms=num; // set '_elms' before accessing new elements to avoid range assert
  48. if(_new)for(Int i=old_elms; i<elms(); i++)_new(T[i]);
  49. }else
  50. if(num<elms()) // remove elements
  51. {
  52. if(_del)for(Int i=elms(); --i>=num; )_del(T[i]);
  53. _elms=num; // set '_elms' after accessing new elements to avoid range assert
  54. }
  55. }
  56. void _Memc::setNumZero(Int num)
  57. {
  58. MAX(num, 0);
  59. if (num>elms()) // add elements
  60. {
  61. reserve(num);
  62. Int old_elms=elms(); _elms=num; // set '_elms' before accessing new elements to avoid range assert
  63. Zero(T[old_elms], elmSize()*(elms()-old_elms));
  64. if(_new)for(Int i=old_elms; i<elms(); i++)_new(T[i]);
  65. }else
  66. if(num<elms()) // remove elements
  67. {
  68. if(_del)for(Int i=elms(); --i>=num; )_del(T[i]);
  69. _elms=num; // set '_elms' after accessing new elements to avoid range assert
  70. }
  71. }
  72. /******************************************************************************/
  73. Int _Memc::addNum (Int num) {Int index=elms(); setNum (elms()+num); return index;}
  74. Int _Memc::addNumZero(Int num) {Int index=elms(); setNumZero(elms()+num); return index;}
  75. /******************************************************************************/
  76. Ptr _Memc::NewAt(Int i)
  77. {
  78. Clamp(i, 0, elms());
  79. Int old_elms=elms(); _elms++; // increase '_elms' before accessing new elements to avoid range assert
  80. if(elms()>_max_elms)
  81. {
  82. _max_elms=CeilPow2(elms());
  83. Ptr temp=Alloc(_max_elms*elmSize()); // copy everything to a new buffer
  84. CopyFast((Byte*)temp , T[0], i *elmSize());
  85. CopyFast((Byte*)temp+(i+1)*elmSize(), T[i], (old_elms-i)*elmSize());
  86. Free(_data); _data=temp;
  87. }else
  88. if(i<old_elms)
  89. {
  90. MoveFast(T[i+1], T[i], (old_elms-i)*elmSize());
  91. }
  92. Ptr elm=T[i]; if(_new)_new(elm); return elm;
  93. }
  94. void _Memc::removeLast()
  95. {
  96. if(elms())
  97. {
  98. if(_del)_del(T[elms()-1]);
  99. _elms--;
  100. }
  101. }
  102. void _Memc::remove(Int i, Bool keep_order)
  103. {
  104. if(InRange(i, T))
  105. {
  106. if(_del)_del(T[i]);
  107. if(i<elms()-1)
  108. {
  109. if(keep_order)MoveFast(T[i], T[ i+1], elmSize()*(elms()-1-i));
  110. else CopyFast(T[i], T[elms()-1], elmSize());
  111. }
  112. _elms--;
  113. }
  114. }
  115. void _Memc::removeNum(Int i, Int n, Bool keep_order)
  116. {
  117. if(i<0){n+=i; i=0;} // if 'i' is before the start, then move it to start and reduce number of elements to remove
  118. if(n>0 && InRange(i, T)) // if we want to remove elements and the index fits
  119. {
  120. MIN(n, elms()-i); // minimize what we can actually remove
  121. if(_del)REPD(j, n)_del(T[i+j]); // delete those elements
  122. if(i<elms()-n) // if there are any elements after those being removed
  123. {
  124. if(keep_order)MoveFast(T[i], T[ i+n], elmSize()*(elms()-n-i));else // move all elements after i(+n) to left
  125. {Int m=Min(n, elms()-i-n); CopyFast(T[i], T[elms()-m], elmSize()* m );} // move last m elements to i-th
  126. }
  127. _elms-=n;
  128. }
  129. }
  130. void _Memc::removeData(CPtr elm, Bool keep_order)
  131. {
  132. remove(index(elm), keep_order);
  133. }
  134. /******************************************************************************/
  135. Ptr _Memc::operator()(Int i)
  136. {
  137. if(i< 0 )Exit("i<0 inside _Memc.operator()(Int i)");
  138. if(i>=elms())setNumZero(i+1);
  139. return T[i];
  140. }
  141. /******************************************************************************/
  142. Int _Memc::index(CPtr elm)C
  143. {
  144. UIntPtr i=UIntPtr(elm)-UIntPtr(data());
  145. if(i<UIntPtr(elms()*elmSize()))return i/elmSize(); // unsigned compare will already guarantee "i>=0 && "
  146. return -1;
  147. }
  148. /******************************************************************************/
  149. Bool _Memc::binarySearch(CPtr value, Int &index, Int compare(CPtr a, CPtr b))C {return _BinarySearch(data(), elms(), elmSize(), value, index, compare);}
  150. void _Memc:: sort(Int compare(CPtr a, CPtr b)) { _Sort(data(), elms(), elmSize(), compare );}
  151. void _Memc:: reverseOrder( ) { _ReverseOrder(data(), elms(), elmSize() );}
  152. void _Memc::randomizeOrder( ) {_RandomizeOrder(data(), elms(), elmSize() );}
  153. void _Memc:: rotateOrder(Int offset ) { _RotateOrder(data(), elms(), elmSize(), offset );}
  154. void _Memc:: moveElm (Int elm, Int new_index ) { _MoveElm (data(), elms(), elmSize(), elm, new_index);}
  155. void _Memc:: swapOrder(Int i , Int j ) {if(InRange(i, T) && InRange(j, T))Swap(T[i], T[j], elmSize());}
  156. void _Memc::moveElmLeftUnsafe(Int elm, Int new_index, Ptr temp) {_MoveElmLeftUnsafe(data(), elmSize(), elm, new_index, temp);}
  157. /******************************************************************************/
  158. void _Memc::copyTo ( Ptr dest)C {Copy(dest , data(), elms()*elmSize());}
  159. void _Memc::copyFrom(CPtr src ) {Copy(data(), src , elms()*elmSize());}
  160. /******************************************************************************
  161. void _Memc::copyRaw(_Memc &dest)
  162. {
  163. if(this!=&dest)
  164. {
  165. dest.del();
  166. dest._elms =_elms;
  167. dest._elm_size=_elm_size;
  168. dest._max_elms=_elms;
  169. dest._new =_new ;
  170. dest._del =_del ;
  171. dest._data = Alloc(_elms*_elm_size);
  172. CopyFast(dest._data, _data, _elms*_elm_size);
  173. }
  174. }
  175. /******************************************************************************/
  176. Bool _Memc::saveRaw(File &f)C
  177. {
  178. f.cmpUIntV(elms());
  179. f.put (data(), elms()*elmSize());
  180. return f.ok();
  181. }
  182. Bool _Memc::loadRaw(File &f)
  183. {
  184. setNum(f.decUIntV());
  185. f.getFast(data(), elms()*elmSize());
  186. if(f.ok())return true;
  187. clear(); return false;
  188. }
  189. Bool _Memc::_saveRaw(File &f)C
  190. {
  191. f.putInt(elms());
  192. f.put (data(), elms()*elmSize());
  193. return f.ok();
  194. }
  195. Bool _Memc::_loadRaw(File &f)
  196. {
  197. setNum(f.getInt());
  198. f.getFast(data(), elms()*elmSize());
  199. if(f.ok())return true;
  200. clear(); return false;
  201. }
  202. /******************************************************************************/
  203. // MEMC THREAD SAFE
  204. /******************************************************************************/
  205. _MemcThreadSafe::_MemcThreadSafe(Int elm_size, void (*_new)(Ptr elm), void (*_del)(Ptr elm)) : _memc(elm_size, _new, _del) {}
  206. void _MemcThreadSafe::clear() {SyncLocker locker(_lock); _memc.clear();}
  207. void _MemcThreadSafe::del () {SyncLocker locker(_lock); _memc.del ();}
  208. Int _MemcThreadSafe::index(CPtr elm)C {SyncLocker locker(_lock); return _memc.index(elm);}
  209. void _MemcThreadSafe::removeLast( ) {SyncLocker locker(_lock); _memc.removeLast( );}
  210. void _MemcThreadSafe::remove (Int i , Bool keep_order) {SyncLocker locker(_lock); _memc.remove (i , keep_order);}
  211. void _MemcThreadSafe::removeData(CPtr elm, Bool keep_order) {SyncLocker locker(_lock); _memc.removeData(elm, keep_order);}
  212. void _MemcThreadSafe::setNum (Int num) {SyncLocker locker(_lock); _memc.setNum (num);}
  213. void _MemcThreadSafe::setNumZero(Int num) {SyncLocker locker(_lock); _memc.setNumZero(num);}
  214. Int _MemcThreadSafe::addNum (Int num) {SyncLocker locker(_lock); return _memc.addNum (num);}
  215. Bool _MemcThreadSafe::binarySearch(CPtr value, Int &index, Int compare(CPtr a, CPtr b))C {SyncLocker locker(_lock); return _memc.binarySearch(value, index, compare);}
  216. void _MemcThreadSafe:: sort(Int compare(CPtr a, CPtr b)) {SyncLocker locker(_lock); _memc. sort(compare );}
  217. void _MemcThreadSafe:: reverseOrder( ) {SyncLocker locker(_lock); _memc. reverseOrder( );}
  218. void _MemcThreadSafe::randomizeOrder( ) {SyncLocker locker(_lock); _memc.randomizeOrder( );}
  219. void _MemcThreadSafe:: rotateOrder(Int offset ) {SyncLocker locker(_lock); _memc. rotateOrder(offset );}
  220. void _MemcThreadSafe:: swapOrder(Int i , Int j ) {SyncLocker locker(_lock); _memc. swapOrder(i, j );}
  221. void _MemcThreadSafe:: moveElm (Int elm, Int new_index ) {SyncLocker locker(_lock); _memc. moveElm (elm, new_index);}
  222. /******************************************************************************/
  223. }
  224. /******************************************************************************/