Skip to content

v0.2.54..v0.2.55 changeset Relation.cpp

Garret Voltz edited this page Aug 14, 2020 · 1 revision
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
Clone this wiki locally