パブリックインタフェース自動生成
こういうのを自動生成したい。
1 2 3 4 5 6 7 8 9 10 11 12 |
/* * @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でも何でもいいけど上記をリスト化する。取り敢えず,区切りの物を用意する
1 2 3 4 5 |
型名,変数名,型,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 |
自動生成物の内容
自動生成されるコードは下記とする。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
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:
コメントを残す