|
Geometry : |
Subject: Re: [geometry] Run-Time specified geometries
From: Samuel Debionne (samuel.debionne_at_[hidden])
Date: 2013-12-04 09:05:39
Hello Bruno,
thanks for the tip ! That seems to solve the problem with
not_implemented and the compiler goes a bit further.
Now it bumps in other MPL_ASSERT that are in the algorithms::detail
namespaces such as for_each_range. My attempt for these errors is :
template
<
typename Tag,
typename Geometry,
typename Actor,
bool IsConst
>
struct for_each_range
{
#if defined(BOOST_GEOMETRY_RUNTIME_ERROR)
static inline void apply(
const Geometry&,
const Actor&)
{
throw not_implemented_error();
}
#else //BOOST_GEOMETRY_RUNTIME_ERROR
BOOST_MPL_ASSERT_MSG
(
false, NOT_OR_NOT_YET_IMPLEMENTED_FOR_THIS_GEOMETRY_TYPE
, (types<Geometry>)
);
#endif //BOOST_GEOMETRY_RUNTIME_ERROR
};
I did the same thing for sectionize. May be it could be factorized in
one place (just like you did with not_implemented).
My main issue right now is with the instantiation of some metafunctions
such as range_type<Geometry> that MPL_ASSERT as well. Since they are
pure metafunctions there is no way to trigger a runtime error and the pb
has to be handled upstream. Any idea on this one ?
I'm also a bit worried about code bloat (but I don't have any evidence
yet). Maybe I should think of a way to filter algorithms not implemented
for a given combination of types at the source...
Here is what I have in not_implemented.hpp so far :
#if defined(BOOST_GEOMETRY_RUNTIME_ERROR)
struct not_implemented_error : public std::exception {};
struct not_implemented_result
{
template <class T>
operator T()
{
// This will never actually happen - we just need to write something
// that hopefully all compilers are happy with (ideally without
warnings)
// and doesn't assume anything about T
T* t;
return *t;
}
};
template
<
typename Term1 = void,
typename Term2 = void,
typename Term3 = void
>
struct not_implemented
: nyi::not_implemented_tag
{
template <typename Term1>
inline static
not_implemented_result apply(Term1) {throw not_implemented_error();}
template <typename Term1, typename Term2>
inline static
not_implemented_result apply(Term1, Term2) {throw
not_implemented_error();}
template <typename Term1, typename Term2, typename Term3>
inline static
not_implemented_result apply(Term1, Term2, Term3) {throw
not_implemented_error();}
};
#else //BOOST_GEOMETRY_RUNTIME_ERROR
// MPL static error
BTW, I'm using MSVC11. I known that different compilers have different
strategies when it comes to template instantiations.
Thanks again for your help,
Samuel
Geometry list run by mateusz at loskot.net