00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef MTL_MULT_ASSIGN_MODE_INCLUDE
00013 #define MTL_MULT_ASSIGN_MODE_INCLUDE
00014
00015 #include <boost/numeric/mtl/operation/assign_mode.hpp>
00016 #include <boost/numeric/mtl/operation/dmat_dmat_mult.hpp>
00017 #include <boost/numeric/mtl/operation/no_op.hpp>
00018
00019 namespace mtl { namespace assign {
00020
00021 namespace detail {
00022
00023 template <typename Assign>
00024 struct subm_assign
00025 {
00026 typedef Assign type;
00027 };
00028
00029 template<>
00030 struct subm_assign<assign_sum>
00031 {
00032 typedef plus_sum type;
00033 };
00034
00035 }
00036
00037
00038
00039 template <typename Mult, typename Assign>
00040 struct mult_assign_mode
00041 {};
00042
00043
00044 #if 0
00045
00046 template <typename MatrixA, typename MatrixB, typename MatrixC, typename OldAssign, typename Backup,
00047 typename Assign>
00048 struct mult_assign_mode<gen_dmat_dmat_mult_ft<MatrixA, MatrixB, MatrixC, OldAssign, Backup>,
00049 Assign>
00050 {
00051 typedef gen_dmat_dmat_mult_ft<MatrixA, MatrixB, MatrixC, Assign, Backup> type;
00052 };
00053 #endif
00054
00055
00056 template <typename Assign>
00057 struct mult_assign_mode<no_op, Assign>
00058 {
00059 typedef no_op type;
00060 };
00061
00062 template <typename OldAssign, typename Backup, typename Assign>
00063 struct mult_assign_mode<gen_dmat_dmat_mult_t<OldAssign, Backup>, Assign>
00064 {
00065 typedef typename mult_assign_mode<Backup, Assign>::type backup_type;
00066 typedef gen_dmat_dmat_mult_t<Assign, backup_type> type;
00067 };
00068
00069 template <typename OldAssign, typename Backup, typename Assign>
00070 struct mult_assign_mode<gen_cursor_dmat_dmat_mult_t<OldAssign, Backup>, Assign>
00071 {
00072 typedef typename mult_assign_mode<Backup, Assign>::type backup_type;
00073 typedef gen_cursor_dmat_dmat_mult_t<Assign, backup_type> type;
00074 };
00075
00076 template <unsigned long Tiling1, unsigned long Tiling2, typename OldAssign, typename Backup, typename Assign>
00077 struct mult_assign_mode<gen_tiling_dmat_dmat_mult_t<Tiling1, Tiling2, OldAssign, Backup>, Assign>
00078 {
00079 typedef typename mult_assign_mode<Backup, Assign>::type backup_type;
00080 typedef gen_tiling_dmat_dmat_mult_t<Tiling1, Tiling2, Assign, backup_type> type;
00081 };
00082
00083 template <typename OldAssign, typename Backup, typename Assign>
00084 struct mult_assign_mode<gen_tiling_44_dmat_dmat_mult_t<OldAssign, Backup>, Assign>
00085 {
00086 typedef typename mult_assign_mode<Backup, Assign>::type backup_type;
00087 typedef gen_tiling_44_dmat_dmat_mult_t<Assign, backup_type> type;
00088 };
00089
00090 template <typename OldAssign, typename Backup, typename Assign>
00091 struct mult_assign_mode<gen_tiling_22_dmat_dmat_mult_t<OldAssign, Backup>, Assign>
00092 {
00093 typedef typename mult_assign_mode<Backup, Assign>::type backup_type;
00094 typedef gen_tiling_22_dmat_dmat_mult_t<Assign, backup_type> type;
00095 };
00096
00097 template <typename BaseMult, typename BaseTest, typename OldAssign, typename Backup, typename Assign>
00098 struct mult_assign_mode<gen_recursive_dmat_dmat_mult_t<BaseMult, BaseTest, OldAssign, Backup>, Assign>
00099 {
00100 typedef typename mult_assign_mode<Backup, Assign>::type backup_type;
00101
00102
00103 typedef typename detail::subm_assign<Assign>::type base_assign_type;
00104 typedef typename mult_assign_mode<BaseMult, base_assign_type>::type base_mult_type;
00105
00106 typedef gen_recursive_dmat_dmat_mult_t<base_mult_type, BaseTest, Assign, backup_type> type;
00107 };
00108
00109 template <typename OldAssign, typename Backup, typename Assign>
00110 struct mult_assign_mode<gen_platform_dmat_dmat_mult_t<OldAssign, Backup>, Assign>
00111 {
00112 typedef typename mult_assign_mode<Backup, Assign>::type backup_type;
00113 typedef gen_platform_dmat_dmat_mult_t<Assign, backup_type> type;
00114 };
00115
00116 template <typename OldAssign, typename Backup, typename Assign>
00117 struct mult_assign_mode<gen_blas_dmat_dmat_mult_t<OldAssign, Backup>, Assign>
00118 {
00119 typedef typename mult_assign_mode<Backup, Assign>::type backup_type;
00120 typedef gen_blas_dmat_dmat_mult_t<Assign, backup_type> type;
00121 };
00122
00123 template <std::size_t SizeLimit, typename FunctorSmall, typename FunctorLarge, typename Assign>
00124 struct mult_assign_mode<size_switch_dmat_dmat_mult_t<SizeLimit, FunctorSmall, FunctorLarge>, Assign>
00125 {
00126 typedef typename mult_assign_mode<FunctorSmall, Assign>::type small_type;
00127 typedef typename mult_assign_mode<FunctorLarge, Assign>::type large_type;
00128 typedef size_switch_dmat_dmat_mult_t<SizeLimit, small_type, large_type> type;
00129 };
00130
00131 template <bool IsStatic, typename FunctorStatic, typename FunctorDynamic, typename Assign>
00132 struct mult_assign_mode<static_switch_dmat_dmat_mult_t<IsStatic, FunctorStatic, FunctorDynamic>, Assign>
00133 {
00134 typedef typename mult_assign_mode<FunctorStatic, Assign>::type static_type;
00135 typedef typename mult_assign_mode<FunctorDynamic, Assign>::type dynamic_type;
00136 typedef static_switch_dmat_dmat_mult_t<IsStatic, static_type, dynamic_type> type;
00137 };
00138
00139 template <typename OldAssign, typename Backup, typename Assign>
00140 struct mult_assign_mode<fully_unroll_fixes_size_dmat_dmat_mult_t<OldAssign, Backup>, Assign>
00141 {
00142 typedef fully_unroll_fixes_size_dmat_dmat_mult_t<Assign, Backup> type;
00143 };
00144
00145 }}
00146
00147 #endif // MTL_MULT_ASSIGN_MODE_INCLUDE