coord: pass client class to coord base

allows common typesafe implementation of cast and redim
This commit is contained in:
Danny Robson 2015-04-09 17:47:35 +10:00
parent 9f6c17d6cf
commit 5428c93b9a
5 changed files with 13 additions and 11 deletions

View File

@ -29,8 +29,8 @@
namespace util { namespace util {
/// An RGBA colour POD type. /// An RGBA colour POD type.
template <typename T> template <typename T>
struct colour : public coord::base<4,T,coord::rgba> { struct colour : public coord::base<4,T,colour,coord::rgba> {
using coord::base<4,T,coord::rgba>::base; using coord::base<4,T,util::colour,coord::rgba>::base;
static const colour WHITE; static const colour WHITE;
static const colour BLACK; static const colour BLACK;

View File

@ -27,7 +27,7 @@
namespace util { namespace coord { namespace util { namespace coord {
///////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////
template <size_t S, typename T, typename ...tags> template <size_t S, typename T, template <size_t, typename> class KLASS, typename ...tags>
struct base : public init <S,T,tags...> { struct base : public init <S,T,tags...> {
static_assert (S > 0, "coord dimensions must be strictly positive"); static_assert (S > 0, "coord dimensions must be strictly positive");
@ -44,8 +44,8 @@ namespace util { namespace coord {
explicit base (T v) explicit base (T v)
{ std::fill (std::begin (this->data), std::end (this->data), v); } { std::fill (std::begin (this->data), std::end (this->data), v); }
base (const base<S,T,tags...> &rhs) = default; base (const base<S,T,KLASS,tags...> &rhs) = default;
base& operator= (const base<S,T,tags...> &rhs) = default; base& operator= (const base<S,T,KLASS,tags...> &rhs) = default;
// element accessors // element accessors
T& operator[] (size_t i) { return this->data[i]; } T& operator[] (size_t i) { return this->data[i]; }
@ -57,6 +57,7 @@ namespace util { namespace coord {
T* begin (void) { return std::begin (this->data); } T* begin (void) { return std::begin (this->data); }
T* end (void) { return std::end (this->data); } T* end (void) { return std::end (this->data); }
///////////////////////////////////////////////////////////////////////
// conversions // conversions
template <template <size_t, typename> class K> template <template <size_t, typename> class K>
K<S,T> as (void) const K<S,T> as (void) const

View File

@ -30,9 +30,9 @@ namespace util {
* A pure two-dimensional size, without positioning * A pure two-dimensional size, without positioning
*/ */
template <size_t S, typename T> template <size_t S, typename T>
struct extent : public coord::base<S,T,coord::whd> struct extent : public coord::base<S,T,extent,coord::whd>
{ {
using coord::base<S,T,coord::whd>::base; using coord::base<S,T,util::extent,coord::whd>::base;
extent () = default; extent () = default;
extent (vector<S,T>); extent (vector<S,T>);

View File

@ -32,9 +32,9 @@
namespace util { namespace util {
/// An n-dimensional position in space. /// An n-dimensional position in space.
template <size_t S, typename T> template <size_t S, typename T>
struct point : public coord::base<S,T,coord::xyzw> struct point : public coord::base<S,T,point,coord::xyzw>
{ {
using coord::base<S,T,coord::xyzw>::base; using coord::base<S,T,util::point,coord::xyzw>::base;
// point operators // point operators
template <typename U> typename std::common_type<T,U>::type distance (const point<S,U> &) const; template <typename U> typename std::common_type<T,U>::type distance (const point<S,U> &) const;

View File

@ -29,8 +29,9 @@
namespace util { namespace util {
template <size_t S, typename T> template <size_t S, typename T>
struct vector : public coord::base<S,T,coord::xyzw,coord::stpq> { struct vector : public coord::base<S,T,vector,coord::xyzw,coord::stpq>
using coord::base<S,T,coord::xyzw,coord::stpq>::base; {
using coord::base<S,T,util::vector,coord::xyzw,coord::stpq>::base;
bool is_zero (void) const; bool is_zero (void) const;