// Copyright (c) 2016 Klemens D. Morgenstern // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #ifndef BOOST_PROCESS_DETAIL_TRAITS_WCHAR_T_HPP_ #define BOOST_PROCESS_DETAIL_TRAITS_WCHAR_T_HPP_ #include #include #include #include namespace boost { namespace process { namespace detail { //template template struct is_wchar_t : std::false_type {}; template<> struct is_wchar_t : std::is_same { }; template<> struct is_wchar_t : std::true_type {}; template<> struct is_wchar_t : std::true_type {}; template struct is_wchar_t : std::true_type {}; template struct is_wchar_t : std::true_type {}; template<> struct is_wchar_t : std::true_type {}; template<> struct is_wchar_t> : std::true_type {}; template<> struct is_wchar_t> : std::true_type {}; template<> struct is_wchar_t> : std::true_type {}; template<> struct is_wchar_t> : std::true_type {}; template struct char_converter { static T& conv(T & in) { return in; } static T&& conv(T&& in) { return std::move(in); } static const T& conv(const T & in) { return in; } }; template using char_converter_t = char_converter::type>::type>; template<> struct char_converter { static std::string conv(const wchar_t* in) { std::size_t size = 0; while (in[size] != L'\0') size++; return ::boost::process::detail::convert(in, in + size); } }; template<> struct char_converter { static std::string conv(wchar_t* in) { std::size_t size = 0; while (in[size] != L'\0') size++; return ::boost::process::detail::convert(in, in + size); } }; template struct char_converter { static std::string conv(const wchar_t(&in)[Size]) { return ::boost::process::detail::convert(in, in + Size -1); } }; template<> struct char_converter { static std::wstring conv(const char* in) { std::size_t size = 0; while (in[size] != '\0') size++; return ::boost::process::detail::convert(in, in + size); } }; template<> struct char_converter { static std::wstring conv(char* in) { std::size_t size = 0; while (in[size] != '\0') size++; return ::boost::process::detail::convert(in, in + size); } }; template struct char_converter { static std::wstring conv(const char(&in)[Size]) { return ::boost::process::detail::convert(in, in + Size -1); } }; //all the containers. template<> struct char_converter { static std::wstring conv(const std::string & in) { return ::boost::process::detail::convert(in); } }; template<> struct char_converter { static std::string conv(const std::wstring & in) { return ::boost::process::detail::convert(in); } }; template<> struct char_converter> { static std::vector conv(const std::vector & in) { std::vector ret(in.size()); std::transform(in.begin(), in.end(), ret.begin(), [](const std::string & st) { return convert(st); }); return ret; } }; template<> struct char_converter> { static std::vector conv(const std::initializer_list & in) { std::vector ret(in.size()); std::transform(in.begin(), in.end(), ret.begin(), [](const std::string & st) { return convert(st); }); return ret; } }; template<> struct char_converter> { static std::vector conv(const std::vector & in) { std::vector ret(in.size()); std::transform(in.begin(), in.end(), ret.begin(), [](const char* st) { std::size_t sz = 0; while (st[sz] != '\0') sz++; return convert(st, st + sz); }); return ret; } }; template<> struct char_converter> { static std::vector conv(const std::initializer_list & in) { std::vector ret(in.size()); std::transform(in.begin(), in.end(), ret.begin(), [](const char* st) { std::size_t sz = 0; while (st[sz] != '\0') sz++; return convert(st, st + sz); }); return ret; } }; template<> struct char_converter> { static std::vector conv(const std::vector & in) { std::vector ret(in.size()); std::transform(in.begin(), in.end(), ret.begin(), [](const std::wstring & st) { return convert(st); }); return ret; } }; template<> struct char_converter> { static std::vector conv(const std::initializer_list & in) { std::vector ret(in.size()); std::transform(in.begin(), in.end(), ret.begin(), [](const std::wstring & st) { return convert(st); }); return ret; } }; template<> struct char_converter> { static std::vector conv(const std::vector & in) { std::vector ret(in.size()); std::transform(in.begin(), in.end(), ret.begin(), [](const wchar_t* st) { std::size_t sz = 0; while (st[sz] != L'\0') sz++; return convert(st, st + sz); }); return ret; } }; template<> struct char_converter> { static std::vector conv(const std::initializer_list & in) { std::vector ret(in.size()); std::transform(in.begin(), in.end(), ret.begin(), [](const wchar_t* st) { std::size_t sz = 0; while (st[sz] != L'\0') sz++; return convert(st, st + sz); }); return ret; } }; }}} #endif /* BOOST_PROCESS_DETAIL_TRAITS_WCHAR_T_HPP_ */