aboutsummaryrefslogtreecommitdiffstats
path: root/tuplr.hpp
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2009-03-31 00:51:31 +0000
committerDavid Robillard <d@drobilla.net>2009-03-31 00:51:31 +0000
commit9dc74f15acec8daac019f21ec0834827a5c5fd51 (patch)
tree25c10e3b925c4ae124875621dff236d56c3efbb0 /tuplr.hpp
parent14b989aaf2c11710cef316a3ba20a947777cca08 (diff)
downloadresp-9dc74f15acec8daac019f21ec0834827a5c5fd51.tar.gz
resp-9dc74f15acec8daac019f21ec0834827a5c5fd51.tar.bz2
resp-9dc74f15acec8daac019f21ec0834827a5c5fd51.zip
Fix polymorphic functions (somewhat).
git-svn-id: http://svn.drobilla.net/resp/tuplr@112 ad02d1e2-f140-0410-9f75-f8b11f17cedd
Diffstat (limited to 'tuplr.hpp')
-rw-r--r--tuplr.hpp18
1 files changed, 10 insertions, 8 deletions
diff --git a/tuplr.hpp b/tuplr.hpp
index a9f244c..1984f6e 100644
--- a/tuplr.hpp
+++ b/tuplr.hpp
@@ -260,6 +260,9 @@ struct AType : public ATuple {
}
return true;
}
+ bool operator<(const AType& rhs) const {
+ return kind < rhs.kind || id < rhs.id;
+ }
bool operator==(const AST& rhs) const {
const AType* rt = rhs.to<const AType*>();
if (!rt || kind != rt->kind)
@@ -431,8 +434,8 @@ inline ostream& operator<<(ostream& out, const Constraints& c) {
return out;
}
-struct Subst : public map<const AType*,AType*> {
- Subst(AType* s=0, AType* t=0) { if (s && t) { assert(s != t); insert(make_pair(s, t)); } }
+struct Subst : public map<const AType,AType*> {
+ Subst(AType* s=0, AType* t=0) { if (s && t) { assert(s != t); insert(make_pair(*s, t)); } }
static Subst compose(const Subst& delta, const Subst& gamma);
AST* apply(AST* ast) const {
AType* in = ast->to<AType*>();
@@ -443,13 +446,12 @@ struct Subst : public map<const AType*,AType*> {
out->push_back(apply(in->at(i)));
return out;
} else {
- Subst copy(*this);
- iterator i;
- while ((i = copy.find(in)) != copy.end()) {
- in = i->second;
- copy.erase(i);
+ const_iterator i = find(*in);
+ if (i != end()) {
+ return i->second;
+ } else {
+ return in;
}
- return in;
}
}
};