diff --git a/hoot-core/src/main/cpp/hoot/core/elements/Relation.cpp b/hoot-core/src/main/cpp/hoot/core/elements/Relation.cpp
index af78bf9..85cab64 100644
--- a/hoot-core/src/main/cpp/hoot/core/elements/Relation.cpp
+++ b/hoot-core/src/main/cpp/hoot/core/elements/Relation.cpp
@@ -122,7 +122,6 @@ void Relation::clear()
bool Relation::contains(ElementId eid) const
{
const vector<RelationData::Entry>& members = getMembers();
-
for (size_t i = 0; i < members.size(); i++)
{
if (members[i].getElementId() == eid)
@@ -133,33 +132,64 @@ bool Relation::contains(ElementId eid) const
return false;
}
-int Relation::numElementsByRole(const QString& role) const
+size_t Relation::indexOf(ElementId eid) const
+{
+ const vector<RelationData::Entry>& members = getMembers();
+ for (size_t i = 0; i < members.size(); i++)
+ {
+ if (members[i].getElementId() == eid)
+ {
+ return i;
+ }
+ }
+ return -1;
+}
+
+void Relation::insertElement(const QString& role, const ElementId& elementId, size_t pos)
+{
+ _preGeometryChange();
+ _makeWritable();
+
+ vector<RelationData::Entry> members = getMembers();
+ RelationData::Entry newMember(role, elementId);
+ members.insert(members.begin() + pos, newMember);
+ setMembers(members);
+
+ _postGeometryChange();
+}
+
+int Relation::numElementsByRole(const QString& role)
+{
+ return getElementsByRole(role).size();
+}
+
+const std::vector<RelationData::Entry> Relation::getElementsByRole(const QString& role)
{
const vector<RelationData::Entry>& members = getMembers();
- int roleCtr = 0;
+ std::vector<RelationData::Entry> membersByRole;
for (size_t i = 0; i < members.size(); i++)
{
if (members[i].getRole() == role)
{
- roleCtr++;
+ membersByRole.push_back(members[i]);
}
}
- return roleCtr;
+ return membersByRole;
}
-std::set<ElementId> Relation::getWayMemberIds() const
+std::set<ElementId> Relation::getMemberIds(const ElementType& elementType) const
{
- std::set<ElementId> wayMemberIds;
+ std::set<ElementId> memberIds;
const vector<RelationData::Entry>& members = getMembers();
for (size_t i = 0; i < members.size(); i++)
{
RelationData::Entry member = members[i];
- if (member.getElementId().getType() == ElementType::Way)
+ if (elementType == ElementType::Unknown || member.getElementId().getType() == elementType)
{
- wayMemberIds.insert(member.getElementId());
+ memberIds.insert(member.getElementId());
}
}
- return wayMemberIds;
+ return memberIds;
}
Envelope* Relation::getEnvelope(const std::shared_ptr<const ElementProvider>& ep) const