Mem List.cpp 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. /******************************************************************************/
  2. #include "stdafx.h"
  3. namespace EE{
  4. /******************************************************************************/
  5. void _Meml::del()
  6. {
  7. clear();
  8. }
  9. void _Meml::clear()
  10. {
  11. for(MemlNode *node=first(), *next; node; node=next)
  12. {
  13. next=node->next();
  14. if(_del)_del(node->data());
  15. Free(node);
  16. }
  17. _first=_last=null;
  18. _elms=0;
  19. }
  20. void _Meml::setNum(Int num)
  21. {
  22. MAX(num, 0);
  23. for(; _elms>num; )removeLast();
  24. for(; _elms<num; )add ();
  25. }
  26. void _Meml::setNumZero(Int num)
  27. {
  28. MAX(num, 0);
  29. for(; _elms>num; )removeLast();
  30. for(; _elms<num; )addZero ();
  31. }
  32. Int _Meml::addNum(Int num) {Int index=elms(); setNum(elms()+num); return index;}
  33. /******************************************************************************/
  34. Ptr _Meml::New ( ) {return add()->data();}
  35. Ptr _Meml::NewAt(Int i)
  36. {
  37. if(i>=elms())return New();
  38. MemlNode *node=first(); REPD(j, i)node=node->next();
  39. return addBefore(node)->data();
  40. }
  41. /******************************************************************************/
  42. MemlNode* _Meml::add()
  43. {
  44. MemlNode *node=(MemlNode*)Alloc<Byte>(SIZE(MemlNode)+_elm_size);
  45. if(_last)_last->_next=node;else _first=node;
  46. node->_prev=_last;
  47. node->_next= null;
  48. _last=node;
  49. _elms++;
  50. if(_new)_new(node->data());
  51. return node;
  52. }
  53. MemlNode* _Meml::addZero()
  54. {
  55. MemlNode *node=(MemlNode*)AllocZero<Byte>(SIZE(MemlNode)+_elm_size);
  56. if(_last)_last->_next=node;else _first=node;
  57. node->_prev=_last;
  58. node->_next= null;
  59. _last=node;
  60. _elms++;
  61. if(_new)_new(node->data());
  62. return node;
  63. }
  64. MemlNode* _Meml::addBefore(MemlNode *x)
  65. {
  66. if(!x)return null;
  67. MemlNode *node=(MemlNode*)Alloc<Byte>(SIZE(MemlNode)+_elm_size);
  68. if(x->_prev)x->_prev->_next=node;else _first=node;
  69. node->_next=x;
  70. node->_prev=x->_prev;
  71. x ->_prev=node;
  72. _elms++;
  73. if(_new)_new(node->data());
  74. return node;
  75. }
  76. MemlNode* _Meml::addAfter(MemlNode *x)
  77. {
  78. if(!x)return null;
  79. MemlNode *node=(MemlNode*)Alloc<Byte>(SIZE(MemlNode)+_elm_size);
  80. if(x->_next)x->_next->_prev=node;else _last=node;
  81. node->_prev=x;
  82. node->_next=x->_next;
  83. x ->_next=node;
  84. _elms++;
  85. if(_new)_new(node->data());
  86. return node;
  87. }
  88. void _Meml::remove(MemlNode *node, Bool keep_order)
  89. {
  90. if(node)
  91. {
  92. if(_del)_del(node->data());
  93. _elms--;
  94. if(_first==node)_first= node->_next;
  95. if(_last ==node)_last = node->_prev;
  96. if( node->_prev) node->_prev->_next=node->_next;
  97. if( node->_next) node->_next->_prev=node->_prev;
  98. Free(node);
  99. }
  100. }
  101. void _Meml::removeData(CPtr elm, Bool keep_order)
  102. {
  103. if(elm)remove( (MemlNode*) ( ((Byte*)elm)-SIZE(MemlNode) ) );
  104. }
  105. void _Meml::removeIndex(Int i, Bool keep_order)
  106. {
  107. if(Ptr data=T[i])removeData(data);
  108. }
  109. /******************************************************************************/
  110. Int _Meml::index(CPtr elm)C
  111. {
  112. Int j=0; if(elm)MFREP(T){if(i->data()==elm)return j; j++;}
  113. return -1;
  114. }
  115. Ptr _Meml::_element(Int j)C
  116. {
  117. if(InRange(j, _elms))
  118. {
  119. if( j<(_elms>>1)){MFREP(T)if(!j--)return i->data();} // first half
  120. else{j= _elms-j-1; MREP(T)if(!j--)return i->data();} // second half
  121. }
  122. return null;
  123. }
  124. Ptr _Meml::operator()(Int i)
  125. {
  126. if(i< 0 )Exit("i<0 inside _Meml.operator()(Int i)");
  127. if(i>=elms())setNumZero(i+1);
  128. return T[i];
  129. }
  130. /******************************************************************************/
  131. void _Meml::copyTo ( Ptr dest)C {if(dest)MFREP(T){CopyFast(dest, i->data(), _elm_size); dest=(Byte*)dest+_elm_size;}}
  132. void _Meml::copyFrom(CPtr src ) { MFREP(T){Copy (i->data(), src , _elm_size); if(src)src =(Byte*)src +_elm_size;}}
  133. /******************************************************************************/
  134. void _Meml::reverseOrder()
  135. {
  136. for(MemlNode *node=first(); node; )
  137. {
  138. MemlNode *next=node->next();
  139. Swap(node->_prev, node->_next);
  140. node=next;
  141. }
  142. Swap(_first, _last);
  143. }
  144. void _Meml::swapOrder(Int i, Int j)
  145. {
  146. if(InRange(i, elms()) && InRange(j, elms()) && i!=j)
  147. {
  148. if(i>j)Swap(i, j); // make i<j
  149. MemlNode *a=null, *b; // these initializations are not needed but kept to avoid compile warnings
  150. Int index=0; MFREPD(node, T)
  151. {
  152. if(i==index)a=node;else // 'i' is 1st
  153. if(j==index) // 'j' is 2nd (now we already have 'a')
  154. {
  155. b=node;
  156. if(_first==a)_first=b;
  157. if(_last ==b)_last =a;
  158. if(a->_prev)a->_prev->_next=b; // the one before 'a' now should point to 'b'
  159. if(b->_next)b->_next->_prev=a; // the one after 'b' now should point to 'a'
  160. if(a->_next==b) // watch out if 'a' and 'b' are neighbors
  161. {
  162. a->_next=b->_next;
  163. b->_prev=a->_prev;
  164. b->_next=a;
  165. a->_prev=b;
  166. }else
  167. {
  168. a->_next->_prev=b; // the one after 'a' now should point to 'b'
  169. b->_prev->_next=a; // the one before 'b' now should point to 'a'
  170. Swap(a->_prev, b->_prev);
  171. Swap(a->_next, b->_next);
  172. }
  173. return;
  174. }
  175. index++;
  176. }
  177. }
  178. }
  179. /******************************************************************************/
  180. Bool _Meml::saveRaw(File &f)C
  181. {
  182. f.cmpUIntV(elms()); MFREP(T)f.put(i->data(), elmSize());
  183. return f.ok();
  184. }
  185. Bool _Meml::loadRaw(File &f)
  186. {
  187. setNum(f.decUIntV()); MFREP(T)f.getFast(i->data(), elmSize());
  188. if(f.ok())return true;
  189. clear(); return false;
  190. }
  191. /******************************************************************************/
  192. }
  193. /******************************************************************************/