update how Intersection_and_primitive_id get the type and update its doc

We use meta programming to remove the optional rather than relying on
Intersection_traits (since it depends on GeomTraits)
This commit is contained in:
Sébastien Loriot 2013-05-23 12:31:42 +02:00
parent e907f9f444
commit 34362d2a0f
3 changed files with 20 additions and 4 deletions

View File

@ -121,7 +121,7 @@ typedef Hidden_type Do_intersect;
/*! /*!
A functor object to compute the intersection of a query and a primitive. Provides the operator: A functor object to compute the intersection of a query and a primitive. Provides the operator:
`boost::optional<Intersection_and_primitive_id<Query>::type > operator()(const Query & q, const Primitive& primitive);` which returns the intersection as a pair composed of an object and a primitive id, iff the query intersects the primitive. `boost::optional<Intersection_and_primitive_id<Query>::%Type > operator()(const Query & q, const Primitive& primitive);` which returns the intersection as a pair composed of an object and a primitive id, iff the query intersects the primitive.
\cgalHeading{Note on Backward Compatibility} \cgalHeading{Note on Backward Compatibility}
Before the release 4.3 of \cgal, the return type of this function used to be `boost::optional<Object_and_primitive_id>`. Before the release 4.3 of \cgal, the return type of this function used to be `boost::optional<Object_and_primitive_id>`.
*/ */

View File

@ -36,6 +36,15 @@
namespace CGAL { namespace CGAL {
namespace internal{ namespace AABB_tree {
template <class T>
struct Remove_optional { typedef T type; };
template <class T>
struct Remove_optional< ::boost::optional<T> > { typedef T type; };
} } //end of namespace internal::AABB_tree
/// \addtogroup PkgAABB_tree /// \addtogroup PkgAABB_tree
/// @{ /// @{
@ -68,11 +77,18 @@ public:
typedef typename std::pair<typename GeomTraits::Point_3, typename Primitive::Id> Point_and_primitive_id; typedef typename std::pair<typename GeomTraits::Point_3, typename Primitive::Id> Point_and_primitive_id;
///\todo update this to use the return type of `GeomTraits::Intersection` together with an helper to remove optional /// `Intersection_and_primitive_id<Query>::%Type::first_type` is found according to
/// the result type of `GeomTraits::Intersect_3::operator()`,
/// (that is cpp11::result_of<GeomTraits::Intersect_3(Query, Primitive::Datum)>::type). If it is
/// `boost::optional<T>` then it is `T`, and the result type otherwise.
template<typename Query> template<typename Query>
struct Intersection_and_primitive_id { struct Intersection_and_primitive_id {
typedef typename cpp11::result_of<
typename GeomTraits::Intersect_3(Query, typename Primitive::Datum)
>::type Intersection_type;
typedef std::pair< typedef std::pair<
typename IT<Query, typename Primitive::Datum>::variant_type, //using Intersection_traits to skip the optional typename internal::AABB_tree::Remove_optional<Intersection_type>::type,
typename Primitive::Id > Type; typename Primitive::Id > Type;
}; };

View File

@ -238,7 +238,7 @@ public:
///@{ ///@{
/// Outputs the list of all intersections, as objects of /// Outputs the list of all intersections, as objects of
/// `Intersection_and_primitive_id<Query>::Type`, /// `Intersection_and_primitive_id<Query>::%Type`,
/// between the query and the input data to /// between the query and the input data to
/// the iterator. `do_intersect()` /// the iterator. `do_intersect()`
/// predicates and intersections must be defined for `Query` /// predicates and intersections must be defined for `Query`