00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #ifndef __EVALUATOR_HPP
00014 #define __EVALUATOR_HPP
00015 #include <basix/exception.hpp>
00016 #include <basix/lisp_syntax.hpp>
00017
00019
00020 namespace mmx {
00021 class evaluator_rep;
00022 class evaluator;
00023
00024 #define PENALTY_NONE ((nat) 0)
00025 #define PENALTY_AUTOMATIC ((nat) 1)
00026 #define PENALTY_INCLUSION ((nat) 2)
00027 #define PENALTY_HOMOMORPHISM ((nat) 3)
00028 #define PENALTY_VARIANT ((nat) 4)
00029 #define PENALTY_CAST ((nat) 5)
00030 #define PENALTY_FALL_BACK ((nat) 6)
00031 #define PENALTY_PROMOTE_GENERIC ((nat) 7)
00032 #define PENALTY_INVALID ((nat) 8)
00033
00034 class evaluator_rep: public rep_struct {
00035 public:
00036 virtual void* get_internal_data () const;
00037 virtual void set (const generic& var, const generic& val) const;
00038 virtual void reset (const generic& var) const;
00039 virtual void overload (const generic& var, const generic& val,
00040 nat penalty= PENALTY_INCLUSION) const;
00041 virtual bool contains (const generic& var) const;
00042 virtual generic get (const generic& var) const;
00043 virtual bool get (const generic& var, generic& val) const;
00044
00045 virtual generic eval (const generic& x) const;
00046 virtual generic construct (const generic& x) const;
00047 virtual generic apply (const generic& fun) const;
00048 virtual generic apply (const generic& fun, const generic& x1) const;
00049 virtual generic apply (const generic& fun,
00050 const generic& x1, const generic& x2) const;
00051 virtual generic apply (const generic& fun, const vector<generic>& a) const;
00052
00053 public:
00054 inline evaluator_rep () {}
00055 inline virtual ~evaluator_rep () {}
00056 friend class evaluator;
00057 };
00058
00059 class evaluator {
00060 INDIRECT_PROTO (evaluator, evaluator_rep)
00061 public:
00062 inline evaluator (): rep (new evaluator_rep ()) {}
00063 friend class evaluator_rep;
00064 };
00065 INDIRECT_IMPL (evaluator, evaluator_rep)
00066
00067 extern evaluator current_ev;
00068
00069 void select_evaluator (const evaluator& ev);
00070 void restore_evaluator ();
00071
00072 }
00073 #endif // __EVALUATOR_HPP