Skip to content

Commit

Permalink
static inline operators for point_type operations
Browse files Browse the repository at this point in the history
This speeds up the jj example from 59 seconds to 53 seconds by
partially reverting 6346b09
  • Loading branch information
eyal0 committed Dec 29, 2020
1 parent f2e81c6 commit 2d30fc8
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 91 deletions.
72 changes: 0 additions & 72 deletions bg_operators.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -171,75 +171,3 @@ multi_polygon_type_fp operator+(const multi_polygon_type_fp& lhs, const ring_typ
multi_polygon_type_fp rhs_mp{polygon_type_fp{rhs}};
return lhs + rhs_mp;
}

// It's not great to insert definitions into the bg namespace but they
// are useful for sorting and maps.

namespace boost { namespace geometry { namespace model { namespace d2 {

template <typename T>
bool operator<(
const boost::geometry::model::d2::point_xy<T>& x,
const boost::geometry::model::d2::point_xy<T>& y) {
return std::tie(x.x(), x.y()) < std::tie(y.x(), y.y());
}

template bool operator<(const point_type_fp&, const point_type_fp&);
template bool operator<(const ::point_type&, const ::point_type&);

template <typename T>
boost::geometry::model::d2::point_xy<T> operator-(
const boost::geometry::model::d2::point_xy<T>& lhs,
const boost::geometry::model::d2::point_xy<T>& rhs) {
return {lhs.x()-rhs.x(), lhs.y()-rhs.y()};
}

template point_type_fp operator-(const point_type_fp&, const point_type_fp&);

template <typename T>
boost::geometry::model::d2::point_xy<T> operator+(
const boost::geometry::model::d2::point_xy<T>& lhs,
const boost::geometry::model::d2::point_xy<T>& rhs) {
return {lhs.x()+rhs.x(), lhs.y()+rhs.y()};
}

template point_type_fp operator+(const point_type_fp&, const point_type_fp&);

template <typename T, typename S>
boost::geometry::model::d2::point_xy<T> operator/(
const boost::geometry::model::d2::point_xy<T>& lhs,
const S& rhs) {
return {lhs.x()/static_cast<T>(rhs), lhs.y()/static_cast<T>(rhs)};
}

template point_type_fp operator/(const point_type_fp&, const double&);
template point_type_fp operator/(const point_type_fp&, const int&);

template <typename T, typename S>
boost::geometry::model::d2::point_xy<T> operator*(
const boost::geometry::model::d2::point_xy<T>& lhs,
const S& rhs) {
return {lhs.x()*static_cast<T>(rhs), lhs.y()*static_cast<T>(rhs)};
}

template point_type_fp operator*(const point_type_fp&, const double&);

template <typename T>
bool operator==(
const boost::geometry::model::d2::point_xy<T>& x,
const boost::geometry::model::d2::point_xy<T>& y) {
return std::tie(x.x(), x.y()) == std::tie(y.x(), y.y());
}

template bool operator==<double>(const point_type_fp&, const point_type_fp&);

template <typename T>
bool operator!=(
const boost::geometry::model::d2::point_xy<T>& x,
const boost::geometry::model::d2::point_xy<T>& y) {
return std::tie(x.x(), x.y()) != std::tie(y.x(), y.y());
}

template bool operator!=<double>(const point_type_fp&, const point_type_fp&);

}}}} // namespace boost::geometry::model::d2
52 changes: 33 additions & 19 deletions bg_operators.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -53,52 +53,66 @@ bg::model::multi_polygon<polygon_type_t> operator+(const bg::model::multi_polygo
namespace boost { namespace geometry { namespace model { namespace d2 {

template <typename T>
bool operator<(
extern inline bool operator<(
const boost::geometry::model::d2::point_xy<T>& x,
const boost::geometry::model::d2::point_xy<T>& y);
const boost::geometry::model::d2::point_xy<T>& y) {
return std::tie(x.x(), x.y()) < std::tie(y.x(), y.y());
}

template <typename T>
boost::geometry::model::d2::point_xy<T> operator-(
extern inline boost::geometry::model::d2::point_xy<T> operator-(
const boost::geometry::model::d2::point_xy<T>& lhs,
const boost::geometry::model::d2::point_xy<T>& rhs);
const boost::geometry::model::d2::point_xy<T>& rhs) {
return {lhs.x()-rhs.x(), lhs.y()-rhs.y()};
}

template <typename T>
boost::geometry::model::d2::point_xy<T> operator+(
extern inline boost::geometry::model::d2::point_xy<T> operator+(
const boost::geometry::model::d2::point_xy<T>& lhs,
const boost::geometry::model::d2::point_xy<T>& rhs);
const boost::geometry::model::d2::point_xy<T>& rhs) {
return {lhs.x()+rhs.x(), lhs.y()+rhs.y()};
}

template <typename T, typename S>
boost::geometry::model::d2::point_xy<T> operator/(
extern inline boost::geometry::model::d2::point_xy<T> operator/(
const boost::geometry::model::d2::point_xy<T>& lhs,
const S& rhs);
const S& rhs) {
return {lhs.x()/static_cast<T>(rhs), lhs.y()/static_cast<T>(rhs)};
}

template <typename T, typename S>
boost::geometry::model::d2::point_xy<T> operator*(
extern inline boost::geometry::model::d2::point_xy<T> operator*(
const boost::geometry::model::d2::point_xy<T>& lhs,
const S& rhs);

static inline point_type_fp floor(const point_type_fp& a) {
return point_type_fp(std::floor(a.x()), std::floor(a.y()));
const S& rhs) {
return {lhs.x()*static_cast<T>(rhs), lhs.y()*static_cast<T>(rhs)};
}

template <typename T>
bool operator==(
extern inline bool operator==(
const boost::geometry::model::d2::point_xy<T>& x,
const boost::geometry::model::d2::point_xy<T>& y);
const boost::geometry::model::d2::point_xy<T>& y) {
return std::tie(x.x(), x.y()) == std::tie(y.x(), y.y());
}

template <typename T>
bool operator!=(
extern inline bool operator!=(
const boost::geometry::model::d2::point_xy<T>& x,
const boost::geometry::model::d2::point_xy<T>& y);
const boost::geometry::model::d2::point_xy<T>& y) {
return std::tie(x.x(), x.y()) != std::tie(y.x(), y.y());
}

extern inline point_type_fp floor(const point_type_fp& a) {
return point_type_fp(std::floor(a.x()), std::floor(a.y()));
}

template <typename T>
static std::ostream& operator<<(std::ostream& out, const bg::model::d2::point_xy<T>& t) {
extern inline std::ostream& operator<<(std::ostream& out, const bg::model::d2::point_xy<T>& t) {
out << bg::wkt(t);
return out;
}

template <typename T>
static std::ostream& operator<<(std::ostream& out, const bg::model::linestring<T>& t) {
extern inline std::ostream& operator<<(std::ostream& out, const bg::model::linestring<T>& t) {
out << bg::wkt(t);
return out;
}
Expand Down

0 comments on commit 2d30fc8

Please sign in to comment.