抽象超过容器的迭代器(Abstraction over container iterators)

2019-09-20 17:57发布

我说的是2012阿达这里。

我将让代码首先发言:

with Ada.Containers.Hashed_Maps;                                                
with Ada.Strings.Unbounded;                                                     
with Ada.Strings.Unbounded.Hash_Case_Insensitive;                               
with Ada.Strings.Unbounded.Equal_Case_Insensitive;                              

package Environments is                                                         

   type Environment is tagged private;                                          

   function Variable (                                                          
      E    : in Environment;                                                    
      Name : in Ada.Strings.Unbounded.Unbounded_String                          
   )                                                                            
      return Ada.Strings.Unbounded.Unbounded_String                             
      with Inline;                                                              

   procedure Set_Variable (                                                     
      E     : in out Environment;                                               
      Name  : in Ada.Strings.Unbounded.Unbounded_String;                        
      Value : in Ada.Strings.Unbounded.Unbounded_String                         
   )                                                                            
      with Inline;                                                              

private                                                                         

   package Variable_Maps is new Ada.Containers.Hashed_Maps (                    
      Key_Type        => Ada.Strings.Unbounded.Unbounded_String,                
      Element_Type    => Ada.Strings.Unbounded.Unbounded_String,                
      Hash            => Ada.Strings.Unbounded.Hash_Case_Insensitive,           
      Equivalent_Keys => Ada.Strings.Unbounded.Equal_Case_Insensitive,          
      "="             => Ada.Strings.Unbounded."="                              
   );                                                                           

   type Environment is tagged record                                            
      Variables : Variable_Maps.Map;                                            
   end record;                                                                  

end Environments;

我们这里有一个例子包相当好说明我的问题。 我存储一些环境变量在Hashed_Map ,但我想建立在标准的容器中的抽象层,这样我就可以在将来改变垫层容器,但未在我的包的客户更改任何代码。

获取和设置变量很容易 - 如上声明。 真正的问题是迭代。 我想,让我的包的客户来遍历环境,让key和值轻易每个元素。

由于我使用的Ada 2012的最佳方法是使用迭代器,但如何? 我可以返回游标的垫层容器,但同样,这光标的界面将容器依赖。

什么是实现对标准集装箱迭代这种抽象的最好方法?

Answer 1:

看看阿达宝石#127和#128 ,“迭代器在2012年的Ada,零件1&2”,了解如何创建自己的迭代制导。



文章来源: Abstraction over container iterators
标签: iterator ada