BasesParserSLan/Src/Utils/Number.mqh
Nique_372 6e80782c15
2026-10-19 07:27:06 -05:00

91 lines
3.5 KiB
MQL5

//+------------------------------------------------------------------+
//| Number.mqh |
//| Copyright 2026, Niquel Mendoza. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#ifndef TSNPARSERIN_CPP_DLL
#property copyright "Copyright 2026, Niquel Mendoza."
#property link "https://www.mql5.com"
#property strict
#endif // TSNPARSERIN_CPP_DLL
#ifndef BASESPARSERSLAN_SRC_UTILS_NUMBER_MQH
#define BASESPARSERSLAN_SRC_UTILS_NUMBER_MQH
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
//--- conv str a -> val
#ifndef TSNPARSERIN_CPP_DLL
#include <TSN\\Std\\Str\\Conv.mqh>
#else // TSNPARSERIN_CPP_DLL
// En c++ solo hacen falta las macros STRCONV_* (sin includes de mql5)
#include "..\\..\\..\\TSNStd\\Src\\String\\ConvDef\\Def.mqh"
#endif // TSNPARSERIN_CPP_DLL
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
namespace TSN
{
//+------------------------------------------------------------------+
//| Numeros |
//+------------------------------------------------------------------+
#define DOMBASEUTIL_PARSE_NUM_U1(V) \
STRCONV_TOV_ALG(V, ch) \
if((ch = m_raw[++m_pos] ^ '0') > 9) \
break;
//--- skio lz
#define DOMBASEUTIL_PARSE_SKIP_LZ \
while((ch = m_raw[++m_pos]) == '0') {} \
if((ch^='0') > 9) \
break;
//--- unrolled 9
#define DOMBASEUTIL_PARSE_NUM_UNROLLED_8(V) \
DOMBASEUTIL_PARSE_NUM_U1(V) \
DOMBASEUTIL_PARSE_NUM_U1(V) \
DOMBASEUTIL_PARSE_NUM_U1(V) \
DOMBASEUTIL_PARSE_NUM_U1(V) \
DOMBASEUTIL_PARSE_NUM_U1(V) \
DOMBASEUTIL_PARSE_NUM_U1(V) \
DOMBASEUTIL_PARSE_NUM_U1(V) \
DOMBASEUTIL_PARSE_NUM_U1(V)
//--- unrolled 17 (8+8+1)
#define DOMBASEUTIL_PARSE_NUM_UNROLLED_17(V) \
DOMBASEUTIL_PARSE_NUM_UNROLLED_8(V) \
DOMBASEUTIL_PARSE_NUM_UNROLLED_8(V) \
DOMBASEUTIL_PARSE_NUM_U1(V)
//--- unrolled 18 (8+8+2)
#define DOMBASEUTIL_PARSE_NUM_UNROLLED_18(V) \
DOMBASEUTIL_PARSE_NUM_UNROLLED_17(V) \
DOMBASEUTIL_PARSE_NUM_U1(V)
//--- saltar un numero
#define DOMBASEUTIL_NUM_SKIP_NUMBER while((ch = m_raw[++m_pos] ^ '0') < 10) {}
//--- la parte decimal
// la idea es que los digitos tipo 0.000564135641 o esos no coman tantos digitos
#define DOMBASEUTIL_NUM_PROCCES_FIRST_DEC(V, CH, POS, DS, DIG) \
DOMBASEUTIL_PARSE_NUM_U1(V) \
if(!V) \
{ \
if(CH == 0) \
{ \
while((CH = m_raw[++POS]) == '0') {} \
DIG = (DS - POS); \
if((CH^='0') > 9) \
break; \
} \
else \
DIG = (DS - POS); \
DOMBASEUTIL_PARSE_NUM_U1(V, CH) \
}
//---
}
#endif // BASESPARSERSLAN_SRC_UTILS_NUMBER_MQH