Advertisement
Guest User

Untitled

a guest
Aug 26th, 2016
205
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.19 KB | None | 0 0
  1. class List;
  2.  
  3. class ListItem {
  4.     public:
  5.         constexpr ListItem(): m_next(nullptr), m_prev(nullptr), m_list(nullptr) {
  6.         }
  7.        
  8.         ~ListItem() {
  9.             assert(m_list == nullptr);
  10.         }
  11.        
  12.         bool remove();
  13.        
  14.         ListItem* next() const {
  15.             return m_next;
  16.         }
  17.        
  18.         List* list() const {
  19.             return m_list;
  20.         }
  21.        
  22.         bool inList() const {
  23.             return list() != nullptr;
  24.         }
  25.        
  26.         bool inList(List* l) const {
  27.             return list() == l;
  28.         }
  29.        
  30.     private:
  31.         friend class List;
  32.        
  33.         ListItem* m_next;
  34.        
  35.         ListItem* m_prev;
  36.        
  37.         List* m_list;
  38.        
  39. };
  40.  
  41. class List {
  42.     public:
  43.         constexpr List(): m_head(nullptr), m_tail(nullptr), m_count(0) {
  44.         }
  45.        
  46.         ~List() {
  47.             assert(m_count == 0);
  48.         }
  49.        
  50.         bool insertAfter(ListItem* item, ListItem* after);
  51.        
  52.         bool insertBefore(ListItem* item, ListItem* before);
  53.        
  54.         bool insertHead(ListItem* item) {
  55.             return insertBefore(item, nullptr);
  56.         }
  57.        
  58.         bool insertTail(ListItem* item) {
  59.             return insertAfter(item, nullptr);
  60.         }
  61.        
  62.         bool remove(ListItem* item) {
  63.             if (item->m_list == this) {
  64.                 return item->remove();
  65.             }
  66.             return false;
  67.         }
  68.        
  69.         ListItem* removeHead() {
  70.             ListItem* item = m_head;
  71.             if (item) {
  72.                 item->remove();
  73.             }
  74.             return item;
  75.         }
  76.        
  77.         ListItem* removeTail() {
  78.             ListItem* item = m_tail;
  79.             if (item) {
  80.                 bool retval = item->remove();
  81.                 assert(retval);
  82.             }
  83.             return item;
  84.         }
  85.        
  86.         ListItem* head() const {
  87.             return m_head;
  88.         }
  89.        
  90.         ListItem* tail() const {
  91.             return m_tail;
  92.         }
  93.        
  94.         unsigned int count() const {
  95.             return m_count;
  96.         }
  97.        
  98.         bool empty() const {
  99.             return count() == 0;
  100.         }
  101.        
  102.     private:
  103.         friend class ListItem;
  104.        
  105.         ListItem* m_head;
  106.        
  107.         ListItem* m_tail;
  108.        
  109.         unsigned int m_count;
  110.        
  111. };
  112.  
  113. inline bool List::insertAfter(ListItem* item, ListItem* after) {
  114.     assert(item != nullptr);
  115.     if (after && (after->m_list != this)) {
  116.         return false;
  117.     }
  118.     if (after) {
  119.         item->m_prev = after;
  120.         item->m_next = after->m_next;
  121.         after->m_next = item;
  122.         if (item->m_next) {
  123.             item->m_next->m_prev = item;
  124.         } else {
  125.             m_tail = item;
  126.         }
  127.     } else {
  128.         item->m_next = nullptr;
  129.         item->m_prev = m_tail;
  130.         if (item->m_prev) {
  131.             item->m_prev->m_next = item;
  132.         } else {
  133.             m_head = item;
  134.         }
  135.         m_tail = item;
  136.     }
  137.     item->m_list = this;
  138.     m_count++;
  139.     return true;
  140. }
  141.  
  142. inline bool List::insertBefore(ListItem* item, ListItem* before) {
  143.     assert(item != nullptr);
  144.     if (before && (before->m_list != this)) {
  145.         return false;
  146.     }
  147.     if (before) {
  148.         item->m_next = before;
  149.         item->m_prev = before->m_prev;
  150.         before->m_prev = item;
  151.         if (item->m_prev) {
  152.             item->m_prev->m_next = item;
  153.         } else {
  154.             m_head = item;
  155.         }
  156.     } else {
  157.         item->m_prev = nullptr;
  158.         item->m_next = m_head;
  159.         if (item->m_next) {
  160.             item->m_next->m_prev = item;
  161.         } else {
  162.             m_tail = item;
  163.         }
  164.         m_head = item;
  165.     }
  166.     item->m_list = this;
  167.     m_count++;
  168.     return true;
  169. }
  170.  
  171. inline bool ListItem::remove() {
  172.     List* list = m_list;
  173.     if (list == nullptr) {
  174.         return false;
  175.     }
  176.     if (m_next) {
  177.         m_next->m_prev = m_prev;
  178.     } else {
  179.         list->m_tail = m_prev;
  180.     }
  181.     if (m_prev) {
  182.         m_prev->m_next = m_next;
  183.     } else {
  184.         list->m_head = m_next;
  185.     }
  186.     list->m_count--;
  187.     m_list = nullptr;
  188.     return true;
  189. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement