stl pair 应用

csdn编辑器真难用啊,或许是刚开始还不熟悉。

#include <iostream>  
#include <vector>
#include <utility>  
#include <string>  
#include <stdlib.h>
#include <stdio.h>

#if 0
using namespace std;  

typedef	void (*pfunc)(void);

void func_test(void)
{
	cout << "func_test called" << endl;
}
int main (int argc,char *argv[]) 
{  
	pair <string,double> product1 ("tomatoes",3.25);  
	pair <string,double> product2;  
	pair <string,double> product3;  
	   
	product2.first = "lightbulbs"; 	// type of first is string  
	product2.second = 0.99; 		// type of second is double  
	   
	product3 = make_pair ("shoes",20.0);  
	   
	cout << "the price of " << product1.first << " is $" << product1.second << "\n";  
	cout << "the price of " << product2.first << " is $" << product2.second << "\n";  
	cout << "the price of " << product3.first << " is $" << product3.second << "\n";  

	pair <string,double> product4;  
	product4 = pair<string,double>("shoes4",20.0);  
	cout << "the price of " << product4.first << " is $" << product4.second << "\n";  

	pfunc tmyfunc;
	tmyfunc = func_test;
	//tmyfunc();
	(*tmyfunc)();
	pair <string,pfunc> product5("fptr",tmyfunc);
	cout << "the price of " << product5.first << " is $" << product5.second << "\n";  
	cout << "tmyfunc addr: " << tmyfunc << "\n";  
	return 0;  
}  

#else
/*
arm-hisi-linux-g++ pair.cpp 通过
g++没编译通过

arm-hisi-linux-g++ -v
...............................
gcc version 3.4.3 (release) (CodeSourcery ARM Q3cvs 2004)

g++ -v
...............................
gcc 版本 4.7.2 (Ubuntu/Linaro 4.7.2-2ubuntu1)

为了在32ch dvr使用rtsp,写了此demo先测试。每一个ch视频源就是一个rtspserver。
创建32个线程来capture和send太费资源。鉴于客户可以接受同时随机访问
8个ch,因此就可以创建8个资源(rtsp sever)供32个使用者使用。最终封装接口
AddRtspServer(chn)/DelRtspServer(),所有的逻辑/功能都包括了。

此demo增加模板T的话可以实现一个通用的资源申请/资源释放模型

template <typename T>
AddResource(T)/DelResource(T)

一段时间后发现用fastdelegate也可以很方便的实现此需求
CRtspServer		被绑定对象
CRtspManager		主动绑定
逻辑在CRtspManager实现

*/

class CRtspServer
{
public:
	CRtspServer();
	virtual ~CRtspServer();		
	void Start(int chn,int stream);
	void Stop(void);

public:
	int m_id;	//only for test
//private:
	int m_chn;
	int m_stream;
};


/ 单件模式
#define PATTERN_SINGLETON_DECLARE(classname)	\
static classname * instance();

#define PATTERN_SINGLETON_IMPLEMENT(classname)	\
classname * classname::instance()		\
{												\
	static classname * _instance = NULL;		\
	if( NULL == _instance)						\
	{											\
		_instance = new classname;				\
	}											\
	return _instance;							\
}												
/

#define	ID_RTSP_BASE		0x1000
#define	MAX_NRTSPSERVER		8

typedef std::pair <int,CRtspServer *> 		pair_rtsp;
typedef std::vector < pair_rtsp >::iterator	pair_rtsp_iter;
typedef std::vector <pair_rtsp> 			pair_rtsp_vect;

template<typename T>
bool AddResoure(int id,T &t)
{

}
class CRtspManager
{

public:
	PATTERN_SINGLETON_DECLARE(CRtspManager);


	CRtspManager();
	virtual ~CRtspManager();

	void Start(int port=554);
	void Stop();
	int  GetPort() const;

public:
	bool PushRtspServer(int chn, CRtspServer *pserver);
	
	bool AddRtspServer(int chn,int stream=0);
	bool AddRtspServer(int chn, CRtspServer **ppserver);

	void DelRtspServer();
	void DelRtspServer(int chn);
	void DelRtspServer(int chn, CRtspServer **pserver);

	void GetVRtspServer(pair_rtsp_vect &vr) const;
	pair_rtsp_vect GetVRtspServer() const;

	void DumpVrtsp();
	
private:
	int Rtspd_Start(int port);
	int Rtspd_Stop(void);
	int Rtspd_Resume(void);
	int Rtspd_Pause(void);

private:
	int m_nport;
	pair_rtsp_vect m_vrtspserver;

public:
	int m_nserver;
	CRtspServer *m_prtsp[MAX_NRTSPSERVER];

};

CRtspServer::CRtspServer()
{
	m_chn = 0;
	m_stream = 0;
	m_id = m_chn + ID_RTSP_BASE;
}

CRtspServer::~CRtspServer()
{
	Stop();
}

void CRtspServer::Start(int chn,int stream)
{
	m_chn = chn;
	m_stream = stream;
	printf("CRtspServer::Start,ch(%d),stream(%d),id(0x%04x)\n",m_chn,m_stream,m_id);
}

void CRtspServer::Stop(void)
{
	printf("CRtspServer::Stop,ch(%d),stream(%d),id(0x%04x)\n",m_chn,m_stream,m_id);
}



#define g_RtspManager (*CRtspManager::instance())

PATTERN_SINGLETON_IMPLEMENT(CRtspManager);

CRtspManager::CRtspManager()
:m_nport(554)
{
}

CRtspManager::~CRtspManager()
{

}

bool CRtspManager::PushRtspServer(int chn, CRtspServer *pserver)
{
	size_t len = m_vrtspserver.size();
	if(len >= MAX_NRTSPSERVER)
	{
		printf("PushRtspServer,len(%d) exceed max\n",len);
		return false;
	}
				
	pair_rtsp pPair(chn,pserver);
	if(pPair.second)	
	{
		m_vrtspserver.push_back(pPair);
		m_nserver = m_nserver + 1;
		//pserver->Start(chn,pserver->m_stream);
		m_vrtspserver.back().second->Start(chn,pPair.second->m_stream);

		printf("PushRtspServer,ch(%d),stream(%d),id(0x%04x),m_nserver(%d)\n",
			chn,pPair.second->m_stream,pPair.second->m_id,m_nserver);

		return true;
	}
	
	printf("PushRtspServer,ch(%d) failed,PLS new CRtspServer\n",chn);
	
	return false;
}

bool CRtspManager::AddRtspServer(int chn,int stream)
{
	//lock
	pair_rtsp_iter iter;
	for(iter = m_vrtspserver.begin(); iter != m_vrtspserver.end(); iter++)
	{
		if((iter->second->m_chn == chn) && (iter->second->m_stream == stream))
		{
			printf("AddRtspServer,ch(%d) stream(%d) has exist\n",chn,stream);
			return true;
		}
	}
	
	bool ret = false;
	CRtspServer *pserver = new CRtspServer();		

	pserver->m_stream = stream;
	pserver->m_chn = chn;
	pserver->m_id  = 2*chn + stream + ID_RTSP_BASE;
	ret = PushRtspServer(chn,pserver);
	
	return ret;
}	
	
bool CRtspManager::AddRtspServer(int chn, CRtspServer **ppserver)
{
	//lock
	bool ret = false;
	pair_rtsp pPair(chn,*ppserver);
	
	pair_rtsp_iter iter;
	iter = find(m_vrtspserver.begin(), m_vrtspserver.end(), pPair);
	if(iter == m_vrtspserver.end())	//not found
	{
		ret = PushRtspServer(chn,*ppserver);
	}
	else	
	{
	}
	
	return ret;
}	

void CRtspManager::DelRtspServer()
{
	//lock
	printf("DelRtspServer,del all\n");
	if(m_vrtspserver.empty())
	{
		printf("DelRtspServer,veter empty\n");
		return;
	}

	pair_rtsp_iter iter;
	for(iter = m_vrtspserver.begin(); iter != m_vrtspserver.end(); iter++)
	{
		if(iter->second)
		{
			printf("\nDelRtspServer,dle ch(%d),stream(%d),id(0x%04x)\n",
				iter->second->m_chn,iter->second->m_stream,iter->second->m_id);

			delete iter->second;
			iter->second = NULL;
		}
	}
	m_vrtspserver.clear();
	printf("DelRtspServer,del all ~~~\n");
	m_vrtspserver.~ vector <pair_rtsp>();

	m_nserver = 0;
}

void CRtspManager::DelRtspServer(int chn)
{
	//lock
	printf("DelRtspServer,del single chn(%d)\n");
	if(m_vrtspserver.empty())
	{
		printf("DelRtspServer,veter empty\n");
		return;
	}
	
	pair_rtsp_iter iter;
	for(iter = m_vrtspserver.begin(); iter != m_vrtspserver.end(); iter++)
	{
		if( (iter->second) && (iter->second->m_chn == chn) )
		{
			printf("\nDelRtspServer,dle ch(%d),stream(%d),id(0x%04x)\n",
				iter->second->m_chn,iter->second->m_stream,iter->second->m_id);

			delete iter->second;
			iter->second = NULL;
			m_vrtspserver.erase(iter);
			
			m_nserver = m_nserver - 1;
			return;
		}
		else
		{
		}
	}
	
	printf("DelRtspServer,ch(%d) has del or no\n",chn);
}
	
void CRtspManager::DelRtspServer(int chn, CRtspServer **pserver)
{
	//lock
	assert(*pserver);
	if(m_vrtspserver.empty())
	{
		printf("DelRtspServer,veter empty\n");
		return;
	}
	
	pair_rtsp pPair(chn,*pserver);

	pair_rtsp_iter iter;
	iter = find(m_vrtspserver.begin(), m_vrtspserver.end(), pPair);
	if(iter != m_vrtspserver.end())	//found
	{
		printf("\nDelRtspServer,dle ch(%d),stream(%d),id(0x%04x)\n",
			iter->second->m_chn,iter->second->m_stream,iter->second->m_id);
		
		delete *pserver;
		*pserver = NULL;
		m_vrtspserver.erase(iter);
		m_nserver = m_nserver - 1;
	}
	else
	{
		printf("DelRtspServer,ch(%d) has del or no\n",chn);
	}

}	

void CRtspManager::GetVRtspServer(pair_rtsp_vect &vr) const
{
	vr = m_vrtspserver;
}
pair_rtsp_vect CRtspManager::GetVRtspServer() const
{
	return m_vrtspserver;
}

void CRtspManager::DumpVrtsp()
{
	if(m_vrtspserver.empty())
	{
		printf("DumpVrtsp,veter empty\n");
		return;
	}
	
	size_t len = m_vrtspserver.size();
	printf("Vrtsp,len(%d)\n",len);
	
	pair_rtsp_iter iter;
	for(iter = m_vrtspserver.begin(); iter != m_vrtspserver.end(); iter++)
	{
		printf("Vrtsp,id(0x%04x),ch(%d)\n",iter->second->m_id,iter->second->m_chn);
	}
}

void CRtspManager::Start(int port)
{
	m_nserver = 0;
	m_nport = port;
	for (int i = 0; i < 0; i++)
	{
		m_prtsp[i] = new CRtspServer();
		
		m_prtsp[i]->m_chn = i;
		m_prtsp[i]->m_id = i + ID_RTSP_BASE;
		if(AddRtspServer(m_prtsp[i]->m_chn,&g_RtspManager.m_prtsp[g_RtspManager.m_nserver]))
		{
			printf("CRtspManager::Start,AddRtspServer[%d] ok\n\n",g_RtspManager.m_nserver);
		}
	}
	
	for (int i = 0; i < 6; i++)
	{
		AddRtspServer(i);
	}
	
	//sub stream
}


int main (int argc,char *argv[]) 
{
	pair_rtsp_vect m_vrtspserver;
	g_RtspManager.Start();
	g_RtspManager.GetVRtspServer(m_vrtspserver);

	g_RtspManager.DumpVrtsp();

	#if 0
	printf("\n000##################\n");
	g_RtspManager.AddRtspServer(1,&g_RtspManager.m_prtsp[g_RtspManager.m_nserver]);

	g_RtspManager.m_prtsp[g_RtspManager.m_nserver] = new CRtspServer();
	g_RtspManager.m_prtsp[g_RtspManager.m_nserver]->m_chn = 68;
	g_RtspManager.m_prtsp[g_RtspManager.m_nserver]->m_id = ID_RTSP_BASE + 
		g_RtspManager.m_prtsp[g_RtspManager.m_nserver]->m_chn;

	g_RtspManager.AddRtspServer(68,&g_RtspManager.m_prtsp[g_RtspManager.m_nserver]);

	g_RtspManager.AddRtspServer(69);
	
	g_RtspManager.DumpVrtsp();
	
	//g_RtspManager.DelRtspServer();
	printf("\n111##################\n");
	g_RtspManager.DelRtspServer(2,&g_RtspManager.m_prtsp[2]);
	g_RtspManager.DumpVrtsp();
#endif

	printf("\n222##################\n");
	g_RtspManager.AddRtspServer(3);
	g_RtspManager.AddRtspServer(68);
	g_RtspManager.AddRtspServer(100);
	g_RtspManager.DumpVrtsp();

	printf("\n333##################\n");
	g_RtspManager.DelRtspServer(200);
	g_RtspManager.DelRtspServer(100);
	g_RtspManager.DelRtspServer(68);
	g_RtspManager.AddRtspServer(101,0);
	g_RtspManager.AddRtspServer(101,1);
	g_RtspManager.AddRtspServer(101,1);
	g_RtspManager.AddRtspServer(102);
	g_RtspManager.DumpVrtsp();

	printf("\n444##################\n");
	g_RtspManager.DelRtspServer();
	g_RtspManager.DumpVrtsp();

	return 0;
}

#endif


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值