Mercurial > hg > vamp-build-and-test
diff DEPENDENCIES/generic/include/boost/polygon/interval_concept.hpp @ 16:2665513ce2d3
Add boost headers
author | Chris Cannam |
---|---|
date | Tue, 05 Aug 2014 11:11:38 +0100 |
parents | |
children | c530137014c0 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DEPENDENCIES/generic/include/boost/polygon/interval_concept.hpp Tue Aug 05 11:11:38 2014 +0100 @@ -0,0 +1,935 @@ +// Boost.Polygon library interval_concept.hpp header file + +// Copyright (c) Intel Corporation 2008. +// Copyright (c) 2008-2012 Simonson Lucanus. +// Copyright (c) 2012-2012 Andrii Sydorchuk. + +// See http://www.boost.org for updates, documentation, and revision history. +// Use, modification and distribution is 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_INTERVAL_CONCEPT_HPP +#define BOOST_POLYGON_INTERVAL_CONCEPT_HPP + +#include "isotropy.hpp" +#include "interval_traits.hpp" + +namespace boost { +namespace polygon { + +struct interval_concept {}; + +template <typename ConceptType> +struct is_interval_concept { + typedef gtl_no type; +}; + +template <> +struct is_interval_concept<interval_concept> { + typedef gtl_yes type; +}; + +template <typename ConceptType> +struct is_mutable_interval_concept { + typedef gtl_no type; +}; + +template <> +struct is_mutable_interval_concept<interval_concept> { + typedef gtl_yes type; +}; + +template <typename GeometryType, typename BoolType> +struct interval_coordinate_type_by_concept { + typedef void type; +}; + +template <typename GeometryType> +struct interval_coordinate_type_by_concept<GeometryType, gtl_yes> { + typedef typename interval_traits<GeometryType>::coordinate_type type; +}; + +template <typename GeometryType> +struct interval_coordinate_type { + typedef typename interval_coordinate_type_by_concept< + GeometryType, + typename is_interval_concept< + typename geometry_concept<GeometryType>::type + >::type + >::type type; +}; + +template <typename GeometryType, typename BoolType> +struct interval_difference_type_by_concept { + typedef void type; +}; + +template <typename GeometryType> +struct interval_difference_type_by_concept<GeometryType, gtl_yes> { + typedef typename coordinate_traits< + typename interval_traits<GeometryType>::coordinate_type + >::coordinate_difference type; +}; + +template <typename GeometryType> +struct interval_difference_type { + typedef typename interval_difference_type_by_concept< + GeometryType, + typename is_interval_concept< + typename geometry_concept<GeometryType>::type + >::type + >::type type; +}; + +struct y_i_get : gtl_yes {}; + +template <typename IntervalType> +typename enable_if< + typename gtl_and< + y_i_get, + typename is_interval_concept< + typename geometry_concept<IntervalType>::type + >::type + >::type, + typename interval_coordinate_type<IntervalType>::type +>::type get(const IntervalType& interval, direction_1d dir) { + return interval_traits<IntervalType>::get(interval, dir); +} + +struct y_i_set : gtl_yes {}; + +template <typename IntervalType> +typename enable_if< + typename gtl_and< + y_i_set, + typename is_mutable_interval_concept< + typename geometry_concept<IntervalType>::type + >::type + >::type, + void +>::type set(IntervalType& interval, direction_1d dir, + typename interval_mutable_traits<IntervalType>::coordinate_type value) { + interval_mutable_traits<IntervalType>::set(interval, dir, value); +} + +struct y_i_construct : gtl_yes {}; + +template <typename IntervalType> +typename enable_if< + typename gtl_and< + y_i_construct, + typename is_mutable_interval_concept< + typename geometry_concept<IntervalType>::type + >::type + >::type, + IntervalType +>::type construct( + typename interval_mutable_traits<IntervalType>::coordinate_type low, + typename interval_mutable_traits<IntervalType>::coordinate_type high) { + if (low > high) { + (std::swap)(low, high); + } + return interval_mutable_traits<IntervalType>::construct(low, high); +} + +struct y_i_copy_construct : gtl_yes {}; + +template <typename IntervalType1, typename IntervalType2> +typename enable_if< + typename gtl_and_3< + y_i_copy_construct, + typename is_mutable_interval_concept< + typename geometry_concept<IntervalType1>::type + >::type, + typename is_interval_concept< + typename geometry_concept<IntervalType2>::type + >::type + >::type, + IntervalType1 +>::type copy_construct(const IntervalType2& interval) { + return construct<IntervalType1>(get(interval, LOW), get(interval, HIGH)); +} + +struct y_i_assign : gtl_yes {}; + +template <typename IntervalType1, typename IntervalType2> +typename enable_if< + typename gtl_and_3< + y_i_assign, + typename is_mutable_interval_concept< + typename geometry_concept<IntervalType1>::type + >::type, + typename is_interval_concept< + typename geometry_concept<IntervalType2>::type + >::type + >::type, + IntervalType1 +>::type& assign(IntervalType1& lvalue, const IntervalType2& rvalue) { + set(lvalue, LOW, get(rvalue, LOW)); + set(lvalue, HIGH, get(rvalue, HIGH)); + return lvalue; +} + +struct y_i_low : gtl_yes {}; + +template <typename IntervalType> +typename enable_if< + typename gtl_and< + y_i_low, + typename is_interval_concept< + typename geometry_concept<IntervalType>::type + >::type + >::type, + typename interval_coordinate_type<IntervalType>::type +>::type low(const IntervalType& interval) { + return get(interval, LOW); +} + +struct y_i_high : gtl_yes {}; + +template <typename IntervalType> +typename enable_if< + typename gtl_and< + y_i_high, + typename is_interval_concept< + typename geometry_concept<IntervalType>::type + >::type + >::type, + typename interval_coordinate_type<IntervalType>::type +>::type high(const IntervalType& interval) { + return get(interval, HIGH); +} + +struct y_i_low2 : gtl_yes {}; + +template <typename IntervalType> +typename enable_if< + typename gtl_and< + y_i_low2, + typename is_mutable_interval_concept< + typename geometry_concept<IntervalType>::type + >::type + >::type, + void +>::type low(IntervalType& interval, + typename interval_mutable_traits<IntervalType>::coordinate_type value) { + set(interval, LOW, value); +} + +struct y_i_high2 : gtl_yes {}; + +template <typename IntervalType> +typename enable_if< + typename gtl_and< + y_i_high2, + typename is_mutable_interval_concept< + typename geometry_concept<IntervalType>::type + >::type + >::type, + void +>::type high(IntervalType& interval, + typename interval_mutable_traits<IntervalType>::coordinate_type value) { + set(interval, HIGH, value); +} + +struct y_i_equivalence : gtl_yes {}; + +template <typename IntervalType1, typename IntervalType2> +typename enable_if< + typename gtl_and_3< + y_i_equivalence, + typename is_interval_concept< + typename geometry_concept<IntervalType1>::type + >::type, + typename is_interval_concept< + typename geometry_concept<IntervalType2>::type + >::type + >::type, + bool +>::type equivalence( + const IntervalType1& interval1, + const IntervalType2& interval2) { + return (get(interval1, LOW) == get(interval2, LOW)) && + (get(interval1, HIGH) == get(interval2, HIGH)); +} + +struct y_i_contains : gtl_yes {}; + +template <typename IntervalType> +typename enable_if< + typename gtl_and< + y_i_contains, + typename is_interval_concept< + typename geometry_concept<IntervalType>::type + >::type + >::type, + bool +>::type contains( + const IntervalType& interval, + typename interval_coordinate_type<IntervalType>::type value, + bool consider_touch = true ) { + if (consider_touch) { + return value <= high(interval) && value >= low(interval); + } else { + return value < high(interval) && value > low(interval); + } +} + +struct y_i_contains2 : gtl_yes {}; + +template <typename IntervalType1, typename IntervalType2> +typename enable_if< + typename gtl_and_3< + y_i_contains2, + typename is_interval_concept< + typename geometry_concept<IntervalType1>::type + >::type, + typename is_interval_concept< + typename geometry_concept<IntervalType2>::type + >::type + >::type, + bool +>::type contains( + const IntervalType1& interval1, + const IntervalType2& interval2, + bool consider_touch = true) { + return contains(interval1, get(interval2, LOW), consider_touch) && + contains(interval1, get(interval2, HIGH), consider_touch); +} + +struct y_i_center : gtl_yes {}; + +template <typename IntervalType> +typename enable_if< + typename gtl_and< + y_i_center, + typename is_interval_concept< + typename geometry_concept<IntervalType>::type + >::type + >::type, + typename interval_coordinate_type<IntervalType>::type +>::type center(const IntervalType& interval) { + return (high(interval) + low(interval)) / 2; +} + +struct y_i_delta : gtl_yes {}; + +template <typename IntervalType> +typename enable_if< + typename gtl_and< + y_i_delta, + typename is_interval_concept< + typename geometry_concept<IntervalType>::type + >::type + >::type, + typename interval_difference_type<IntervalType>::type +>::type delta(const IntervalType& interval) { + typedef typename interval_difference_type<IntervalType>::type diff_type; + return static_cast<diff_type>(high(interval)) - + static_cast<diff_type>(low(interval)); +} + +struct y_i_flip : gtl_yes {}; + +template <typename IntervalType> +typename enable_if< + typename gtl_and< + y_i_flip, + typename is_mutable_interval_concept< + typename geometry_concept<IntervalType>::type + >::type + >::type, +IntervalType>::type& flip( + IntervalType& interval, + typename interval_coordinate_type<IntervalType>::type axis = 0) { + typename interval_coordinate_type<IntervalType>::type newLow, newHigh; + newLow = 2 * axis - high(interval); + newHigh = 2 * axis - low(interval); + low(interval, newLow); + high(interval, newHigh); + return interval; +} + +struct y_i_scale_up : gtl_yes {}; + +template <typename IntervalType> +typename enable_if< + typename gtl_and< + y_i_scale_up, + typename is_mutable_interval_concept< + typename geometry_concept<IntervalType>::type + >::type + >::type, + IntervalType +>::type& scale_up( + IntervalType& interval, + typename interval_coordinate_type<IntervalType>::type factor) { + typename interval_coordinate_type<IntervalType>::type newHigh = + high(interval) * factor; + low(interval, low(interval) * factor); + high(interval, (newHigh)); + return interval; +} + +struct y_i_scale_down : gtl_yes {}; + +template <typename IntervalType> +typename enable_if< + typename gtl_and< + y_i_scale_down, + typename is_mutable_interval_concept< + typename geometry_concept<IntervalType>::type + >::type + >::type, + IntervalType +>::type& scale_down( + IntervalType& interval, + typename interval_coordinate_type<IntervalType>::type factor) { + typedef typename interval_coordinate_type<IntervalType>::type Unit; + typename interval_coordinate_type<IntervalType>::type newHigh = + high(interval) / factor; + low(interval, low(interval) / factor); + high(interval, (newHigh)); + return interval; +} + +// TODO(asydorchuk): Deprecated. +struct y_i_scale : gtl_yes {}; + +template <typename IntervalType> +typename enable_if< + typename gtl_and< + y_i_scale, + typename is_mutable_interval_concept< + typename geometry_concept<IntervalType>::type + >::type + >::type, + IntervalType +>::type& scale(IntervalType& interval, double factor) { + typedef typename interval_coordinate_type<IntervalType>::type Unit; + Unit newHigh = scaling_policy<Unit>::round( + static_cast<double>(high(interval)) * factor); + low(interval, scaling_policy<Unit>::round( + static_cast<double>(low(interval)) * factor)); + high(interval, (newHigh)); + return interval; +} + +struct y_i_move : gtl_yes {}; + +template <typename IntervalType> +typename enable_if< + typename gtl_and< + y_i_move, + typename is_mutable_interval_concept< + typename geometry_concept<IntervalType>::type + >::type + >::type, + IntervalType +>::type& move( + IntervalType& interval, + typename interval_difference_type<IntervalType>::type displacement) { + typedef typename interval_coordinate_type<IntervalType>::type ctype; + typedef typename coordinate_traits<ctype>::coordinate_difference Unit; + low(interval, static_cast<ctype>( + static_cast<Unit>(low(interval)) + displacement)); + high(interval, static_cast<ctype>( + static_cast<Unit>(high(interval)) + displacement)); + return interval; +} + +struct y_i_convolve : gtl_yes {}; + +template <typename IntervalType> +typename enable_if< + typename gtl_and< + y_i_convolve, + typename is_mutable_interval_concept< + typename geometry_concept<IntervalType>::type + >::type + >::type, + IntervalType +>::type& convolve( + IntervalType& interval, + typename interval_coordinate_type<IntervalType>::type value) { + typedef typename interval_coordinate_type<IntervalType>::type Unit; + Unit newLow = low(interval) + value; + Unit newHigh = high(interval) + value; + low(interval, newLow); + high(interval, newHigh); + return interval; +} + +struct y_i_deconvolve : gtl_yes {}; + +template <typename IntervalType> +typename enable_if< + typename gtl_and< + y_i_deconvolve, + typename is_mutable_interval_concept< + typename geometry_concept<IntervalType>::type + >::type + >::type, + IntervalType +>::type& deconvolve( + IntervalType& interval, + typename interval_coordinate_type<IntervalType>::type value) { + typedef typename interval_coordinate_type<IntervalType>::type Unit; + Unit newLow = low(interval) - value; + Unit newHigh = high(interval) - value; + low(interval, newLow); + high(interval, newHigh); + return interval; +} + +struct y_i_convolve2 : gtl_yes {}; + +template <typename IntervalType1, typename IntervalType2> +typename enable_if< + typename gtl_and_3< + y_i_convolve2, + typename is_mutable_interval_concept< + typename geometry_concept<IntervalType1>::type + >::type, + typename is_interval_concept< + typename geometry_concept<IntervalType2>::type + >::type + >::type, + IntervalType1 +>::type& convolve(IntervalType1& lvalue, const IntervalType2& rvalue) { + typedef typename interval_coordinate_type<IntervalType1>::type Unit; + Unit newLow = low(lvalue) + low(rvalue); + Unit newHigh = high(lvalue) + high(rvalue); + low(lvalue, newLow); + high(lvalue, newHigh); + return lvalue; +} + +struct y_i_deconvolve2 : gtl_yes {}; + +template <typename IntervalType1, typename IntervalType2> +typename enable_if< + typename gtl_and_3< + y_i_deconvolve2, + typename is_mutable_interval_concept< + typename geometry_concept<IntervalType1>::type + >::type, + typename is_interval_concept< + typename geometry_concept<IntervalType2>::type + >::type + >::type, + IntervalType1 +>::type& deconvolve(IntervalType1& lvalue, const IntervalType2& rvalue) { + typedef typename interval_coordinate_type<IntervalType1>::type Unit; + Unit newLow = low(lvalue) - low(rvalue); + Unit newHigh = high(lvalue) - high(rvalue); + low(lvalue, newLow); + high(lvalue, newHigh); + return lvalue; +} + +struct y_i_reconvolve : gtl_yes {}; + +template <typename IntervalType1, typename IntervalType2> +typename enable_if< + typename gtl_and_3< + y_i_reconvolve, + typename is_mutable_interval_concept< + typename geometry_concept<IntervalType1>::type + >::type, + typename is_interval_concept< + typename geometry_concept<IntervalType2>::type + >::type + >::type, + IntervalType1 +>::type& reflected_convolve( + IntervalType1& lvalue, + const IntervalType2& rvalue) { + typedef typename interval_coordinate_type<IntervalType1>::type Unit; + Unit newLow = low(lvalue) - high(rvalue); + Unit newHigh = high(lvalue) - low(rvalue); + low(lvalue, newLow); + high(lvalue, newHigh); + return lvalue; +} + +struct y_i_redeconvolve : gtl_yes {}; + +template <typename IntervalType1, typename IntervalType2> +typename enable_if< + typename gtl_and_3< + y_i_redeconvolve, + typename is_mutable_interval_concept< + typename geometry_concept<IntervalType1>::type + >::type, + typename is_interval_concept< + typename geometry_concept<IntervalType2>::type + >::type + >::type, + IntervalType1 +>::type& reflected_deconvolve( + IntervalType1& lvalue, + const IntervalType2& rvalue) { + typedef typename interval_coordinate_type<IntervalType1>::type Unit; + Unit newLow = low(lvalue) + high(rvalue); + Unit newHigh = high(lvalue) + low(rvalue); + low(lvalue, newLow); + high(lvalue, newHigh); + return lvalue; +} + +struct y_i_e_dist1 : gtl_yes {}; + +template <typename IntervalType> +typename enable_if< + typename gtl_and<y_i_e_dist1, + typename is_interval_concept< + typename geometry_concept<IntervalType>::type + >::type + >::type, + typename interval_difference_type<IntervalType>::type +>::type euclidean_distance( + const IntervalType& interval, + typename interval_coordinate_type<IntervalType>::type position) { + typedef typename interval_difference_type<IntervalType>::type Unit; + Unit dist[3] = { + 0, + (Unit)low(interval) - (Unit)position, + (Unit)position - (Unit)high(interval) + }; + return dist[(dist[1] > 0) + ((dist[2] > 0) << 1)]; +} + +struct y_i_e_dist2 : gtl_yes {}; + +template <typename IntervalType1, typename IntervalType2> +typename enable_if< + typename gtl_and_3< + y_i_e_dist2, + typename is_interval_concept< + typename geometry_concept<IntervalType1>::type + >::type, + typename is_interval_concept< + typename geometry_concept<IntervalType2>::type + >::type + >::type, + typename interval_difference_type<IntervalType1>::type +>::type euclidean_distance( + const IntervalType1& interval1, + const IntervalType2& interval2) { + typedef typename interval_difference_type<IntervalType1>::type Unit; + Unit dist[3] = { + 0, + (Unit)low(interval1) - (Unit)high(interval2), + (Unit)low(interval2) - (Unit)high(interval1) + }; + return dist[(dist[1] > 0) + ((dist[2] > 0) << 1)]; +} + +struct y_i_e_intersects : gtl_yes {}; + +template <typename IntervalType1, typename IntervalType2> +typename enable_if< + typename gtl_and_3< + y_i_e_intersects, + typename is_interval_concept< + typename geometry_concept<IntervalType1>::type + >::type, + typename is_interval_concept< + typename geometry_concept<IntervalType2>::type + >::type + >::type, + bool +>::type intersects( + const IntervalType1& interval1, + const IntervalType2& interval2, + bool consider_touch = true) { + return consider_touch ? + (low(interval1) <= high(interval2)) && + (high(interval1) >= low(interval2)) : + (low(interval1) < high(interval2)) && + (high(interval1) > low(interval2)); +} + +struct y_i_e_bintersect : gtl_yes {}; + +template <typename IntervalType1, typename IntervalType2> +typename enable_if< + typename gtl_and_3< + y_i_e_bintersect, + typename is_interval_concept< + typename geometry_concept<IntervalType1>::type + >::type, + typename is_interval_concept< + typename geometry_concept<IntervalType2>::type + >::type + >::type, + bool +>::type boundaries_intersect( + const IntervalType1& interval1, + const IntervalType2& interval2, + bool consider_touch = true) { + return (contains(interval1, low(interval2), consider_touch) || + contains(interval1, high(interval2), consider_touch)) && + (contains(interval2, low(interval1), consider_touch) || + contains(interval2, high(interval1), consider_touch)); +} + +struct y_i_intersect : gtl_yes {}; + +template <typename IntervalType1, typename IntervalType2> +typename enable_if< + typename gtl_and_3< + y_i_intersect, + typename is_mutable_interval_concept< + typename geometry_concept<IntervalType1>::type + >::type, + typename is_interval_concept< + typename geometry_concept<IntervalType2>::type + >::type + >::type, + bool +>::type intersect( + IntervalType1& lvalue, + const IntervalType2& rvalue, + bool consider_touch = true) { + typedef typename interval_coordinate_type<IntervalType1>::type Unit; + Unit lowVal = (std::max)(low(lvalue), low(rvalue)); + Unit highVal = (std::min)(high(lvalue), high(rvalue)); + bool valid = consider_touch ? lowVal <= highVal : lowVal < highVal; + if (valid) { + low(lvalue, lowVal); + high(lvalue, highVal); + } + return valid; +} + +struct y_i_g_intersect : gtl_yes {}; + +// TODO(asydorchuk): Deprecated. +template <typename IntervalType1, typename IntervalType2> +typename enable_if< + typename gtl_and_3< + y_i_g_intersect, + typename is_mutable_interval_concept< + typename geometry_concept<IntervalType1>::type + >::type, + typename is_interval_concept< + typename geometry_concept<IntervalType2>::type + >::type + >::type, + IntervalType1 +>::type& generalized_intersect( + IntervalType1& lvalue, + const IntervalType2& rvalue) { + typedef typename interval_coordinate_type<IntervalType1>::type Unit; + Unit coords[4] = {low(lvalue), high(lvalue), low(rvalue), high(rvalue)}; + // TODO(asydorchuk): consider implementing faster sorting of small + // fixed length range. + polygon_sort(coords, coords+4); + low(lvalue, coords[1]); + high(lvalue, coords[2]); + return lvalue; +} + +struct y_i_abuts1 : gtl_yes {}; + +template <typename IntervalType1, typename IntervalType2> +typename enable_if< + typename gtl_and_3< + y_i_abuts1, + typename is_interval_concept< + typename geometry_concept<IntervalType1>::type + >::type, + typename is_interval_concept< + typename geometry_concept<IntervalType2>::type + >::type + >::type, + bool +>::type abuts( + const IntervalType1& interval1, + const IntervalType2& interval2, + direction_1d dir) { + return dir.to_int() ? low(interval2) == high(interval1) : + low(interval1) == high(interval2); +} + +struct y_i_abuts2 : gtl_yes {}; + +template <typename IntervalType1, typename IntervalType2> +typename enable_if< + typename gtl_and_3< + y_i_abuts2, + typename is_interval_concept< + typename geometry_concept<IntervalType1>::type + >::type, + typename is_interval_concept< + typename geometry_concept<IntervalType2>::type + >::type + >::type, + bool +>::type abuts( + const IntervalType1& interval1, + const IntervalType2& interval2) { + return abuts(interval1, interval2, HIGH) || + abuts(interval1, interval2, LOW); +} + +struct y_i_bloat : gtl_yes {}; + +template <typename IntervalType> +typename enable_if< + typename gtl_and< + y_i_bloat, + typename is_mutable_interval_concept< + typename geometry_concept<IntervalType>::type + >::type + >::type, + IntervalType +>::type& bloat( + IntervalType& interval, + typename interval_coordinate_type<IntervalType>::type bloating) { + low(interval, low(interval) - bloating); + high(interval, high(interval) + bloating); + return interval; +} + +struct y_i_bloat2 : gtl_yes {}; + +template <typename IntervalType> +typename enable_if< + typename gtl_and< + y_i_bloat2, + typename is_mutable_interval_concept< + typename geometry_concept<IntervalType>::type + >::type + >::type, + IntervalType +>::type& bloat( + IntervalType& interval, + direction_1d dir, + typename interval_coordinate_type<IntervalType>::type bloating) { + set(interval, dir, get(interval, dir) + dir.get_sign() * bloating); + return interval; +} + +struct y_i_shrink : gtl_yes {}; + +template <typename IntervalType> +typename enable_if< + typename gtl_and< + y_i_shrink, + typename is_mutable_interval_concept< + typename geometry_concept<IntervalType>::type + >::type + >::type, + IntervalType +>::type& shrink( + IntervalType& interval, + typename interval_coordinate_type<IntervalType>::type shrinking) { + return bloat(interval, -shrinking); +} + +struct y_i_shrink2 : gtl_yes {}; + +template <typename IntervalType> +typename enable_if< + typename gtl_and< + y_i_shrink2, + typename is_mutable_interval_concept< + typename geometry_concept<IntervalType>::type + >::type + >::type, + IntervalType +>::type& shrink( + IntervalType& interval, + direction_1d dir, + typename interval_coordinate_type<IntervalType>::type shrinking) { + return bloat(interval, dir, -shrinking); +} + +struct y_i_encompass : gtl_yes {}; + +template <typename IntervalType1, typename IntervalType2> +typename enable_if< + typename gtl_and_3< + y_i_encompass, + typename is_mutable_interval_concept< + typename geometry_concept<IntervalType1>::type + >::type, + typename is_interval_concept< + typename geometry_concept<IntervalType2>::type + >::type + >::type, + bool +>::type encompass(IntervalType1& interval1, const IntervalType2& interval2) { + bool retval = !contains(interval1, interval2, true); + low(interval1, (std::min)(low(interval1), low(interval2))); + high(interval1, (std::max)(high(interval1), high(interval2))); + return retval; +} + +struct y_i_encompass2 : gtl_yes {}; + +template <typename IntervalType> +typename enable_if< + typename gtl_and< + y_i_encompass2, + typename is_mutable_interval_concept< + typename geometry_concept<IntervalType>::type + >::type + >::type, + bool +>::type encompass( + IntervalType& interval, + typename interval_coordinate_type<IntervalType>::type value) { + bool retval = !contains(interval, value, true); + low(interval, (std::min)(low(interval), value)); + high(interval, (std::max)(high(interval), value)); + return retval; +} + +struct y_i_get_half : gtl_yes {}; + +template <typename IntervalType> +typename enable_if< + typename gtl_and< + y_i_get_half, + typename is_mutable_interval_concept< + typename geometry_concept<IntervalType>::type + >::type + >::type, + IntervalType +>::type get_half(const IntervalType& interval, direction_1d dir) { + typedef typename interval_coordinate_type<IntervalType>::type Unit; + Unit c = (get(interval, LOW) + get(interval, HIGH)) / 2; + return construct<IntervalType>( + (dir == LOW) ? get(interval, LOW) : c, + (dir == LOW) ? c : get(interval, HIGH)); +} + +struct y_i_join_with : gtl_yes {}; + +template <typename IntervalType1, typename IntervalType2> +typename enable_if< + typename gtl_and_3< + y_i_join_with, + typename is_mutable_interval_concept< + typename geometry_concept<IntervalType1>::type + >::type, + typename is_interval_concept< + typename geometry_concept<IntervalType2>::type + >::type>::type, + bool +>::type join_with(IntervalType1& interval1, const IntervalType2& interval2) { + if (abuts(interval1, interval2)) { + encompass(interval1, interval2); + return true; + } + return false; +} +} // polygon +} // boost + +#endif // BOOST_POLYGON_INTERVAL_CONCEPT_HPP