GME  13
DirSupplier.cpp
Go to the documentation of this file.
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 }