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 #include <algorithm>
00035
00036 namespace Gecode { namespace Iter { namespace Ranges {
00037
00045 template<class I, bool strict=false>
00046 class Positive {
00047 protected:
00049 I i;
00050 public:
00052
00053
00054 Positive(void);
00056 Positive(I& i);
00058 void init(I& i);
00060
00062
00063
00064 bool operator ()(void) const;
00066 void operator ++(void);
00068
00070
00071
00072 int min(void) const;
00074 int max(void) const;
00076 unsigned int width(void) const;
00078 };
00079
00080
00081 template<class I, bool strict>
00082 forceinline
00083 Positive<I,strict>::Positive(void) {}
00084
00085 template<class I, bool strict>
00086 forceinline void
00087 Positive<I,strict>::init(I& i0) {
00088 i=i0;
00089 if (strict) {
00090 while (i() && (i.max() < 0)) ++i;
00091 } else {
00092 while (i() && (i.max() <= 0)) ++i;
00093 }
00094 }
00095
00096 template<class I, bool strict>
00097 forceinline
00098 Positive<I,strict>::Positive(I& i) {
00099 init(i);
00100 }
00101
00102 template<class I, bool strict>
00103 forceinline void
00104 Positive<I,strict>::operator ++(void) {
00105 ++i;
00106 }
00107 template<class I, bool strict>
00108 forceinline bool
00109 Positive<I,strict>::operator ()(void) const {
00110 return i();
00111 }
00112
00113 template<class I, bool strict>
00114 forceinline int
00115 Positive<I,strict>::min(void) const {
00116 if (strict) {
00117 return std::max(i.min(),1);
00118 } else {
00119 return std::max(i.min(),0);
00120 }
00121 }
00122 template<class I, bool strict>
00123 forceinline int
00124 Positive<I,strict>::max(void) const {
00125 return i.max();
00126 }
00127 template<class I, bool strict>
00128 forceinline unsigned int
00129 Positive<I,strict>::width(void) const {
00130 return static_cast<unsigned int>(max()-min()+1);
00131 }
00132
00133 }}}
00134
00135