--- parser3/src/include/pa_array.h 2024/09/10 19:09:56 1.90 +++ parser3/src/include/pa_array.h 2024/09/11 21:07:36 1.91 @@ -8,7 +8,7 @@ #ifndef PA_ARRAY_H #define PA_ARRAY_H -#define IDENT_PA_ARRAY_H "$Id: pa_array.h,v 1.90 2024/09/10 19:09:56 moko Exp $" +#define IDENT_PA_ARRAY_H "$Id: pa_array.h,v 1.91 2024/09/11 21:07:36 moko Exp $" // includes @@ -254,6 +254,42 @@ private: //disabled Array& operator = (const Array&) { return *this; } }; +/// Commonly used, templated to work with any integer type + +template char* pa_itoa(T n, T base=10){ + char buf[MAX_NUMBER + 1]; + char* pos=buf + MAX_NUMBER; + *pos='\0'; + + bool negative=n < 0; + if (n < 0){ + n=-n; + } + + do { + *(--pos)=(n % base) + '0'; + n/=base; + } while (n > 0); + + if (negative) { + *(--pos) = '-'; + } + return pa_strdup(pos, buf + MAX_NUMBER - pos); +} + +template char* pa_uitoa(T n, T base=10){ + char buf[MAX_NUMBER + 1]; + char* pos=buf + MAX_NUMBER; + *pos='\0'; + + do { + *(--pos)=(n % base) + '0'; + n/=base; + } while (n > 0); + + return pa_strdup(pos, buf + MAX_NUMBER - pos); +} + /** Array iterator, usage: @code @@ -298,9 +334,7 @@ public: } inline char *key(){ - char local_buf[MAX_NUMBER]; - size_t length=snprintf(local_buf, MAX_NUMBER, "%zu", index()); - return pa_strdup(local_buf, length); + return pa_uitoa(index()); } }; @@ -332,9 +366,7 @@ public: } inline char *key(){ - char local_buf[MAX_NUMBER]; - size_t length=snprintf(local_buf, MAX_NUMBER, "%zu", index()); - return pa_strdup(local_buf, length); + return pa_uitoa(index()); } };