#pragma once #include #include #include #include namespace mapbox { namespace geometry { std::ostream& operator<<(std::ostream& os, const empty&) { return os << "[]"; } template std::ostream& operator<<(std::ostream& os, const point& point) { return os << "[" << point.x << "," << point.y << "]"; } template class C, class... Args> std::ostream& operator<<(std::ostream& os, const C& cont) { os << "["; for (auto it = cont.cbegin();;) { os << *it; if (++it == cont.cend()) { break; } os << ","; } return os << "]"; } template std::ostream& operator<<(std::ostream& os, const line_string& geom) { return os << static_cast::container_type>(geom); } template std::ostream& operator<<(std::ostream& os, const linear_ring& geom) { return os << static_cast::container_type>(geom); } template std::ostream& operator<<(std::ostream& os, const polygon& geom) { return os << static_cast::container_type>(geom); } template std::ostream& operator<<(std::ostream& os, const multi_point& geom) { return os << static_cast::container_type>(geom); } template std::ostream& operator<<(std::ostream& os, const multi_line_string& geom) { return os << static_cast::container_type>(geom); } template std::ostream& operator<<(std::ostream& os, const multi_polygon& geom) { return os << static_cast::container_type>(geom); } template std::ostream& operator<<(std::ostream& os, const geometry& geom) { geometry::visit(geom, [&](const auto& g) { os << g; }); return os; } template std::ostream& operator<<(std::ostream& os, const geometry_collection& geom) { return os << static_cast::container_type>(geom); } } // namespace geometry namespace feature { std::ostream& operator<<(std::ostream& os, const null_value_t&) { return os << "[]"; } } // namespace feature } // namespace mapbox