From 2dfcc9d781b2df3637fd96f1c5007703377b8109 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Tue, 13 Oct 2009 22:15:04 +0000 Subject: Move TEnv::buildSubst to unify.cpp. git-svn-id: http://svn.drobilla.net/resp/tuplr@212 ad02d1e2-f140-0410-9f75-f8b11f17cedd --- src/unify.cpp | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) (limited to 'src/unify.cpp') diff --git a/src/unify.cpp b/src/unify.cpp index 74e35fd..eebd75c 100644 --- a/src/unify.cpp +++ b/src/unify.cpp @@ -22,6 +22,40 @@ #include #include "tuplr.hpp" +/** Build a type substitution for calling a generic function type + * with a specific set of argument types + */ +Subst +TEnv::buildSubst(AType* genericT, const AType& argsT) +{ + Subst subst; + + // Build substitution to apply to generic type + const ATuple* genericProtT = genericT->at(1)->as(); + assert(argsT.size() == genericProtT->size()); + ATuple::const_iterator g = genericProtT->begin(); + AType::const_iterator a = argsT.begin(); + for (; a != argsT.end(); ++a, ++g) { + const AType* genericArgT = (*g)->to(); + AType* callArgT = (*a)->to(); + if (callArgT->kind == AType::EXPR) { + assert(genericArgT->kind == AType::EXPR); + assert(callArgT->size() == genericArgT->size()); + for (size_t i = 0; i < callArgT->size(); ++i) { + const AType* gT = genericArgT->at(i)->to(); + AType* aT = callArgT->at(i)->to(); + if (gT && aT) + subst.add(gT, aT); + } + } else { + subst.add(genericArgT, callArgT); + } + } + + return subst; +} + + void Constraints::constrain(TEnv& tenv, const AST* o, AType* t) { -- cgit v1.2.1