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
11struct UResourceBundle;
12
13U_NAMESPACE_BEGIN
14
15class 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 */
28class U_COMMON_API ResourceTracer {
29public:
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
81private:
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 */
96class FileTracer {
97public:
98 static void traceOpen(const char* path, const char* type, const char* name);
99
100private:
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
105U_NAMESPACE_END
106
107#else // U_ENABLE_TRACING
108
109U_NAMESPACE_BEGIN
110
111/**
112 * Default trivial implementation when --enable-tracing is not used.
113 */
114class U_COMMON_API ResourceTracer {
115public:
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 */
138class FileTracer {
139public:
140 static void traceOpen(const char*, const char*, const char*) {}
141};
142
143U_NAMESPACE_END
144
145#endif // U_ENABLE_TRACING
146
147#endif //__RESTRACE_H__
148