diff options
Diffstat (limited to 'boost/process/detail/traits/wchar_t.hpp')
-rw-r--r-- | boost/process/detail/traits/wchar_t.hpp | 274 |
1 files changed, 274 insertions, 0 deletions
diff --git a/boost/process/detail/traits/wchar_t.hpp b/boost/process/detail/traits/wchar_t.hpp new file mode 100644 index 0000000000..812a92cf13 --- /dev/null +++ b/boost/process/detail/traits/wchar_t.hpp @@ -0,0 +1,274 @@ +// 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 <boost/process/detail/traits/decl.hpp> +#include <boost/process/detail/traits/cmd_or_exe.hpp> +#include <boost/process/detail/traits/env.hpp> +#include <boost/process/locale.hpp> + +namespace boost { namespace process { namespace detail { + +//template + +template<typename T> struct is_wchar_t : std::false_type {}; + +template<> struct is_wchar_t<boost::filesystem::path> : std::is_same<typename boost::filesystem::path::value_type, wchar_t> +{ +}; + +template<> struct is_wchar_t<const wchar_t* > : std::true_type {}; + +template<> struct is_wchar_t<wchar_t* > : std::true_type {}; + +template<std::size_t Size> struct is_wchar_t<const wchar_t [Size]> : std::true_type {}; +template<std::size_t Size> struct is_wchar_t<const wchar_t (&)[Size]> : std::true_type {}; + +template<> struct is_wchar_t<std::wstring> : std::true_type {}; +template<> struct is_wchar_t<std::vector<std::wstring>> : std::true_type {}; +template<> struct is_wchar_t<std::initializer_list<std::wstring>> : std::true_type {}; +template<> struct is_wchar_t<std::vector<wchar_t *>> : std::true_type {}; +template<> struct is_wchar_t<std::initializer_list<wchar_t *>> : std::true_type {}; + + + +template<typename Char, typename T> +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<typename Char, typename T> +using char_converter_t = char_converter<Char, + typename std::remove_cv<typename std::remove_reference<T>::type>::type>; + + +template<> +struct char_converter<char, const wchar_t*> +{ + 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<char, wchar_t*> +{ + 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<std::size_t Size> +struct char_converter<char, wchar_t[Size]> +{ + static std::string conv(const wchar_t(&in)[Size]) + { + return ::boost::process::detail::convert(in, in + Size -1); + } +}; + +template<> +struct char_converter<wchar_t, const char*> +{ + 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<wchar_t, char*> +{ + 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<std::size_t Size> +struct char_converter<wchar_t, char[Size]> +{ + static std::wstring conv(const char(&in)[Size]) + { + return ::boost::process::detail::convert(in, in + Size -1); + } +}; + +//all the containers. +template<> +struct char_converter<wchar_t, std::string> +{ + static std::wstring conv(const std::string & in) + { + return ::boost::process::detail::convert(in); + } +}; + +template<> +struct char_converter<char, std::wstring> +{ + static std::string conv(const std::wstring & in) + { + return ::boost::process::detail::convert(in); + } +}; + +template<> +struct char_converter<wchar_t, std::vector<std::string>> +{ + static std::vector<std::wstring> conv(const std::vector<std::string> & in) + { + std::vector<std::wstring> ret(in.size()); + std::transform(in.begin(), in.end(), ret.begin(), + [](const std::string & st) + { + return convert(st); + }); + return ret; + } +}; + +template<> +struct char_converter<wchar_t, std::initializer_list<std::string>> +{ + static std::vector<std::wstring> conv(const std::initializer_list<std::string> & in) + { + std::vector<std::wstring> ret(in.size()); + std::transform(in.begin(), in.end(), ret.begin(), + [](const std::string & st) + { + return convert(st); + }); + return ret; + } +}; + +template<> +struct char_converter<wchar_t, std::vector<char* >> +{ + static std::vector<std::wstring> conv(const std::vector<char* > & in) + { + std::vector<std::wstring> 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<wchar_t, std::initializer_list<char *>> +{ + static std::vector<std::wstring> conv(const std::initializer_list<char * > & in) + { + std::vector<std::wstring> 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<char, std::vector<std::wstring>> +{ + static std::vector<std::string> conv(const std::vector<std::wstring> & in) + { + std::vector<std::string> ret(in.size()); + std::transform(in.begin(), in.end(), ret.begin(), + [](const std::wstring & st) + { + return convert(st); + }); + return ret; + } +}; + +template<> +struct char_converter<char, std::initializer_list<std::wstring>> +{ + static std::vector<std::string> conv(const std::initializer_list<std::wstring> & in) + { + std::vector<std::string> ret(in.size()); + std::transform(in.begin(), in.end(), ret.begin(), + [](const std::wstring & st) + { + return convert(st); + }); + return ret; + } +}; + +template<> +struct char_converter<char, std::vector<wchar_t* >> +{ + static std::vector<std::string> conv(const std::vector<wchar_t* > & in) + { + std::vector<std::string> 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<char, std::initializer_list<wchar_t * >> +{ + static std::vector<std::string> conv(const std::initializer_list<wchar_t *> & in) + { + std::vector<std::string> 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_ */ |