1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- #pragma once
- #include <reproc++/detail/array.hpp>
- #include <reproc++/detail/type_traits.hpp>
- namespace reproc {
- class arguments : public detail::array {
- public:
- arguments(const char *const *argv) // NOLINT
- : detail::array(argv, false)
- {}
- /*!
- `Arguments` must be iterable as a sequence of strings. Examples of types that
- satisfy this requirement are `std::vector<std::string>` and
- `std::array<std::string>`.
- `arguments` has the same restrictions as `argv` in `reproc_start` except
- that it should not end with `NULL` (`start` allocates a new array which
- includes the missing `NULL` value).
- */
- template <typename Arguments,
- typename = detail::enable_if_not_char_array<Arguments>>
- arguments(const Arguments &arguments) // NOLINT
- : detail::array(from(arguments), true)
- {}
- private:
- template <typename Arguments>
- static const char *const *from(const Arguments &arguments);
- };
- template <typename Arguments>
- const char *const *arguments::from(const Arguments &arguments)
- {
- using size_type = typename Arguments::value_type::size_type;
- const char **argv = new const char *[arguments.size() + 1];
- std::size_t current = 0;
- for (const auto &argument : arguments) {
- char *string = new char[argument.size() + 1];
- argv[current++] = string;
- for (size_type i = 0; i < argument.size(); i++) {
- *string++ = argument[i];
- }
- *string = '\0';
- }
- argv[current] = nullptr;
- return argv;
- }
- }
|