hobbes
a language, embedded compiler, and runtime for efficient dynamic expression evaluation, data storage and analysis
hasctor.H
Go to the documentation of this file.
1 
2 #ifndef HOBBES_LANG_TYPEPREDS_HASCTOR_HPP_INCLUDED
3 #define HOBBES_LANG_TYPEPREDS_HASCTOR_HPP_INCLUDED
4 
6 
7 namespace hobbes {
8 
9 struct HasCtor {
13 };
14 
15 // a "has-ctor eliminator" knows how to resolve a "HasCtor" constraint at a particular (category of) type
16 struct HCEliminator {
17  // is this HC instance eliminable?
18  virtual bool satisfied(const TEnvPtr& tenv, const HasCtor&, Definitions*) const = 0;
19 
20  // is it possible for this HC instance to eventually be eliminated?
21  virtual bool satisfiable(const TEnvPtr& tenv, const HasCtor&, Definitions*) const = 0;
22 
23  // refine the substitution set associated with this constraint
24  virtual bool refine(const TEnvPtr& tenv, const HasCtor&, MonoTypeUnifier* s, Definitions*) = 0;
25 
26  // unqualify a constraint (satisfied() must have returned true)
27  virtual ExprPtr unqualify(const TEnvPtr&, const ConstraintPtr&, const HasCtor&, const ExprPtr&, Definitions*) const = 0;
28 
29  // what would you call this eliminator?
30  virtual std::string name() const = 0;
31 };
32 
33 // a 'ctor verifier' is a scheme for validating types as generated by a named constructor somehow
34 class CtorVerifier : public Unqualifier {
35 public:
36  CtorVerifier();
37  static std::string constraintName();
38 
39  // extend the set of 'hasctor' eliminators dynamically (dangerous?)
40  void addEliminator(HCEliminator*);
41 
42  // unqualifier interface
44  bool satisfied(const TEnvPtr&,const ConstraintPtr&,Definitions*) const;
45  bool satisfiable(const TEnvPtr&,const ConstraintPtr&,Definitions*) const;
46  void explain(const TEnvPtr& tenv, const ConstraintPtr& cst, const ExprPtr& e, Definitions* ds, annmsgs* msgs);
47  ExprPtr unqualify(const TEnvPtr&,const ConstraintPtr&, const ExprPtr&, Definitions*) const;
48  PolyTypePtr lookup (const std::string& vn) const;
49  SymSet bindings () const;
50  FunDeps dependencies(const ConstraintPtr&) const;
51 private:
52  typedef std::vector<HCEliminator*> HCEliminators;
53  HCEliminators eliminators;
54  HCEliminator* findEliminator(const TEnvPtr&, const HasCtor&, Definitions*) const;
55 
56  static bool dec(const ConstraintPtr&, HasCtor*);
57 };
58 
59 }
60 
61 #endif
62 
std::shared_ptr< PolyType > PolyTypePtr
Definition: type.H:23
Definition: tyunqualify.H:20
bool satisfied(const UnqualifierPtr &, const TEnvPtr &, const ConstraintPtr &, std::vector< std::pair< std::string, std::shared_ptr< Expr > > > *)
bool satisfiable(const UnqualifierPtr &, const TEnvPtr &, const ConstraintPtr &, std::vector< std::pair< std::string, std::shared_ptr< Expr > > > *)
std::set< std::string > SymSet
Definition: tyunqualify.H:12
Definition: boot.H:7
std::vector< FunDep > FunDeps
Definition: tyunqualify.H:17
MonoTypePtr ctorty
Definition: hasctor.H:12
MonoTypePtr ctorlbl
Definition: hasctor.H:11
MonoType::ptr MonoTypePtr
Definition: type.H:71
MonoTypePtr variant
Definition: hasctor.H:10
Definition: hasctor.H:16
Definition: typeinf.H:29
HCEliminators eliminators
Definition: hasctor.H:53
std::shared_ptr< Expr > ExprPtr
Definition: expr.H:58
bool dec(const ConstraintPtr &, AppendsTo *)
Definition: appendsto.C:15
std::shared_ptr< TEnv > TEnvPtr
Definition: type.H:80
Definition: hasctor.H:34
std::vector< Definition > Definitions
Definition: expr.H:62
std::vector< HCEliminator * > HCEliminators
Definition: hasctor.H:52
std::shared_ptr< Constraint > ConstraintPtr
Definition: type.H:33
bool refine(const TEnvPtr &tenv, const ConstraintPtr &c, MonoTypeUnifier *s, Definitions *)
Definition: typeinf.C:485
T lookup(const std::map< K, T > &tenv, const K &n)
Definition: cc.C:518
std::vector< annmsg > annmsgs
Definition: lannotation.H:58
Definition: hasctor.H:9