コード例 #1
0
ファイル: MeasureCalc.cpp プロジェクト: KimDaeGun/rainmeter
int MeasureCalc::GetRandom()
{
	int value = 0;

	if (m_LowBound == m_HighBound)
	{
		value = m_LowBound;
	}
	else if (m_UniqueRandom)
	{
		if (m_UniqueNumbers.empty())
		{
			UpdateUniqueNumberList();
		}

		value = m_UniqueNumbers.back();
		m_UniqueNumbers.pop_back();
	}
	else
	{
		std::uniform_int_distribution<int>::param_type params(m_LowBound, m_HighBound);
		m_Distrubtion.param(params);
		m_Distrubtion.reset();
		value = m_Distrubtion(m_Engine);
	}

	return value;
}
コード例 #2
0
ファイル: MeasureCalc.cpp プロジェクト: KimDaeGun/rainmeter
/*
** Read the options specified in the ini file.
**
*/
void MeasureCalc::ReadOptions(ConfigParser& parser, const WCHAR* section)
{
	Measure::ReadOptions(parser, section);

	// Store the current values so we know if the value needs to be updated
	int oldLowBound = m_LowBound;
	int oldHighBound = m_HighBound;
	bool oldUpdateRandom = m_UpdateRandom;
	bool oldUniqueRandom = m_UniqueRandom;

	std::wstring oldFormula = m_Formula;
	m_Formula = parser.ReadString(section, L"Formula", L"");

	m_LowBound = parser.ReadInt(section, L"LowBound", DEFAULT_LOWER_BOUND);
	m_HighBound = parser.ReadInt(section, L"HighBound", DEFAULT_UPPER_BOUND);
	m_UpdateRandom = parser.ReadBool(section, L"UpdateRandom", false);

	m_UniqueRandom = parser.ReadBool(section, L"UniqueRandom", false);
	if (!m_UniqueRandom)
	{
		m_UniqueNumbers.clear();
	}

	if (!m_Initialized ||
		wcscmp(m_Formula.c_str(), oldFormula.c_str()) != 0 ||
		oldLowBound != m_LowBound ||
		oldHighBound != m_HighBound ||
		oldUpdateRandom != m_UpdateRandom ||
		oldUniqueRandom != m_UniqueRandom)
	{
		// Reset bounds if |m_LowBound| is greater than |m_HighBound|
		if (m_LowBound > m_HighBound)
		{
			LogErrorF(this, L"\"LowBound\" (%i) must be less then or equal to \"HighBound\" (%i)", m_LowBound, m_HighBound);
			
			m_HighBound = m_LowBound;
		}

		// Reset the list if the bounds are changed
		if (m_UniqueRandom && (
			oldLowBound != m_LowBound ||
			oldHighBound != m_HighBound))
		{
			UpdateUniqueNumberList();
		}

		if (!m_UpdateRandom)
		{
			FormulaReplace();
		}

		const WCHAR* errMsg = MathParser::Check(m_Formula.c_str());
		if (errMsg != nullptr)
		{
			LogErrorF(this, L"Calc: %s", errMsg);
			m_Formula.clear();
		}
	}
}
コード例 #3
0
ファイル: MeasureCalc.cpp プロジェクト: AlonTzarafi/rainmeter
int MeasureCalc::GetRandom()
{
	if (m_LowBound == m_HighBound || m_LowBound > m_HighBound)
	{
		return m_LowBound;
	}
	else if (m_UniqueRandom)
	{
		if (m_UniqueNumbers.empty())
		{
			UpdateUniqueNumberList();
		}

		const int value = m_UniqueNumbers.back();
		m_UniqueNumbers.pop_back();
		return value;
	}
	else
	{
		const std::uniform_int_distribution<int> distribution(m_LowBound, m_HighBound);
		return distribution(GetRandomEngine());
	}
}