エンジニアのソフトウェア的愛情

または私は如何にして心配するのを止めてプログラムを・愛する・ようになったか

C++

ビット操作:地道に更新中

わざわざここに書くほどのことでのないのだけれど、地味に地道な更新をかさねてて、ちとくじけそうになるので、地味に地道な様子を記録しておく。最新:GitHub - mattsan/BitOperation: operating bits classes (2010/03/20時点:GitHub - mattsan/BitOpera…

ビット操作の構造をガラット変更

C++

コードの重複がひどいことになってきていたので、コードを縮める方法を今週は考えていました。 で、その結果、ガラットかわりました。最新:GitHub - mattsan/BitOperation: operating bits classes (2010/03/19時点:GitHub - mattsan/BitOperation at 0e9…

ビット操作のパフォーマンス測定

C++

コツコツと更新してここまで来ました。最新:GitHub - mattsan/BitOperation: operating bits classes (2010/03/14時点:GitHub - mattsan/BitOperation at cbd369981a0ec5fd251e57f99877f45401be3c46)ここでちょっとパフォーマンス測定。 使ったコードは、…

ダークサイド

C++

まずは自らのツイートの引用から。 operator , (コンマ演算子)のオーバーロードが…、わたしをC++のダークサイドへといざなう…。…ちょっとダークサイドをのぞいてきます…。http://twitter.com/emattsan/status/9974443836 「見よダークサイド見よダークサイ…

ビットをもっと自由自在に扱えるようにしてみた。

C++

目鼻がつきました。 GitHub - mattsan/BitOperation: operating bits classes(2010/03/10追記:上記のリポジトリは随時更新しています。この記事を書いた当時の内容はこちらへ) これはなに? 以前にも書いたことがあるように、いまの仕事では通信がらみとい…

「意図どおりに動く」では半分

現在のプロジェクトのソースコードを静的解析ツールにかけた結果がレポートされたので、昨日はその内容を見ていました。 ツールが警告を出した場合、警告が出た箇所にどのように対処するかを報告しないといけないのですが、その報告の中に「現状とする/意図…

ビットをもっと自由自在に扱いたいと思った。

C++

…と思ったので、思いついたアイディアをコードにしているところ。 最初に考えていた機能は一応実装できた。ただまだ検証が不十分なのと、パフォーマンス(スピード、メモリ使用量)が不明なのでまだまだ途中。 一応公開。解説はまたのちほど。 GitHub - matt…

googletestはPOSIX規格上で動作させることが期待されている

(googletestについて知りたい方はこちらのエントリでまとめています)このあいだ書いたように、googletest 1.4.0では、Cygwin上で-ansiオプションをつけてコンパイルするとエラーになります。 よくわからないので中の人に訊いてみました。というか、Google …

googletest 1.4.0にていささか混乱中

C++

googletestを検索してこのブログを訪れるひとが多くなったようなので、前回バージョン1.3.0のときに書いた時以降の新しい情報も載せておこうと、最新のバージョンである1.4.0を調べていたんですが。Cygwin上でコンパイルするとき、g++のコンパイルオプション…

すなおにデシリアライザを書くのが精神衛生上よい気がする

C++

昨日書いた仮想コンストラクタのコード、何度読み返してみても気持ちが悪い。ためしに、デシリアライザで書き直してみた。 やっぱりこっちの方が素直で間違いもない気がする。 少なくともわたしには、トリッキーなコードを書くだけのメリットが感じられず。 …

virtual constructor...?

C++

いま、C++ プログラミングの筋と定石を読んでいる途中なんですが、未経験の実装が出てきて戸惑っているところ。 基底クラスのコンストラクタの中で、placement newを使って自分の領域(this)を自分の派生クラスでconstructしてしまうというもの。これで、一種…

DCIについて引き続き悩む

「Lean Architecture for Agile Software Development」のドラフトのAPPENDIX AのScalaのコードを意訳してみる。 本文中にC++のコードがあるんですが、まとまった形のコードになっていなかったので、他言語での例から逆にC++に翻訳してみました。 ここではma…

Roleについて考える

今朝の書き込みのあと、半日ほど経過して、頭の中が整理されてきて、あらためてコードを書き直してみた。 コードを書き直して気がついたのが、以前書いたByte Reader、Byte WriterってRoleに該当するのかもしれない、ということ。手前味噌で恐縮ですけど…そ…

DCIの翻訳の翻訳、あるいは写経の写経

形から入る主義です。 id:yojikさんが書かれたコードをさらに写経。 DCI on Java について考えました - yojikのlog 一部、言語の制約とかで手を加えていますが、ほとんど直訳です。 中身はあとでもう一度考察する。 DCIアーキテクチャは、まだ読んでる途中。…

Fizz Buzz by C++

C++

分岐もループもなくして、めんどくさく解いてみる。 #include <iostream> template<int N> struct Fizz { static const bool enabled = false; typedef Fizz<N + 1> next; }; template<int N> struct Buzz { static const bool enabled = false; typedef Buzz<N + 1> next; }; template<> struct Fi</n></int></n></int></iostream>…

多重継承の使い方の一例

C++

C++の多重継承に熟知された方から見れば(そうでない方でも?)、なにをいまさら感、が漂ってますが、こういう使い方をすれば便利なのか、と気付いたのでメモ。 わたし自身の考えとしては、多重継承はぜんぜん否定していないんですが、うまい使い方というの…

浮動小数点数値をバイト列にする

C++

今週、仕事場で協業している某社からリリースされてきたコードを見ていて。次のような雰囲気のコードを見つけました。実際に目にしたものからだいぶ書き換えてますが、こんな雰囲気ということで。 // double value = ...; UINT64* p = reinterpret_cast<UINT64*>(&val</uint64*>…

メソッドホルダ・分析篇

C++

昨日のエントリではかなりダメダメな感じになったのですが、「じゃぁBoost Libraryではどうやっているのか?」が知りたくなり、昨日のエントリの最後にBoost Libraryで書いたコードをプリプロセッサに通した結果を表示させてみた。 なんと、こんな感じだった…

メソッドホルダ・失敗篇

C++

Delphiでは、戻り値の型と引数の数と型さえあっていればどんなオブジェクトのメソッドも格納できるメソッドホルダ(と言うんだったかな?)がありますが、これをC++で実践しようとした結果。 一種類で100行超えるとはどういうこったい。なにかやり方を間違え…

googletestまとめ

導入 →googletestについてのまとめ テストの記述 基本的な使い方 →基本的な使い方 前処理・後処理のあるテスト →前処理・後処理のあるテスト アサーション 二種類のアサーション(FatalなアサーションとNonFatalなアサーション) 真偽を評価するアサーション…

その6:アサーションの解説(3)

例外を扱うアサーションマクロです。 Fatal assertionNonfatal assertionVerifies ASSERT_THROW(statement, exception_type) EXPECT_THROW(statement, exception_type) statement throws an exception of the given type ASSERT_ANY_THROW(statement) EXPECT…

その5:前処理・後処理のあるテスト

各々のテストで同様の前処理や後処理がある場合、テストケース単位で設定することができます。 まず、::testing::Testの派生クラスとしてテストケース名のクラスを定義します。そしてこのクラスに前処理が必要であればSetUp関数を、後処理が必要であればTear…

その4:アサーションの解説(2)

残りのアサーションマクロのうちの、2つのグループの解説です。 無条件の成功と失敗 ここでのマクロは値や式を評価せず、直接に成功あるいは失敗を生成します。 SUCCEED() 成功を生成するマクロです。ただし、このマクロが評価されたとしてもテストが成功し…

boost::dynamic_bitsetから部分ビット列を切り出す、のつづき

C++

昨日のコード、少し短くなることに気がついた。 #include <iostream> #include <string> #include <boost/dynamic_bitset.hpp> int main(int, char* []) { boost::dynamic_bitset<> b1(std::string("10110011100011110000")); std::cout << b1 << std::endl; std::string s; boost::to_string(b1, s); boo</boost/dynamic_bitset.hpp></string></iostream>…

boost::dynamic_bitsetから部分ビット列を切り出す

C++

boost::dynamic_bitsetをさわったついでに、もとのビット列から部分ビット列を切り出す方法を探してみたんですが、どうも見つかりません。イテレータがあればこんな感じで書けると思うのですが。 // 注意:これはイメージです。コンパイルできません。 // も…

その3:実行時オプションと環境変数(1)

主立った実行時オプションについて説明します。 実行時オプションには(--gtest_list_testsをのぞいて)対応する環境変数があります。環境変数に値を設定しておくと、実行時オプションを指定したときと同じ効果が得られます。 オプション 環境変数 機能 --gt…

std::basic_stringで戯れる

C++

std::vectorの連結で演算子が使えない、という話題に対して。 どういう話かというと、こういうことです。 #include <iostream> #include <vector> #include <algorithm> #include <iterator> int main(int, char* []) { std::vector<int> v1; std::vector<int> v2; v1.push_back(10); v1.push_back(20); v1.pus</int></int></iterator></algorithm></vector></iostream>…

その2:アサーションの解説(1)

二種類のアサーション googletestのアサーションには大きく二種類のアサーションマクロが用意されています。 一つは評価が失敗した時点でテストを終了する、名前がASSERT_で始まるマクロ。もう一つは評価が失敗してもテストを継続する、名前がEXPECT_で始ま…

その1:基本的な使い方

最低限テストとして利用できる基本的な使い方について解説します。応用についてはおいおい。 テストを記述する テストは、関数のように見えるTESTマクロを使って記述します。 TEST(テストケース名, テスト名) { テスト本体 } 個々のテストは特に登録などの手…

その0:googletestについてのまとめ

探すとたくさんの情報があり、ドキュメントの翻訳をされているかたも少なくありませんが、自分で使うためにまとまった形にしておくと便利だと思い立ち、まとめてみることにしました。内容は“GitHub - google/googletest: Google Test”から、ドキュメントとし…