SqlitePage::BlockAreas SqlitePage::freeBlocks() { BlockAreas freeBlockAreaList; CellList cellList = this->cellList(); // FIXIT if (cellList.empty()) { return freeBlockAreaList; } BlockArea firstBlock; PageHeader header = pageHeader(); // FIXIT: 8 is not good firstBlock.begin = header.numOfCells * 2 + 8; firstBlock.end = cellList[cellList.size() - 1].offset - 1; freeBlockAreaList.push_back(firstBlock); if (cellList.size() > 1) { // Cell List 是自底向上增长的,所以这里使用反向迭代器遍历 CellList::reverse_iterator rpos; for (rpos = cellList.rbegin(); rpos != cellList.rend(); ++rpos) { BlockArea block; block.begin = rpos->offset; block.end = rpos->offset + rpos->length; CellList::reverse_iterator tmp_rpos = rpos + 1; if (block.end < tmp_rpos->offset - kMinFreeBlockSize && block.end < page_.size() - kMinFreeBlockSize) { freeBlockAreaList.push_back(block); } } } return freeBlockAreaList; }
void InfoPanel::buildInfoPage(Selection sel, Universe* universe, double tdb) { QString pageText; QTextStream stream(&pageText, QIODevice::WriteOnly); pageHeader(stream); if (sel.body() != NULL) { buildSolarSystemBodyPage(sel.body(), tdb, stream); } else if (sel.star() != NULL) { buildStarPage(sel.star(), universe, tdb, stream); } else if (sel.deepsky() != NULL) { buildDSOPage(sel.deepsky(), universe, stream); } else { stream << "Error: no object selected!\n"; } pageFooter(stream); textBrowser->setHtml(pageText); }
SqlitePage::CellPointers SqlitePage::cellPointers() { CellPointers cellPointers; base::bytes_it cellPtrsStart = cellPointersOffset(); int offset = 0; for (int i = 0; i < pageHeader().numOfCells; ++i) { base::byte_t* b = &(*(cellPtrsStart + offset)); uint32_t cellOffset = getValueFromMem<uint32_t>((char *)b, 2); cellPointers.push_back(cellOffset); offset += 2; } return cellPointers; }