coord/ops: use full types for is_coord
rather than passing the template class we pass the fully specified template; ie point<3,float> rather than point. this makes it dramatically easier to use is_coord in foreign code at the cost of making the library code slightly more verbose. we no longer have to obtain a typedef for the root coord class somehow.
This commit is contained in:
parent
ede9b75bad
commit
ff86357b83
102
coord/ops.hpp
102
coord/ops.hpp
@ -77,15 +77,15 @@ namespace util {
|
|||||||
constexpr auto has_scalar_op_v = has_scalar_op<K>::value;
|
constexpr auto has_scalar_op_v = has_scalar_op<K>::value;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <template <size_t,typename> class> struct is_coord : std::false_type { };
|
template <class> struct is_coord : std::false_type { };
|
||||||
|
|
||||||
template <> struct is_coord<point> : std::true_type { };
|
template <size_t S, typename T> struct is_coord<point<S,T>> : std::true_type { };
|
||||||
template <> struct is_coord<extent> : std::true_type { };
|
template <size_t S, typename T> struct is_coord<extent<S,T>> : std::true_type { };
|
||||||
template <> struct is_coord<vector> : std::true_type { };
|
template <size_t S, typename T> struct is_coord<vector<S,T>> : std::true_type { };
|
||||||
template <> struct is_coord<colour> : std::true_type { };
|
template <size_t S, typename T> struct is_coord<colour<S,T>> : std::true_type { };
|
||||||
template <> struct is_coord<quaternion> : std::true_type { };
|
template <size_t S, typename T> struct is_coord<quaternion<S,T>> : std::true_type { };
|
||||||
|
|
||||||
template <template <size_t,typename> class K>
|
template <class K>
|
||||||
constexpr bool
|
constexpr bool
|
||||||
is_coord_v = is_coord<K>::value;
|
is_coord_v = is_coord<K>::value;
|
||||||
|
|
||||||
@ -99,7 +99,7 @@ namespace util {
|
|||||||
template <size_t,typename> class A, \
|
template <size_t,typename> class A, \
|
||||||
template <size_t,typename> class B, \
|
template <size_t,typename> class B, \
|
||||||
typename = std::enable_if_t< \
|
typename = std::enable_if_t< \
|
||||||
is_coord_v<A> && is_coord_v<B>, \
|
is_coord_v<A<S,T>> && is_coord_v<B<S,U>>, \
|
||||||
void \
|
void \
|
||||||
> \
|
> \
|
||||||
> \
|
> \
|
||||||
@ -122,8 +122,8 @@ namespace util {
|
|||||||
template <size_t,typename> class A, \
|
template <size_t,typename> class A, \
|
||||||
template <size_t,typename> class B, \
|
template <size_t,typename> class B, \
|
||||||
typename = std::enable_if_t< \
|
typename = std::enable_if_t< \
|
||||||
is_coord_v<A> && \
|
is_coord_v<A<S,T>> && \
|
||||||
is_coord_v<B> && \
|
is_coord_v<B<S,U>> && \
|
||||||
std::is_same< \
|
std::is_same< \
|
||||||
std::common_type_t<T,U>, T \
|
std::common_type_t<T,U>, T \
|
||||||
>::value, \
|
>::value, \
|
||||||
@ -209,7 +209,7 @@ namespace util {
|
|||||||
typename U, \
|
typename U, \
|
||||||
template <size_t,typename> class K, \
|
template <size_t,typename> class K, \
|
||||||
typename = std::enable_if_t< \
|
typename = std::enable_if_t< \
|
||||||
is_coord<K>::value && \
|
is_coord<K<S,T>>::value && \
|
||||||
std::is_arithmetic<T>::value && \
|
std::is_arithmetic<T>::value && \
|
||||||
std::is_arithmetic<U>::value, \
|
std::is_arithmetic<U>::value, \
|
||||||
void \
|
void \
|
||||||
@ -247,7 +247,7 @@ namespace util {
|
|||||||
typename T, \
|
typename T, \
|
||||||
template <size_t,typename> class K, \
|
template <size_t,typename> class K, \
|
||||||
typename = std::enable_if_t< \
|
typename = std::enable_if_t< \
|
||||||
is_coord_v<K>, void \
|
is_coord_v<K<S,T>>, void \
|
||||||
> \
|
> \
|
||||||
> \
|
> \
|
||||||
constexpr \
|
constexpr \
|
||||||
@ -279,7 +279,7 @@ namespace util {
|
|||||||
typename T,
|
typename T,
|
||||||
template <size_t,typename> class K,
|
template <size_t,typename> class K,
|
||||||
typename = std::enable_if_t<
|
typename = std::enable_if_t<
|
||||||
is_coord_v<K>, void
|
is_coord_v<K<S,T>>, void
|
||||||
>
|
>
|
||||||
>
|
>
|
||||||
constexpr
|
constexpr
|
||||||
@ -301,7 +301,7 @@ namespace util {
|
|||||||
typename T,
|
typename T,
|
||||||
template <size_t,typename> class K,
|
template <size_t,typename> class K,
|
||||||
typename = std::enable_if_t<
|
typename = std::enable_if_t<
|
||||||
is_coord_v<K>, void
|
is_coord_v<K<S,T>>, void
|
||||||
>
|
>
|
||||||
>
|
>
|
||||||
constexpr
|
constexpr
|
||||||
@ -318,7 +318,7 @@ namespace util {
|
|||||||
typename T,
|
typename T,
|
||||||
template <size_t,typename> class K,
|
template <size_t,typename> class K,
|
||||||
typename = std::enable_if_t<
|
typename = std::enable_if_t<
|
||||||
is_coord_v<K>, void
|
is_coord_v<K<S,T>>, void
|
||||||
>
|
>
|
||||||
>
|
>
|
||||||
constexpr
|
constexpr
|
||||||
@ -394,7 +394,7 @@ namespace util {
|
|||||||
template <size_t,typename> class A,
|
template <size_t,typename> class A,
|
||||||
template <size_t,typename> class B,
|
template <size_t,typename> class B,
|
||||||
typename = std::enable_if_t<
|
typename = std::enable_if_t<
|
||||||
is_coord_v<A> && is_coord_v<B>, void
|
is_coord_v<A<S,T>> && is_coord_v<B<S,T>>, void
|
||||||
>
|
>
|
||||||
>
|
>
|
||||||
constexpr
|
constexpr
|
||||||
@ -411,7 +411,7 @@ namespace util {
|
|||||||
typename T,
|
typename T,
|
||||||
template <size_t,typename> class K,
|
template <size_t,typename> class K,
|
||||||
typename = std::enable_if_t<
|
typename = std::enable_if_t<
|
||||||
is_coord_v<K>, void
|
is_coord_v<K<S,T>>, void
|
||||||
>
|
>
|
||||||
>
|
>
|
||||||
constexpr
|
constexpr
|
||||||
@ -428,7 +428,7 @@ namespace util {
|
|||||||
typename T,
|
typename T,
|
||||||
template <size_t,typename> class K,
|
template <size_t,typename> class K,
|
||||||
typename = std::enable_if_t<
|
typename = std::enable_if_t<
|
||||||
is_coord_v<K>, void
|
is_coord_v<K<S,T>>, void
|
||||||
>
|
>
|
||||||
>
|
>
|
||||||
constexpr
|
constexpr
|
||||||
@ -517,7 +517,7 @@ namespace util {
|
|||||||
typename T,
|
typename T,
|
||||||
template <size_t,typename> class K,
|
template <size_t,typename> class K,
|
||||||
typename = std::enable_if_t<
|
typename = std::enable_if_t<
|
||||||
is_coord_v<K>, void
|
is_coord_v<K<S,T>>, void
|
||||||
>
|
>
|
||||||
>
|
>
|
||||||
constexpr
|
constexpr
|
||||||
@ -535,7 +535,7 @@ namespace util {
|
|||||||
typename T,
|
typename T,
|
||||||
template <size_t,typename> class K,
|
template <size_t,typename> class K,
|
||||||
typename = std::enable_if_t<
|
typename = std::enable_if_t<
|
||||||
is_coord_v<K>, void
|
is_coord_v<K<S,T>>, void
|
||||||
>
|
>
|
||||||
>
|
>
|
||||||
constexpr
|
constexpr
|
||||||
@ -554,7 +554,7 @@ namespace util {
|
|||||||
typename T,
|
typename T,
|
||||||
template <size_t,typename> class K,
|
template <size_t,typename> class K,
|
||||||
typename = std::enable_if_t<
|
typename = std::enable_if_t<
|
||||||
is_coord_v<K>, void
|
is_coord_v<K<S,T>>, void
|
||||||
>
|
>
|
||||||
>
|
>
|
||||||
constexpr
|
constexpr
|
||||||
@ -576,7 +576,7 @@ namespace util {
|
|||||||
size_t S,
|
size_t S,
|
||||||
typename T,
|
typename T,
|
||||||
template <size_t,typename> class K,
|
template <size_t,typename> class K,
|
||||||
typename = std::enable_if_t<is_coord_v<K>,void>
|
typename = std::enable_if_t<is_coord_v<K<S,T>>,void>
|
||||||
>
|
>
|
||||||
constexpr
|
constexpr
|
||||||
K<S,T>
|
K<S,T>
|
||||||
@ -598,7 +598,7 @@ namespace util {
|
|||||||
size_t S,
|
size_t S,
|
||||||
typename T,
|
typename T,
|
||||||
template <size_t,typename> class K,
|
template <size_t,typename> class K,
|
||||||
typename = std::enable_if_t<is_coord_v<K>,void>
|
typename = std::enable_if_t<is_coord_v<K<S,T>>,void>
|
||||||
>
|
>
|
||||||
constexpr
|
constexpr
|
||||||
K<S,T>
|
K<S,T>
|
||||||
@ -624,7 +624,7 @@ namespace util {
|
|||||||
typename T,
|
typename T,
|
||||||
template <size_t,typename> class K,
|
template <size_t,typename> class K,
|
||||||
typename = std::enable_if_t<
|
typename = std::enable_if_t<
|
||||||
is_coord_v<K>, void
|
is_coord_v<K<S,T>>, void
|
||||||
>
|
>
|
||||||
>
|
>
|
||||||
constexpr
|
constexpr
|
||||||
@ -645,7 +645,7 @@ namespace util {
|
|||||||
typename T,
|
typename T,
|
||||||
template <size_t,typename> class K,
|
template <size_t,typename> class K,
|
||||||
typename = std::enable_if_t<
|
typename = std::enable_if_t<
|
||||||
is_coord_v<K>, void
|
is_coord_v<K<S,T>>, void
|
||||||
>
|
>
|
||||||
>
|
>
|
||||||
constexpr
|
constexpr
|
||||||
@ -665,7 +665,7 @@ namespace util {
|
|||||||
typename T,
|
typename T,
|
||||||
template<size_t,typename> class K,
|
template<size_t,typename> class K,
|
||||||
typename = std::enable_if_t<
|
typename = std::enable_if_t<
|
||||||
is_coord_v<K>, void
|
is_coord_v<K<S,T>>, void
|
||||||
>
|
>
|
||||||
>
|
>
|
||||||
constexpr
|
constexpr
|
||||||
@ -681,7 +681,7 @@ namespace util {
|
|||||||
typename T,
|
typename T,
|
||||||
template<size_t,typename> class K,
|
template<size_t,typename> class K,
|
||||||
typename = std::enable_if_t<
|
typename = std::enable_if_t<
|
||||||
is_coord_v<K>, void
|
is_coord_v<K<S,T>>, void
|
||||||
>
|
>
|
||||||
>
|
>
|
||||||
constexpr
|
constexpr
|
||||||
@ -698,7 +698,7 @@ namespace util {
|
|||||||
typename T,
|
typename T,
|
||||||
template <size_t,typename> class K,
|
template <size_t,typename> class K,
|
||||||
typename = std::enable_if_t<
|
typename = std::enable_if_t<
|
||||||
is_coord_v<K>, void
|
is_coord_v<K<S,T>>, void
|
||||||
>
|
>
|
||||||
>
|
>
|
||||||
constexpr
|
constexpr
|
||||||
@ -710,25 +710,25 @@ namespace util {
|
|||||||
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////
|
||||||
#define VECTOR_OP(OP) \
|
#define VECTOR_OP(OP) \
|
||||||
template < \
|
template < \
|
||||||
size_t S, \
|
size_t S, \
|
||||||
typename T, \
|
typename T, \
|
||||||
typename U, \
|
typename U, \
|
||||||
template <size_t,typename> class A, \
|
template <size_t,typename> class A, \
|
||||||
template <size_t,typename> class B, \
|
template <size_t,typename> class B, \
|
||||||
typename = std::enable_if_t< \
|
typename = std::enable_if_t< \
|
||||||
is_coord_v<A> && is_coord_v<B>, void \
|
is_coord_v<A<S,T>> && is_coord_v<B<S,U>>, void \
|
||||||
> \
|
> \
|
||||||
> \
|
> \
|
||||||
constexpr \
|
constexpr \
|
||||||
vector<S,bool> \
|
vector<S,bool> \
|
||||||
operator OP (const A<S,T> a, const B<S,U> b) \
|
operator OP (const A<S,T> a, const B<S,U> b) \
|
||||||
{ \
|
{ \
|
||||||
vector<S,bool> out {}; \
|
vector<S,bool> out {}; \
|
||||||
for (size_t i = 0; i < S; ++i) \
|
for (size_t i = 0; i < S; ++i) \
|
||||||
out[i] = a[i] OP b[i]; \
|
out[i] = a[i] OP b[i]; \
|
||||||
return out; \
|
return out; \
|
||||||
}
|
}
|
||||||
|
|
||||||
VECTOR_OP(<)
|
VECTOR_OP(<)
|
||||||
@ -746,7 +746,7 @@ namespace util {
|
|||||||
typename U, \
|
typename U, \
|
||||||
template <size_t,typename> class K, \
|
template <size_t,typename> class K, \
|
||||||
typename = std::enable_if_t< \
|
typename = std::enable_if_t< \
|
||||||
is_coord_v<K>, void \
|
is_coord_v<K<S,T>>, void \
|
||||||
> \
|
> \
|
||||||
> \
|
> \
|
||||||
constexpr \
|
constexpr \
|
||||||
@ -772,7 +772,7 @@ namespace util {
|
|||||||
size_t S,
|
size_t S,
|
||||||
template <size_t,typename> class K,
|
template <size_t,typename> class K,
|
||||||
typename = std::enable_if_t<
|
typename = std::enable_if_t<
|
||||||
is_coord_v<K>, void
|
is_coord_v<K<S,bool>>, void
|
||||||
>
|
>
|
||||||
>
|
>
|
||||||
constexpr
|
constexpr
|
||||||
@ -789,7 +789,7 @@ namespace util {
|
|||||||
size_t S,
|
size_t S,
|
||||||
template <size_t,typename> class K,
|
template <size_t,typename> class K,
|
||||||
typename = std::enable_if_t<
|
typename = std::enable_if_t<
|
||||||
is_coord_v<K>, void
|
is_coord_v<K<S,bool>>, void
|
||||||
>
|
>
|
||||||
>
|
>
|
||||||
constexpr
|
constexpr
|
||||||
@ -808,7 +808,7 @@ namespace util {
|
|||||||
typename T,
|
typename T,
|
||||||
template<size_t,typename> class K,
|
template<size_t,typename> class K,
|
||||||
typename = std::enable_if_t<
|
typename = std::enable_if_t<
|
||||||
is_coord_v<K> && std::is_floating_point<T>::value, void
|
is_coord_v<K<S,T>> && std::is_floating_point<T>::value, void
|
||||||
>
|
>
|
||||||
>
|
>
|
||||||
constexpr
|
constexpr
|
||||||
|
Loading…
Reference in New Issue
Block a user