
/*
 * binary_buf是二进制缓存
 * 这里用字符串，来存储雷达的通信消息的原始数据
 * Binary_buf 的内容格式：消息类型 + 消息数据
 *
 * 例如思科的雷达的消息类型
 * ready->ready->start->data->data->data->stop->ready->ready
 *
 * 提供了 is_equal 系列的函数，来进行判断前面的消息类型
 * 
 * 注意了：m_buf是中间可以允许有‘\0’的，不是单纯的字符串格式
 * 			末尾也不一定是‘\0’
 */

#include "binary_buf.h"

#include <string>
#include <string.h>

Binary_buf::Binary_buf()
{
	mp_buf = NULL;
	m_length = 0;
}

Binary_buf::Binary_buf(const Binary_buf& other)
{
	mp_buf = NULL;
	m_length = 0;

	if ( other.m_length > 0 && other.mp_buf != NULL)
	{
		mp_buf = (char*)malloc(other.m_length);
		memcpy(mp_buf, other.mp_buf, other.m_length);
		m_length = other.m_length;
	}
}

Binary_buf::~Binary_buf()
{
	if ( mp_buf )
	{
		free(mp_buf);
		mp_buf = NULL;
	}
	m_length = 0;

//	std::cout << "Binary_buf::~Binary_buf()" << std::endl;
}


//使用参数构造，深拷贝，len为0时，使用strlen(buf)，不存储结束符'\0'
Binary_buf::Binary_buf(const char* p_buf, int len)
{
	mp_buf = NULL;
	m_length = 0;

	if ( p_buf != NULL)
	{
		if (len <= 0)
		{
			len = strlen(p_buf);
		}

		mp_buf = (char*)malloc(len);
		memcpy(mp_buf, p_buf, len);
		m_length = len;
	}
}


//使用参数构造，深拷贝，len为0时，使用strlen(buf)，不存储结束符'\0'
Binary_buf::Binary_buf(char* p_buf, int len)
{
	mp_buf = NULL;
	m_length = 0;

	if ( p_buf != NULL)
	{
		if (len <= 0)
		{
			len = strlen(p_buf);
		}

		mp_buf = (char*)malloc(len);
		memcpy(mp_buf, p_buf, len);
		m_length = len;
	}
}

//重载=，深拷贝，
Binary_buf& Binary_buf::operator=(const Binary_buf& other)
{
	clear();

	if ( other.m_length > 0 && other.mp_buf != NULL)
	{
		mp_buf = (char*)malloc(other.m_length);
		memcpy(mp_buf, other.mp_buf, other.m_length);
		m_length = other.m_length;
	}
	return *this;
}

//重载=，深拷贝，使用strlen(buf)，不存储结束符'\0'
Binary_buf& Binary_buf::operator=(const char* p_buf)
{
	clear();

	if ( p_buf != NULL)
	{
		int len = strlen(p_buf);
		mp_buf = (char*)malloc(len);
		memcpy(mp_buf, p_buf, len);
		m_length = len;
	}
	return *this;
}

//重载+，other追加在this的后面，
Binary_buf& Binary_buf::operator+(Binary_buf& other)
{
	if (other.mp_buf != NULL && other.m_length > 0)
	{
		int t_length_total = m_length + other.m_length;
		char* tp_buf_total = (char*)malloc(t_length_total);
		memcpy(tp_buf_total, mp_buf, m_length);
		memcpy(tp_buf_total + m_length, other.mp_buf, other.m_length);
		free(mp_buf);
		mp_buf = tp_buf_total;
		m_length = t_length_total;
	}
	return *this;
}

//重载+，追加在this的后面，使用strlen(buf)，不存储结束符'\0'
Binary_buf& Binary_buf::operator+(const char* p_buf)
{
	if (p_buf != NULL )
	{
		int t_length_back = strlen(p_buf);
		int t_length_total = m_length + t_length_back;
		char* tp_buf_total = (char*)malloc(t_length_total);
		memcpy(tp_buf_total, mp_buf, m_length);
		memcpy(tp_buf_total + m_length, p_buf, t_length_back);
		free(mp_buf);
		mp_buf = tp_buf_total;
		m_length = t_length_total;
	}
	return *this;
}

//重载[]，允许直接使用数组的形式，直接访问buf的内存。注意，n值必须在0～m_length之间，
char& Binary_buf::operator[](int n)
{
	if (n >= 0 && n < m_length)
	{
		return mp_buf[n];
	}
	else
	{
		throw (n);
	}
}


//判空
bool Binary_buf::is_empty()
{
	if ( mp_buf != NULL && m_length > 0 )
	{
		return false;
	}
	else
	{
		return true;
	}
}

//清空
void Binary_buf::clear()
{
	if ( mp_buf )
	{
		free(mp_buf);
		mp_buf = NULL;
	}
	m_length = 0;
}


//比较前面部分的buf是否相等，使用 other.m_length 为标准
bool Binary_buf::is_equal_front(const Binary_buf& other)
{
	if ( other.mp_buf == NULL || other.m_length <= 0 )
	{
		if ( mp_buf == NULL || m_length <= 0 )
		{
			return true;
		}
		else
		{
			return false;
		}
	}
	else
	{
		if ( mp_buf != NULL && m_length > 0 )
		{
			if ( other.m_length > m_length )
			{
				return false;
			}
			return  (strncmp((const char*)mp_buf, other.mp_buf, other.m_length) == 0);
		}
		else
		{
			return false;
		}

	}
}

//比较前面部分的buf是否相等，len为0时，使用strlen(buf)为标准，不比较结束符'\0'
bool Binary_buf::is_equal_front(const char* p_buf, int len)
{
	if ( p_buf == NULL )
	{
		if ( mp_buf == NULL || m_length <= 0 )
		{
			return true;
		}
		else
		{
			return false;
		}
	}
	else
	{
		if ( mp_buf != NULL && m_length > 0 )
		{
			if ( len == 0 )
			{
				len = strlen(p_buf);
			}
			if ( len > m_length )
			{
				return false;
			}
			return  (strncmp((const char*)mp_buf, p_buf, len) == 0);
		}
		else
		{
			return false;
		}

	}
}

//比较的buf是否全部相等，
bool Binary_buf::is_equal_all(const Binary_buf& other)
{
	if ( other.mp_buf == NULL || other.m_length <= 0 )
	{
		if ( mp_buf == NULL || m_length <= 0 )
		{
			return true;
		}
		else
		{
			return false;
		}
	}
	else
	{
		if ( mp_buf != NULL && m_length > 0 )
		{
			if ( other.m_length != m_length )
			{
				return false;
			}
			return  (strncmp((const char*)mp_buf, other.mp_buf, other.m_length) == 0);
		}
		else
		{
			return false;
		}

	}
}
//比较的buf是否全部相等，不比较结束符'\0'
bool Binary_buf::is_equal_all(const char* p_buf)
{
	if ( p_buf == NULL )
	{
		if ( mp_buf == NULL || m_length <= 0 )
		{
			return true;
		}
		else
		{
			return false;
		}
	}
	else
	{
		if ( mp_buf != NULL && m_length > 0 )
		{
			int	len = strlen(p_buf);
			if ( len != m_length )
			{
				return false;
			}
			return  (strncmp((const char*)mp_buf, p_buf, len) == 0);
		}
		else
		{
			return false;
		}

	}
}




char*	Binary_buf::get_buf()const
{
	return mp_buf;
}

int		Binary_buf::get_length()const
{
	return m_length;
}





