OSDN Git Service

merge original branch.
[tortoisegit/TortoiseGitJp.git] / src / Git / GitHash.h
diff --git a/src/Git/GitHash.h b/src/Git/GitHash.h
new file mode 100644 (file)
index 0000000..4d65ba7
--- /dev/null
@@ -0,0 +1,113 @@
+#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