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_FLATZINC_VARSPEC__HH__
00039 #define __GECODE_FLATZINC_VARSPEC__HH__
00040
00041 #include <gecode/flatzinc/option.hh>
00042 #include <gecode/flatzinc/ast.hh>
00043 #include <vector>
00044 #include <iostream>
00045
00046 namespace Gecode { namespace FlatZinc {
00047
00049 class Alias {
00050 public:
00051 const int v;
00052 Alias(int v0) : v(v0) {}
00053 };
00054
00056 class VarSpec {
00057 public:
00059 virtual ~VarSpec(void) {}
00061 int i;
00063 bool alias;
00065 bool assigned;
00067 bool introduced;
00069 bool funcDep;
00071 VarSpec(bool introduced0, bool funcDep0)
00072 : introduced(introduced0), funcDep(funcDep0) {}
00073 };
00074
00076 class IntVarSpec : public VarSpec {
00077 public:
00078 Option<AST::SetLit* > domain;
00079 IntVarSpec(const Option<AST::SetLit* >& d,
00080 bool introduced, bool funcDep)
00081 : VarSpec(introduced,funcDep) {
00082 alias = false;
00083 assigned = false;
00084 domain = d;
00085 }
00086 IntVarSpec(int i0, bool introduced, bool funcDep)
00087 : VarSpec(introduced,funcDep) {
00088 alias = false; assigned = true; i = i0;
00089 }
00090 IntVarSpec(const Alias& eq, bool introduced, bool funcDep)
00091 : VarSpec(introduced,funcDep) {
00092 alias = true; i = eq.v;
00093 }
00094 ~IntVarSpec(void) {
00095 if (!alias && !assigned && domain())
00096 delete domain.some();
00097 }
00098 };
00099
00101 class BoolVarSpec : public VarSpec {
00102 public:
00103 Option<AST::SetLit* > domain;
00104 BoolVarSpec(Option<AST::SetLit* >& d, bool introduced, bool funcDep)
00105 : VarSpec(introduced,funcDep) {
00106 alias = false; assigned = false; domain = d;
00107 }
00108 BoolVarSpec(bool b, bool introduced, bool funcDep)
00109 : VarSpec(introduced,funcDep) {
00110 alias = false; assigned = true; i = b;
00111 }
00112 BoolVarSpec(const Alias& eq, bool introduced, bool funcDep)
00113 : VarSpec(introduced,funcDep) {
00114 alias = true; i = eq.v;
00115 }
00116 ~BoolVarSpec(void) {
00117 if (!alias && !assigned && domain())
00118 delete domain.some();
00119 }
00120 };
00121
00123 class FloatVarSpec : public VarSpec {
00124 public:
00125 Option<std::pair<double,double> > domain;
00126 FloatVarSpec(Option<std::pair<double,double> >& d,
00127 bool introduced, bool funcDep)
00128 : VarSpec(introduced,funcDep), domain(d) {
00129 alias = false; assigned = false;
00130 }
00131 FloatVarSpec(double d, bool introduced, bool funcDep)
00132 : VarSpec(introduced,funcDep) {
00133 alias = false; assigned = true;
00134 domain = Option<std::pair<double,double> >::some(std::pair<double,double>(d,d));
00135 }
00136 FloatVarSpec(const Alias& eq, bool introduced, bool funcDep)
00137 : VarSpec(introduced,funcDep) {
00138 alias = true; i = eq.v;
00139 }
00140 };
00141
00143 class SetVarSpec : public VarSpec {
00144 public:
00145 Option<AST::SetLit*> upperBound;
00146 SetVarSpec(bool introduced, bool funcDep) : VarSpec(introduced,funcDep) {
00147 alias = false; assigned = false;
00148 upperBound = Option<AST::SetLit* >::none();
00149 }
00150 SetVarSpec(const Option<AST::SetLit* >& v, bool introduced, bool funcDep)
00151 : VarSpec(introduced,funcDep) {
00152 alias = false; assigned = false; upperBound = v;
00153 }
00154 SetVarSpec(AST::SetLit* v, bool introduced, bool funcDep)
00155 : VarSpec(introduced,funcDep) {
00156 alias = false; assigned = true;
00157 upperBound = Option<AST::SetLit*>::some(v);
00158 }
00159 SetVarSpec(const Alias& eq, bool introduced, bool funcDep)
00160 : VarSpec(introduced,funcDep) {
00161 alias = true; i = eq.v;
00162 }
00163 ~SetVarSpec(void) {
00164 if (!alias && upperBound())
00165 delete upperBound.some();
00166 }
00167 };
00168
00169 }}
00170
00171 #endif
00172
00173