Line data Source code
1 0 : // Distributed under the MIT License.
2 : // See LICENSE.txt for details.
3 :
4 : #pragma once
5 :
6 : #include <ostream>
7 : #include <sstream>
8 : #include <string>
9 :
10 : #include "Utilities/StlStreamDeclarations.hpp"
11 :
12 : /*!
13 : * \ingroup UtilitiesGroup
14 : * \brief Make a string by streaming into object.
15 : *
16 : * \snippet Test_MakeString.cpp make_string
17 : */
18 1 : class MakeString {
19 : public:
20 0 : MakeString() = default;
21 0 : MakeString(const MakeString&) = delete;
22 0 : MakeString& operator=(const MakeString&) = delete;
23 0 : MakeString(MakeString&&) = default;
24 0 : MakeString& operator=(MakeString&&) = delete;
25 0 : ~MakeString() = default;
26 :
27 : // NOLINTNEXTLINE(google-explicit-constructor)
28 : operator std::string() const { return stream_.str(); }
29 :
30 : template <class T>
31 0 : friend MakeString operator<<(MakeString&& ms, const T& t) {
32 : // clang-tidy: can get unintentional pointer casts
33 : ms.stream_ << t; // NOLINT
34 : return std::move(ms);
35 : }
36 :
37 : template <class T>
38 0 : friend MakeString& operator<<(MakeString& ms, const T& t) {
39 : // clang-tidy: can get unintentional pointer casts
40 : ms.stream_ << t; // NOLINT
41 : return ms;
42 : }
43 :
44 : private:
45 0 : std::stringstream stream_{};
46 : };
47 :
48 0 : inline std::ostream& operator<<(std::ostream& os, const MakeString& t) {
49 : return os << std::string{t};
50 : }
|