GME
13
|
00001 #include "stdafx.h" 00002 #include "DirSupplier.h" 00003 00004 00005 // DirSupplier 00006 00007 DirSupplier::DirSupplier( bool p_hashed, int p_algorithm) 00008 : m_hashed( p_hashed) 00009 , m_algo( p_algorithm) 00010 { 00011 } 00012 00013 Dir256Iterator DirSupplier::begin256() const 00014 { 00015 return * Dir256Iterator::createIteratorBeg(); 00016 } 00017 00018 Dir256Iterator DirSupplier::end256() const 00019 { 00020 return * Dir256Iterator::createIteratorEnd(); 00021 } 00022 00023 00024 Dir16Iterator DirSupplier::begin16() const 00025 { 00026 return * Dir16Iterator::createIteratorBeg(); 00027 } 00028 00029 Dir16Iterator DirSupplier::end16() const 00030 { 00031 return * Dir16Iterator::createIteratorEnd(); 00032 } 00033 00034 Dir256Iterator::Dir256Iterator( bool p_endIterator /*= false*/) 00035 : m_i(0) 00036 , m_j(0) 00037 , m_algo( 0) 00038 { 00039 if( p_endIterator) 00040 { 00041 m_i = m_j = m_max; 00042 } 00043 } 00044 00045 //static 00046 Dir256Iterator* Dir256Iterator::createIteratorBeg() 00047 { 00048 return new Dir256Iterator(); 00049 } 00050 00051 //static 00052 Dir256Iterator* Dir256Iterator::createIteratorEnd() 00053 { 00054 return new Dir256Iterator( true); 00055 } 00056 00057 std::string Dir256Iterator::operator *() const 00058 { 00059 static const char ans[] = "0123456789abcdef"; 00060 char lev[3] = { 'z', 't', 0 }; 00061 00062 if( m_i > (int) sizeof( ans)/sizeof(char) || m_i < 0 00063 || m_j > (int) sizeof( ans)/sizeof(char) || m_j < 0) 00064 return lev; 00065 00066 lev[0] = ans[ m_i]; // form a name 00067 lev[1] = ans[ m_j]; 00068 00069 return lev; 00070 } 00071 00072 Dir256Iterator& Dir256Iterator::operator++() 00073 { 00074 if( ++m_j >= m_max) 00075 { 00076 m_j = 0; 00077 ++m_i; 00078 } 00079 00080 return *this; 00081 } 00082 00083 Dir256Iterator::operator bool() const 00084 { 00085 return m_i < m_max 00086 && m_j < m_max; 00087 } 00088 00089 bool Dir256Iterator::operator()() const 00090 { 00091 return m_i < m_max 00092 && m_j < m_max; 00093 } 00094 00095 bool Dir256Iterator::operator !=( const Dir256Iterator& p_peer) const 00096 { 00097 if( &p_peer == this) 00098 return false; 00099 00100 bool me_valid = (*this); 00101 bool peer_valid = p_peer; 00102 00103 if( me_valid && peer_valid) // examine details only if both are valid 00104 { 00105 if( m_i == p_peer.m_i 00106 && m_j == p_peer.m_j) 00107 { 00108 return false; 00109 } 00110 } 00111 else if( !me_valid && !peer_valid) // both invalid 00112 return false; 00113 00114 return true; 00115 } 00116 00117 Dir16Iterator::Dir16Iterator( bool p_endIterator /*= false*/) 00118 : m_i(0) 00119 , m_algo( 0) 00120 { 00121 if( p_endIterator) 00122 { 00123 m_i = m_max; 00124 } 00125 } 00126 00127 //static 00128 Dir16Iterator* Dir16Iterator::createIteratorBeg() 00129 { 00130 return new Dir16Iterator( ); 00131 } 00132 00133 //static 00134 Dir16Iterator* Dir16Iterator::createIteratorEnd() 00135 { 00136 return new Dir16Iterator( true); 00137 } 00138 00139 std::string Dir16Iterator::operator *() const 00140 { 00141 // we will create 16 dirs like 0, 1, 2, ..., f 00142 static const char ans[] = "0123456789abcdef"; 00143 char lev[2] = { 'z', 0 }; 00144 00145 if( m_i > (int) sizeof( ans)/sizeof(char) || m_i < 0) 00146 return lev; 00147 00148 lev[0] = ans[ m_i]; // form a name 00149 return lev; 00150 } 00151 00152 Dir16Iterator& Dir16Iterator::operator++() 00153 { 00154 ++m_i; 00155 00156 return *this; 00157 } 00158 00159 Dir16Iterator::operator bool() const 00160 { 00161 return m_i < m_max; 00162 } 00163 00164 bool Dir16Iterator::operator()() const 00165 { 00166 return m_i < m_max; 00167 } 00168 00169 bool Dir16Iterator::operator !=( const Dir16Iterator& p_peer) const 00170 { 00171 if( &p_peer == this) 00172 return false; 00173 00174 bool me_valid = (*this); 00175 bool peer_valid = p_peer; 00176 00177 if( me_valid && peer_valid) // examine details only if both are valid 00178 { 00179 if( m_i == p_peer.m_i) 00180 return false; 00181 } 00182 else if( !me_valid && !peer_valid) // both invalid 00183 return false; 00184 00185 return true; 00186 }