前のページ次のページ上に戻るホーム SophiaFramework UNIVERSE 5.0

20.2. ラッパークラスの作成方法

BREW インターフェースには、 ISHELL_CreateInstance() 関数でインスタンスを生成するインターフェースIQI_QueryInterface() 関数でインスタンスを生成するインターフェース他の BREW インターフェースによってインスタンスを生成するインターフェースの 3 種類があります。

それぞれのラッパークラスの作成で異なるのはインスタンスの生成方法です。

ISHELL_CreateInstance() 関数でインスタンスを生成するインターフェースの場合は SFBBase::FactoryByCreate 関数、 IQI_QueryInterface() 関数でインスタンスを生成するインターフェースの場合は SFBBase::FactoryByQuery 関数を使って ラッパークラスのインスタンス生成関数 NewInstance() を実装します。 他の BREW インターフェースによってインスタンスを生成するインターフェースの場合は NewInstance() 関数をメンバ関数として実装する必要はありません。

20.2.1. ISHELL_CreateInstance() 関数でインスタンスを生成するインターフェース

IHash インターフェースのラッパークラス SFBHash の作成方法について説明します。

[Tip] IHash インターフェースについて

IHash インターフェースは、ISHELL_CreateInstance() 関数を使ってそのインスタンスを生成するインターフェースです。

ラッパークラスの作成は、ラッパークラスの定義とそのメンバー関数の実装からなります。

20.2.1.1. ラッパークラスの定義

IHash インターフェースのラッパークラス SFBHash を定義します。

IHash インターフェースは IBase インターフェースを継承するので、 SFBHash クラスは IBase インターフェースのラッパークラス SFBBase を継承します。

IHash インターフェースにない SFBHash::NewInstance 関数を追加します。 この関数は スマートポインタで管理される SFBHash クラスのインスタンスを生成するための関数です。

IHash インターフェースの IHASH_GetResult()、IHASH_Restart()、IHASH_SetKey()、IHASH_Update() について、 SFBHash::GetResultSFBHash::RestartSFBHash::SetKeySFBHash::Update をラッパークラスのメンバ関数として定義します。

下記の例にあるようにいくつかのメンバ関数では SFXBuffer などの SophiaFramework UNIVERSE 独自のクラスを引数として渡せるように拡張しています。

例 20.10. SFBHash ラッパークラスの定義

// SFBHash ラッパークラスの定義
#include <SFBWrapper/SFBEnvironment.h.hpp>
#include <AEESecurity.h>
#include <SFBWrapper/SFBBase.h.hpp>
// SFXBuffer クラスの便利な型を自動生成するマクロ
SFMTYPEDEFCLASS(SFXBuffer) 
// SFBHash ラッパークラスの便利な型を自動生成するマクロ
SFMTYPEDEFWRAPPER(SFBHash) 
class SFBHash : public SFBBase { // SFBHash は SFBBase を継承する
    // ラッパークラスのインスタンスのコピーを禁止するマクロ
    SFMSEALWRAPPER(SFBHash) 
    // ラッパークラスの継承関係を記述するマクロ
    SFMWRAPPERINSTANTIATEONE(SFBHash, SFBBase) 
    public:
        static  SFBHashSmp  NewInstance  (AEECLSID id, SFCErrorPtr exception = null);
                SFCError    GetResult    (VoidPtr data, SInt32Ptr size);
                Void        Restart      (Void);
                SFCError    SetKey       (VoidConstPtr key, SInt32 keySize);
                Void        Update       (VoidPtr data, SInt32 dataLength);
                // SophiaFramework UNIVERSE の SFXBuffer クラスを引数として渡せるようにしたメンバ関数    
                SFCError    GetResult    (SFXBufferPtr data);
                SFCError    SetKey       (SFXBufferConstRef key);
                Void        Update       (SFXBufferPtr data);
};
// BREW インターフェースとラッパークラスの型変換の関数を宣言するマクロ
SFMWRAPPERINTERFACECASTDECLARE(SFBHash, IHash)
[Note] IBase インターフェースの関数

IHASH_AddRef() と IHASH_Release() はそれぞれ IBASE_AddRef() と IBASE_Release() からの継承関数です。

これらの関数については IHash インターフェースが継承する IBase インターフェースの ラッパークラス SFBBase 内で既に実装されているので、 SFBHash クラスで定義する必要はありません。

なお、SophiaFramework UNIVERSE ではスマートポインタを利用しているので、 インスタンスの参照カウントに関わる IBASE_AddRef() と IBASE_Release() 関数は private 関数として実装し、 この関数にアクセスできない設計になっています。

[Tip] SFMTYPEDEFCLASS マクロ

SFMTYPEDEFCLASS は引数に指定したクラス関する 便利なユーザー定義型を自動生成するマクロです。

関連情報 : SFMTYPEDEFCLASS マクロ

[Tip] SFMTYPEDEFWRAPPER マクロ

SFMTYPEDEFWRAPPER は引数に指定したラッパークラス関する 便利なユーザー定義型を自動生成するマクロです。SFBHashSmp 型は SFMTYPEDEFWRAPPER(SFBHash) マクロで定義されます。

関連情報 : SFMTYPEDEFWRAPPER マクロ

[Tip] SFMSEALWRAPPER マクロ

SFMSEALWRAPPER はラッパークラスのインスタンスのコピーを禁止するマクロです。 ラッパークラスのインスタンスはコピーしてはいけません。

関連情報 : SFMSEALWRAPPER マクロ

[Tip] SFMWRAPPERINSTANTIATEONE マクロ

SFMWRAPPERINSTANTIATEONE はラッパークラスの継承関係を記述するマクロです。 IBase インターフェースからの継承関係をこのマクロを使って記述します。

IHash インターフェースは IBase インターフェースを継承しますので、IBase インターフェースのラッパークラスを SFBBase クラスとすると、 IHash インターフェースのラッパークラスである SFBHash クラスは SFBBase クラスを継承するので SFMWRAPPERINSTANTIATEONE(SFBHash, SFBBase) とマクロ宣言します。

SFBBase クラスでは、継承関係で最上位に位置するので SFMWRAPPERINSTANTIATEZERO マクロを使ってこの部分は SFMWRAPPERINSTANTIATEZERO(SFBBase) とマクロ宣言します。

A、B、C の 3 つのラッパークラスがあり、B は A、C は B をそれぞれ継承する場合は、SFMWRAPPERINSTANTIATETWO マクロを使って SFMWRAPPERINSTANTIATETWO(C, B, A) とマクロ宣言します。

A、B、C、D の 4 つのラッパークラスの場合は、SFMWRAPPERINSTANTIATETHREE(D, C, B, A) とマクロ宣言します。

RealView Compilation Tools for BREW 1.2 コンパイラの不具合を回避するためのマクロです。 RealView Compilation Tools for BREW 1.2 以外のコンパイラでは無視されます。

関連情報 : SFMWRAPPERINSTANTIATE マクロ

[Tip] SFMWRAPPERINTERFACECASTDECLARE マクロ

SFMWRAPPERINTERFACECASTDECLARE は BREW インターフェースとラッパークラス間の型変換を行う interface_cast 関数を宣言するためのマクロです。

SFMWRAPPERINTERFACECASTDECLARE(SFBHash, IHash) マクロにより、 SFBHash から IHash、または IHash から SFBHash に interface_cast 演算子を使って それぞれ型変換できる関数が宣言されます。

関連情報 : interface_cast 演算子

20.2.1.2. NewInstance メンバ関数の実装

SFBHash::NewInstance 関数 は SFBBase::FactoryByCreate 関数を使って次のように実装します。

例 20.11. SFBHash::NewInstance 関数の実装方法

// SFBHash::NewInstance 関数の実装
#include <SFBWrapper/SFBHash.h.hpp>
/*public static */SFBHashSmp SFBHash::NewInstance(AEECLSID id, SFCErrorPtr exception)
{
    // FactoryByCreate 関数を使って NewInstance() 関数を実装する
    // static_pointer_cast マクロでダウンキャストする
    return static_pointer_cast<SFBHash>(FactoryByCreate(id, exception));
}// SFBHash::NewInstance //
[Tip] SFBHashSmp スマートポインタについて

SFBHashSmp は SFBHash のインスタンスを管理するスマートポインタの型です。 この型は SFMTYPEDEFWRAPPER(SFBHash) マクロで定義されています。

関連情報 : SFMTYPEDEFWRAPPER マクロ

20.2.1.3. その他のメンバ関数の実装

SFBHash クラスのメンバ関数を実装します。

SFBHash::SetKey 関数を実装について、 BREW 標準のメンバ関数の実装と SophiaFramework UNIVERSE の型を引数にできるメンバ関数の実装を以下に記します。

例 20.12. IHash インターフェースの IHASH_SetKey() 関数をラップする SFBHash::SetKey 関数の実装 1

// SFBHash::SetKey 関数の実装 1
#include <SFBWrapper/SFBEnvironment.h.hpp>
// インライン関数でラップすることで実行時の速度低下を回避する
/*public */inline SFCError SFBHash::(VoidConstPtr key, SInt32 keySize)
{
    // BREW インターフェースの IHASH_SetKey() 関数呼び出して実行する 
    return IHASH_SetKey(interface_cast(this), static_cast<ByteConstPtr>(key), keySize);
}// SFBHash::SetKey //

例 20.13. IHash インターフェースの IHASH_SetKey() 関数をラップする SFBHash::SetKey 関数の実装 2 (SophiaFramework 機能拡張メンバ関数)

// SFBHash::SetKey 関数の実装 2
#include <SFBWrapper/SFBEnvironment.h.hpp>
#include <SFXBuffer/SFXBuffer.h.hpp>
// インライン関数でラップすることで実行時の速度低下を回避する
/*public */inline SFCError SFBHash::SetKey(SFXBufferConstRef key)
{
    // BREW インターフェースの IHASH_SetKey() 関数を呼び出して実行する 
    // SophiaFramework UNIVERSE の SFXBuffer クラスを引数にできるように機能拡張
    return IHASH_SetKey(interface_cast(this), static_cast<ByteConstPtr>(key.GetBuffer()), key.GetSize());
}}// SFBHash::SetKey //

例 20.14. IHash インターフェースの IHASH_GetResult() 関数をラップする SFBHash::GetResult 関数の実装 (SophiaFramework 機能拡張メンバ関数)

// SFBHash::GetResult 関数の実装(この関数はインライン関数として実装できない)
#include <SFBWrapper/SFBHash.h.hpp>
// SophiaFramework UNIVERSE の SFXBuffer クラスを引数にできるように機能拡張
/*public */SFCError SFBHash::GetResult(SFXBufferPtr data)
{
    if (data == null) {
        return SFERR_INVALID_PARAM;
    }

    SIntN size(data->GetSize());
    // BREW インターフェースの IHASH_GetResult() 関数を呼び出して実行する 
    SFCError result(IHASH_GetResult(interface_cast(this), static_cast<BytePtr>(data->GetBuffer()), &size));
    if (result == SFERR_NO_ERROR) {
        if (static_cast<SInt32>(data->GetSize()) > size) {
            result = data->SetSize(size);
        }
    }
    else {
        if (result == AEE_HASH_MORE_DATA) {
            if (size < 0) {
                return SFERR_FAILED;
            }
            if ((result = data->SetSize(size)) == SFERR_NO_ERROR) {
               // BREW インターフェースの IHASH_GetResult() 関数を呼び出して実行する 
               result = IHASH_GetResult(interface_cast(this), static_cast<BytePtr>(data->GetBuffer()), &size);
            }
        }
    }

    return result;
}// SFBHash::GetResult //

参考までに SFBHash クラスの全メンバ関数の実装コードを以下に記します。

例 20.15. 参考 1 : インライン 関数を使った SFBHash クラスのメンバ関数の実装

// インライン 関数による SFBHash クラスのメンバ関数の実装
#include <SFBWrapper/SFBEnvironment.h.hpp>
#include <SFXBuffer/SFXBuffer.h.hpp>
/*public */inline SFCError SFBHash::GetResult(VoidPtr data, SInt32Ptr size)
{
    return IHASH_GetResult(interface_cast(this), static_cast<BytePtr>(data), reinterpret_cast<SIntNPtr>(size));
}// SFBHash::GetResult //

/*public */inline Void SFBHash::Restart(Void)
{
    IHASH_Restart(interface_cast(this));
    return;
}// SFBHash::Restart //

/*public */inline SFCError SFBHash::SetKey(VoidConstPtr key, SInt32 keySize)
{
    return IHASH_SetKey(interface_cast(this), static_cast<ByteConstPtr>(key), keySize);
}// SFBHash::SetKey //

/*public */inline Void SFBHash::Update(VoidPtr data, SInt32 dataLength)
{
    IHASH_Update(interface_cast(this), static_cast<BytePtr>(data), dataLength);
    return;
}// SFBHash::Update //

/*public */inline SFCError SFBHash::SetKey(SFXBufferConstRef key)
{
    return IHASH_SetKey(interface_cast(this), static_cast<ByteConstPtr>(key.GetBuffer()), key.GetSize());
}// SFBHash::SetKey //

SFMWRAPPERINTERFACECASTIMPLEMENT(SFBHash, IHash)
[Tip] SFMWRAPPERINTERFACECASTIMPLEMENT マクロ

SFMWRAPPERINTERFACECASTIMPLEMENT は BREW インターフェースとラッパークラス間の型変換を行う interface_cast 関数を実装するためのマクロです。

SFMWRAPPERINTERFACECASTIMPLEMENT(SFBHash, IHash) マクロにより、 SFBHash から IHash、 または IHash から SFBHash に interface_cast 演算子を使ってそれぞれ型変換できる関数が実装されます。

関連情報 : interface_cast 演算子

例 20.16. 参考 2 : インライン 関数で実装できない SFBHash クラスのメンバ関数の実装

// インライン 関数を使わない SFBHash クラスのメンバ関数の実装
#include <SFBWrapper/SFBHash.h.hpp>
/*public static */SFBHashSmp SFBHash::NewInstance(AEECLSID id, SFCErrorPtr exception)
{
    return static_pointer_cast<SFBHash>(FactoryByCreate(id, exception));
}// SFBHash::NewInstance //

/*public */SFCError SFBHash::GetResult(SFXBufferPtr data)
{
    if (data == null) {
        return SFERR_INVALID_PARAM;
    }

    SIntN size(data->GetSize());
    SFCError result(IHASH_GetResult(interface_cast(this), static_cast<BytePtr>(data->GetBuffer()), &size));
    if (result == SFERR_NO_ERROR) {
        if (static_cast<SInt32>(data->GetSize()) > size) {
            result = data->SetSize(size);
        }
    }
    else {
        if (result == AEE_HASH_MORE_DATA) {
            if (size < 0) {
                return SFERR_FAILED;
            }
            if ((result = data->SetSize(size)) == SFERR_NO_ERROR) {
                result = IHASH_GetResult(interface_cast(this), static_cast<BytePtr>(data->GetBuffer()), &size);
            }
        }
    }

    return result;
}// SFBHash::GetResult //

/*public */Void SFBHash::Update(SFXBufferPtr data)
{
    if (data == null) {
        return;
    }

    IHASH_Update(interface_cast(this), static_cast<BytePtr>(data->GetBuffer()), data->GetSize());
    return;
}// SFBHash::Update //
[Note] メンバー関数のインライン展開について

メンバ関数はインライン 関数で実装するのが望ましいのですが、 SophiaFramework UNIVERSE のクラスを引数に渡せるメンバ関数のうちいくつかは処理が複雑になりインライン展開できません。 そのため普通の関数として実装します。

BREW SDK で用意される型の引数を渡すメンバ関数はすべてインライン展開できますので、 インライン関数として実装します。

20.2.2. IQI_QueryInterface() 関数でインスタンスを生成するインターフェース

IBitmapDev インターフェースのラッパークラス SFBBitmapDev の作成方法について説明します。

[Tip] IBitmapDev インターフェースについて

IBitmapDev インターフェースは IQI_QueryInterface () 関数を使ってそのインスタンスを生成するインターフェースです。

これらのラッパークラスでは SFBQuery クラスを継承することと、 NewInstance メンバ関数の実装において FactoryByQuery() 関数を使う点が ISHELL_CreateInstance() 関数でインスタンスを生成するインターフェースの場合と異なります。

20.2.2.1. ラッパークラスの定義

IBitmapDev インターフェースのラッパークラス SFBBitmapDev を定義します。

IBitmapDev インターフェースは IQI インターフェースを継承するので、 SFBBitmapDev クラスは IQI インターフェースのラッパークラス SFBQuery を継承します。

[Tip] IQI インターフェースと IBase インターフェースの継承関係

IQI インターフェースは IBase インターフェースを継承するので、 IQI インターフェースのラッパークラス SFBQuery は IBase インターフェースのラッパークラス SFBBase を継承します。

メンバ関数として SFBBitmapDev::NewInstance 関数を追加します。 この関数は スマートポインタで管理される SFBBitmapDev クラスのインスタンスを生成するための関数です。

IBitmapDev_Update()、IBitmapDev_IsEnabled()、IBitmapDev_NotifyEnable() についてラッパークラスのメンバ関数をインライン関数として実装します。

NotifyEnable() メンバ関数について SophiaFramework UNIVERSE 独自の SFXCallback クラスを引数として渡せるように定義しています。

例 20.17. SFBBitmapDev ラッパークラスの定義

// SFBBitmapDev ラッパークラスの定義
#include <SFBWrapper/SFBEnvironment.h.hpp>
#include <AEEBitmap.h>
#include <SFBWrapper/SFBQuery.h.hpp>

// SFXCallback クラスの便利な型を自動生成するマクロ
SFMTYPEDEFCLASS(SFXCallback)
// SFBBitmap ラッパークラスの便利な型を自動生成するマクロ
SFMTYPEDEFWRAPPER(SFBBitmap)
// SFBBitmap ラッパークラスの便利な型を自動生成するマクロ
SFMTYPEDEFWRAPPER(SFBBitmapDev)
class SFBBitmapDev : public SFBQuery { // SFBBitmapDev は SFBQuery を継承する
    // ラッパークラスのインスタンスのコピーを禁止するマクロ
    SFMSEALWRAPPER(SFBBitmapDev)
    // ラッパークラスの継承関係を記述するマクロ
    SFMWRAPPERINSTANTIATETWO(SFBBitmapDev, SFBQuery, SFBBase)
    public:
        static  SFBBitmapDevSmp  NewInstance  (SFBBitmapSmpConstRef bitmap, SFCErrorPtr exception = null);
        static  SFBBitmapDevSmp  NewInstance  (SFBBitmapSmpConstRef bitmap, AEECLSID id, SFCErrorPtr exception = null);
                SFCError         Update       (Void); // this function is not supported by BREW API Reference 2.0, 2.1
                Bool             IsEnabled    (Void); // this function is not supported by BREW API Reference 2.0, 2.1
                // SophiaFramework UNIVERSE の SFXCallback クラスを引数として渡せるようにしたメンバ関数
                SInt32           NotifyEnable (SFXCallbackPtr callback); // this function is not supported by BREW API Reference 2.0, 2.1
};

// BREW インターフェースとラッパークラスの型変換の関数を宣言するマクロ
SFMWRAPPERINTERFACECASTDECLARE(SFBBitmapDev, IBitmapDev)
[Note] IBase インターフェースの関数

IBitmapDev_AddRef() と IBitmapDev_Release() はそれぞれ IBASE_AddRef() と IBASE_Release() からの継承関数です。

これらの関数については IBitmapDev インターフェースが継承する IBase インターフェースの ラッパークラス SFBBase 内で既に実装されているので、 SFBHash クラスで定義する必要はありません。

なお、SophiaFramework UNIVERSE ではスマートポインタを利用しているので、 インスタンスの参照カウントに関わる IBASE_AddRef() と IBASE_Release() 関数は private 関数として実装し、 この関数にアクセスできない設計になっています。

[Note] IQI インターフェースの関数

IBitmapDev_QueryInterface() は IQueryInterface インターフェースの IQI_QueryInterface() を継承する関数です。

この関数については IBitmapDev インターフェースが継承する IQI インターフェースの ラッパークラス SFBQuery 内で既に実装されているので、 SFBBitmapDev クラスで定義する必要はありません。

[Tip] SFMTYPEDEFCLASS マクロ

SFMTYPEDEFCLASS は引数に指定したクラス関する 便利なユーザー定義型を自動生成するマクロです。

関連情報 : SFMTYPEDEFCLASS マクロ

[Tip] SFMTYPEDEFWRAPPER マクロ

SFMTYPEDEFWRAPPER は引数に指定したラッパークラス関する 便利なユーザー定義型を自動生成するマクロです。SFBBitmapDevSmp 型は SFMTYPEDEFWRAPPER(SFBBitmapDev) マクロで定義されます。

関連情報 : SFMTYPEDEFWRAPPER マクロ

[Tip] SFMSEALWRAPPER マクロ

SFMSEALWRAPPER は ラッパークラスのインスタンスのコピーを禁止するマクロです。 ラッパークラスのインスタンスはコピーしてはいけません。

関連情報 : SFMSEALWRAPPER マクロ

[Tip] SFMWRAPPERINSTANTIATETWO マクロ

SFMWRAPPERINSTANTIATETWO はラッパークラスの継承関係を記述するマクロです。 IBase インターフェースからの継承関係をこのマクロを使って記述します。

IBitmapDev インターフェースは IQI インターフェースを、 IQI インターフェースは IBase インターフェースをそれぞれ継承するので、 SFBBitmapDev クラスは SFBQuery クラスを、 SFBQuery クラスは SFBBase クラスを継承することになります。

そのため、SFMWRAPPERINSTANTIATETWO(SFBBitmapDev, SFBQuery, SFBBase) とマクロ宣言します。

RealView Compilation Tools for BREW 1.2 コンパイラの不具合を回避するためのマクロです。 RealView Compilation Tools for BREW 1.2 以外のコンパイラでは無視されます。

関連情報 : SFMWRAPPERINSTANTIATE マクロ

[Tip] SFMWRAPPERINTERFACECASTDECLARE マクロ

SFMWRAPPERINTERFACECASTDECLARE は BREW インターフェースとラッパークラス間の型変換を行う interface_cast 関数を宣言するためのマクロです。

SFMWRAPPERINTERFACECASTDECLARE(SFBBitmapDev, IBitmapDev) マクロにより、 SFBBitmapDev から IBitmapDev、 または IBitmapDev から SFBBitmapDev に interface_cast 演算子を使ってそれぞれ型変換できる関数が宣言されます。

関連情報 : interface_cast 演算子

20.2.2.2. NewInstance メンバ関数の実装

SFBBitmapDev::NewInstance 関数 は SFBBase::FactoryByQuery 関数を使って次のように実装します。

例 20.18. SFBBitmapDev::NewInstance 関数の実装方法

// SFBBitmapDev::NewInstance 関数の実装
#include <SFBWrapper/SFBBitmapDev.h.hpp>
#include <SFBWrapper/SFBBitmap.h.hpp>
/*public static */SFBBitmapDevSmp SFBBitmapDev::NewInstance(SFBBitmapSmpConstRef bitmap, SFCErrorPtr exception)
{
    return static_pointer_cast<SFBBitmapDev>(FactoryByQuery(bitmap, AEEIID_BITMAPDEV, exception));
}// SFBBitmapDev::NewInstance //

/*public static */SFBBitmapDevSmp SFBBitmapDev::NewInstance(SFBBitmapSmpConstRef bitmap, AEECLSID id, SFCErrorPtr exception)
{
    return static_pointer_cast<SFBBitmapDev>(FactoryByQuery(bitmap, id, exception));
}// SFBBitmapDev::NewInstance //
[Tip] SFBBitmapDevSmp スマートポインタについて

SFBBitmapDevSmp は SFBBitmapDev のインスタンスを管理するスマートポインタの型です。 この型は SFMTYPEDEFWRAPPER(SFBBitmapDev) マクロで定義されています。

関連情報 : SFMTYPEDEFWRAPPER マクロ

20.2.2.3. その他のメンバ関数の実装

SFBBitmapDev クラスのメンバ関数をインライン関数を使って実装します。

その他のメンバ関数の実装は ISHELL_CreateInstance() 関数でインスタンスを生成するインターフェースの場合と同じです。

例 20.19. SFBBitmapDev クラスのメンバ関数の実装

#include <SFBWrapper/SFBEnvironment.h.hpp>
#include <SFXGeneral/SFXCallback/SFXCallback.h.hpp>

/*public */inline SFCError SFBBitmapDev::Update(Void)
{
    return IBITMAPDEV_Update(interface_cast(this));
}// SFBBitmapDev::Update //

/*public */inline Bool SFBBitmapDev::IsEnabled(Void)
{
    return IBITMAPDEV_IsEnabled(interface_cast(this));
}// SFBBitmapDev::IsEnabled //

/*public */inline SInt32 SFBBitmapDev::NotifyEnable(SFXCallbackPtr callback)
{
    return IBITMAPDEV_NotifyEnable(interface_cast(this), interface_cast(callback));
}// SFBBitmapDev::NotifyEnable //

SFMWRAPPERINTERFACECASTIMPLEMENT(SFBBitmapDev, IBitmapDev)
[Tip] SFMWRAPPERINTERFACECASTIMPLEMENT マクロ

SFMWRAPPERINTERFACECASTIMPLEMENT は BREW インターフェースとラッパークラス間の型変換を行う interface_cast 関数を実装するためのマクロです。

SFMWRAPPERINTERFACECASTIMPLEMENT(SFBBitmapDev, IBitmapDev) マクロにより、 SFBBitmapDev から IBitmapDev、 または IBitmapDev から SFBBitmapDev に interface_cast 演算子を使ってそれぞれ型変換できる関数が実装されます。

関連情報 : interface_cast 演算子

20.2.3. 他の BREW インターフェースでインスタンスを生成するインターフェース

他の BREW インターフェースでインスタンスを生成するインターフェースの C++ ラッパークラスでは、NewInstance() 関数を定義、実装する必要はありません。

これ以外は、ISHELL_CreateInstance() 関数でインスタンスを生成するインターフェースIQI_QueryInterface() 関数でインスタンスを生成するインターフェースと同じです。

20.2.4. 参照カウントに関する注意事項

スマートポインタを利用するラッパークラスの実装では、 BREW インターフェースのインスタンスを返す関数のラッパークラスのメンバ関数を実装するときは 参照カウントが増減しないように注意する必要があります。

たとえば、ISHELL_LoadImage() のラッパークラスのメンバ関数 SFBShell::LoadImage の場合、ISHELL_LoadImage() は IImage インターフェースのインスタンスを返します。

これを SFBImageSmp スマートポインタとして返すときに、 interface_cast 演算子を使って IImage インターフェースから SFBImage に型変換するだけでなく、 SFBImageSmp の 2 つめの初期化パラメータに false を指定して参照カウントを増やさないようにしています。

例 20.20. SFBShell::LoadImage 関数の実装

/*public */inline SFBImageSmp SFBShell::LoadImage(ACharConstPtr file)
{
    return SFBImageSmp(interface_cast(ISHELL_LoadImage(interface_cast(this), file)), false);
}// SFBShell::LoadImage //

関連情報 : interface_cast 演算子 | SFBShell::LoadImage | SFXBrewPointer