C++

codecvt

てなわけで ( http://d.hatena.ne.jp/janus_wel/20100313/1268483725 ) 実際に narrow character と wide character の変換をする code を書いてみた。つっても sample 的なものだとアレなので class としてまとめて使いやすくしたものを。てか codecvt face…

C++0x 規格書日本語訳

今なら C++98 読むよりゃ draft だけど C++0x の規格書読んだ方がいいだろうってことでカホカホ打っている感じ。http://github.com/januswel/Cxx0xISja完了してるところが偏りまくってるんだけど C++ の規格書を読む上で必要な語句が定義されているところを…

wchar_t

何のためにあるのかちょっとわからなくなってきたので調べてみた。とりあえず規格の最新の draft によると、 5 Type wchar_t is a distinct type whose values can represent distinct codes for all members of the largest extended character set specifi…

NRVO in VC++

どっちの option も非推奨な option "/Og" が暗黙的に指定されるという指摘があったのでちょっと修正。英語版を覗いてみると「非推奨」にあたるところが "deplicated" と書かれていたので後方互換のために残してあるだけで将来なくなりますよという意味での…

cl.exe /help

VC++ 2008 Express Edition のハナシ。そろそろ IDE 起動して「新規作成」 -> 「既存のコードからプロジェクトを作成」 を選択するのもイヤになってきたので cl.exe を直で使うようにしようと思って title の command で出てくる help ( 主に option 説明 ) …

char set/encoding of C++ source code

そういや C++ での非 ascii character の扱いはどうなってんのかなと思ってちょっと試してみたんだけど相変わらずダメっぽい。やりようがあるのかもしれないけど試して見た限りでは VC++ 2008 Express Edition が cp932 固定 ( utf-8 だと通る文字と通らない…

文字列から何かに変換する・何かから文字列に変換する

ここでいう「何か」は型のこと。いやそんなん stringstream かませばいいじゃんというのは正解というか大正解なんだけど stringstream は生成するにしてもその大きさにしてもけっこう「重い」し変換操作を一連の手続きとして閉じ込めてしまうことに意義があ…

C++ で関数から object をどう返すか

VC++ における NRVO について別 entry に書いた -> http://d.hatena.ne.jp/janus_wel/20100301/1267397791昨日同じような title で entry 書いたら ( http://d.hatena.ne.jp/janus_wel/20100221/1266766850 ) comment でいいことを教えてもらった ( http://d…

C++ で関数から文字列をどう返すか

めんどうかつうまい手が見つかりにくい問題なのでちょいと考察。パッと出てくるのは以下の 3 つなんだけど。 std::string object を new して pointer 返し std::string を値返し 関数を function object にして内部で std::string を持っておいてそれを参照…

C/C++ で redirection と pipeline を検知する方法

redirection 、リダイレクト ( ">" でつないで file に書き出し ) と pipeline 、パイプ ( "|" でつないで他の command に出力を渡す ) を C/C++ で検知する方法まとめ。以前使った記憶があるしたしか方法あったよなと思いつつ探したんだけど見つけるのに 2 …

basic_ios::rdbuf()

basic_istream や basic_ostream の親である basic_ios は title に書いた関数を持っているらしくこいつは何をするものかというと basic_ios object が保持している basic_streambuf object の getter / setter らしい。てことは前いってた標準入出力に関連…

binary file の header 読み書き

http://d.hatena.ne.jp/janus_wel/20100216/1266347871 でいってた header / footer を持った binary file の読み書きの header 部分をこんな方向でやる的な指針作りとしてちょいと書いてみた。まず header を扱うための構造体の定義と流し込むための 演算子…

C++ iostream

最近 iostream をいじってて今こいつを派生させて ( ある程度 ) 好みのものを作ることが出来るということがわかってきたんだけどいざ使ってみようとするとんー、もしかしてこれ仕組みとして失敗してね ? という点がいくつか出てきた。とりあえずおれの理解と…

AviSynth script を C++ で扱う

ちょいとやってみたいことがあって C もしくは C++ で avs file を開いてアレコレできないかなーと思って調べてみたらまんまな code が forum ( http://forum.doom9.org/showthread.php?t=131674 の IanB 氏の発言 http://forum.doom9.org/showthread.php?p=…

multiprocess in C++ with Windows

ついでにプロセス関係も、ってことでmutexとsemaphore。 #include <windows.h> #include <string> namespace multiprocess { // mutex ----------------------------------------------------------------- class mutex { HANDLE m_handle; std::string m_name; public: // 生成</string></windows.h>…

multithread in C++ with Windows

Windowsのスレッド関係のAPIのラッパクラスを書いてみた。こんなことしなくてもpthreadやboost::threadあたり使えばいいんだけど、勉強のために。 #include <windows.h> #include <cassert> #include <process.h> namespace multithread { typedef unsigned (__stdcall * thread_func_t)(voi</process.h></cassert></windows.h>…

iostream in multiple threads

実はiostreamってスレッドセーフではない?以前書いたマルチスレッドのテストプログラムのprintfをstd::coutを使って書き換えてみたんだけど、表示が崩れる。ってことで、クリティカルセクションとか使ってみるわけなんだけど、こんな感じに、 class critica…

マルチスレッド

んじゃスレッドでも使ってみんべ、ってことでこういうソースを書いてテストしてたわけなんだけど。 #include <windows.h> #include <stdio.h> const unsigned DISPLAY_NUM = 100; const unsigned THREAD_NUM = 32; DWORD WINAPI thread_func(LPVOID thread_arg) { unsigned num =</stdio.h></windows.h>…

zlib

zlibを使って楽にzip/unzipできるようにするクラスを作ろう、ってんでこんなの作ってみた。 http://www89.sakura.ne.jp/~janus/distribution/zip.zip zipper・unzipperともにストリームを意識することなく、ファイル名指定で圧縮/解凍を行えるように設計して…

callback

はじめてコールバック関数のありがたみがわかった。いやまぁ、Windowsのイベントドリヴンなプログラムやってればイヤでも書くから今更何言ってんだって感じなんだけど(笑。入出力、特にユーザに指示を仰ぐときとかは引数と戻り値が固定な(プレースホルダーっ…

ダメだこりゃ

iteratorの勉強をしようと思って、Standard Template Library プログラミング on the Webを参考にしつつ、とりあえず自分でiterator(ぽいもの)を作ってみた。struct iterator<>をpublicに継承して…、ってこんな感じで書いてたんだけど(比較/2項演算子のオー…

ごめん嘘ついた

boost::filesystemの改造について、directory_iteratorとoperator/=を考慮してなかったので修正age。http://www89.sakura.ne.jp/~janus/distribution/boost_filesystem_utf8.zipもひとつ注意点。例えば以下のコード、 namespace fs = boost::filesystem; fs:…

boost::filesystem::pathの改造

Windowsの場合、UTF-8でパス名を持つように書き換えてみた。 http://www89.sakura.ne.jp/~janus/distribution/boost_filesystem_utf8.zip path_posix_windows.cppのほうは書き換えた位置をアスタリスク連打コメントで囲ってあるので、気になる方は検索しなが…

ちょっと考える

とりあえずboost::filesystemにUTF-8を突っ込んで、ファイル操作を行う段階で処理系デフォルト文字コードに変換しなおす、という方向で問題ないようだが、operation.hppに定義されているファイル操作関数を使えないのはイタイので、m_path_append()でUTF-8エ…

あまりかんばしくない

boost::filesytem::pathにUTF-8文字列を突っ込もうと考えたやぬすさん。UTF-8関連の変換関数をガリゴリと書いて、いざテスツ!という段階になってUTF-8ではファイルオープンとか出来ないことに気付いた(こうなるとmblen()あたりでマルチバイト列を調べながら読…

_cplusplusという罠

C++としてソースファイルをコンパイルする際、__cplusplusが定義済みマクロとして定義されているわけだが。C/C++リファレンスの定義済みマクロのページを信用して、というか_cplusplusの部分をコピペして #ifdef _cplusplus // 正確には __cplusplus extern …

UTF-8

文字コードについて悩むのをやめて、ゴリゴリとコーディングすることにした。UTF-8のmanpageとRFC3629日本語訳を参考にしてUCS-4-->UTF-8へのエンコーディングルーチン。 /* 一文字のUCS-4をUTF-8オクテット列にエンコードする */ size_t ucs4_to_utf8(char * …

ライブラリの国際化について

Unicodeの助けを借りるのが現実的かつ常識的。とりあえず思いつきそうなアプローチは、 文字列の内部表現はワイド文字、入出力はマルチバイト文字 内部表現・入出力ともにマルチバイト文字 の2点。内部表現にワイド文字を使う場合、2byteしか割いていない処…

マルチバイト文字列のstrlen()

昨日言ってたマルチバイト文字列の長さをはかる方法、mblen()を使えば簡単に出来た。っていうかmbなんたら系の関数っていつのまにC標準に?(ぉ int mbstrlen(const char * src) { unsigned length = 0; /* 返り値となるlength */ const char * psrc = src; /…

内部表現はワイド文字

内部表現をワイド文字で、入出力をマルチバイト文字で行うための関数を定義してみた。長いけどほとんどコメントなので勘弁。 #include <cstdlib> #include <cassert> #include <string> #include <vector> #include <iostream> #include <locale> #include <stdexcept> #ifdef _MSC_VER #define NS_STD #else #define NS_STD </stdexcept></locale></iostream></vector></string></cassert></cstdlib>…