Генератор
Проектов

Проект enummask

Проект демонстрирует использование типов данных enum и mask.

Тип enum предполагает, что значения этого типа - целые числа из заданного в описании типа перечня констант. Нумерация числе в Си-представлении типа с нуля.

В языке константы типа enum должны снабжаться префиксом - именем типа и точкой (кроме особых случаев в так называемых контекстных выражениях).

Тип mask предполагает, что значения этого типа - целые числа 32-х или 64-х битные. В описании типа задаются константы, означающие отдельные биты. Каждок такой константе с Си-представлении соответствует единица, сдвинутая влево столько раз, какая позиция константы в списке.

По количеству перечисленных в описании типа констант определяется Си-представление - 32 или 64 бита. Больше, чем 64 констнаты задавать нельзя.

Из типа enum можно изготовить соответствующий тип mask. Для этого предусмотрена форма описания type t_color_mask : mask of t_color; В таком масочном типе перечень констант берется из указанного типа enum.

Выражение t_color_mask(color) демонстрирует разновидность приведения типа, в данном случае из выражения типа t_color выводится выражение типа t_color_mask.

Многофункциональные выражения isnull(...) и isnotnull(...) применимы, в частности, к значениям масочного типа для проверки на пустую маску, т.е. на нулевое значение в Си-представлении.

Файл enummask.gen:

project enummask
  /version="01.001"
  /firm="УСТ"
  /http="http://www.ustech.ru"
  /email="managers@ustech.ru"

utility enummask

Файл enummask.utility:

utility enummask:"ENUM MASK examples"

type t_color : enum
( RED/title="Красный",
  GREEN/title="Зеленый",
  BLUE/title="Синий"
);
type t_colors : mask
( RED/title="Красный",
  GREEN/title="Зеленый",
  BLUE/title="Синий"
);
type t_color_mask : mask of t_color;

main
{ var
    t_color color;

  color := t_color.RED;
  if ( color = t_color.GREEN )
    color := t_color.BLUE;

  dprint("color: ",color,"\n");

  switchall ( color )
  { case t_color.RED:
      dprint(U"Красненький\n");
    case t_color.GREEN:
      dprint(U"Зелененький\n");
    case t_color.BLUE:
      dprint(U"Синенький\n");
  }

  var
    t_colors colors;

  colors := t_colors.RED;
  colors |= t_colors.GREEN|t_colors.BLUE;
  dprint("colors: ",colors,"\n");

  var
    t_color_mask color_mask;

  color_mask := t_color_mask.GREEN;
  color_mask |= t_color_mask(color);
  if ( isnotnull(color_mask) )
    dprint("color_mask: ",color_mask,"\n");
}
Скачать проект enummask