Tinker9 70bd052 (Thu Nov 9 12:11:35 2023 -0800)
Loading...
Searching...
No Matches
ioprint.h
1#pragma once
2#include <sstream>
3#include <vector>
4
5namespace tinker {
6inline namespace v1 {
7template <class T>
8const T& formatForward(const T& t)
9{
10 return t;
11}
12
13inline const char* formatForward(const std::string& s)
14{
15 return s.c_str();
16}
17}
18
24template <class F, class... Ts>
25void print(std::FILE* out, const F& f, Ts&&... args)
26{
27 std::fprintf(out, formatForward(f), formatForward(args)...);
28}
29
34template <class F>
35void print(std::FILE* out, const F& f)
36{
37 std::fprintf(out, "%s", formatForward(f));
38}
39
45template <class F, class... Ts>
46std::string format(const F& f, Ts&&... args)
47{
48 const char* fmt = formatForward(f);
49 size_t l = std::snprintf(nullptr, 0, fmt, formatForward(args)...);
50 size_t sz = l + 1;
51 const int len = 128;
52 if (sz <= len) {
53 char buf[len];
54 std::snprintf(buf, sz, fmt, formatForward(args)...);
55 return std::string(buf, buf + l);
56 } else {
57 std::vector<char> ptr(sz);
58 char* buf = ptr.data();
59 std::snprintf(buf, sz, fmt, formatForward(args)...);
60 return std::string(buf, buf + l);
61 }
62}
63
66inline std::string operator*(size_t k, std::string str)
67{
68 std::ostringstream oss;
69 for (size_t i = 0; i < k; ++i) {
70 oss << str;
71 }
72 return oss.str();
73}
74
77inline std::string operator*(std::string str, size_t k)
78{
79 return k * str;
80}
81
84inline std::string operator""_s(const char* s, size_t len)
85{
86 return std::string(s, len);
87}
88}
std::string format(const F &f, Ts &&... args)
Writes the formatted output to an std::string object.
Definition: ioprint.h:46
void print(std::FILE *out, const F &f, Ts &&... args)
Formatted output.
Definition: ioprint.h:25
__device__ real3 operator*(real a, real3 b)
Definition: realn.h:46
const T & formatForward(const T &t)
Definition: ioprint.h:8
Definition: testrt.h:9