hobbes
a language, embedded compiler, and runtime for efficient dynamic expression evaluation, data storage and analysis
subtype.H
Go to the documentation of this file.
1 
2 #ifndef HOBBES_LANG_TYPEPREDS_SUBTYPE_HPP_INCLUDED
3 #define HOBBES_LANG_TYPEPREDS_SUBTYPE_HPP_INCLUDED
4 
6 
7 namespace hobbes {
8 
9 // a 'subtype' constraint ensures that a lower type can be translated to a greater type
10 struct Subtype {
13 };
14 bool dec(const ConstraintPtr&, Subtype*);
15 
16 // a "subtype eliminator" knows how to resolve a "Subtype" constraint at a particular (category of) type
18  // is this instance eliminable?
19  virtual bool satisfied(const TEnvPtr& tenv, const MonoTypePtr& lhs, const MonoTypePtr& rhs) const = 0;
20 
21  // is it possible for this instance to eventually be eliminated?
22  virtual bool satisfiable(const TEnvPtr& tenv, const MonoTypePtr& lhs, const MonoTypePtr& rhs) const = 0;
23 
24  // refine the substitution set associated with this constraint
25  virtual bool refine(const TEnvPtr& tenv, const MonoTypePtr& lhs, const MonoTypePtr& rhs, MonoTypeUnifier* s) = 0;
26 
27  // unqualify a constraint (satisfied() must have returned true)
28  virtual ExprPtr unqualify(const TEnvPtr&, const ConstraintPtr&, const ExprPtr&, Definitions*) const = 0;
29 
30  // pass on requests for overloaded identifiers
31  virtual PolyTypePtr lookup(const std::string& vn) const = 0;
32  virtual SymSet bindings() const = 0;
33 };
34 
35 // a 'subtype unqualifier' resolves subtype constraints
37 public:
39  static std::string constraintName();
40 
41  // extend the set of 'subtype' eliminators dynamically (dangerous?)
42  void addEliminator(SubtypeEliminator*);
43 
44  // unqualifier interface
46  bool satisfied(const TEnvPtr&,const ConstraintPtr&,Definitions*) const;
47  bool satisfiable(const TEnvPtr&,const ConstraintPtr&,Definitions*) const;
48  void explain(const TEnvPtr& tenv, const ConstraintPtr& cst, const ExprPtr& e, Definitions* ds, annmsgs* msgs);
49  ExprPtr unqualify(const TEnvPtr&,const ConstraintPtr&, const ExprPtr&, Definitions*) const;
50  PolyTypePtr lookup (const std::string& vn) const;
51  SymSet bindings () const;
52  FunDeps dependencies(const ConstraintPtr&) const;
53 private:
54  typedef std::vector<SubtypeEliminator*> SubtypeEliminators;
55  SubtypeEliminators eliminators;
56 
57  SubtypeEliminator* findEliminator(const TEnvPtr&, const Subtype&) const;
58 };
59 
60 }
61 
62 #endif
std::shared_ptr< PolyType > PolyTypePtr
Definition: type.H:23
Definition: tyunqualify.H:20
SubtypeEliminators eliminators
Definition: subtype.H:55
Definition: subtype.H:10
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
MonoType::ptr MonoTypePtr
Definition: type.H:71
Definition: typeinf.H:29
MonoTypePtr lower
Definition: subtype.H:11
Definition: subtype.H:17
MonoTypePtr greater
Definition: subtype.H:12
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
std::vector< Definition > Definitions
Definition: expr.H:62
std::shared_ptr< Constraint > ConstraintPtr
Definition: type.H:33
bool refine(const TEnvPtr &tenv, const ConstraintPtr &c, MonoTypeUnifier *s, Definitions *)
Definition: typeinf.C:485
Definition: subtype.H:36
std::vector< SubtypeEliminator * > SubtypeEliminators
Definition: subtype.H:54
T lookup(const std::map< K, T > &tenv, const K &n)
Definition: cc.C:518
std::vector< annmsg > annmsgs
Definition: lannotation.H:58