英語版
このページの英語版を見る

dmd.clone

構造体メンバ関数をビルドする。 opEqualsopAssign 、ポストブリット、コピーコンストラクタ、デストラクタを含む。
Authors:

ソース clone.d

pure StorageClass mergeFuncAttrs(StorageClass s1, const FuncDeclaration f);
関数属性pure、nothrow、@safe、@nogc、@disableをマージする。 をs1にマージする。
Parameters:
StorageClass s1 マージするストレージクラス
FuncDeclaration f 関数" にマージする。
Returns:
マージされたストレージ・クラス
FuncDeclaration hasIdentityOpAssign(AggregateDeclaration ad, Scope* sc);
与えられた集約が実際にidentity opAssignを持っているかどうかをチェックする。
Parameters:
AggregateDeclaration ad 構造体またはクラス
Scope* sc 現在のスコープ
Returns:
見つかれば opAssign の FuncDeclaration を返し、見つからなければ null を返す。
FuncDeclaration buildOpAssign(StructDeclaration sd, Scope* sc);
struct に対して opAssign をビルドする。
生成されたopAssign 関数は以下のシグネチャを持つ:
ref S opAssign(S s)    // Sは`struct`の名前である
opAssign関数は、以下の制約が満たされていれば、S 構造体に対して構築される。 以下の制約が満たされる場合、opAssign関数は構造体に対して構築される:
  1. S アイデンティティopAssign が定義されていない。
  2. S 以下のメンバのうち少なくとも1つを持つ。
定義さ
    れたポストブリットを持つフィールドに対して生成さ
れる)、デストラクタ (ユーザー定義または定義されたデストラクタを持つフィールドのために生成された) または、定義されたopAssign を持つ少なくとも1つのフィールド。
  1. S は変更可能なフィールドを持たない。
S が無効なデストラクタを持つか、無効なフィールドを少なくとも1つ持つ場合、 は生成されるが、無効なフィールドのマークが付けられる。 opAssign S.opAssign でマークされている。@disable
S がデストラクタを定義している場合、opAssign の生成コードはこうなる:
S __swap = void;
__swap = this;   // ビットコピー
this = s;        // ビットコピー
__swap.dtor();
そうでなければ、S がポストブリットを定義している場合、opAssign のコードは次のようになる:
this = s;
生成されるopAssign のパラメータは値で渡されることに注釈: これは、上記の両方のポストブリットが(定義されていれば)呼び出されることを意味する。 生成された。 opAssign の本体に入る前に(それが定義されていれば)呼び出されることを意味する。 上記の生成された関数本体の代入はblit式なので、memcpysとみなすことができる。 (opAssign は無限再帰になるので呼び出されない。 は、パラメータが値で渡されたときにすでに呼び出されているので、呼び出されない)。
S がポストブリットもデストラクタも持たないが、 関数を定義するフィールドを少なくとも1つ含む場合(これは、 関数を定義するフィールドを少なくとも1つ含む。 opAssign を定義するフィールドが少なくとも1つ含まれている場合(これは"@disable"ではない)、ボディはメンバ単位の代入を行う。 代入を行う:
this.field1 = s.field1;
this.field2 = s.field2;
...;
この状況では、assignemntsは実際のassign式である(opAssign が定義されていればそれを使用する)。 が定義されている場合)。
Parameters:
StructDeclaration sd のopAssignを生成するための構造体である。
Scope* sc コンテキスト
Returns:
生成されたopAssign 関数。
bool needOpEquals(StructDeclaration sd);
構造体のopEqualsが必要である。 フィールドがopEqualsを持つ場合、構造体のopEqualsが必要である。 ユーザーが指定したものが存在しない場合は、それを生成する。
FuncDeclaration buildOpEquals(StructDeclaration sd, Scope* sc);
構造体の opEquals を構築する。 const bool opEquals(const S s) { ...}
https://issues.dlang.org/show_bug.cgi?id=3789を修正する。 opEqualsは暗黙的に生成されないように変更された。 これで、構造体比較 s1 == s2 は次のように変換される: s1.tupleof==s2.tupleofに変換される。 に変換されるようになった。EqualExp.op_overloadを参照のこと。
FuncDeclaration buildXopEquals(StructDeclaration sd, Scope* sc);
TypeInfo_Struct用に__xopEqualsをビルドする。 bool __xopEquals(ref const S p) const { return this == p; }
これはTypeInfo.equals(p1, p2)によって呼び出される。構造体がconstオブジェクト比較をサポートしていない場合、実行時に をサポートしていない場合、実行時に "not implemented"エラーがスローされる。
FuncDeclaration buildXopCmp(StructDeclaration sd, Scope* sc);
TypeInfo_Struct用に__xopCmpをビルドする。 int __xopCmp(ref const S p) const { return this.opCmp(p); }
これは、TypeInfo.compare(p1, p2)によって呼び出される。構造体がconstオブジェクト比較をサポートしていない場合、実行時に をサポートしていない場合、実行時に "not implemented"エラーがスローされる。
FuncDeclaration buildXtoHash(StructDeclaration sd, Scope* sc);
非ビット単位のハッシュのために_xtoHashを構築する static hash_t xtoHash(ref const S p) nothrow "@trusted";
void buildDtors(AggregateDeclaration ad, Scope* sc);
構造体/クラスのデストラクタを集約して、集約デストラクタを作成する。 userDtors[]内のすべてのデストラクタをすべてのメンバのデストラクタに集約することで、構造体/クラスの集約デストラクタを作成する。 すべてのメンバのデストラクタを集約する。 adのfieldDtor、aggrDtor、dtor、tidtorフィールドを設定する。
Parameters:
AggregateDeclaration ad のデストラクタを構築する構造体またはクラス。
Scope* sc のデストラクタを構築する。

注釈 StructDeclaration::buildPostBlit() とよく似ている、 とよく似ており、順序が変わる(前方ではなく後方に実行される)。

FuncDeclaration buildInv(AggregateDeclaration ad, Scope* sc);
構造体/クラスのすべての不変量をinvsに集約して、包含的な不変量を作成する。 invs[]内のすべての不変量を集約することで、構造体/クラスの包括的な不変量を作成する。
void __invariant() const [pure nothrow @trusted]
{
    invs[0](), invs[1](), ...;
}
FuncDeclaration buildPostBlit(StructDeclaration sd, Scope* sc);
を集約して、構造体の包括的ポストブリットを作成する。 を集約して、構造体の包括的ポストブリットを作成する。 に集約する。 AggregateDeclaration::buildDtor()とよく似ていることに注釈する、 とよく似ており、順序が変わる(後方ではなく前方に実行される)ことに注意。
bool needCopyCtor(StructDeclaration sd, out bool hasCpCtor);
struct sd にコピーコンストラクタが必要かどうかを判断する、 以下の条件を満たす場合:
  1. sdがコピーコンストラクタを定義していない。
  2. sdの少なくとも1つのフィールドがコピーコンストラクタを定義している。
Parameters:
StructDeclaration sd コピーコンストラクタが生成されるstruct
bool hasCpCtor コピーコンストラクタがすでに存在する場合はtrueに設定される
Returns:
true 生成する必要がある場合 そうでなければfalse
bool buildCopyCtor(StructDeclaration sd, Scope* sc);
needCopyCtor() が true を返した場合にコピーコンストラクタを生成する。 生成されるコピーコンストラクタは以下のような形式になる: this(refリターンスコープ inout(S) rhs) inout { this.field1 = rhs.field1; this.field2 = rhs.field2; ... }
Parameters:
StructDeclaration sd コピーコンストラクタが生成されるstruct
Scope* sc コピーコンストラクタが生成されるスコープ
Returns:
true struct sdがコピーコンストラクタを(明示的にまたは生成して)定義している場合、 そうでない場合はfalse