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