プログラムdeタマゴ

nodamushiの著作物は、文章、画像、プログラムにかかわらず全てUnlicenseです

C++のCMSIS5 SVD読み込みライブラリ作った

 ブーメランという言葉をご存じだろうか。そう、今は無き民主党のあれである。

C++ header only library for CMSIS SVD

github.com

 はい、というわけで、私が必要になりました。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++上級者になれなくていいや!