AskSin++
Link.h
1 //- -----------------------------------------------------------------------------------------------------------------------
2 // AskSin++
3 // 2016-10-31 papa Creative Commons - http://creativecommons.org/licenses/by-nc-sa/3.0/de/
4 //- -----------------------------------------------------------------------------------------------------------------------
5 
6 #ifndef __LINK_H__
7 #define __LINK_H__
8 
9 #include "Atomic.h"
10 
11 namespace as {
12 
13 class Link {
14  // successor element
15  Link* link;
16 public:
17  Link () : link(0) {}
18  Link (Link* item) : link(item) {}
19 
20  // return successor
21  Link* select () const {
22  Link* result = 0;
23  ATOMIC_BLOCK( ATOMIC_RESTORESTATE ) {
24  result = link;
25  }
26  return result;
27  }
28 
29  // define successor
30  void select (Link* item) {
31  ATOMIC_BLOCK( ATOMIC_RESTORESTATE ) {
32  link=item;
33  }
34  }
35 
36  // add successor
37  void append (Link& item) {
38  ATOMIC_BLOCK( ATOMIC_RESTORESTATE ) {
39  item.select(select());
40  select(&item);
41  }
42  }
43 
44  // return tail item
45  Link* ending () const {
46  Link* item=0;
47  ATOMIC_BLOCK( ATOMIC_RESTORESTATE ) {
48  item=(Link*)this;
49  while( item->select() != 0 ) {
50  item = item->select();
51  }
52  }
53  return item;
54  }
55 
56  // remove and return successor
57  Link* unlink () {
58  Link* item=0;
59  ATOMIC_BLOCK( ATOMIC_RESTORESTATE ) {
60  item=select();
61  if( item!=0 ) {
62  detach();
63  }
64  }
65  return item;
66  }
67 
68  // remove all, return successor
69  Link* remove () {
70  Link* item=0;
71  ATOMIC_BLOCK( ATOMIC_RESTORESTATE ) {
72  item=select();
73  select(0);
74  }
75  return item;
76  }
77 
78  // remove successor
79  void detach () {
80  ATOMIC_BLOCK( ATOMIC_RESTORESTATE ) {
81  select(select()->select());
82  }
83  }
84 
85  // return container instance
86  Link* search (const Link* item) const {
87  Link* result = 0;
88  ATOMIC_BLOCK( ATOMIC_RESTORESTATE ) {
89  Link* tmp = select();
90  Link* vor = (Link*)this;
91  while (result == 0 && tmp != 0) {
92  if (tmp == item) {
93  result = vor;
94  }
95  vor = tmp;
96  tmp = tmp->select();
97  }
98  }
99  return result;
100  }
101 
102  // remove item
103  void remove (const Link& item) {
104  ATOMIC_BLOCK( ATOMIC_RESTORESTATE ) {
105  Link* vor = search(&item);
106  if( vor != 0 ) {
107  vor->unlink();
108  }
109  }
110  }
111 };
112 
113 }
114 
115 #endif