libcruft-util/test/point.cpp
Danny Robson d3f434b523 coord: make template parameters more flexible
The coordinate system was unable to support types that prohibited
redim or retype operations. Additionally, the `tags' type used for
providing named data parameters was unwiedly.

We remove much of the dependance on template template parameters in the
defined operations and instead define these in terms of a template
specialisation of is_coord.

The tag types were replaced with direct specialisation of the `store'
struct by the primary type, and passing this type through use of the
CRTP.
2017-11-22 17:03:00 +11:00

93 lines
2.4 KiB
C++

#include "point.hpp"
#include "debug.hpp"
#include "tap.hpp"
#include "types.hpp"
using namespace util;
int
main (void)
{
util::TAP::logger tap;
// Redim to lower dimension
{
const point3f p { 0.f, 1.f, 2.f };
const point2f q = p.redim<2> ();
const point2f r { 0.f, 1.f };
tap.expect_eq (q, r, "redim to lower dimension");
}
// Redim to higher dimension without fill
{
const point2f p(0.f, 1.f);
const point2f q = p.redim<2> ();
// GCC: we can't use the equality operator here because it triggers
// an ICE on GCC 7.1.0
tap.expect (
std::equal (std::cbegin (p), std::cend (p), std::cbegin (q)),
"redim to higher dimension"
);
}
// Redim to higher dimension with fill
//
// HACK: This fails under GCC-7.1.0, and i'm not wasting any more time
// reducing this test case. it's _really_ template heavy.
#if !(__GNUC_PREREQ (7, 1))
{
static const point4f FILL (1.f, 2.f, 3.f, 4.f);
const point2f p (0.1f, 1.f);
const point4f q = p.template redim<4> (FILL);
tap.expect (
almost_equal (q[0], p[0]) &&
almost_equal (q[1], p[1]) &&
almost_equal (q[2], FILL[2]) &&
almost_equal (q[3], FILL[3]),
"redim to higher with fill"
);
}
#endif
// Simple linking check for coord type casting. Relies on truncation.
{
const point2f pf (0.5f, 0.2f);
const point2u pu (0, 0);
tap.expect_eq (pf.template cast<point2u::value_type> (), pu, "type cast with truncation");
}
// redim to 4-dimension homogenous coords
{
const point2f p (3, 4);
const point4f q = p.homog<4> ();
tap.expect (
almost_equal (q.x, 3.f) &&
almost_equal (q.y, 4.f) &&
almost_equal (q.z, 0.f) &&
almost_equal (q.w, 1.f),
"homogenous redim"
);
}
// trivial checks for distance metrics
{
const point2f a (1, 2);
const point2f b (9, 5);
tap.expect_eq (distance2 (a, b), 73.f, "distance2");
tap.expect_eq (distance (a, b), std::sqrt (73.f), "distance");
tap.expect_eq (manhattan (a, b), 11.f, "manhattan");
tap.expect_eq (chebyshev (a, b), 8.f, "chebyshev");
}
return tap.status ();
}