syslib_proto.hpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 class syslib
00022 {
00023 public:
00024
00025 template<typename eT>
00026 arma_hot
00027 inline
00028 static
00029 void
00030 copy_elem(eT* dest, const eT* src, const u32 n_elem)
00031 {
00032 #if !defined(__OPTIMIZE__)
00033 {
00034 std::memcpy(dest, src, n_elem*sizeof(eT));
00035 }
00036 #else
00037 {
00038 switch(n_elem)
00039 {
00040 case 0:
00041 break;
00042
00043 case 1:
00044 *dest = *src;
00045 break;
00046
00047 case 2:
00048 dest[0] = src[0];
00049 dest[1] = src[1];
00050 break;
00051
00052 case 3:
00053 dest[0] = src[0];
00054 dest[1] = src[1];
00055 dest[2] = src[2];
00056 break;
00057
00058 case 4:
00059 dest[0] = src[0];
00060 dest[1] = src[1];
00061 dest[2] = src[2];
00062 dest[3] = src[3];
00063 break;
00064
00065 default:
00066 if( n_elem <= (128/sizeof(eT)) )
00067 {
00068 u32 i,j;
00069
00070 for(i=0, j=1; j<n_elem; i+=2, j+=2)
00071 {
00072 dest[i] = src[i];
00073 dest[j] = src[j];
00074 }
00075
00076 if(i < n_elem)
00077 {
00078 dest[i] = src[i];
00079 }
00080 }
00081 else
00082 {
00083 std::memcpy(dest, src, n_elem*sizeof(eT));
00084 }
00085 }
00086 }
00087 #endif
00088 }
00089
00090
00091
00092 template<typename out_eT, typename in_eT>
00093 arma_hot
00094 inline
00095 static
00096 void
00097 copy_and_convert_elem(out_eT* dest, const in_eT* src, const u32 n_elem)
00098 {
00099 u32 i,j;
00100
00101 for(i=0, j=1; j<n_elem; i+=2, j+=2)
00102 {
00103 dest[i] = out_eT( src[i] );
00104 dest[j] = out_eT( src[j] );
00105 }
00106
00107 if(i < n_elem)
00108 {
00109 dest[i] = out_eT( src[i] );
00110 }
00111 }
00112
00113
00114
00115
00116
00117
00118
00119 template<typename out_eT, typename in_eT>
00120 arma_hot
00121 arma_inline
00122 static
00123 void
00124 convert_cx_scalar(out_eT& out, const in_eT& in)
00125 {
00126 out = out_eT(in);
00127 }
00128
00129
00130
00131 template<typename out_eT, typename in_T>
00132 arma_hot
00133 arma_inline
00134 static
00135 void
00136 convert_cx_scalar(out_eT& out, const std::complex<in_T>& in)
00137 {
00138 out = out_eT( in.real() );
00139 }
00140
00141
00142
00143 template<typename out_T, typename in_T>
00144 arma_hot
00145 arma_inline
00146 static
00147 void
00148 convert_cx_scalar(std::complex<out_T>& out, const std::complex<in_T>& in)
00149 {
00150 typedef std::complex<out_T> out_eT;
00151
00152 out = out_eT(in);
00153 }
00154
00155
00156
00157 template<typename out_eT, typename in_eT>
00158 arma_hot
00159 inline
00160 static
00161 void
00162 copy_and_convert_cx_elem(out_eT* dest, const in_eT* src, const u32 n_elem)
00163 {
00164 u32 i,j;
00165
00166 for(i=0, j=1; j<n_elem; i+=2, j+=2)
00167 {
00168 convert_cx_scalar( dest[i], src[i] );
00169 convert_cx_scalar( dest[j], src[j] );
00170 }
00171
00172 if(i < n_elem)
00173 {
00174 convert_cx_scalar( dest[i], src[i] );
00175 }
00176 }
00177
00178
00179
00180 };
00181
00182
00183
00184