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); } }