Notes C API探訪: テキスト用LIST型のラップクラス(その1)
以前の記事では、LIST型やRANGE型など、複数値を扱うデータ型についての紹介と、それらをラップしたテンプレート関数などをご紹介してきました。
今回からは、これら複数値を扱うためのラップクラスを定義してみたいと思います。まず、LIST構造体を使ったラップクラスを作ります。LIST型は関数が揃っていることもあってテキスト専用の印象がありますが、テキストに限ったことではないことは以前の記事でもご紹介しました。
とは言え、テキスト用に定義された関数を利用しない手はないのですし、テキストリストは頻繁に使います。テキストリストのラップクラスは今後重宝すると思うので、いくつかに分けてご紹介していきたいと思います。
今回は手始めに外郭を作っていきます。
#ifndef NXPP_TEXTLIST_HPP
#define NXPP_TEXTLIST_HPP
#include "./nxpp_lmbcs.hpp"
#include "../nxpp_status.hpp"
#ifdef NT
#pragma pack(push, 1)
#endif
#include <global.h>
#include <textlist.h>
#include <osmem.h>
#ifdef NT
#pragma pack(pop)
#endif
namespace nxpp {
class TextList
{
DHANDLE handle_;
BOOL fPrefix_;
public:
TextList(BOOL fPrefix = FALSE) : handle_(NULLHANDLE), fPrefix_(fPrefix) {} // 2021-10-09 修正
virtual ~TextList() {
if (handle_ != NULLHANDLE) {
OSMemFree(handle_);
}
}
private:
bool allocate(WORD count = 0, WORD quota = 0) {
LIST *pList = nullptr;
WORD size = 0;
Status status = ListAllocate(
count,
quota,
fPrefix_,
&handle_,
&pList,
&size
);
if (!status) { throw status; }
OSUnlockObject(handle_); // 2021-10-09 修正
return true;
}
};
} // namespace nxpp
#endif // NXPP_TEXTLIST_HPP
まずはプレーンな状態のTextListを作ります。
所有するデータはハンドルとデータタイププレフィックスの有無です。
今後、テキストを追加する際に、ハンドルの状態を確認し、ハンドルがなければプライベートメソッドのallocateを使って領域を確保します。
オブジェクトが解放されるタイミングでハンドルも解放します。
まとめ
今回から、テキスト用のLIST構造体をベースにしたラップクラスの定義を開始しましたが、まだまだ序の口です。以前の記事で紹介したAPI関数を元に、このTextListクラスを肉付けしていきます。
祝!100記事連続投稿!!!
2021-10-09 修正
コンストラクタでプレフィックスの有無を変更できるようにしました。
ロック済みになっているハンドルをアンロックするようにしました。