aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/process.cpp13
-rw-r--r--src/process_io.cpp115
-rw-r--r--src/stream.cpp48
3 files changed, 119 insertions, 57 deletions
diff --git a/src/process.cpp b/src/process.cpp
index 1e0a970..9fe19e5 100644
--- a/src/process.cpp
+++ b/src/process.cpp
@@ -6,6 +6,7 @@
#include <winapi/cmd_line.hpp>
#include <winapi/error.hpp>
#include <winapi/process.hpp>
+#include <winapi/process_io.hpp>
#include <winapi/resource.hpp>
#include <winapi/utf8.hpp>
@@ -26,7 +27,7 @@ namespace {
typedef std::vector<wchar_t> EscapedCommandLine;
-Handle create_process(EscapedCommandLine cmd_line, Process::IO& io) {
+Handle create_process(EscapedCommandLine cmd_line, process::IO& io) {
BOOST_STATIC_CONSTEXPR DWORD flags = /*CREATE_NO_WINDOW | */ CREATE_UNICODE_ENVIRONMENT;
STARTUPINFOW startup_info;
@@ -64,23 +65,17 @@ EscapedCommandLine escape_command_line(const CommandLine& cmd_line) {
return buffer;
}
-Handle create_process(const CommandLine& cmd_line, Process::IO& io) {
+Handle create_process(const CommandLine& cmd_line, process::IO& io) {
return create_process(escape_command_line(cmd_line), io);
}
} // namespace
-void Process::IO::close() {
- std_in.handle.close();
- std_out.handle.close();
- std_err.handle.close();
-}
-
Process Process::create(const CommandLine& cmd_line) {
return create(cmd_line, {});
}
-Process Process::create(const CommandLine& cmd_line, IO io) {
+Process Process::create(const CommandLine& cmd_line, process::IO io) {
return Process{create_process(cmd_line, io)};
}
diff --git a/src/process_io.cpp b/src/process_io.cpp
new file mode 100644
index 0000000..ec7dbc9
--- /dev/null
+++ b/src/process_io.cpp
@@ -0,0 +1,115 @@
+// Copyright (c) 2020 Egor Tensin <Egor.Tensin@gmail.com>
+// This file is part of the "winapi-common" project.
+// For details, see https://github.com/egor-tensin/winapi-common.
+// Distributed under the MIT License.
+
+#include <winapi/file.hpp>
+#include <winapi/handle.hpp>
+#include <winapi/path.hpp>
+#include <winapi/process_io.hpp>
+
+#include <boost/config.hpp>
+
+#include <string>
+#include <utility>
+
+namespace winapi {
+namespace process {
+
+Stdin::Stdin() : Stream{Handle::std_in()} {}
+
+Stdout::Stdout() : Stream{Handle::std_out()} {}
+
+Stderr::Stderr() : Stream{Handle::std_err()} {}
+
+Stdin::Stdin(const std::string& path) : Stream{File::open_r(path)} {}
+
+Stdin::Stdin(const CanonicalPath& path) : Stream{File::open_r(path)} {}
+
+Stdout::Stdout(const std::string& path) : Stream{File::open_w(path)} {}
+
+Stdout::Stdout(const CanonicalPath& path) : Stream{File::open_w(path)} {}
+
+Stderr::Stderr(const std::string& path) : Stream{File::open_w(path)} {}
+
+Stderr::Stderr(const CanonicalPath& path) : Stream{File::open_w(path)} {}
+
+Stdin::Stdin(Pipe& pipe) : Stream{std::move(pipe.read_end())} {
+ pipe.write_end().dont_inherit();
+}
+
+Stdout::Stdout(Pipe& pipe) : Stream{std::move(pipe.write_end())} {
+ pipe.read_end().dont_inherit();
+}
+
+Stderr::Stderr(Pipe& pipe) : Stream{std::move(pipe.write_end())} {
+ pipe.read_end().dont_inherit();
+}
+
+Stream::Stream(Stream&& other) BOOST_NOEXCEPT_OR_NOTHROW {
+ swap(other);
+}
+
+Stream& Stream::operator=(Stream other) BOOST_NOEXCEPT_OR_NOTHROW {
+ swap(other);
+ return *this;
+}
+
+void Stream::swap(Stream& other) BOOST_NOEXCEPT_OR_NOTHROW {
+ using std::swap;
+ swap(handle, other.handle);
+}
+
+void swap(Stream& a, Stream& b) BOOST_NOEXCEPT_OR_NOTHROW {
+ a.swap(b);
+}
+
+Stdin::Stdin(Stdin&& other) BOOST_NOEXCEPT_OR_NOTHROW : Stream{std::move(other)} {}
+
+Stdin& Stdin::operator=(Stdin other) BOOST_NOEXCEPT_OR_NOTHROW {
+ Stream::operator=(std::move(other));
+ return *this;
+}
+
+Stdout::Stdout(Stdout&& other) BOOST_NOEXCEPT_OR_NOTHROW : Stream{std::move(other)} {}
+
+Stdout& Stdout::operator=(Stdout other) BOOST_NOEXCEPT_OR_NOTHROW {
+ Stream::operator=(std::move(other));
+ return *this;
+}
+
+Stderr::Stderr(Stderr&& other) BOOST_NOEXCEPT_OR_NOTHROW : Stream{std::move(other)} {}
+
+Stderr& Stderr::operator=(Stderr other) BOOST_NOEXCEPT_OR_NOTHROW {
+ Stream::operator=(std::move(other));
+ return *this;
+}
+
+void IO::close() {
+ std_in.handle.close();
+ std_out.handle.close();
+ std_err.handle.close();
+}
+
+IO::IO(IO&& other) BOOST_NOEXCEPT_OR_NOTHROW {
+ swap(other);
+}
+
+IO& IO::operator=(IO other) BOOST_NOEXCEPT_OR_NOTHROW {
+ swap(other);
+ return *this;
+}
+
+void IO::swap(IO& other) BOOST_NOEXCEPT_OR_NOTHROW {
+ using std::swap;
+ swap(std_in, other.std_in);
+ swap(std_out, other.std_out);
+ swap(std_err, other.std_err);
+}
+
+void swap(IO& a, IO& b) BOOST_NOEXCEPT_OR_NOTHROW {
+ a.swap(b);
+}
+
+} // namespace process
+} // namespace winapi
diff --git a/src/stream.cpp b/src/stream.cpp
deleted file mode 100644
index 76dd5a5..0000000
--- a/src/stream.cpp
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright (c) 2020 Egor Tensin <Egor.Tensin@gmail.com>
-// This file is part of the "winapi-common" project.
-// For details, see https://github.com/egor-tensin/winapi-common.
-// Distributed under the MIT License.
-
-#include <winapi/file.hpp>
-#include <winapi/handle.hpp>
-#include <winapi/path.hpp>
-#include <winapi/stream.hpp>
-
-#include <string>
-#include <utility>
-
-namespace winapi {
-namespace process {
-
-Stdin::Stdin() : Stream{Handle::std_in()} {}
-
-Stdout::Stdout() : Stream{Handle::std_out()} {}
-
-Stderr::Stderr() : Stream{Handle::std_err()} {}
-
-Stdin::Stdin(const std::string& path) : Stream{File::open_r(path)} {}
-
-Stdin::Stdin(const CanonicalPath& path) : Stream{File::open_r(path)} {}
-
-Stdout::Stdout(const std::string& path) : Stream{File::open_w(path)} {}
-
-Stdout::Stdout(const CanonicalPath& path) : Stream{File::open_w(path)} {}
-
-Stderr::Stderr(const std::string& path) : Stream{File::open_w(path)} {}
-
-Stderr::Stderr(const CanonicalPath& path) : Stream{File::open_w(path)} {}
-
-Stdin::Stdin(Pipe& pipe) : Stream{std::move(pipe.read_end())} {
- pipe.write_end().dont_inherit();
-}
-
-Stdout::Stdout(Pipe& pipe) : Stream{std::move(pipe.write_end())} {
- pipe.read_end().dont_inherit();
-}
-
-Stderr::Stderr(Pipe& pipe) : Stream{std::move(pipe.write_end())} {
- pipe.read_end().dont_inherit();
-}
-
-} // namespace process
-} // namespace winapi