280 lines
		
	
	
		
			8.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
		
		
			
		
	
	
			280 lines
		
	
	
		
			8.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| 
								 | 
							
								// Copyright (c) 2006, 2007 Julio M. Merino Vidal
							 | 
						||
| 
								 | 
							
								// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
							 | 
						||
| 
								 | 
							
								// Copyright (c) 2009 Boris Schaeling
							 | 
						||
| 
								 | 
							
								// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
							 | 
						||
| 
								 | 
							
								// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
							 | 
						||
| 
								 | 
							
								// 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_ARGS_HPP
							 | 
						||
| 
								 | 
							
								#define BOOST_PROCESS_ARGS_HPP
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** \file boost/process/args.hpp
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 *    This header provides the \xmlonly <globalname alt="boost::process::args">args</globalname>\endxmlonly property. It also provides the
							 | 
						||
| 
								 | 
							
								 *    alternative name \xmlonly <globalname alt="boost::process::argv">argv</globalname>\endxmlonly .
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								\xmlonly
							 | 
						||
| 
								 | 
							
								<programlisting>
							 | 
						||
| 
								 | 
							
								namespace boost {
							 | 
						||
| 
								 | 
							
								  namespace process {
							 | 
						||
| 
								 | 
							
								    <emphasis>unspecified</emphasis> <globalname alt="boost::process::args">args</globalname>;
							 | 
						||
| 
								 | 
							
								    <emphasis>unspecified</emphasis> <globalname alt="boost::process::argv">argv</globalname>;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								</programlisting>
							 | 
						||
| 
								 | 
							
								\endxmlonly
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <boost/process/detail/basic_cmd.hpp>
							 | 
						||
| 
								 | 
							
								#include <iterator>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace boost { namespace process { namespace detail {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								struct args_
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    template<typename T>
							 | 
						||
| 
								 | 
							
								    using remove_reference_t = typename std::remove_reference<T>::type;
							 | 
						||
| 
								 | 
							
								    template<typename T>
							 | 
						||
| 
								 | 
							
								    using value_type = typename remove_reference_t<T>::value_type;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    template<typename T>
							 | 
						||
| 
								 | 
							
								    using vvalue_type = value_type<value_type<T>>;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    template <class Range>
							 | 
						||
| 
								 | 
							
								    arg_setter_<vvalue_type<Range>, true>     operator()(Range &&range) const
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return arg_setter_<vvalue_type<Range>, true>(std::forward<Range>(range));
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    template <class Range>
							 | 
						||
| 
								 | 
							
								    arg_setter_<vvalue_type<Range>, true>     operator+=(Range &&range) const
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return arg_setter_<vvalue_type<Range>, true>(std::forward<Range>(range));
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    template <class Range>
							 | 
						||
| 
								 | 
							
								    arg_setter_<vvalue_type<Range>, false>    operator= (Range &&range) const
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return arg_setter_<vvalue_type<Range>, false>(std::forward<Range>(range));
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    template<typename Char>
							 | 
						||
| 
								 | 
							
								    arg_setter_<Char, true>     operator()(std::basic_string<Char> && str) const
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return arg_setter_<Char, true> (str);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    template<typename Char>
							 | 
						||
| 
								 | 
							
								    arg_setter_<Char, true>     operator+=(std::basic_string<Char> && str) const
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return arg_setter_<Char, true> (str);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    template<typename Char>
							 | 
						||
| 
								 | 
							
								    arg_setter_<Char, false>    operator= (std::basic_string<Char> && str) const
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return arg_setter_<Char, false>(str);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    template<typename Char>
							 | 
						||
| 
								 | 
							
								    arg_setter_<Char, true>     operator()(const std::basic_string<Char> & str) const
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return arg_setter_<Char, true> (str);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    template<typename Char>
							 | 
						||
| 
								 | 
							
								    arg_setter_<Char, true>     operator+=(const std::basic_string<Char> & str) const
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return arg_setter_<Char, true> (str);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    template<typename Char>
							 | 
						||
| 
								 | 
							
								    arg_setter_<Char, false>    operator= (const std::basic_string<Char> & str) const
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return arg_setter_<Char, false>(str);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    template<typename Char>
							 | 
						||
| 
								 | 
							
								    arg_setter_<Char, true>     operator()(std::basic_string<Char> & str) const
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return arg_setter_<Char, true> (str);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    template<typename Char>
							 | 
						||
| 
								 | 
							
								    arg_setter_<Char, true>     operator+=(std::basic_string<Char> & str) const
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return arg_setter_<Char, true> (str);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    template<typename Char>
							 | 
						||
| 
								 | 
							
								    arg_setter_<Char, false>    operator= (std::basic_string<Char> & str) const
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return arg_setter_<Char, false>(str);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    template<typename Char>
							 | 
						||
| 
								 | 
							
								    arg_setter_<Char, true>     operator()(const Char* str) const
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return arg_setter_<Char, true> (str);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    template<typename Char>
							 | 
						||
| 
								 | 
							
								    arg_setter_<Char, true>     operator+=(const Char* str) const
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return arg_setter_<Char, true> (str);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    template<typename Char>
							 | 
						||
| 
								 | 
							
								    arg_setter_<Char, false>    operator= (const Char* str) const
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return arg_setter_<Char, false>(str);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								//    template<typename Char, std::size_t Size>
							 | 
						||
| 
								 | 
							
								//    arg_setter_<Char, true>     operator()(const Char (&str) [Size]) const
							 | 
						||
| 
								 | 
							
								//    {
							 | 
						||
| 
								 | 
							
								//        return arg_setter_<Char, true> (str);
							 | 
						||
| 
								 | 
							
								//    }
							 | 
						||
| 
								 | 
							
								//    template<typename Char, std::size_t Size>
							 | 
						||
| 
								 | 
							
								//    arg_setter_<Char, true>     operator+=(const Char (&str) [Size]) const
							 | 
						||
| 
								 | 
							
								//    {
							 | 
						||
| 
								 | 
							
								//        return arg_setter_<Char, true> (str);
							 | 
						||
| 
								 | 
							
								//    }
							 | 
						||
| 
								 | 
							
								//    template<typename Char, std::size_t Size>
							 | 
						||
| 
								 | 
							
								//    arg_setter_<Char, false>    operator= (const Char (&str) [Size]) const
							 | 
						||
| 
								 | 
							
								//    {
							 | 
						||
| 
								 | 
							
								//        return arg_setter_<Char, false>(str);
							 | 
						||
| 
								 | 
							
								//    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    arg_setter_<char, true> operator()(std::initializer_list<const char*> &&range) const
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return arg_setter_<char, true>(range.begin(), range.end());
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    arg_setter_<char, true> operator+=(std::initializer_list<const char*> &&range) const
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return arg_setter_<char, true>(range.begin(), range.end());
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    arg_setter_<char, false> operator= (std::initializer_list<const char*> &&range) const
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return arg_setter_<char, false>(range.begin(), range.end());
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    arg_setter_<char, true> operator()(std::initializer_list<std::string> &&range) const
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return arg_setter_<char, true>(range.begin(), range.end());
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    arg_setter_<char, true> operator+=(std::initializer_list<std::string> &&range) const
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return arg_setter_<char, true>(range.begin(), range.end());
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    arg_setter_<char, false> operator= (std::initializer_list<std::string> &&range) const
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return arg_setter_<char, false>(range.begin(), range.end());
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    arg_setter_<wchar_t, true> operator()(std::initializer_list<const wchar_t*> &&range) const
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return arg_setter_<wchar_t, true>(range.begin(), range.end());
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    arg_setter_<wchar_t, true> operator+=(std::initializer_list<const wchar_t*> &&range) const
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return arg_setter_<wchar_t, true>(range.begin(), range.end());
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    arg_setter_<wchar_t, false> operator= (std::initializer_list<const wchar_t*> &&range) const
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return arg_setter_<wchar_t, false>(range.begin(), range.end());
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    arg_setter_<wchar_t, true> operator()(std::initializer_list<std::wstring> &&range) const
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return arg_setter_<wchar_t, true>(range.begin(), range.end());
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    arg_setter_<wchar_t, true> operator+=(std::initializer_list<std::wstring> &&range) const
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return arg_setter_<wchar_t, true>(range.begin(), range.end());
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    arg_setter_<wchar_t, false> operator= (std::initializer_list<std::wstring> &&range) const
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return arg_setter_<wchar_t, false>(range.begin(), range.end());
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The `args` property allows to explicitly set arguments for the execution. The
							 | 
						||
| 
								 | 
							
								name of the executable will always be the first element in the arg-vector.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								\section args_details Details
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								\subsection args_operations Operations
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								\subsubsection args_set_var Setting values
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								To set a the argument vector the following syntax can be used.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								\code{.cpp}
							 | 
						||
| 
								 | 
							
								args = value;
							 | 
						||
| 
								 | 
							
								args(value);
							 | 
						||
| 
								 | 
							
								\endcode
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								`std::initializer_list` is among the allowed types, so the following syntax is also possible.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								\code{.cpp}
							 | 
						||
| 
								 | 
							
								args = {value1, value2};
							 | 
						||
| 
								 | 
							
								args({value1, value2});
							 | 
						||
| 
								 | 
							
								\endcode
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Below the possible types for `value` are listed, with `char_type` being either `char` or `wchar_t`.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								\paragraph args_set_var_value value
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								 - `std::basic_string<char_type>`
							 | 
						||
| 
								 | 
							
								 - `const char_type * `
							 | 
						||
| 
								 | 
							
								 - `std::initializer_list<const char_type *>`
							 | 
						||
| 
								 | 
							
								 - `std::vector<std::basic_string<char_type>>`
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Additionally any range of `std::basic_string<char_type>` can be passed.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								\subsubsection args_append_var Appending values
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								To append a the argument vector the following syntax can be used.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								\code{.cpp}
							 | 
						||
| 
								 | 
							
								args += value;
							 | 
						||
| 
								 | 
							
								\endcode
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								`std::initializer_list` is among the allowed types, so the following syntax is also possible.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								\code{.cpp}
							 | 
						||
| 
								 | 
							
								args += {value1, value2};
							 | 
						||
| 
								 | 
							
								\endcode
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Below the possible types for `value` are listed, with `char_type` being either `char` or `wchar_t`.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								\paragraph args_append_var_value value
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								 - `std::basic_string<char_type>`
							 | 
						||
| 
								 | 
							
								 - `const char_type * `
							 | 
						||
| 
								 | 
							
								 - `std::initializer_list<const char_type *>`
							 | 
						||
| 
								 | 
							
								 - `std::vector<std::basic_string<char_type>>`
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Additionally any range of `std::basic_string<char_type>` can be passed.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								\subsection args_example Example
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The overload form is used when more than one string is passed, from the second one forward.
							 | 
						||
| 
								 | 
							
								I.e. the following expressions have the same results:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								\code{.cpp}
							 | 
						||
| 
								 | 
							
								spawn("gcc", "--version");
							 | 
						||
| 
								 | 
							
								spawn("gcc", args ="--version");
							 | 
						||
| 
								 | 
							
								spawn("gcc", args+="--version");
							 | 
						||
| 
								 | 
							
								spawn("gcc", args ={"--version"});
							 | 
						||
| 
								 | 
							
								spawn("gcc", args+={"--version"});
							 | 
						||
| 
								 | 
							
								\endcode
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								\note A string will be parsed and set in quotes if it has none and contains spaces.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								constexpr boost::process::detail::args_ args{};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								///Alias for \xmlonly <globalname alt="boost::process::args">args</globalname> \endxmlonly .
							 | 
						||
| 
								 | 
							
								constexpr boost::process::detail::args_ argv{};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								}}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif
							 |