DiaDes  0.1
DIAgnosis of Discrete-Event System
ConstNodeMap.hh
Go to the documentation of this file.
1 #ifndef __DIADES__GRAPH__CONSTNODEMAP__HH
2 #define __DIADES__GRAPH__CONSTNODEMAP__HH
3 
4 #include <memory>
5 #include <vector>
7 #include <diades/graph/Graph.hh>
8 
9 
10 namespace Diades {
11  namespace Graph {
12 
13  using std::vector;
14 
15  template <typename T> struct ConstNodeMapIterator;
16 
26  template < typename T >
27  class ConstNodeMap {
28  public:
29 
30  static string typeName() {
31  return "Graph::ConstNodeMap";
32  }
34  public:
35 
39  typedef typename vector<T>::reference Reference;
43  typedef typename vector<T>::const_reference ConstReference;
47  typedef typename vector<T>::value_type ValueType;
51  typedef typename vector<T>::iterator Iterator;
55  typedef typename vector<T>::const_iterator ConstIterator;
59  typedef typename vector<T>::size_type SizeType;
63  typedef typename vector<T>::difference_type DifferenceType;
67  typedef typename vector<T>::allocator_type AllocatorType;
71  typedef typename vector<T>::pointer Pointer;
75  typedef typename vector<T>::const_pointer ConstPointer;
79  typedef typename vector<T>::reverse_iterator ReverseIterator;
83  typedef typename vector<T>::const_reverse_iterator ConstReverseIterator;
84 
85 
86 
87  public:
88 
89 
90  //********************** constructors *****************************
91 
99  ConstNodeMap();
100 
111  explicit ConstNodeMap(const Graph & g, SizeType capacity = 0, ValueType dflt = ValueType());
112 
118  clear();
119  }
120 
121 
122 
124 
127 
132  void clear() {
133  _tabData.clear();
134  }
135 
136 
137 
149  void init(const Graph & g, SizeType capacity = 0, ValueType dflt = ValueType());
150 
154  const Graph & owner() const {
155  return *_owner;
156  }
157 
158 
162  ConstNodeMapIterator< ValueType > nodeBegin(ConstReference value) const;
163 
164 
168  ConstNodeMapIterator< ValueType > nodeEnd(ConstReference value) const;
169 
174  bool valid() const {
175  return _owner != nullptr;
176  }
177 
186  Reference operator[](Node node);
187 
188 
197  ConstReference operator[](Node node) const;
198 
199 
206  NodeIterator initValue(NodeIterator begin, NodeIterator end, ConstReference value);
207 
208 
214  void export2dot(ostream & os);
215 
216 
217 
218  private:
219  mutable vector<ValueType> _tabData;
220  const Graph * _owner;
221  ValueType _dflt;
222  public:
223  // template<class Archive>
224  // void serialize(Archive & ar, const unsigned int version)
225  // {
226  // ar & _owner;
227  // ar & _dflt;
228  // ar & _tabData;
229  // }
230  };
231 
238  template <typename T>
239  struct ConstNodeMapIterator {
241  typedef ConstNodeMapIterator<T> Self;
242  typedef ptrdiff_t difference_type;
243  typedef ptrdiff_t DifferenceType;
244  typedef std::forward_iterator_tag iterator_category;
245  typedef std::forward_iterator_tag IteratorCategory;
248 
254 
257  ValueType _value;
258 
259  ConstNodeMapIterator() : _pMap(0), _currentIterator(), _value() {
260  }
261 
263  const NodeIterator & currentIterator,
264  ConstReference value);
265 
266  Reference operator*() const;
267 
268 
269  Pointer operator->() const;
270 
271 
272  Self & operator++();
273 
274 
275  Self operator++(int);
276 
277 
278 
279  bool operator==(const Self & it) const;
280 
281 
282  bool operator!=(const Self & it) const;
283 
284  };
285 
286 
287  //--------------------------------------------------------------------------
288  // Implementation
289  //--------------------------------------------------------------------------
290 
291  template <typename T >
293  }
294 
295  template <typename T>
296  ConstNodeMap<T>::ConstNodeMap(const Graph & g, SizeType capacity, ValueType dflt) : _tabData(), _owner(&g), _dflt(dflt) {
297 
298  if (capacity > (_owner->nodeCapacity() + 1)) {
299  _tabData.resize(capacity, _dflt);
300  } else {
301  _tabData.resize(_owner->nodeCapacity() + 1, dflt);
302  }
303  ensure(Exception, _tabData.size() > _owner->nodeCapacity(), "ConstNodeMap");
304  }
305 
306  template <typename T>
307  void ConstNodeMap<T>::init(const Graph & g, SizeType capacity, ValueType dflt) {
308 
309  _owner = &g;
310  _tabData.clear();
311  _dflt = dflt;
312  if (capacity > (_owner->nodeCapacity() + 1)) {
313  _tabData.resize(capacity, _dflt);
314  } else {
315  _tabData.resize(_owner->nodeCapacity() + 1, _dflt);
316  }
317  ensure(Exception, _tabData.size() > _owner->nodeCapacity(), "ConstNodeMap");
318  }
319 
320  template <typename T>
322  //require(Exception, _owner!=0,"ConstNodeMap::operator[]: invalid owner");
323  require(Exception, n.valid(), "ConstNodeMap::operator[]: invalid node");
324  //require(Exception, n.owner()==_owner,"ConstNodeMap::operator[]: The node's owner is not the map's owner");
325 
326  if (_owner->nodeCapacity() >= _tabData.size()) {
327  _tabData.resize(_owner->nodeCapacity() + 1, _dflt);
328  }
329  ensure(Exception, _tabData.size() > _owner->nodeCapacity(), "ConstNodeMap[]");
330  return _tabData.operator[](n.id());
331  }
332 
333  template <typename T>
335  //require(Exception, _owner!=0,"ConstNodeMap::operator[]: invalid owner");
336  require(Exception, n.valid(), "ConstNodeMap::operator[]: invalid node");
337  //require(Exception, n.owner()==_owner,"ConstNodeMap::operator[]: The node's owner is not the map's owner");
338  if (_owner->nodeCapacity() >= _tabData.size()) {
339  _tabData.resize(_owner->nodeCapacity() + 1, _dflt);
340  }
341  ensure(Exception, _tabData.size() > _owner->nodeCapacity(), "ConstNodeMap[]");
342  return _tabData.operator[](n.id());
343  }
344 
345  template <typename T>
347  for (NodeIterator nodeIt = begin; nodeIt != end; ++nodeIt) {
348  operator[](*nodeIt) = value;
349  }
350  ensure(Exception, _tabData.size() > _owner->nodeCapacity(), "ConstNodeMap[]");
351  return end;
352  }
353 
354  template <typename T, typename ForwardIterator>
355  ForwardIterator initValueConstNodeMap(ConstNodeMap<T> & map, ForwardIterator start, ForwardIterator end,
356  typename ConstNodeMap<T>::ConstReference value) {
357  for (; start != end; ++start) {
358  map[*start] = value;
359  }
360  return end;
361  }
362 
363  template<typename T>
365  const NodeIterator & currentIterator,
366  ConstReference value) : _pMap(mapping),
367  _currentIterator(currentIterator),
368  _value(value) {
369  while ((_currentIterator != _pMap->owner().nodeEnd())
370  &&
371  !(_pMap->operator[](*_currentIterator) == _value)) {
373  }
374  }
375 
376  template<typename T>
378  return _pMap->operator[](*_currentIterator);
379  }
380 
381  template<typename T>
383 
384  return &(_pMap->operator[](*_currentIterator));
385  }
386 
387  template<typename T>
389  if (_currentIterator != _pMap->owner().nodeEnd()) {
391  }
392  while ((_currentIterator != _pMap->owner().nodeEnd())
393  &&
394  !(_pMap->operator[](*_currentIterator) == _value)) {
396  }
397  return *this;
398  }
399 
400  template<typename T>
402  Self tmp = *this;
403  if (_currentIterator != _pMap->owner().nodeEnd()) {
405  }
406  while ((_currentIterator != _pMap->owner().nodeEnd())
407  &&
408  !(_pMap->operator[](*_currentIterator) == _value)) {
410  }
411  return tmp;
412  }
413 
414  template<typename T>
415  bool ConstNodeMapIterator<T>::operator==(const Self & it) const {
416  return (_pMap == it._pMap) && (_currentIterator == it._currentIterator);
417  }
418 
419  template<typename T>
420  bool ConstNodeMapIterator<T>::operator!=(const Self & it) const {
421  return !(*this == it);
422  }
423 
424 
425 
431  template<typename T>
432  void ConstNodeMap<T>::export2dot(ostream & os) {
433 
434  os << "digraph G {" << "\n";
435  os << "\tratio=fill;" << "\n";
436  os << "\tpage=\"8.5,11.6\";" << "\n";
437  os << "\tsize=\"7.5,10.5\";" << "\n";
438 
439  // writing the states
440  for (NodeIterator nodeIt = owner().nodeBegin();
441  nodeIt != owner().nodeEnd();
442  nodeIt++) {
443  os << "\t" << *nodeIt;
444  os << "[ label=\"" << operator[](*nodeIt) << "\"];";
445  os << "\n";
446  }
447 
448  // writing the transitions
449  for (EdgeIterator edgeIt = owner().edgeBegin();
450  edgeIt != owner().edgeEnd();
451  ++edgeIt) {
452  os << "\t" << edgeIt->source() << " -> " << edgeIt->target();
453  os << "\n";
454  }
455 
456  // writing the end of os
457  os << "}" << "\n";
458  }
459 
463  template< typename T >
465  return ConstNodeMapIterator< ConstNodeMap<T>::ValueType >(this, owner().nodeBegin(), value);
466  }
467 
471  template< typename T >
473  return ConstNodeMapIterator< ConstNodeMap<T>::ValueType >(this, owner().nodeEnd(), value);
474  }
475  };
476 };
477 
478 #endif
std::forward_iterator_tag iterator_category
vector< T >::difference_type DifferenceType
Definition: ConstNodeMap.hh:63
ConstNodeMap< T >::Pointer Pointer
InputIterator initValue(EdgeMap< T > &map, InputIterator start, InputIterator end, typename EdgeMap< T >::ConstReference value)
Definition: EdgeMap.hh:365
ForwardIterator initValueConstNodeMap(ConstNodeMap< T > &map, ForwardIterator start, ForwardIterator end, typename ConstNodeMap< T >::ConstReference value)
vector< T >::allocator_type AllocatorType
Definition: ConstNodeMap.hh:67
ConstNodeMapIterator< ValueType > nodeEnd(ConstReference value) const
bool valid() const
Definition: NodeImpl.hh:23
Definition: Run.cc:88
vector< T >::const_reference ConstReference
Definition: ConstNodeMap.hh:43
NodeIterator nodeEnd()
Definition: GraphInt.hh:538
ConstNodeMap< T >::ConstReference ConstReference
void export2dot(ostream &os)
#define ensure(Exception, expr, message)
Definition: Assertion.hh:98
vector< T >::iterator Iterator
Definition: ConstNodeMap.hh:51
ConstNodeMap< T >::ValueType value_type
ConstNodeMap< T >::ValueType ValueType
EdgeIterator edgeBegin()
Definition: GraphInt.hh:565
const Graph & owner() const
vector< T >::value_type ValueType
Definition: ConstNodeMap.hh:47
vector< T >::reverse_iterator ReverseIterator
Definition: ConstNodeMap.hh:79
ConstNodeMap< T >::Reference Reference
vector< T >::const_reverse_iterator ConstReverseIterator
Definition: ConstNodeMap.hh:83
ConstNodeMap< T >::Pointer pointer
#define require(Exception, expr, message)
Definition: Assertion.hh:90
Namespace of the Diades project.
bool operator!=(const Graph &g) const
Definition: GraphIntOld.hh:216
ConstNodeMapIterator< ValueType > nodeBegin(ConstReference value) const
ConstNodeMap< T >::Reference reference
NodeId id() const
Definition: Node.hh:248
vector< ValueType > _tabData
Reference operator[](Node node)
boost::adjacency_list Graph
Definition: ScaleFree.cc:9
vector< T >::size_type SizeType
Definition: ConstNodeMap.hh:59
bool operator==(const Graph &g) const
Definition: GraphIntOld.hh:205
vector< T >::pointer Pointer
Definition: ConstNodeMap.hh:71
bool operator==(const Self &it) const
std::forward_iterator_tag IteratorCategory
NodeIterator nodeBegin()
Definition: GraphInt.hh:529
const ConstNodeMap< ValueType > * _pMap
void init(const Graph &g, SizeType capacity=0, ValueType dflt=ValueType())
vector< T >::const_pointer ConstPointer
Definition: ConstNodeMap.hh:75
ConstNodeMapIterator< T > Self
vector< T >::reference Reference
Definition: ConstNodeMap.hh:39
bool operator!=(const Self &it) const
vector< T >::const_iterator ConstIterator
Definition: ConstNodeMap.hh:55
Diades::Utils::Exception< ConstNodeMap > Exception
Definition: ConstNodeMap.hh:33
NodeIterator initValue(NodeIterator begin, NodeIterator end, ConstReference value)