BasesParserSLan/Src/UE/Test2.mq5
2026-10-05 17:54:12 -05:00

154 lines
3.9 KiB
MQL5

//+------------------------------------------------------------------+
//| Test2.mq5 |
//| Copyright 2026, Niquel Mendoza. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2026, Niquel Mendoza."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
char Utf32_8Len6(uint v)
{
return v < 0x80 ? 1 : (v < 0x800 ? 2 : (v < 0x10000 ? 3 : 4));
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void Utf32to8(const uint& in[], uchar& out[])
{
//---
int w = 0;
int req = ArraySize(in) << 2;
if(req > ArraySize(out))
ArrayResize(out, req);
//---
for(int i = 0; i < ArraySize(in); i++)
{
const uint v = in[i];
switch(Utf32_8Len6(v))
{
case 1:
{
out[w++] = uchar(v);
break;
}
case 2:
{
out[w++] = uchar(0xC0 | (v >> 6));
out[w++] = uchar(0x80 | (v & 0x3f));
break;
}
case 3:
{
out[w++] = uchar(0xE0 | (v >> 12));
out[w++] = uchar(0x80 | ((v >> 6) & 0x3f));
out[w++] = uchar(0x80 | (v & 0x3f));
break;
}
case 4:
{
out[w++] = uchar(0xF0 | (v >> 18));
out[w++] = uchar(0x80 | ((v >> 12) & 0x3F));
out[w++] = uchar(0x80 | ((v >> 6) & 0x3F));
out[w++] = uchar(0x80 | (v & 0x3F));
break;
}
default:
break;
}
}
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void Utf32to82(const uint& in[], uchar& out[])
{
//---
int w = 0;
int req = ArraySize(in) << 2;
if(req > ArraySize(out))
ArrayResize(out, req);
//---
for(int i = 0; i < ArraySize(in); i++)
{
const uint v = in[i];
if(v < 0x80)
{
out[w++] = uchar(v);
}
else
if(v < 0x800)
{
out[w++] = uchar(0xC0 | (v >> 6));
out[w++] = uchar(0x80 | (v & 0x3f));
}
else
if(v < 0x10000)
{
out[w++] = uchar(0xE0 | (v >> 12));
out[w++] = uchar(0x80 | ((v >> 6) & 0x3f));
out[w++] = uchar(0x80 | (v & 0x3f));
}
else
{
out[w++] = uchar(0xF0 | (v >> 18));
out[w++] = uchar(0x80 | ((v >> 12) & 0x3F));
out[w++] = uchar(0x80 | ((v >> 6) & 0x3F));
out[w++] = uchar(0x80 | (v & 0x3F));
}
}
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//---
#define SIZE (8192)
//---
MathSrand(16551);
uint32_t in[];
ArrayResize(in, SIZE);
for(int i = 0; i < SIZE; i++)
{
in[i] = MathRand();
}
//---
uchar out[];
uchar o2[];
//---
ulong a = GetMicrosecondCount();
for(int i = 0; i < 10000; i++)
{
Utf32to8(in, out);
}
ulong b = GetMicrosecondCount();
Print("time: ", (b - a), " ", ArrayMaximum(out));
//---
a = GetMicrosecondCount();
for(int i = 0; i < 10000; i++)
{
Utf32to8(in, o2);
}
b = GetMicrosecondCount();
Print("time: ", (b - a), " ", ArrayMaximum(o2));
}
//+------------------------------------------------------------------+