ranges-positive.hpp
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
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 #include <algorithm>
00039
00040 namespace Gecode { namespace Iter { namespace Ranges {
00041
00049 template<class I, bool strict=false>
00050 class Positive {
00051 private:
00053 IsRangeIter<I> _checkI;
00054 private:
00056 I i;
00057 public:
00059
00060
00061 Positive(void);
00063 Positive(I& i);
00065 void init(I& i);
00067
00069
00070
00071 bool operator ()(void) const;
00073 void operator ++(void);
00075
00077
00078
00079 int min(void) const;
00081 int max(void) const;
00083 unsigned int width(void) const;
00085 };
00086
00087
00088 template<class I, bool strict>
00089 forceinline
00090 Positive<I,strict>::Positive(void) {}
00091
00092 template<class I, bool strict>
00093 forceinline void
00094 Positive<I,strict>::init(I& i0) {
00095 i=i0;
00096 if (strict) {
00097 while (i() && (i.max() < 0)) ++i;
00098 } else {
00099 while (i() && (i.max() <= 0)) ++i;
00100 }
00101 }
00102
00103 template<class I, bool strict>
00104 forceinline
00105 Positive<I,strict>::Positive(I& i) {
00106 init(i);
00107 }
00108
00109 template<class I, bool strict>
00110 forceinline void
00111 Positive<I,strict>::operator ++(void) {
00112 ++i;
00113 }
00114 template<class I, bool strict>
00115 forceinline bool
00116 Positive<I,strict>::operator ()(void) const {
00117 return i();
00118 }
00119
00120 template<class I, bool strict>
00121 forceinline int
00122 Positive<I,strict>::min(void) const {
00123 if (strict) {
00124 return std::max(i.min(),1);
00125 } else {
00126 return std::max(i.min(),0);
00127 }
00128 }
00129 template<class I, bool strict>
00130 forceinline int
00131 Positive<I,strict>::max(void) const {
00132 return i.max();
00133 }
00134 template<class I, bool strict>
00135 forceinline unsigned int
00136 Positive<I,strict>::width(void) const {
00137 return static_cast<unsigned int>(max()-min()+1);
00138 }
00139
00140 }}}
00141
00142