2

ここでは Ada 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が、標準コンテナーの上に抽象化レイヤーを構築したいので、将来、パッケージの顧客のコードを変更せずに下層のコンテナーを変更できます。

上で宣言したように、変数の取得と設定は簡単です。本当の問題は反復です。パッケージの顧客が環境を反復処理して、各要素のキーと値の両方を簡単に取得できるようにしたいと考えています。

私はAda 2012を使用しているので、イテレータを使用するのが最善の方法ですが、どうすればよいですか? 下にあるコンテナーにカーソルを返すこともできますが、このカーソルのインターフェイスはコンテナーに依存します。

標準的なコンテナの繰り返しでこのような抽象化を実現する最良の方法は何ですか?

4

1 に答える 1

2

独自のイテレーターを作成する方法については、Ada Gems #127#128の「Iterators in Ada 2012, Part 1 & 2」を参照してください。

于 2012-08-03T14:10:37.587 に答える