BasesParserSLan/Src/Node/Pointer.mqh
2026-10-05 21:57:35 -05:00

87 lines
2.8 KiB
MQL5

//+------------------------------------------------------------------+
//| Pointer.mqh |
//| Copyright 2026, Niquel Mendoza. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2026, Niquel Mendoza."
#property link "https://www.mql5.com"
#property strict
#ifndef BASESPARSERSLAN_SRC_NODE_POINTER_MQH
#define BASESPARSERSLAN_SRC_NODE_POINTER_MQH
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
#include "NodeBase.mqh"
#include "..\\ExtraDef\\Pointer\\StrImp.mqh"
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
namespace TSN
{
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
#define NODEBASESFL_QUERY_SET(INDEX, ERR) \
query.m_last_err = ERR; \
query.m_i = INDEX;
//---
template <typename TCtx, typename TType, typename TOut>
TOut CNodeSFLBase::operator[](BSFLPointerQuery& query)
{
//---
if(NODEBASE_IS_NOT_VALID_F ||
((1 << int(m_ctx.m_cinta[m_idx] & TSN_SBL_BIT_MASK_TYPE)) & (TSN_SBL_BASE_F_OBJ | TSN_SBL_BASE_F_ARR)) == 0)
{
NODEBASESFL_QUERY_SET(0, BSFL_POINTER_ERR_INVALID_NODE_TYPE)
return TOut::EMPTY_NODE;
}
//---
TOut curr(m_ctx, m_idx, m_end, m_node_pos);
//---
if(query.m_size == 0)
return curr;
//---
for(int i = 0; i < query.m_size; i += 2)
{
const uchar t = (uchar)curr.GetType();
if(t == TSN_SBL_BASE_TYPE_OBJ)
{
const ulong khash = query.m_ins[i + BSFLPTR_I_KEY];
curr = curr.Get(khash);
if(curr.IsInvalid())
{
NODEBASESFL_QUERY_SET(i, BSFL_POINTER_ERR_KEY_NOT_EXIST)
return TOut::EMPTY_NODE;
}
}
else
if(t == TSN_SBL_BASE_TYPE_ARR)
{
const int index = (int)query.m_ins[i + BSFLPTR_I_NUMBER];
if(!curr.InRangeSafe(index))
{
NODEBASESFL_QUERY_SET(i, BSFL_POINTER_ERR_ARRAY_OUT_RANGE)
return TOut::EMPTY_NODE;
}
curr = curr.At(index);
}
else
{
NODEBASESFL_QUERY_SET(i, BSFL_POINTER_ERR_INVALID_NODE_TYPE)
return TOut::EMPTY_NODE;
}
}
//---
return curr;
}
}
#endif // BASESPARSERSLAN_SRC_NODE_POINTER_MQH
//+------------------------------------------------------------------+