277 lines
7.3 KiB
C++
277 lines
7.3 KiB
C++
// 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 <algorithm>
|
|
|
|
#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::process::filesystem::path> : std::is_same<typename boost::process::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_ */
|