module util.array;
import std.stdio;
/**
only for dynamic arrays
*/
T[] pop_back(T)(ref T[] t)
{
T r = t[$];
t.length = t.length - 1;
return r;
}
unittest
{
//TODO:
}
alias add push_back;
T[] add(T)(ref T[] t, T el)
{
t ~= el;
return t;
}
unittest
{
//TODO:
}
T[] insert(T)(ref T[] t, T el, uint pos)
{
t.length = t.length + 1;
t[pos+1..$] = t[pos..$-1];
t[pos] = el;
return t;
}
unittest
{
//TODO:
}
T[] remove(T)(ref T[] t, T el)
{
t = t.removeAt(t.indexOf(el));
return t;
}
unittest
{
//TODO:
}
T[] removeUO(T)(ref T[] t, T el)
{
t = t.removeAtUO(t.indexOf(el));
return t;
}
unittest
{
//TODO:
}
T[] removeAtUO(T)(ref T[] t, uint pos)
{
assert(pos < t.length);
/*
if(pos >= t.length)
return t;
*/
if (pos != t.length - 1)
t[pos] = t[t.length - 1];
t.length = t.length -1;
return t;
}
unittest
{
uint[] u= [1,2,3,4,5,6,7,8,9];
u.removeAtUO(3);
assert(u[0] == 1);
assert(u[1] == 2);
assert(u[2] == 3);
assert(u[3] == 9);
assert(u.length == 8);
u.removeAtUO(5);
assert(u[0] == 1);
assert(u[5] == 8);
assert(u.length == 7);
}
T[] removeAt(T)(ref T[] t, uint pos)
{
assert(pos < t.length);
if(pos == 0 && t.length <= 1)
return null;
if(pos == 0 && t.length > 1)
return t[1..$];
T[] tmp = t[0..pos];
tmp ~= t[(pos+1)..$];
t=tmp;
return tmp;
}
unittest
{
uint[] u= [1,2,3,4,5,6,7,8,9];
u.removeAt(3);
assert(u[0] == 1);
assert(u[1] == 2);
assert(u[2] == 3);
assert(u[3] == 5);
assert(u.length == 8);
u.removeAt(5);
assert(u[0] == 1);
assert(u[5] == 8);
assert(u.length == 7);
}
bool has(T)(T[] t, T el)
{
foreach(T tx; t)
{
if(el == tx)
{
return true;
}
}
return false;
}
unittest
{
uint[] u= [1,2,3,4,5,6,7,8,9];
uint x = 6;
assert(u.has(x) == true);
x = 12;
assert(u.has(x) == false);
}
uint indexOf(T)(T[] t, T el)
{
for(int i=0; i<t.length; ++i)
{
if(el == t[i])
return i;
}
throw new Exception("Element not found");
}
unittest
{
uint[] u= [1,2,3,4,5,6,7,8,9];
uint x = 5;
assert(u.indexOf(x) == 4);
x = 8;
assert(u.indexOf(x) == 7);
}