Aleph-w  1.5a.2
Biblioteca general de algoritmos y estructuras de datos
 Todo Clases Archivos Funciones Variables 'typedefs' Enumeraciones Amigas Grupos Páginas
slink.H
1 
2 # ifndef SLINK_H
3 # define SLINK_H
4 
5 # include <aleph.H>
6 
7 using namespace Aleph;
8 
9 namespace Aleph {
10 
19 class Slink
20 {
21 protected:
22 
23  Slink * next;
24 
25 public:
26 
28  Slink() : next(this) { /* Empty */ }
29 
31  void reset()
32  {
33  I(this not_eq NULL);
34 
35  next = this;
36  }
38  bool is_empty() const
39  {
40  I(this not_eq NULL);
41 
42  return next == this;
43  }
44 
47  {
48  I(this not_eq NULL);
49  return next;
50  }
51 
59  void insert_next(Slink * p)
60  {
61 
62  I(this not_eq NULL);
63  I(p not_eq NULL);
64  I(p->is_empty());
65 
66  p->next = next;
67  next = p;
68  }
69 
79  {
80  I(this not_eq NULL);
81 
82  Slink * ret_val = next;
83  next = ret_val->next;
84  ret_val->reset();
85  return ret_val;
86  }
87 };
125 # define SLINK_TO_TYPE(type_name, link_name) \
126  static type_name * slink_to_type(Slink * link) \
127  { \
128  type_name * ptr_zero = 0; \
129  size_t offset_link = (size_t) &(ptr_zero->link_name); \
130  unsigned long address_type = ((unsigned long) link) - offset_link; \
131  return (type_name *) address_type; \
132  }
133 
134 } // end namespace Aleph
135 # endif /* SLINK_H */
136 

Leandro Rabindranath León