⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xmlcache.cpp

📁 可移植的xml库。已经在windows和linux上测试通过。只使用C++ Runtine
💻 CPP
字号:
//xmlcache.cpp

#include "xml.h"

CLock::CLock()
{
#ifdef WIN32
	m_mut = CreateMutex(0,FALSE,0);
	assert(m_mut);
#else
	pthread_mutex_init(&m_mut);
#endif
}

CLock::~CLock()
{
#ifdef WIN32
	if(m_mut) CloseHandle(m_mut);
#else
	pthread_mutex_destroy(&m_mut);
#endif
}

void CLock::lock()
{
#ifdef WIN32
	WaitForSingleObject(m_mut,(unsigned long)-1);
#else
	pthread_mutex_lock(&m_mut);
#endif
}

void CLock::unlock()
{
#ifdef WIN32
	ReleaseMutex(m_mut);
#else
	pthread_mutex_unlock(&m_mut);
#endif
}

CXMLAttribCache::CXMLAttribCache() : m_alimit(0),m_flimit(0),m_acount(0),m_fcount(0),m_last(0),m_first(0)
{
}

CXMLAttribCache::~CXMLAttribCache()
{
	clean();
}

void CXMLAttribCache::clean()
{
	m_lock.lock();
	CXMLAttrib *a = m_first;
	m_first = m_last = 0;
	m_acount = m_fcount = 0;
	m_lock.unlock();
	if(a) delete a;
}

void CXMLAttribCache::saveup(CXMLAttrib *a)
{
	if(a->getNext())
	{
		for(CXMLAttrib *p=a;p;)
		{
			a = a->getNext();
			p->setNext(0);
			p->setPrev(0);
			saveup(p);
			p = a;
		}
		return;
	}
	a->setNode(0);
	m_lock.lock();
	if(!m_flimit || m_fcount<m_flimit)
	{
		if(!m_first)
		{
			assert(!m_last);
			m_first = m_last = a;
		}
		else
		{
			a->setNext(m_first);
			m_first->setPrev(a);
			m_first = a;
		}
		++m_fcount;
		a = 0;
	}
	m_lock.unlock();
	if(a){--m_acount;delete a;}
}

CXMLAttrib* CXMLAttribCache::reuse(bool nonew)
{
	m_lock.lock();
	CXMLAttrib *a = m_first;
	if(m_first)
	{
		if(m_first==m_last) m_first = m_last = 0;
		else
		{
			m_first = m_first->getNext();
			m_first->setPrev(0);
		}
		a->setPrev(0);
		a->setNext(0);
	}
	m_lock.unlock();
	if(!a && !nonew && (!m_alimit || m_acount<m_alimit))
	{
		a = new CXMLAttrib;
		if(a) ++m_acount;
	}
	if(a) a->setCache(this);
	return a;
}

CXMLNodeCache::CXMLNodeCache() : m_alimit(0),m_flimit(0),m_acount(0),m_fcount(0),m_last(0),m_first(0)
{
}

CXMLNodeCache::~CXMLNodeCache()
{
	clean();
}

void CXMLNodeCache::clean()
{
	m_lock.lock();
	CXMLNode *x = m_first;
	m_first = m_last = 0;
	m_acount = m_fcount = 0;
	m_lock.unlock();
	if(x) delete x;
}

void CXMLNodeCache::saveup(CXMLNode *x)
{
	if(x->getNext())
	{	
		for(CXMLNode *p=x;p;)
		{
			x = x->getNext();
			p->setNext(0);
			p->setPrev(0);
			saveup(p);
			p = x;
		}
		return;
	}
	if(x->getFirstChild()) saveup(x->removeChildrenTree());
	x->setParent(0);
	if(x->getFirstAttrib()) m_xac.saveup(x->removeAttribTree());
	m_lock.lock();
	if(!m_flimit || m_fcount<m_flimit)
	{
		if(!m_first)
		{
			assert(!m_last);
			m_first = m_last = x;
		}
		else
		{
			x->setNext(m_first);
			m_first->setPrev(x);
			m_first = x;
		}
		++m_fcount;
		x = 0;
	}
	m_lock.unlock();
	if(x){--m_acount;delete x;}
}

CXMLNode* CXMLNodeCache::reuse(bool nonew)
{
	m_lock.lock();
	CXMLNode *x = m_first;
	if(m_first)
	{
		if(m_first==m_last) m_first = m_last = 0;
		else
		{
			m_first = m_first->getNext();
			m_first->setPrev(0);
		}
		x->setNext(0);
	}
	m_lock.unlock();
	if(!x && !nonew && (!m_alimit || m_acount<m_alimit))
	{
		x = new CXMLNode;
		if(x) ++m_acount;
	}
	if(x) x->setCache(this);
	return x;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -