Changes between Initial Version and Version 1 of SPCref_dynamic_join


Ignore:
Timestamp:
Nov 12, 2016, 11:52:05 AM (7 years ago)
Author:
okuma-top
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • SPCref_dynamic_join

    v1 v1  
     1== 動的結合 ==
     2
     3=== 概要 ===
     4
     5動的結合は、実行時に呼び口を受け口に結合させる機能です。
     6結合する側、結合される側、いずれのセルも生成は静的に行われていて、結合を動的に変更することができます。
     7
     8=== 用語 ===
     9
     10==== 動的呼び口 ====
     11  動的(dynamic)指定子が指定されて、動的結合可能な呼び口。
     12  ディスクリプタ設定関数によりディスクリプタ型の値を設定することで、動的結合が行われます。
     13
     14==== ディスクリプタ参照呼び口 ====
     15  ディスクリプタ参照(ref_desc)指定子が指定されて、結合先の受け口のディスクリプタを取得することのできる呼び口。
     16  ディスクリプタ取得関数により、結合先の受け口のディスクリプタ型の値を取得します。
     17
     18==== ディスクリプタ型 ====
     19  受け口ディスクリプタの型。
     20  受け口に対応づいたシグニチャにより型が決定されます。
     21  以下の構文で受け口型を記述します。
     22       'Descriptor' '(' ネームスペースシグニチャ名 ')'
     23  例
     24       Descriptor( sSignature )
     25  TECS CDL においては、関数の引数の型としてのみ用いることができます。
     26  属性や、内部変数、定数の型として用いることはできません。
     27  セルタイプコードにおいては、typedef 型として用いることができます。
     28
     29  自身を含むシグニチャを Descriptor の引数に与えることはできません。
     30
     31== コンポーネント記述 ==
     32
     33動的結合の TECS CDL の記述例を示します。
     34
     35{{{
     36 /*----  (動的結合の対処となる)一般的なシグニチャの例 ------*/
     37 signature sSignature {
     38    initialize();
     39    do_something();
     40    finalize();
     41 };
     42 /*----  ディスクリプタ型を出力するシグニチャの例 ------*/
     43 signature sGetDescriptor {
     44    ER getDescriptor( [out] Descriptor(sSignature) *pDesc );
     45 };
     46 /*----  ディスクリプタ型を入力するシグニチャの例 ------*/
     47 signature sSetDescriptor {
     48    ER setDescriptor( [in] Descriptor(sSignature) desc );
     49 };
     50
     51 /*----  動的呼び口を持つセルタイプの例 ------*/
     52 celltype tCelltype {
     53   [dynamic]
     54     call  sSignature cCallDynamic;
     55   [ref_desc]
     56     call  sSignature cCallRefDesc;
     57   call  sGetDescriptor  cGetDescriptor;  // 呼び口を動的に得る
     58   entry sSetDescriptor  eSetDescriptor;  // 呼び口を動的に設定する
     59 };
     60 /*----  動的呼び口を持つ複合セルタイプの例 ------*/
     61 composite tComposite {
     62   [dynamic]
     63     call  sSignature cCallDynamic;
     64   [ref_desc]
     65     call  sSignature cCallRefDesc;
     66   call  sGetDescriptor  cGetDescriptor;
     67   entry sSetDescriptor  eSetDescriptor;
     68
     69   cell tCelltype Inner{
     70     cCallDynamic = composite.cCallDynamic;
     71     cCallRefDesc = composite.cCallRefDesc;
     72     cGetDescriptor = composite.cGetDescriptor;
     73   };
     74   composite.eSetDescriptor => Inner.eSetDescriptor;
     75 };
     76 }}}
     77
     78=== 適合性 ===
     79
     80動的結合では、以下の条件を満たす必要があります。
     81これらの条件は、セルにディスクリプタの参照と動的呼び口への設定の両方が備わっていることを満たすものです。
     82以下を満たさなくても、コード生成は可能であるが、これらを満たさない場合、使い方に問題があると考えられます。
     83
     84提供、利用、または転送のいずれかにおいて、一つ以上の条件を満たす必要があります。
     85
     86なお、以下の提供、利用、転送の関係において、呼び口、またはディスクリプタ型のシグニチャは一致しなくてはなりません。
     87
     88==== 提供 ====
     89 * 呼び口の ref_desc かつ 受け口の out 引数に Descriptor がある
     90 * 呼び口の ref_desc かつ 呼び口の in 引数に Descriptor がある
     91
     92==== 利用 ====
     93 * 呼び口の dynamic かつ 受け口の in 引数に Descriptor がある
     94 * 呼び口の dynamic かつ 呼び口の out 引数に Descriptor がある
     95 
     96==== 提供と利用====
     97 * 呼び口の dynamic かつ 呼び口の ref_desc  (自己完結.重複)
     98
     99==== 転送 ====
     100 * (受け口の out 引数 or 呼び口の in 引数に Descriptorがある)  かつ (受け口の in 引数 or 呼び口の out 引数に Descriptor がある)
     101
     102 以下は、「提供」、「利用」の逆(自己完結を除く).チェック済みを記憶しないために必要となる規則.
     103 * (受け口の out 引数 or 呼び口の in 引数に Descriptorがある) かつ 呼び口の ref_desc
     104 * (受け口の in 引数 or 呼び口の out 引数に Descriptor がある) かつ 呼び口の dynamic
     105
     106=== その他の適合性 ===
     107
     108以下の各条件について、すべて満たす必要があります。
     109
     110 * シグニチャが、空であってはならない
     111 * ref_desc, dynamic を指定された呼び口に対応付いたシグニチャは、引数にディスクリプタ型を含んではいけない
     112 * ref_desc と dynamic の両方を一つの呼び口に指定することはできない
     113 * ref_desc, dynamic と omit は両立しない
     114 * ref_desc, dynamic を呼び口配列に指定することができる
     115 * Descriptor は、関数の in, out, inout 引数にのみ用いることができる
     116     セルタイプコードにおいては、この制限はない
     117 * Descriptor を含むシグニチャを Descriptor の引数に指定することはできない
     118   * ヘッダファイルの相互参照が起きないことを保障できる
     119   * 動的な受け口を、動的に渡すような、ことを許さない
     120 * Descriptor の引数が、自身を含むシグニチャの場合
     121    Descriptor の引数が、自身を含むシグニチャとすることはできない。
     122    このシグニチャは、dynamic や ref_desc の指定された呼び口に対応付けられると考えられるが、ディスクリプタ型の引数を持つシグニチャ sGetDesc を指定することができないため、別途エラーとなる。
     123{{{
     124signature sGetDesc {
     125   void  func( [out]Descriptor( sGetDesc ) *desc );  // Descriptor の引数が、自身を含むシグニチャ
     126};
     127}}}
     128
     129== 他の指定子との併用 ==
     130
     131ダイナミック指定子を他の指定子と併用する場合について、説明します。
     132
     133=== オプショナル(optional)指定子との併用 ===
     134
     135オプショナル指定子は、動的(dynamic)指定子、ディスクリプタ参照(ref_desc)指定子のいずれとも同時に指定できます。
     136
     137オプショナル指定かつ動的指定された呼び口を未結合にすることができます。未結合(unjoin)にするセルタイプコードの記述方法は、セルタイプコードの節を参照してください。
     138
     139ディスクリプタ参照(ref_desc) 指定された呼び口が、オプショナル指定されている場合、未結合状態を返す可能性があります。
     140未結合状態のディスクリプタを動的呼び口に設定してはなりません。アサーと(assert) により、例外検出します。
     141未結合状態のディスクリプタを動的呼び口に設定するのではなく、未結合化(unjoin) します。「オプショナル指定されたディスクリプタ参照呼び口の注意点」の項を参照してください。
     142
     143=== 省略 (omit) 指定子との併用 ===
     144
     145併用することはできません。
     146動的(dynamic)指定子や、ディスクリプタ参照(ref_desc)指定子を、省略(omit)指定子と同時に指定することはできません。
     147
     148== セルタイプコード ==
     149
     150動的結合のセルタイプコードの書き方について説明します。
     151
     152=== ディスクリプタ型 ===
     153
     154セルタイプコードにおいて、ディスクリプタ型は、引数以外にも用いることができます。
     155ディスクリプタ型は、TECS CDL と同様の記述であるが、ネームスペースシグニチャ名ではなく、シグニチャのグローバル名を引数とします。
     156
     157TECS CDL の記述
     158{{{
     159    Descriptor( nNameSpace::sSignature )
     160}}}
     161セルタイプコード
     162{{{
     163    Descriptor( nNameSpace_sSignature )
     164}}}
     165
     166コード例
     167{{{
     168    Descriptor( sDynamicSignature ) desc;  // ディスクリプタ型の変数の定義
     169}}}
     170
     171=== ディスクリプタの参照(取得) ===
     172
     173ディスクリプタ参照(ref_desc)指定された呼び口(cRefDescCall)に結合された受け口のディリプタを参照する (取得する) コードの例を示します。
     174{{{
     175    desc = cRefDescCall_refer_to_descriptor();
     176}}}
     177
     178呼び口(cRefDescCall)が呼び口配列の場合、コードの例は、以下の通りです。
     179{{{
     180    desc = cRefDescCall_refer_to_descriptor( i );
     181}}}
     182
     183
     184=== オプショナル指定されたディスクリプタ参照呼び口の注意点 ===
     185
     186オプショナル指定されたディスクリプタ参照呼び口からは、未結合状態(内部的にはNULL) が得られる可能性があります。
     187これをテストするには is_descriptor_unjoined マクロを用います。
     188
     189{{{
     190    is_descritpror_unjoined( descriptor )
     191}}}
     192
     193引数 descriptor にはディスクリプタ型の変数を与えてください。
     194
     195なお、ディスクリプタ参照(ref_desc)指定された呼び口(cOptinalRefDescCall)が結合されていることをテストするには、以下のマクロを用います。
     196これは、動的に限らず、オプショナルな呼び口において、結合されていることをテストするマクロと同じです。
     197{{{
     198   is_cOptinalRefDescCall_joined()   // int 値を返す。結合済みなら 1, そうでなければ 0 を返す
     199}}}
     200
     201参考:引数のヌルアブル(nullable)指定子は、ディスリプタ型へのポインタがヌルとなりうるかどうかを示すもので、ディスクリプタ型が未結合状態 (内部的にはNULL) であることを示すものではない。
     202
     203=== 動的結合の実行 ===
     204
     205動的(dynamic)指定された呼び口(cDyanmicCall)に、受け口のディスクリプタを設定する、すなわち動的結合するコードの例は、以下の通りです。
     206{{{
     207    cDynamiCall_set_descriptor( desc );
     208}}}
     209
     210=== オプショナル指定された動的呼び口の未結合化 ===
     211
     212オプショナル(optional)指定された呼び口(cDyanmicOptionalCall)の場合は、未結合にすることができるが、この場合はアンジョイン関数を使用します。
     213結合を解除する目的で desc に NULL を渡すのは、誤りです。
     214
     215{{{
     216    cOptionalDyamicCall_unjoin();
     217}}}
     218
     219=== 動的呼び口配列の場合の動的結合の実行、未結合化 ===
     220
     221オプショナルな呼び口(cDyanmicOptionalCall)が呼び口配列の場合は、以下のように記述します。
     222
     223呼び口配列の場合の、動的結合の実行
     224{{{
     225    cDynamiCall_set_descriptor( i, desc );
     226}}}
     227
     228呼び口配列の場合の、未結合化
     229{{{
     230    cOptionalDyamicCall_unjoin( i );
     231}}}