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
00046
00047 template<class _View, class _Val>
00048 class ValCommit {
00049 public:
00051 typedef _View View;
00053 typedef _Val Val;
00054 public:
00056 ValCommit(Space& home, const ValBranch& vb);
00058 ValCommit(Space& home, bool shared, ValCommit<View,Val>& vs);
00060 bool notice(void) const;
00062 void dispose(Space& home);
00063 };
00064
00066 template<class View>
00067 class ValCommitFunction : public
00068 ValCommit<View,
00069 typename BranchTraits<typename View::VarType>::ValType> {
00070 typedef typename ValCommit<View,
00071 typename BranchTraits<typename View::VarType>
00072 ::ValType>::Val Val;
00073 public:
00075 typedef typename View::VarType Var;
00077 typedef typename BranchTraits<Var>::Commit CommitFunction;
00078 protected:
00080 CommitFunction c;
00081 public:
00083 ValCommitFunction(Space& home, const ValBranch& vb);
00085 ValCommitFunction(Space& home, bool shared, ValCommitFunction& vc);
00087 ModEvent commit(Space& home, unsigned int a, View x, int i, Val n);
00089 NGL* ngl(Space& home, unsigned int a, View x, Val n) const;
00091 void print(const Space& home, unsigned int a, View x, int i,
00092 const Val& n, std::ostream& o) const;
00093 };
00095
00096
00097 template<class View, class Val>
00098 forceinline
00099 ValCommit<View,Val>::ValCommit(Space&, const ValBranch&) {}
00100 template<class View, class Val>
00101 forceinline
00102 ValCommit<View,Val>::ValCommit(Space&, bool, ValCommit<View,Val>&) {}
00103 template<class View, class Val>
00104 forceinline bool
00105 ValCommit<View,Val>::notice(void) const {
00106 return false;
00107 }
00108 template<class View, class Val>
00109 forceinline void
00110 ValCommit<View,Val>::dispose(Space&) {}
00111
00112
00113
00114 template<class View>
00115 forceinline
00116 ValCommitFunction<View>::ValCommitFunction(Space& home,
00117 const ValBranch& vb)
00118 : ValCommit<View,Val>(home,vb),
00119 c(function_cast<CommitFunction>(vb.commit())) {}
00120 template<class View>
00121 forceinline
00122 ValCommitFunction<View>::ValCommitFunction(Space& home, bool shared,
00123 ValCommitFunction<View>& vc)
00124 : ValCommit<View,Val>(home,shared,vc), c(vc.c) {}
00125 template<class View>
00126 forceinline ModEvent
00127 ValCommitFunction<View>::commit(Space& home, unsigned int a, View x, int i,
00128 Val n) {
00129 typename View::VarType y(x.varimp());
00130 c(home,a,y,i,n);
00131 return home.failed() ? ES_FAILED : ES_OK;
00132 }
00133 template<class View>
00134 forceinline NGL*
00135 ValCommitFunction<View>::ngl(Space&, unsigned int, View, Val) const {
00136 return NULL;
00137 }
00138 template<class View>
00139 forceinline void
00140 ValCommitFunction<View>::print(const Space&, unsigned int,
00141 View, int i, const Val&,
00142 std::ostream& o) const {
00143 o << "var[" << i << "] is user-defined.";
00144 }
00145
00146 }
00147
00148