2012-01-01から1年間の記事一覧

今年作った Vimプラグイン達

vim

さて、今日は大晦日なんですけど特にネタもないので今年作った Vimプラグインの一覧でも。 chained.vim SID 周りをゴニョゴニョするライブラリ(開発中) owl.vim Vim script のテストを行う(開発中) budou.vim verbosefile の設定を行う watchdogs.vim コ…

Vim script のユニットテスト用のコード書いている

vim

今年中に書いておきたかったネタその1。 前々から真面目に書こうと思っていたんですが、最近やっととりかかりました。 この手のテストモジュールは殆ど触ったことがないのでどういう風な構造やエラーメッセージを出力すればいいのかよくわかってないので結構…

Vim script の処理時間を計測する

vim

reltime() と reltimestr() の組み合わせで出来るぽいです。 [ソース] command! -bar TimerStart let start_time = reltime() command! -bar TimerEnd echo reltimestr(reltime(start_time)) | unlet start_time function! s:test1() TimerStart for n in ra…

Vim で改行を含む○○○〜△△△にマッチする正規表現

vim

lingr の Vim部屋で教えてもらったので覚書。 次のように定義すればいいみたいです。 [イメージ] AA{マッチする} {マッチする} {マッチする}BB {マッチしない} {マッチしない}BB [正規表現] AA\zs\_.\{-}\zeBB \{-} がわからなかった…。

Vim で特定の範囲をハイライトする

vim

例えば Vim で、 <red>赤色でハイライト</red> <green>緑色でハイライト</green> みたいにタグを付けて特定の範囲内をハイライトしたい事があると思います。 と、いうことで syntax region を使用してやってみました。 あとついでに conceal でタグ消しも。 [ソース] " <red> </red> で囲むと赤色…

Vim で選択範囲を折りたたむ

vim

覚書。 折り畳みたい範囲を選択して[ zf ]でその範囲を折りたたむ事できます。 とりあえず、慣れている[ zc ]に設定して使ってみる。 " 選択して zc で折りたたむ vnoremap zc zf [参照] http://blog.livedoor.jp/nakamura_tech/archives/51335005.html

Clang の Generic Lambdas で遊んでみた

C++

ひげの生えたおじさんからおもちゃをもらいました。 やたー。 と、いうことで C++1y の Generic Lambdas(仮)が実装された Clang があるらしいのでちょっと遊んでみました。 Generic Lambdas in C++ using Clang clang-glambda Generic Lambdas まじやばい…

ラムダ式を継承

C++

そういえば、ラムダ式って継承できるのかーと思いつつ書いてみた。 [ソース] #include <utility> template<typename ...Args> struct overload; template<typename T> struct overload<T> : T{ using T::operator(); template<typename TT> overload(TT&& t) : T(std::forward<TT>(t)){} }; template<typename T, typename U, typename ...Args> struct overlo…</typename></tt></typename></t></typename></typename></utility>

年末 vimrc大掃除イベント

vim

とかやりたいとか思っています。 まぁイベントと言っても 『参加者が集まって決まった時間に行う』 のではなくて 『開催中に自分の好きな時間に行う』 というような自由参加型なイベントになります。 『vimrc を整理したいけどなかなかタイミングが…』って人…

constexpr which を get に渡す

そういえば、constexpr variant だと which の値を直接 get に渡すことが出来ますねーと。 [ソース] #include <sprout/variant.hpp> #include <sprout/string.hpp> int main(){ typedef sprout::variant<int, double, sprout::string<16>> var; { constexpr var v{42}; static_assert(sprout::get<v.which()>(v) == 42, ""); } { constexpr var v</v.which()></int,></sprout/string.hpp></sprout/variant.hpp>…

LLVM 3.2 がリリース

LLVM 3.2 がリリースされました。 ちょっと延期しましたけど、だいたい予定通りでしたね。 3.0 や 3.1 ほどの遅れはなかったです。 Download LLVM 3.2 LLVM 3.2 Release Notes Clang 3.2 Release Notes C++ のコンパイラとしては Clang 3.1 の時ほど目新しい…

sprout::apply_visitor で static_visitor に依存しないアプローチ

Sprout.Variant の apply_visitor に『static_visitor を継承していない(result_type が定義されていない) Visitor を渡したい!』というムチャぶりをした結果、いくつかの代案が出たので覚書。 1.文字列にして返す 言葉通り文字列にして返してあとから復…

Sprout で長さの短い文字列型へ変換する

いつも忘れてしまうので覚書。 さて、Sprout.String では、長さの長い文字列型への型変換は暗黙的に行なってくれるのですが、長さの短い文字列型への変換は行えません。 constexpr sprout::string<16> homu = sprout::to_string("homu"); // error // conste…

Boost.Coroutine でジェネレータ その2

ちょっと変えてみた。 coroutine は std::shared_ptr で保持。 [ソース] #include <boost/coroutine/coroutine.hpp> #include <iostream> #include <functional> #include <memory> std::function<int()> counter_generator(int start, int step){ typedef boost::coroutines::coroutine<int()> coroutine_type; auto coroutine = std::ma</int()></int()></memory></functional></iostream></boost/coroutine/coroutine.hpp>…

Boost.TypeErasure any のコンストラクタで暗黙の呼び出しを行いたい

[追記] この問題はリリース版である Boost 1.54.0 では動作するようになりました。 さて、Boost.TypeErasure any のコンストラクタでは explicit で定義されているため、次のように関数にコンセプトを満たす型を渡す場合、明示的に型変換を行なってから渡さ…

VimエディタでもアニメーションGIFが再生したい!

vim

window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.src = "https://platform.twitter.com/widgets.js"; fjs.paren…

Boost.Range には std::for_each をラップした boost::for_each が 定義されているんですが、それとは別に にも boost::for_each が定義されていたので違いを調べてみました。 どうやら range を2つ受け取れるみたいです。 [ソース] #include <boost/range/algorithm_ext/for_each.hpp> #include <boost/range/algorithm/for_each.hpp> #in</boost/range/algorithm/for_each.hpp></boost/range/algorithm_ext/for_each.hpp>…

Boost.Serialization でコンテナを標準出力

Boost.Serialization でコンテナの中身を出力出来ないかなーってことで試してみました。 [ソース] #include <boost/serialization/serialization.hpp> #include <boost/serialization/vector.hpp> #include <boost/serialization/map.hpp> #include <boost/serialization/string.hpp> #include <boost/archive/text_oarchive.hpp> #include <iostream> #includ…</iostream></boost/archive/text_oarchive.hpp></boost/serialization/string.hpp></boost/serialization/map.hpp></boost/serialization/vector.hpp></boost/serialization/serialization.hpp>

uniform initialization と default copy constractor

C++

次のコード、てっきり default copy constractor が呼ばれると思っていたんですが、uniform initialization が優先されるんですね。 ちょっとハマった。 [ソース] struct X{ int value; }; int main(){ X x{10}; // error: cannot convert 'X' to 'int' in i…

emplace_back でも uniform initialization したい

C++

元ネタ:C++11 emplace_back on vector? - stackoverflow なんかモヤモヤしたのでアロケータを自作して対応してみました。 アロケータ本体の実装はここら辺のコードを丸パクリ。 [ソース] #include <vector> #include <string> #include <iostream> #include <limits> template <class T> class uniform_</class></limits></iostream></string></vector>…

今年の目標を達成しました

かれこれ10年近くブログ書いているけど、1年間毎日投稿したのは初めてなので結構達成感がある。 700もキリがいいしね。 さて、次はどうしようか。 [追記] ちなみにアクセス数が一番多かった記事はこれでした。

第8回 C++オンライン読書会開催しました

C++

先週の土曜日に開催しました。 第8回 C++オンライン読書会 - boostjp [次回] 次の C++オンライン読書会は下記になります。 日時:2013/01/05 20:00〜 読物:C++で例外安全なコーディング

Boost.Coroutine で乱数のジェネレータ

とりあえず、簡単に。 ジェネレータといいつつ、なんか違うような気がしないでもない。 [ソース] #include <boost/coroutine/coroutine.hpp> #include <boost/coroutine/all.hpp> #include <vector> #include <iostream> #include <random> #include <functional> #include <cstdint> typedef boost::coroutines::coroutine<int()> coroutine_type; void random_generat…</int()></cstdint></functional></random></iostream></vector></boost/coroutine/all.hpp></boost/coroutine/coroutine.hpp>

std::tuple を標準出力する

現状は Boost.Fusion を使うのが一番楽かな。 [ソース] #include <tuple> #include <boost/fusion/include/io.hpp> #include <boost/fusion/include/as_vector.hpp> #include <boost/fusion/adapted/std_tuple.hpp> #include <iostream> int main(){ auto t = std::make_tuple(42, 3.14f, "homu"); std::cout << boost::fusion::as_vector(t)…</iostream></boost/fusion/adapted/std_tuple.hpp></boost/fusion/include/as_vector.hpp></boost/fusion/include/io.hpp></tuple>

Boost.Coroutine 触ってみた

Boost.Coroutine が採用されたということで簡単に触ってみました。 ソースコード:http://ok73.funpic.de/boost-coroutine.zip. ドキュメント:http://ok73.ok.funpic.de/boost/libs/coroutine/doc/html/ ソースコードはどこにあるか分からなかったので ML …

名前が分からない基底クラスでも Inheriting constructors したい

C++

さて、C++11 で新しく追加された Inheriting constructors という機能なんですが、これは次のように使うことが出来ます。 struct base{ constexpr base(int value) : value(value){} constexpr base(int value1, int value2) : value(value1 + value2){} int…

C++ で std::function を使わない不動点コンビネータ

C++

どうも不動点コンビネータとYコンビネータの違いがよくわかってないマンです。 C++ で不動点コンビネータを調べるといくつか実装があったんですが id:iorate さんの実装が一番すっきりしていたのでを元にして、std::function を使わないようにしてみました。…

lambda expression を 関数ポインタ型へと変換する

C++

さて、キャプチャを行なっていないラムダ式は次のように関数ポインタ型へと型変換を行うことが出来ます。 auto f = [](int){ return 0; }; std::common_type<int(*)(int)>::type ff = f; このような場合は問題ないのですが、例えば次のようにテンプレート型を使って関数ポ</int(*)(int)>…

第2回 Boost.読書会

行いました。 [ログ] #2 Variant - co-meeting [参加メンバー] Shigemasa Watanabe Tomohiro Kashiwada faith_and_brave manga_osyo saki7 計5名 [所感] 今回はわたしが進行役だったんですが、いろいろとバタバタしてしまっていてすみません…。 サポートあり…

reti.vim を使用したカプセル化

vim

こんな感じ? [ソース] function! s:make() let self = {} let value = 0 let self.set = reti#execute("let value = a:1", l:) let self.get = reti#lambda("value", l:) return self endfunction function! s:main() let data = s:make() let data2 = s:ma…