cepgen is hosted by Hepforge, IPPP Durham
CepGen N/A
Central exclusive processes event generator
Piper.h
Go to the documentation of this file.
1/*
2 * CepGen: a central exclusive processes event generator
3 * Copyright (C) 2022-2024 Laurent Forthomme
4 *
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
17 */
18
19#ifndef CepGen_Utils_Piper_h
20#define CepGen_Utils_Piper_h
21
22#include <memory>
23#include <string>
24#include <vector>
25
26namespace cepgen::utils {
28 class Piper {
29 public:
32 explicit Piper(const std::string& command) : file_(popen(command.c_str(), "w")) {}
33
35 struct Commands : std::vector<std::string> {
36 using std::vector<std::string>::vector;
38 inline Commands& operator+=(const std::vector<std::string>& oth) {
39 std::copy(oth.begin(), oth.end(), std::back_inserter(*this));
40 return *this;
41 }
43 inline Commands& operator+=(const std::string& str) {
44 emplace_back(str);
45 return *this;
46 }
48 inline friend std::ostream& operator<<(std::ostream& os, const Commands& cmds) {
49 std::string sep;
50 os << "{";
51 for (const auto& cmd : cmds)
52 os << sep << cmd, sep = "\n";
53 return os << "}";
54 }
55 };
57 inline const Piper& execute(const Commands& cmds) const {
58 for (const auto& cmd : cmds)
59 fputs((cmd + "\n").c_str(), file_.get());
60 return *this;
61 }
62
63 private:
64 struct FILEDeleter {
65 void operator()(FILE* file) const noexcept { pclose(file); }
66 };
67 const std::unique_ptr<FILE, FILEDeleter> file_;
68 };
69} // namespace cepgen::utils
70
71#endif
External command piping utility.
Definition Piper.h:28
const Piper & execute(const Commands &cmds) const
Execute a chain of commands.
Definition Piper.h:57
Piper(const std::string &command)
Start a piped command.
Definition Piper.h:32
Collection of utilities.
A collection of commands to pipe to the session.
Definition Piper.h:35
Commands & operator+=(const std::string &str)
Append a command at the end of the commands block.
Definition Piper.h:43
Commands & operator+=(const std::vector< std::string > &oth)
Append a set of commands to the end of the commands block.
Definition Piper.h:38
friend std::ostream & operator<<(std::ostream &os, const Commands &cmds)
Commands printout utility.
Definition Piper.h:48