// twoseq_progress.h // seq1Len >= seq2Len? // CASE 1: // 0 i // seq1: **************------- left1 = 0, len = i // seq2: ---------************** // 0 * // left2 // // CASE 2: // left1 // * // seq1: -----------********** // seq2: **********----------- left2 = 0, len = seq1Len - left1 // i class TwoSeqProgress { protected: //int i; // progress: 0 ...... (seq1Len + seq2Len -1) int seq1Len; int seq2Len; public: int i; // progress: 0 ...... (seq1Len + seq2Len -1) int left1; int left2; int len; TwoSeqProgress() : i(0), seq1Len(1), seq2Len(1) {}; TwoSeqProgress( int len1, int len2 ) : seq1Len(len1), seq2Len(len2) {} //TwoSeqProgress( int i0 ) : i(i0) { TwoSeqProgress& operator= ( int i0 ) { // ***** not tested i = i0; // Case 1: if( i < seq1Len ) { left1 = 0; left2 = seq2Len - i - 1; len = i + 1; if( left2 < 0 ) { left1 -= left2; len = seq2Len; left2 = 0; } return *this; // --------------------------------> } // Case 2: // i >= seq1Len: left2 = 0; len = seq1Len + seq2Len - i - 1; left1 = seq1Len - len; if( left1 < 0 ) { left2 = seq2Len - i - 1; len = seq1Len; left1 = 0; } return *this; } bool operator< ( int n) const { return (i < n); } const TwoSeqProgress& operator* () const { return *this ; } TwoSeqProgress& operator++() { i++; if( i < seq1Len ) { left2--; len++; if( left2 < 0 ) { // = -1 // seq2 < seq1 left1 += 1; len = seq2Len; left2 = 0; } return *this; // -----------------------------> } // i >= seq1Len left1++; len--; if( left2 > 0 ) { // = -1 // seq2 > seq1 left2 -= 1; len = seq1Len; left1 = 0; } return *this; } };