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 "BinaryHeap.h"
#include "PhantomNodes.h" #include "PhantomNodes.h"
#include "../Util/StrIngUtil.h"
#include "../typedefs.h" #include "../typedefs.h"
struct _HeapData { struct _HeapData {
@ -294,8 +295,12 @@ public:
return ed.distance; return ed.distance;
} }
inline std::string& GetNameForNameID(const NodeID nameID) const { inline std::string &GetNameForNameID(const NodeID nameID) const {
return _names->at(nameID); 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 { 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 > template< int length, int precision >
inline char* printInt( char* buffer, int value ) inline char* printInt( char* buffer, int value )
{ {
bool minus = false; bool minus = false;
if ( value < 0 ) { if ( value < 0 ) {
minus = true; minus = true;
value = -value; value = -value;
} }
buffer += length - 1; buffer += length - 1;
for ( int i = 0; i < precision; i++ ) { for ( int i = 0; i < precision; i++ ) {
*buffer = '0' + ( value % 10 ); *buffer = '0' + ( value % 10 );
value /= 10; value /= 10;
buffer--; buffer--;
} }
*buffer = '.'; *buffer = '.';
buffer--; buffer--;
for ( int i = precision + 1; i < length; i++ ) { for ( int i = precision + 1; i < length; i++ ) {
*buffer = '0' + ( value % 10 ); *buffer = '0' + ( value % 10 );
value /= 10; value /= 10;
if ( value == 0 ) break; if ( value == 0 ) break;
buffer--; buffer--;
} }
if ( minus ) { if ( minus ) {
buffer--; buffer--;
*buffer = '-'; *buffer = '-';
} }
return buffer; return buffer;
} }
inline void intToString(const int value, std::string & output) inline void intToString(const int value, std::string & output)
{ {
// The largest 32-bit integer is 4294967295, that is 10 chars // The largest 32-bit integer is 4294967295, that is 10 chars
// On the safe side, add 1 for sign, and 1 for trailing zero // On the safe side, add 1 for sign, and 1 for trailing zero
char buffer[12] ; char buffer[12] ;
sprintf(buffer, "%i", value) ; sprintf(buffer, "%i", value) ;
output = buffer ; output = buffer ;
} }
inline void convertLatLon(const int value, std::string & output) inline void convertLatLon(const int value, std::string & output)
{ {
char buffer[100]; char buffer[100];
buffer[10] = 0; // Nullterminierung buffer[10] = 0; // Nullterminierung
char* string = printInt< 10, 5 >( buffer, value ); char* string = printInt< 10, 5 >( buffer, value );
output = string; output = string;
} }
/* used to be boosts lexical cast, but this was too slow */ /* used to be boosts lexical cast, but this was too slow */
inline void doubleToString(const double value, std::string & output) inline void doubleToString(const double value, std::string & output)
{ {
// The largest 32-bit integer is 4294967295, that is 10 chars // The largest 32-bit integer is 4294967295, that is 10 chars
// On the safe side, add 1 for sign, and 1 for trailing zero // On the safe side, add 1 for sign, and 1 for trailing zero
char buffer[12] ; char buffer[12] ;
sprintf(buffer, "%f", value) ; sprintf(buffer, "%f", value) ;
output = buffer ; 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_ */ #endif /* STRINGUTIL_H_ */