00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef MTL_BASE_CASE_MATRIX_INCLUDE
00013 #define MTL_BASE_CASE_MATRIX_INCLUDE
00014
00015 #include <boost/static_assert.hpp>
00016
00017 #include <boost/numeric/meta_math/is_power_of_2.hpp>
00018 #include <boost/numeric/meta_math/log_2.hpp>
00019 #include <boost/numeric/mtl/recursion/base_case_test.hpp>
00020 #include <boost/numeric/mtl/recursion/bit_masking.hpp>
00021
00022 namespace mtl { namespace recursion {
00023
00024 template <typename Matrix, typename BaseCaseTest>
00025 struct base_case_matrix
00026 {
00027 typedef Matrix type;
00028 };
00029
00030 template <typename Elt, unsigned long Mask, typename Parameters, typename BaseCaseTest>
00031 struct base_case_matrix<morton_dense<Elt, Mask, Parameters>, BaseCaseTest>
00032 {
00033 BOOST_STATIC_ASSERT(meta_math::is_power_of_2<BaseCaseTest::base_case_size>::value);
00034 static const unsigned long base_case_bits= meta_math::log_2<BaseCaseTest::base_case_size>::value;
00035
00036 typedef typename boost::mpl::if_<
00037 is_k_power_base_case_row_major<base_case_bits, Mask>
00038 , dense2D<Elt, matrix::parameters<row_major> >
00039 , typename boost::mpl::if_<
00040 is_k_power_base_case_col_major<base_case_bits, Mask>
00041 , dense2D<Elt, matrix::parameters<col_major> >
00042 , morton_dense<Elt, Mask, Parameters>
00043 >::type
00044 >::type type;
00045 };
00046
00047
00048 }}
00049
00050 #endif // MTL_BASE_CASE_MATRIX_INCLUDE