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

📄 identity.h

📁 Data Replication Prototype Using ADO
💻 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 + -