]> Dogcows Code - chaz/yoink/blobdiff - src/cml/matvec/matvec_promotions.h
now using cml for vectors and math stuff
[chaz/yoink] / src / cml / matvec / matvec_promotions.h
diff --git a/src/cml/matvec/matvec_promotions.h b/src/cml/matvec/matvec_promotions.h
new file mode 100644 (file)
index 0000000..3b85d1f
--- /dev/null
@@ -0,0 +1,92 @@
+/* -*- C++ -*- ------------------------------------------------------------
+Copyright (c) 2007 Jesse Anders and Demian Nave http://cmldev.net/
+
+The Configurable Math Library (CML) is distributed under the terms of the
+Boost Software License, v1.0 (see cml/LICENSE for details).
+
+ *-----------------------------------------------------------------------*/
+/** @file
+ *  @brief
+ *
+ * Defines promotions for the vectors resulting from matrix/vector or
+ * vector/matrix ops.
+ *
+ * @sa matvec_ops::mvmul
+ */
+
+#ifndef matvec_promotions_h
+#define matvec_promotions_h
+
+#include <cml/et/scalar_promotions.h>
+#include <cml/vector/vector_promotions.h>
+
+namespace cml {
+namespace et {
+
+/* Default mat/vec type promotion template. */
+template<typename LeftT, typename RightT> struct MatVecPromote;
+
+/** Type promotion for a matrix and a vector. */
+template<
+    typename E1, class AT1, typename BO, typename L,
+    typename E2, class AT2>
+struct MatVecPromote< cml::matrix<E1,AT1,BO,L>, cml::vector<E2,AT2> >
+{
+    typedef cml::matrix<E1,AT1,BO,L> matrix_type;
+    typedef cml::vector<E2,AT2> vector_type;
+
+    /* Promote the arrays: */
+    typedef typename ArrayPromote<
+        typename matrix_type::array_type,
+        typename vector_type::array_type
+    >::type promoted_array;
+
+    /* The deduced vector result type: */
+    typedef cml::vector<
+        typename promoted_array::value_type,
+        typename promoted_array::generator_type
+    > type;
+
+    /* The deduced temporary type: */
+    typedef typename type::temporary_type temporary_type;
+    /* Note: this is to avoid an "incomplete type" error from ICC9, which
+     * can't handle e.g. <X>::<Y>::<Z> when <X> is a template type.
+     */
+};
+
+/** Type promotion for a vector and a matrix. */
+template<
+    typename E1, class AT1,
+    typename E2, class AT2, typename BO, typename L>
+struct MatVecPromote< cml::vector<E1,AT1>, cml::matrix<E2,AT2,BO,L> >
+{
+    typedef cml::vector<E1,AT1> vector_type;
+    typedef cml::matrix<E2,AT2,BO,L> matrix_type;
+
+    /* Promote the arrays: */
+    typedef typename ArrayPromote<
+        typename vector_type::array_type,
+        typename matrix_type::array_type
+    >::type promoted_array;
+
+    /* The deduced vector result type: */
+    typedef cml::vector<
+        typename promoted_array::value_type,
+        typename promoted_array::generator_type
+    > type;
+
+    /* The deduced temporary type: */
+    typedef typename type::temporary_type temporary_type;
+    /* Note: this is to avoid an "incomplete type" error from ICC9, which
+     * can't handle e.g. <X>::<Y>::<Z> when <X> is a template type.
+     */
+};
+
+} // namespace et
+} // namespace cml
+
+#endif
+
+// -------------------------------------------------------------------------
+// vim:ft=cpp
This page took 0.022571 seconds and 4 git commands to generate.