constexprで色

はい。皆さんは、やっていく気持ちですか?

さて、

https://github.com/nikq/ColorSystem

というコードを書いた。これが何かというと、constexprを活用してできる限りコンパイル時に定数化されるような、色関係のライブラリです。もともと3000行くらいの適当にとにかく書き散らした色ライブラリがすでに手元にあったのだが、こいつのメンテナンス性が落ちてきているのと、組み合わせによって固定されるべき行列が何度も計算されるのが嫌だったので書き直した次第。

で、このためにconstexprの活用にトライしてみた。せっかくだからある程度モダンな開発環境にしようと思って、msvc2017+github+vscodeの組み合わせで作っている。しかしコンパイルはコマンドラインからmsbuildを叩いている。連携の仕方が良くわからないからである。

constexprはある程度プログラマブルに書くことができるdefineみたいなもんだ。C++14はだいぶ緩和されるようだが、C++11だと割と条件が厳しい。関数中にreturnはひとつ。ifは書けない。変数代入はconstのみ。まぁ、ほぼlispだと思えばよい(?)

こうしていくと何がうれしいかというと、たとえばrec709からrec2020に変換するような行列(間にXYZを経由する)を求めるとき、以前であれば実行時に毎回行列積が計算されていたわけだけど、今回はできる限り事前に計算されて可能ならば定数として扱われる。実際、clangでコンパイルしてみるとfloatの定数が9個並ぶだけになる。

でも当然ながら問題がないわけでもなくって、例えば、VC12でコンパイルができなくなってしまった…まぁみんな最新版のコンパイラを使おうね!という話でした。

「constexprで色」への2件のフィードバック

  1. あ、2017だったのか… test suite 分割した奴を PR 投げようとして『はて?確か VC++ が main の開発環境だったよな?』と思って 2015 で通そうとしたら relaxed constexpr 通らなくて『あれ、CMakeLists.txt に忘れ物あるか?』と思ってた…

    # 2017 だったら CMakeLists.txt 直接読めた記憶…

  2. 最近のアップデートでCMakeLists直接読めるようになったそうですね
    いまだにclを直接呼んでいる(モダン!)なので良くわかりませんが…

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です