blob: 6e026676f47a1cd536f98b827b831291b04ec177 [file] [log] [blame]
// 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;
}