diff options
Diffstat (limited to 'boost/process/args.hpp')
-rw-r--r-- | boost/process/args.hpp | 279 |
1 files changed, 279 insertions, 0 deletions
diff --git a/boost/process/args.hpp b/boost/process/args.hpp new file mode 100644 index 0000000000..af677cfd82 --- /dev/null +++ b/boost/process/args.hpp @@ -0,0 +1,279 @@ +// 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>(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, true>(range.begin(), range.end()); + } + arg_setter_<char, true> operator()(std::initializer_list<std::string> &&range) const + { + return arg_setter_<char>(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, true>(range.begin(), range.end()); + } + + arg_setter_<wchar_t, true> operator()(std::initializer_list<const wchar_t*> &&range) const + { + return arg_setter_<wchar_t>(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, true>(range.begin(), range.end()); + } + arg_setter_<wchar_t, true> operator()(std::initializer_list<std::wstring> &&range) const + { + return arg_setter_<wchar_t>(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, true>(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 |