00001
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #ifndef NL_ALGO_H
00027 #define NL_ALGO_H
00028
00029 #include "nel/misc/types_nl.h"
00030 #include <vector>
00031 #include <string>
00032
00033
00034 namespace NLMISC
00035 {
00036
00037
00053 template <class T, class U>
00054 T computeBilinear(const T &v0, const T &v1, const T &v2, const T &v3, const U &s, const U &t)
00055 {
00056 T h0 = t * v3 + ((U) 1 - t) * v0;
00057 T h1 = t * v2 + ((U) 1 - t) * v1;
00058 return s * h1 + ((U) 1 - s) * h0;
00059 }
00060
00061
00068 template<class T>
00069 uint searchLowerBound(const T *array, uint arraySize, const T &key)
00070 {
00071 uint start=0;
00072 uint end= arraySize;
00073
00074 while(end-1>start)
00075 {
00076 uint pivot= (end+start)/2;
00077
00078 if(array[pivot] <= key)
00079 start= pivot;
00080 else
00081 end= pivot;
00082 }
00083
00084 return start;
00085 }
00086
00087
00088
00095 template<class T>
00096 uint searchLowerBound(const std::vector<T> &array, const T &key)
00097 {
00098 uint size= array.size();
00099 if(size==0)
00100 return 0;
00101 else
00102 return searchLowerBound(&array[0], size, key);
00103 }
00104
00105
00106
00109 static inline void fastClamp8(sint &v)
00110 {
00111 #ifdef NL_OS_WINDOWS
00112
00113 __asm
00114 {
00115 mov esi, v
00116 mov eax, [esi]
00117 mov ebx, eax
00118
00119 add eax, 0x80000000
00120 sbb ecx, ecx
00121 not ecx
00122 and ebx, ecx
00123
00124 add eax, 0x7FFFFF00
00125 sbb ecx, ecx
00126 and ebx, 255
00127 and ecx, 255
00128 or ebx, ecx
00129
00130 mov [esi], ebx
00131 }
00132 #else
00133 clamp(v, 0, 255);
00134 #endif
00135 }
00136
00137
00138
00149 bool testWildCard(const char *strIn, const char *wildCard);
00150
00151
00152
00156 void splitString(const std::string &str, const std::string &separator, std::vector<std::string> &retList);
00157
00158
00159 }
00160
00161
00162 #endif // NL_ALGO_H
00163
00164