// 선언
struct Version
{
Version();
DWORD major;
DWORD minor;
bool operator < (const Version& ver) const;
bool operator == (const Version& ver) const;
bool operator = (const tstring& ver);
bool empty() const;
tstring str() const;
};
bool ConvertVersion(__in LPCTSTR ver, __out Version& outVer);
bool ConvertVersion(__in Version ver, __out tstring& outVer);
// 구현
Version::Version() :major(0),minor(0)
{
}
bool Version::operator < (const Version& ver) const
{
if(this->major == ver.major)
return this->minor < ver.minor;
return this->major < ver.major;
}
bool Version::operator == (const Version& ver) const
{
return this->minor == ver.minor && this->major == ver.major;
}
bool Version::operator = (const tstring& ver)
{
return ConvertVersion(ver.c_str(), *this);
}
bool Version::empty() const
{
return this->major == 0 && this->minor == 0;
}
tstring Version::str() const
{
tstring out;
ConvertVersion(*this, out);
return out;
}
const unsigned int VER_MOD (65536);
bool ConvertVersion(__in LPCTSTR ver, __out Version& outVer)
{
if(!ver) { return false; }
tstring tmpVer(ver);
tmpVer = StringUtil::Replace(tmpVer, _T(","), _T("."));
tmpVer = StringUtil::Replace(tmpVer, _T(" "), _T(""));
std::vector<tstring> verlist;
StringUtil::ParsingDelimiter(tmpVer, verlist, _T("."));
for(size_t i(0); i<verlist.size(); i++) {
switch(i)
{
case 0: outVer.major = outVer.major + _ttoi(verlist[i].c_str()) * VER_MOD; break;
case 1: outVer.major = outVer.major + _ttoi(verlist[i].c_str()); break;
case 2: outVer.minor = outVer.minor + _ttoi(verlist[i].c_str()) * VER_MOD; break;
case 3: outVer.minor = outVer.minor + _ttoi(verlist[i].c_str()); break;
default: return false;
}
}
return true;
}
bool ConvertVersion(__in Version ver, __out tstring& outVer)
{
otstringstream ss;
ss << ver.major / VER_MOD << _T(".") << ver.major % VER_MOD << _T(".")
<< ver.minor / VER_MOD << _T(".") << ver.minor % VER_MOD;
outVer = ss.str();
return true;
}
tmpVer = StringUtil::Replace(tmpVer, _T(","), _T(".")); 에서
StringUtil::Replace 함수는 tempVer 문자열에서 _T(",")을 _T(".")으로 교체한 후 리턴값으로 tempVer에 다시 넣는 함수이다.
StringUtil::ParsingDelimiter(tmpVer, verlist, _T(".")); 에서
StringUtil::ParsingDelimiter 함수는 tempVer문자열에서 _T(".") 문자를 기준으로 verlist 벡터에 하나씩 넣어서 가져오는 함수이다.