178 lines
7.4 KiB
MQL5
178 lines
7.4 KiB
MQL5
//+------------------------------------------------------------------+
|
|
//| UView.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_UVIEW_MQH
|
|
#define TSNSTD_SRC_STRING_UVIEW_MQH
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
#include "Buffer.mqh"
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
namespace TSN
|
|
{
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
// Generalmente no se chekea rangos solo en At
|
|
|
|
#define MQLARTICLES_STRVIEW_IDX(POS) (m_start + (POS))
|
|
#define MQLARTICLES_STRVIEW_VAL(IDX) m_ctx.m_raw[MQLARTICLES_STRVIEW_IDX(IDX)]
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
// View
|
|
// las funciones de materializacion como SubStr entre otras... tineen 2-3 variantes Raw\Ctx\Buffer
|
|
// - Raw: usa CharArray to string directo
|
|
// - Ctx: usa el metodo que provee ctx..
|
|
// Las demas funciones como find etc.. trabajan sobre el buffer raw.
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
template <typename TOuner>
|
|
struct CStringView
|
|
{
|
|
TOuner* const m_ctx;
|
|
int m_len;
|
|
int m_start;
|
|
|
|
//---
|
|
CStringView(const int start, const int len, TOuner* ctx)
|
|
: m_len(len), m_start(start), m_ctx(ctx) {}
|
|
|
|
|
|
//--- acceso
|
|
__forceinline uchar operator[](const int pos) const { return MQLARTICLES_STRVIEW_VAL(pos); }
|
|
__forceinline uchar At(const int pos) const { return pos < 0 || pos >= m_len ? 0 : MQLARTICLES_STRVIEW_VAL(pos); }
|
|
__forceinline uchar Front() const { return MQLARTICLES_STRVIEW_VAL(0); }
|
|
__forceinline uchar Back() const { return MQLARTICLES_STRVIEW_VAL(m_len - 1); }
|
|
|
|
|
|
//--- modificadores de ventana
|
|
__forceinline void RemovePrefix(int n) { m_len -= n; }
|
|
__forceinline void RemoveSuffix(int n) { m_start += n; }
|
|
|
|
//--- operaciones
|
|
//- subtr (materializacino del view .. a string o uchar o tambien otro subview)
|
|
// num no peude ser negativo si quiere usar "MAX" use INT_MAX o algo asi.. luego ya se noramloza con min
|
|
// string final
|
|
__forceinline string SubtrStr(const int pos, const int num, uint cp = CP_ACP) const;
|
|
__forceinline int SubtrStr(uchar& in[], const int pos, const int num) const;
|
|
|
|
// view
|
|
__forceinline CStringView SubtrView(const int pos, const int num) const;
|
|
|
|
//- compare
|
|
__forceinline uchar CmpLex(const string& other) const;
|
|
|
|
|
|
//- stats with
|
|
__forceinline bool StartsWith(const uchar c) const { return MQLARTICLES_STRVIEW_VAL(0) == c; }
|
|
__forceinline bool EndsWith(const uchar c) const { return MQLARTICLES_STRVIEW_VAL(m_len - 1) == c; }
|
|
|
|
//- apis
|
|
__forceinline void Trim();
|
|
|
|
//- find
|
|
__forceinline int Find(const uchar c, int pos = 0) const;
|
|
__forceinline int FindWithSwar(const uchar c, int pos = 0) const;
|
|
//int FindWithMComp(const uchar c, int pos = 0) const;
|
|
|
|
//- reverse find
|
|
__forceinline int RFind(const uchar c, int rend = 1) const;
|
|
|
|
|
|
//------- extras movidos para que compile (el compilador no esta tan bueno)
|
|
template <typename TSuOwner>
|
|
__forceinline uchar CmpLexW(const CStringView<TSuOwner>& other) const
|
|
{
|
|
return CStringBuffer::CmpLex(
|
|
// this
|
|
m_ctx.m_raw, m_start, m_len,
|
|
// other
|
|
other.m_ctx.m_raw, other.m_start, other.m_len
|
|
);
|
|
}
|
|
};
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| Subtr |
|
|
//+------------------------------------------------------------------+
|
|
template <typename TOuner>
|
|
__forceinline string CStringView::SubtrStr(const int pos, const int num, uint cp = CP_ACP) const
|
|
{
|
|
return CharArrayToString(m_ctx.m_raw, MQLARTICLES_STRVIEW_IDX(pos), fmin(num, m_len), cp);
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
template <typename TOuner>
|
|
__forceinline int CStringView::SubtrStr(uchar& in[], const int pos, const int num) const
|
|
{
|
|
return ArrayCopy(in, m_ctx.m_raw, 0, MQLARTICLES_STRVIEW_IDX(pos), fmin(num, m_len));
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
// view
|
|
template <typename TOuner>
|
|
__forceinline CStringView CStringView::SubtrView(const int pos, const int num) const
|
|
{
|
|
// retorna el minimo de len si num es mucho se usa el len acutal si no el que se nos paso
|
|
return CStringView(MQLARTICLES_STRVIEW_IDX(pos), fmin(num, m_len), m_ctx);
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
template <typename TOuner>
|
|
__forceinline uchar CStringView::CmpLex(const string& other) const
|
|
{
|
|
return CStringBuffer::CmpLex(m_ctx.m_raw, m_start, m_len, other);
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
template <typename TOuner>
|
|
__forceinline int CStringView::Find(const uchar c, int pos = 0) const
|
|
{
|
|
return CStringBuffer::Find(c, m_ctx.m_raw, MQLARTICLES_STRVIEW_IDX(pos), m_len, m_start);
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
template <typename TOuner>
|
|
__forceinline int CStringView::FindWithSwar(const uchar c, int pos = 0) const
|
|
{
|
|
return CStringBuffer::FindSwar(c, m_ctx.m_raw, MQLARTICLES_STRVIEW_IDX(pos), m_len, m_start);
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
template <typename TOuner>
|
|
__forceinline int CStringView::RFind(const uchar c, int rend = 1) const
|
|
{
|
|
return CStringBuffer::RFind(c, m_ctx.m_raw, (m_start + m_len) - rend, m_start);
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
template <typename TOuner>
|
|
__forceinline void CStringView::Trim()
|
|
{
|
|
CStringBuffer::Trim(m_ctx.m_raw, m_len, m_start);
|
|
}
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
#endif // TSNSTD_SRC_STRING_UVIEW_MQH
|