summaryrefslogtreecommitdiff
path: root/boost/polygon/point_concept.hpp
diff options
context:
space:
mode:
authorAnas Nashif <anas.nashif@intel.com>2012-10-30 12:57:26 -0700
committerAnas Nashif <anas.nashif@intel.com>2012-10-30 12:57:26 -0700
commit1a78a62555be32868418fe52f8e330c9d0f95d5a (patch)
treed3765a80e7d3b9640ec2e930743630cd6b9fce2b /boost/polygon/point_concept.hpp
downloadboost-1a78a62555be32868418fe52f8e330c9d0f95d5a.tar.gz
boost-1a78a62555be32868418fe52f8e330c9d0f95d5a.tar.bz2
boost-1a78a62555be32868418fe52f8e330c9d0f95d5a.zip
Imported Upstream version 1.49.0upstream/1.49.0
Diffstat (limited to 'boost/polygon/point_concept.hpp')
-rw-r--r--boost/polygon/point_concept.hpp298
1 files changed, 298 insertions, 0 deletions
diff --git a/boost/polygon/point_concept.hpp b/boost/polygon/point_concept.hpp
new file mode 100644
index 0000000000..6e2ce0a520
--- /dev/null
+++ b/boost/polygon/point_concept.hpp
@@ -0,0 +1,298 @@
+/*
+ Copyright 2008 Intel Corporation
+
+ Use, modification and distribution are subject to the Boost Software License,
+ Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+ http://www.boost.org/LICENSE_1_0.txt).
+*/
+#ifndef BOOST_POLYGON_POINT_CONCEPT_HPP
+#define BOOST_POLYGON_POINT_CONCEPT_HPP
+#include "isotropy.hpp"
+#include "point_data.hpp"
+#include "point_traits.hpp"
+
+namespace boost { namespace polygon{
+ struct point_concept {};
+
+ template <typename T>
+ struct is_point_concept { typedef gtl_no type; };
+ template <>
+ struct is_point_concept<point_concept> { typedef gtl_yes type; };
+
+ struct point_3d_concept;
+ template <>
+ struct is_point_concept<point_3d_concept> { typedef gtl_yes type; };
+
+ template <typename T>
+ struct is_mutable_point_concept { typedef gtl_no type; };
+ template <>
+ struct is_mutable_point_concept<point_concept> { typedef gtl_yes type; };
+
+ template <typename T, typename CT>
+ struct point_coordinate_type_by_concept { typedef void type; };
+ template <typename T>
+ struct point_coordinate_type_by_concept<T, gtl_yes> { typedef typename point_traits<T>::coordinate_type type; };
+
+ template <typename T>
+ struct point_coordinate_type {
+ typedef typename point_coordinate_type_by_concept<T, typename is_point_concept<typename geometry_concept<T>::type>::type>::type type;
+ };
+
+ template <typename T, typename CT>
+ struct point_difference_type_by_concept { typedef void type; };
+ template <typename T>
+ struct point_difference_type_by_concept<T, gtl_yes> {
+ typedef typename coordinate_traits<typename point_traits<T>::coordinate_type>::coordinate_difference type; };
+
+ template <typename T>
+ struct point_difference_type {
+ typedef typename point_difference_type_by_concept<
+ T, typename is_point_concept<typename geometry_concept<T>::type>::type>::type type;
+ };
+
+ template <typename T, typename CT>
+ struct point_distance_type_by_concept { typedef void type; };
+ template <typename T>
+ struct point_distance_type_by_concept<T, gtl_yes> {
+ typedef typename coordinate_traits<typename point_traits<T>::coordinate_type>::coordinate_distance type; };
+
+ template <typename T>
+ struct point_distance_type {
+ typedef typename point_distance_type_by_concept<
+ T, typename is_point_concept<typename geometry_concept<T>::type>::type>::type type;
+ };
+
+ template <typename T>
+ typename point_coordinate_type<T>::type
+ get(const T& point, orientation_2d orient,
+ typename enable_if< typename gtl_if<typename is_point_concept<typename geometry_concept<T>::type>::type>::type>::type * = 0
+ ) {
+ return point_traits<T>::get(point, orient);
+ }
+
+ template <typename T, typename coordinate_type>
+ void
+ set(T& point, orientation_2d orient, coordinate_type value,
+ typename enable_if<typename is_mutable_point_concept<typename geometry_concept<T>::type>::type>::type * = 0
+ ) {
+ point_mutable_traits<T>::set(point, orient, value);
+ }
+
+ template <typename T, typename coordinate_type1, typename coordinate_type2>
+ T
+ construct(coordinate_type1 x_value, coordinate_type2 y_value,
+ typename enable_if<typename is_mutable_point_concept<typename geometry_concept<T>::type>::type>::type * = 0
+ ) {
+ return point_mutable_traits<T>::construct(x_value, y_value);
+ }
+
+ template <typename T1, typename T2>
+ T1&
+ assign(T1& lvalue, const T2& rvalue,
+ typename enable_if< typename gtl_and< typename is_mutable_point_concept<typename geometry_concept<T1>::type>::type,
+ typename is_point_concept<typename geometry_concept<T2>::type>::type>::type>::type * = 0
+ ) {
+ set(lvalue, HORIZONTAL, get(rvalue, HORIZONTAL));
+ set(lvalue, VERTICAL, get(rvalue, VERTICAL));
+ return lvalue;
+ }
+
+ struct y_p_x : gtl_yes {};
+
+ template <typename point_type>
+ typename enable_if< typename gtl_and<y_p_x, typename is_point_concept<typename geometry_concept<point_type>::type>::type>::type,
+ typename point_traits<point_type>::coordinate_type >::type
+ x(const point_type& point) {
+ return get(point, HORIZONTAL);
+ }
+
+ struct y_p_y : gtl_yes {};
+
+ template <typename point_type>
+ typename enable_if< typename gtl_and<y_p_y, typename is_point_concept<typename geometry_concept<point_type>::type>::type>::type,
+ typename point_traits<point_type>::coordinate_type >::type
+ y(const point_type& point) {
+ return get(point, VERTICAL);
+ }
+
+ struct y_p_sx : gtl_yes {};
+
+ template <typename point_type, typename coordinate_type>
+ typename enable_if<typename gtl_and<y_p_sx, typename is_mutable_point_concept<typename geometry_concept<point_type>::type>::type>::type,
+ void>::type
+ x(point_type& point, coordinate_type value) {
+ set(point, HORIZONTAL, value);
+ }
+
+ struct y_p_sy : gtl_yes {};
+
+ template <typename point_type, typename coordinate_type>
+ typename enable_if<typename gtl_and<y_p_sy, typename is_mutable_point_concept<typename geometry_concept<point_type>::type>::type>::type,
+ void>::type
+ y(point_type& point, coordinate_type value) {
+ set(point, VERTICAL, value);
+ }
+
+ template <typename T, typename T2>
+ bool
+ equivalence(const T& point1, const T2& point2,
+ typename enable_if< typename gtl_and<typename gtl_same_type<point_concept, typename geometry_concept<T>::type>::type,
+ typename is_point_concept<typename geometry_concept<T2>::type>::type>::type>::type * = 0
+ ) {
+ typename point_traits<T>::coordinate_type x1 = x(point1);
+ typename point_traits<T2>::coordinate_type x2 = get(point2, HORIZONTAL);
+ typename point_traits<T>::coordinate_type y1 = get(point1, VERTICAL);
+ typename point_traits<T2>::coordinate_type y2 = y(point2);
+ return x1 == x2 && y1 == y2;
+ }
+
+ template <typename point_type_1, typename point_type_2>
+ typename point_difference_type<point_type_1>::type
+ manhattan_distance(const point_type_1& point1, const point_type_2& point2,
+ typename enable_if< typename gtl_and<typename gtl_same_type<point_concept, typename geometry_concept<point_type_1>::type>::type,
+ typename is_point_concept<typename geometry_concept<point_type_2>::type>::type>::type>::type * = 0) {
+ return euclidean_distance(point1, point2, HORIZONTAL) + euclidean_distance(point1, point2, VERTICAL);
+ }
+
+ struct y_i_ed1 : gtl_yes {};
+
+ template <typename point_type_1, typename point_type_2>
+ typename enable_if< typename gtl_and_3<y_i_ed1, typename is_point_concept<typename geometry_concept<point_type_1>::type>::type,
+ typename is_point_concept<typename geometry_concept<point_type_2>::type>::type>::type,
+ typename point_difference_type<point_type_1>::type>::type
+ euclidean_distance(const point_type_1& point1, const point_type_2& point2, orientation_2d orient) {
+ typename coordinate_traits<typename point_traits<point_type_1>::coordinate_type>::coordinate_difference return_value =
+ get(point1, orient) - get(point2, orient);
+ return return_value < 0 ? (typename coordinate_traits<typename point_traits<point_type_1>::coordinate_type>::coordinate_difference)-return_value : return_value;
+ }
+
+ struct y_i_ed2 : gtl_yes {};
+
+ template <typename point_type_1, typename point_type_2>
+ typename enable_if< typename gtl_and_3<y_i_ed2, typename gtl_same_type<point_concept, typename geometry_concept<point_type_1>::type>::type,
+ typename gtl_same_type<point_concept, typename geometry_concept<point_type_2>::type>::type>::type,
+ typename point_distance_type<point_type_1>::type>::type
+ euclidean_distance(const point_type_1& point1, const point_type_2& point2) {
+ typedef typename point_traits<point_type_1>::coordinate_type Unit;
+ return sqrt((double)(distance_squared(point1, point2)));
+ }
+
+ template <typename point_type_1, typename point_type_2>
+ typename point_difference_type<point_type_1>::type
+ distance_squared(const point_type_1& point1, const point_type_2& point2,
+ typename enable_if< typename gtl_and<typename is_point_concept<typename geometry_concept<point_type_1>::type>::type,
+ typename is_point_concept<typename geometry_concept<point_type_2>::type>::type>::type>::type * = 0
+ ) {
+ typedef typename point_traits<point_type_1>::coordinate_type Unit;
+ typename coordinate_traits<Unit>::coordinate_difference dx = euclidean_distance(point1, point2, HORIZONTAL);
+ typename coordinate_traits<Unit>::coordinate_difference dy = euclidean_distance(point1, point2, VERTICAL);
+ dx *= dx;
+ dy *= dy;
+ return dx + dy;
+ }
+
+ template <typename point_type_1, typename point_type_2>
+ point_type_1 &
+ convolve(point_type_1& lvalue, const point_type_2& rvalue,
+ typename enable_if< typename gtl_and<typename is_mutable_point_concept<typename geometry_concept<point_type_1>::type>::type,
+ typename is_point_concept<typename geometry_concept<point_type_2>::type>::type>::type>::type * = 0
+ ) {
+ x(lvalue, x(lvalue) + x(rvalue));
+ y(lvalue, y(lvalue) + y(rvalue));
+ return lvalue;
+ }
+
+ template <typename point_type_1, typename point_type_2>
+ point_type_1 &
+ deconvolve(point_type_1& lvalue, const point_type_2& rvalue,
+ typename enable_if< typename gtl_and<typename is_mutable_point_concept<typename geometry_concept<point_type_1>::type>::type,
+ typename is_point_concept<typename geometry_concept<point_type_2>::type>::type>::type>::type * = 0
+ ) {
+ x(lvalue, x(lvalue) - x(rvalue));
+ y(lvalue, y(lvalue) - y(rvalue));
+ return lvalue;
+ }
+
+ template <typename point_type, typename coord_type>
+ point_type &
+ scale_up(point_type& point, coord_type factor,
+ typename enable_if<typename is_mutable_point_concept<typename geometry_concept<point_type>::type>::type>::type * = 0
+ ) {
+ typedef typename point_traits<point_type>::coordinate_type Unit;
+ x(point, x(point) * (Unit)factor);
+ y(point, y(point) * (Unit)factor);
+ return point;
+ }
+
+ template <typename point_type, typename coord_type>
+ point_type &
+ scale_down(point_type& point, coord_type factor,
+ typename enable_if<typename is_mutable_point_concept<typename geometry_concept<point_type>::type>::type>::type * = 0
+ ) {
+ typedef typename point_traits<point_type>::coordinate_type Unit;
+ typedef typename coordinate_traits<Unit>::coordinate_distance dt;
+ x(point, scaling_policy<Unit>::round((dt)((dt)(x(point)) / (dt)factor)));
+ y(point, scaling_policy<Unit>::round((dt)((dt)(y(point)) / (dt)factor)));
+ return point;
+ }
+
+ template <typename point_type, typename scaling_type>
+ point_type &
+ scale(point_type& point,
+ const scaling_type& scaling,
+ typename enable_if<typename is_mutable_point_concept<typename geometry_concept<point_type>::type>::type>::type * = 0
+ ) {
+ typedef typename point_traits<point_type>::coordinate_type Unit;
+ Unit x_(x(point)), y_(y(point));
+ scaling.scale(x_, y_);
+ x(point, x_);
+ y(point, y_);
+ return point;
+ }
+
+ template <typename point_type, typename transformation_type>
+ point_type &
+ transform(point_type& point, const transformation_type& transformation,
+ typename enable_if<typename is_mutable_point_concept<typename geometry_concept<point_type>::type>::type>::type * = 0
+ ) {
+ typedef typename point_traits<point_type>::coordinate_type Unit;
+ Unit x_(x(point)), y_(y(point));
+ transformation.transform(x_, y_);
+ x(point, x_);
+ y(point, y_);
+ return point;
+ }
+
+ struct y_pt_move : gtl_yes {};
+
+ template <typename point_type>
+ typename enable_if<
+ typename gtl_and< y_pt_move,
+ typename is_mutable_point_concept<
+ typename geometry_concept<point_type>::type>::type>::type,
+ point_type>::type &
+ move(point_type& point, orientation_2d orient,
+ typename point_traits<point_type>::coordinate_type displacement,
+ typename enable_if<typename is_mutable_point_concept<typename geometry_concept<point_type>::type>::type>::type * = 0
+ ) {
+ typedef typename point_traits<point_type>::coordinate_type Unit;
+ Unit v(get(point, orient));
+ set(point, orient, v + displacement);
+ return point;
+ }
+
+ template <class T>
+ template <class T2>
+ point_data<T>& point_data<T>::operator=(const T2& rvalue) {
+ assign(*this, rvalue);
+ return *this;
+ }
+
+ template <typename T>
+ struct geometry_concept<point_data<T> > {
+ typedef point_concept type;
+ };
+}
+}
+#endif
+