OSDN Git Service

Build TortoisProc is okay
[tortoisegit/TortoiseGitJp.git] / src / Git / GitHash.h
1 #pragma once\r
2 #if defined(_MFC_VER)\r
3 #include "afx.h"\r
4 #endif\r
5 #define GIT_HASH_SIZE 20\r
6 \r
7 class CGitHash\r
8 {\r
9         unsigned char m_hash[GIT_HASH_SIZE];\r
10 public:\r
11         CGitHash()\r
12         {\r
13                 memset(m_hash,0, GIT_HASH_SIZE);\r
14         }\r
15         CGitHash(char *p)\r
16         {\r
17                 memcpy(m_hash,p,GIT_HASH_SIZE);\r
18         }\r
19         CGitHash & operator = (CString &str)\r
20         {\r
21                 CGitHash hash(str);\r
22                 *this = hash;\r
23                 return *this;\r
24         }\r
25         CGitHash(CString &str)\r
26         {\r
27                 for(int i=0;i<GIT_HASH_SIZE;i++)\r
28                 {\r
29                         unsigned char a;\r
30                         a=0;\r
31                         for(int j=2*i;j<2*i+1;j++)\r
32                         {\r
33                                 TCHAR ch = str[j];\r
34                                 if(ch >= _T('0') && ch <= _T('9'))\r
35                                         a |= (ch - _T('0'))&0xF;\r
36                                 else if(ch >=_T('A') && ch <= _T('F'))\r
37                                         a |= (ch - _T('A'))&0xF;\r
38                                 else if(ch >=_T('a') && ch <= _T('f'))\r
39                                         a |= (ch - _T('a'))&0xF;\r
40                                 \r
41                                 a =a<<4;\r
42                         }\r
43                         m_hash[i]=a;\r
44                 }\r
45         }\r
46         void Empty()\r
47         {\r
48                 memset(m_hash,0, GIT_HASH_SIZE);\r
49         }\r
50         bool IsEmpty()\r
51         {\r
52                 for(int i=0;i<GIT_HASH_SIZE;i++)\r
53                 {\r
54                         if(m_hash[i] != 0)\r
55                                 return false;\r
56                 }\r
57                 return true;\r
58         }\r
59         \r
60         CString ToString()\r
61         {\r
62                 CString str;\r
63                 CString a;\r
64                 for(int i=0;i<GIT_HASH_SIZE;i++)\r
65                 {\r
66                         a.Format(_T("%02X"),m_hash[i]);\r
67                         str+=a;\r
68                 }\r
69                 return str;\r
70         }\r
71         operator CString ()\r
72         { \r
73                 return ToString(); \r
74         } \r
75 \r
76         bool operator == (const CGitHash &hash)\r
77         {\r
78                 return memcmp(m_hash,hash.m_hash,GIT_HASH_SIZE) == 0;\r
79         }\r
80         \r
81         \r
82         friend bool operator<(const CGitHash& left, const CGitHash& right)\r
83         {\r
84                 return memcmp(left.m_hash,right.m_hash,GIT_HASH_SIZE) < 0;\r
85         }\r
86 \r
87         friend bool operator>(const CGitHash& left, const CGitHash& right)\r
88         {\r
89                 return memcmp(left.m_hash, right.m_hash, GIT_HASH_SIZE) > 0;\r
90         }\r
91 \r
92 #if defined(_MFC_VER)\r
93         friend CArchive& AFXAPI operator<<(CArchive& ar, CGitHash& hash)\r
94         {\r
95                 for(int i=0;i<GIT_HASH_SIZE;i++)\r
96                         ar<<hash.m_hash[i];\r
97                 return ar;\r
98         }\r
99         friend CArchive& AFXAPI operator>>(CArchive& ar, CGitHash& hash)\r
100         {\r
101                 for(int i=0;i<GIT_HASH_SIZE;i++)\r
102                         ar>>hash.m_hash[i];\r
103                 return ar;\r
104         }\r
105 #endif\r
106 };\r
107 \r