120 lines
2.6 KiB
MQL5
120 lines
2.6 KiB
MQL5
//+------------------------------------------------------------------+
|
|
//| MapArray.mqh |
|
|
//| Copyright 2021, MetaQuotes Ltd. |
|
|
//| https://www.mql5.com |
|
|
//+------------------------------------------------------------------+
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| Generic pair [key;value] |
|
|
//+------------------------------------------------------------------+
|
|
template<typename K,typename V>
|
|
struct Pair
|
|
{
|
|
K key;
|
|
V value;
|
|
};
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| Array of pairs [key;value] |
|
|
//+------------------------------------------------------------------+
|
|
template<typename K,typename V>
|
|
class MapArray
|
|
{
|
|
protected:
|
|
Pair<K,V> array[];
|
|
|
|
int add(const K k, const V v)
|
|
{
|
|
const int n = ArraySize(array);
|
|
ArrayResize(array, n + 1);
|
|
array[n].key = k;
|
|
array[n].value = v;
|
|
return n;
|
|
}
|
|
|
|
public:
|
|
int getSize() const
|
|
{
|
|
return ArraySize(array);
|
|
}
|
|
|
|
K getKey(const int i) const
|
|
{
|
|
return array[i].key;
|
|
}
|
|
|
|
V getValue(const int i) const
|
|
{
|
|
return array[i].value;
|
|
}
|
|
|
|
int find(const K k) const
|
|
{
|
|
for(int i = 0; i < ArraySize(array); ++i)
|
|
{
|
|
if(array[i].key == k)
|
|
{
|
|
return i;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
int put(const K k, const V v)
|
|
{
|
|
const int i = find(k);
|
|
if(i != -1)
|
|
{
|
|
array[i].value = v;
|
|
return i;
|
|
}
|
|
else return add(k, v);
|
|
}
|
|
|
|
int inc(const K k, const V plus = (V)1)
|
|
{
|
|
const int i = find(k);
|
|
if(i != -1)
|
|
{
|
|
array[i].value += plus;
|
|
return i;
|
|
}
|
|
else return add(k, plus);
|
|
}
|
|
|
|
void remove(const K k)
|
|
{
|
|
const int i = find(k);
|
|
if(i != -1)
|
|
{
|
|
for(int j = i + 1; j < ArraySize(array); ++j)
|
|
{
|
|
array[j - 1] = array[j];
|
|
}
|
|
ArrayResize(array, ArraySize(array) - 1);
|
|
}
|
|
}
|
|
|
|
V operator[](const int i)
|
|
{
|
|
return array[i].value;
|
|
}
|
|
|
|
V operator[](const K k)
|
|
{
|
|
const int i = find(k);
|
|
if(i != -1) return array[i].value;
|
|
return (V)NULL;
|
|
}
|
|
|
|
void reset()
|
|
{
|
|
ArrayResize(array, 0);
|
|
}
|
|
|
|
void print()
|
|
{
|
|
ArrayPrint(array);
|
|
}
|
|
};
|
|
//+------------------------------------------------------------------+
|