// Boost.Geometry (aka GGL, Generic Geometry Library) // Unit Test // Copyright (c) 2012 Barend Gehrels, Amsterdam, the Netherlands. // Copyright (c) 2012 Bruno Lalande, Paris, France. // Copyright (c) 2012 Mateusz Loskot, London, UK. // 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) #include #include #include template inline std::string helper() { std::string result; result += typeid(typename bg::coordinate_type::type).name(); result += "/"; result += typeid(typename bg::coordinate_type::type).name(); return result; } template inline std::string helper3() { std::string result; result += typeid(typename bg::coordinate_type::type).name(); result += "/"; result += typeid(typename bg::coordinate_type::type).name(); result += "/"; result += typeid(typename bg::coordinate_type::type).name(); return result; } template < typename G1, typename G2, typename DefaultFP, typename DefaultInt, typename ExpectedType > void test() { typedef typename bg::util::calculation_type::geometric::binary < G1, G2, void, DefaultFP, DefaultInt >::type type; std::string const caption = helper(); BOOST_CHECK_MESSAGE((boost::is_same::type::value), "Failure, types do not agree;" << " input: " << caption << " defaults: " << typeid(DefaultFP).name() << "/" << typeid(DefaultInt).name() << " expected: " << typeid(ExpectedType).name() << " detected: " << typeid(type).name() ); } template < typename G1, typename G2, typename CalculationType, typename ExpectedType > void test_with_calculation_type() { typedef typename bg::util::calculation_type::geometric::binary < G1, G2, CalculationType, double, int >::type type; std::string const caption = helper(); BOOST_CHECK_MESSAGE((boost::is_same::type::value), "Failure, types do not agree;" << " input: " << caption << " calculation type: " << typeid(CalculationType).name() << " expected: " << typeid(ExpectedType).name() << " detected: " << typeid(type).name() ); } template < typename Geometry, typename DefaultFP, typename DefaultInt, typename ExpectedType > void test_unary() { typedef typename bg::util::calculation_type::geometric::unary < Geometry, void, DefaultFP, DefaultInt >::type type; BOOST_CHECK_MESSAGE((boost::is_same::type::value), "Failure, types do not agree;" << " input: " << typeid(typename bg::coordinate_type::type).name() << " defaults: " << typeid(DefaultFP).name() << "/" << typeid(DefaultInt).name() << " expected: " << typeid(ExpectedType).name() << " detected: " << typeid(type).name() ); } template < typename G1, typename G2, typename G3, typename DefaultFP, typename DefaultInt, typename ExpectedType > void test_ternary() { typedef typename bg::util::calculation_type::geometric::ternary < G1, G2, G3, void, DefaultFP, DefaultInt >::type type; std::string const caption = helper3(); BOOST_CHECK_MESSAGE((boost::is_same::type::value), "Failure, types do not agree;" << " input: " << caption << " defaults: " << typeid(DefaultFP).name() << "/" << typeid(DefaultInt).name() << " expected: " << typeid(ExpectedType).name() << " detected: " << typeid(type).name() ); } struct user_defined {}; int test_main(int, char* []) { using namespace boost::geometry; typedef model::point d; typedef model::point f; typedef model::point i; typedef model::point c; typedef model::point s; typedef model::point ll; typedef model::point u; // Calculation type "void" so test(); test(); test(); // FP/int mixed test(); test(); // integers test(); test(); test(); test(); test(); test(); // Even if we specify "int" as default-calculation-type, it should never go downwards. // So it will select "long long" test(); // user defined test(); test(); test_with_calculation_type(); test_with_calculation_type(); test_unary(); test_unary(); test_ternary(); return 0; }