見出し画像

Notes C API探訪: RANGE(データ型)その9

LIST型には、データをまるごと複製するListDuplicate関数というのがありました。今回はそれのRANGE型版を作ってみます。

RangeDuplicate

RangeDuplicateテンプレート関数は、RANGE型の(あれば)プレフィックス、RANGEデータ、アイテムリスト、ペアリストすべてを、新しく割り当てたメモリハンドルの領域に複製します。


template <typename Traits>
STATUS RangeDuplicate(
   void *pRange,
   BOOL fPrefixDataType,
   DHANDLE *phRange
   ) {
 WORD realsize = RangeGetSize<Traits>(pRange, fPrefixDataType);
 STATUS status = OSMemAlloc(MEM_GROWABLE, realsize, phRange);
 if (ERR(status) == NOERROR) {
   void *pDest = OSLockObject(*phRange);
   memcpy(pDest, pRange, realsize);
   OSUnlockObject(*phRange);
 }
 return status;
}

・Traitsは、以前の記事で紹介した特性構造体、NumberRangeTraitsかTimeDateRangeTraitsかを指定します。
・pRangeは、複製元となるRANGE型メモリハンドルのロックしたポインタを指定します。
・fPrefixDataTypeは、データタイププレフィックスを持つかどうか指定します。
・phRangeは、複製先として新しく割り当てたメモリハンドルを書き込むRANGEハンドル変数へのポインタを指定します。

複製元はロックした状態で渡しますので、関数から戻ったら必要に応じてアンロックします。複製先のハンドルはアンロックされた状態で戻るので、内容にアクセスする場合はロックしてから使用します。

RANGE型総まとめ

計9回にわたってRANGE型とヘルパー関数を紹介してきました。

1. RANGE型の構造
(メモリハンドル操作関数)
2. RANGE型メモリの確保
3. RANGE型エントリーの変更
4. RANGE型エントリーの取得
5. RANGE型エントリー数の取得
6. RANGE型エントリーの実体サイズ取得とエントリーの挿入
7. RANGE型エントリーの削除
8. RANGE型エントリー全体の削除
9. RANGE型の複製(本記事)

LIST型には作成、更新、追加、削除、複製といった関数が一揃えあるのに対し、RANGE型にはそれらに相当する関数がAPIで用意されていません。この9回ではメモリハンドル系の関数を使って、LIST型関数と同等のものを設計してみました。OSMemRealloc関数によるダウンサイズが、必ずしも意図したサイズにならないことさえ注意すれば、誰でも組めるでしょう。

注意: コードの利用においてチブル・システムズは一切の責任を負いません。自己責任でご利用をお願いいたします。

この記事が気に入ったらサポートをしてみませんか?