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