ranges-negative.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
00046 template<class I, bool strict=false>
00047 class Negative {
00048 protected:
00050 I i;
00051 public:
00053
00054
00055 Negative(void);
00057 Negative(I& i);
00059 void init(I& i);
00061
00063
00064
00065 bool operator ()(void) const;
00067 void operator ++(void);
00069
00071
00072
00073 int min(void) const;
00075 int max(void) const;
00077 unsigned int width(void) const;
00079 };
00080
00081
00082 template<class I, bool strict>
00083 forceinline
00084 Negative<I,strict>::Negative(void) {}
00085
00086 template<class I, bool strict>
00087 forceinline void
00088 Negative<I,strict>::init(I& i0) {
00089 i=i0;
00090 }
00091
00092 template<class I, bool strict>
00093 forceinline
00094 Negative<I,strict>::Negative(I& i0) : i(i0) {}
00095
00096 template<class I, bool strict>
00097 forceinline void
00098 Negative<I,strict>::operator ++(void) {
00099 ++i;
00100 }
00101 template<class I, bool strict>
00102 forceinline bool
00103 Negative<I,strict>::operator ()(void) const {
00104 if (strict) {
00105 return i() && (i.min() < 0);
00106 } else {
00107 return i() && (i.min() <= 0);
00108 }
00109 }
00110
00111 template<class I, bool strict>
00112 forceinline int
00113 Negative<I,strict>::min(void) const {
00114 return i.min();
00115 }
00116 template<class I, bool strict>
00117 forceinline int
00118 Negative<I,strict>::max(void) const {
00119 if (strict) {
00120 return std::min(i.max(),-1);
00121 } else {
00122 return std::min(i.max(),0);
00123 }
00124 }
00125 template<class I, bool strict>
00126 forceinline unsigned int
00127 Negative<I,strict>::width(void) const {
00128 return static_cast<unsigned int>(max()-min()+1);
00129 }
00130
00131 }}}
00132
00133