slcom/slangc/model/AbstractMemberSet.sauce

67 lines
1.5 KiB
Plaintext

package slangc.model;
import slang.data.List;
public abstract class AbstractMemberSet {
TypeModel owner;
MemberCategory category;
private List<MemberModel> array = new List<MemberModel>();
public AbstractMemberSet(TypeModel owner, MemberCategory category) {
this.owner = owner;
this.category = category;
}
public TypeModel getOwner() {
return owner;
}
public MemberCategory getCategory() {
return category;
}
public void addMember(MemberModel field) {
if (field.getCategory() != getCategory()) {
throw new Error("Tried to add member in category " + field.getCategory() + " in set of different category " + getCategory());
}
array.append(field);
}
public int countMembers() {
return array.count();
}
public int countMembersNamed(String name) {
int count = 0;
for (int i = 0; i < array.count(); i++) {
if (array.get(i).matchesName(null, name)) {
count++;
}
}
return count;
}
public boolean hasMemberNamed(String name) {
return countMembersNamed(name) > 0;
}
public MemberModel getMember(int i) {
return array.get(i);
}
public MemberModel getMemberNamed(String name, int i) {
int count = 0;
for (int x = 0; x < array.count(); x++) {
if (array.get(x).matchesName(null, name)) {
if (count == i) {
return array.get(x);
} else {
count++;
}
}
}
throw new Error("Tried to get definition #" + i + " of members named '" + name + "' but only " + countMembersNamed(name) + " such definitions exist");
}
}