Effective implementation of algorithms (Master Thesis)
Effective and error-free implementation of algorithms
|
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