uart/usart/vector.h

188 lines
4.2 KiB
C++

/*
* Copyright (c) by BlackMark 2015
* Date 06/12/2015
* Version 1.6
*/
#ifndef VECTOR_H
#define VECTOR_H
#include <stdlib.h>
#include <string.h>
#include "cppalloc.h"
template<typename T>
class vector
{
private:
size_t m_sizeSize;
size_t m_sizeCapacity;
T* m_pData;
//////////////////////////////////////////////////////////////////////////
void extend()
{
m_sizeCapacity = ( ( m_sizeCapacity > 0 ) ? ( 2 * m_sizeCapacity ) : ( 1 ) );
T *pCopyData = new T[m_sizeCapacity];
memcpy( pCopyData, m_pData, m_sizeSize * sizeof( T ) );
delete [] m_pData;
m_pData = pCopyData;
}
public:
//////////////////////////////////////////////////////////////////////////
vector() :
m_sizeSize( 0 ), m_sizeCapacity( 0 ), m_pData( nullptr )
{}
//////////////////////////////////////////////////////////////////////////
vector( size_t sizeSize, const T &Value = T() ) :
m_sizeSize( sizeSize ), m_sizeCapacity( sizeSize ), m_pData( nullptr )
{
m_pData = new T[m_sizeCapacity];
for( size_t i = 0; i < m_sizeSize; ++i )
{
m_pData[i] = Value;
}
}
//////////////////////////////////////////////////////////////////////////
vector( const vector &vecVector ) :
m_sizeSize( vecVector.m_sizeSize ), m_sizeCapacity( vecVector.m_sizeCapacity ), m_pData( nullptr )
{
m_pData = new T[m_sizeCapacity];
memcpy( m_pData, vecVector.m_pData, m_sizeSize * sizeof( T ) );
}
//////////////////////////////////////////////////////////////////////////
vector( vector &&vecVector ) :
m_sizeSize( vecVector.m_sizeSize ), m_sizeCapacity( vecVector.m_sizeCapacity ), m_pData( vecVector.m_pData )
{
vecVector.m_sizeSize = 0;
vecVector.m_sizeCapacity = 0;
vecVector.m_pData = nullptr;
}
//////////////////////////////////////////////////////////////////////////
~vector()
{
delete [] m_pData;
}
//////////////////////////////////////////////////////////////////////////
vector& operator=( const vector &vecRHS )
{
m_sizeSize = vecRHS.m_sizeSize;
m_sizeCapacity = vecRHS.m_sizeCapacity;
m_pData = new T[m_sizeCapacity];
memcpy( m_pData, vecRHS.m_pData, m_sizeSize * sizeof( T ) );
return *this;
}
//////////////////////////////////////////////////////////////////////////
vector& operator=( vector &&vecRHS )
{
m_sizeSize = vecRHS.m_sizeSize;
m_sizeCapacity = vecRHS.m_sizeCapacity;
delete [] m_pData;
m_pData = vecRHS.m_pData;
vecRHS.m_sizeSize = 0;
vecRHS.m_sizeCapacity = 0;
vecRHS.m_pData = nullptr;
return *this;
}
//////////////////////////////////////////////////////////////////////////
T* data()
{
return m_pData;
}
//////////////////////////////////////////////////////////////////////////
const T* data() const
{
return m_pData;
}
//////////////////////////////////////////////////////////////////////////
void clear()
{
delete [] m_pData;
m_pData = nullptr;
m_sizeSize = 0;
m_sizeCapacity = 0;
}
//////////////////////////////////////////////////////////////////////////
void push_back( T const &Data )
{
if( m_sizeSize == m_sizeCapacity )
{
extend();
}
m_pData[m_sizeSize++] = Data;
}
//////////////////////////////////////////////////////////////////////////
void resize( size_t sizeSize, T val = T() )
{
if( sizeSize != m_sizeSize )
{
m_sizeCapacity = sizeSize;
T *pCopyData = new T[m_sizeCapacity];
memcpy( pCopyData, m_pData, ( ( sizeSize < m_sizeSize ) ? ( sizeSize ) : ( m_sizeSize ) ) * sizeof( T ) );
delete [] m_pData;
m_pData = pCopyData;
if( sizeSize > m_sizeSize )
{
for( size_t i = m_sizeSize; i < sizeSize; ++i )
{
m_pData[i] = val;
}
}
m_sizeSize = sizeSize;
}
}
//////////////////////////////////////////////////////////////////////////
size_t size() const
{
return m_sizeSize;
}
//////////////////////////////////////////////////////////////////////////
bool empty() const
{
if( m_sizeSize == 0 )
{
return true;
}
return false;
}
//////////////////////////////////////////////////////////////////////////
const T& operator[]( size_t sizeIndex ) const
{
return m_pData[sizeIndex];
}
//////////////////////////////////////////////////////////////////////////
T& operator[]( size_t sizeIndex )
{
return m_pData[sizeIndex];
}
};
#endif