1*3ac0a46fSAndroid Build Coastguard Worker // Copyright 2020 The PDFium Authors
2*3ac0a46fSAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*3ac0a46fSAndroid Build Coastguard Worker // found in the LICENSE file.
4*3ac0a46fSAndroid Build Coastguard Worker
5*3ac0a46fSAndroid Build Coastguard Worker #ifndef FXJS_GC_CONTAINER_TRACE_H_
6*3ac0a46fSAndroid Build Coastguard Worker #define FXJS_GC_CONTAINER_TRACE_H_
7*3ac0a46fSAndroid Build Coastguard Worker
8*3ac0a46fSAndroid Build Coastguard Worker #include <list>
9*3ac0a46fSAndroid Build Coastguard Worker #include <map>
10*3ac0a46fSAndroid Build Coastguard Worker #include <set>
11*3ac0a46fSAndroid Build Coastguard Worker #include <vector>
12*3ac0a46fSAndroid Build Coastguard Worker
13*3ac0a46fSAndroid Build Coastguard Worker #include "v8/include/cppgc/member.h"
14*3ac0a46fSAndroid Build Coastguard Worker #include "v8/include/cppgc/visitor.h"
15*3ac0a46fSAndroid Build Coastguard Worker
16*3ac0a46fSAndroid Build Coastguard Worker namespace fxgc {
17*3ac0a46fSAndroid Build Coastguard Worker
18*3ac0a46fSAndroid Build Coastguard Worker template <typename T, typename V = cppgc::Visitor>
ContainerTrace(V * visitor,const std::list<cppgc::Member<T>> & container)19*3ac0a46fSAndroid Build Coastguard Worker void ContainerTrace(V* visitor, const std::list<cppgc::Member<T>>& container) {
20*3ac0a46fSAndroid Build Coastguard Worker for (const auto& item : container)
21*3ac0a46fSAndroid Build Coastguard Worker visitor->Trace(item);
22*3ac0a46fSAndroid Build Coastguard Worker }
23*3ac0a46fSAndroid Build Coastguard Worker
24*3ac0a46fSAndroid Build Coastguard Worker template <typename T, typename U, typename V = cppgc::Visitor>
ContainerTrace(V * visitor,const std::map<cppgc::Member<T>,U> & container)25*3ac0a46fSAndroid Build Coastguard Worker void ContainerTrace(V* visitor,
26*3ac0a46fSAndroid Build Coastguard Worker const std::map<cppgc::Member<T>, U>& container) {
27*3ac0a46fSAndroid Build Coastguard Worker for (const auto& item : container) {
28*3ac0a46fSAndroid Build Coastguard Worker visitor->Trace(item.first);
29*3ac0a46fSAndroid Build Coastguard Worker }
30*3ac0a46fSAndroid Build Coastguard Worker }
31*3ac0a46fSAndroid Build Coastguard Worker
32*3ac0a46fSAndroid Build Coastguard Worker template <typename T, typename U, typename V = cppgc::Visitor>
ContainerTrace(V * visitor,const std::map<U,cppgc::Member<T>> & container)33*3ac0a46fSAndroid Build Coastguard Worker void ContainerTrace(V* visitor,
34*3ac0a46fSAndroid Build Coastguard Worker const std::map<U, cppgc::Member<T>>& container) {
35*3ac0a46fSAndroid Build Coastguard Worker for (const auto& item : container)
36*3ac0a46fSAndroid Build Coastguard Worker visitor->Trace(item.second);
37*3ac0a46fSAndroid Build Coastguard Worker }
38*3ac0a46fSAndroid Build Coastguard Worker
39*3ac0a46fSAndroid Build Coastguard Worker template <typename T, typename U, typename V = cppgc::Visitor>
ContainerTrace(V * visitor,const std::map<cppgc::Member<U>,cppgc::Member<T>> & container)40*3ac0a46fSAndroid Build Coastguard Worker void ContainerTrace(
41*3ac0a46fSAndroid Build Coastguard Worker V* visitor,
42*3ac0a46fSAndroid Build Coastguard Worker const std::map<cppgc::Member<U>, cppgc::Member<T>>& container) {
43*3ac0a46fSAndroid Build Coastguard Worker for (const auto& item : container) {
44*3ac0a46fSAndroid Build Coastguard Worker visitor->Trace(item.first);
45*3ac0a46fSAndroid Build Coastguard Worker visitor->Trace(item.second);
46*3ac0a46fSAndroid Build Coastguard Worker }
47*3ac0a46fSAndroid Build Coastguard Worker }
48*3ac0a46fSAndroid Build Coastguard Worker
49*3ac0a46fSAndroid Build Coastguard Worker template <typename T, typename V = cppgc::Visitor>
ContainerTrace(V * visitor,const std::set<cppgc::Member<T>> & container)50*3ac0a46fSAndroid Build Coastguard Worker void ContainerTrace(V* visitor, const std::set<cppgc::Member<T>>& container) {
51*3ac0a46fSAndroid Build Coastguard Worker for (const auto& item : container)
52*3ac0a46fSAndroid Build Coastguard Worker visitor->Trace(item);
53*3ac0a46fSAndroid Build Coastguard Worker }
54*3ac0a46fSAndroid Build Coastguard Worker
55*3ac0a46fSAndroid Build Coastguard Worker template <typename T, typename V = cppgc::Visitor>
ContainerTrace(V * visitor,const std::vector<cppgc::Member<T>> & container)56*3ac0a46fSAndroid Build Coastguard Worker void ContainerTrace(V* visitor,
57*3ac0a46fSAndroid Build Coastguard Worker const std::vector<cppgc::Member<T>>& container) {
58*3ac0a46fSAndroid Build Coastguard Worker for (const auto& item : container)
59*3ac0a46fSAndroid Build Coastguard Worker visitor->Trace(item);
60*3ac0a46fSAndroid Build Coastguard Worker }
61*3ac0a46fSAndroid Build Coastguard Worker
62*3ac0a46fSAndroid Build Coastguard Worker } // namespace fxgc
63*3ac0a46fSAndroid Build Coastguard Worker
64*3ac0a46fSAndroid Build Coastguard Worker using fxgc::ContainerTrace;
65*3ac0a46fSAndroid Build Coastguard Worker
66*3ac0a46fSAndroid Build Coastguard Worker #endif // FXJS_GC_CONTAINER_TRACE_H_
67