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
 |