ranges-minus.icc
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "gecode/support/shared-array.hh"
00023
00024 namespace Gecode { namespace Iter { namespace Ranges {
00025
00039 template <class I>
00040 class Minus {
00041 private:
00043 class Range {
00044 public:
00045 int min; int max;
00046 };
00048 Support::SharedArray<Range> r;
00050 int c;
00052 int n;
00053 public:
00055
00056
00057 Minus(void);
00059 Minus(I& i);
00061 void init(I& i);
00063
00065
00066
00067 bool operator()(void) const;
00069 void operator++(void);
00071
00073
00074
00075 int min(void) const;
00077 int max(void) const;
00079 unsigned int width(void) const;
00081 };
00082
00083
00084 template <class I>
00085 forceinline
00086 Minus<I>::Minus(void)
00087 : r(8) {}
00088
00089 template <class I>
00090 inline void
00091 Minus<I>::init(I& i) {
00092 int j = 0;
00093 while (i()) {
00094 r.ensure(j);
00095 r[j].min = -i.max(); r[j].max = -i.min();
00096 ++j; ++i;
00097 }
00098 n = j;
00099 c = n-1;
00100 }
00101
00102 template <class I>
00103 inline
00104 Minus<I>::Minus(I& i) : r(8) {
00105 init(i);
00106 }
00107
00108 template <class I>
00109 forceinline void
00110 Minus<I>::operator++(void) {
00111 c--;
00112 }
00113 template <class I>
00114 forceinline bool
00115 Minus<I>::operator()(void) const {
00116 return c >= 0;
00117 }
00118
00119 template <class I>
00120 forceinline int
00121 Minus<I>::min(void) const {
00122 return r[c].min;
00123 }
00124 template <class I>
00125 forceinline int
00126 Minus<I>::max(void) const {
00127 return r[c].max;
00128 }
00129 template <class I>
00130 forceinline unsigned int
00131 Minus<I>::width(void) const {
00132 return r[c].max-r[c].min+1;
00133 }
00134
00135 }}}
00136
00137
00138