From 864436700f67243e2c0f7aa7ccf6a8b348868380 Mon Sep 17 00:00:00 2001 From: Alessandro Bonazzi <alexbonazzi5652@gmail.com> Date: Thu, 15 Oct 2020 21:27:49 +0200 Subject: [PATCH] Patch level : 12.0 no-patch Files correlati : Commento : Aggiunta merge e merge_token per le string_array Aggiunta compare_token per le token string --- src/include/array.cpp | 43 ++++++++++++++++++++++++++++------------- src/include/array.h | 6 +++++- src/include/strings.cpp | 4 ++-- src/include/strings.h | 4 ++-- 4 files changed, 39 insertions(+), 18 deletions(-) diff --git a/src/include/array.cpp b/src/include/array.cpp index 040cde8f8..865d504c5 100755 --- a/src/include/array.cpp +++ b/src/include/array.cpp @@ -159,8 +159,9 @@ bool TArray::destroy( if (index < 0) { - for (int i = last(); i >= 0; i--) if (_data[i] != nullptr) - safe_delete(_data[i]); + for (int i = last(); i >= 0; i--) + if (_data[i] != NULL) + safe_delete(_data[i]); _items = _next = 0; } else @@ -649,23 +650,20 @@ int TString_array::find( } return found; } - HIDDEN int ascending_string(const TObject** o1, const TObject** o2) { - if (((const TToken_string*)*o1)->items() > 1) - { + const TString* s1 = (const TString*)*o1; + const TString* s2 = (const TString*)*o2; + + return strcmp(*s1, *s2); +} + +HIDDEN int ascending_token(const TObject** o1, const TObject** o2) +{ const TToken_string* s1 = (const TToken_string*)*o1; const TToken_string* s2 = (const TToken_string*)*o2; return s1->compare(*s2); - } - else - { - const TString* s1 = (const TString*)*o1; - const TString* s2 = (const TString*)*o2; - - return strcmp(*s1, *s2); - } } HIDDEN int descending_string(const TObject** o1, const TObject** o2) @@ -673,11 +671,21 @@ HIDDEN int descending_string(const TObject** o1, const TObject** o2) return -ascending_string(o1, o2); } +HIDDEN int descending_token(const TObject** o1, const TObject** o2) +{ + return -ascending_token(o1, o2); +} + void TString_array::sort(bool ascending) { TArray::sort(ascending ? ascending_string : descending_string); } +void TString_array::sort_token(bool ascending) +{ + TArray::sort(ascending ? ascending_token : descending_token); +} + const TString_array & TString_array::merge(const TString_array & a) { FOR_EACH_ARRAY_ROW(a, i, row) @@ -687,6 +695,15 @@ const TString_array & TString_array::merge(const TString_array & a) return *this; } +const TString_array & TString_array::merge_token(const TString_array & a) +{ + FOR_EACH_ARRAY_ROW(a, i, row) + if (find(*row) == -1) + add(*row); + sort_token(true); + return *this; +} + const TString_array & TString_array::tok2arr(TToken_string & tok, bool clear) { if (clear) diff --git a/src/include/array.h b/src/include/array.h index 06cc2a028..17b34b50a 100755 --- a/src/include/array.h +++ b/src/include/array.h @@ -202,7 +202,7 @@ public: }; inline TObject* TArray::objptr(int index) const -{ return (index < _size && index >= 0) ? _data[index] : NULL; } +{ return (index < _size && index >= 0) ? _data[index] : nullptr; } #ifndef DBG inline TObject& TArray::operator[] (int index) const @@ -264,8 +264,12 @@ public: int find(const char* s, int from = 0) const; // @cmember Ordina alfabeticamente l'array void sort(bool ascending = true); + // @cmember Ordina alfabeticamente l'array come token_string + void sort_token(bool ascending = true); // @cmember fonde con l'array a const TString_array & merge(const TString_array & a); + // @cmember fonde con l'array a + const TString_array & merge_token(const TString_array & a); // @cmember Ritorna l'ultima riga (deve esistere!) TToken_string& last_row() { return (TToken_string&)operator[](last()); } diff --git a/src/include/strings.cpp b/src/include/strings.cpp index 6fe1c1b98..8ac261063 100755 --- a/src/include/strings.cpp +++ b/src/include/strings.cpp @@ -2038,7 +2038,7 @@ TToken_string& TToken_string::pack() return *this; } -int TToken_string::compare(const char* s, int max, bool ignorecase) const +int TToken_string::compare_token(const char* s, int max, bool ignorecase) const { if (items() > 1) { @@ -2200,7 +2200,7 @@ TToken_string& get_tmp_string(int len) TToken_string* str = (TToken_string*)ararar.objptr(next); - if (str == NULL) + if (str == nullptr) { str = new TToken_string(max(len,50)); ararar.add(str, next); diff --git a/src/include/strings.h b/src/include/strings.h index 57002bcd5..651f5402b 100755 --- a/src/include/strings.h +++ b/src/include/strings.h @@ -294,7 +294,7 @@ public: // @cmember Confronta usando le regular expression bool match(const char* pat, bool ignorecase = false) const; // @cmember Compara due stringhe (o i primi max caratteri) - virtual int compare(const char* s, int max = -1, bool ignorecase = false) const; + int compare(const char* s, int max = -1, bool ignorecase = false) const; // @cmember Controlla se la stringa comincia per s bool starts_with(const char* s, bool ignorecase = false) const; // @cmember Controlla se la stringa finisce per s @@ -739,7 +739,7 @@ public: // @cmember Compatta tutti i campi " " in "" TToken_string& pack(); // @cmenmber compara 2 Token_string elemento per elemento come stringhe - virtual int compare(const char* s, int max = -1, bool ignorecase = false) const; + int compare_token(const char* s, int max = -1, bool ignorecase = false) const; }; #define FOR_EACH_TOKEN(__tok, __str) \