在Ada中,是否有一种方法可以使枚举类型像模数类型一样 - 在最后一个范围之后换行为0?

Mic*_*h W 3 math enums ada

我正在重写一个加密/压缩库,似乎每个字节处理的处理量很大.我更喜欢在选择加密可以采用的几种有限方式(正确方式)中使用枚举类型,但是当这些路径变为循环时,我必须添加额外的代码来测试类型'弹出和类型'的第一个.我永远可以写这样的条件的类型,或分配的类型加法/减法运算符的功能环绕的结果,但这是更多的代码和处理,将加起来快时,它具有运行每八字节以及其他所有内容.有没有办法让操作像一个简单的"mod"类型一样高效,就像

type Modular is mod 64 ....;
for ......;
pragma ....;
type Frequency_Counter is array(Modular) of Long_Integer;
Head : Modular := (others => 0);
Freq : Frequency_Counter(Size) := (others => 0);
Encryption_Label : Modular := Hash3;
Block_Sample : Modular := Hash5;
...
Hash3 := Hash3 + 1;
Freq (Hash3):= Freq(Hash3) + 1; -- Here is where my made-on-the-fly example is focused
Run Code Online (Sandbox Code Playgroud)

我想我可以使整个算法更高效,使用枚举类型,如果我能先手枚举类型做数学的处理器在同一周期数与国防部类型的数学.我在想办法方面有点创意,但他们显然不适合我用它们中的任何一个作为例子.我能想到的唯一可能超出我的技能,那就是使用内联ASM(气体汇编语言语法)制作一个程序,使操作非常直接地对待处理器.

PS:我知道这是一个小小的收获,单独.任何收益都适合申请.

Sim*_*ght 6

不确定它会有多大影响!

鉴于这种

package Cyclic is

   type Enum is (A, B, C, D, E);
   type Modular is mod 5;

   function Next_Enum (En : Enum) return Enum is
     (if En = Enum'Last then Enum'First else Enum'Succ (En))                                --'
   with Inline_Always;

end Cyclic;
Run Code Online (Sandbox Code Playgroud)

with Cyclic; use Cyclic;
procedure Cyclic_Use (N : Natural; E : in out Enum; M : in out Modular) is
begin

   begin
      for J in 1 .. N loop
         E := Next_Enum (E);
      end loop;
   end;

   begin
      for J in 1 .. N loop
         M := M + 1;
      end loop;
   end;

end Cyclic_Use;
Run Code Online (Sandbox Code Playgroud)

并使用GCC 5.2.0和-O3(gnatmake -O3 -c -u -f cyclic_use.adb -cargs -S)进行编译,为两个循环生成的x86_64汇编程序是

(列举)

L3:
        leal    1(%rsi), %ecx
        addl    $1, %eax
        cmpb    $4, %sil
        cmove   %r8d, %ecx
        cmpl    %eax, %edi
        movl    %ecx, %esi
        jne     L3
Run Code Online (Sandbox Code Playgroud)

(模块化)

L4:
        leal    -4(%rdx), %ecx
        addl    $1, %eax
        cmpb    $3, %dl
        leal    1(%rdx), %r8d
        movl    %ecx, %edx
        cmovle  %r8d, %edx
        cmpl    %eax, %edi
        jne     L4
Run Code Online (Sandbox Code Playgroud)

我不假装知道x86_64汇编程序,我不知道为什么枚举版本与4比较而模块化版本与3比较,但这些看起来与我非常相似!但枚举版本是一个较短的指令...