13.5.1 操作のパラメータおよびシグネチャ

次の表には、受渡しされる型に応じた、基本OMG IDLパラメータ渡しモードおよび戻り値の型のマッピングを示します。次の表に、T_var型の同じ情報を示します。次の表は情報提供のみを目的としています。クライアントとサーバーの両方の操作のシグネチャは、次の表に示すパラメータ受渡しモードに基づいて記述されることが想定されています。ただし、T_out型は、すべてのoutパラメータの実際のパラメータ型として使用されます。

また、T_var型では、この型を直接渡すのに必要な変換演算子をサポートします。呼出し側は、T_var型または次の表に示すベース・タイプのインスタンスを常に渡す必要があります。呼出し先は、そのT_outパラメータが実際に次の表の対応する、基底の型であるように扱う必要があります。

次の表では、固定長配列は、outの型が

戻り値と異なります。これが必要となるのは、C++では関数で配列を返すことができないためです。マッピングは、配列のスライスへのポインタを返します。

スライスとは、元の配列のすべてのディメンションを持つ配列です。

ただし、最初のディメンションを除きます。

表13-7 基本的な引数と結果の受渡し

データ型 In Inout Out 戻り値
short Short Short& Short& Short
long Long Long& Long& Long&
unsigned short UShort UShort& UShort& UShort&
unsigned long ULong ULong& ULong& ULong&
float Float Float& Float& Float&
double Double Double& Double& Double&
boolean Boolean Boolean& Boolean& Boolean&
char Char Char& Char& Char&
wchar WChar WChar& WChar& WChar&
octet Octet Octet& Octet& Octet&
enum enum enum& enum& enum&
object reference ptr(後述のノートを参照) objref_ptr objref_ptr& objref_ptr& objref_ptr
struct(固定長) const struct& struct& struct& struct
struct(可変長) const struct& struct& struct*& struct*
union(固定長) const union& union& union& union
union(可変長) const union* union& union& union
string const char char*& char*& char*
wstring const WChar WChar*& WChar*& WChar*
sequence const sequence& sequence& sequence*& sequence*
array(固定長) const array array array array slice *(後述のノートを参照)
array(可変長) const array array array slice *& array slice *
any const any& any& any*& any*

ノート:

データ型object reference ptrには、擬似オブジェクト参照も含まれています。配列スライスの戻り値は、元の配列の最初のディメンションを除いたすべてのディメンションを持つ配列です。

呼出し側は、in引数として渡される引数すべてにストレージを提供する必要があります。

表13-8 T_varの引数と結果の受渡し

データ型 In Inout Out 戻り値
object reference var(後述のノートを参照) const object objref_var& objref_var& objref_var
struct_var const struct_var& struct_var& struct_var& struct_var
union_var const union_var& union_var& union_var& union_var
string_var const string_var& string_var& string_var& string_var
sequence_var const sequence_var& sequence_var& sequence_var& sequence_var
array_var const array_var& array_var& array_var& array_var
any_var const any_var& any_var& any_var& any_var

ノート:

object reference varデータ型には、擬似オブジェクト参照も含まれています。

次の表では、inoutパラメータおよびoutパラメータに関連付けられたストレージ、ならびに戻り値の結果に対する呼出し側の操作について説明します。

表13-9 引数のストレージに対する呼出し側の作業

inoutパラメータ outパラメータ 戻り結果
short 1 1 1
long 1 1 1
unsigned short 1 1 1
unsigned long 1 1 1
float 1 1 1
double 1 1 1
boolean 1 1 1
char 1 1 1
wchar 1 1 1
octet 1 1 1
enum 1 1 1
object reference ptr 2 2 2
struct(固定長) 1 1 1
struct(可変長) 1 3 3
union(固定長) 1 1 1
union(可変長) 1 3 3
string 4 3 3
wstring 4 3 3
sequence 5 3 3
array(固定長) 1 1 6
array(可変長) 1 6 6
any 5 3 3

具体的には、関数名およびデータ型として使用されるexception

表13-10 引数の受渡しのケース

ケース
1 呼出し側は必要なストレージをすべて割り当てます。ただし、パラメータ自体の中でカプセル化および管理できるストレージは除きます。inoutパラメータの場合、呼出し側は初期値を指定し、呼出し先はその値を変更できます。outパラメータの場合、呼出し側はストレージを割り当てますが初期化する必要はなく、呼出し先が値を設定します。関数は値で戻り値を返します。
2 呼出し側は、オブジェクト参照のストレージを割り当てます。inoutパラメータの場合、呼出し側は初期値を指定します。呼出し先がinoutパラメータを再割り当てする場合は、まず、元の入力値でCORBA::releaseを呼び出します。inoutとして渡されたオブジェクト参照を引き続き使用するには、呼出し側は最初にリファレンスを複製する必要があります。そして、outをすべて解放してから、オブジェクト参照を返します。ほかの構造体に埋め込まれたオブジェクト参照はすべて、各構造体自体によって自動的に解放されます。
3 outパラメータの場合、呼出し側はポインタを割り当て、リファレンスでそれを呼出し先に渡します。呼出し先は、パラメータの型の有効なインスタンスを指すようにポインタを設定します。戻り値の場合は、呼出し先は同様のポインタを返します。どちらの場合でも、呼出し先はNULLポインタを返すことはできません。

どちらの場合でも、呼出し側は戻り値のストレージを解放する必要があります。ローカルまたはリモートの透過性を維持するには、呼出し先が呼出し側と同じアドレス空間にあるか、異なるアドレス空間にあるかどうかに関係なく、呼出し側は常に戻り値のストレージを解放しなければなりません。これを行う場合は、呼出し側は最初に戻り値のインスタンスを新しいインスタンスにコピーしてから、新しいインスタンスを変更する必要があります。

4 inout文字列の場合、呼出し側は、入力文字列とそれを指すchar*の両方にストレージを割り当てます。呼出し先が入力文字列の割当てを解除し、新しいストレージを指すchar*を再割り当てして出力値を保持する可能性があるため、呼出し側はstring_alloc()を使用して入力文字列を割り当てる必要があります。そのため、out文字列のサイズはin文字列のサイズに制限されません。呼出し側は、string_free()を使用してoutのストレージを削除する必要があります。呼出し先は、inout、out、または戻り値に対してNULLポインタを返すことはできません。
5 inoutシーケンスおよびanyの場合、シーケンスまたはanyを作成したBoolean解放パラメータの状態によっては、シーケンスまたはanyを割り当てまたは変更することにより、再割当てが行われる前に、所有しているストレージの割当てが解除される場合があります。
6 outパラメータの場合、呼出し側は配列スライス(元の配列の最初のディメンションを除いたすべてのディメンションを持つ配列)へのポインタを割り当て、リファレンスでポインタを呼出し先に渡します。呼出し先は、配列の有効なインスタンスを指すようにポインタを設定します。

戻り値の場合は、呼出し先は同様のポインタを返します。どちらの場合でも、呼出し先はNULLポインタを返すことはできません。どちらの場合でも、呼出し側は戻り値のストレージを解放する必要があります。

ローカルまたはリモートの透過性を維持するには、呼出し先が同じアドレス空間にあるか、異なるアドレス空間にあるかに関係なく、呼出し側は常に戻り値のストレージを解放する必要があります。リクエストが完了した後は、呼出し側は戻り値のストレージの値を変更することはできません。これを行う場合は、呼出し側は最初に戻り値の配列インスタンスを新しい配列インスタンスにコピーしてから、新しいインスタンスを変更する必要があります。