summaryrefslogtreecommitdiff
path: root/boost/process/args.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/process/args.hpp')
-rw-r--r--boost/process/args.hpp279
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