ここでは 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を使用しているので、イテレータを使用するのが最善の方法ですが、どうすればよいですか? 下にあるコンテナーにカーソルを返すこともできますが、このカーソルのインターフェイスはコンテナーに依存します。
標準的なコンテナの繰り返しでこのような抽象化を実現する最良の方法は何ですか?