diff --git a/DataStructures/PolylineCompressor.h b/DataStructures/PolylineCompressor.h index ea3d35371..c5ae91e91 100644 --- a/DataStructures/PolylineCompressor.h +++ b/DataStructures/PolylineCompressor.h @@ -27,54 +27,48 @@ or see http://www.gnu.org/licenses/agpl.txt. class PolylineCompressor { private: - inline string encodeSignedNumber(const int number) const { - int signedNumber = number << 1; - if (number < 0) { - signedNumber = ~(signedNumber); - } - return (encodeNumber(signedNumber)); - } + inline void encodeVectorSignedNumber(vector & numbers, string & output) { + for(unsigned i = 0; i < numbers.size(); ++i) { + numbers[i] <<= 1; + if (numbers[i] < 0) { + numbers[i] = ~(numbers[i]); + } + } + for(unsigned i = 0; i < numbers.size(); ++i) { + encodeNumber(numbers[i], output); + } + } - inline string encodeNumber(int numberToEncode) const { - string encodeString; + inline void encodeNumber(int numberToEncode, string & output) { + while (numberToEncode >= 0x20) { + int nextValue = (0x20 | (numberToEncode & 0x1f)) + 63; + output += (static_cast (nextValue)); + if(92 == nextValue) + output += (static_cast (nextValue)); + numberToEncode >>= 5; + } - while (numberToEncode >= 0x20) { - int nextValue = (0x20 | (numberToEncode & 0x1f)) + 63; - encodeString += (static_cast (nextValue)); - numberToEncode >>= 5; - } - - numberToEncode += 63; - encodeString += (static_cast (numberToEncode)); - - return encodeString; - } - - inline void replaceBackslash(string & str) { - size_t found = 0; - do { - found = str.find("\\", found); - if(found ==string::npos) - break; - str.insert(found, "\\"); - found+=2; - } while(true); - } + numberToEncode += 63; + output += (static_cast (numberToEncode)); + if(92 == numberToEncode) + output += (static_cast (numberToEncode)); + } public: - inline void printEncodedString(vector<_Coordinate>& polyline, string &output) { - output += "\""; - if(!polyline.empty()) { - output += encodeSignedNumber(polyline[0].lat); - output += encodeSignedNumber(polyline[0].lon); - } - for(unsigned i = 1; i < polyline.size(); i++) { - output += encodeSignedNumber(polyline[i].lat - polyline[i-1].lat); - output += encodeSignedNumber(polyline[i].lon - polyline[i-1].lon); - } - output += "\""; - replaceBackslash(output); - } + inline void printEncodedString(const vector<_Coordinate>& polyline, string &output) { + vector deltaNumbers(2*polyline.size()); + output += "\""; + if(!polyline.empty()) { + deltaNumbers[0] = polyline[0].lat; + deltaNumbers[1] = polyline[0].lon; + for(unsigned i = 1; i < polyline.size(); ++i) { + deltaNumbers[(2*i)] = (polyline[i].lat - polyline[i-1].lat); + deltaNumbers[(2*i)+1] = (polyline[i].lon - polyline[i-1].lon); + } + encodeVectorSignedNumber(deltaNumbers, output); + } + output += "\""; + } inline void printUnencodedString(vector<_Coordinate> & polyline, string & output) { output += "[";