DiaDes  0.1
DIAgnosis of Discrete-Event System
PartialOrder.hh
Go to the documentation of this file.
1 #ifndef __DIADES__UTILS__PARTIALORDER_HH_
2 #define __DIADES__UTILS__PARTIALORDER_HH_
3 
4 #include <set>
5 #include <diades/graph/Graph.hh>
7 
8 namespace Diades
9 {
10  namespace Utils
11  {
12  using std::set;
14  using Diades::Graph::Node;
16 
17 
18 
19 
20 
27  template<typename Object,
28  typename Order,
29  typename Equal>
31  {
32  private:
35  set<Node> _min;
36  set<Node> _max;
37 
38  public:
39 
48  class Iterator
49  {
50  private:
52  set<Node>::const_iterator _it;
53 
54 
55  public:
56 
57  Iterator(const PartialOrder & order, set<Node>::const_iterator it):_order(order),_it(it){}
58 
59  const Object & operator *() const;
60 
62  {
63  ++_it;
64  return *this;
65  }
66 
67 
69  {
70  set<Node>::const_iterator _it2= _it;
71  ++_it;
72  return Iterator(_order,_it);
73  }
74 
75 
76  const Object & operator ->(void) const;
77 
78 
79  bool operator ==(const Iterator & it) const
80  {
81  return ((&_order) == (&it._order)) && (_it == it._it);
82  }
83 
84  bool operator !=(const Iterator & it) const
85  {
86  return !(*this == it);
87  }
88  };
89 
90 
91  public:
92 
93  PartialOrder():_order(),_map()
94  {
95  _map.init(_order);
96  }
97 
99  {
100  }
101 
102  PartialOrder(const PartialOrder & order):_order(order._order){}
103 
104 
105  bool empty() const
106  {
107  return _order.empty();
108  }
109 
110 
111  void insert(const Object & object)
112  {
113  // BRUTE FORCE
114  // @todo change that
115  Node newNode = _order.newNode();
116  _map[newNode] = object;
117  bool isMinMax = true;
118  for (Diades::Graph::NodeIterator nodeIt = _order.nodeBegin();
119  nodeIt != _order.nodeEnd();
120  ++nodeIt)
121  {
122  if(*nodeIt != newNode)
123  {
124  if(Equal(getObject(*nodeIt),object))
125  {
126  _order.deleteNode(newNode);
127  return;
128  }
129  else
130  {
131  if(Order(getObject(*nodeIt),object))
132  {
133  isMinMax = false;
134  _order.newEdge(*nodeIt,newNode);
135  set<Node>::iterator maxIt = _max.find(*nodeIt);
136  if(maxIt != _max.end())
137  {
138  _max.erase(maxIt);
139  _max.insert(newNode);
140  }
141  }
142  else
143  {
144  if(Order(object,getObject(*nodeIt)))
145  {
146  isMinMax = false;
147  _order.newEdge(getObject(*nodeIt),object);
148  set<Node>::iterator minIt = _min.find(*nodeIt);
149  if(minIt != _min.end())
150  {
151  _min.erase(minIt);
152  _min.insert(newNode);
153  }
154  }
155  }
156  }
157  }
158  }
159  if(isMinMax)
160  {
161  _min.insert(newNode);
162  _max.insert(newNode);
163  }
164  }
165 
166 
168  {
169  return Iterator(*this,_min.begin());
170  }
171 
173  {
174  return Iterator(*this,_min.end());
175  }
176 
177 
179  {
180  return Iterator(*this,_max.begin());
181  }
182 
184  {
185  return Iterator(*this,_max.end());
186  }
187 
188 
189  const Object & getObject(Node node) const
190  {
191  return _map[node];
192  }
193 
194 
195  void erase(const Object & object)
196  {
197  // BRUTE FORCE
198  // @todo change that
199  for (Diades::Graph::NodeIterator nodeIt = _order.nodeBegin();
200  nodeIt != _order.nodeEnd();
201  ++nodeIt)
202  {
203  if(Equal(getObject(*nodeIt),object))
204  {
205  _order.deleteNode(*nodeIt);
206  return;
207  }
208  }
209 
210  }
211 
212 
213  void clear()
214  {
215  _min.clear();
216  _max.clear();
217  _order.clear();
218  _map.init(_order);
219  }
220 
221  };
222 
223 
224  template<typename Object, typename Order, typename Equal>
226  {
227  return _order.getObject(*_it);
228  }
229 
230  template<typename Object,typename Order, typename Equal>
232  {
233  return _order.getObject(*_it);
234  }
235 
236  }
237 
238 }
239 
240 
241 
242 
243 
244 
245 #endif
Edge newEdge(Node source, Node target)
void init(Graph &g, SizeType capacity=0, ValueType dflt=ValueType())
Definition: NodeMap.hh:315
NodeMap< Object > _map
Definition: PartialOrder.hh:34
NodeIterator nodeEnd()
Definition: GraphInt.hh:538
bool operator!=(const Iterator &it) const
Definition: PartialOrder.hh:84
void erase(const Object &object)
Iterator maximalEnd() const
GraphIterator< Node > NodeIterator
Definition: GraphInt.hh:139
Iterator minimalEnd() const
Namespace of the Diades project.
void insert(const Object &object)
bool operator==(const Iterator &it) const
Definition: PartialOrder.hh:79
virtual void deleteNode(Node &node)
ConstIterator on the Net.
const Object & operator->(void) const
Iterator maximalBegin() const
set< Node >::const_iterator _it
Definition: PartialOrder.hh:52
bool empty() const
Definition: GraphInt.hh:332
PartialOrder(const PartialOrder &order)
NodeIterator nodeBegin()
Definition: GraphInt.hh:529
Iterator(const PartialOrder &order, set< Node >::const_iterator it)
Definition: PartialOrder.hh:57
Iterator minimalBegin() const
const Object & getObject(Node node) const