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 #ifndef __GECODE_INT_CHANNEL_HH__
00039 #define __GECODE_INT_CHANNEL_HH__
00040
00041 #include <gecode/int.hh>
00042 #include <gecode/int/distinct.hh>
00043
00049 namespace Gecode { namespace Int { namespace Channel {
00050
00052 typedef Support::StaticStack<int,Region> ProcessStack;
00053
00058 template<class Info, PropCond pc>
00059 class Base : public Propagator {
00060 protected:
00062 int n;
00064 int n_na;
00066 Info* xy;
00068 Base(Space& home, bool share, Base<Info,pc>& p);
00070 Base(Home home, int n, Info* xy);
00071 public:
00073 virtual PropCost cost(const Space& home, const ModEventDelta& med) const;
00075 virtual size_t dispose(Space& home);
00076 };
00077
00078
00083 template<class View> class ValInfo;
00084
00094 template<class View, bool shared>
00095 class Val : public Base<ValInfo<View>,PC_INT_VAL> {
00096 protected:
00097 using Base<ValInfo<View>,PC_INT_VAL>::n;
00098 using Base<ValInfo<View>,PC_INT_VAL>::n_na;
00099 using Base<ValInfo<View>,PC_INT_VAL>::xy;
00101 Val(Space& home, bool share, Val& p);
00103 Val(Home home, int n, ValInfo<View>* xy);
00104 public:
00106 virtual Actor* copy(Space& home, bool share);
00108 virtual ExecStatus propagate(Space& home, const ModEventDelta& med);
00110 static ExecStatus post(Home home, int n, ValInfo<View>* xy);
00111 };
00112
00117 template<class View> class DomInfo;
00118
00128 template<class View, bool shared>
00129 class Dom : public Base<DomInfo<View>,PC_INT_DOM> {
00130 protected:
00131 using Base<DomInfo<View>,PC_INT_DOM>::n;
00132 using Base<DomInfo<View>,PC_INT_DOM>::n_na;
00133 using Base<DomInfo<View>,PC_INT_DOM>::xy;
00135 Distinct::DomCtrl<View> dc;
00137 Dom(Space& home, bool share, Dom& p);
00139 Dom(Home home, int n, DomInfo<View>* xy);
00140 public:
00142 virtual Actor* copy(Space& home, bool share);
00149 virtual PropCost cost(const Space& home, const ModEventDelta& med) const;
00151 virtual ExecStatus propagate(Space& home, const ModEventDelta& med);
00153 static ExecStatus post(Home home, int n, DomInfo<View>* xy);
00154 };
00155
00162 class LinkSingle :
00163 public MixBinaryPropagator<BoolView,PC_BOOL_VAL,IntView,PC_INT_VAL> {
00164 private:
00165 using MixBinaryPropagator<BoolView,PC_BOOL_VAL,IntView,PC_INT_VAL>::x0;
00166 using MixBinaryPropagator<BoolView,PC_BOOL_VAL,IntView,PC_INT_VAL>::x1;
00167
00169 LinkSingle(Space& home, bool share, LinkSingle& p);
00171 LinkSingle(Home home, BoolView x0, IntView x1);
00172 public:
00174 virtual Actor* copy(Space& home, bool share);
00176 virtual PropCost cost(const Space& home, const ModEventDelta& med) const;
00178 virtual ExecStatus propagate(Space& home, const ModEventDelta& med);
00180 static ExecStatus post(Home home, BoolView x0, IntView x1);
00181 };
00182
00189 class LinkMulti :
00190 public MixNaryOnePropagator<BoolView,PC_BOOL_VAL,IntView,PC_INT_DOM> {
00191 private:
00192 using MixNaryOnePropagator<BoolView,PC_BOOL_VAL,IntView,PC_INT_DOM>::x;
00193 using MixNaryOnePropagator<BoolView,PC_BOOL_VAL,IntView,PC_INT_DOM>::y;
00195 int o;
00197 LinkMulti(Space& home, bool share, LinkMulti& p);
00199 LinkMulti(Home home, ViewArray<BoolView>& x, IntView y, int o0);
00200 public:
00202 virtual Actor* copy(Space& home, bool share);
00204 virtual PropCost cost(const Space& home, const ModEventDelta& med) const;
00206 virtual ExecStatus propagate(Space& home, const ModEventDelta& med);
00208 GECODE_INT_EXPORT
00209 static ExecStatus post(Home home,
00210 ViewArray<BoolView>& x, IntView y, int o);
00211 };
00212
00213 }}}
00214
00215 #include <gecode/int/channel/base.hpp>
00216 #include <gecode/int/channel/val.hpp>
00217 #include <gecode/int/channel/dom.hpp>
00218
00219 #include <gecode/int/channel/link-single.hpp>
00220 #include <gecode/int/channel/link-multi.hpp>
00221
00222 #endif
00223
00224
00225