Return a valid route even if nameIDs are bogus

This commit is contained in:
Dennis Luxen 2011-04-21 09:26:32 +00:00
parent 2c6e68dda7
commit 1f7ddc865f
2 changed files with 54 additions and 40 deletions

View File

@ -26,6 +26,7 @@ or see http://www.gnu.org/licenses/agpl.txt.
#include "BinaryHeap.h"
#include "PhantomNodes.h"
#include "../Util/StrIngUtil.h"
#include "../typedefs.h"
struct _HeapData {
@ -294,8 +295,12 @@ public:
return ed.distance;
}
inline std::string& GetNameForNameID(const NodeID nameID) const {
return _names->at(nameID);
inline std::string &GetNameForNameID(const NodeID nameID) const {
return (nameID >= names->size() ? _names->at(0) : _names->at(nameID) );
}
inline std::string GetEscapedNameForNameID(const NodeID nameID) const {
return (nameID >= names->size() ? _names->at(0) : replaceAll(_names->at(nameID), "\"", "\\\"") );
}
inline short GetTypeOfEdgeForOriginDestinationNodeID(NodeID s, NodeID t) const {

View File

@ -26,57 +26,66 @@ or see http://www.gnu.org/licenses/agpl.txt.
template< int length, int precision >
inline char* printInt( char* buffer, int value )
{
bool minus = false;
if ( value < 0 ) {
minus = true;
value = -value;
}
buffer += length - 1;
for ( int i = 0; i < precision; i++ ) {
*buffer = '0' + ( value % 10 );
value /= 10;
buffer--;
}
*buffer = '.';
buffer--;
for ( int i = precision + 1; i < length; i++ ) {
*buffer = '0' + ( value % 10 );
value /= 10;
if ( value == 0 ) break;
buffer--;
}
if ( minus ) {
buffer--;
*buffer = '-';
}
return buffer;
bool minus = false;
if ( value < 0 ) {
minus = true;
value = -value;
}
buffer += length - 1;
for ( int i = 0; i < precision; i++ ) {
*buffer = '0' + ( value % 10 );
value /= 10;
buffer--;
}
*buffer = '.';
buffer--;
for ( int i = precision + 1; i < length; i++ ) {
*buffer = '0' + ( value % 10 );
value /= 10;
if ( value == 0 ) break;
buffer--;
}
if ( minus ) {
buffer--;
*buffer = '-';
}
return buffer;
}
inline void intToString(const int value, std::string & output)
{
// The largest 32-bit integer is 4294967295, that is 10 chars
// On the safe side, add 1 for sign, and 1 for trailing zero
char buffer[12] ;
sprintf(buffer, "%i", value) ;
output = buffer ;
// The largest 32-bit integer is 4294967295, that is 10 chars
// On the safe side, add 1 for sign, and 1 for trailing zero
char buffer[12] ;
sprintf(buffer, "%i", value) ;
output = buffer ;
}
inline void convertLatLon(const int value, std::string & output)
{
char buffer[100];
buffer[10] = 0; // Nullterminierung
char* string = printInt< 10, 5 >( buffer, value );
output = string;
char buffer[100];
buffer[10] = 0; // Nullterminierung
char* string = printInt< 10, 5 >( buffer, value );
output = string;
}
/* used to be boosts lexical cast, but this was too slow */
inline void doubleToString(const double value, std::string & output)
{
// The largest 32-bit integer is 4294967295, that is 10 chars
// On the safe side, add 1 for sign, and 1 for trailing zero
char buffer[12] ;
sprintf(buffer, "%f", value) ;
output = buffer ;
// The largest 32-bit integer is 4294967295, that is 10 chars
// On the safe side, add 1 for sign, and 1 for trailing zero
char buffer[12] ;
sprintf(buffer, "%f", value) ;
output = buffer ;
}
std::string replaceAll( std::string result, const std::string& replaceWhat, const std::string& replaceWithWhat) {
while(true) {
const int pos = result.find(replaceWhat);
if (pos==-1) break;
result.replace(pos,replaceWhat.size(),replaceWithWhat);
}
return result;
}
#endif /* STRINGUTIL_H_ */