Hitachi

VisiBroker Version 5 Borland(R) Enterprise Server VisiBroker(R) プログラマーズリファレンス


20.8.5 配列

IDLで指定した配列は,C++配列にマッピングされます。マッピングされた配列を静的に初期化できます。IDL配列要素が文字列またはオブジェクトリファレンスである場合,C++配列ではそれらの要素が_var型となります。コードサンプル20-33〜20-34は,異なる要素型を持つ三つの配列を示しています。

コードサンプル20-33 IDL配列定義
// IDL
interface Intf
{
    ...
};
typedef long L[10];
typedef string S[10];
typedef Intf A[10];
コードサンプル20-34 IDL配列のC++配列へのマッピング
// C++
typedef CORBA::Long L[10];
typedef CORBA::String_var S[10];
typedef Intf_var A[10];

文字列およびオブジェクトリファレンスに対して_varという管理型を使うことによって,配列要素が代入された際にメモリが透過的に管理できます。

〈この項の構成〉

(1) 配列スライス

array_slice型は複次元配列のパラメタを渡す際に使用されます。一次元配列以外の配列に対して_slice型がVisiBrokerのIDLコンパイラによって生成されます。パラメタを渡したり,返したりする際に,_slice型を使うと便利です。コードサンプル20-35とコードサンプル20-36は,_slice型の例を示しています。

コードサンプル20-35 複次元配列のIDL定義
// IDL
typedef long L[10];
typedef string str[1][2][3];
コードサンプル20-36 _slice型の生成
// C++
typedef CORBA::Long L_slice;
typedef CORBA::String_var str_slice[2][3];

(2) 配列の管理型

VisiBrokerのIDLコンパイラは,IDL配列に対するC++配列だけでなく,_varクラスも生成します。このクラスは,配列の拡張機能を提供します。

コードサンプル20-37 配列のIDL定義
// IDL
typedef long L[10];
コードサンプル20-38 配列に対して生成された_varクラス
// C++
class L_var
{
    public:
        L_var();
        L_var(L_slice *slice);
        L_var(const L_var& var);
        ~L_var();
        L_var&  operator=(L_slice *slice);
        L_var&  operator=(const L_var& var);
        CORBA::Long&  operator[ ](CORBA::ULong index);
        operator L_slice *();
        operator L &() const;
        ...
    private:
        L_slice*_ptr;
};

(3) タイプセーフ配列

any型にマッピングされた要素を持つ配列を処理するために,_foranyという特別なクラスが生成されます。_varクラスと同様に,_foranyクラスでも下位の配列型にアクセスできます。Any型がメモリの所有権を引き受けるので,_foranyクラスは,デストラクトの際にメモリを解放しません。関数を適切にオーバーロードし,ほかの型と見分けられるようにするため,_foranyクラスはtypedefとして実装されません。

コードサンプル20-39 IDL配列定義
// IDL
typedef long L[10];
コードサンプル20-40 IDL配列に対して生成された_foranyクラス
// C++
class L_forany
{
    public:
        L_forany();
        L_forany(L_slice *slice);
        ~L_forany();
        CORBA::Long&  operator[ ](CORBA::ULong index);
        const CORBA::Long&  operator[ ](
                               CORBA::ULong index) const;
        operator L_slice *();
        operator L &() const;
        operator const L & () const;
        operator const L& () const;
        L_forany& operator=(const L_forany obj);
        ...
    private:
        L_slice*_ptr;
};

(4) 配列でのメモリ管理

配列に対応するメモリの割り当て,および解放のため,VisiBrokerのIDLコンパイラは四つの関数を生成します。これらの関数を使うと,VisiBroker ORBはnewおよびdelete演算子をオーバーライドしなくてもメモリを管理できます。

コードサンプル20-41 IDL配列定義
// IDL
typedef long L[10];
コードサンプル20-42 配列メモリの割り当ておよび解放のため生成されたメソッド
// C++
static inline L_slice* L_alloc(); // 配列を動的に割り当てます。
static inline void L_free(L_slice *data);
                                  // L_allocを使って割り当てられた
                                  // 配列のメモリを解放します。
static inline void L_copy(L_slice *_to, L_slice *_from)
               // _from配列を_to配列にコピーします。
static inline L_slice *L_dup(const L_slice *_date)
               // 新しくコピーされた_date配列を返します。