1 | // © 2019 and later: Unicode, Inc. and others. |
2 | // License & terms of use: http://www.unicode.org/copyright.html |
3 | |
4 | #ifndef __RESTRACE_H__ |
5 | #define __RESTRACE_H__ |
6 | |
7 | #include "unicode/utypes.h" |
8 | |
9 | #if U_ENABLE_TRACING |
10 | |
11 | struct UResourceBundle; |
12 | |
13 | U_NAMESPACE_BEGIN |
14 | |
15 | class CharString; |
16 | |
17 | /** |
18 | * Instances of this class store information used to trace reads from resource |
19 | * bundles when ICU is built with --enable-tracing. |
20 | * |
21 | * All arguments of type const UResourceBundle*, const char*, and |
22 | * const ResourceTracer& are stored as pointers. The caller must retain |
23 | * ownership for the lifetime of this ResourceTracer. |
24 | * |
25 | * Exported as U_COMMON_API for Windows because it is a value field |
26 | * in other exported types. |
27 | */ |
28 | class U_COMMON_API ResourceTracer { |
29 | public: |
30 | ResourceTracer() : |
31 | fResB(nullptr), |
32 | fParent(nullptr), |
33 | fKey(nullptr), |
34 | fIndex(-1) {} |
35 | |
36 | ResourceTracer(const UResourceBundle* resB) : |
37 | fResB(resB), |
38 | fParent(nullptr), |
39 | fKey(nullptr), |
40 | fIndex(-1) {} |
41 | |
42 | ResourceTracer(const UResourceBundle* resB, const char* key) : |
43 | fResB(resB), |
44 | fParent(nullptr), |
45 | fKey(key), |
46 | fIndex(-1) {} |
47 | |
48 | ResourceTracer(const UResourceBundle* resB, int32_t index) : |
49 | fResB(resB), |
50 | fParent(nullptr), |
51 | fKey(nullptr), |
52 | fIndex(index) {} |
53 | |
54 | ResourceTracer(const ResourceTracer& parent, const char* key) : |
55 | fResB(nullptr), |
56 | fParent(&parent), |
57 | fKey(key), |
58 | fIndex(-1) {} |
59 | |
60 | ResourceTracer(const ResourceTracer& parent, int32_t index) : |
61 | fResB(nullptr), |
62 | fParent(&parent), |
63 | fKey(nullptr), |
64 | fIndex(index) {} |
65 | |
66 | ~ResourceTracer(); |
67 | |
68 | void trace(const char* type) const; |
69 | void traceOpen() const; |
70 | |
71 | /** |
72 | * Calls trace() if the resB or parent provided to the constructor was |
73 | * non-null; otherwise, does nothing. |
74 | */ |
75 | void maybeTrace(const char* type) const { |
76 | if (fResB || fParent) { |
77 | trace(type); |
78 | } |
79 | } |
80 | |
81 | private: |
82 | const UResourceBundle* fResB; |
83 | const ResourceTracer* fParent; |
84 | const char* fKey; |
85 | int32_t fIndex; |
86 | |
87 | CharString& getFilePath(CharString& output, UErrorCode& status) const; |
88 | |
89 | CharString& getResPath(CharString& output, UErrorCode& status) const; |
90 | }; |
91 | |
92 | /** |
93 | * This class provides methods to trace data file reads when ICU is built |
94 | * with --enable-tracing. |
95 | */ |
96 | class FileTracer { |
97 | public: |
98 | static void traceOpen(const char* path, const char* type, const char* name); |
99 | |
100 | private: |
101 | static void traceOpenDataFile(const char* path, const char* type, const char* name); |
102 | static void traceOpenResFile(const char* path, const char* name); |
103 | }; |
104 | |
105 | U_NAMESPACE_END |
106 | |
107 | #else // U_ENABLE_TRACING |
108 | |
109 | U_NAMESPACE_BEGIN |
110 | |
111 | /** |
112 | * Default trivial implementation when --enable-tracing is not used. |
113 | */ |
114 | class U_COMMON_API ResourceTracer { |
115 | public: |
116 | ResourceTracer() {} |
117 | |
118 | ResourceTracer(const void*) {} |
119 | |
120 | ResourceTracer(const void*, const char*) {} |
121 | |
122 | ResourceTracer(const void*, int32_t) {} |
123 | |
124 | ResourceTracer(const ResourceTracer&, const char*) {} |
125 | |
126 | ResourceTracer(const ResourceTracer&, int32_t) {} |
127 | |
128 | void trace(const char*) const {} |
129 | |
130 | void traceOpen() const {} |
131 | |
132 | void maybeTrace(const char*) const {} |
133 | }; |
134 | |
135 | /** |
136 | * Default trivial implementation when --enable-tracing is not used. |
137 | */ |
138 | class FileTracer { |
139 | public: |
140 | static void traceOpen(const char*, const char*, const char*) {} |
141 | }; |
142 | |
143 | U_NAMESPACE_END |
144 | |
145 | #endif // U_ENABLE_TRACING |
146 | |
147 | #endif //__RESTRACE_H__ |
148 | |