DiaDes  0.1
DIAgnosis of Discrete-Event System
NodeMap.hh
Go to the documentation of this file.
1 #ifndef __DIADES__GRAPH__NODEMAP__HH
2 #define __DIADES__GRAPH__NODEMAP__HH
3 
4 #include <memory>
5 #include <vector>
7 //#include <boost/archive/text_oarchive.hpp>
8 //#include <boost/archive/text_iarchive.hpp>
9 //#include <boost/serialization/vector.hpp>
10 #include <diades/graph/Graph.hh>
11 
12 
13 
14 namespace Diades {
15  namespace Graph {
16 
17  using std::vector;
18 
19  template <typename T> struct NodeMapIterator;
20 
28  template < typename T >
29  class NodeMap {
30  public:
31 
32  static string typeName() {
33  return "Graph::NodeMap";
34  }
36  public:
37 
41  typedef typename vector<T>::reference Reference;
45  typedef typename vector<T>::const_reference ConstReference;
49  typedef typename vector<T>::value_type ValueType;
53  typedef typename vector<T>::iterator Iterator;
57  typedef typename vector<T>::const_iterator ConstIterator;
61  typedef typename vector<T>::size_type SizeType;
65  typedef typename vector<T>::difference_type DifferenceType;
69  typedef typename vector<T>::allocator_type AllocatorType;
73  typedef typename vector<T>::pointer Pointer;
77  typedef typename vector<T>::const_pointer ConstPointer;
81  typedef typename vector<T>::reverse_iterator ReverseIterator;
85  typedef typename vector<T>::const_reverse_iterator ConstReverseIterator;
86 
87 
88 
89  public:
90 
91 
92  //********************** constructors *****************************
93 
101  NodeMap();
102 
113  explicit NodeMap(Graph & g, SizeType capacity = 0, ValueType dflt = ValueType());
114 
120  clear();
121  }
122 
123 
124 
126 
129 
134  void clear() {
135  _tabData.clear();
136  }
137 
138 
139 
151  void init(Graph & g, SizeType capacity = 0, ValueType dflt = ValueType());
152 
156  const Graph & owner() const {
157  return *_owner;
158  }
159 
163  Graph & owner() {
164  return *_owner;
165  }
166 
170  NodeMapIterator< ValueType > nodeBegin(ConstReference value) const;
171 
172 
176  NodeMapIterator< ValueType > nodeEnd(ConstReference value) const;
177 
182  bool valid() const {
183  return _owner != nullptr;
184  }
185 
194  Reference operator[](Node node);
195 
196 
205  ConstReference operator[](Node node) const;
206 
207 
214  NodeIterator initValue(NodeIterator begin, NodeIterator end, ConstReference value);
215 
216 
222  void export2dot(ostream & os);
223 
224 
225 
226  private:
227  mutable vector<ValueType> _tabData;
229  ValueType _dflt;
230  public:
231  // template<class Archive>
232  // void serialize(Archive & ar, const unsigned int version)
233  // {
234  // ar & _owner;
235  // ar & _dflt;
236  // ar & _tabData;
237  // }
238  };
239 
246  template <typename T>
247  struct NodeMapIterator {
248  typedef NodeMapIterator<T> self;
249  typedef NodeMapIterator<T> Self;
250  typedef ptrdiff_t difference_type;
251  typedef ptrdiff_t DifferenceType;
252  typedef std::forward_iterator_tag iterator_category;
253  typedef std::forward_iterator_tag IteratorCategory;
256 
257  typedef typename NodeMap<T>::Pointer pointer;
258  typedef typename NodeMap<T>::Pointer Pointer;
262 
265  ValueType _value;
266 
267  NodeMapIterator() : _pMap(0), _currentIterator(), _value() {
268  }
269 
270  NodeMapIterator(const NodeMap<ValueType> & mapping,
271  const NodeIterator & currentIterator,
272  ConstReference value);
273 
274  Reference operator*() const;
275 
276 
277  Pointer operator->() const;
278 
279 
280  Self & operator++();
281 
282 
283  Self operator++(int);
284 
285 
286 
287  bool operator==(const Self & it) const;
288 
289 
290  bool operator!=(const Self & it) const;
291 
292  };
293 
294 
295  //--------------------------------------------------------------------------
296  // Implementation
297  //--------------------------------------------------------------------------
298 
299  template <typename T >
301  }
302 
303  template <typename T>
304  NodeMap<T>::NodeMap(Graph & g, SizeType capacity, ValueType dflt) : _tabData(), _owner(&g), _dflt(dflt) {
305 
306  if (capacity > (_owner->nodeCapacity() + 1)) {
307  _tabData.resize(capacity, _dflt);
308  } else {
309  _tabData.resize(_owner->nodeCapacity() + 1, dflt);
310  }
311  ensure(Exception, _tabData.size() > _owner->nodeCapacity(), "NodeMap");
312  }
313 
314  template <typename T>
315  void NodeMap<T>::init(Graph & g, SizeType capacity, ValueType dflt) {
316 
317  _owner = &g;
318  _tabData.clear();
319  _dflt = dflt;
320  if (capacity > (_owner->nodeCapacity() + 1)) {
321  _tabData.resize(capacity, _dflt);
322  } else {
323  _tabData.resize(_owner->nodeCapacity() + 1, _dflt);
324  }
325  ensure(Exception, _tabData.size() > _owner->nodeCapacity(), "NodeMap");
326  }
327 
328  template <typename T>
330  //require(Exception, _owner!=0,"NodeMap::operator[]: invalid owner");
331  require(Exception, n.valid(), "NodeMap::operator[]: invalid node");
332  //require(Exception, n.owner()==_owner,"NodeMap::operator[]: The node's owner is not the map's owner");
333 
334  if (_owner->nodeCapacity() >= _tabData.size()) {
335  _tabData.resize(_owner->nodeCapacity() + 1, _dflt);
336  }
337  ensure(Exception, _tabData.size() > _owner->nodeCapacity(), "NodeMap[]");
338  return _tabData.operator[](n.id());
339  }
340 
341  template <typename T>
343  //require(Exception, _owner!=0,"NodeMap::operator[]: invalid owner");
344  require(Exception, n.valid(), "NodeMap::operator[]: invalid node");
345  //require(Exception, n.owner()==_owner,"NodeMap::operator[]: The node's owner is not the map's owner");
346  if (_owner->nodeCapacity() >= _tabData.size()) {
347  _tabData.resize(_owner->nodeCapacity() + 1, _dflt);
348  }
349  ensure(Exception, _tabData.size() > _owner->nodeCapacity(), "NodeMap[]");
350  return _tabData.operator[](n.id());
351  }
352 
353  template <typename T>
354  NodeIterator NodeMap<T>::initValue(NodeIterator begin, NodeIterator end, ConstReference value) {
355  for (NodeIterator nodeIt = begin; nodeIt != end; ++nodeIt) {
356  operator[](*nodeIt) = value;
357  }
358  ensure(Exception, _tabData.size() > _owner->nodeCapacity(), "NodeMap[]");
359  return end;
360  }
361 
362  template <typename T, typename ForwardIterator>
363  ForwardIterator initValueNodeMap(NodeMap<T> & map, ForwardIterator start, ForwardIterator end,
364  typename NodeMap<T>::ConstReference value) {
365  for (; start != end; ++start) {
366  map[*start] = value;
367  }
368  return end;
369  }
370 
371  template<typename T>
373  const NodeIterator & currentIterator,
374  ConstReference value) : _pMap(mapping),
375  _currentIterator(currentIterator),
376  _value(value) {
377  while ((_currentIterator != _pMap->owner().nodeEnd())
378  &&
379  !(_pMap->operator[](*_currentIterator) == _value)) {
381  }
382  }
383 
384  template<typename T>
386  return _pMap->operator[](*_currentIterator);
387  }
388 
389  template<typename T>
391 
392  return &(_pMap->operator[](*_currentIterator));
393  }
394 
395  template<typename T>
397  if (_currentIterator != _pMap->owner().nodeEnd()) {
399  }
400  while ((_currentIterator != _pMap->owner().nodeEnd())
401  &&
402  !(_pMap->operator[](*_currentIterator) == _value)) {
404  }
405  return *this;
406  }
407 
408  template<typename T>
410  Self tmp = *this;
411  if (_currentIterator != _pMap->owner().nodeEnd()) {
413  }
414  while ((_currentIterator != _pMap->owner().nodeEnd())
415  &&
416  !(_pMap->operator[](*_currentIterator) == _value)) {
418  }
419  return tmp;
420  }
421 
422  template<typename T>
423  bool NodeMapIterator<T>::operator==(const Self & it) const {
424  return (_pMap == it._pMap) && (_currentIterator == it._currentIterator);
425  }
426 
427  template<typename T>
428  bool NodeMapIterator<T>::operator!=(const Self & it) const {
429  return !(*this == it);
430  }
431 
432  template<typename T>
433  void printDot(ostream & os, const T & value) {
434  os << "[ label=\"" << value << "\"];";
435  }
436 
442  template<typename T>
443  void NodeMap<T>::export2dot(ostream & os) {
444 
445  os << "digraph G {" << "\n";
446  os << "\tratio=fill;" << "\n";
447  os << "\tpage=\"8.5,11.6\";" << "\n";
448  os << "\tsize=\"7.5,10.5\";" << "\n";
449 
450  // writing the states
451  for (NodeIterator nodeIt = owner().nodeBegin();
452  nodeIt != owner().nodeEnd();
453  nodeIt++) {
454  os << "\t" << *nodeIt;
455  printDot(os, operator[](*nodeIt));
456  os << "\n";
457  }
458 
459  // writing the transitions
460  for (EdgeIterator edgeIt = owner().edgeBegin();
461  edgeIt != owner().edgeEnd();
462  ++edgeIt) {
463  os << "\t" << edgeIt->source() << " -> " << edgeIt->target();
464  os << "\n";
465  }
466 
467  // writing the end of os
468  os << "}" << "\n";
469  }
470 
474  template< typename T >
476  return NodeMapIterator< NodeMap<T>::ValueType >(this, owner().nodeBegin(), value);
477  }
478 
482  template< typename T >
484  return NodeMapIterator< NodeMap<T>::ValueType >(this, owner().nodeEnd(), value);
485  }
486  };
487 };
488 
489 #endif
NodeIterator initValue(NodeIterator begin, NodeIterator end, ConstReference value)
Definition: NodeMap.hh:354
vector< T >::iterator Iterator
Definition: NodeMap.hh:53
bool operator==(const Self &it) const
Definition: NodeMap.hh:423
InputIterator initValue(EdgeMap< T > &map, InputIterator start, InputIterator end, typename EdgeMap< T >::ConstReference value)
Definition: EdgeMap.hh:365
NodeMap< T >::Reference reference
Definition: NodeMap.hh:259
vector< T >::difference_type DifferenceType
Definition: NodeMap.hh:65
vector< T >::reference Reference
Definition: NodeMap.hh:41
vector< T >::value_type ValueType
Definition: NodeMap.hh:49
bool valid() const
Definition: NodeImpl.hh:23
void init(Graph &g, SizeType capacity=0, ValueType dflt=ValueType())
Definition: NodeMap.hh:315
bool valid() const
Definition: NodeMap.hh:182
const Graph & owner() const
Definition: NodeMap.hh:156
Pointer operator->() const
Definition: NodeMap.hh:390
Definition: Run.cc:88
Diades::Utils::Exception< NodeMap > Exception
Definition: NodeMap.hh:35
static string typeName()
Definition: NodeMap.hh:32
NodeIterator nodeEnd()
Definition: GraphInt.hh:538
NodeMap< T >::ValueType ValueType
Definition: NodeMap.hh:255
#define ensure(Exception, expr, message)
Definition: Assertion.hh:98
NodeMapIterator< ValueType > nodeBegin(ConstReference value) const
Definition: NodeMap.hh:475
std::forward_iterator_tag iterator_category
Definition: NodeMap.hh:252
vector< T >::size_type SizeType
Definition: NodeMap.hh:61
vector< T >::pointer Pointer
Definition: NodeMap.hh:73
vector< T >::const_iterator ConstIterator
Definition: NodeMap.hh:57
NodeMapIterator< ValueType > nodeEnd(ConstReference value) const
Definition: NodeMap.hh:483
EdgeIterator edgeBegin()
Definition: GraphInt.hh:565
Reference operator*() const
Definition: NodeMap.hh:385
std::forward_iterator_tag IteratorCategory
Definition: NodeMap.hh:253
ForwardIterator initValueNodeMap(NodeMap< T > &map, ForwardIterator start, ForwardIterator end, typename NodeMap< T >::ConstReference value)
Definition: NodeMap.hh:363
NodeMap< T >::Pointer Pointer
Definition: NodeMap.hh:258
vector< T >::reverse_iterator ReverseIterator
Definition: NodeMap.hh:81
NodeMapIterator< T > Self
Definition: NodeMap.hh:249
NodeMap< T >::ValueType value_type
Definition: NodeMap.hh:254
vector< ValueType > _tabData
Definition: NodeMap.hh:227
#define require(Exception, expr, message)
Definition: Assertion.hh:90
Namespace of the Diades project.
bool operator!=(const Graph &g) const
Definition: GraphIntOld.hh:216
NodeMap< T >::Pointer pointer
Definition: NodeMap.hh:257
void export2dot(ostream &os)
Definition: NodeMap.hh:443
void printDot(ostream &os, const T &value)
Definition: NodeMap.hh:433
vector< T >::allocator_type AllocatorType
Definition: NodeMap.hh:69
NodeId id() const
Definition: Node.hh:248
boost::adjacency_list Graph
Definition: ScaleFree.cc:9
Reference operator[](Node node)
Definition: NodeMap.hh:329
bool operator==(const Graph &g) const
Definition: GraphIntOld.hh:205
vector< T >::const_reverse_iterator ConstReverseIterator
Definition: NodeMap.hh:85
bool operator!=(const Self &it) const
Definition: NodeMap.hh:428
NodeIterator nodeBegin()
Definition: GraphInt.hh:529
vector< T >::const_reference ConstReference
Definition: NodeMap.hh:45
vector< T >::const_pointer ConstPointer
Definition: NodeMap.hh:77
NodeMap< T >::Reference Reference
Definition: NodeMap.hh:260
NodeMap< T >::ConstReference ConstReference
Definition: NodeMap.hh:261
const NodeMap< ValueType > * _pMap
Definition: NodeMap.hh:263