#include <iostream>
using namespace std;
////////////////////////////////////////////////////////////////////////////////
class VirtualArray
{
////////////////////////////////////////////////////////////////////////////////
protected:
VirtualArray * next;
int value;
int position;
////////////////////////////////////////////////////////////////////////////////
public:
VirtualArray()
{
next = this;
value = 0;
position = 0;
}
VirtualArray(int v1, int p1)
{
next = this;
value = v1;
position = p1;
}
////////////////////////////////////////////////////////////////////////////
VirtualArray * Add(VirtualArray * p1)
{
p1->next = next;
next = p1;
return p1;
}
void RemoveNext()
{
VirtualArray * rem = next;
next = next->next;
delete rem;
}
void Set(int pos, int val)
{
VirtualArray * curr = this;
do
{
if (curr->position == pos)
{
curr->value = val;
return;
}
curr = curr->next;
}
while (curr != this);
Add(new VirtualArray(val, pos));
}
int & operator[](int pos)
{
VirtualArray * curr = this, * prev = NULL;
do
{
if (curr->position == pos)
return curr->value;
prev = curr;
curr = curr->next;
if ((curr->value == 0) && (curr != this))
{
prev->RemoveNext();
curr = prev->next;
}
}
while (curr != this);
return Add(new VirtualArray(0, pos))->value;
}
void Clear()
{
VirtualArray * curr = next, * prev = NULL;
while (curr != this)
{
prev = curr;
curr = curr->next;
delete prev;
}
value = 0;
next = this;
}
int GetLenght()
{
VirtualArray * curr = next;
int len = 1;
while (curr != this)
{
len++;
curr = curr->next;
}
return len;
}
void Shift(int p1, int m1 = 0)
{
VirtualArray * curr = this;
int len = GetLenght();
if (m1 && (m1 < len))
m1 = len + 1;
do
{
curr->position = (m1 ? (curr->position + p1) % m1 : (curr->position + p1));
curr = curr->next;
}
while (curr != this);
}
void Print()
{
VirtualArray * curr = next;
cout << "[" << value;
while (curr != this)
{
cout << ", " << curr->value;
curr = curr->next;
}
cout << "]" << endl;
}
};
////////////////////////////////////////////////////////////////////////////////
int main()
{
VirtualArray va1;
for (int i=0; i<20; i++)
{
va1[i] = (i*9) % 10;
}
for (int i=0; i<20; i++)
cout << "a[" << i << "] = " << va1[i] << endl;
cout << "va1 = ";
va1.Print();
cout << "Shift on 1 element toward:" << endl;
va1.Shift(1, 10);
for (int i=0; i<20; i++)
cout << "a[" << i << "] = " << va1[i] << endl;
va1.Print();
cout << "Count of elements = " << va1.GetLenght();
getchar();
return 0;
}