1 // Copyright (c) 2016 Klemens D. Morgenstern
3 // Distributed under the Boost Software License, Version 1.0. (See accompanying
4 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7 #ifndef BOOST_PROCESS_DETAIL_BASIC_CMD_HPP_
8 #define BOOST_PROCESS_DETAIL_BASIC_CMD_HPP_
10 #include <boost/process/detail/config.hpp>
12 #include <boost/process/detail/handler_base.hpp>
13 #include <boost/process/detail/traits/cmd_or_exe.hpp>
14 #include <boost/process/detail/traits/wchar_t.hpp>
16 #if defined( BOOST_WINDOWS_API )
17 #include <boost/process/detail/windows/basic_cmd.hpp>
18 #include <boost/process/detail/windows/cmd.hpp>
19 #elif defined( BOOST_POSIX_API )
20 #include <boost/process/detail/posix/basic_cmd.hpp>
21 #include <boost/process/detail/posix/cmd.hpp>
24 #include <boost/process/shell.hpp>
29 namespace boost { namespace process { namespace detail {
31 template<typename Char>
34 typedef Char value_type;
35 typedef std::basic_string<Char> string_type;
38 exe_setter_(string_type && str) : exe_(std::move(str)) {}
39 exe_setter_(const string_type & str) : exe_(str) {}
42 template<> struct is_wchar_t<exe_setter_<wchar_t>> : std::true_type {};
46 struct char_converter<char, exe_setter_<wchar_t>>
48 static exe_setter_<char> conv(const exe_setter_<wchar_t> & in)
50 return {::boost::process::detail::convert(in.exe_)};
55 struct char_converter<wchar_t, exe_setter_<char>>
57 static exe_setter_<wchar_t> conv(const exe_setter_<char> & in)
59 return {::boost::process::detail::convert(in.exe_)};
65 template <typename Char, bool Append >
68 using value_type = Char;
69 using string_type = std::basic_string<value_type>;
70 std::vector<string_type> _args;
72 typedef typename std::vector<string_type>::iterator iterator;
73 typedef typename std::vector<string_type>::const_iterator const_iterator;
75 template<typename Iterator>
76 arg_setter_(Iterator && begin, Iterator && end) : _args(begin, end) {}
78 template<typename Range>
79 arg_setter_(Range && str) :
80 _args(std::begin(str),
83 iterator begin() {return _args.begin();}
84 iterator end() {return _args.end();}
85 const_iterator begin() const {return _args.begin();}
86 const_iterator end() const {return _args.end();}
87 arg_setter_(string_type & str) : _args{{str}} {}
88 arg_setter_(string_type && s) : _args({std::move(s)}) {}
89 arg_setter_(const string_type & s) : _args({s}) {}
90 arg_setter_(const value_type* s) : _args({std::move(s)}) {}
92 template<std::size_t Size>
93 arg_setter_(const value_type (&s) [Size]) : _args({s}) {}
96 template<> struct is_wchar_t<arg_setter_<wchar_t, true >> : std::true_type {};
97 template<> struct is_wchar_t<arg_setter_<wchar_t, false>> : std::true_type {};
100 struct char_converter<char, arg_setter_<wchar_t, true>>
102 static arg_setter_<char, true> conv(const arg_setter_<wchar_t, true> & in)
104 std::vector<std::string> vec(in._args.size());
105 std::transform(in._args.begin(), in._args.end(), vec.begin(),
106 [](const std::wstring & ws)
108 return ::boost::process::detail::convert(ws);
115 struct char_converter<wchar_t, arg_setter_<char, true>>
117 static arg_setter_<wchar_t, true> conv(const arg_setter_<char, true> & in)
119 std::vector<std::wstring> vec(in._args.size());
120 std::transform(in._args.begin(), in._args.end(), vec.begin(),
121 [](const std::string & ws)
123 return ::boost::process::detail::convert(ws);
131 struct char_converter<char, arg_setter_<wchar_t, false>>
133 static arg_setter_<char, false> conv(const arg_setter_<wchar_t, false> & in)
135 std::vector<std::string> vec(in._args.size());
136 std::transform(in._args.begin(), in._args.end(), vec.begin(),
137 [](const std::wstring & ws)
139 return ::boost::process::detail::convert(ws);
145 struct char_converter<wchar_t, arg_setter_<char, false>>
147 static arg_setter_<wchar_t, false> conv(const arg_setter_<char, false> & in)
149 std::vector<std::wstring> vec(in._args.size());
150 std::transform(in._args.begin(), in._args.end(), vec.begin(),
151 [](const std::string & ws)
153 return ::boost::process::detail::convert(ws);
159 using api::exe_cmd_init;
161 template<typename Char>
164 //set by path, because that will not be interpreted as a cmd
165 bool not_cmd = false;
167 using string_type = std::basic_string<Char>;
169 std::vector<string_type> args;
171 void operator()(const boost::filesystem::path & data)
177 args.push_back(data.native());
180 void operator()(const string_type & data)
185 args.push_back(data);
187 void operator()(const Char* data)
192 args.push_back(data);
194 void operator()(shell_) {shell = true;}
195 void operator()(std::vector<string_type> && data)
200 auto itr = std::make_move_iterator(data.begin());
201 auto end = std::make_move_iterator(data.end());
208 args.insert(args.end(), itr, end);
211 void operator()(const std::vector<string_type> & data)
216 auto itr = data.begin();
217 auto end = data.end();
224 args.insert(args.end(), itr, end);
226 void operator()(exe_setter_<Char> && data)
229 exe = std::move(data.exe_);
231 void operator()(const exe_setter_<Char> & data)
236 void operator()(arg_setter_<Char, false> && data)
239 std::make_move_iterator(data._args.begin()),
240 std::make_move_iterator(data._args.end()));
242 void operator()(arg_setter_<Char, true> && data)
244 args.insert(args.end(),
245 std::make_move_iterator(data._args.begin()),
246 std::make_move_iterator(data._args.end()));
248 void operator()(const arg_setter_<Char, false> & data)
250 args.assign(data._args.begin(), data._args.end());
252 void operator()(const arg_setter_<Char, true> & data)
254 args.insert(args.end(), data._args.begin(), data._args.end());
257 api::exe_cmd_init<Char> get_initializer()
259 if (not_cmd || !args.empty())
262 return api::exe_cmd_init<Char>::exe_args_shell(std::move(exe), std::move(args));
264 return api::exe_cmd_init<Char>::exe_args(std::move(exe), std::move(args));
268 return api::exe_cmd_init<Char>::cmd_shell(std::move(exe));
270 return api::exe_cmd_init<Char>::cmd(std::move(exe));
273 typedef api::exe_cmd_init<Char> result_type;
277 struct initializer_builder<cmd_or_exe_tag<char>>
279 typedef exe_builder<char> type;
283 struct initializer_builder<cmd_or_exe_tag<wchar_t>>
285 typedef exe_builder<wchar_t> type;
292 #endif /* BOOST_PROCESS_DETAIL_EXE_BUILDER_HPP_ */