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 namespace Gecode {
00039
00040 namespace Int {
00041
00042
00043
00044
00045
00046 forceinline
00047 OffsetView::OffsetView(void) {}
00048 forceinline
00049 OffsetView::OffsetView(const IntView& x, int d)
00050 : DerivedViewBase<IntView>(x), c(d) {}
00051 forceinline void
00052 OffsetView::init(const IntView& x, int d) {
00053 view=x; c=d;
00054 }
00055 forceinline int
00056 OffsetView::offset(void) const {
00057 return c;
00058 }
00059
00060
00061
00062
00063
00064
00065 forceinline int
00066 OffsetView::min(void) const {
00067 return view.min()+c;
00068 }
00069 forceinline int
00070 OffsetView::max(void) const {
00071 return view.max()+c;
00072 }
00073 forceinline int
00074 OffsetView::med(void) const {
00075 return view.med()+c;
00076 }
00077 forceinline int
00078 OffsetView::val(void) const {
00079 return view.val()+c;
00080 }
00081
00082 forceinline unsigned int
00083 OffsetView::width(void) const {
00084 return view.width();
00085 }
00086 forceinline unsigned int
00087 OffsetView::size(void) const {
00088 return view.size();
00089 }
00090 forceinline unsigned int
00091 OffsetView::regret_min(void) const {
00092 return view.regret_min();
00093 }
00094 forceinline unsigned int
00095 OffsetView::regret_max(void) const {
00096 return view.regret_max();
00097 }
00098
00099
00100
00101
00102
00103 forceinline bool
00104 OffsetView::range(void) const {
00105 return view.range();
00106 }
00107 forceinline bool
00108 OffsetView::assigned(void) const {
00109 return view.assigned();
00110 }
00111
00112 forceinline bool
00113 OffsetView::in(int n) const {
00114 return view.in(n-c);
00115 }
00116 forceinline bool
00117 OffsetView::in(double n) const {
00118 return view.in(n-c);
00119 }
00120
00121
00122
00123
00124
00125
00126 forceinline ModEvent
00127 OffsetView::lq(Space& home, int n) {
00128 return view.lq(home,n-c);
00129 }
00130 forceinline ModEvent
00131 OffsetView::lq(Space& home, double n) {
00132 return view.lq(home,n-c);
00133 }
00134 forceinline ModEvent
00135 OffsetView::le(Space& home, int n) {
00136 return view.le(home,n-c);
00137 }
00138 forceinline ModEvent
00139 OffsetView::le(Space& home, double n) {
00140 return view.le(home,n-c);
00141 }
00142 forceinline ModEvent
00143 OffsetView::gq(Space& home, int n) {
00144 return view.gq(home,n-c);
00145 }
00146 forceinline ModEvent
00147 OffsetView::gq(Space& home, double n) {
00148 return view.gq(home,n-c);
00149 }
00150 forceinline ModEvent
00151 OffsetView::gr(Space& home, int n) {
00152 return view.gr(home,n-c);
00153 }
00154 forceinline ModEvent
00155 OffsetView::gr(Space& home, double n) {
00156 return view.gr(home,n-c);
00157 }
00158 forceinline ModEvent
00159 OffsetView::nq(Space& home, int n) {
00160 return view.nq(home,n-c);
00161 }
00162 forceinline ModEvent
00163 OffsetView::nq(Space& home, double n) {
00164 return view.nq(home,n-c);
00165 }
00166 forceinline ModEvent
00167 OffsetView::eq(Space& home, int n) {
00168 return view.eq(home,n-c);
00169 }
00170 forceinline ModEvent
00171 OffsetView::eq(Space& home, double n) {
00172 return view.eq(home,n-c);
00173 }
00174
00175
00176
00177
00178
00179
00180 template<class I>
00181 forceinline ModEvent
00182 OffsetView::narrow_r(Space& home, I& i, bool depend) {
00183 Iter::Ranges::Offset<I> oi(i,-c);
00184 return view.narrow_r(home,oi,depend);
00185 }
00186 template<class I>
00187 forceinline ModEvent
00188 OffsetView::inter_r(Space& home, I& i, bool depend) {
00189 Iter::Ranges::Offset<I> oi(i,-c);
00190 return view.inter_r(home,oi,depend);
00191 }
00192 template<class I>
00193 forceinline ModEvent
00194 OffsetView::minus_r(Space& home, I& i, bool depend) {
00195 Iter::Ranges::Offset<I> oi(i,-c);
00196 return view.minus_r(home,oi,depend);
00197 }
00198 template<class I>
00199 forceinline ModEvent
00200 OffsetView::narrow_v(Space& home, I& i, bool depend) {
00201 Iter::Values::Offset<I> oi(i,-c);
00202 return view.narrow_v(home,oi,depend);
00203 }
00204 template<class I>
00205 forceinline ModEvent
00206 OffsetView::inter_v(Space& home, I& i, bool depend) {
00207 Iter::Values::Offset<I> oi(i,-c);
00208 return view.inter_v(home,oi,depend);
00209 }
00210 template<class I>
00211 forceinline ModEvent
00212 OffsetView::minus_v(Space& home, I& i, bool depend) {
00213 Iter::Values::Offset<I> oi(i,-c);
00214 return view.minus_v(home,oi,depend);
00215 }
00216
00217
00218
00219
00220
00221
00222
00223 forceinline void
00224 OffsetView::schedule(Space& home, Propagator& p, ModEvent me) {
00225 return IntView::schedule(home,p,me);
00226 }
00227 forceinline ModEvent
00228 OffsetView::me(const ModEventDelta& med) {
00229 return IntView::me(med);
00230 }
00231 forceinline ModEventDelta
00232 OffsetView::med(ModEvent me) {
00233 return IntView::med(me);
00234 }
00235
00236
00237
00238
00239
00240
00241 forceinline void
00242 OffsetView::subscribe(Space& home, Propagator& p, PropCond pc,
00243 bool process) {
00244 view.subscribe(home,p,pc,process);
00245 }
00246 forceinline void
00247 OffsetView::cancel(Space& home, Propagator& p, PropCond pc) {
00248 view.cancel(home,p,pc);
00249 }
00250 forceinline void
00251 OffsetView::subscribe(Space& home, Advisor& a) {
00252 view.subscribe(home,a);
00253 }
00254 forceinline void
00255 OffsetView::cancel(Space& home, Advisor& a) {
00256 view.cancel(home,a);
00257 }
00258
00259
00260
00261
00262
00263
00264 forceinline ModEvent
00265 OffsetView::modevent(const Delta& d) {
00266 return IntView::modevent(d);
00267 }
00268 forceinline int
00269 OffsetView::min(const Delta& d) const {
00270 return view.min(d)+c;
00271 }
00272 forceinline int
00273 OffsetView::max(const Delta& d) const {
00274 return view.max(d)+c;
00275 }
00276 forceinline bool
00277 OffsetView::any(const Delta& d) const {
00278 return view.any(d);
00279 }
00280
00281
00282
00283
00284
00285
00286
00287 forceinline void
00288 OffsetView::update(Space& home, bool share, OffsetView& x) {
00289 c=x.c; view.update(home,share,x.view);
00290 }
00291
00292
00297 template<>
00298 class ViewRanges<OffsetView>
00299 : public Iter::Ranges::Offset<ViewRanges<IntView> > {
00300 public:
00302
00303
00304 ViewRanges(void);
00306 ViewRanges(const OffsetView& x);
00308 void init(const OffsetView& x);
00310 };
00311
00312 forceinline
00313 ViewRanges<OffsetView>::ViewRanges(void) {}
00314
00315 forceinline
00316 ViewRanges<OffsetView>::ViewRanges(const OffsetView& x) {
00317 ViewRanges<IntView> xi(x.base());
00318 Iter::Ranges::Offset<ViewRanges<IntView> >::init(xi,x.offset());
00319 }
00320
00321 forceinline void
00322 ViewRanges<OffsetView>::init(const OffsetView& x) {
00323 ViewRanges<IntView> xi(x.base());
00324 Iter::Ranges::Offset<ViewRanges<IntView> >::init(xi,x.offset());
00325 }
00326 }
00327
00328
00329
00330
00331
00332 forceinline bool
00333 same(const Int::OffsetView& x, const Int::OffsetView& y) {
00334 return same(x.base(),y.base()) && (x.offset() == y.offset());
00335 }
00336 forceinline bool
00337 before(const Int::OffsetView& x, const Int::OffsetView& y) {
00338 return before(x.base(),y.base())
00339 || (same(x.base(),y.base()) && (x.offset() < y.offset()));
00340 }
00341
00342 }
00343
00344
00345