123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208 |
- // 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 <geometry_test_common.hpp>
- #include <boost/geometry/geometries/geometries.hpp>
- #include <boost/geometry/util/calculation_type.hpp>
- template <typename G1, typename G2>
- inline std::string helper()
- {
- std::string result;
- result += typeid(typename bg::coordinate_type<G1>::type).name();
- result += "/";
- result += typeid(typename bg::coordinate_type<G2>::type).name();
- return result;
- }
- template <typename G1, typename G2, typename G3>
- inline std::string helper3()
- {
- std::string result;
- result += typeid(typename bg::coordinate_type<G1>::type).name();
- result += "/";
- result += typeid(typename bg::coordinate_type<G2>::type).name();
- result += "/";
- result += typeid(typename bg::coordinate_type<G3>::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<G1, G2>();
- BOOST_CHECK_MESSAGE((boost::is_same<type, ExpectedType>::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<G1, G2>();
- BOOST_CHECK_MESSAGE((boost::is_same<type, ExpectedType>::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, ExpectedType>::type::value),
- "Failure, types do not agree;"
- << " input: " << typeid(typename bg::coordinate_type<Geometry>::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<G1, G2, G3>();
- BOOST_CHECK_MESSAGE((boost::is_same<type, ExpectedType>::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<double, 2, cs::cartesian> d;
- typedef model::point<float, 2, cs::cartesian> f;
- typedef model::point<int, 2, cs::cartesian> i;
- typedef model::point<char, 2, cs::cartesian> c;
- typedef model::point<short int, 2, cs::cartesian> s;
- typedef model::point<boost::long_long_type, 2, cs::cartesian> ll;
- typedef model::point<user_defined, 2, cs::cartesian> u;
- // Calculation type "void" so
- test<f, f, double, int, double>();
- test<d, d, double, int, double>();
- test<f, d, double, int, double>();
- // FP/int mixed
- test<i, f, double, int, double>();
- test<s, f, double, short int, double>();
- // integers
- test<s, s, double, short int, short int>();
- test<i, i, double, int, int>();
- test<c, i, double, int, int>();
- test<c, c, double, char, char>();
- test<c, c, double, int, int>();
- test<i, i, double, boost::long_long_type, boost::long_long_type>();
- // Even if we specify "int" as default-calculation-type, it should never go downwards.
- // So it will select "long long"
- test<ll, ll, double, int, boost::long_long_type>();
- // user defined
- test<u, i, double, char, user_defined>();
- test<u, d, double, double, user_defined>();
- test_with_calculation_type<i, i, double, double>();
- test_with_calculation_type<u, u, double, double>();
- test_unary<i, double, int, int>();
- test_unary<u, double, double, user_defined>();
- test_ternary<u, u, u, double, double, user_defined>();
- return 0;
- }
|