Ada 202x (35日目) - 標準ライブラリ¶
標準ライブラリの変更を俯瞰します。
今回は一覧したいため目次を付けておきます。
変更があったもの¶
全体的に Nonblocking や Global 、事前条件/事後条件、 Allows_Exit 等のアスペクトが追加されました。
またいくつかの型は 'Image 属性が返す文字列の書式も定められました。
Ada.Calendar.Time_Zones¶
Time_Offset の符号の意味が定められました。
日本のタイムゾーンをUTC+9と表記する時の符号と同じです。
Ada.Command_Line¶
各関数が返す文字列の 'First は 1 だと定められました。
Ada.Containers.*¶
標準コンテナは、同じコンテナオブジェクトでも異なるスレッドが異なる要素に同期なしにアクセスしても大丈夫と定められました。
また Parallel_Iterator / Parallel_Reversible_Iterator がサポートされました。
aggregate式がサポートされました。
Iterator_View アスペクトが指定されcontainer element iterator(of 形式)のループが少し効率的になりました。
そのために各コンテナに入れ子のパッケージ Stable が追加されています。
コンテナの要素型が終了処理を必要とする場合、実際に終了処理が行われるタイミングは実装依存と定められました。
終了処理を行わないまま保持しておいて使い回すような実装も認めらた、というより Vectors を配列で実装した既存の実装は大体そんなものだった(わざわざ毎回placement new/delete的なことをしてない)のが追認されたことになります。
Ada.Directories¶
Simple_Name と Containing_Directory にルートディレクトリを渡した場合の挙動が定められました。
Simple_Name が与えられたルートディレクトリをそのまま返し、Containing_Directory は Use_Error になります。
理由としてPOSIXコマンドの basename / が / になるからみたいに書かれてるのですけれども dirname / だって / になることにどなたも気付かれなかったのでしょうか……。
あ、動作自体はこれでいいと思います。
Ada.Synchronous_Task_Control¶
元々 Suspend_Until_True は同じオブジェクトを使って複数スレッドを同時に待たせることはできませんでした。
複数スレッドが同じオブジェクトを引数にして同時に呼び出した場合 Program_Error になると明確に定められました。
Ada.Task_Identification¶
Activation_Is_Complete に Null_Task_Id が渡された場合 Program_Error になると明確に定められました。
Interfaces¶
Shift_Left 、 Shift_Right 、Shift_Right_Arithmetic 、Rotate_Left 、Rotate_Right で各型のビット数を超えてシフト/ローテートした時の挙動が定められました。
Shift_Left と Shift_Right は 0 になります。
Shift_Right_Arithmetic は全ビットが符号ビットと同じになります。
Rotate_Left と Rotate_Right はどれだけ大きなローテート幅が渡されても指定分ローテートします。
単純にCPUのシフト/ローテート命令を使っただけでは、型のビット数を超えたシフト/ローテートの挙動はCPUによってまちまちでした。
System.Storage_Pools¶
Pure になりました。
Subpools は Preelaborate のままです。
System.Storage_Pools.Subpools¶
終了処理の順番が定められました。 割り当てられたオブジェクトの終了処理をメモリ解放よりも先に行います。
Root_Storage_Pool_With_Subpools が Preelaborable_Initialization になりました。
新しく追加されたライブラリ¶
翻訳単位ごと追加されたものです。
Ada.Containers.Bounded_Indefinite_Holders¶
Indefinite_Holders の更にBounded版です。
追加の動的割り当てなしで固定サイズの領域に可変サイズの値を入れるためのコンテナです。
generic の引数として指定した Max_Element_Size_in_Storage_Elements を超える場合は Program_Error になります。
Ada.Numerics.Big_Numbers¶
Ada.Numerics.Big_Numbers.Big_Integers¶
Ada.Numerics.Big_Numbers.Big_Reals¶
21日目を参照。
Ada.Streams.Storage¶
Ada.Streams.Storage.Bounded¶
Ada.Streams.Storage.Unbounded¶
7日目を参照。
Ada.Strings.Text_Buffers¶
Ada.Strings.Text_Buffers.Bounded¶
Ada.Strings.Text_Buffers.Unbounded¶
15日目を参照。
Ada.Wide_Command_Line¶
Ada.Wide_Directories¶
Ada.Wide_Environment_Variables¶
Ada.Wide_Wide_Command_Line¶
Ada.Wide_Wide_Directories¶
Ada.Wide_Wide_Environment_Variables¶
1日目を参照。
System.Atomic_Operations¶
System.Atomic_Operations.Exchange¶
System.Atomic_Operations.Integer_Arithmetic¶
System.Atomic_Operations.Modular_Arithmetic¶
System.Atomic_Operations.Test_And_Set¶
32日目を参照。
新しく追加されたエンティティ¶
既存の翻訳単位の中に追加されたものです。
Ada.Containers.*¶
各コンテナに入れ子のパッケージ Stable が追加されました。
27日目を参照。
各コンテナに Has_Element 、 Next 、 Previous のオーバーロードが追加されました。
コンテナと Cursor の2つの引数を取ります。
各コンテナに Empty が追加されました。
6日目を参照。
各コンテナに Equal_Element が追加されました。
要素型の "=" 演算子の別名です。
各コンテナに Tampering_With_Cursors_Prohibited と Tampering_With_Elements_Prohibited が追加されました。
tampering checkを事前条件の中で書くためのものです。
Ada.Containers.Doubly_Linked_Lists¶
Same_Object が追加されました。
2つのコンテナオブジェクトが同じかどうかを判定します。
'Has_Same_Storage 属性で充分だったのではという気はします。
Append_One が追加されました。
52日目を参照。
Ada.Containers.Indefinite_Holders¶
Swap が追加されました。
48日目を参照。
Ada.Containers.Vectors¶
Append_One が追加されました。
6日目を参照。
Append 、 Prepend 、 Insert のオーバーロードされた Vector を追加する版が Append_Vector 、 Prepend_Vector 、 Insert_Vector として分離されました。
53日目を参照。
Ada.Direct_IO¶
Ada.Sequential_IO¶
Ada.Streams.Stream_IO¶
Ada.Text_IO¶
Ada.Wide_Text_IO¶
Ada.Wide_Wide_Text_IO¶
入れ子のパッケージ Wide_File_Names と Wide_Wide_File_Names が追加されました。
1日目を参照。
Ada.Dispatching.EDF¶
相対時間でデッドラインを扱う多くのエンティティが追加されました。 31日目を参照。
Ada.Iterator_Iterfaces¶
Parallel_Iterator と Parallel_Reversible_Iterator が追加されました。
11日目を参照。
Ada.Numerics.Discrete_Random¶
Random 関数に範囲をより絞り込めるオーバーロードが追加されました。
Ada.Wide_Characters¶
Is_Basic と To_Basic が追加されました。
28日目を参照。
Is_NFKC が追加されました。
34日目を参照。
Ada.Wide_Wide_Characters¶
Ada.Wide_Characters と同じ変更が加えられています。
Interfaces.C¶
bool C_bool が追加されました。
55日目を参照。
ターゲット環境のCコンパイラが long long をサポートしている場合にAdaコンパイラは long_long と unsigned_long_long を提供しないといけません。
Interfaces.Fortran¶
入れ子のパッケージ Double_Precision_Complex_Types 、型 Double_Complex と Double_Imaginary が追加されました。
Fortranの complex(kind(0d0)) に対応します。
関連AI¶
AI12-0058-1 The Fortran Annex needs updating to support Fortran 2008
AI12-0112-1 Contracts for container operations
AI12-0144-1 Make Discrete_Random more flexible
AI12-0171-1 Ambiguity in Synchronous_Task_Control semantics
AI12-0184-1 Long Long C Data Types
AI12-0196-1 Concurrent access to Ada container libraries
AI12-0231-1 Null_Task_Id and Activation_Is_Complete
AI12-0235-1 System.Storage_Pools should be pure
AI12-0254-1 Bounded_Indefinite_Holders
AI12-0258-1 Containers and controlled element types
AI12-0259-1 Lower bound of strings returned from Ada.Command_Line
AI12-0264-1 Overshifting and overrotating
AI12-0286-1 Allows_Exit aspect should be used on language-defined subprograms
AI12-0304-1 Image attributes of language-defined types
AI12-0331-1 Order of finalization of a subpool
AI12-0336-1 Meaning of Time_Offset
AI12-0337-1 Simple_Name("/") in Ada.Directories