00001 #if !defined(__MIMASINTERNALARRAYFUNC) 00002 # error "Do not include this file directly." 00003 #endif 00004 #if !defined(__MIMASEXTERNALARRAYFUNC) 00005 # error "Do not include this file directly." 00006 #endif 00007 #if !defined(__MIMASFUNCTIONOBJECT) 00008 # error "Do not include this file directly." 00009 #endif 00010 00011 namespace mimas { 00012 00015 00016 template < 00017 template< typename, size_t > class MultiArray1, 00018 template< typename, size_t > class MultiArray2, 00019 typename T, size_t NumDims 00020 > 00021 boost::multi_array< T, NumDims > __MIMASEXTERNALARRAYFUNC 00022 ( const MultiArray1< T, NumDims > &a, 00023 const MultiArray2< T, NumDims > &b ) 00024 { 00025 return multi_func< T >( a, b, __MIMASFUNCTIONOBJECT< T >() ); 00026 }; 00027 00029 template < 00030 template< typename, size_t > class MultiArray, 00031 typename T, size_t NumDims 00032 > 00033 boost::multi_array< T, NumDims > __MIMASEXTERNALARRAYFUNC 00034 ( const MultiArray< T, NumDims > &a, 00035 const T &b ) 00036 { 00037 return multi_func< T >( a, std::bind2nd( __MIMASFUNCTIONOBJECT< T >(), b ) ); 00038 }; 00039 00041 template < 00042 template< typename, size_t > class MultiArray, 00043 typename T, size_t NumDims 00044 > 00045 boost::multi_array< T, NumDims > __MIMASEXTERNALARRAYFUNC 00046 ( const T &a, 00047 const MultiArray< T, NumDims > &b ) 00048 { 00049 return multi_func< T >( b, std::bind1st( __MIMASFUNCTIONOBJECT< T >(), a ) ); 00050 }; 00051 00053 template < 00054 template< typename, size_t > class MultiArray2, 00055 typename T, size_t NumDims 00056 > 00057 boost::detail::multi_array::sub_array< T, NumDims > __MIMASINTERNALARRAYFUNC 00058 ( boost::detail::multi_array::sub_array< T, NumDims > a, 00059 const MultiArray2< T, NumDims > &b ) 00060 { 00061 return multi_apply( a, a, b, 00062 _multi_help2< T, T, T, __MIMASFUNCTIONOBJECT< T > > 00063 ( __MIMASFUNCTIONOBJECT< T >() ) ); 00064 }; 00065 00067 template < 00068 template< typename, size_t > class MultiArray1, 00069 template< typename, size_t > class MultiArray2, 00070 typename T, size_t NumDims 00071 > 00072 MultiArray1< T, NumDims > &__MIMASINTERNALARRAYFUNC 00073 ( MultiArray1< T, NumDims > &a, 00074 const MultiArray2< T, NumDims > &b ) 00075 { 00076 return multi_apply( a, a, b, 00077 _multi_help2< T, T, T, __MIMASFUNCTIONOBJECT< T > > 00078 ( __MIMASFUNCTIONOBJECT< T >() ) ); 00079 }; 00080 00082 template < 00083 typename T, size_t NumDims 00084 > 00085 boost::detail::multi_array::sub_array< T, NumDims > __MIMASINTERNALARRAYFUNC 00086 ( boost::detail::multi_array::sub_array< T, NumDims > a, 00087 const T &b ) 00088 { 00089 return multi_apply( a, a, 00090 _multi_help1< T, T, 00091 std::binder2nd< __MIMASFUNCTIONOBJECT< T > > > 00092 ( std::bind2nd( __MIMASFUNCTIONOBJECT< T >(), b ) ) ); 00093 }; 00094 00096 template < 00097 template< typename, size_t > class MultiArray, 00098 typename T, size_t NumDims 00099 > 00100 MultiArray< T, NumDims > &__MIMASINTERNALARRAYFUNC 00101 ( MultiArray< T, NumDims > &a, 00102 const T &b ) 00103 { 00104 return multi_apply( a, a, 00105 _multi_help1< T, T, 00106 std::binder2nd< __MIMASFUNCTIONOBJECT< T > > > 00107 ( std::bind2nd( __MIMASFUNCTIONOBJECT< T >(), b ) ) ); 00108 }; 00110 00111 } 00112 00113 #undef __MIMASINTERNALARRAYFUNC 00114 #undef __MIMASEXTERNALARRAYFUNC 00115 #undef __MIMASFUNCTIONOBJECT