본문 바로가기

프로그래밍/코드 조각

버전 비교 구조체

// 선언
    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 벡터에 하나씩 넣어서 가져오는 함수이다.