edit
[c11concurrency-benchmarks.git] / iris / include / snprintf_formatter.h
1 #ifndef IRIS_SNPRINTF_FORMATTER_H_
2 #define IRIS_SNPRINTF_FORMATTER_H_
3
4 #include <cstdio>
5 #include <utility>
6
7 #include <assert.h>
8
9 #include "formatter.h"
10 #include "utils.h"
11 #include "define.h"
12 #include "buffered_writer.h"
13
14 namespace iris {
15 class snprintf_formatter {
16 public:
17
18 template<typename... Args>
19 static void format(buffered_writer * bw, const char * fmt, Args&&... args) {
20     size_t n;
21     while (true) {
22         n = std::snprintf(bw->write_pointer(), bw->freespace(), fmt, args...);
23         if (iris_unlikely(n < 0)) {
24             return;//skip over this formatting if error occurred
25         }
26         if (iris_unlikely(n >= bw->freespace())) {
27             bw->flush(); // flush buffer and retried
28             continue;
29         }
30         bw->inc_write_pointer(n);
31         assert(*bw->write_pointer() == 0);
32         *bw->write_pointer() = '\n';// replace '\0' with '\n'
33         bw->inc_write_pointer(1);
34         break; // TODO what to do with failed formatting?
35     }
36
37 }
38
39     
40 };
41 }
42 #endif