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) \