📄 identity.h
字号:
#ifndef identity_h_
#define identity_h_
#pragma warning(push, 3)
#include <set>
#include <string>
#pragma warning(pop)
#include "BellsMacrosX.h"
enum {
fltUndefined = 0,
fltNoFilter = 1,
fltAutoNumber = 2,
fltPrimaryKey = 4,
fltUniqueIndex = 8,
fltRelation = 16,
};
/*
typedef long Identity;
#define ID_NULL (0x80000000)
#define ID_NOT_DEF (0)
inline bool IsValid(Identity id) { return id > 0; }
*/
using std::wstring;
class CIdentityShared
{
friend class Identity;
typedef std::set<wstring> CharIds;
CharIds m_charIds;
};
class Identity
{
friend inline bool IsValid(Identity);
protected:
enum { NullValue = 0x80000000 };
DWORD m_val;
public:
Identity() { m_val = 0; } // not defined
Identity(long val)
{
ASSERT(val > 0);
m_val = val;
}
void Set(const _variant_t& val, CIdentityShared& context)
{
switch (val.vt)
{
case VT_I4:
ASSERT(val.lVal > 0);
m_val = val.lVal;
break;
case VT_BSTR:
Set(val.bstrVal, context);
break;
case VT_NULL:
m_val = (DWORD) NullValue;
break;
case VT_DECIMAL:
ASSERT(0 == val.decVal.Hi32 && 0 == val.decVal.Mid32 && 0 == val.decVal.scale);
m_val = val.decVal.Lo32;
break;
default: ASSERT(0); m_val = 0;
}
}
void Set(LPCWSTR val, CIdentityShared& context)
{
CIdentityShared::CharIds::iterator iter
= context.m_charIds.insert(val).first;
m_val = DWORD(&(*iter)) | 0x80000000;
}
void Get(_variant_t& val) const
{
val.Clear();
if (NullValue == m_val)
val.vt = VT_NULL;
else if (!(m_val & 0x80000000))
val = (long)m_val;
else
{
wstring* pStr
= reinterpret_cast<wstring*>(m_val & 0x7FFFFFFF);
CHECK_ADDRESS(pStr);
val = pStr->c_str();
}
}
bool operator < (Identity other) const { return m_val < other.m_val; }
bool operator != (Identity other) const { return m_val != other.m_val; }
bool operator == (Identity other) const { return m_val == other.m_val; }
UINT GetHashKey() const { return (m_val >= 0)? m_val : m_val >> 4; }
};
class NullIdentity : public Identity
{
public:
NullIdentity() { m_val = (DWORD) NullValue; }
};
//extern Identity ID_NOT_DEF;
#define ID_NOT_DEF Identity()
#define ID_NULL NullIdentity()
//extern Identity NullLongData;
inline bool IsValid(Identity id) { return (id.m_val & 0x7FFFFFFF) != 0; }
template <> AFX_INLINE UINT AFXAPI HashKey<Identity> (Identity key)
{
return key.GetHashKey();
}
//bool operator < (Identity, Identity);
//bool operator != (Identity, Identity);
//bool operator == (Identity, Identity);
#endif// identity_h_
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -