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

Проект enummaskc

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

Тип enumchar предполагает, что значения этого типа - символьные строки из заданного в описании типа перечня констант. Размер строки для хранения значений такого типа может быть задан в описании в квадратных скобках. Если размер не задан, то он вычисляется по максимальному значению длины константы в списке.

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

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

Преимущество типа enumchar перед enum проявляется при хранении значений этого типа в базе данных. При модификации описания типа enum (добавлении или удалении констант) может понадобиться коррекция данных в базе.

При использовании enumchar порядок описания констант в типе не важен. Алгоритм работы с типом непонятные константы извне (например из базы данных или из какого-нибудь другого внешнего источника) интерпретируются как пустые значения. Поэтому можно без последствий удалять в описании типа enumchar старые константы и добавлять новые. При использовании enum в таких ситуациях чсиловые значения могут в программе начать трактоваться по-другому.

Тип maskchar предполагает, что значения этого типа - символьные строки, состоящие из указанных в типе констант, разделенных пробелами. Аналог типа mask, но без ограничений на количество констант. Размер строки для хранения значений такого типа может быть задан в описании в квадратных скобках. Если размер не задан, то он вычисляется таким образом, чтобы полная маска со всеми константами умещалась в строке.

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

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

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

Файл enummask.gen:

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

utility enummaskc

Файл enummaskc.utility:

utility enummaskc:"ENUMCHAR MASKCHAR examples"

type t_colorc : enumchar[]
( RED/title="Красный",
  GREEN/title="Зеленый",
  BLUE/title="Синий"
);
type t_colorsc : maskchar[]
( RED/title="Красный",
  GREEN/title="Зеленый",
  BLUE/title="Синий"
);
type t_color_maskc : maskchar[] of t_colorc;

main
{ var
    t_colorc color;

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

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

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

  var
    t_colorsc colors;

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

  var
    t_color_maskc color_mask;

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