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++のコアな仕様なんか知らないから、これがコンパイラのバグなのか自分が悪いのかわからない。
そんなのをわざわざ調べるのも面倒だし、コンパイラのバグだったら骨折り損なのでどうしようか考えた末、結局テンプレートを使わないことにしました(;´Д`)