aboutsummaryrefslogtreecommitdiffstats
path: root/src/unify.cpp
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2009-10-13 22:15:04 +0000
committerDavid Robillard <d@drobilla.net>2009-10-13 22:15:04 +0000
commit2dfcc9d781b2df3637fd96f1c5007703377b8109 (patch)
tree09381127a88e54ff1bd024a95b8a0c2eb7ed9b35 /src/unify.cpp
parentba5c979bafd4be26ceeea41d09ca0c5c6025bdd5 (diff)
downloadresp-2dfcc9d781b2df3637fd96f1c5007703377b8109.tar.gz
resp-2dfcc9d781b2df3637fd96f1c5007703377b8109.tar.bz2
resp-2dfcc9d781b2df3637fd96f1c5007703377b8109.zip
Move TEnv::buildSubst to unify.cpp.
git-svn-id: http://svn.drobilla.net/resp/tuplr@212 ad02d1e2-f140-0410-9f75-f8b11f17cedd
Diffstat (limited to 'src/unify.cpp')
-rw-r--r--src/unify.cpp34
1 files changed, 34 insertions, 0 deletions
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 <set>
#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<const ATuple*>();
+ 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<const AType*>();
+ AType* callArgT = (*a)->to<AType*>();
+ 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<const AType*>();
+ AType* aT = callArgT->at(i)->to<AType*>();
+ if (gT && aT)
+ subst.add(gT, aT);
+ }
+ } else {
+ subst.add(genericArgT, callArgT);
+ }
+ }
+
+ return subst;
+}
+
+
void
Constraints::constrain(TEnv& tenv, const AST* o, AType* t)
{