Patch level : 12.0 no-patch

Files correlati     :
Commento            :

Aggiunta merge per le string_array
This commit is contained in:
Alessandro Bonazzi 2020-10-15 08:22:59 +02:00
parent 3fe4a81466
commit 94c6ecf100
2 changed files with 49 additions and 13 deletions

View File

@ -1,5 +1,6 @@
#include <array.h>
#include <strings.h>
#include <utility.h>
void TContainer::for_each( OPERATION_FUNCTION op )
{
@ -158,11 +159,8 @@ bool TArray::destroy(
if (index < 0)
{
for (int i = last(); i >= 0; i--) if (_data[i] != NULL)
{
delete _data[i];
_data[i] = NULL;
}
for (int i = last(); i >= 0; i--) if (_data[i] != nullptr)
safe_delete(_data[i]);
_items = _next = 0;
}
else
@ -182,7 +180,8 @@ void TArray::copy(const TArray& a)
for (int i = a.size()-1; i >= 0; i--)
{
const TObject* o = a.objptr(i);
if (o != NULL)
if (o != nullptr)
{
_data[i] = o->dup();
#ifdef DBG
@ -653,9 +652,13 @@ int TString_array::find(
HIDDEN int ascending_string(const TObject** o1, const TObject** o2)
{
const TString* s1 = (const TString*)*o1;
const TString* s2 = (const TString*)*o2;
return strcmp(*s1, *s2);
// const TString* s1 = (const TString*)*o1;
// const TString* s2 = (const TString*)*o2;
// return strcmp(*s1, *s2);
const TToken_string* s1 = (const TToken_string*)*o1;
const TToken_string* s2 = (const TToken_string*)*o2;
return s1->compare(*s2);
}
HIDDEN int descending_string(const TObject** o1, const TObject** o2)
@ -668,6 +671,34 @@ void TString_array::sort(bool ascending)
TArray::sort(ascending ? ascending_string : descending_string);
}
const TString_array & TString_array::merge(const TString_array & a)
{
FOR_EACH_ARRAY_ROW(a, i, row)
if (find(*row) == -1)
add(*row);
sort(true);
return *this;
}
const TString_array & TString_array::tok2arr(TToken_string & tok, bool clear)
{
if (clear)
destroy();
FOR_EACH_STR_TOKEN(tok, s)
add(s);
return *this;
}
// @cmember aggiunge (add = true) / sostituisce (add = false) la token string all' array come stringhe singole
const TString_array & TString_array::arr2tok(TToken_string & tok, bool clear)
{
if (clear)
tok.cut(0);
FOR_EACH_ARRAY_ROW(*this, i, riga)
tok.add(*riga);
return *this;
}
///////////////////////////////////////////////////////////
// TPointer_array
///////////////////////////////////////////////////////////

View File

@ -1,4 +1,3 @@
#pragma once
#ifndef __ARRAY_H
#define __ARRAY_H
@ -136,7 +135,7 @@ public:
// @cmember Ritorna l'id della class
virtual word class_id() const ;
// @cmember Controlla se si tratta di un oggetto derivato da TArray
virtual bool is_kind_of(word cid) const;
virtual bool is_kind_of(word cid) const;
// @cmember Stampa un array
virtual void print_on(ostream& out) const ;
// @cmember Controlla se si tratta di un oggetto valido
@ -174,7 +173,7 @@ public:
// @cmember Ritorna l'oggetto nella posizione index
TObject& operator[] (int index) const ;
// @cmember Ritorna l'oggetto nella posizione index
TObject* objptr(int index) const ;
virtual TObject* objptr(int index) const ;
// @cmember Assegna all'array l'oggetto passato
TArray& operator=(const TArray& a);
@ -264,10 +263,16 @@ public:
// @cmember Cerca una stringa nell'array
int find(const char* s, int from = 0) const;
// @cmember Ordina alfabeticamente l'array
void sort(bool ascendig = true);
void sort(bool ascending = true);
// @cmember fonde con l'array a
const TString_array & merge(const TString_array & a);
// @cmember Ritorna l'ultima riga (deve esistere!)
TToken_string& last_row()
{ return (TToken_string&)operator[](last()); }
// @cmember aggiunge (add = true) la token string all' array come stringhe singole azzerandola prima (clear)
const TString_array & tok2arr(TToken_string & tok, bool clear = true);
// @cmember aggiunge (add = true) / sostituisce (add = false) la token string all' array v
const TString_array & arr2tok(TToken_string & tok, bool clear = true);
// @cmember Costruttore
TString_array(int size = 8) : TArray(size)