BREW String(2)
まず、basic_stringが定義されているファイル(XSTRING)を見てみると、いろんなファイルをincludeしてます。
それを、
全部削除します(・∀・)
今作ろうとしてるのはbasic_stringなので、最低限必要な部分だけ切り取って持ってくればいいのです。
で、必要なのは、
allocator
char_traits
iterator関係
ぐらいでしょうか。
こいつらだけ切り取って使うことにします。
で、後は例外を投げている部分をDBGPRINTFに直したりとか__cdeclを消したりとかchar_traitsの wmem*()系の関数を WSTR*()系の関数に置き換えたりすればコンパイルに成功するはず。
そして実行!
( ゚Д゚)ウマー
エミュレータ上ですが簡単に動きましたよこれ!
この調子で実機でも実験!
……コンパイルすら通りませんでしたorz
まあ思ってたとおりですけどね(;つД`)
まずtypedefのバグが多いですね。
template<class _E, class _Tr = char_traits<_E>, class _A = allocator<_E> > class basic_string { public: typedef _A::size_type size_type; typedef _A::difference_type difference_type;
この辺全部コンパイルエラーです(;´Д`)
どうやら、_A::size_typeみたいな書き方はARMは知らないようです……orz
allocatorの定義を見ると、size_typeはsize_tのことらしいので、
typedef size_t size_type;
という形で、_A::*になっている部分を全部書き換えてやります。
んで、あとは細かなエラーを直してコンパイル→実行。
キタ━━━━(゚∀゚)━━━━!!!!
普通に動いてますよ奥さん。
これは楽しすぎるぜ☆-(ノ゚Д゚)八(゚Д゚ )ノイエーイ
でもこれには致命的な問題があって、なんとファイルサイズが馬鹿でかくなるのです。
いや、まあ全部インライン展開すればそりゃ大きくなる罠(;´Д`)
で、少々速度は落ちてもいいので、2命令以上のメソッドは全て.cppファイルに書いていくことにします。
しかし、テンプレートを外に書くのめんどすぎ!!
template<class _E, class _Tr, class _A> typedef basic_string<_E, _Tr, _A>::_Myt _Myt; template<class _E, class _Tr, class _A> typedef basic_string<_E, _Tr, _A>::size_type size_type; template<class _E, class _Tr, class _A> basic_string<_E, _Tr, _A>::basic_string(const _Myt& _X, size_type _P, size_type _M, const _A& _Al = _A()) : allocator(_Al) {_Tidy(), assign(_X, _P, _M); }
なんじゃこりゃ(;´Д`)
しかもVCですらコンパイルが通らないし。
自分はC++のコアな仕様なんか知らないから、これがコンパイラのバグなのか自分が悪いのかわからない。
そんなのをわざわざ調べるのも面倒だし、コンパイラのバグだったら骨折り損なのでどうしようか考えた末、結局テンプレートを使わないことにしました(;´Д`)