void newEnd(D member) { if(head == nullptr) newHead(member); //Bryn refactor else { add_after(end); end = end->next; } }
unique_ptr<IOBuf> IOBuf::clone() const { unique_ptr<IOBuf> newHead(cloneOne()); for (IOBuf* current = next_; current != this; current = current->next_) { newHead->prependChain(current->cloneOne()); } return newHead; }
//-------------------------------------------------------------- void LayoutManager::positionControl(Control &control, ofVec2f &parentScale, int panelDepth) { // calculate scale ofVec2f curScale = parentScale * control.scale; int indent = panelDepth * control.getConfig()->layout.indent; // update dimensions control.width = control.layout.width * curScale.x;// ? control.layout.width : control.getConfig()->layout.columnWidth - indent) * curScale.x; control.height = control.layout.height * curScale.y;// ? control.layout.height : control.getConfig()->layout.buttonHeight) * curScale.y; // TODO: think about scales switch(control.layout.positionMode) { case LayoutSettings::kRelative: // normal (controls are placed in a free flowing manner, like html, layout.position is offset off calculated) { ofVec2f newHead(_curHead); ofVec2f controlOffset((control.layout.position + control.layout.paddingPre) * curScale); ofVec2f controlPos(newHead + controlOffset); float postHeight = (control.height + control.layout.paddingPost.y + control.getConfig()->layout.padding.y) * curScale.y; // if(control.layout.newColumn || (doWrap && controlPos.y + postHeight > maxPos.y)) { // newHead.x = control.getParent()->getRight() + control.layout.paddingPost.x + control.getConfig()->layout.padding.x; // newHead.y = boundRect.y; // controlPos = newHead + controlOffset; // } control.setPosition(controlPos); control.x += indent * curScale.x; if(control.layout.doAffectFlow) { _curHead = newHead; if(control.height != 0) _curHead.y += postHeight; // dont do padding if height is 0 } } break; case LayoutSettings::kAbsolute: // layout.position is relative to container control.setPosition(control.getParent() ? (control.getParent()->position + control.layout.position) : control.layout.position); break; case LayoutSettings::kFixed: // layout.position is relative to screen control.setPosition(control.layout.position); break; } }
/** * @param head: The first node of linked list. * @return: The new head of reversed linked list. */ ListNode *reverse(ListNode *head) { //special case head == nullptr; ListNode *current(head); ListNode *newHead(nullptr); ListNode *temp(nullptr); if(head!=nullptr) { while(current != nullptr) { // because we need current=current->next to move the cursor // we divide this step into two steps, and in between we can interpolate new heads temp = current->next; current->next = newHead; newHead = current; current = temp; } return newHead; } else return nullptr; }
Address RecordManager::insertRecord(vector<char>& newRecord, string fileName, int recordSize){ Address addr(fileName, 0, 0); Address head(fileName, 0, 0);//head vector<char> headRecord; vector<char> nextBlock; vector<char> nextOffset; int newBlock; int newOffset; int headSize; if (recordSize < 20) headSize = 20; else headSize = recordSize; ///////文件中无记录/////// if (bmanager.getFileBlockNumber(fileName) == 0){ bmanager.createFile(fileName); //清空文件头 newHead(headRecord, headSize); //新纪录位置(0,1) newBlock = 0; newOffset = headSize; //新纪录指向head(不用改了,default) } else{ headRecord = bmanager.read(head, headSize); int size = getSize(headRecord); if (size == 0){ //清空文件头 newHead(headRecord, headSize); //新纪录位置(0,1) newBlock = 0; newOffset = headSize; //新纪录指向head(不用改了,default) } ///////文件中有记录/////// else{ //新纪录位置 setNextAddr(headRecord, nextBlock, nextOffset, headSize- 16);//第一条被删的记录 int delBlock = char4ToInt(nextBlock); int delOffset = char4ToInt(nextOffset); if (delBlock == 0 && delOffset == 0){//没有被删记录 int n;//一块中的记录数 int block = bmanager.getFileBlockNumber(fileName) - 1; int offset; int size = getSize(headRecord);//文件中的记录数(不包括head) if (block == 0){ n = (4096 - headSize) / recordSize;//第一块中的record数 if (size == n){ newBlock = block + 1; newOffset = 0; } else{//size<n newBlock = block; newOffset = headSize + (size%n)*recordSize; } } else{ n = 4096 / recordSize;//其他块中最多能放的record数 if (size == (4096 - headSize) / recordSize+block*n){ newBlock = block + 1; newOffset = 0; } else{ newBlock = block; newOffset = ((size - (4096 - headSize) / recordSize) % n)*recordSize; } } } else{///有被删记录 //空位在(delBlock,delOffset) newBlock = delBlock; newOffset = delOffset; //修改文件头中的del指针,使它指向第二条被删记录 addr.setAddr(fileName, delBlock, delOffset); vector<char> tempRecord = bmanager.read(addr, recordSize); setNextAddr(tempRecord, nextBlock, nextOffset, recordSize - 8); updateRecordPoint(headRecord, nextBlock, nextOffset, headSize - 16); } //newRecord指向第一条记录 setNextAddr(headRecord, nextBlock, nextOffset, headSize - 8); updateRecordPoint(newRecord, nextBlock, nextOffset, recordSize - 8); } } //插入新记录 addr.setAddr(fileName, newBlock, newOffset); bmanager.write(addr, newRecord);//√ //更新head //head指向第一条记录 intToChar4(newBlock, nextBlock); intToChar4(newOffset, nextOffset); updateRecordPoint(headRecord, nextBlock, nextOffset, headSize - 8); //更新head中的size incSize(headRecord); //写回headRecord bmanager.write(head, headRecord);//√ return addr; }