polyline: Added decodeSigned/UnsignedInteger() functions

This commit is contained in:
Tobias Bieniek
2013-03-09 22:40:07 +01:00
parent 36923d6688
commit e802cc3d56
2 changed files with 68 additions and 0 deletions

View File

@@ -16,6 +16,18 @@ ol.parser.polyline.encodeSignedInteger = function(num) {
};
/**
* Decode one single signed integer from an encoded string
*
* @param {string} encoded An encoded string.
* @return {number} The decoded signed integer.
*/
ol.parser.polyline.decodeSignedInteger = function(encoded) {
var result = ol.parser.polyline.decodeUnsignedInteger(encoded);
return ((result & 1) ? ~(result >> 1) : (result >> 1));
};
/**
* Encode one single unsigned integer and return an encoded string
*
@@ -33,3 +45,24 @@ ol.parser.polyline.encodeUnsignedInteger = function(num) {
encodeString += (String.fromCharCode(value));
return encodeString;
};
/**
* Decode one single unsigned integer from an encoded string
*
* @param {string} encoded An encoded string.
* @return {number} The decoded unsigned integer.
*/
ol.parser.polyline.decodeUnsignedInteger = function(encoded) {
var result = 0;
var shift = 0;
var b, i = 0;
do {
b = encoded.charCodeAt(i++) - 63;
result |= (b & 0x1f) << shift;
shift += 5;
} while (b >= 0x20);
return result;
};

View File

@@ -20,6 +20,24 @@ describe('ol.parser.polyline', function() {
});
});
describe('decodeSignedInteger', function() {
it('returns expected value', function() {
var decodeSignedInteger = ol.parser.polyline.decodeSignedInteger;
expect(decodeSignedInteger('?')).toEqual(0);
expect(decodeSignedInteger('@')).toEqual(-1);
expect(decodeSignedInteger('A')).toEqual(1);
expect(decodeSignedInteger('B')).toEqual(-2);
expect(decodeSignedInteger('C')).toEqual(2);
expect(decodeSignedInteger(']')).toEqual(15);
expect(decodeSignedInteger('^')).toEqual(-16);
expect(decodeSignedInteger('_@')).toEqual(16);
expect(decodeSignedInteger('__@')).toEqual(16 * 32);
expect(decodeSignedInteger('___@')).toEqual(16 * 32 * 32);
});
});
describe('encodeUnsignedInteger', function() {
it('returns expected value', function() {
var encodeUnsignedInteger = ol.parser.polyline.encodeUnsignedInteger;
@@ -36,6 +54,23 @@ describe('ol.parser.polyline', function() {
expect(encodeUnsignedInteger(32 * 32 * 32)).toEqual('___@');
});
});
describe('decodeUnsignedInteger', function() {
it('returns expected value', function() {
var decodeUnsignedInteger = ol.parser.polyline.decodeUnsignedInteger;
expect(decodeUnsignedInteger('?')).toEqual(0);
expect(decodeUnsignedInteger('@')).toEqual(1);
expect(decodeUnsignedInteger('A')).toEqual(2);
expect(decodeUnsignedInteger(']')).toEqual(30);
expect(decodeUnsignedInteger('^')).toEqual(31);
expect(decodeUnsignedInteger('_@')).toEqual(32);
expect(decodeUnsignedInteger('__@')).toEqual(32 * 32);
expect(decodeUnsignedInteger('__D')).toEqual(5 * 32 * 32);
expect(decodeUnsignedInteger('___@')).toEqual(32 * 32 * 32);
});
});
});
goog.require('ol.parser.polyline');