/************************************

          WZ ASUST   2016
         顺序表 第二个模板

************************************/
#include"wz.h"
#include"sts.h"
template <typename T>
class seqlist
{
public:
seqlist()
:_data(NULL)
,_size(0)
,_capacity(0)
{
CheckCapacity();
}
/*seqlist(const T& d)
:_data(d._data)
,_size(d._size)
,_capacity (d._capacity)
{

}
}*/
~seqlist()
{
if(_data!=NULL)
    delete [] _data;
}
public:
void CheckCapacity()
{
if(_size == _capacity)
{
T* tmp=new T[2*_capacity+3];
memcpy(tmp,_data,_size*sizeof(T));
delete _data;
_data = tmp;
_capacity =2*_capacity+3 ;
} 
}
public:
void PushBack(const T& d);
void PopBack();
void PushFront(const T& d);
void PopFront();
        void Insert(const size_t pos, const T& x);
        void Erase(const size_t pos);
        int Find(const T& x);
        void reverse();
void Print()
{
int i=0;
for(i=0;i<_size;i++)
{
cout<<_data[i]<<" ";
}
cout<<endl;
}
private:
T* _data;
int _size;
int _capacity;
};
template <typename T>
void seqlist<T>:: PushBack(const T& d)
{
CheckCapacity();
_data[_size] = d;
_size++;
}
template <typename T>
void seqlist<T>:: PopBack()
{
if(_data == NULL)
{
return;
}
_size--;
}
template <typename T>
void seqlist<T>:: PushFront(const T& d)
{
CheckCapacity();
int i=0;
for(i=_size;i>0;--i)
{
_data[i] = _data[i-1];
}
_data[i] = d;
++_size;
}
template <typename T>
void seqlist<T>::PopFront()
{
int i=0;
for(i=0;i<_size;i++)
{
_data[i-1] = _data[i];
}
--_size;
}
template<typename T>
void seqlist<T>::Insert(const size_t pos, const T& x)
{
CheckCapacity ();
int i=0;
for(i=_size;i>pos;--i)
{
_data[i] = _data[i-1];
}
_data[i]=x;
++_size;
}
template<typename T>
void seqlist<T>::Erase(const size_t pos)
{
int i = 0;
for(i=pos;i<_size-1;i++)
{
_data[i] = _data[i+1];
}
--_size;
}
template<typename T>
int seqlist<T>::Find(const T& x)
{
int i=0;
for(i=0;i<_size;i++)
{
if(_data[i]== x)
return i;
}
return -1;
}
template<typename T>
void seqlist<T>::reverse( )
{
   int i=0,j;
   T  tmp;
   for(i,j=_size-1;i<j;i++,j--)
{
        tmp=_data[i];  
        _data[i]=_data[j];
        _data[j]=tmp;
        }
}


//void Test1()
//{
// seqlist<int> s1;
// s1.PushBack(1);
// s1.PushBack(2);
// s1.PushBack(3);
// s1.PushBack(4);
// s1.Print();
//}
//void Test2()
//{
// seqlist<int> s1;
// s1.PopBack();
//}
//void Test3()
//{
// seqlist<int> s1;
// s1.PopFront();
//}
//void Test4()
//{
// seqlist<int> s1;
// s1.PushFront(1);
// s1.PushFront(2);
// s1.PushFront(3);
// s1.PushFront(4);
//
//template <typename T>
int main()
{
seqlist<int> s1;
s1.PushBack(1);
s1.PushBack(2);
s1.PushBack(3);
s1.PushBack(4);
s1.PopBack();
s1.Print();
s1.PushFront(5);
s1.Print();
s1.PopFront();
s1.Print();
s1.Insert(2,5);
s1.Print();
s1.Erase(2);
cout<<"wzzx"<<endl;
s1.Print();
s1.Find(2);
cout<<"wzzx2"<<endl;
          s1.reverse();
s1.Print();
 
return 0;
}