recursive
| 100 | |
| 101 | // recursive |
| 102 | CAICHHashTree* CAICHHashTree::FindHash(uint64 nStartPos, uint64 nSize, uint8* nLevel) |
| 103 | { |
| 104 | (*nLevel)++; |
| 105 | |
| 106 | wxCHECK(*nLevel <= 22, NULL); |
| 107 | wxCHECK(nStartPos + nSize <= m_nDataSize, NULL); |
| 108 | wxCHECK(nSize <= m_nDataSize, NULL); |
| 109 | |
| 110 | if (nStartPos == 0 && nSize == m_nDataSize) { |
| 111 | // this is the searched hash |
| 112 | return this; |
| 113 | } else if (m_nDataSize <= m_nBaseSize) { // sanity |
| 114 | // this is already the last level, can't go deeper |
| 115 | wxFAIL; |
| 116 | return NULL; |
| 117 | } else { |
| 118 | uint64 nBlocks = m_nDataSize / m_nBaseSize + ((m_nDataSize % m_nBaseSize != 0 )? 1:0); |
| 119 | uint64 nLeft = (((m_bIsLeftBranch) ? nBlocks+1:nBlocks) / 2)* m_nBaseSize; |
| 120 | uint64 nRight = m_nDataSize - nLeft; |
| 121 | if (nStartPos < nLeft) { |
| 122 | if (nStartPos + nSize > nLeft) { // sanity |
| 123 | wxFAIL; |
| 124 | return NULL; |
| 125 | } |
| 126 | |
| 127 | if (m_pLeftTree == NULL) { |
| 128 | m_pLeftTree = new CAICHHashTree(nLeft, true, (nLeft <= PARTSIZE) ? EMBLOCKSIZE : PARTSIZE); |
| 129 | } else { |
| 130 | wxASSERT( m_pLeftTree->m_nDataSize == nLeft ); |
| 131 | } |
| 132 | |
| 133 | return m_pLeftTree->FindHash(nStartPos, nSize, nLevel); |
| 134 | } else { |
| 135 | nStartPos -= nLeft; |
| 136 | if (nStartPos + nSize > nRight) { // sanity |
| 137 | wxFAIL; |
| 138 | return NULL; |
| 139 | } |
| 140 | |
| 141 | if (m_pRightTree == NULL) { |
| 142 | m_pRightTree = new CAICHHashTree(nRight, false, (nRight <= PARTSIZE) ? EMBLOCKSIZE : PARTSIZE); |
| 143 | } else { |
| 144 | wxASSERT( m_pRightTree->m_nDataSize == nRight ); |
| 145 | } |
| 146 | |
| 147 | return m_pRightTree->FindHash(nStartPos, nSize, nLevel); |
| 148 | } |
| 149 | } |
| 150 | } |
| 151 | |
| 152 | |
| 153 | // recursive |
no outgoing calls
no test coverage detected