OpenGM  2.3.x
Discrete Graphical Model Library
subsequence_iterator.hxx
Go to the documentation of this file.
1 #ifndef OPENGM_SUBSEQUENCE_ITERATOR_HXX_
2 #define OPENGM_SUBSEQUENCE_ITERATOR_HXX_
3 
4 #include <iterator>
5 
6 namespace opengm {
7 
8 /*********************
9  * class definitions *
10  *********************/
11 template<class SEQUENCE_ITERATOR_TYPE, class SUBSEQUENCE_INDICES_ITERATOR_TYPE>
12 class SubsequenceIterator : public std::iterator<std::random_access_iterator_tag, typename SEQUENCE_ITERATOR_TYPE::value_type > {
13 public:
14  // typedefs
15  typedef SEQUENCE_ITERATOR_TYPE SequenceIteratorType;
16  typedef SUBSEQUENCE_INDICES_ITERATOR_TYPE SubsequenceIndicesIteratorType;
18  typedef typename SequenceIteratorType::value_type value_type;
19  typedef std::random_access_iterator_tag iterator_category;
20  typedef typename std::iterator<std::random_access_iterator_tag, value_type>::difference_type difference_type;
21  typedef value_type& reference;
22  typedef value_type* pointer;
23 
24  // constructor
26  SubsequenceIterator(const SubsequenceIteratorType& copy);
27  SubsequenceIterator(const SequenceIteratorType sequenceBegin, const SubsequenceIndicesIteratorType subsequenceIndicesBegin, const size_t subsequenceIndicesPosition = 0);
28 
29  // assignment
30  SubsequenceIteratorType& operator=(const SubsequenceIteratorType& copy);
31 
32  // increment
33  SubsequenceIteratorType& operator++(); // PREFIX
34  SubsequenceIteratorType operator++(int); // POSTFIX
35  SubsequenceIteratorType operator+(const difference_type& n) const;
36  SubsequenceIteratorType& operator+=(const difference_type& n);
37 
38  // decrement
39  SubsequenceIteratorType& operator--(); // PREFIX
40  SubsequenceIteratorType operator--(int); // POSTFIX
41  SubsequenceIteratorType operator-(const difference_type& n) const;
42  SubsequenceIteratorType& operator-=(const difference_type& n);
43 
44  // access
45  const value_type& operator*() const;
46  const value_type* operator->() const;
47  const value_type& operator[](const difference_type& n) const;
48 protected:
49  // storage
50  SequenceIteratorType sequenceBegin_;
51  SubsequenceIndicesIteratorType subsequenceIndicesBegin_;
53 
54  // friends
55  inline friend bool operator==(const SubsequenceIteratorType& iter1, const SubsequenceIteratorType& iter2) {
57  }
58  inline friend bool operator!=(const SubsequenceIteratorType& iter1, const SubsequenceIteratorType& iter2) {
60  }
61  inline friend bool operator<(const SubsequenceIteratorType& iter1, const SubsequenceIteratorType& iter2) {
63  }
64  inline friend bool operator>(const SubsequenceIteratorType& iter1, const SubsequenceIteratorType& iter2) {
66  }
67  inline friend bool operator<=(const SubsequenceIteratorType& iter1, const SubsequenceIteratorType& iter2) {
69  }
70  inline friend bool operator>=(const SubsequenceIteratorType& iter1, const SubsequenceIteratorType& iter2) {
72  }
73  inline friend difference_type operator-(const SubsequenceIteratorType& iter1, const SubsequenceIteratorType& iter2) {
75  }
76 };
77 
78 /***********************
79  * class documentation *
80  ***********************/
346 /******************
347  * implementation *
348  ******************/
349 template<class SEQUENCE_ITERATOR_TYPE, class SUBSEQUENCE_INDICES_ITERATOR_TYPE>
351  : sequenceBegin_(), subsequenceIndicesBegin_(), subsequenceIndicesPosition_() {
352 
353 }
354 
355 template<class SEQUENCE_ITERATOR_TYPE, class SUBSEQUENCE_INDICES_ITERATOR_TYPE>
357  : sequenceBegin_(copy.sequenceBegin_),
358  subsequenceIndicesBegin_(copy.subsequenceIndicesBegin_),
359  subsequenceIndicesPosition_(copy.subsequenceIndicesPosition_) {
360 
361 }
362 
363 template<class SEQUENCE_ITERATOR_TYPE, class SUBSEQUENCE_INDICES_ITERATOR_TYPE>
364 inline SubsequenceIterator<SEQUENCE_ITERATOR_TYPE, SUBSEQUENCE_INDICES_ITERATOR_TYPE>::SubsequenceIterator(const SequenceIteratorType sequenceBegin, const SubsequenceIndicesIteratorType subsequenceIndicesBegin, const size_t subsequenceIndicesPosition)
365  : sequenceBegin_(sequenceBegin), subsequenceIndicesBegin_(subsequenceIndicesBegin), subsequenceIndicesPosition_(subsequenceIndicesPosition) {
366 
367 }
368 
369 template<class SEQUENCE_ITERATOR_TYPE, class SUBSEQUENCE_INDICES_ITERATOR_TYPE>
371  sequenceBegin_ = copy.sequenceBegin_;
372  subsequenceIndicesBegin_ = copy.subsequenceIndicesBegin_;
373  subsequenceIndicesPosition_ = copy.subsequenceIndicesPosition_;
374  return *this;
375 }
376 
377 template<class SEQUENCE_ITERATOR_TYPE, class SUBSEQUENCE_INDICES_ITERATOR_TYPE>
379  ++subsequenceIndicesPosition_;
380  return *this;
381 }
382 
383 template<class SEQUENCE_ITERATOR_TYPE, class SUBSEQUENCE_INDICES_ITERATOR_TYPE>
385  return SubsequenceIteratorType(sequenceBegin_, subsequenceIndicesBegin_, subsequenceIndicesPosition_++);
386 }
387 
388 template<class SEQUENCE_ITERATOR_TYPE, class SUBSEQUENCE_INDICES_ITERATOR_TYPE>
390  return SubsequenceIteratorType(sequenceBegin_, subsequenceIndicesBegin_, subsequenceIndicesPosition_ + n);
391 }
392 
393 template<class SEQUENCE_ITERATOR_TYPE, class SUBSEQUENCE_INDICES_ITERATOR_TYPE>
395  subsequenceIndicesPosition_ += n;
396  return *this;
397 }
398 
399 template<class SEQUENCE_ITERATOR_TYPE, class SUBSEQUENCE_INDICES_ITERATOR_TYPE>
401  --subsequenceIndicesPosition_;
402  return *this;
403 }
404 
405 template<class SEQUENCE_ITERATOR_TYPE, class SUBSEQUENCE_INDICES_ITERATOR_TYPE>
407  return SubsequenceIteratorType(sequenceBegin_, subsequenceIndicesBegin_, subsequenceIndicesPosition_--);
408 }
409 
410 template<class SEQUENCE_ITERATOR_TYPE, class SUBSEQUENCE_INDICES_ITERATOR_TYPE>
412  return SubsequenceIteratorType(sequenceBegin_, subsequenceIndicesBegin_, subsequenceIndicesPosition_ - n);
413 }
414 
415 template<class SEQUENCE_ITERATOR_TYPE, class SUBSEQUENCE_INDICES_ITERATOR_TYPE>
417  subsequenceIndicesPosition_ -= n;
418  return *this;
419 }
420 
421 template<class SEQUENCE_ITERATOR_TYPE, class SUBSEQUENCE_INDICES_ITERATOR_TYPE>
423  return sequenceBegin_[subsequenceIndicesBegin_[subsequenceIndicesPosition_]];
424 }
425 
426 template<class SEQUENCE_ITERATOR_TYPE, class SUBSEQUENCE_INDICES_ITERATOR_TYPE>
428  return &(sequenceBegin_[subsequenceIndicesBegin_[subsequenceIndicesPosition_]]);
429 }
430 
431 template<class SEQUENCE_ITERATOR_TYPE, class SUBSEQUENCE_INDICES_ITERATOR_TYPE>
433  return sequenceBegin_[subsequenceIndicesBegin_[subsequenceIndicesPosition_ + n]];
434 }
435 
436 } // namespace opengm
437 
438 #endif /* OPENGM_SUBSEQUENCE_ITERATOR_HXX_ */
SUBSEQUENCE_INDICES_ITERATOR_TYPE SubsequenceIndicesIteratorType
Typedef of the SUBSEQUENCE_INDICES_ITERATOR_TYPE template parameter from the class SubsequenceIterato...
size_t subsequenceIndicesPosition_
Current Position of the iterator. Hence subsequenceIndicesPosition_ contains the number of the elemen...
std::iterator< std::random_access_iterator_tag, value_type >::difference_type difference_type
STL compliant typedef of the iterator difference type.
SubsequenceIteratorType & operator=(const SubsequenceIteratorType &copy)
SubsequenceIterator assignment operator.
The OpenGM namespace.
Definition: config.hxx:43
SubsequenceIterator()
SubsequenceIterator constructor.
SequenceIteratorType::value_type value_type
Value type of the sequence adapted from SubsequenceIterator::SequenceIteratorType.
const value_type & operator[](const difference_type &n) const
Offset dereference operator.
Defines the const iterator type to iterate over the subset of a sequence.
friend bool operator>=(const SubsequenceIteratorType &iter1, const SubsequenceIteratorType &iter2)
Greater or equal comparison operator for two SubsequenceIterator iterators.
value_type & reference
STL compliant typedef of the iterator reference type.
SubsequenceIndicesIteratorType subsequenceIndicesBegin_
Iterator pointing to the begin of a sequence where the indices for the elements of the subsequence ar...
value_type * pointer
STL compliant typedef of the iterator pointer type.
SubsequenceIteratorType & operator--()
Prefix decrement operator.
SubsequenceIteratorType & operator-=(const difference_type &n)
Compound assignment operator to decrement iterator by an integer value.
friend bool operator!=(const SubsequenceIteratorType &iter1, const SubsequenceIteratorType &iter2)
Inequality comparison operator for two SubsequenceIterator iterators.
SubsequenceIteratorType & operator++()
Prefix increment operator.
SubsequenceIteratorType & operator+=(const difference_type &n)
Compound assignment operator to increment iterator by an integer value.
std::random_access_iterator_tag iterator_category
STL compliant typedef of the iterator category.
SEQUENCE_ITERATOR_TYPE SequenceIteratorType
Typedef of the SEQUENCE_ITERATOR_TYPE template parameter from the class SubsequenceIterator.
const value_type * operator->() const
Pointer operator.
friend bool operator>(const SubsequenceIteratorType &iter1, const SubsequenceIteratorType &iter2)
Greater comparison operator for two SubsequenceIterator iterators.
SubsequenceIteratorType operator+(const difference_type &n) const
Arithmetic operator to increment iterator by an integer value.
const value_type & operator*() const
Dereference operator.
friend bool operator<=(const SubsequenceIteratorType &iter1, const SubsequenceIteratorType &iter2)
Less or equal comparison operator for two SubsequenceIterator iterators.
SequenceIteratorType sequenceBegin_
Iterator pointing to the begin of a sequence of values. The subsequence iterator will iterate over th...
friend bool operator==(const SubsequenceIteratorType &iter1, const SubsequenceIteratorType &iter2)
Equality comparison operator for two SubsequenceIterator iterators.
friend difference_type operator-(const SubsequenceIteratorType &iter1, const SubsequenceIteratorType &iter2)
Difference operator for two subsequence iterators.
SubsequenceIterator< SequenceIteratorType, SubsequenceIndicesIteratorType > SubsequenceIteratorType
Typedef of the class SubsequenceIterator with appropriate template parameter.
SubsequenceIteratorType operator-(const difference_type &n) const
Arithmetic operator to decrement iterator by an integer value.
friend bool operator<(const SubsequenceIteratorType &iter1, const SubsequenceIteratorType &iter2)
Less comparison operator for two SubsequenceIterator iterators.