| 126 | {} |
| 127 | |
| 128 | bool ProcessorOsmElementsFromO5M::TryRead(OsmElement & element) |
| 129 | { |
| 130 | if (m_pos == m_dataset.end()) |
| 131 | return false; |
| 132 | |
| 133 | using Type = osm::O5MSource::EntityType; |
| 134 | auto const translate = [](Type t) -> OsmElement::EntityType |
| 135 | { |
| 136 | switch (t) |
| 137 | { |
| 138 | case Type::Node: return OsmElement::EntityType::Node; |
| 139 | case Type::Way: return OsmElement::EntityType::Way; |
| 140 | case Type::Relation: return OsmElement::EntityType::Relation; |
| 141 | default: return OsmElement::EntityType::Unknown; |
| 142 | } |
| 143 | }; |
| 144 | |
| 145 | // Be careful, we could call Nodes(), Members(), Tags() from O5MSource::Entity |
| 146 | // only once (!). Because these functions read data from file simultaneously with |
| 147 | // iterating in loop. Furthermore, into Tags() method calls Nodes.Skip() and Members.Skip(), |
| 148 | // thus first call of Nodes (Members) after Tags() will not return any results. |
| 149 | // So don not reorder the "for" loops (!). |
| 150 | auto const & entity = *m_pos; |
| 151 | element.m_id = entity.id; |
| 152 | switch (entity.type) |
| 153 | { |
| 154 | case Type::Node: |
| 155 | { |
| 156 | element.m_type = OsmElement::EntityType::Node; |
| 157 | element.m_lat = entity.lat; |
| 158 | element.m_lon = entity.lon; |
| 159 | break; |
| 160 | } |
| 161 | case Type::Way: |
| 162 | { |
| 163 | element.m_type = OsmElement::EntityType::Way; |
| 164 | for (uint64_t nd : entity.Nodes()) |
| 165 | element.AddNd(nd); |
| 166 | break; |
| 167 | } |
| 168 | case Type::Relation: |
| 169 | { |
| 170 | element.m_type = OsmElement::EntityType::Relation; |
| 171 | for (auto const & member : entity.Members()) |
| 172 | element.AddMember(member.ref, translate(member.type), member.role); |
| 173 | break; |
| 174 | } |
| 175 | default: break; |
| 176 | } |
| 177 | |
| 178 | for (auto const & tag : entity.Tags()) |
| 179 | element.AddTag(tag.key, tag.value); |
| 180 | |
| 181 | element.Validate(); |
| 182 | ++m_pos; |
| 183 | return true; |
| 184 | } |
| 185 |
no test coverage detected