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

scope_guard

ScopeGuard - Faith and Brave - C++で遊ぼう を見て、面白そうなので C++0x で書いたらどうなるかなーと思ってやってみた。 class scope_guard_impl_base { protected: scope_guard_impl_base() : dismissed_(false) { } scope_guard_impl_base(const scope…

N2709 - 非同期実行のための Packaging Tasks

http://melpon.tank.jp/pukiwiki147/index.php?Memo%2F%CB%DD%CC%F5%2FN2709%20-%20Packaging%20Tasks%20for%20Asynchronous%20Execution スレッドから値を返してもらうためのクラス。 全く同じ事が promise を使ってやることが出来るけど、このクラスを使え…

N2671 - 非同期 Future Value

そういえば大分前に翻訳して貼ってなかったので。http://melpon.tank.jp/pukiwiki147/index.php?Memo%2F%CB%DD%CC%F5%2FN2671%20-%20An%20Asynchronous%20Future%20Value%A1%A7%20Proposed%20Wording 概念的には、マルチスレッドデザインパターンの Future …

nested_exception のサンプル

例えば自前の XML 読み込みクラスみたいな複雑な作る場合なんかはいろんな(out of range とか null reference、他にも exception を継承していない例外とか、他社ベンダのライブラリを使うならそれが提供している例外とか)例外が出る可能性があるので、そ…

nested_exception

id:faith_and_brave:20081203 の InnerException を、nested_exception で書いてみた。 class my_nested : public exception { private: const char* what_; public: my_nested(const char* what) : what_(what) { } virtual const char* what() const throw…

N2748 - Strong Compare and Exchange

http://melpon.tank.jp/pukiwiki147/index.php?Memo%2F%CB%DD%CC%F5%2FN2748%20-%20Strong%20Compare%20and%20Exchange compare-and-exchange は、実装によっては以前の値と同じ場合でも失敗することがあるのだけれども、それが起こる weak バージョン(今ま…

N2668 - Concurrency Modifications to Basic String

http://melpon.tank.jp/pukiwiki147/index.php?cmd=read&page=Memo%2F%CB%DD%CC%F5%2FN2668%20-%20Concurrency%20Modifications%20to%20Basic%20String basic_string の copy-on-write 実装(書き込み時に文字列をコピーする実装)を実質上禁止するというも…

Boost 1.35.0 の Boost.Thread を翻訳してみた

Memo/翻訳/Boost.Thread 現在の翻訳ソフトの精度に感動。 翻訳ソフトに英語を教えてもらいながら翻訳してます。 次は何を翻訳するかな−。

キャストで型を書くのが面倒で仕方がないというあなたへ捧げるたった1つのクラス

C++

template<class T> struct auto_cast { T v; auto_cast(T v_) : v(v_) { } template<class U> operator U() { return (U)v; } }; template<class T> auto_cast<T> cast(T v) { return auto_cast<T>(v); } void func(short s) { } void main() { unsigned int n = cast(-1); func(cast(n)); } </t></t></class></class></class>…

FastMath

昔書いた、携帯用の Math クラスが出てきたので貼り付け。 ProGuard もかけてやると、生成される class ファイルは 2 キロバイト弱になるようだ。 コサインテーブルを静的に持ったりなんかするとすごく容量を取るので、昔はこういうクラスは重宝したんだけど…

インデックスカラーに対応してみた

boost::gil::color_converted_view を使って、色を変換する代わりにインデックス値から目的の色に変換することでインデックスカラーを実現することができる。 #include <boost/gil/gil_all.hpp> #include <iterator> // 8-bit index struct index_color_t {}; typedef boost::mpl::vector1<index_color_t> ind</index_color_t></iterator></boost/gil/gil_all.hpp>…

ジェネリックイメージ・ライブラリのデザインガイド

英語のレベルが中学生以下の自分がエキサイト翻訳とスペースアルクを駆使して英語の勉強がてらに翻訳中。 http://melpon.tank.jp/pukiwiki147/index.php?Memo%2F%CB%DD%CC%F5%2FGeneric%20Image%20Library%20Design%20Guide 自分のレベルではこれが限界。英…

キーワード: Locator

イテレータを多次元化したもの。 これ自身はイテレータではない。 GIL から提供されている Locator には memory_based_2d_locator と virtual_2d_locator の2つがあって、メモリ上のピクセルを扱うなら interleaved だろうが planar だろうが memory_based_…

キーワード: Step Iterator

Pixel Iterator が定義したステップ数ではなく、任意のステップ数にすることが出来る。 例えば、 画像を左右反対に走査したい場合は、reverse_iterator のようなステップ数がマイナスのイテレータが必要になる。 画像を飛び飛びでサンプリングする場合は、N …

キーワード: Iterator Adaptor

他のイテレータをラップしたイテレータ。 例えば memory_based_step_iterator は、既存のイテレータのステップを変更することの出来る Iterator Adapter である。

キーワード: Pixel Iterator

Pixel 用のイテレータ。 interleave な画像のイテレータは Pixel へのポインタ(pixel* とか packed_pixel* とか)で、planer な画像のイテレータは planar_pixel_iterator を使う。 typedef planar_pixel_iterator<const bits8*, rgb_t> rgb8c_planar_ptr_t; typedef planar_pixe</const>…

キーワード: Pixel

Channel を Layout に従って配置した値。 例えばこんな感じ。 typedef pixel<bits8, rgb_layout_t> rgb8_pixel_t; typedef pixel<bits8, bgr_layout_t> bgr8_pixel_t; bits8 やら bits16s はただの typedef だけど、これも Channel の仲間。 RGB565 なんかも、packed_pixel を使えば定義できる。 typede</bits8,></bits8,>…

キーワード: Channel

RGB の Red とか、CMYK の Cyan とか、そういう色の値のこと。 RGB565 なんかの場合はビット単位に色が分けられるんだけど、その場合でも typedef packed_channel_reference<0,5,true> channel16_0_5_reference_t; typedef packed_channel_reference<5,6,tru…

キーワード: Layout

Color Space の、実メモリ上のレイアウト。 例えば RGBA の実メモリ上のレイアウトは、ARGB なこともあるだろうし BGRA なこともあるだろう。 Color Space に実メモリ上のレイアウトを持たせるのが Layout。 typedef layout<rgba_t> rgba_layout_t; // default order</rgba_t>…

キーワード: Color Space

色空間。gray scale とか RGB とか CMYK とかそういうやつ。 boost::mpl::vector で表現されている。 例えば RGBA は、 struct red_t{}; struct green_t{}; struct blue_t{}; struct alpha_t{}; typedef mpl::vector4<red_t,green_t,blue_t,alpha_t> rgba_t; こんな感じ。</red_t,green_t,blue_t,alpha_t>

Boost.GIL に手を付けてみた

まあすぐに飽きる気がするけど。 とりあえず、 Naming convention for GIL concrete types Concrete (non-generic) GIL types follow this naming convention: ColorSpace + BitDepth + [f | s]+ [c] + [_planar] + [_step] + ClassType + _t Where ColorSpa…

boost::mpl::push_back

#include <boost/mpl/push_back.hpp> #include <boost/mpl/push_front.hpp> #include <boost/mpl/list.hpp> using namespace boost::mpl; void main() { typedef list<int, char> list2; //typedef push_back<list2, void*>::type list3; // ↑コンパイルエラー typedef push_front<list2, void*>::type list3; // ↑こっちなら通る } 謎だ...。</list2,></list2,></int,></boost/mpl/list.hpp></boost/mpl/push_front.hpp></boost/mpl/push_back.hpp>

property_tree

何をやるクラスなのかまったく理解してないんだけど、 xml_parser_read_spirit.hpp ここの xml_grammar クラスだけ切り取ってゴニョゴニョしてみたい衝動に駆られた。 でもよく考えてみると XML って DTD とか XML Schema がないと無用の長物だよなぁとか思…

スレッドの同期呼び出し

を作ってみた。 #ifndef ANMELT_THREAD_INVOKE_H_INCLUDED #define ANMELT_THREAD_INVOKE_H_INCLUDED // Boost #include <boost/thread.hpp> #include <boost/optional.hpp> #include <boost/noncopyable.hpp> #include <boost/ref.hpp> #include <boost/utility/enable_if.hpp> #include <boost/utility/result_of.hpp> #include …</boost/utility/result_of.hpp></boost/utility/enable_if.hpp></boost/ref.hpp></boost/noncopyable.hpp></boost/optional.hpp></boost/thread.hpp>

スレッドプール

Worker Thread パターンでスレッドプールを作ってみた。 worker_thread.h #ifndef ANMELT_THREAD_WORKER_THREAD_H_INCLUDED #define ANMELT_THREAD_WORKER_THREAD_H_INCLUDED // Boost #include <boost/thread.hpp> #include <boost/shared_ptr.hpp> #include <boost/function.hpp> #include <boost/bind.hpp> #include </boost/bind.hpp></boost/function.hpp></boost/shared_ptr.hpp></boost/thread.hpp>

汎用的な Balking コンテナ

を作ってみた。 #ifndef ANMELT_THREAD_BALKING_CONTAINER_H_INCLUDED #define ANMELT_THREAD_BALKING_CONTAINER_H_INCLUDED // Boost #include <boost/thread.hpp> namespace anmelt{ namespace thread { template<class Container, class Adapter> class balking_container { private: Container container_; </class></boost/thread.hpp>…

汎用的な Blocking コンテナ

を作ってみた。 #ifndef ANMELT_THREAD_BLOCKING_CONTAINER_H_INCLUDED #define ANMELT_THREAD_BLOCKING_CONTAINER_H_INCLUDED // Boost #include <boost/thread.hpp> namespace anmelt{ namespace thread { template<class Container, class Adapter> class blocking_container { private: Container container</class></boost/thread.hpp>…

多重ラムダ

using namespace boost::lambda; template<class F, class T> void apply(F f, T v) { f(v); } void func(std::vector<int>& v) { std::for_each(v.begin(), v.end(), _1 *= 2); } void main() { std::vector<int> v; apply(func, boost::ref(v)); } これを、func 関数を作らずにやるとど</int></int></class>…

間違ったコード

C++

class Item { private: int value_; public: Item(int v) : value_(v) { } void Initialize() { ... } }; class Hoge { private: std::vector<Item*> vec_; public: ~Hoge() { BOOST_FOREACH (Item* p, vec_) delete p; } void add(int n) { std::auto_ptr<Item> item(new</item></item*>…

既存のオブジェクトをスレッドセーフにする

こんなの作ってみました。 #ifndef ANMELT_THREAD_MUTEXED_H_INCLUDED #define ANMELT_THREAD_MUTEXED_H_INCLUDED #include <boost/thread.hpp> #include <boost/utility/enable_if.hpp> #include <boost/utility/result_of.hpp> #include <boost/type_traits/is_void.hpp> namespace anmelt{ namespace thread { template</boost/type_traits/is_void.hpp></boost/utility/result_of.hpp></boost/utility/enable_if.hpp></boost/thread.hpp>