見出し画像

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

LIST型には、エントリー数を返すListGetNumEntry関数というのがありました。今回はそれのRANGE型版を作ってみます。

RangeGetNumItem

RangeGetNumItem関数は、RANGE型のデータが、いくつアイテムを持っているかを返します。

inline WORD RangeGetNumItem(
   const void *pRange,
   BOOL fPrefixDataType
   ) {
 RANGE *p = reinterpret_cast<RANGE*>(
       reinterpret_cast<WORD*>(const_cast<void*>(pRange))
       + (fPrefixDataType ? 1 : 0)
       );
 return p->ListEntries;
}

・Traitsは、以前の記事で紹介した特性構造体、NumberRangeTraitsかTimeDateRangeTraitsかを指定します。
・pRangeは、RANGE型メモリハンドルのロック済みポインタを指定します。
・fPrefixDataTypeは、データタイププレフィックスを持つかどうか指定します。
・戻り値は、アイテムリストが保持するアイテム数を返します。

RangeGetNumPair

RangeGetNumPairテンプレート関数は、RANGE型のデータが、いくつペアを持っているかを返します。

inline WORD RangeGetNumPair(
   const void *pRange,
   BOOL fPrefixDataType
   ) {
 RANGE *p = reinterpret_cast<RANGE*>(
       reinterpret_cast<WORD*>(const_cast<void*>(pRange))
       + (fPrefixDataType ? 1 : 0)
       );
 return p->RangeEntries;
}

・Traitsは、以前の記事で紹介した特性構造体、NumberRangeTraitsかTimeDateRangeTraitsかを指定します。
・pRangeは、RANGE型メモリハンドルのロック済みポインタを指定します。
・fPrefixDataTypeは、データタイププレフィックスを持つかどうか指定します。
・戻り値は、ペアリストが保持するアイテム数を返します。

まとめ

ロック済みメモリポインタを取得した状態であれば、ポインタからじかにアイテム数を取得するのはあまり難しくないでしょう。しかし、データタイププレフィックスの有無を考慮しなければならず、意外にさらっとは書けず面倒なものです。そういう意味でも、短いですがこれらの関数を利用するのも悪くないでしょう。

2021-10-11 修正
この記事で紹介している関数は、いずれもテンプレート関数である必要がないため、インライン関数に修正しました。

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

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