DiaDes  0.1
DIAgnosis of Discrete-Event System
EdgeMap.hh
Go to the documentation of this file.
1 #ifndef __DIADES__GRAPH__EDGEMAP_HH
2 #define __DIADES__GRAPH__EDGEMAP_HH
3 
4 #include <memory>
5 #include <vector>
6 //#include <boost/archive/text_oarchive.hpp>
7 //#include <boost/archive/text_iarchive.hpp>
8 #include <boost/serialization/vector.hpp>
9 #include <diades/graph/Graph.hh>
10 
11 
12 
13 namespace Diades
14 {
15  namespace Graph
16  {
17  using std::vector;
18 
19  template <typename T> struct EdgeMapIterator;
20 
28  template<class T >
29  class EdgeMap {
30  public:
31 
32  static string typeName() {
33  return "Graph::EdgeMap";
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 
90  public:
91 
99  EdgeMap();
100 
111  explicit EdgeMap(Graph & g, SizeType capacity=0,ValueType dflt=ValueType());
112 
118  {
119  clear();
120  }
121 
122 
124 
138  void init(Graph & g, SizeType capacity=0, ValueType dflt=ValueType());
139 
140 
145  void clear()
146  {
147  _tabData.clear();
148  }
149 
150 
154  const Graph & owner() const
155  {
156  return *_owner;
157  }
158 
159 
164  {
165  return *_owner;
166  }
175  Reference operator[](Edge edge);
176 
185  ConstReference operator[](Edge edge) const;
186 
191  bool valid() const {
192  return _owner!=nullptr;
193  }
194 
195 
196  EdgeIterator initValue(EdgeIterator begin, EdgeIterator end, ConstReference value);
197  LocalEdgeIterator initValue(LocalEdgeIterator begin, LocalEdgeIterator end, ConstReference value);
198 
202  EdgeMapIterator< ValueType > edgeBegin(ConstReference value) const;
203 
204 
208  EdgeMapIterator< ValueType > egdeEnd(ConstReference value) const;
209 
210 
212 
213  private:
214  mutable vector<ValueType> _tabData;
215  mutable Graph * _owner;
216  T _dflt;
217  public:
218 // template<class Archive>
219 // void serialize(Archive & ar, const unsigned int version)
220 // {
221 // ar & _owner;
222 // ar & _dflt;
223 // ar & _tabData;
224 // }
225  };
226 
227 
228 
229 
230 
231 
232 
233 
240  template <typename T>
241  struct EdgeMapIterator
242  {
243  typedef EdgeMapIterator<T> self;
244  typedef EdgeMapIterator<T> Self;
245  typedef ptrdiff_t difference_type;
246  typedef ptrdiff_t DifferenceType;
247  typedef std::forward_iterator_tag iterator_category;
248  typedef std::forward_iterator_tag IteratorCategory;
251 
252  typedef typename EdgeMap<T>::Pointer pointer;
253  typedef typename EdgeMap<T>::Pointer Pointer;
257 
260  ValueType _value;
261 
262  EdgeMapIterator(): _pMap(0),_currentIterator(),_value(){}
263 
264  EdgeMapIterator(const EdgeMap<ValueType> & mapping,
265  const EdgeIterator & currentIterator,
266  ConstReference value);
267 
268  Reference operator*() const;
269 
270 
271  Pointer operator->() const;
272 
273 
274  Self & operator++();
275 
276 
277  Self operator++(int);
278 
279 
280 
281  bool operator==(const Self & it) const;
282 
283 
284  bool operator !=(const Self & it) const;
285 
286  };
287 
288 
289 
290  //--------------------------------------------------------------------------
291  // Implementation
292  //--------------------------------------------------------------------------
293 
294  template <typename T >
296 
297 
298  template <typename T>
299  EdgeMap<T>::EdgeMap(Graph & g, SizeType capacity, ValueType dflt):_tabData(),_owner(&g),_dflt(dflt)
300  {
301  if(capacity > (_owner->edgeCapacity()+1))
302  {
303  _tabData.resize(capacity,_dflt);
304  }
305  else
306  {
307  _tabData.resize(_owner->edgeCapacity()+1, _dflt);
308  }
309  ensure(Exception, valid() && _tabData.size() > _owner->edgeCapacity(),"EdgeMap");
310  }
311 
312 
313  template <typename T>
314  void EdgeMap<T>::init(Graph & g, SizeType capacity, ValueType dflt){
315  _owner=&g;
316  _tabData.clear();
317  _dflt =dflt;
318  if(capacity > (_owner->edgeCapacity()+1))
319  {
320  _tabData.resize(capacity,_dflt);
321  }
322  else
323  {
324  _tabData.resize(_owner->edgeCapacity()+1,_dflt);
325  }
326  ensure(Exception, valid() && _tabData.size() > _owner->edgeCapacity(),"EdgeMap");
327  }
328 
329 
330  template <typename T>
332  {
333  require(Exception, valid(),"EdgeMap::operator[]: invalid _owner");
334  require(Exception, e.valid(),"EdgeMap::operator[]: invalid edge");
335  require(Exception, &e.owner()==_owner,"EdgeMap::operator[]: The edge's _owner is not the map's _owner");
336  if( _owner->edgeCapacity() >= _tabData.size())
337  {
338  _tabData.resize(_owner->edgeCapacity()+1,_dflt);
339  }
340  ensure(Exception, valid() && _tabData.size() > _owner->edgeCapacity(),"EdgeMap[]");
341  return _tabData.operator[](e.id());
342  }
343 
344  template <typename T>
346  {
347  require(Exception, valid(),"EdgeMap::operator[]: invalid _owner");
348  require(Exception, e.valid(),"EdgeMap::operator[]: invalid edge");
349  require(Exception, &e.owner()==_owner,"EdgeMap::operator[]: The edge's _owner is not the map's _owner");
350  if( _owner->edgeCapacity() >= _tabData.size() )
351  {
352  _tabData.resize(_owner->edgeCapacity()+1,_dflt);
353  }
354  ensure(Exception, valid() && _tabData.size() > _owner->edgeCapacity(),"EdgeMap[]");
355  return _tabData.operator[](e.id());
356  }
357 
358 
359 
360 
361 
362 
363 
364  template <typename InputIterator, typename T>
365  InputIterator initValue(EdgeMap<T> & map, InputIterator start, InputIterator end,
366  typename EdgeMap<T>::ConstReference value)
367  {
368  for(; start != end; ++start)
369  {
370  map[*start] = value;
371  }
372  return end;
373  }
374 
375  template <typename T>
377  typename EdgeMap<T>::ConstReference value)
378  {
379  return initValue(*this,begin,end,value);
380  }
381 
382 
383  template <typename T>
385  typename EdgeMap<T>::ConstReference value)
386  {
387  return initValue(*this,begin,end,value);
388  }
389 
390  template<typename T>
392  const EdgeIterator & currentIterator,
393  ConstReference value):_pMap(mapping),
394  _currentIterator(currentIterator),
395  _value(value)
396  {
397  while( (_currentIterator != _pMap->owner().nodeEnd())
398  &&
399  !(_pMap->operator[](*_currentIterator) == _value ) )
400  {
402  }
403  }
404 
405 
406  template<typename T>
408  {
409  return _pMap->operator[](*_currentIterator);
410  }
411 
412  template<typename T>
414  {
415 
416  return &(_pMap->operator[](*_currentIterator));
417  }
418 
419  template<typename T>
421  {
422  if(_currentIterator != _pMap->owner().edgeEnd())
423  {
425  }
426  while( (_currentIterator != _pMap->owner().edgeEnd())
427  &&
428  !(_pMap->operator[](*_currentIterator) == _value ) )
429  {
431  }
432  return *this;
433  }
434 
435  template<typename T>
437  {
438  Self tmp = *this;
439  if(_currentIterator != _pMap->owner().edgeEnd())
440  {
442  }
443  while( (_currentIterator != _pMap->owner().edgeEnd())
444  &&
445  !(_pMap->operator[](*_currentIterator) == _value ) )
446  {
448  }
449  return tmp;
450  }
451 
452 
453  template<typename T>
454  bool EdgeMapIterator<T>::operator==(const Self & it) const
455  {
456  return (_pMap == it._pMap) && (_currentIterator == it._currentIterator);
457  }
458 
459  template<typename T>
460  bool EdgeMapIterator<T>::operator !=(const Self & it) const
461  {
462  return !(*this == it);
463  }
464 
465  };
466 };
467 
468 #endif
EdgeMapIterator< ValueType > egdeEnd(ConstReference value) const
EdgeMap< T >::Pointer pointer
Definition: EdgeMap.hh:252
static string typeName()
Definition: EdgeMap.hh:32
bool operator!=(const Self &it) const
Definition: EdgeMap.hh:460
InputIterator initValue(EdgeMap< T > &map, InputIterator start, InputIterator end, typename EdgeMap< T >::ConstReference value)
Definition: EdgeMap.hh:365
EdgeMap< T >::Reference Reference
Definition: EdgeMap.hh:255
Reference operator*() const
Definition: EdgeMap.hh:407
Reference operator[](Edge edge)
Definition: EdgeMap.hh:331
vector< T >::const_reverse_iterator ConstReverseIterator
Definition: EdgeMap.hh:85
vector< ValueType > _tabData
Definition: EdgeMap.hh:214
EdgeMapIterator< ValueType > edgeBegin(ConstReference value) const
Diades::Utils::Exception< EdgeMap > Exception
Definition: EdgeMap.hh:35
const Graph & owner() const
Definition: EdgeImpl.hh:85
vector< T >::pointer Pointer
Definition: EdgeMap.hh:73
EdgeMap< T >::ConstReference ConstReference
Definition: EdgeMap.hh:256
EdgeMapIterator< T > Self
Definition: EdgeMap.hh:244
Definition: Run.cc:88
bool operator==(const Self &it) const
Definition: EdgeMap.hh:454
NodeIterator nodeEnd()
Definition: GraphInt.hh:538
#define ensure(Exception, expr, message)
Definition: Assertion.hh:98
EdgeIterator edgeEnd()
Definition: GraphInt.hh:574
EdgeIterator initValue(EdgeIterator begin, EdgeIterator end, ConstReference value)
EdgeMap< T >::Pointer Pointer
Definition: EdgeMap.hh:253
const Graph & owner() const
Definition: EdgeMap.hh:154
vector< T >::size_type SizeType
Definition: EdgeMap.hh:61
vector< T >::allocator_type AllocatorType
Definition: EdgeMap.hh:69
vector< T >::const_pointer ConstPointer
Definition: EdgeMap.hh:77
vector< T >::reverse_iterator ReverseIterator
Definition: EdgeMap.hh:81
vector< T >::difference_type DifferenceType
Definition: EdgeMap.hh:65
std::forward_iterator_tag IteratorCategory
Definition: EdgeMap.hh:248
void init(Graph &g, SizeType capacity=0, ValueType dflt=ValueType())
Definition: EdgeMap.hh:314
#define require(Exception, expr, message)
Definition: Assertion.hh:90
Namespace of the Diades project.
bool operator!=(const Graph &g) const
Definition: GraphIntOld.hh:216
vector< T >::const_reference ConstReference
Definition: EdgeMap.hh:45
list< Edge >::iterator LocalEdgeIterator
Definition: Edge.hh:315
std::forward_iterator_tag iterator_category
Definition: EdgeMap.hh:247
const EdgeMap< ValueType > * _pMap
Definition: EdgeMap.hh:258
EdgeId id() const
Definition: Edge.hh:177
boost::adjacency_list Graph
Definition: ScaleFree.cc:9
bool operator==(const Graph &g) const
Definition: GraphIntOld.hh:205
EdgeMap< T >::ValueType value_type
Definition: EdgeMap.hh:249
vector< T >::value_type ValueType
Definition: EdgeMap.hh:49
bool valid() const
Definition: EdgeImpl.hh:72
EdgeMap< T >::ValueType ValueType
Definition: EdgeMap.hh:250
bool valid() const
Definition: EdgeMap.hh:191
vector< T >::reference Reference
Definition: EdgeMap.hh:41
vector< T >::const_iterator ConstIterator
Definition: EdgeMap.hh:57
vector< T >::iterator Iterator
Definition: EdgeMap.hh:53
EdgeMap< T >::Reference reference
Definition: EdgeMap.hh:254
Pointer operator->() const
Definition: EdgeMap.hh:413