Guest User

Untitled

a guest
Mar 23rd, 2018
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.08 KB | None | 0 0
  1. template<class T> void inline system_alloc(T*&ptr, size_t count) {
  2. ptr = (T*)realloc(ptr, count * sizeof(T));
  3. assert(ptr || count == 0);
  4. }
  5.  
  6. struct DefaultCtrNoCopy { // Thanks mmozeiko!
  7. DefaultCtrNoCopy() = default;
  8. DefaultCtrNoCopy(DefaultCtrNoCopy const&) = delete;
  9. DefaultCtrNoCopy& operator=(DefaultCtrNoCopy const&) = delete;
  10. };
  11.  
  12. template<typename T> struct DLList:DefaultCtrNoCopy {
  13. struct Wrapper {
  14. Wrapper*prev = 0;
  15. Wrapper*next = 0;
  16. T wrapped; };
  17. Wrapper*first = 0;
  18. Wrapper*last = 0;
  19.  
  20. inline auto insert_after(Wrapper*item, Wrapper*new_item) {
  21. new_item->prev = item;
  22. new_item->next = item->next;
  23. if (item->next) item->next->prev = new_item;
  24. else last = new_item;
  25. item->next = new_item;
  26. return new_item; }
  27. inline auto insert_before(Wrapper*item, Wrapper*new_item) {
  28. new_item->next = item;
  29. new_item->prev = item->prev;
  30. if (item->prev) item->prev->next = new_item;
  31. else first = new_item;
  32. item->prev = new_item;
  33. return new_item; }
  34. inline auto remove(Wrapper*item) {
  35. if (item->prev) item->prev->next = item->next;
  36. else first = item->next;
  37. if (item->next) item->next->prev = item->prev;
  38. else first = item->prev; }
  39.  
  40. inline auto append(Wrapper*new_item) {
  41. if (first) {
  42. return insert_after(last, new_item);
  43. } else {
  44. assert(!last);
  45. first = last = new_item;
  46. first->prev = 0;
  47. first->next = 0;
  48. return first;
  49. }
  50. }
  51. inline auto append() { return append(new Wrapper()); }
  52. inline auto append(T v) {
  53. auto ret = append();
  54. ret->wrapped = v;
  55. return ret;
  56. }
  57.  
  58. inline ~DLList() {
  59. Wrapper*p = 0;
  60. for (auto&a:*this) {
  61. delete p;
  62. p= &a;
  63. }
  64. delete p;
  65. }
  66.  
  67. struct Iterator {
  68. Wrapper*i;
  69. inline bool operator!=(Iterator&other) { return i; }
  70. inline void operator++() { i=i->next; }
  71. inline Wrapper&operator*() { return *i; }
  72. };
  73.  
  74. Iterator begin() { return {.i=first}; }
  75. Iterator end () { return {.i=last }; }
  76. };
  77.  
  78. template<typename T> struct DynamicArray:DefaultCtrNoCopy {
  79. size_t len = 0;
  80. size_t cap = 0;
  81. T *buf = 0;
  82. inline void cap_set(size_t new_cap) {
  83. system_alloc(buf, new_cap);
  84. cap = new_cap;
  85. }
  86. inline T&append() {
  87. len++;
  88. if (len > cap) cap_set(MAX(len, cap *2));
  89. return buf[len-1];
  90. }
  91. inline T&append(T v ) { return append() = v; }
  92. T&operator[](size_t i) { return buf[i]; }
  93. inline ~DynamicArray() { system_alloc(buf, 0); }
  94. T*begin() { return buf; }
  95. T*end () { return buf + len; }
  96. };
Add Comment
Please, Sign In to add comment