Added windows build howto into README
[imgsort.git] / fbiterator.cpp
1 #include "fbiterator.h"
2
3
4 #include <algorithm> // max, min
5
6 using std::max;
7 using std::min;
8
9
10 const QString FBIterator::null_string = QString();
11 const ScaleCropRule FBIterator::null_scr = ScaleCropRule();
12
13 static int iterator_minus(const _QMQSSCRCI & end, const _QMQSSCRCI & begin) {
14   _QMQSSCRCI ix = begin;
15   int res = 0;
16   
17   while (ix != end) {
18     ++ix;
19     res++;
20   }
21   return res;
22 }
23
24
25 FBIterator::FBIterator(_QMQSSCRCI list_begin, _QMQSSCRCI list_end, _QMQSSCRCI list_curr) {
26   it = list_curr;
27   before_begin = -(iterator_minus(list_curr, list_begin));
28   behind_last = -(iterator_minus(list_end, list_curr) - 1);
29   if (!isValid()) it = list_begin;
30 }
31 FBIterator::FBIterator(_QMQSSCRCI list_begin, _QMQSSCRCI list_end) {
32   it = list_begin;
33   before_begin = 0;
34   behind_last = -(iterator_minus(list_end, list_begin) - 1);
35 }
36 FBIterator::FBIterator(const FBIterator & fbi) {
37   it = fbi.it; before_begin = fbi.before_begin; behind_last = fbi.behind_last;
38 }
39 bool FBIterator::isValid() {
40   return ((before_begin <= 0) && (behind_last <= 0));
41 }
42 const QString & FBIterator::operator*() {
43   if (isValid()) return it.key();
44   else return null_string;
45 }
46 const ScaleCropRule & FBIterator::getSCR() {
47   if (isValid()) return it.value();
48   else return null_scr;
49 }
50 void FBIterator::setSCR(const ScaleCropRule & newscr) {
51   if (isValid()) it.value() = newscr;
52 }
53 bool FBIterator::hasNext(int how_many) {
54   return (behind_last <= -how_many);
55 }
56 bool FBIterator::hasPrev(int how_many){
57   return (before_begin <= -how_many);
58 }
59 FBIterator & FBIterator::next_go(int how_many) {
60   bool valid_before = isValid();
61   before_begin -= how_many;
62   behind_last += how_many;
63   if (valid_before && isValid()) it += how_many;
64   else if (valid_before) it -= -(before_begin + how_many); // it = begin()
65   else if (isValid()) it += -before_begin; // move it from begin() to correct position
66   // else do nothing
67   return *this;
68 }
69 FBIterator & FBIterator::prev_go(int how_many) {
70   return next_go(-how_many);
71 }
72 FBIterator FBIterator::next_get(int how_many) {
73   FBIterator creat(*this);
74   return creat.next_go(how_many);
75 }
76 FBIterator FBIterator::prev_get(int how_many) {
77   FBIterator creat(*this);
78   return creat.next_go(-how_many);
79 }
80
81 FBIterator FBIterator::subiterator_post(int max_size) {
82   FBIterator creat(*this);
83   creat.before_begin = max(0, before_begin);
84   creat.behind_last = max(-max_size, behind_last);
85   return creat;
86 }
87 FBIterator FBIterator::subiterator_pre(int max_size) {
88   FBIterator creat(*this);
89   creat.before_begin = max(-max_size, before_begin);
90   creat.behind_last = max(0, behind_last);
91   return creat;
92 }
93
94