int HaploTree::AddHaplotype(const IntArray & state) { int branch = 0; for (int i = 0; i < depth; i++) branch = GetBranch(branch, state[i]); return branch; }
void CasterTrunkContainer::RemovePlayer(AvatarSrv* pPlayer, int32 nBranchID) { PlayerBranchContainer* pBranch = GetBranch( nBranchID, true); if( pBranch ) { int32 nID = m_bByNode ? pPlayer->GetAvatarID() : pPlayer->GetGateChannelID(); if( pBranch->RemovePlayer( nID, pPlayer) ) { if( pBranch->m_mapPlayers.size() == 0) RemoveBranch( pBranch ); } } }
void CasterTrunkContainer::AddPlayer(AvatarSrv* pPlayer, int32 nBranchID) { if( nBranchID != SERVERID_NULL ) { PlayerBranchContainer* pBranch = GetBranch( nBranchID, true); if( pBranch ) { if( m_bByNode ) { int32 nAvatarID = pPlayer->GetAvatarID(); pBranch->AddPlayer( nAvatarID, pPlayer); } else pBranch->AddPlayer( pPlayer->GetGateChannelID(), pPlayer); } } }
void ParseInstructions(const std::string& in) { boost::char_separator<char> delim(", ()"); typedef boost::tokenizer< boost::char_separator< char > > tokenizer; size_t lineNum = 0; std::string bin; std::string rs; std::string rd; std::string rt; std::string imm; std::ifstream ifs(in); std::vector<std::string> sourceCode; std::map<size_t, std::bitset<32>> instructions; /* reads data from file */ do { std::string line; std::ws(ifs); std::getline(ifs, line); sourceCode.push_back(line); } while (ifs.eof() == 0); std::vector<size_t> lineNums; std::map<std::string, size_t> labels; ParseLabels(sourceCode, labels); for (size_t i = 0; i < sourceCode.size(); ++i) { std::string s = sourceCode[i]; if (!isLabel(s, labels)) { tokenizer tokens(s, delim); tokenizer::iterator iter = tokens.begin(); if (iter != tokens.end()) { if (*iter == "syscall") // syscall { std::bitset<32> b(std::string("1100")); instructions.emplace(lineNum, b); ++lineNum; } else if (s[0] == 'j') // jump { bin = "000010"; ++iter; bin += GetAddress(*iter, labels); std::bitset<32> b(bin); instructions.emplace(lineNum, b); ++lineNum; } else if (*iter == "addiu") // addiu { bin = "001001"; rt = *(++iter); rs = *(++iter); imm = *(++iter); bin += GetReg(rs); bin += GetReg(rt); std::bitset<16> j(std::stoi(imm)); bin += j.to_string(); std::bitset<32> b(bin); instructions.emplace(lineNum, b); ++lineNum; } // end addiu else if (*iter == "addu") // addu { bin = "000000"; rd = *(++iter); rs = *(++iter); rt = *(++iter); bin += GetReg(rs); bin += GetReg(rt); bin += GetReg(rd); bin += "00000"; bin += "100001"; std::bitset<32> b(bin); instructions.emplace(lineNum, b); ++lineNum; } else if (*iter == "and") // and { bin = "000000"; rd = *(++iter); rs = *(++iter); rt = *(++iter); bin += GetReg(rs); bin += GetReg(rt); bin += GetReg(rd); bin += "00000"; bin += "100100"; std::bitset<32> b(bin); instructions.emplace(lineNum, b); ++lineNum; } else if (*iter == "beq") { bin = "000100"; rs = *(++iter); rt = *(++iter); imm = *(++iter); bin += GetReg(rs); bin += GetReg(rt); bin += GetBranch(lineNum, imm, labels); std::bitset<32> b(bin); instructions.emplace(lineNum, b); ++lineNum; } // end beq else if (*iter == "bne") { bin = "000101"; rs = *(++iter); rt = *(++iter); imm = *(++iter); bin += GetReg(rs); bin += GetReg(rt); bin += GetBranch(lineNum, imm, labels); std::bitset<32> b(bin); instructions.emplace(lineNum, b); ++lineNum; } // end bne else if (*iter == "div") // div { bin = "000000"; rs = *(++iter); rt = *(++iter); bin += GetReg(rs); bin += GetReg(rt); bin += "0000000000"; bin += "011010"; std::bitset<32> b(bin); instructions.emplace(lineNum, b); ++lineNum; } // end div else if (*iter == "lw") // lw { bin = "100011"; rt = *(++iter); imm = *(++iter); rs = *(++iter); bin += GetReg(rs); bin += GetReg(rt); bin += GetOffset(imm, labels); std::bitset<32> b(bin); instructions.emplace(lineNum, b); ++lineNum; } // end lw else if (*iter == "mfhi") // mfhi { bin = "0000000000000000"; rd = *(++iter); bin += GetReg(rd); bin += "00000010000"; std::bitset<32> b(bin); instructions.emplace(lineNum, b); ++lineNum; } // end mfhi else if (*iter == "mflo") // mflo { bin = "0000000000000000"; rd = *(++iter); bin += GetReg(rd); bin += "00000010010"; std::bitset<32> b(bin); instructions.emplace(lineNum, b); ++lineNum; } // end mflo else if (*iter == "mult") // mult { bin = "000000"; rs = *(++iter); rt = *(++iter); bin += GetReg(rs); bin += GetReg(rt); bin += "0000000000011000"; std::bitset<32> b(bin); instructions.emplace(lineNum, b); ++lineNum; } // end mult else if (*iter == "or") // or { bin = "000000"; rd = *(++iter); rs = *(++iter); rt = *(++iter); bin += GetReg(rs); bin += GetReg(rt); bin += GetReg(rd); bin += "00000100101"; std::bitset<32> b(bin); instructions.emplace(lineNum, b); ++lineNum; } // end or else if (*iter == "slt") // slt { bin = "000000"; rd = *(++iter); rs = *(++iter); rt = *(++iter); bin += GetReg(rs); bin += GetReg(rt); bin += GetReg(rd); bin += "00000101010"; std::bitset<32> b(bin); instructions.emplace(lineNum, b); ++lineNum; } // end slt else if (*iter == "subu") // subu { bin = "000000"; rd = *(++iter); rs = *(++iter); rt = *(++iter); bin += GetReg(rs); bin += GetReg(rt); bin += GetReg(rd); bin += "00000100011"; std::bitset<32> b(bin); instructions.emplace(lineNum, b); ++lineNum; } // end subu else if (*iter == "sw") //sw { bin = "101011"; rt = *(++iter); imm = *(++iter); rs = *(++iter); bin += GetReg(rs); bin += GetReg(rt); bin += GetOffset(imm, labels); std::bitset<32> b(bin); instructions.emplace(lineNum, b); ++lineNum; } // end sw else { std::cout << "Error! Bad instruction on line " << lineNum << '\n'; ++lineNum; } } // end if } //end if } // end AddData(instructions, labels, sourceCode); Display(instructions); ifs.close(); } // end ParseInstructions