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 #ifndef _CVC_lite__assumptions_value_h_
00030 #define _CVC_lite__assumptions_value_h_
00031
00032 #include "theorem.h"
00033
00034 namespace CVCL {
00035
00036 class AssumptionsValue;
00037
00038 class AVHash {
00039 std::hash<size_t> h;
00040 public:
00041 AVHash() {
00042 IF_DEBUG(if(sizeof(void*) != sizeof(size_t)) {
00043 debugger.flag("WARNING: sizeof(void*) != sizeof(size_t)")++;
00044 });
00045 }
00046 size_t operator()(const AssumptionsValue* p) const { return h((size_t)p); }
00047 };
00048
00049 class AssumptionsValue {
00050 friend class Assumptions;
00051 private:
00052 int d_refcount;
00053
00054 bool d_const;
00055 std::vector<Theorem> d_vector;
00056
00057 private:
00058
00059 AssumptionsValue(int refcount=0): d_refcount(refcount), d_const(false) { }
00060
00061 AssumptionsValue(const AssumptionsValue& a)
00062 : d_refcount(0), d_const(false), d_vector(a.d_vector) { }
00063
00064
00065
00066
00067
00068 AssumptionsValue(const std::vector<Theorem>& v);
00069
00070 AssumptionsValue(const Theorem& t1, const Theorem& t2);
00071
00072 static void mergeVectors(const std::vector<Theorem>& v1,
00073 const std::vector<Theorem>& v2,
00074 std::vector<Theorem>& v);
00075
00076
00077 void add(const Theorem& t);
00078
00079 void add(const AssumptionsValue& a);
00080
00081
00082
00083 const Theorem& find(const Expr& e) const;
00084
00085 public:
00086 std::string toString() const;
00087
00088 friend std::ostream& operator<<(std::ostream& os,
00089 const AssumptionsValue &assump);
00090
00091 friend bool operator==(const AssumptionsValue& a1, const AssumptionsValue& a2);
00092 friend bool operator!=(const AssumptionsValue& a1, const AssumptionsValue& a2);
00093
00094 };
00095
00096
00097 inline bool operator==(const AssumptionsValue& a1, const AssumptionsValue& a2) {
00098 return (a1.d_vector == a2.d_vector);
00099 }
00100
00101 inline bool operator!=(const AssumptionsValue& a1, const AssumptionsValue& a2) {
00102 return !(a1.d_vector == a2.d_vector);
00103 }
00104
00105 }
00106
00107 #endif