00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00020 #ifndef SHLIBBOOLEANIMPL_HPP
00021 #define SHLIBBOOLEANIMPL_HPP
00022
00023 #include "ShLibBoolean.hpp"
00024 #include "ShInstructions.hpp"
00025 #include "ShAttrib.hpp"
00026
00027 namespace SH {
00028
00029 template<int N, typename T1, typename T2>
00030 ShGeneric<N, CT1T2> operator<(const ShGeneric<N, T1>& left, const ShGeneric<N, T2>& right)
00031 {
00032 ShAttrib<N, SH_TEMP, CT1T2> t;
00033 shSLT(t, left, right);
00034 return t;
00035 }
00036 template<int N, typename T1, typename T2>
00037 ShGeneric<N, CT1T2> operator<(const ShGeneric<N, T1>& left, const ShGeneric<1, T2>& right)
00038 {
00039 ShAttrib<N, SH_TEMP, CT1T2> t;
00040 shSLT(t, left, right);
00041 return t;
00042 }
00043 template<int N, typename T1, typename T2>
00044 ShGeneric<N, CT1T2> operator<(const ShGeneric<1, T1>& left, const ShGeneric<N, T2>& right)
00045 {
00046 ShAttrib<N, SH_TEMP, CT1T2> t;
00047 shSLT(t, left, right);
00048 return t;
00049 }
00050 template<typename T1, typename T2>
00051 ShGeneric<1, CT1T2> operator<(const ShGeneric<1, T1>& left, const ShGeneric<1, T2>& right)
00052 {
00053 ShAttrib<1, SH_TEMP, CT1T2> t;
00054 shSLT(t, left, right);
00055 return t;
00056 }
00057 SH_SHLIB_CONST_SCALAR_OP(operator<);
00058 SH_SHLIB_CONST_N_OP_BOTH(operator<);
00059
00060 template<int N, typename T1, typename T2>
00061 ShGeneric<N, CT1T2> operator<=(const ShGeneric<N, T1>& left, const ShGeneric<N, T2>& right)
00062 {
00063 ShAttrib<N, SH_TEMP, CT1T2> t;
00064 shSLE(t, left, right);
00065 return t;
00066 }
00067 template<int N, typename T1, typename T2>
00068 ShGeneric<N, CT1T2> operator<=(const ShGeneric<N, T1>& left, const ShGeneric<1, T2>& right)
00069 {
00070 ShAttrib<N, SH_TEMP, CT1T2> t;
00071 shSLE(t, left, right);
00072 return t;
00073 }
00074 template<int N, typename T1, typename T2>
00075 ShGeneric<N, CT1T2> operator<=(const ShGeneric<1, T1>& left, const ShGeneric<N, T2>& right)
00076 {
00077 ShAttrib<N, SH_TEMP, CT1T2> t;
00078 shSLE(t, left, right);
00079 return t;
00080 }
00081 template<typename T1, typename T2>
00082 ShGeneric<1, CT1T2> operator<=(const ShGeneric<1, T1>& left, const ShGeneric<1, T2>& right)
00083 {
00084 ShAttrib<1, SH_TEMP, CT1T2> t;
00085 shSLE(t, left, right);
00086 return t;
00087 }
00088 SH_SHLIB_CONST_SCALAR_OP(operator<=);
00089 SH_SHLIB_CONST_N_OP_BOTH(operator<=);
00090
00091 template<int N, typename T1, typename T2>
00092 ShGeneric<N, CT1T2> operator>(const ShGeneric<N, T1>& left, const ShGeneric<N, T2>& right)
00093 {
00094 ShAttrib<N, SH_TEMP, CT1T2> t;
00095 shSGT(t, left, right);
00096 return t;
00097 }
00098 template<int N, typename T1, typename T2>
00099 ShGeneric<N, CT1T2> operator>(const ShGeneric<N, T1>& left, const ShGeneric<1, T2>& right)
00100 {
00101 ShAttrib<N, SH_TEMP, CT1T2> t;
00102 shSGT(t, left, right);
00103 return t;
00104 }
00105 template<int N, typename T1, typename T2>
00106 ShGeneric<N, CT1T2> operator>(const ShGeneric<1, T1>& left, const ShGeneric<N, T2>& right)
00107 {
00108 ShAttrib<N, SH_TEMP, CT1T2> t;
00109 shSGT(t, left, right);
00110 return t;
00111 }
00112 template<typename T1, typename T2>
00113 ShGeneric<1, CT1T2> operator>(const ShGeneric<1, T1>& left, const ShGeneric<1, T2>& right)
00114 {
00115 ShAttrib<1, SH_TEMP, CT1T2> t;
00116 shSGT(t, left, right);
00117 return t;
00118 }
00119 SH_SHLIB_CONST_SCALAR_OP(operator>);
00120 SH_SHLIB_CONST_N_OP_BOTH(operator>);
00121
00122 template<int N, typename T1, typename T2>
00123 ShGeneric<N, CT1T2> operator>=(const ShGeneric<N, T1>& left, const ShGeneric<N, T2>& right)
00124 {
00125 ShAttrib<N, SH_TEMP, CT1T2> t;
00126 shSGE(t, left, right);
00127 return t;
00128 }
00129 template<int N, typename T1, typename T2>
00130 ShGeneric<N, CT1T2> operator>=(const ShGeneric<N, T1>& left, const ShGeneric<1, T2>& right)
00131 {
00132 ShAttrib<N, SH_TEMP, CT1T2> t;
00133 shSGE(t, left, right);
00134 return t;
00135 }
00136 template<int N, typename T1, typename T2>
00137 ShGeneric<N, CT1T2> operator>=(const ShGeneric<1, T1>& left, const ShGeneric<N, T2>& right)
00138 {
00139 ShAttrib<N, SH_TEMP, CT1T2> t;
00140 shSGE(t, left, right);
00141 return t;
00142 }
00143 template<typename T1, typename T2>
00144 ShGeneric<1, CT1T2> operator>=(const ShGeneric<1, T1>& left, const ShGeneric<1, T2>& right)
00145 {
00146 ShAttrib<1, SH_TEMP, CT1T2> t;
00147 shSGE(t, left, right);
00148 return t;
00149 }
00150 SH_SHLIB_CONST_SCALAR_OP(operator>=);
00151 SH_SHLIB_CONST_N_OP_BOTH(operator>=);
00152
00153 template<int N, typename T1, typename T2>
00154 ShGeneric<N, CT1T2> operator==(const ShGeneric<N, T1>& left, const ShGeneric<N, T2>& right)
00155 {
00156 ShAttrib<N, SH_TEMP, CT1T2> t;
00157 shSEQ(t, left, right);
00158 return t;
00159 }
00160 template<int N, typename T1, typename T2>
00161 ShGeneric<N, CT1T2> operator==(const ShGeneric<N, T1>& left, const ShGeneric<1, T2>& right)
00162 {
00163 ShAttrib<N, SH_TEMP, CT1T2> t;
00164 shSEQ(t, left, right);
00165 return t;
00166 }
00167 template<int N, typename T1, typename T2>
00168 ShGeneric<N, CT1T2> operator==(const ShGeneric<1, T1>& left, const ShGeneric<N, T2>& right)
00169 {
00170 ShAttrib<N, SH_TEMP, CT1T2> t;
00171 shSEQ(t, left, right);
00172 return t;
00173 }
00174 template<typename T1, typename T2>
00175 ShGeneric<1, CT1T2> operator==(const ShGeneric<1, T1>& left, const ShGeneric<1, T2>& right)
00176 {
00177 ShAttrib<1, SH_TEMP, CT1T2> t;
00178 shSEQ(t, left, right);
00179 return t;
00180 }
00181 SH_SHLIB_CONST_SCALAR_OP(operator==);
00182 SH_SHLIB_CONST_N_OP_BOTH(operator==);
00183
00184 template<int N, typename T1, typename T2>
00185 ShGeneric<N, CT1T2> operator!=(const ShGeneric<N, T1>& left, const ShGeneric<N, T2>& right)
00186 {
00187 ShAttrib<N, SH_TEMP, CT1T2> t;
00188 shSNE(t, left, right);
00189 return t;
00190 }
00191 template<int N, typename T1, typename T2>
00192 ShGeneric<N, CT1T2> operator!=(const ShGeneric<N, T1>& left, const ShGeneric<1, T2>& right)
00193 {
00194 ShAttrib<N, SH_TEMP, CT1T2> t;
00195 shSNE(t, left, right);
00196 return t;
00197 }
00198 template<int N, typename T1, typename T2>
00199 ShGeneric<N, CT1T2> operator!=(const ShGeneric<1, T1>& left, const ShGeneric<N, T2>& right)
00200 {
00201 ShAttrib<N, SH_TEMP, CT1T2> t;
00202 shSNE(t, left, right);
00203 return t;
00204 }
00205 template<typename T1, typename T2>
00206 ShGeneric<1, CT1T2> operator!=(const ShGeneric<1, T1>& left, const ShGeneric<1, T2>& right)
00207 {
00208 ShAttrib<1, SH_TEMP, CT1T2> t;
00209 shSNE(t, left, right);
00210 return t;
00211 }
00212 SH_SHLIB_CONST_SCALAR_OP(operator!=);
00213 SH_SHLIB_CONST_N_OP_BOTH(operator!=);
00214
00215 template<int N, typename T1, typename T2, typename T3>
00216 ShGeneric<N, CT1T2T3> cond(const ShGeneric<N, T1>& condition,
00217 const ShGeneric<N, T2>& left,
00218 const ShGeneric<N, T3>& right)
00219 {
00220 ShAttrib<N, SH_TEMP, CT1T2T3> t;
00221 shCOND(t, condition, left, right);
00222 return t;
00223 }
00224 template<int N, typename T1, typename T2, typename T3>
00225 ShGeneric<N, CT1T2T3> cond(const ShGeneric<1, T1>& condition,
00226 const ShGeneric<N, T2>& left,
00227 const ShGeneric<N, T3>& right)
00228 {
00229 ShAttrib<N, SH_TEMP, CT1T2T3> t;
00230 shCOND(t, condition, left, right);
00231 return t;
00232 }
00233 template<typename T1, typename T2, typename T3>
00234 ShGeneric<1, CT1T2T3> cond(const ShGeneric<1, T1>& condition,
00235 const ShGeneric<1, T2>& left,
00236 const ShGeneric<1, T3>& right)
00237 {
00238 ShAttrib<1, SH_TEMP, CT1T2T3> t;
00239 shCOND(t, condition, left, right);
00240 return t;
00241 }
00242 template<int N, typename T1, typename T2>
00243 ShGeneric<N, CT1T2> cond(const CT1T2& condition,
00244 const ShGeneric<N, T1>& left,
00245 const ShGeneric<N, T2>& right)
00246 {
00247 ShAttrib<N, SH_TEMP, CT1T2> t;
00248 shCOND(t, ShAttrib<1, SH_CONST, CT1T2>(condition), left, right);
00249 return t;
00250 }
00251
00252 template<int N, typename T>
00253 ShGeneric<N, T> operator!(const ShGeneric<N, T>& a)
00254 {
00255 return 1.0f - (a > 0.0f);
00256 }
00257
00258
00259 template<int N, typename T1, typename T2>
00260 ShGeneric<N, CT1T2> operator&&(const ShGeneric<N, T1>& a, const ShGeneric<N, T2>& b)
00261 {
00262 return min(a,b);
00263 }
00264
00265 template<int N, typename T1, typename T2>
00266 ShGeneric<N, CT1T2> operator||(const ShGeneric<N, T1>& a, const ShGeneric<N, T2>& b)
00267 {
00268 return max(a,b);
00269 }
00270
00271 template<int N, typename T>
00272 ShGeneric<1, T> any(const ShGeneric<N, T>& a)
00273 {
00274 ShAttrib<1, SH_TEMP, T> t = a(0);
00275 for (int i = 1; i < N; i++) {
00276 t = t || a(i);
00277 }
00278 return t;
00279 }
00280
00281 template<int N, typename T>
00282 ShGeneric<1, T> all(const ShGeneric<N, T>& a)
00283 {
00284 ShAttrib<1, SH_TEMP, T> t = a(0);
00285 for (int i = 1; i < N; i++) {
00286 t = t && a(i);
00287 }
00288 return t;
00289 }
00290
00291 }
00292
00293 #endif