diff --git a/lib/tensors/Tensor_index.h b/lib/tensors/Tensor_index.h index 7f34f3ac..f114baf8 100644 --- a/lib/tensors/Tensor_index.h +++ b/lib/tensors/Tensor_index.h @@ -47,6 +47,28 @@ template class TensorIndexRecursion { public: + + //////////////////////////////////////////////////// + // Type Queries + //////////////////////////////////////////////////// + template static inline int indexRank(const iScalar tmp) { return TensorIndexRecursion::indexRank(tmp._internal); } + template static inline int indexRank(const iVector tmp){ return TensorIndexRecursion::indexRank(tmp._internal[0]); } + template static inline int indexRank(const iMatrix tmp){ return TensorIndexRecursion::indexRank(tmp._internal[0][0]); } + + template static inline int isScalar(const iScalar tmp) { return TensorIndexRecursion::isScalar(tmp._internal); } + template static inline int isScalar(const iVector tmp){ return TensorIndexRecursion::isScalar(tmp._internal[0]); } + template static inline int isScalar(const iMatrix tmp){ return TensorIndexRecursion::isScalar(tmp._internal[0][0]); } + + template static inline int isVector(const iScalar tmp) { return TensorIndexRecursion::isVector(tmp._internal); } + template static inline int isVector(const iVector tmp){ return TensorIndexRecursion::isVector(tmp._internal[0]); } + template static inline int isVector(const iMatrix tmp){ return TensorIndexRecursion::isVector(tmp._internal[0][0]); } + + template static inline int isMatrix(const iScalar tmp) { return TensorIndexRecursion::isMatrix(tmp._internal); } + template static inline int isMatrix(const iVector tmp){ return TensorIndexRecursion::isMatrix(tmp._internal[0]); } + template static inline int isMatrix(const iMatrix tmp){ return TensorIndexRecursion::isMatrix(tmp._internal[0][0]); } + //////////////////////////////////////////////////// + // Trace + //////////////////////////////////////////////////// template static auto traceIndex(const iScalar arg) -> iScalar::traceIndex(arg._internal))> { @@ -215,6 +237,24 @@ class TensorIndexRecursion { template<> class TensorIndexRecursion<0> { public: + //////////////////////////////////////////////////// + // Type Queries + //////////////////////////////////////////////////// + template static inline int indexRank(const iScalar tmp) { return 1; } + template static inline int indexRank(const iVector tmp){ return N; } + template static inline int indexRank(const iMatrix tmp){ return N; } + + template static inline int isScalar(const iScalar tmp) { return true;} + template static inline int isScalar(const iVector tmp){ return false;} + template static inline int isScalar(const iMatrix tmp){ return false;} + + template static inline int isVector(const iScalar tmp) { return false;} + template static inline int isVector(const iVector tmp){ return true;} + template static inline int isVector(const iMatrix tmp){ return false;} + + template static inline int isMatrix(const iScalar tmp) { return false;} + template static inline int isMatrix(const iVector tmp){ return false;} + template static inline int isMatrix(const iMatrix tmp){ return true;} ///////////////////////////////////////// // Ends recursion for trace (scalar/vector/matrix) @@ -302,6 +342,26 @@ class TensorIndexRecursion<0> { //////////////////////////////////////////////////////////////////////////////////////////////////////// // External wrappers //////////////////////////////////////////////////////////////////////////////////////////////////////// +template inline int indexRank(void) +{ + vtype tmp; + return TensorIndexRecursion::indexRank(tmp); +} +template inline int isScalar(void) +{ + vtype tmp; + return TensorIndexRecursion::isScalar(tmp); +} +template inline int isVector(void) +{ + vtype tmp; + return TensorIndexRecursion::isVector(tmp); +} +template inline int isMatrix(void) +{ + vtype tmp; + return TensorIndexRecursion::isMatrix(tmp); +} template inline auto traceIndex (const vtype &arg) -> RemoveCRV(TensorIndexRecursion::traceIndex(arg)) {