Tock Registerはよく分からないっすけど、SVDはXML Schemaがあるんで、自動的にバインドさせれば、案外簡単に解析できますよ。
— nodamushi (@nodamushi) 2019年5月18日
ブーメランという言葉をご存じだろうか。そう、今は無き民主党のあれである。
C++ header only library for CMSIS SVD
はい、というわけで、私が必要になりました。C++のSVD解析器。畜生。
その成果を公開しておきます。
ざっくばらんな使い方
使い方は大体こんな感じ。
#include "nodamushi/svd.hpp" #include "nodamushi/svd/boost.hpp" #include "nodamushi/svd/normalized.hpp" void read(std::string& filename){ namespace svd = nodamushi::svd; svd::boost_svd_reader reader(filename); svd::Device<> device(reader); auto ptr = svd::normalize(device); // derivedFromやdimの解決 }
これだけでさくっと読み込めて、derivedFromの面倒な解決もしてくれるので、まぁまぁ便利なんちゃう?
Visitor パターンも用意してあるので、各要素にアクセスするプログラムも割とサクッと書けます。
//visitor パターン struct visitor{ //お作法 using this_t = visitor; #undef VISITOR_MEMBER #define VISITOR_MEMBER static NORM_VISITOR_INIT; //お作法 ここまで NORM_Visit_Register(r){ std::cout << "Register:" <<r.get_path() << std::endl; return CONTINUE; } NORM_Visit_Interrupt(i){ std::cout << "Interrupt:" << i.name << "," << i.value<<std::endl; return CONTINUE; } }; visitor::accept(ptr) ; //visitorパターンに投げる
実際に私が必要になった機能とかも大凡作ってあるので、まぁまぁ実用に耐えられるんじゃないかな。これ、誰か使ってるの?っていう様な仕様も、それなりにきちんと解析してます。
cluster周りはあんまりテストしてないけど………。
エラー処理は甘いので、その内追々修正するかな。
C++ワカラン…
ちなみに、これを最初から作ったのではなく、一回別に作った物を、腹立ち紛れに作り直しました。
C++の魔窟メタプログラミングに私がどれだけ耐えられるのか、試してみたかったのもあります。
気が向いたらソースコードを見て貰えると良いかもしれませんが、なんでここまで複雑に作ったのって言うぐらい複雑です。
実務でこんなコード書くやついたら、人格を否定しても許されると思います。
そして、私、よく分かった。 C++ゼッンゼンワカラン。 とても辛い。
Rustが良くコンパイラとの格闘があるとか何とか言うじゃない? 私はあまりRustやりこんでないから分からんけど、C++のはコンパイラとの死闘だったよ。
コンパイラちゃん「ここ、ここがおかしいの!」
私「………ソコ、ナニモオカシクナイヨ」
もうこんなことがしょっちゅう。
あくまでコンパイラがエラーに気がついた場所で会って、実際のエラー原因は遙か遠いところにあったりするの。 何度コンパイラにブレークポイントぶち込みたいと思ったことか。
ひたすら長大なエラーレポートを追っていって、どこで型が化けたのかを解析するんだけど、結局は大体の原因は以下の5つに分類されると思う。
- いつの間にかconstがついてた・消えてた
- いつの間にか参照がついてた
- いつの間にかポインタが消えてた
- いつの間にか暗黙に変換されてた
- 勘違いによりそもそも型・変数が違う(タイポ含む)
こういう、なんか思ってたんと違う型の化けにより、本来私が進むと思ってるルートを外れて、別な関数コールを走り始め、問題にぶち当たったところでエラーが出される訳です。
もう、ホント辛いよ。二度とやりたくないね。
私はC++上級者になれなくていいや!