-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
19 changed files
with
740 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,113 @@ | ||
#pragma once | ||
|
||
#include <mapbox/geometry.hpp> | ||
|
||
#include <mapbox/variant.hpp> | ||
|
||
#include <cstdint> | ||
#include <string> | ||
#include <vector> | ||
#include <unordered_map> | ||
|
||
namespace mapbox { | ||
namespace feature { | ||
|
||
struct value; | ||
|
||
struct null_value_t | ||
{ | ||
}; | ||
|
||
constexpr bool operator==(const null_value_t&, const null_value_t&) { return true; } | ||
constexpr bool operator!=(const null_value_t&, const null_value_t&) { return false; } | ||
constexpr bool operator<(const null_value_t&, const null_value_t&) { return false; } | ||
|
||
constexpr null_value_t null_value = null_value_t(); | ||
|
||
// Multiple numeric types (uint64_t, int64_t, double) are present in order to support | ||
// the widest possible range of JSON numbers, which do not have a maximum range. | ||
// Implementations that produce `value`s should use that order for type preference, | ||
// using uint64_t for positive integers, int64_t for negative integers, and double | ||
// for non-integers and integers outside the range of 64 bits. | ||
using value_base = mapbox::util::variant<null_value_t, bool, uint64_t, int64_t, double, std::string, | ||
mapbox::util::recursive_wrapper<std::vector<value>>, | ||
mapbox::util::recursive_wrapper<std::unordered_map<std::string, value>>>; | ||
|
||
struct value : value_base | ||
{ | ||
using value_base::value_base; | ||
}; | ||
|
||
using property_map = std::unordered_map<std::string, value>; | ||
|
||
// The same considerations and requirement for numeric types apply as for `value_base`. | ||
using identifier = mapbox::util::variant<null_value_t, uint64_t, int64_t, double, std::string>; | ||
|
||
template <class T> | ||
struct feature | ||
{ | ||
using coordinate_type = T; | ||
using geometry_type = mapbox::geometry::geometry<T>; // Fully qualified to avoid GCC -fpermissive error. | ||
|
||
geometry_type geometry; | ||
property_map properties; | ||
identifier id; | ||
|
||
feature() | ||
: geometry(), | ||
properties(), | ||
id() {} | ||
feature(geometry_type const& geom_) | ||
: geometry(geom_), | ||
properties(), | ||
id() {} | ||
feature(geometry_type&& geom_) | ||
: geometry(std::move(geom_)), | ||
properties(), | ||
id() {} | ||
feature(geometry_type const& geom_, property_map const& prop_) | ||
: geometry(geom_), properties(prop_), id() {} | ||
feature(geometry_type&& geom_, property_map&& prop_) | ||
: geometry(std::move(geom_)), | ||
properties(std::move(prop_)), | ||
id() {} | ||
feature(geometry_type const& geom_, property_map const& prop_, identifier const& id_) | ||
: geometry(geom_), | ||
properties(prop_), | ||
id(id_) {} | ||
feature(geometry_type&& geom_, property_map&& prop_, identifier&& id_) | ||
: geometry(std::move(geom_)), | ||
properties(std::move(prop_)), | ||
id(std::move(id_)) {} | ||
}; | ||
|
||
template <class T> | ||
constexpr bool operator==(feature<T> const& lhs, feature<T> const& rhs) | ||
{ | ||
return lhs.id == rhs.id && lhs.geometry == rhs.geometry && lhs.properties == rhs.properties; | ||
} | ||
|
||
template <class T> | ||
constexpr bool operator!=(feature<T> const& lhs, feature<T> const& rhs) | ||
{ | ||
return !(lhs == rhs); | ||
} | ||
|
||
template <class T, template <typename...> class Cont = std::vector> | ||
struct feature_collection : Cont<feature<T>> | ||
{ | ||
using coordinate_type = T; | ||
using feature_type = feature<T>; | ||
using container_type = Cont<feature_type>; | ||
using size_type = typename container_type::size_type; | ||
|
||
template <class... Args> | ||
feature_collection(Args&&... args) : container_type(std::forward<Args>(args)...) | ||
{ | ||
} | ||
feature_collection(std::initializer_list<feature_type> args) | ||
: container_type(std::move(args)) {} | ||
}; | ||
|
||
} // namespace feature | ||
} // namespace mapbox |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
#pragma once | ||
|
||
#include <mapbox/geometry/point.hpp> | ||
#include <mapbox/geometry/line_string.hpp> | ||
#include <mapbox/geometry/polygon.hpp> | ||
#include <mapbox/geometry/multi_point.hpp> | ||
#include <mapbox/geometry/multi_line_string.hpp> | ||
#include <mapbox/geometry/multi_polygon.hpp> | ||
#include <mapbox/geometry/geometry.hpp> | ||
#include <mapbox/geometry/point_arithmetic.hpp> | ||
#include <mapbox/geometry/for_each_point.hpp> | ||
#include <mapbox/geometry/envelope.hpp> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
#pragma once | ||
|
||
#include <mapbox/geometry/point.hpp> | ||
|
||
namespace mapbox { | ||
namespace geometry { | ||
|
||
template <typename T> | ||
struct box | ||
{ | ||
using coordinate_type = T; | ||
using point_type = point<coordinate_type>; | ||
|
||
constexpr box(point_type const& min_, point_type const& max_) | ||
: min(min_), max(max_) | ||
{ | ||
} | ||
|
||
point_type min; | ||
point_type max; | ||
}; | ||
|
||
template <typename T> | ||
constexpr bool operator==(box<T> const& lhs, box<T> const& rhs) | ||
{ | ||
return lhs.min == rhs.min && lhs.max == rhs.max; | ||
} | ||
|
||
template <typename T> | ||
constexpr bool operator!=(box<T> const& lhs, box<T> const& rhs) | ||
{ | ||
return lhs.min != rhs.min || lhs.max != rhs.max; | ||
} | ||
|
||
} // namespace geometry | ||
} // namespace mapbox |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
#pragma once | ||
|
||
namespace mapbox { | ||
namespace geometry { | ||
|
||
struct empty | ||
{ | ||
}; // this Geometry type represents the empty point set, ∅, for the coordinate space (OGC Simple Features). | ||
|
||
constexpr bool operator==(empty, empty) { return true; } | ||
constexpr bool operator!=(empty, empty) { return false; } | ||
constexpr bool operator<(empty, empty) { return false; } | ||
constexpr bool operator>(empty, empty) { return false; } | ||
constexpr bool operator<=(empty, empty) { return true; } | ||
constexpr bool operator>=(empty, empty) { return true; } | ||
|
||
} // namespace geometry | ||
} // namespace mapbox |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
#pragma once | ||
|
||
#include <mapbox/geometry/box.hpp> | ||
#include <mapbox/geometry/for_each_point.hpp> | ||
|
||
#include <limits> | ||
|
||
namespace mapbox { | ||
namespace geometry { | ||
|
||
template <typename G, typename T = typename G::coordinate_type> | ||
box<T> envelope(G const& geometry) | ||
{ | ||
using limits = std::numeric_limits<T>; | ||
|
||
T min_t = limits::has_infinity ? -limits::infinity() : limits::min(); | ||
T max_t = limits::has_infinity ? limits::infinity() : limits::max(); | ||
|
||
point<T> min(max_t, max_t); | ||
point<T> max(min_t, min_t); | ||
|
||
for_each_point(geometry, [&](point<T> const& point) { | ||
if (min.x > point.x) min.x = point.x; | ||
if (min.y > point.y) min.y = point.y; | ||
if (max.x < point.x) max.x = point.x; | ||
if (max.y < point.y) max.y = point.y; | ||
}); | ||
|
||
return box<T>(min, max); | ||
} | ||
|
||
} // namespace geometry | ||
} // namespace mapbox |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,51 @@ | ||
#pragma once | ||
|
||
#include <mapbox/geometry/geometry.hpp> | ||
|
||
namespace mapbox { | ||
namespace geometry { | ||
|
||
template <typename F> | ||
void for_each_point(mapbox::geometry::empty const&, F&&) | ||
{ | ||
} | ||
|
||
template <typename Point, typename F> | ||
auto for_each_point(Point&& point, F&& f) | ||
-> decltype(point.x, point.y, void()) | ||
{ | ||
f(std::forward<Point>(point)); | ||
} | ||
|
||
template <typename Container, typename F> | ||
auto for_each_point(Container&& container, F&& f) | ||
-> decltype(container.begin(), container.end(), void()); | ||
|
||
template <typename... Types, typename F> | ||
void for_each_point(mapbox::util::variant<Types...> const& geom, F&& f) | ||
{ | ||
mapbox::util::variant<Types...>::visit(geom, [&](auto const& g) { | ||
for_each_point(g, f); | ||
}); | ||
} | ||
|
||
template <typename... Types, typename F> | ||
void for_each_point(mapbox::util::variant<Types...>& geom, F&& f) | ||
{ | ||
mapbox::util::variant<Types...>::visit(geom, [&](auto& g) { | ||
for_each_point(g, f); | ||
}); | ||
} | ||
|
||
template <typename Container, typename F> | ||
auto for_each_point(Container&& container, F&& f) | ||
-> decltype(container.begin(), container.end(), void()) | ||
{ | ||
for (auto& e : container) | ||
{ | ||
for_each_point(e, f); | ||
} | ||
} | ||
|
||
} // namespace geometry | ||
} // namespace mapbox |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
#pragma once | ||
|
||
#include <mapbox/geometry/empty.hpp> | ||
#include <mapbox/geometry/point.hpp> | ||
#include <mapbox/geometry/line_string.hpp> | ||
#include <mapbox/geometry/polygon.hpp> | ||
#include <mapbox/geometry/multi_point.hpp> | ||
#include <mapbox/geometry/multi_line_string.hpp> | ||
#include <mapbox/geometry/multi_polygon.hpp> | ||
|
||
#include <mapbox/variant.hpp> | ||
|
||
// stl | ||
#include <vector> | ||
|
||
namespace mapbox { | ||
namespace geometry { | ||
|
||
template <typename T, template <typename...> class Cont = std::vector> | ||
struct geometry_collection; | ||
|
||
template <typename T, template <typename...> class Cont = std::vector> | ||
using geometry_base = mapbox::util::variant<empty, | ||
point<T>, | ||
line_string<T, Cont>, | ||
polygon<T, Cont>, | ||
multi_point<T, Cont>, | ||
multi_line_string<T, Cont>, | ||
multi_polygon<T, Cont>, | ||
geometry_collection<T, Cont>>; | ||
|
||
template <typename T, template <typename...> class Cont = std::vector> | ||
struct geometry : geometry_base<T, Cont> | ||
{ | ||
using coordinate_type = T; | ||
using geometry_base<T>::geometry_base; | ||
}; | ||
|
||
template <typename T, template <typename...> class Cont> | ||
struct geometry_collection : Cont<geometry<T>> | ||
{ | ||
using coordinate_type = T; | ||
using geometry_type = geometry<T>; | ||
using container_type = Cont<geometry_type>; | ||
using size_type = typename container_type::size_type; | ||
|
||
template <class... Args> | ||
geometry_collection(Args&&... args) : container_type(std::forward<Args>(args)...) | ||
{ | ||
} | ||
geometry_collection(std::initializer_list<geometry_type> args) | ||
: container_type(std::move(args)) {} | ||
}; | ||
|
||
} // namespace geometry | ||
} // namespace mapbox |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
#pragma once | ||
|
||
// mapbox | ||
#include <mapbox/geometry/point.hpp> | ||
// stl | ||
#include <vector> | ||
|
||
namespace mapbox { | ||
namespace geometry { | ||
|
||
template <typename T, template <typename...> class Cont = std::vector> | ||
struct line_string : Cont<point<T>> | ||
{ | ||
using coordinate_type = T; | ||
using point_type = point<T>; | ||
using container_type = Cont<point_type>; | ||
using size_type = typename container_type::size_type; | ||
|
||
template <class... Args> | ||
line_string(Args&&... args) : container_type(std::forward<Args>(args)...) | ||
{ | ||
} | ||
line_string(std::initializer_list<point_type> args) | ||
: container_type(std::move(args)) {} | ||
}; | ||
|
||
} // namespace geometry | ||
} // namespace mapbox |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
#pragma once | ||
|
||
// mapbox | ||
#include <mapbox/geometry/line_string.hpp> | ||
// stl | ||
#include <vector> | ||
|
||
namespace mapbox { | ||
namespace geometry { | ||
|
||
template <typename T, template <typename...> class Cont = std::vector> | ||
struct multi_line_string : Cont<line_string<T>> | ||
{ | ||
using coordinate_type = T; | ||
using line_string_type = line_string<T>; | ||
using container_type = Cont<line_string_type>; | ||
using size_type = typename container_type::size_type; | ||
|
||
template <class... Args> | ||
multi_line_string(Args&&... args) : container_type(std::forward<Args>(args)...) | ||
{ | ||
} | ||
multi_line_string(std::initializer_list<line_string_type> args) | ||
: container_type(std::move(args)) {} | ||
}; | ||
|
||
} // namespace geometry | ||
} // namespace mapbox |
Oops, something went wrong.