void visitElement(const utymap::entities::Element &element, const Coordinates &coordinates) { auto ctags = getTags(element); auto cstyles = getStyles(element); fillVertices(coordinates); elementCallback_(tag_, element.id, ctags.data(), static_cast<int>(ctags.size()), vertices_.data(), static_cast<int>(vertices_.size()), cstyles.data(), static_cast<int>(cstyles.size())); // NOTE clear vectors after raw array data is consumed by external code vertices_.clear(); tagStrings_.clear(); styleStrings_.clear(); }
void visitElement(const utymap::entities::Element& element, const Coordinates& coordinates) { // convert tags std::vector<const char*> ctags; tagStrings_.reserve(element.tags.size() * 2); ctags.reserve(element.tags.size() * 2); for (auto i = 0; i < element.tags.size(); ++i) { const utymap::entities::Tag& tag = element.tags[i]; tagStrings_.push_back(stringTable_.getString(tag.key)); tagStrings_.push_back(stringTable_.getString(tag.value)); ctags.push_back(tagStrings_[tagStrings_.size() - 2].c_str()); ctags.push_back(tagStrings_[tagStrings_.size() - 1].c_str()); } // convert geometry std::vector<double> coords; coords.reserve(coordinates.size() * 2); for (auto i = 0; i < coordinates.size(); ++i) { const utymap::GeoCoordinate coordinate = coordinates[i]; coords.push_back(coordinate.longitude); coords.push_back(coordinate.latitude); } // convert style utymap::mapcss::Style style = styleProvider_.forElement(element, levelOfDetail_); std::vector<const char*> cstyles; tagStrings_.reserve(style.declarations.size() * 2); cstyles.reserve(style.declarations.size()); for (const auto pair : style.declarations) { styleStrings_.push_back(stringTable_.getString(pair.first)); styleStrings_.push_back(*pair.second->value()); cstyles.push_back(styleStrings_[styleStrings_.size() - 2].c_str()); cstyles.push_back(styleStrings_[styleStrings_.size() - 1].c_str()); } elementCallback_(element.id, ctags.data(), ctags.size(), coords.data(), coords.size(), cstyles.data(), cstyles.size()); tagStrings_.clear(); styleStrings_.clear(); }