C++と死の秘宝OpenCascade Technology


OpenCascade Technology(OCCT)

opencascade

Open CASCADE テクノロジー(オープンカスケード、OCCT)は、Open CASCADE SASによって開発とサポートが行なわれているオープンソースソフトウェアで、三次元CADやCAM、その他のための開発プラットフォームである。OCCT自体はCADやCAMといったアプリケーションではなく、C++といったプログラミング言語から呼び出して用いるライブラリである。
--- Wikipediaより

FreeCADというそこそこ有名なフリーのCADソフトが内部で使っているので、そこそこ実績がある。
1999年から開発が始まっており、今なお手入れされ続けていてすごい。
すごいが、C++11が出た頃に書き直して新しくしておいてほしかった。
現代C++erからは想像もできない荒野が広がっている。

あまりの闇の深さにビビった

この記事はOCCTの深淵を覗いた結果僕の心が崩壊しかけた話です。

分霊箱

まず、分霊箱(ファイル)に魂を分割しすぎている。
LLVM、V8などの名だたるプロジェクトなどと比べても、というか比べるのも馬鹿馬鹿しいほどだ。

lxx???

lxxファイルはインライン関数が書かれたファイル。

gxx!?

これがとんでもないやつで、ヘッダを自動生成する闇の魔術の塊。
魔黒でファイルまるごと生成してインクルードしだす。

仕組み

lxx/gxxファイルの文字列をdefineでインクルードファイルに書き換える。
考えたやつ天才。

#define Pnt gp_Pnt
#define Pnt_hxx <gp_Pnt.hxx>
#define Extrema_Point Extrema_POnCurv
#define Extrema_Point_hxx <Extrema_POnCurv.hxx>

#include <Extrema_Point.lxx> // < !!

#undef Pnt
#undef Pnt_hxx
#undef Extrema_Point
#undef Extrema_Point_hxx
#include <Extrema_POnCurv.hxx>

#include <gp_Pnt.hxx>

#define Pnt gp_Pnt
#define Pnt_hxx <gp_Pnt.hxx>
#define Extrema_Point Extrema_POnCurv
#define Extrema_Point_hxx <Extrema_POnCurv.hxx>
#include <Extrema_Point.gxx> // < !!

タグジャンプできないときの僕の口癖「はいはい、どうせgxxなんでしょ」。

たった7ノードでも複雑な継承

よく見ると完全グラフになってる継承の図。

API名

わかりやすいのか、わかりにくいのかわからない。

TopTools_MapOfShape
TopTools_IndexedMapOfShape
TopTools_DataMapOfShapeShape
TopTools_DataMapOfShapeListOfShape
TopTools_IndexedDataMapOfShapeListOfShape
TopTools_DataMapIteratorOfDataMapOfShapeListOfShape

ちなみに、BRepToolsBRep_Toolの違いが未だに記憶できない。

唐突にあらわれるフランス語

RecadreOnPeriodic?
Recadreってなんぞや???
唐突なフランス語やめろ、読めんわ。

TopAbs_State BRepTopAdaptor_FClass2d::TestOnRestriction (const gp_Pnt2d &Puv,
                                                         const Standard_Real Tol,
                                                         const Standard_Boolean RecadreOnPeriodic = Standard_True 
                                                        ) const

ドキュメント読みに行ったら、

(Caution: Internal use . see the code for more details)

って書いてあったわ、ふざけんな。

ヤバすぎる実装

とにかく色々とヤバイ。

巻き起こる未定義動作

const_castとかやらかしているので、未定動作起こりまくりのキレまくりです。

バグるAPI

普通にロジックもバグっているが、実装が複雑すぎてどうにも修正する気になれない。

公開されてないテスト

そもそもOSSとは何だったのか???
テストが存在しないはずないよね!?
なんで公開されないの。

動的メモリ確保の走りすぎ

パフォーマンスが悪すぎて計測したら、メモリの確保で30~40%の時間を使っている。
馬鹿すぎる。

新しいリリースをビルドしたら、セグフォする

使うの諦めて古いやつで戦ってます。
新しいAPI使いたかったんだけど......

ほめポイント

このライブラリC++17でコンパイルできます。
すごくないですか???
ちゃんとメンテナンスされてるんですねえ......

そこじゃねえよ!
書き換えろよ。

備考:C++の後方互換性が優れているだけです

さいごに

いろいろ文句しかないけど、これ以外に選択肢ある気がしないのでありがたく使ってます。
5年隠居して実装し直したほうが幸せになれる気がしないでもないですが。