varspec.hh
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
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 bool introduced;
00061 virtual ~VarSpec(void) {}
00063 int i;
00065 bool alias;
00067 bool assigned;
00069 VarSpec(bool introduced0) : introduced(introduced0) {}
00070 };
00071
00073 class IntVarSpec : public VarSpec {
00074 public:
00075 Option<AST::SetLit* > domain;
00076 IntVarSpec(const Option<AST::SetLit* >& d, bool introduced)
00077 : VarSpec(introduced) {
00078 alias = false;
00079 assigned = false;
00080 domain = d;
00081 }
00082 IntVarSpec(int i0, bool introduced) : VarSpec(introduced) {
00083 alias = false; assigned = true; i = i0;
00084 }
00085 IntVarSpec(const Alias& eq, bool introduced) : VarSpec(introduced) {
00086 alias = true; i = eq.v;
00087 }
00088 ~IntVarSpec(void) {
00089 if (!alias && !assigned && domain())
00090 delete domain.some();
00091 }
00092 };
00093
00095 class BoolVarSpec : public VarSpec {
00096 public:
00097 Option<AST::SetLit* > domain;
00098 BoolVarSpec(Option<AST::SetLit* >& d, bool introduced)
00099 : VarSpec(introduced) {
00100 alias = false; assigned = false; domain = d;
00101 }
00102 BoolVarSpec(bool b, bool introduced) : VarSpec(introduced) {
00103 alias = false; assigned = true; i = b;
00104 }
00105 BoolVarSpec(const Alias& eq, bool introduced) : VarSpec(introduced) {
00106 alias = true; i = eq.v;
00107 }
00108 ~BoolVarSpec(void) {
00109 if (!alias && !assigned && domain())
00110 delete domain.some();
00111 }
00112 };
00113
00115 class FloatVarSpec : public VarSpec {
00116 public:
00117 Option<std::vector<double>* > domain;
00118 FloatVarSpec(Option<std::vector<double>* >& d, bool introduced)
00119 : VarSpec(introduced) {
00120 alias = false; assigned = false; domain = d;
00121 }
00122 FloatVarSpec(bool b, bool introduced) : VarSpec(introduced) {
00123 alias = false; assigned = true; i = b;
00124 }
00125 FloatVarSpec(const Alias& eq, bool introduced) : VarSpec(introduced) {
00126 alias = true; i = eq.v;
00127 }
00128 ~FloatVarSpec(void) {
00129 if (!alias && !assigned && domain())
00130 delete domain.some();
00131 }
00132 };
00133
00135 class SetVarSpec : public VarSpec {
00136 public:
00137 Option<AST::SetLit*> upperBound;
00138 SetVarSpec(bool introduced) : VarSpec(introduced) {
00139 alias = false; assigned = false;
00140 upperBound = Option<AST::SetLit* >::none();
00141 }
00142 SetVarSpec(const Option<AST::SetLit* >& v, bool introduced)
00143 : VarSpec(introduced) {
00144 alias = false; assigned = false; upperBound = v;
00145 }
00146 SetVarSpec(AST::SetLit* v, bool introduced) : VarSpec(introduced) {
00147 alias = false; assigned = true;
00148 upperBound = Option<AST::SetLit*>::some(v);
00149 }
00150 SetVarSpec(const Alias& eq, bool introduced) : VarSpec(introduced) {
00151 alias = true; i = eq.v;
00152 }
00153 ~SetVarSpec(void) {
00154 if (!alias && upperBound())
00155 delete upperBound.some();
00156 }
00157 };
00158
00159 }}
00160
00161 #endif
00162
00163