7e996a331d85aaa33457e84164224372dad90c15
[WebKit-https.git] / Source / WTF / wtf / ListDump.h
1 /*
2  * Copyright (C) 2013 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 ListDump_h
27 #define ListDump_h
28
29 #include "CommaPrinter.h"
30 #include "PrintStream.h"
31 #include "StringPrintStream.h"
32
33 namespace WTF {
34
35 template<typename T>
36 class ListDump {
37 public:
38     ListDump(const T& list, const char* comma)
39         : m_list(list)
40         , m_comma(comma)
41     {
42     }
43     
44     void dump(PrintStream& out) const
45     {
46         for (typename T::const_iterator iter = m_list.begin(); iter != m_list.end(); ++iter)
47             out.print(m_comma, *iter);
48     }
49
50 private:
51     const T& m_list;
52     CommaPrinter m_comma;
53 };
54
55 template<typename T>
56 class MapDump {
57 public:
58     MapDump(const T& map, const char* arrow, const char* comma)
59         : m_map(map)
60         , m_arrow(arrow)
61         , m_comma(comma)
62     {
63     }
64     
65     void dump(PrintStream& out) const
66     {
67         for (typename T::const_iterator iter = m_map.begin(); iter != m_map.end(); ++iter)
68             out.print(m_comma, iter->key, m_arrow, iter->value);
69     }
70     
71 private:
72     const T& m_map;
73     const char* m_arrow;
74     CommaPrinter m_comma;
75 };
76
77 template<typename T>
78 ListDump<T> listDump(const T& list, const char* comma = ", ")
79 {
80     return ListDump<T>(list, comma);
81 }
82
83 template<typename T, typename Comparator>
84 CString sortedListDump(const T& list, const Comparator& comparator, const char* comma = ", ")
85 {
86     Vector<typename T::ValueType> myList;
87     myList.appendRange(list.begin(), list.end());
88     std::sort(myList.begin(), myList.end(), comparator);
89     StringPrintStream out;
90     CommaPrinter commaPrinter(comma);
91     for (unsigned i = 0; i < myList.size(); ++i)
92         out.print(commaPrinter, myList[i]);
93     return out.toCString();
94 }
95
96 template<typename T>
97 CString sortedListDump(const T& list, const char* comma = ", ")
98 {
99     return sortedListDump(list, std::less<typename T::ValueType>(), comma);
100 }
101
102 template<typename T>
103 MapDump<T> mapDump(const T& map, const char* arrow = "=>", const char* comma = ", ")
104 {
105     return MapDump<T>(map, arrow, comma);
106 }
107
108 template<typename T, typename Comparator>
109 CString sortedMapDump(const T& map, const Comparator& comparator, const char* arrow = "=>", const char* comma = ", ")
110 {
111     Vector<typename T::KeyType> keys;
112     for (typename T::const_iterator iter = map.begin(); iter != map.end(); ++iter)
113         keys.append(iter->key);
114     std::sort(keys.begin(), keys.end(), comparator);
115     StringPrintStream out;
116     CommaPrinter commaPrinter(comma);
117     for (unsigned i = 0; i < keys.size(); ++i)
118         out.print(commaPrinter, keys[i], arrow, map.get(keys[i]));
119     return out.toCString();
120 }
121
122 } // namespace WTF
123
124 using WTF::listDump;
125 using WTF::sortedListDump;
126 using WTF::mapDump;
127 using WTF::sortedMapDump;
128
129 #endif // ListDump_h
130