--- /dev/null
+#pragma once\r
+#if defined(_MFC_VER)\r
+#include "afx.h"\r
+#endif\r
+#define GIT_HASH_SIZE 20\r
+\r
+class CGitHash\r
+{\r
+public:\r
+ unsigned char m_hash[GIT_HASH_SIZE];\r
+\r
+ CGitHash()\r
+ {\r
+ memset(m_hash,0, GIT_HASH_SIZE);\r
+ }\r
+ CGitHash(char *p)\r
+ {\r
+ memcpy(m_hash,p,GIT_HASH_SIZE);\r
+ }\r
+ CGitHash & operator = (CString &str)\r
+ {\r
+ CGitHash hash(str);\r
+ *this = hash;\r
+ return *this;\r
+ }\r
+ CGitHash(CString &str)\r
+ {\r
+ for(int i=0;i<GIT_HASH_SIZE;i++)\r
+ {\r
+ unsigned char a;\r
+ a=0;\r
+ for(int j=2*i;j<=2*i+1;j++)\r
+ {\r
+ a =a<<4;\r
+\r
+ TCHAR ch = str[j];\r
+ if(ch >= _T('0') && ch <= _T('9'))\r
+ a |= (ch - _T('0'))&0xF;\r
+ else if(ch >=_T('A') && ch <= _T('F'))\r
+ a |= ((ch - _T('A'))&0xF) + 10 ;\r
+ else if(ch >=_T('a') && ch <= _T('f'))\r
+ a |= ((ch - _T('a'))&0xF) + 10; \r
+ \r
+ }\r
+ m_hash[i]=a;\r
+ }\r
+ }\r
+ void Empty()\r
+ {\r
+ memset(m_hash,0, GIT_HASH_SIZE);\r
+ }\r
+ bool IsEmpty()\r
+ {\r
+ for(int i=0;i<GIT_HASH_SIZE;i++)\r
+ {\r
+ if(m_hash[i] != 0)\r
+ return false;\r
+ }\r
+ return true;\r
+ }\r
+ \r
+ CString ToString()\r
+ {\r
+ CString str;\r
+ CString a;\r
+ for(int i=0;i<GIT_HASH_SIZE;i++)\r
+ {\r
+ a.Format(_T("%02x"),m_hash[i]);\r
+ str+=a;\r
+ }\r
+ return str;\r
+ }\r
+ operator CString ()\r
+ { \r
+ return ToString(); \r
+ } \r
+\r
+ bool operator == (const CGitHash &hash)\r
+ {\r
+ return memcmp(m_hash,hash.m_hash,GIT_HASH_SIZE) == 0;\r
+ }\r
+ \r
+ \r
+ friend bool operator<(const CGitHash& left, const CGitHash& right)\r
+ {\r
+ return memcmp(left.m_hash,right.m_hash,GIT_HASH_SIZE) < 0;\r
+ }\r
+\r
+ friend bool operator>(const CGitHash& left, const CGitHash& right)\r
+ {\r
+ return memcmp(left.m_hash, right.m_hash, GIT_HASH_SIZE) > 0;\r
+ }\r
+\r
+ friend bool operator != (const CGitHash& left, const CGitHash& right)\r
+ {\r
+ return memcmp(left.m_hash, right.m_hash, GIT_HASH_SIZE) != 0;\r
+ }\r
+#if defined(_MFC_VER)\r
+ friend CArchive& AFXAPI operator<<(CArchive& ar, CGitHash& hash)\r
+ {\r
+ for(int i=0;i<GIT_HASH_SIZE;i++)\r
+ ar<<hash.m_hash[i];\r
+ return ar;\r
+ }\r
+ friend CArchive& AFXAPI operator>>(CArchive& ar, CGitHash& hash)\r
+ {\r
+ for(int i=0;i<GIT_HASH_SIZE;i++)\r
+ ar>>hash.m_hash[i];\r
+ return ar;\r
+ }\r
+#endif\r
+};\r
+\r