2026-10-09 12:34:15 -05:00 | | | //+------------------------------------------------------------------+
|
| | | //| Buffer.mqh |
|
| | | //| Copyright 2026, Niquel Mendoza. |
|
| | | //| https://www.mql5.com |
|
| | | //+------------------------------------------------------------------+
|
| | | #property copyright "Copyright 2026, Niquel Mendoza."
|
| | | #property link "https://www.mql5.com"
|
| | | #property strict
|
| | |
|
2026-10-09 12:56:38 -05:00 | | | #ifndef TSNSTD_SRC_STRING_BUFFER_MQH
|
| | | #define TSNSTD_SRC_STRING_BUFFER_MQH
|
2026-10-09 12:34:15 -05:00 | | |
|
| | | //+------------------------------------------------------------------+
|
| | | //| |
|
| | | //+------------------------------------------------------------------+
|
| | | #include <TSN\\Tables\\Bits.mqh>
|
| | |
|
| | | //+------------------------------------------------------------------+
|
| | | //| |
|
| | | //+------------------------------------------------------------------+
|
| | | 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;
|
| | | }
|
| | | }
|
| | | //+------------------------------------------------------------------+
|
2026-10-09 12:56:38 -05:00 | | | #endif // TSNSTD_SRC_STRING_BUFFER_MQH
|