--- parser3/src/include/pa_array.h 2024/09/07 16:30:26 1.89 +++ parser3/src/include/pa_array.h 2024/09/11 21:07:36 1.91 @@ -8,16 +8,18 @@ #ifndef PA_ARRAY_H #define PA_ARRAY_H -#define IDENT_PA_ARRAY_H "$Id: pa_array.h,v 1.89 2024/09/07 16:30:26 moko Exp $" +#define IDENT_PA_ARRAY_H "$Id: pa_array.h,v 1.91 2024/09/11 21:07:36 moko Exp $" // includes #include "pa_memory.h" +#include "pa_types.h" #include "pa_exception.h" // forwards template class Array_iterator; +template class Array_reverse_iterator; // defines @@ -27,6 +29,7 @@ template class Array_iterato template class Array: public PA_Object { friend class Array_iterator; + friend class Array_reverse_iterator; protected: @@ -41,6 +44,7 @@ protected: public: typedef Array_iterator Iterator; + typedef Array_reverse_iterator ReverseIterator; struct Action_options { size_t offset; @@ -172,6 +176,8 @@ public: inline T operator [](size_t index) const { return get(index); } inline void clear() { + if(fused) + memset(felements, 0, fused * sizeof(T)); fused=0; } @@ -248,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 @@ -268,28 +310,64 @@ public: Array_iterator(const Array& aarray): farray(aarray) { fcurrent=farray.felements; - flast=farray.felements+farray.count(); + flast=farray.felements + farray.count(); } /// there are still elements - operator bool () { - return fcurrent class Array_reverse_iterator { + + const Array& farray; + T *fcurrent; + +public: + + Array_reverse_iterator(const Array& aarray): farray(aarray) { + fcurrent=farray.felements+farray.count(); + } + + /// there are still elements + inline operator bool () { + return fcurrent > farray.felements; + } + + /// returns the current element and advances the iterator + inline T prev() { + return *(--fcurrent); + } + + // returns the current index of the iterator + inline size_t index() { return fcurrent - farray.felements; } + inline char *key(){ + return pa_uitoa(index()); + } + }; #endif