📄 seqid.h
字号:
#ifndef INCLUDED_SEQID_H
#define INCLUDED_SEQID_H
#if defined(HAS_PRAGMA_ONCE)
#pragma PRAGMA_ONCE_DECLARE
#endif
namespace acl
{
/// no lock policy implement
struct LockNothing
{
void Lock(){}
void Unlock(){}
};
template<typename LockPolicy>
class BasicSequenceGenerator
{
public:
BasicSequenceGenerator(unsigned int min=MIN_ID, unsigned int max=MAX_ID)
: m_min(min)
, m_max(max)
{
if(m_min <= SELF_ID)
m_min = SELF_ID+1;
m_idseq = m_min;
}
static unsigned int getSelf()
{
return SELF_ID;
}
static bool isSelf(unsigned int id)
{
return id == SELF_ID;
}
static unsigned int getInvalid()
{
return INVALID_ID;
}
static bool isValid(unsigned int id)
{
return id != INVALID_ID;
}
unsigned int next()
{
ScopeLocker<LockPolicy> scope_cs(m_cs);
if(++m_idseq >= m_max)
m_idseq = m_min;
return m_idseq;
}
private:
LockPolicy m_cs;
unsigned int m_min;
unsigned int m_max;
unsigned int m_idseq;
enum
{
INVALID_ID = 0x00000000
};
enum
{
SELF_ID = 0x00000001
};
enum
{
MIN_ID = 0x00001000
};
enum
{
MAX_ID = 0x8FFFFFFF
};
};
typedef BasicSequenceGenerator<CTCriticalSection> SequenceGenerator;
typedef BasicSequenceGenerator<LockNothing> SingleThreadSequenceGenerator;
}
typedef acl::SequenceGenerator CTSequenceGenerator;
typedef acl::SingleThreadSequenceGenerator CTSingleThreadSequenceGenerator;
/************************************************************************/
/* Change Log: */
/* add lock policy to SequenceGenerator, default policy use critical section */
/* change lock policy can make it more efficiency in single thread environment */
/************************************************************************/
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -