forked from tomieiro/std-moon
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlista.lua
More file actions
150 lines (134 loc) · 3.84 KB
/
Copy pathlista.lua
File metadata and controls
150 lines (134 loc) · 3.84 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
--Funcao para copia de elementos
function deep_copy(elem)
local aux;
if type(elem) == 'table' then
aux = {};
for i, j in next, elem, nil do
aux[deep_copy(i)] = deep_copy(j);
end
setmetatable(aux, deep_copy(getmetatable(elem)));
else
aux = elem;
end
return aux;
end
--Definicao padrao dos atributos da Lista
Lista = {itens = {}, tamanho = 0, _indexfirst = 1, _indexlast = 1};
--Metodo cosntrutor que instancia o objeto Lista.
--args: (Table) Atributos desejados para a Lista.
--return: (Object) Lista instanciada.
function Lista:new(atributos)
atributos = atributos or {};
setmetatable(atributos, self);
self.__index = self;
return atributos;
end
--Metodo append que insere um objeto no fim da Lista.
--args: (Object) Objeto desejados para incluir na Lista.
function Lista:append(objeto)
table.insert(self.itens,self._indexlast,objeto);
self.tamanho = self.tamanho + 1;
self._indexlast = self._indexlast + 1;
return;
end
--Metodo append que insere um objeto em uma posição específica da Lista.
--args: (Object) Objeto desejados para incluir na Lista.
-- (Int) Índice da posição para inserir na lista.
function Lista:insert(objeto, i)
table.insert(self.itens,i,objeto);
self.tamanho = self.tamanho + 1;
self._indexlast = self._indexlast + 1;
return;
end
--Metodo pop que remove um objeto específico da Lista.
--args: (Int) Índice da posição para remover da lista.
--return: (Object) Objeto removida da Lista.
function Lista:pop(i)
self.tamanho = self.tamanho - 1;
self._indexlast = self._indexlast - 1;
local aux = table.remove(self.itens,i);
collectgarbage();
return aux;
end
--Funcao que printa toda a lista
function Lista:print()
for i=1, self.tamanho do
print(self.itens[i]);
end
return;
end
--Funcao que retorna a quantidade de elementos na lista
--return: (Int) Quantidade de elementos da lista.
function Lista:count()
return self.tamanho;
end
--Funcao que extende uma lista em outra. Concatena no fim.
--Ou seja, adiciona a lista_base no fim da lista.
--args: (Lista) Lista a ser adicionada.
function Lista:extend(lista_base)
local tam = lista_base:count();
for i=1, tam do
self:append(lista_base:pop(i));
end
return;
end
--Funcao que remove todos os elementos de uma Lista.
function Lista:clear()
for i=self.tamanho,1,-1 do
self:pop(i);
end
return;
end
--Funcao que retorna o índice do primeiro elemento com o valor especificado.
--args: (Object) elemento a ser identificado na lista.
--return: (Int) Índice correspondente. Quando não há um elemento, retorna -1;
function Lista:index(elemento)
for i=1, self.tamanho do
if(self.itens[i] == elemento) then
return i;
end
end
return -1;
end
--Funcao que remove o primeiro elemento com o valor especificado.
--args: (Object) elemento a ser identificado na lista.
function Lista:remove(elemento)
for i=1, self.tamanho do
if(self.itens[i] == elemento) then
self:pop(i);
end
end
return;
end
--Funcao que retorna a cópia de uma lista.
--args: (Object) elemento a ser identificado na lista.
function Lista:copy()
local l = {};
l = deep_copy(self.itens);
return l;
end
--Funcao que reverte a ordem dos elementos de uma lista.
function Lista:reverse()
local l = self:copy();
for i=1, self.tamanho do
self.itens[i] = l[self.tamanho-i+1];
end
return;
end
--Funcao que ordena uma Lista.
function Lista:sort()
table.sort(self.itens);
return;
end
--Metodo para liberar a Lista
function Lista:free()
for i=self._indexfirst, self._indexlast - 1 do
self.itens[i] = nil;
end
local aux = {__mode = "k"}
setmetatable(self.itens,aux);
setmetatable(self, aux);
self = nil;
collectgarbage();
end
return Lista;