Programación en Ada/Tipos/Enumeraciones
Un tipo enumeración es una lista definida de los posibles valores que puede adoptar un objeto de ese tipo. La declaración:
type Color_Primario is (Rojo, Verde, Azul);
establece que a un objeto del tipo Color_Primario se le puede asignar cualquiera de los tres valores indicados, y ningún otro valor. Como los tipos numéricos, donde por ejemplo 1 es un literal entero, Rojo, Verde y Azul son los llamados literales del tipo.
Las enumeraciones son uno de los tipos discretos, los otros son los tipos enteros.
Operadores y atributos predefinidos[editar]
Aparte del operador de igualdad ("="), los tipos enumeración tienen predefinidos todos los operadores de orden: "<", "<=", "=", "/=", ">=", ">"; donde la relación de orden viene dada implicitamente por la secuencia de los literales: cada literal tiene una posición, empezando por 0 para el primero, que se incrementa en uno para cada sucesor. Esta posición se puede obtener mediante el atributo 'Pos; el inverso es 'Val, que devuelve el valor correspondiente a una posición. En nuestro ejemplo:
Color_Primario'Pos (Rojo) = 0 Color_Primario'Val (0) = Rojo
Los literales pueden sobrecargarse, es decir, puede haber otro tipo con los mismos literales.
type Luz_de_Tráfico is (Rojo, Ambar, Verde);
Normalmente se puede determinar por el contexto a qué tipo pertenece el literal Rojo. Cuando es imposible, el programador ha de usar una expresión de desambiguación: Tipo'(Valor).
Literales carácter[editar]
Una característica bastante única de Ada es la posibilidad de usar literales caracter como literales de una enumeración.
type ABC is ('A', 'B', 'C');
El literal 'A' no tiene mucho que ver con el literal 'A' del tipo predefinido Character (o Wide_Character).
Todo tipo que tiene al menos un literal carácter es un tipo carácter. Para todo tipo carácter, existen literales de cadena y el operador de concatenación predefinido "&".
type Mi_Caracter is (No_Caracter, 'a', Literal, 'z'); type Mi_String is array (Positive range <>) of Mi_Caracter; S: Mi_String := "aa" & Literal & "za" & 'z'; T: Mi_String := ('a', 'a', Literal, 'z', 'a', 'z');
En este ejemplo, S y T contienen el mismo valor.
El tipo predefinido Character se define de este modo en el paquete Standard.
Tipo boolean[editar]
El tipo predefinido boolean es una enumeración definida en el paquete Standard de este modo:
type Boolean is (False, True);
Por esta razón el tipo boolean tiene todos los atributos definidos para cualquier otra enumeración.
Subtipos de enumeración[editar]
Se puede usar un rango para definir un subtipo sobre una enumeración:
subtype Letra_Mayúscula is Character range 'A' .. 'Z'; subtype Color_Frío is Color_Primario range Verde .. Azul;