1/*
2 * Copyright (C) 2012 Apple Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 *    notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 *    notice, this list of conditions and the following disclaimer in the
11 *    documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26#ifndef DataLog_h
27#define DataLog_h
28
29#include "wtf/Assertions.h"
30#include "wtf/FilePrintStream.h"
31
32#include <stdarg.h>
33#include <stdio.h>
34
35namespace WTF {
36
37FilePrintStream& dataFile();
38
39void dataLogFV(const char* format, va_list) WTF_ATTRIBUTE_PRINTF(1, 0);
40void dataLogF(const char* format, ...) WTF_ATTRIBUTE_PRINTF(1, 2);
41void dataLogFString(const char*);
42
43template<typename T>
44void dataLog(const T& value)
45{
46    dataFile().print(value);
47}
48
49template<typename T1, typename T2>
50void dataLog(const T1& value1, const T2& value2)
51{
52    dataFile().print(value1, value2);
53}
54
55template<typename T1, typename T2, typename T3>
56void dataLog(const T1& value1, const T2& value2, const T3& value3)
57{
58    dataFile().print(value1, value2, value3);
59}
60
61template<typename T1, typename T2, typename T3, typename T4>
62void dataLog(const T1& value1, const T2& value2, const T3& value3, const T4& value4)
63{
64    dataFile().print(value1, value2, value3, value4);
65}
66
67template<typename T1, typename T2, typename T3, typename T4, typename T5>
68void dataLog(const T1& value1, const T2& value2, const T3& value3, const T4& value4, const T5& value5)
69{
70    dataFile().print(value1, value2, value3, value4, value5);
71}
72
73template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
74void dataLog(const T1& value1, const T2& value2, const T3& value3, const T4& value4, const T5& value5, const T6& value6)
75{
76    dataFile().print(value1, value2, value3, value4, value5, value6);
77}
78
79template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
80void dataLog(const T1& value1, const T2& value2, const T3& value3, const T4& value4, const T5& value5, const T6& value6, const T7& value7)
81{
82    dataFile().print(value1, value2, value3, value4, value5, value6, value7);
83}
84
85template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
86void dataLog(const T1& value1, const T2& value2, const T3& value3, const T4& value4, const T5& value5, const T6& value6, const T7& value7, const T8& value8)
87{
88    dataFile().print(value1, value2, value3, value4, value5, value6, value7, value8);
89}
90
91template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
92void dataLog(const T1& value1, const T2& value2, const T3& value3, const T4& value4, const T5& value5, const T6& value6, const T7& value7, const T8& value8, const T9& value9)
93{
94    dataFile().print(value1, value2, value3, value4, value5, value6, value7, value8, value9);
95}
96
97template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10>
98void dataLog(const T1& value1, const T2& value2, const T3& value3, const T4& value4, const T5& value5, const T6& value6, const T7& value7, const T8& value8, const T9& value9, const T10& value10)
99{
100    dataFile().print(value1, value2, value3, value4, value5, value6, value7, value8, value9, value10);
101}
102
103template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11>
104void dataLog(const T1& value1, const T2& value2, const T3& value3, const T4& value4, const T5& value5, const T6& value6, const T7& value7, const T8& value8, const T9& value9, const T10& value10, const T11& value11)
105{
106    dataFile().print(value1, value2, value3, value4, value5, value6, value7, value8, value9, value10, value11);
107}
108
109template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12>
110void dataLog(const T1& value1, const T2& value2, const T3& value3, const T4& value4, const T5& value5, const T6& value6, const T7& value7, const T8& value8, const T9& value9, const T10& value10, const T11& value11, const T12& value12)
111{
112    dataFile().print(value1, value2, value3, value4, value5, value6, value7, value8, value9, value10, value11, value12);
113}
114
115template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13>
116void dataLog(const T1& value1, const T2& value2, const T3& value3, const T4& value4, const T5& value5, const T6& value6, const T7& value7, const T8& value8, const T9& value9, const T10& value10, const T11& value11, const T12& value12, const T13& value13)
117{
118    dataFile().print(value1, value2, value3, value4, value5, value6, value7, value8, value9, value10, value11, value12, value13);
119}
120
121} // namespace WTF
122
123using WTF::dataLog;
124using WTF::dataLogF;
125using WTF::dataLogFString;
126
127#endif // DataLog_h
128
129