adding iris benchmark
[c11concurrency-benchmarks.git] / iris / include / formatter.h
diff --git a/iris/include/formatter.h b/iris/include/formatter.h
new file mode 100644 (file)
index 0000000..198a274
--- /dev/null
@@ -0,0 +1,30 @@
+#ifndef IRIS_FORMATTER_H_
+#define IRIS_FORMATTER_H_
+#include "define.h"
+#include "buffered_writer.h"
+#include "utils.h"
+
+namespace iris {
+// fomatter do the real formatting logic, output into @obuf
+// return false if there is not enough space in @obuf.
+typedef void (*formatter_type)(const loglet_t & l, buffered_writer & w);
+
+template<typename Formatter, typename...Args, std::size_t...Indexes>
+static void call_format(buffered_writer & w, const std::tuple<Args...> & args, seq<Indexes...>) {
+    return Formatter::format(&w, std::move(std::get<Indexes>(args))...);
+}
+
+template<typename Formatter, typename... Args>
+static void formatter_caller(const loglet_t & l, buffered_writer & w) {
+    const size_t args_offset = sizeof(formatter_type);
+
+    typedef std::tuple<Args...> Args_t;
+    Args_t & args = *reinterpret_cast<Args_t*>(l.rbuf_ptr + args_offset);
+    typename make_sequence<sizeof...(Args)>::type indexes;
+    call_format<Formatter>(w, args, indexes);
+    //deconstruct parameter pack
+    args.~Args_t();
+}
+
+}
+#endif
\ No newline at end of file