自己的底层代码库(十六)——数组模板

这里放上一个数组模板,主要是封装了一下[]运算符,=运算符的重载,来提供对数组的操作,把一个数组当成一个对象处理

其他功能函数,诸如拷贝构造之类,暂时就不写了,需要的可以加上。


数组长度作为模板参数传入。

这里处理了一下长度参数的合法性问题,对于负数,或者比较大的正数,默认生成为长度为1的数组。

参考模板 能否按区间 进行特化,采用了8楼提供的方式,在此感谢


7.10修改,数组模板继承之前的容器类基类


上代码

TArray.h:

#ifndef _TArray_h_
#define _TArray_h_

#include 

#include "TContainer.h"

const unsigned int MAX_ARRAY_LEN = 0xffff;

//1维数组模板
template 
class TArray1 : public TContainer
{
public:
	TArray1();
	virtual ~TArray1();

	void Init(ContainerFlag dwLock = enum_EnableLock);

	T *GetHead();

	T *GetNext(T *curr);

	void *GetNode(T *curr);

	TArray1& operator= (const TArray1& temp);
	T& operator[] (unsigned int index);

private:
	T m_array[(0 < len && len <= MAX_ARRAY_LEN) ? len : 1];
	unsigned __int64 m_HeadAddr;
	unsigned __int64 m_TailAddr;
};

#include "TArray.hpp"

#endif


TArray.hpp:

#ifndef _TArray_hpp_
#define _TArray_hpp_

template 
TArray1::TArray1()
{
	Init();
}

template 
TArray1::~TArray1()
{

}

template 
void TArray1::Init(ContainerFlag dwLock)
{
	m_dwLen = (0 < len && len <= MAX_ARRAY_LEN) ? len : 1;
	m_dwLock = dwLock;
	m_HeadAddr = reinterpret_cast(&(m_array[0]));
	m_TailAddr = reinterpret_cast(&(m_array[m_dwLen - 1]));
}

template 
T *TArray1::GetHead()
{
	return &(m_array[0]);
}

template 
T *TArray1::GetNext(T *curr)
{
	unsigned __int64 currAddr = reinterpret_cast(curr);
	if (m_HeadAddr <= currAddr && currAddr <= m_TailAddr)
	{
		unsigned __int64 addr = m_TailAddr - currAddr;
		if (addr % sizeof(T) == 0)
		{
			if (addr >= sizeof(T))
			{
				return curr + 1;
			}
			else
			{
				return NULL;
			}
		}
	}
	return &(m_array[0]);
}

template 
void *TArray1::GetNode(T *curr)
{
	unsigned __int64 currAddr = reinterpret_cast(curr);
	if (m_HeadAddr <= currAddr && currAddr <= m_TailAddr)
	{
		unsigned __int64 addr = m_TailAddr - currAddr;
		if (addr % sizeof(T) == 0)
		{
			return curr;
		}
	}
	return &(m_array[0]);
}

template 
T& TArray1::operator[] (unsigned int index)
{
	if (index < m_dwLen)
	{
		return m_array[index];
	}
	else
	{
		return m_array[0];
	}
}

template 
TArray1& TArray1::operator= (const TArray1& temp)
{
	for (unsigned int i = 0; i < m_dwLen; i++)
	{
		m_array[i] = temp.m_array[i];
	}
	return *this;
}

#endif


你可能感兴趣的:(C++)