shand::mpl::to_string

以前作成したto_mpl_stringメタ関数名前空間とメタ関数名を変更しただけです。

#ifndef SHAND_MPL_TO_STRING_INCLUDE
#define SHAND_MPL_TO_STRING_INCLUDE

#include <boost/mpl/string.hpp>

namespace shand { namespace mpl {

namespace to_mpl_string_detail {

// digit : 桁数を計算
template <int N, int Digit>
struct digit_impl {
    static const int value = digit_impl<N / 10, Digit + 1>::value;
};

template <int Digit>
struct digit_impl<0, Digit> {
    static const int value = Digit;
};

template <>
struct digit_impl<0, 0> {
    static const int value = 1;
};

template <int N>
struct digit {
    static const int value = digit_impl<N, 0>::value;
};


// digit_number : XのN桁目を取得
template <int N, int X>
struct digit_pow {
    static const int value = digit_pow<N - 1, X>::value * X;
};

template <int X>
struct digit_pow<1, X> {
    static const int value = 1;
};

template <int X>
struct digit_pow<0, X> {
    static const int value = 1;
};

template <int X, int Digit>
struct digit_number {
    static const int value = X / digit_pow<Digit, 10>::value % 10;
};


// to_mpl_string : 整数をmpl::stringに変換
template <class String, int X, int Digit>
struct to_mpl_string_impl {
    typedef
        typename to_mpl_string_impl<
            typename boost::mpl::push_back<
                String,
                boost::mpl::char_<'0' + digit_number<X, Digit>::value>
            >::type,
            X,
            Digit - 1
        >::type
    type;
};

template <class String, int X>
struct to_mpl_string_impl<String, X, 0> {
    typedef String type;
};

} // namespace to_mpl_string_detail

template <int X>
struct to_string {
    typedef
        typename to_mpl_string_detail::to_mpl_string_impl<
            typename boost::mpl::string<>::type,
            X,
            to_mpl_string_detail::digit<X>::value
        >::type
    type;
};


}} // namespace shand::mpl


#endif // SHAND_MPL_TO_STRING_INCLUDE