Effective implementation of algorithms (Master Thesis)
Effective and error-free implementation of algorithms
src/strings/utils/sequence_helper.h
Go to the documentation of this file.
00001 #ifndef H_SEQUENCE_HELPER
00002 #define H_SEQUENCE_HELPER
00003 
00007 #include "utils/preconditions/preconditions.h"
00008 
00009 namespace strings {
00010 namespace utils {
00011 
00029 template<typename T>
00030 class SequenceHelper {
00031   private:
00032     T* base;
00033     int start;
00034     int length;
00035 
00036     SequenceHelper(T* base_, int start_, int length_) {
00037       base = base_;
00038       start = start_;
00039       length = length_;
00040     }
00041   public:
00042 
00049     SequenceHelper(T* base_, int length_) {
00050       base = base_;
00051       start = 0;
00052       length = length_;
00053     }
00054 
00061     SequenceHelper reversed() const {
00062       if (length >= 0) {
00063         return SequenceHelper(base, start + length - 1, -length);
00064       } else {
00065         return SequenceHelper(base, start + length + 1, -length);
00066       }
00067     }
00068 
00084     SequenceHelper subsequence(int start_, int end_) const {
00085       Preconditions::check(start_ <= end_);
00086       Preconditions::checkRange(start_, size());
00087       Preconditions::checkRange(end_, size() + 1);
00088       int len = end_ - start_;
00089       if (length >= 0) {
00090         return SequenceHelper(base, start + start_, len);
00091       } else {
00092         return SequenceHelper(base, start - start_, -len);
00093       }
00094     }
00095 
00099     int size() const {
00100       return abs(length);
00101     }
00102 
00108     const T& operator[](int pos) const {
00109       Preconditions::checkRange(pos, size());
00110       if (length >= 0 ) {
00111         return base[start + pos];
00112       } else {
00113         return base[start - pos];
00114       }
00115     }
00116     
00122     T& operator[](int pos) {
00123       Preconditions::checkRange(pos, size());
00124       if (length >= 0 ) {
00125         return base[start + pos];
00126       } else {
00127         return base[start - pos];
00128       }
00129     }
00130 };
00131 
00132 } // namespace sequence_helper
00133 } // namespace strings
00134 #endif
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Defines