#ifndef __BLOP_TYPE_TRAITS_H__ #define __BLOP_TYPE_TRAITS_H__ #include "array.h" #include "geometry.h" #include <valarray> #include <vector> #ifndef __MAKECINT__ namespace blop { template <typename T> inline int numeric_components(const T&) { return 1; } template <> inline int numeric_components(const blop::geom::vec3 &) { return 3; } template <typename T> inline int numeric_components(const std::vector<T> &v) { return v.size(); } template <typename T> inline int numeric_components(const std::valarray<T> &v) { return v.size(); } template <typename T> inline int numeric_components(const blop::matrix<T> &m) { return m.cols()*m.rows(); } template <typename T> inline int flatten_to_vector_var(const T &value, std::vector<blop::var> &a, int ind) { a[ind] = value; return 1; } template <typename T> inline int flatten_to_vector_dbl(const T &value, std::vector<blop::var> &a, int ind) { a[ind].dbl(value); return 1; } template <> inline int flatten_to_vector_var(const blop::geom::vec3 &value, std::vector<blop::var> &a, int ind) { a[ind++] = value.x; a[ind++] = value.y; a[ind++] = value.z; return 3; } template <> inline int flatten_to_vector_dbl(const blop::geom::vec3 &value, std::vector<blop::var> &a, int ind) { a[ind++].dbl(value.x); a[ind++].dbl(value.y); a[ind++].dbl(value.z); return 3; } template <typename T> inline int flatten_to_vector_var(const std::vector<T> &value, std::vector<blop::var> &a, int ind) { for(unsigned int i=0; i<value.size(); ++i) a[ind++] = value[i]; return value.size(); } template <typename T> inline int flatten_to_vector_dbl(const std::vector<T> &value, std::vector<blop::var> &a, int ind) { for(unsigned int i=0; i<value.size(); ++i) a[ind++].dbl(value[i]); return value.size(); } template <typename T> inline int flatten_to_vector_var(const std::valarray<T> &value, std::vector<blop::var> &a, int ind) { for(unsigned int i=0; i<value.size(); ++i) a[ind++] = value[i]; return value.size(); } template <typename T> inline int flatten_to_vector_dbl(const std::valarray<T> &value, std::vector<blop::var> &a, int ind) { for(unsigned int i=0; i<value.size(); ++i) a[ind++].dbl(value[i]); return value.size(); } template <typename T> inline int flatten_to_vector_var(const blop::matrix<T> &value, std::vector<blop::var> &a, int ind) { for(int row=value.row_base(); row<value.row_base()+value.rows(); ++row) { for(int col=value.col_base(); col<value.col_base()+value.cols(); ++col) { a[ind++] = value(row,col); } } return value.cols()*value.rows(); } template <typename T> inline int flatten_to_vector_dbl(const blop::matrix<T> &value, std::vector<blop::var> &a, int ind) { for(int row=value.row_base(); row<value.row_base()+value.rows(); ++row) { for(int col=value.col_base(); col<value.col_base()+value.cols(); ++col) { a[ind++].dbl(value(row,col)); } } return value.cols()*value.rows(); } } #endif #endif