Example #1
0
int HaploTree::AddHaplotype(const IntArray & state)
   {
   int branch = 0;

   for (int i = 0; i < depth; i++)
      branch = GetBranch(branch, state[i]);
   
   return branch;
   }
Example #2
0
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 );
		}
	}
}
Example #3
0
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);
		}
	}
}
Example #4
0
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