| 69 | } |
| 70 | |
| 71 | void Pop(StringPtrT) |
| 72 | { |
| 73 | switch (--m_depth) |
| 74 | { |
| 75 | case 0: break; |
| 76 | |
| 77 | case 1: |
| 78 | // Skip useless tags. See XMLSource::Push function above. |
| 79 | if (m_current->m_type != OsmElement::EntityType::Bounds) |
| 80 | { |
| 81 | ASSERT_EQUAL(m_current, &m_parent, ()); |
| 82 | m_emitter(std::move(m_parent)); |
| 83 | } |
| 84 | m_parent.Clear(); |
| 85 | break; |
| 86 | |
| 87 | default: |
| 88 | switch (m_child.m_type) |
| 89 | { |
| 90 | case OsmElement::EntityType::Member: |
| 91 | m_parent.AddMember(m_child.m_ref, m_child.m_memberType, m_child.m_role); |
| 92 | break; |
| 93 | case OsmElement::EntityType::Tag: m_parent.AddTag(m_child.m_k, m_child.m_v); break; |
| 94 | case OsmElement::EntityType::Nd: m_parent.AddNd(m_child.m_ref); break; |
| 95 | default: break; |
| 96 | } |
| 97 | m_current = &m_parent; |
| 98 | m_child.Clear(); |
| 99 | } |
| 100 | } |
| 101 | |
| 102 | private: |
| 103 | OsmElement m_parent; |