IDL any型 |
IDLの基本データのひとつです。
4.4.1.15. CORBA::Anyクラス |
CORBA::AnyはIDLのサポートしているあらゆるデータ型を表現できるクラスです。あらゆるデータ型を表現するために、実データはvoid*型で保持されます。また、void*から正しい型に戻すために、CORBA::Anyはデータの型を表すタイプコードを保持しています。
CORBA::Anyに対して値を設定したり値を取り出す操作を行うときに、IDL既定義型のうち複雑なものについては補助的な型が定義されています。
これらの型定義は、「CORBA::Anyの利用を補助する型」を参照してください。
CORBA::Any値の持ち方は2とおりあります。ひとつは、あるデータを単にvoid*型で保持しておく方法で、このように持っている値をtyped valueといいます。もうひとつは、CDRでマーシャリングしたsequence<octet>のデータとして保持する方法で、このように持っている値をuntyped valueといいます。
Any | デフォルトコンストラクタ |
Any(const CORBA::Any&) | コピーコンストラクタ |
Any(CORBA::TypeCode_ptr, void*, CORBA::Boolean) | 初期化を行うコンストラクタ |
~Any | デストラクタ |
operator=(const CORBA::Any&) | 代入オペレータ |
operator>>=(<basic
type A>&) const operator>>=(const char*&) const operator>>=(char*&) const operator>>=(const CORBA::Any*&) const operator>>=(CORBA::Any&) const |
値を取り出す |
<basic type A>にはCORBA::Short, CORBA::UShort, CORBA::Long, CORBA::ULong, CORBA::LongLong, CORBA::ULongLong, CORBA::Float, CORBA::Double, CORBA::LongDouble が入ります。
<basic type B>にはboolean, char, wchar, octet, (固定長)string, (固定長)wstring, objectが入ります。たとえばbooleanならばto_booleanとなります。
ユーザ定義の型については、<user type>型を扱うオペレータがIDLコンパイラによって自動的に生成されます。
<basic type A>にはCORBA::Short, CORBA::UShort, CORBA::Long, CORBA::ULong, CORBA::LongLong, CORBA::ULongLong, CORBA::Float, CORBA::Double, CORBA::LongDouble が入ります。
<basic type B>にはboolean, char, wchar, octet, (固定長)string, (固定長)wstringが入ります。たとえばbooleanならばfrom_booleanとなります。
ユーザ定義の型については、<user type>型を扱うオペレータがIDLコンパイラによって自動的に生成されます。
replace(CORBA::TypeCode_ptr,
void*, CORBA::Boolean) replace(CORBA::TypeCode_ptr, void*) |
CORBA::Anyが保持している値を別の値に置き換える |
type | CORBA::Anyが保持しているタイプコードを取得する |
value | CORBA::Anyが保持している値を取得する |
__is_equal | CORBA::Anyが保持している値が同じかを調べる |
__is_typed_value | CORBA::Anyが保持している値がtyped valueか調べる |
__to_untyped_value | CORBA::Anyが保持している値をuntyped valueに変換する |
CORBA::Any::Any - デフォルトコンストラクタ
#include <orb.h> CORBA::Any::Any();
CORBA::Anyのインスタンスを作成します。タイプコードにCORBA::tk_nullを設定し、値は何も持ちません(ヌル・ポインタがセットされます)。
ありません。
起こりません。
CORBA::Any::Any(const CORBA::Any&) - コピーコンストラクタ
#include <orb.h> CORBA::Any::Any(const CORBA::Any& rval);
CORBA::Anyのインスタンスを作成し、rvalが保持している値をコピーします。
ありません。
値のコピーに失敗したときは値としてヌル・ポインタがセットされます。
CORBA::Any::Any(CORBA::TypeCode_ptr, void*, CORBA::Boolean)
- 初期化を行うコンストラクタ
#include <orb.h> CORBA::Any::Any( CORBA::TypeCode_ptr tc, void* value, CORBA::Boolean release );
CORBA::Anyのインスタンスを作成し、タイプコードと値を設定します。
tcにはCORBA::Anyに挿入する値の型を表すタイプコードを指定します。
valueにはCORBA::Anyに挿入する値をvoid*型で指定します。
releaseにはvalueで指定した値のメモリ管理を行うかどうかを指定します。
releaseに1を指定したときは、valueが指している領域の解放はCORBA::Anyによって行われます。CORBA::Anyによるvalueの解放は、CORBA::Anyが消滅したときや別の値を挿入したときに起こります。CORBA::Anyに挿入した後は、挿入した値を操作してはいけません。
ありません。
起こりません。
本関数は型に関して検査を行いません。設定する値とその型を表すタイプコードは一致させなければなりません。
CORBA::Any::~Any - デストラクタ
#include <orb.h> CORBA::Any::~Any();
CORBA::Anyのインスタンスを削除します。このとき、必要であれば保持している値を解放します。
ありません。
起こりません。
CORBA::Any::operator=(const CORBA::Any&) - 代入オペレータ
#include <orb.h> CORBA::Any& CORBA::Any::operator=(const CORBA::Any& rval);
rvalが保持している値とタイプコードをコピーし、自分自身への参照を返します。もし値を保持していて、かつ、その値のメモリ管理を行っているのであれば、古い値を解放してからコピーします。
自分自身への参照を返します。
コピーに失敗したときは値にヌル・ポインタがセットされます。
CORBA::Any::operator>>=(<basic type A>&)
const
CORBA::Any::operator>>=(const char*&) const
CORBA::Any::operator>>=(char*&) const
CORBA::Any::operator>>=(const CORBA::Any*&) const
CORBA::Any::operator>>=(CORBA::Any&) const
CORBA::Any::operator>>=(to_<basic type B>) const
CORBA::Any::operator>>=(const CORBA::Any&, <user type>*&) const
- 値を取り出す
#include <orb.h> // CORBA::Short, CORBA::UShort, CORBA::Long, CORBA::ULong, // CORBA::LongLong, CORBA::ULongLong, CORBA::Float, // CORBA::Double, CORBA::LongDouble CORBA::Boolean CORBA::Any::operator>>=(<basic type A>& x) const; // 可変長文字列 CORBA::Boolean CORBA::Any::operator>>=(const char*& x) const; CORBA::Boolean CORBA::Any::operator>>=(char*& x) const; // Any CORBA::Boolean CORBA::Any::operator>>=(const CORBA::Any*& x) const; CORBA::Boolean CORBA::Any::operator>>=(CORBA::Any& x) const; // boolean, char, wchar, octet, (固定長)string, (固定長)wstring, object // 値の取り出しを補助する型to_XXXを利用する CORBA::Boolean CORBA::Any::operator>>=(to_<basic type B> x) const; // ユーザ定義型 CORBA::Boolean CORBA::Any::operator>>=(const CORBA::Any& any, <user type>*& x) const;
CORBA::Anyが保持している値をxに取り出します。このとき、CORBA::Anyが保持しているタイプコードとxの型が一致しているか調べます。値の取り出しが成功したときは1を返し、失敗したときは0を返します。
>>=オペレータは各型ごとに用意されます。
<basic type A>にはCORBA::Short, CORBA::UShort, CORBA::Long, CORBA::ULong,
CORBA::LongLong, CORBA::ULongLong, CORBA::Float, CORBA::Double, CORBA::LongDouble
が入ります。
xがこれらの型の場合、自分自身が保持している値を直接xに代入します。
例) CORBA::AnyからCORBA::Long型の値を取り出す。
CORBA::Long value; CORBA::Any a; a <<= CORBA::Long(42); // 値の挿入 if (a >>= value) { // 値の取り出し // 値を使用する }
xがconst char*型のときは、自分自身が保持している値(char*)を直接xに代入します。xのメモリ管理はanyにありますのでxを解放してはいけません。
xがchar*型のときは、自分自身が保持している値(char*)をCORBA::string_dup関数でコピーした値(char*)をxに代入します。
例) CORBA::Anyから可変長文字列を取り出す。
const char* value; CORBA::Any a; a <<= (const char*)"string"; // 値の挿入 if (a >>= value) { // 値の取り出し // 値を使用する(値は解放してはいけない) }
xがCORBA::Any型のときは、自分自身が保持している値(CORBA::Any*)が指すCORBA::Anyをxにコピーします。
xがconst CORBA::Any*型のときは、自分自身が保持している値(CORBA::Any*)を直接xに代入します。xのメモリ管理はanyにありますのでxを解放してはいけません。
<basic type B>にはboolean, char, wchar, octet, (固定長)string, (固定長)wstring, object,value, abstract_baseが入ります。たとえばbooleanならばto_booleanとなります。to_XXX型は値の取り出しを補助するための型です。これらの型定義は「CORBA::Anyの利用を補助する型」を参照してください。
boolean, char, wchar, octetの場合は、自分自身が保持している値をキャストしてx.refに代入します。たとえば、booleanならCORBA::Booleanにキャストします。
(w)stringの場合は、まずx.boundの大きさの領域をCORBA::(w)string_allocオペレーションにより確保し、x.valに代入します。つぎに自分自身が保持している値をx.valが指している領域にコピーします。
objectの場合は、自分自身が保持している値をCORBA::Object型にワイドニング(widening)してx.refに代入します。
例) CORBA::AnyからCORBA::Boolean型と文字列を取り出す。
// CORBA::Booleanの例 CORBA::Boolean b = 1; CORBA::Any a; a <<= CORBA::Any::from_boolean(b); // 値の挿入 ... if (a >>= CORBA::Any::to_boolean(b)) { // 値の取り出し // ...booleanの取り出し成功 } // 文字列の例 char* p = "bounded"; a <<= CORBA::Any::from_string(p, 8); // 固定長文字列の挿入 ... if (a >>= CORBA::Any::to_string(p, 8)) { // 値の取り出し // ...文字列取り出し成功 }
ユーザ定義の型については、<user type>型を扱うオペレータがIDLコンパイラによって自動的に生成されます。
使い方はCORBA::Shortなどの場合と変わりません。anyが保持している値がxに返されます。
例) CORBA::Anyから構造体を取り出す。
// IDL struct MyStruct { long lmem; short smem; }; // C++ CORBA::Any a; MyStruct *sp = new MyStruct; ... a <<= sp; // aにMyStructの値を設定。メモリ管理がCORBA::Anyに移る。 MyStruct *struct_ptr; if (a >>= struct_ptr) { // 値の取り出し // 値を使用可能 }
配列の取り出しにはArray_forany(実際にはArrayの部分に配列の型名が入る)という補助型がIDLコンパイラによって生成されます。配列を取り出す例についてはC++マッピング「anyからの値の取り出し」を参照してください。
取り出しに成功した場合は1が返ります。失敗した場合には0が返ります。
失敗した場合には0が返ります。また、メモリの確保をともなう操作の場合はxに0が返されます。
CORBAの仕様変更により、文字列取り出しオペレータはCORBA::Any::operator>>=(char*&) constからCORBA::Any::operator>>=(const char*&) constに、CORBA::Any取り出しオペレータはCORBA::Any::operator>>=(CORBA::Any&) constからCORBA::Any::operator>>=(const CORBA::Any*&) constにそれぞれ変わりました。今バージョンでは、過去のソースコードとの互換のために旧オペレータをサポートしますが今後のバージョンでのサポートは保証しません。新規に作成するプログラムでは、これらの旧オペレータを使用しないでください。
CORBA::String_var型を引数にして可変長文字列を取り出す場合、R4.5以前のバージョンでは、CORBA::Any::operator>>=(char*&) constが呼び出されますが、R5.1では、CORBA::Any::operator>>=(char*&) constとCORBA::Any::operator>>=(const char*&) constのどちらのオペレータが呼び出されるかは不定(コンパイラ依存)です。R4.5以前と同様の動作をさせたいときは、引数のCORBA::String_varをchar*&で明示的にキャストする必要があります。
CORBA::Any_var型を引数にしてCORBA::Anyを取り出す場合、R4.5以前のバージョンでは、CORBA::Any::operator>>=(CORBA::Any&) constが呼び出されますが、R5.1では、CORBA::Any::operator>>=(CORBA::Any&) constとCORBA::Any::operator>>=(const CORBA::Any*&) constのどちらのオペレータが呼び出されるかは不定(コンパイラ依存)です。R4.5以前と同様の動作をさせたいときは、引数のCORBA::Any_varをCORBA::Any&で明示的にキャストする必要があります。
CORBA::Any::operator<<=(<basic type A>)
CORBA::Any::operator<<=(const char*)
CORBA::Any::operator<<=(char*)
CORBA::Any::operator<<=(const CORBA::Any&)
CORBA::Any::operator<<=(CORBA::Any*)
CORBA::Any::operator<<=(const CORBA::Any_var&)
CORBA::Any::operator<<=(from_<basic type B>)
CORBA::Any::operator<<=(CORBA::Any&, const
<user type>&)
CORBA::Any::operator<<=(CORBA::Any&, <user
type>*)
- 値を挿入する
#include <orb.h> // CORBA::Short, CORBA::UShort, CORBA::Long, CORBA::ULong, // CORBA::LongLong, CORBA::ULongLong, CORBA::Float, // CORBA::Double, CORBA::LongDouble void CORBA::Any::operator<<=(<basic type A> x); // 可変長文字列 void CORBA::Any::operator<<=(const char* x) void CORBA::Any::operator<<=(char* x) // Any void CORBA::Any::operator<<=(const CORBA::Any& x) void CORBA::Any::operator<<=(CORBA::Any* x) void CORBA::Any::operator<<=(const CORBA::Any_var& x) // boolean, char, wchar, octet, (固定長)string, (固定長)wstring // 値の取り出しを補助する型from_XXXを利用する void CORBA::Any::operator<<=(from_<basic type B> x); // ユーザ定義型 void CORBA::Any::operator<<=(CORBA::Any& any, const <user type>& x); void CORBA::Any::operator<<=(CORBA::Any& any, <user type>* x);
anyに値xを挿入します。このとき、anyが保持するタイプコードはxの型と一致するように自動的に設定されます。
<<=オペレータは各型ごとに用意されます。
<basic type A>にはCORBA::Short, CORBA::UShort, CORBA::Long, CORBA::ULong,
CORBA::LongLong, CORBA::ULongLong, CORBA::Float, CORBA::Double, CORBA::LongDouble
が入ります。
xがこれらの型の場合、xの値が直接any内部に保持されます。
例) CORBA::AnyにCORBA::Long型の値を挿入する。
CORBA::Long value; CORBA::Any a; a <<= CORBA::Long(42); // 値の挿入
xがconst char*型の場合は、xをCORBA::string_dup関数でコピーした値(char*)をany内部に保持します。
xがchar*型の場合は、xの値(char*)が直接any内部に保持されます。xのメモリ管理がanyへ移りますのでxを解放してはいけません。
例) CORBA::Anyに可変長文字列を挿入する。
char* str1 = CORBA::string_dup("string1"); const char* str2 = "string2"; CORBA::Any a; a <<= str1; // str1のメモリ管理がanyへ移るためstr1を解放してはいけない a <<= str2; // str2のコピーがanyに保持される
operator<<=(const CORBA::Any& x)はxのコピーを生成して自分自身に挿入します。
operator<<=(const CORBA::Any* x)はxをコピーせずに自分自身に挿入します。xのメモリ管理は挿入した側に移ります。
operator<<=(const CORBA::Any_var& x)はxのコピーを生成して自分自身に挿入します。
<basic type B>にはboolean, char, wchar, octet, (固定長)string, (固定長)wstringが入ります。たとえばbooleanならばfrom_booleanとなります。from_XXX型は値の挿入を補助するための型です。これらの型定義は「CORBA::Anyの利用を補助する型」を参照してください。
boolean, char, wchar, octetの場合は、x.valをnewして自分自身に挿入します。
(w)stringの場合は、まずxのnocopyフラグが1かどうかを調べます。nocopyが1ならば自分自身に挿入し、メモリ管理も引き受けます。nocopyが0のときは、xが保持している文字列が入る大きさの領域をCORBA::(w)string_allocオペレーションを使って確保します。文字列の長さはx.boundが0より大きければx.boundに設定されます。もしx.boundが0ならば、可変長文字列と認識してx.valの長さを調べます。
例) CORBA::AnyにCORBA::Boolean型と文字列を挿入する。
// CORBA::Booleanの例 CORBA::Boolean b = 1; CORBA::Any a; a <<= CORBA::Any::from_boolean(b); // 値の挿入 // 文字列の例 char* p = "bounded"; char* p2 = CORBA::string_dup(p); // 固定長文字列の挿入 // (コピーが生成される。) a <<= CORBA::Any::from_string(p, 8); // 固定長文字列の挿入 // (コピーは生成されない。メモリ管理はCORBA::Anyに移る。) a <<= CORBA::Any::from_string(p2, 8, 1); // 可変長文字列の挿入 // (コピーが生成される。) a <<= CORBA::Any::from_string(p, 0);
ユーザ定義の型については、<user type>型を扱うオペレータがIDLコンパイラによって自動的に生成されます。
使い方は引数の型により異なります。
operator<<=(CORBA::Any& any, const <user type>& x)はxをコピーしてanyに挿入します。
operator<<=(CORBA::Any& any, <user type>* x)はコピーせずにanyに挿入されます。値のメモリ管理はanyに移されます。
例) CORBA::Anyに構造体を挿入する。
// IDL struct MyStruct { long lmem; short smem; }; // C++ CORBA::Any a; MyStruct *sp = new MyStruct; MyStruct s; ... a <<= sp; // aにMyStructの値を設定。メモリ管理はCORBA::Anyに移る。 a <<= s; // MyStructのコピーが作成される。
配列の挿入にはArray_forany(実際にはArrayの部分に配列の型名が入る)という補助型がIDLコンパイラによって生成されます。配列を挿入する例についてはC++マッピング「配列のanyへの挿入」を参照してください。
ありません。
コピーに必要なメモリ領域を確保できなかったときは、値にヌル・ポインタがセットされます。
コピーが行われない<<=オペレータが使用されたときには、CORBA::Anyがデストラクトされるときに保持している値も解放されます。2重解放にならないように注意してください。また、CORBA::Anyに挿入した後は値を操作してはいけません。
CORBA::String_var型を引数にして可変長文字列を挿入する場合、R4.5以前では、CORBA::Any::operator<<=(const char*)が呼び出されましたが、R5.1以降では、CORBA::Any::operator<<=(char*)とCORBA::Any::operator<<=(const char*)のどちらのオペレータが呼び出されるかは不定(コンパイラ依存)です。
また、char*型を引数にして可変長文字列を挿入する場合、R4.5以前では、CORBA::Any::operator<<=(const char*)が呼び出されますが、R5.1以降では、CORBA::Any::operator<<=(char*)が呼び出されます。
どちらの場合も、R4.5以前と同様の動作をさせたいときは、引数をconst char*型に明示的にキャストする必要があります。
CORBA::Any::replace(CORBA::TypeCode_ptr, void*, CORBA::Boolean)
CORBA::Any::replace(CORBA::TypeCode_ptr, void*)
- CORBA::Anyが保持している値を別の値に置き換える
#include <orb.h> // CORBA::Anyが保持している値を解放してよいかどうかを指定する void CORBA::Any::replace( CORBA::TypeCode_ptr tc, void* value, CORBA::Boolean release, CORBA::Environment& env = Ob_default_environment() ); // 常にrelease = 0(値の解放を行わない) void CORBA::Any::replace( CORBA::TypeCode_ptr tc, void* value, CORBA::Environment& env = Ob_default_environment() );
CORBA::Anyが保持している値を別の値に置き換えます。CORBA::Anyが保持していた値は、必要であれば解放してから新しい値に置き換えます。
tcには置き換える値の型を表すタイプコードを指定します。
valueには置き換える値をvoid*型で指定します。
releaseにはCORBA::Anyの消滅時などに値を解放してよければ1を、そうでなければ0を指定します。
release引数を持たない関数はreleaseに0を指定したのと同じです。
ありません。
CORBA標準例外が返ります。
本関数は型に関して検査を行いません。設定する値とその型を表すタイプコードは一致させなければなりません。
CORBA::Any::type - CORBA::Anyが保持しているタイプコードを取得する
#include <orb.h> CORBA::TypeCode_ptr CORBA::Any::type() const;
CORBA::Anyが保持しているタイプコードをduplicateして返します。
CORBA::Anyが保持しているタイプコードを返します。
起こりません。
CORBA::Any::value - CORBA::Anyが保持している値を取得する
#include <orb.h> void* CORBA::Any::value() const;
CORBA::Anyが保持している値をvoid*型で返します。
CORBA::Anyが保持している値をvoid*型で返します。
起こりません。
CORBA::Any::__is_equal - CORBA::Anyが保持している値が同じかを調べる
#include <orb.h> CORBA::Boolean CORBA::Any::__is_equal(const CORBA::Any& x) const;
xが保持している値と、自分自身が保持している値が同じかどうか調べます。もし同じならば1を返し、違うならば0を返します。
値が同じならば1を返し、違うならば0を返します。
起こりません。
CORBA::Any::__is_typed_value - CORBA::Anyが保持している値がtyped valueか調べる
#include <orb.h> CORBA::Boolean CORBA::Any::__is_typed_value() const;
CORBA::Anyが保持している値がtyped valueかどうかを調べます。値がtyped valueならば1を返し、そうでなければ0を返します。
値がtyped valueならば1を返し、そうでなければ0を返します。
起こりません。
CORBA::Any::__to_untyped_value
- CORBA::Anyが保持している値をuntyped valueに変換する
#include <orb.h> void CORBA::Any::__to_untyped_value( CORBA::Environment& env = Ob_default_environment() );
CORBA::Anyが保持している値がtyped valueならばuntyped valueに変換します。
保持している値がuntyped valueのときは何もしません。
ありません。
envにCORBA標準例外が返ります。
一度untyped valueに変換した値をtyped valueに戻す手段は、CORBA::Anyでは提供していません。
namespace CORBA { class Any { // booleanの取り出しのための補助型 struct to_boolean { to_boolean(CORBA::Boolean &b) : ref(b) {} CORBA::Boolean &ref; }; // charの取り出しのための補助型 struct to_char { to_char(CORBA::Char &c) : ref(c) {} CORBA::Char &ref; }; // wcharの取り出しのための補助型 struct to_wchar { to_wchar(CORBA::WChar &c) : ref(c) {} CORBA::WChar &ref; }; // octetの取り出しのための補助型 struct to_octet { to_octet(CORBA::Octet &o) : ref(o) {} CORBA::Octet &ref; }; // 文字列の取り出しのための補助型 struct to_string { to_string(char *&s, CORBA::ULong b) : val(s), bound(b) {} char *&val; CORBA::ULong bound; }; // ワイド文字列の取り出しのための補助型 struct to_wstring { to_wstring(CORBA::WChar *&s, CORBA::ULong b) : val(s), bound(b) {} CORBA::WChar *&val; CORBA::ULong bound; }; // CORBA::Object型の取り出しのための補助型 struct to_object { to_object(CORBA::Object_ptr &obj) : ref(obj) {} CORBA::Object_ptr &ref; }; // CORBA::ValueBase型の取り出しのための補助型 struct to_value { to_value(CORBA::ValueBase *&base) : ref(base) {} CORBA::ValueBase *&ref; }; // CORBA::AbstractBase型の取り出しのための補助型 struct to_abstract_base { to_abstract_base(CORBA::AbstractBase_ptr &base) : ref(base) {} CORBA::AbstractBase_ptr &ref; }; // booleanの挿入のための補助型 struct from_boolean { from_boolean(CORBA::Boolean b) : val(b) {} CORBA::Boolean val; }; // octetの挿入のための補助型 struct from_octet { from_octet(CORBA::Octet o) : val(o) {} CORBA::Octet val; }; // charの挿入のための補助型 struct from_char { from_char(CORBA::Char c) : val(c) {} CORBA::Char val; }; // wcharの挿入のための補助型 struct from_wchar { from_wchar(CORBA::WChar c) : val(c) {} CORBA::WChar val; }; // 文字列の挿入のための補助型 struct from_string { from_string(char* s, CORBA::ULong b, CORBA::Boolean nocopy = 0) : val(s), bound(b) {} char *val; CORBA::ULong bound; }; // ワイド文字列の挿入のための補助型 struct from_wstring { from_wstring(CORBA::WChar* s, CORBA::ULong b, CORBA::Boolean nocopy = 0) : val(s), bound(b) {} CORBA::WChar *val; CORBA::ULong bound; }; }; };