update readme
[c11concurrency-benchmarks.git] / iris / include / formatter.h
1 #ifndef IRIS_FORMATTER_H_
2 #define IRIS_FORMATTER_H_
3 #include "define.h"
4 #include "buffered_writer.h"
5 #include "utils.h"
6
7 namespace iris {
8 // fomatter do the real formatting logic, output into @obuf
9 // return false if there is not enough space in @obuf.
10 typedef void (*formatter_type)(const loglet_t & l, buffered_writer & w);
11
12 template<typename Formatter, typename...Args, std::size_t...Indexes>
13 static void call_format(buffered_writer & w, const std::tuple<Args...> & args, seq<Indexes...>) {
14     return Formatter::format(&w, std::move(std::get<Indexes>(args))...);
15 }
16
17 template<typename Formatter, typename... Args>
18 static void formatter_caller(const loglet_t & l, buffered_writer & w) {
19     const size_t args_offset = sizeof(formatter_type);
20
21     typedef std::tuple<Args...> Args_t;
22     Args_t & args = *reinterpret_cast<Args_t*>(l.rbuf_ptr + args_offset);
23     typename make_sequence<sizeof...(Args)>::type indexes;
24     call_format<Formatter>(w, args, indexes);
25     //deconstruct parameter pack
26     args.~Args_t();
27 }
28
29 }
30 #endif