コード例 #1
0
ファイル: Location.cpp プロジェクト: BrainTwister/GeneHunter
Location::Location( std::string const& locationString )
{
    bool lastCharWasNonRangeChar = true;
    vector<string> rawRangeList;
    vector<string>::iterator iterRawRange;

    for ( auto const& character : locationString ) {
        if ( charSet_.find(character) != charSet_.end() ) {
            if ( lastCharWasNonRangeChar ) {
                rawRangeList.push_back("");
                iterRawRange = rawRangeList.end()-1;
                lastCharWasNonRangeChar = false;
            }
            *iterRawRange += character;
        }
        else lastCharWasNonRangeChar = true;
    }

    typedef boost::tokenizer<boost::char_separator<char> > tokenizer;

    string firstString,secondString;
    for ( auto const& rawRange : rawRangeList )
    {
        RangeType range;
        boost::char_separator<char> sep(".");
        tokenizer token(rawRange,sep);
        tokenizer::const_iterator iterToken = token.begin();

        if ( iterToken == token.end() )
            throw GeneHunterException("Location: error reading " + locationString);

        firstString = *iterToken;
        ++iterToken;

        // Single base location
        if ( iterToken == token.end() )
            secondString = firstString;
        else {
            secondString = *iterToken;
            ++iterToken;
        }

        if ( iterToken != token.end() )
            throw GeneHunterException("Location: error reading " + locationString);

        if ( firstString[0] == '<' ) {
            range.setOpenLowerBoundary(true);
            firstString.erase(0,1);
        }
        range.setLowerBoundary(firstString);

        if ( secondString[0] == '>' ) {
            range.setOpenUpperBoundary(true);
            secondString.erase(0,1);
        }
        range.setUpperBoundary(secondString);

        rangeSet_.insert(range);
    }
}