23 #include <type_traits>
34 typename std::enable_if<std::is_nothrow_default_constructible<T>::value>
::type
42 template <
class T>
inline T
Abs(T val) {
return val > 0 ? val : -val; }
43 template <
class T,
class U,
class V>
inline bool Inside(T ival, U lbound, V rbound) {
return ival >= lbound && ival <= rbound; }
44 template <
class T>
inline T
Clamp(T bval, T lbound, T rbound) {
return bval < lbound ? lbound : bval > rbound ? rbound : bval; }
45 template <
class T>
inline int Sign(T val) {
return val < 0 ? -1 : val > 0 ? 1 : 0; }
49 if (val%4) { val>>=2; val<<=2; val+=4; }
53 int32_t
Distance(int32_t iX1, int32_t iY1, int32_t iX2, int32_t iY2);
54 int32_t
Angle(int32_t iX1, int32_t iY1, int32_t iX2, int32_t iY2, int32_t iPrec = 1);
55 int Pow(
int base,
int exponent);
56 int32_t
StrToI32(
const char *
s,
int base,
const char **scan_end);
59 typename std::enable_if<std::is_pod<T>::value>
::type
62 std::memset(lpMem,
'\0',dwSize);
65 inline void MemCopy(
const void *lpMem1,
void *lpMem2,
size_t dwSize)
67 std::memmove(lpMem2,lpMem1,dwSize);
70 inline char CharCapital(
char cChar) {
return std::toupper(cChar); }
72 inline bool IsWhiteSpace(
char cChar) {
return !!std::isspace((
unsigned char)cChar); }
74 inline size_t SLen(
const char *sptr) {
return sptr?std::strlen(sptr):0; }
75 inline size_t SLenUntil(
const char *szStr,
char cUntil)
78 const char *end = std::strchr(szStr, cUntil);
79 return end ? end-szStr : std::strlen(szStr);
86 unsigned char c=**pszString;
87 if (c<128) { ++*pszString;
return c; }
93 inline bool SEqual(
const char *szStr1,
const char *szStr2) {
return szStr1&&szStr2?!std::strcmp(szStr1,szStr2):
false; }
94 bool SEqual2(
const char *szStr1,
const char *szStr2);
95 bool SEqualUntil(
const char *szStr1,
const char *szStr2,
char cWild);
96 bool SEqualNoCase(
const char *szStr1,
const char *szStr2,
int iLen=-1);
97 bool SEqual2NoCase(
const char *szStr1,
const char *szStr2,
int iLen = -1);
99 void SCopy(
const char *szSource,
char *sTarget);
100 void SCopy(
const char *szSource,
char *sTarget,
size_t iMaxL);
101 void SCopyUntil(
const char *szSource,
char *sTarget,
char cUntil,
int iMaxL=-1,
int iIndex=0);
102 void SCopyUntil(
const char *szSource,
char *sTarget,
const char * sUntil,
size_t iMaxL);
103 void SCopyIdentifier(
const char *szSource,
char *sTarget,
int iMaxL=0);
104 bool SCopySegment(
const char *fstr,
int segn,
char *tstr,
char sepa=
';',
int iMaxL=-1,
bool fSkipWhitespace=
false);
105 bool SCopySegmentEx(
const char *fstr,
int segn,
char *tstr,
char sepa1,
char sepa2,
int iMaxL=-1,
bool fSkipWhitespace=
false);
106 bool SCopyEnclosed(
const char *szSource,
char cOpen,
char cClose,
char *sTarget,
int iSize);
108 void SAppend(
const char *szSource,
char *szTarget,
int iMaxL=-1);
111 void SInsert(
char *szString,
const char *szInsert,
int iPosition=0,
int iMaxLen=-1);
112 void SDelete(
char *szString,
int iLen,
int iPosition=0);
114 int SCharPos(
char cTarget,
const char *szInStr,
int iIndex=0);
116 unsigned int SCharCount(
char cTarget,
const char *szInStr,
const char *cpUntil=
nullptr);
117 unsigned int SCharCountEx(
const char *szString,
const char *szCharList);
121 const char *
SSearch(
const char *szString,
const char *szIndex);
122 const char *
SSearchNoCase(
const char *szString,
const char *szIndex);
125 const char *
SAdvancePast(
const char *szSPos,
char cPast);
127 bool SGetModule(
const char *szList,
int iIndex,
char *sTarget,
int iSize=-1);
128 bool SIsModule(
const char *szList,
const char *szString,
int *ipIndex=
nullptr,
bool fCaseSensitive=
false);
129 bool SAddModule(
char *szList,
const char *szModule,
bool fCaseSensitive=
false);
130 bool SAddModules(
char *szList,
const char *szModules,
bool fCaseSensitive=
false);
131 bool SRemoveModule(
char *szList,
const char *szModule,
bool fCaseSensitive=
false);
132 bool SRemoveModules(
char *szList,
const char *szModules,
bool fCaseSensitive=
false);
135 void SNewSegment(
char *szStr,
const char *szSepa=
";");
137 void SWordWrap(
char *szText,
char cSpace,
char cSepa,
int iMaxLine);
140 int SGetLine(
const char *szText,
const char *cpPosition);
150 #define vsnprintf _vsprintf_p
157 va_list args; va_start(args, fmt);
158 return vsprintf(str, fmt, args);
162 #define sprintf ssprintf
167 va_list args; va_start(args, fmt);
168 int m = vsnprintf(str, N, fmt, args);
171 if (
static_cast<size_t>(m) >= N) { m = N-1; str[m] = 0; }
176 bool IsValidUtf8(
const char *
string,
int length = -1);
179 std::string
vstrprintf(
const char *format, va_list args);
std::string strprintf(const char *format,...) GNUC_FORMAT_ATTRIBUTE
bool SWildcardMatchEx(const char *szString, const char *szWildcard)
void SReplaceChar(char *str, char fc, char tc)
bool SRemoveModules(char *szList, const char *szModules, bool fCaseSensitive=false)
const char * SSearch(const char *szString, const char *szIndex)
bool SCopyEnclosed(const char *szSource, char cOpen, char cClose, char *sTarget, int iSize)
bool SEqual2(const char *szStr1, const char *szStr2)
void SDelete(char *szString, int iLen, int iPosition=0)
bool SCopySegmentEx(const char *fstr, int segn, char *tstr, char sepa1, char sepa2, int iMaxL=-1, bool fSkipWhitespace=false)
int DWordAligned(int val)
bool SAddModules(char *szList, const char *szModules, bool fCaseSensitive=false)
bool SEqualUntil(const char *szStr1, const char *szStr2, char cWild)
bool IsIdentifier(char cChar)
void SCopyIdentifier(const char *szSource, char *sTarget, int iMaxL=0)
void SCopy(const char *szSource, char *sTarget)
int32_t StrToI32(const char *s, int base, const char **scan_end)
int SGetLine(const char *szText, const char *cpPosition)
uint32_t GetNextCharacter(const char **pszString)
void SCopyUntil(const char *szSource, char *sTarget, char cUntil, int iMaxL=-1, int iIndex=0)
bool SRemoveModule(char *szList, const char *szModule, bool fCaseSensitive=false)
std::enable_if< std::is_pod< T >::value >::type ZeroMem(T *lpMem, size_t dwSize)
void SWordWrap(char *szText, char cSpace, char cSepa, int iMaxLine)
int Pow(int base, int exponent)
const char * SAdvanceSpace(const char *szSPos)
int ssprintf(char(&str)[N], const char *fmt,...) GNUC_FORMAT_ATTRIBUTE_O
int32_t Distance(int32_t iX1, int32_t iY1, int32_t iX2, int32_t iY2)
int SLineGetCharacters(const char *szText, const char *cpPosition)
bool SEqual2NoCase(const char *szStr1, const char *szStr2, int iLen=-1)
size_t SLenUntil(const char *szStr, char cUntil)
int osprintf(char *str, const char *fmt,...) GNUC_FORMAT_ATTRIBUTE_O
bool IsValidUtf8(const char *string, int length=-1)
void SNewSegment(char *szStr, const char *szSepa=";")
bool SEqualNoCase(const char *szStr1, const char *szStr2, int iLen=-1)
int SModuleCount(const char *szList)
void SInsert(char *szString, const char *szInsert, int iPosition=0, int iMaxLen=-1)
int GetCharacterCount(const char *s)
std::string vstrprintf(const char *format, va_list args)
void SAppendChar(char cChar, char *szStr)
int SCharPos(char cTarget, const char *szInStr, int iIndex=0)
unsigned int SCharCount(char cTarget, const char *szInStr, const char *cpUntil=nullptr)
uint32_t GetNextUTF8Character(const char **pszString)
int SCharLastPos(char cTarget, const char *szInStr)
bool IsWhiteSpace(char cChar)
std::enable_if< std::is_nothrow_default_constructible< T >::value >::type InplaceReconstruct(T *obj)
bool SCopySegment(const char *fstr, int segn, char *tstr, char sepa=';', int iMaxL=-1, bool fSkipWhitespace=false)
int32_t Angle(int32_t iX1, int32_t iY1, int32_t iX2, int32_t iY2, int32_t iPrec=1)
T Clamp(T bval, T lbound, T rbound)
bool SIsModule(const char *szList, const char *szString, int *ipIndex=nullptr, bool fCaseSensitive=false)
bool SEqual(const char *szStr1, const char *szStr2)
const char * SSearchNoCase(const char *szString, const char *szIndex)
int SClearFrontBack(char *szString, char cClear=' ')
unsigned int SCharCountEx(const char *szString, const char *szCharList)
bool SAddModule(char *szList, const char *szModule, bool fCaseSensitive=false)
void MemCopy(const void *lpMem1, void *lpMem2, size_t dwSize)
void SCapitalize(char *szString)
void SAppend(const char *szSource, char *szTarget, int iMaxL=-1)
const char * SAdvancePast(const char *szSPos, char cPast)
bool SGetModule(const char *szList, int iIndex, char *sTarget, int iSize=-1)
char CharCapital(char cChar)
bool Inside(T ival, U lbound, V rbound)
size_t SLen(const char *sptr)