こういうのを自動生成したい。

/*
 * @brief    Calculates size of texture.
 *
 * @prams[in]    params
 *
 * @detail   Returns size of 32bpp image.
 *
*/
static constexpr size_t CalculateSize(constexpr Params params)
{
    return params.width * params.height * sizeof(uint32_t);
}

生成するクラスを分類してみる。

  • Paramsの様に特定の規則に従った記述になるクラス
    • メンバ変数の定義
    • メンバ変数のゲッター・セッター
    • コンストラクタにメンバ変数の初期化リスト
    • doxygenコメント
      • brief
      • detail
      • params
      • pre
  • 特に記述規則が無いクラス
    • 実装がC++側にあったりヘッダ側だったり
    • staticメソッドだったりconstexprメソッドだったり
  • 仕様書から型やセッター・ゲッターの自動生成

仕様書から型やセッター・ゲッターの自動生成

簡単そうな型定義とゲッター・セッターの自動生成から手を付けてみる。

自動生成したいもの

    • メンバ変数
    • ゲッター・セッター
    • ダンプログ出力関数

自動生成に必要な情報

  • 必須
    • 型名
    • メンバ変数名
    • メンバ変数型
    • HWの制約=アサート
      • 変数名のエイリアスを”val”として表現する
      • LE, LEQ, NOTNULL等の文字列で挿入するアサートマクロを選択できるようにする
      • eg. “LE:16″、”RANGE:0:15” の書式にする
  • オプション
    • 格納先の32bitワード位置とビットマスク

xmlでも何でもいいけど上記をリスト化する。取り敢えず,区切りの物を用意する

型名,変数名,型,HWの制約=アサート,格納先の32bitワード位置とビットマスク
TextureDescriptor,width,int,16,0,3:0
TextureDescriptor,height,int,16,0,7:4
TextureDescriptor,reserved,int,,,0,31:8
TextureDescriptor,size,size_t,4294967295,1,31:0

自動生成物の内容

自動生成されるコードは下記とする。

struct TextureDescriptor
{
	int32_t data[2];
};

inline
void SetTextureDescriptorWidth(TextureDescriptor* pDesc, int value)
{
	ASSERT(0 < value && value < 16)
	constexpr int bitOffset = 0;
	constexpr int bitLength = (3 - bitOffset) + 1;
	constexpr int mask = (1 << bitLength) - 1;
	pDesc->data[0] |= (value & mask) << bitOffset;
}

inline
int GetTextureDescriptorWidth(const TextureDescriptor* pDesc)
{
	constexpr int bitOffset = 0;
	constexpr int bitLength = (3 - bitOffset) + 1;
	constexpr int mask = ((1 << bitLength) - 1) << bitOffset;
	return (pDesc->data[0] & mask) >> bitOffset;
}

inline
void DumpTextureDescriptorWidth(const TextureDescriptor* pDesc)
{
	DUMP(GetWidth(pDesc);
}

テキストテンプレートで実装

TODO: