include.pyについて

言語化された解説がないので適当に説明。

// BEGIN CUT HERE
#include "../lib/debugprint/debugprint.hpp"
#include "../lib/toolbox.cpp" /*** AUTO_INCLUDE ***/
// END CUT HERE

int main(){
  DP(IsPrime()(97));
}

DPはデバッグプリント用のマクロなのでprintfだと思ってね。このIsPrimeってのはtoolbox.cppの中にある素数判定用クラス。このプログラムを実行すると「IsPrime()(97): 1」と出る。trueってことね。

$ ../tool/include.py tmp.cpp

そうすると/*** AUTO_INCLUDE ***/と書かれている行でインクルードされているファイルのうち、使われている定義だけがソースコードに貼られる。

$ less tmp.cpp
// BEGIN CUT HERE
#include "../lib/debugprint/debugprint.hpp"
// END CUT HERE
class IsPrime{
(中略)
};
// BEGIN CUT HERE
// END CUT HERE

int main(){
  DP(IsPrime()(97));
}

使われているかどうかの判定にはgcovを使っている。で、目下の問題はこれが関数単位のため「クラスのなかの必要なメソッドだけコピペ」ができないって点だったりする。そこが解決されれば何の不安もなく機能てんこもりのBigIntegerクラスとか作っちゃうんだけどな。

リポジトリはこちら: http://bitbucket.org/nishio/topcoderja/overview/
toolbox.cppは今は適当に何でもかんでもつっこんだり、コメントアウトしてメモを書き込んでいたりするけど、そのうちきちんとテストされたものだけくくりだすべきだよなー。まぁ、気がむいたときにやる。



ふむ、こうなるんだな。

        -:   34:class Residual{
        -:   35:public:
        1:   36:  Residual(){
        1:   37:    value = 1;
        -:   38:  }
        1:   39:  void foo(){
        1:   40:    value = 2;
        -:   41:  }
        -:   42:  void bar(){
        -:   43:    value = 3;
        -:   44:  }
        -:   45:  LL value;
        -:   46:  LL modulo;
        -:   47:  
        -:   48:};

この結果から使われていない変数の宣言は調べられないなぁ。インストラクションと対応しないからカバレッジで使われているかどうかの判定ができないわけか。そこはあきらめて使われていないメソッドbarだけ取り除いたコードを生成できればまあOKか。


お、できた。