//+------------------------------------------------------------------+ //| Buffer.mqh | //| Copyright 2026, Niquel Mendoza. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2026, Niquel Mendoza." #property link "https://www.mql5.com" #property strict #ifndef TSNSTD_SRC_STRING_BUFFER_MQH #define TSNSTD_SRC_STRING_BUFFER_MQH //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ #include //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ namespace TSN { //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ #define MQLARTICLES_STRINGBUFF_CMP_IGUAL (0) #define MQLARTICLES_STRINGBUFF_CMP_MAYOR (1) #define MQLARTICLES_STRINGBUFF_CMP_MENOR (2) //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ // Clase para trabajr con uchar como buffer para string como tal //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ class CStringBuffer { public: CStringBuffer(void) {} ~CStringBuffer(void) {} //--- Find // normal static __forceinline int Find(const uchar c, const uchar& in[], int pos, int len, int s_res = 0); static int FindSwar(const uchar c, const uchar& in[], int pos, int len, int s_res = 0); // rfind static __forceinline int RFind(const uchar c, const uchar& in[], int pos, int s_res = 0); //--- Trim static void Trim(const uchar &in[], int& len, int &start); //--- Cmp static uchar CmpLex(const uchar& in[], int pos, int len, const string& other); static uchar CmpLex(const uchar &in[], int pos, int len, const uchar& other[], int other_pos, int other_len); }; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ static uchar CStringBuffer::CmpLex(const uchar &in[], int pos, int len, const string &other) { //--- iniciales const int l = StringLen(other); const int common = fmin(l, len); //--- iter for(int i = 0; i < common; i++, pos++) if(in[pos] != uchar(other[i])) return in[pos] < uchar(other[i]) ? MQLARTICLES_STRINGBUFF_CMP_MENOR : MQLARTICLES_STRINGBUFF_CMP_MAYOR; //--- vemos si el len es igual if(l == len) return MQLARTICLES_STRINGBUFF_CMP_IGUAL; //--- ultimo return len < l ? MQLARTICLES_STRINGBUFF_CMP_MENOR : MQLARTICLES_STRINGBUFF_CMP_MAYOR; } //+------------------------------------------------------------------+ static uchar CStringBuffer::CmpLex(const uchar &in[], int pos, int len, const uchar& other[], int other_pos, int other_len) { //--- iniciales const int common = fmin(other_len, len); //--- iter for(int i = 0; i < common; i++, pos++, other_pos++) if(in[pos] != other[other_pos]) return in[pos] < other[other_pos] ? MQLARTICLES_STRINGBUFF_CMP_MENOR : MQLARTICLES_STRINGBUFF_CMP_MAYOR; //--- vemos si el len es igual if(other_len == len) return MQLARTICLES_STRINGBUFF_CMP_IGUAL; //--- ultimo return len < other_len ? MQLARTICLES_STRINGBUFF_CMP_MENOR : MQLARTICLES_STRINGBUFF_CMP_MAYOR; } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ static __forceinline int CStringBuffer::Find(const uchar c, const uchar& in[], int pos, int len, int s_res = 0) { len += pos; for(; pos < len; pos++) if(in[pos] == c) return pos - s_res; return -1; } //+------------------------------------------------------------------+ static int CStringBuffer::FindSwar(const uchar c, const uchar& in[], int pos, int len, int s_res = 0) { //--- len += pos; const ulong mask = TSNTABLES_SWAR_REPLY8(c); for(; pos + 7 < len; pos += 8) { const ulong chunk = (ulong)in[pos] | (ulong)in[pos + 1] << 8 | (ulong)in[pos + 2] << 16 | (ulong)in[pos + 3] << 24 | (ulong)in[pos + 4] << 32 | (ulong)in[pos + 5] << 40 | (ulong)in[pos + 6] << 48 | (ulong)in[pos + 7] << 56; //--- const ulong x = chunk ^ mask; const ulong has_x = TSNTABLES_SWAR_HAS(x); if(has_x == 0) continue; //--- const ulong flag_real = TSNTABLES_BIT_DEJAR_SOLO_MINUS_SIG_BYTE(has_x); return (pos + TSNTABLES_CTZ_64_GET_BYTE(flag_real)) - s_res; } //--- for(; pos < len; pos++) if(in[pos] == c) return pos - s_res; //--- return -1; } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ static __forceinline int CStringBuffer::RFind(const uchar c, const uchar &in[], int pos, int s_res = 0) { //--- for(; pos >= 0; pos--) if(in[pos] == c) return pos - s_res; //--- return -1; } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ static void CStringBuffer::Trim(const uchar &in[], int& len, int &start) { //--- end int end = (start + len) - 1; while(end >= 0 && in[end] < 33) end--; //--- start while(start < len && in[start] < 33) start++; //--- len = (end - start) + 1; } } //+------------------------------------------------------------------+ #endif // TSNSTD_SRC_STRING_BUFFER_MQH