|  | // © 2019 and later: Unicode, Inc. and others. | 
|  | // License & terms of use: http://www.unicode.org/copyright.html | 
|  |  | 
|  | #ifndef __RESTRACE_H__ | 
|  | #define __RESTRACE_H__ | 
|  |  | 
|  | #include "unicode/utypes.h" | 
|  |  | 
|  | #if U_ENABLE_TRACING | 
|  |  | 
|  | struct UResourceBundle; | 
|  |  | 
|  | U_NAMESPACE_BEGIN | 
|  |  | 
|  | class CharString; | 
|  |  | 
|  | /** | 
|  | * Instances of this class store information used to trace reads from resource | 
|  | * bundles when ICU is built with --enable-tracing. | 
|  | * | 
|  | * All arguments of type const UResourceBundle*, const char*, and | 
|  | * const ResourceTracer& are stored as pointers. The caller must retain | 
|  | * ownership for the lifetime of this ResourceTracer. | 
|  | * | 
|  | * Exported as U_COMMON_API for Windows because it is a value field | 
|  | * in other exported types. | 
|  | */ | 
|  | class U_COMMON_API ResourceTracer { | 
|  | public: | 
|  | ResourceTracer() : | 
|  | fResB(nullptr), | 
|  | fParent(nullptr), | 
|  | fKey(nullptr), | 
|  | fIndex(-1) {} | 
|  |  | 
|  | ResourceTracer(const UResourceBundle* resB) : | 
|  | fResB(resB), | 
|  | fParent(nullptr), | 
|  | fKey(nullptr), | 
|  | fIndex(-1) {} | 
|  |  | 
|  | ResourceTracer(const UResourceBundle* resB, const char* key) : | 
|  | fResB(resB), | 
|  | fParent(nullptr), | 
|  | fKey(key), | 
|  | fIndex(-1) {} | 
|  |  | 
|  | ResourceTracer(const UResourceBundle* resB, int32_t index) : | 
|  | fResB(resB), | 
|  | fParent(nullptr), | 
|  | fKey(nullptr), | 
|  | fIndex(index) {} | 
|  |  | 
|  | ResourceTracer(const ResourceTracer& parent, const char* key) : | 
|  | fResB(nullptr), | 
|  | fParent(&parent), | 
|  | fKey(key), | 
|  | fIndex(-1) {} | 
|  |  | 
|  | ResourceTracer(const ResourceTracer& parent, int32_t index) : | 
|  | fResB(nullptr), | 
|  | fParent(&parent), | 
|  | fKey(nullptr), | 
|  | fIndex(index) {} | 
|  |  | 
|  | ~ResourceTracer(); | 
|  |  | 
|  | void trace(const char* type) const; | 
|  | void traceOpen() const; | 
|  |  | 
|  | /** | 
|  | * Calls trace() if the resB or parent provided to the constructor was | 
|  | * non-null; otherwise, does nothing. | 
|  | */ | 
|  | void maybeTrace(const char* type) const { | 
|  | if (fResB || fParent) { | 
|  | trace(type); | 
|  | } | 
|  | } | 
|  |  | 
|  | private: | 
|  | const UResourceBundle* fResB; | 
|  | const ResourceTracer* fParent; | 
|  | const char* fKey; | 
|  | int32_t fIndex; | 
|  |  | 
|  | CharString& getFilePath(CharString& output, UErrorCode& status) const; | 
|  |  | 
|  | CharString& getResPath(CharString& output, UErrorCode& status) const; | 
|  | }; | 
|  |  | 
|  | /** | 
|  | * This class provides methods to trace data file reads when ICU is built | 
|  | * with --enable-tracing. | 
|  | */ | 
|  | class FileTracer { | 
|  | public: | 
|  | static void traceOpen(const char* path, const char* type, const char* name); | 
|  |  | 
|  | private: | 
|  | static void traceOpenDataFile(const char* path, const char* type, const char* name); | 
|  | static void traceOpenResFile(const char* path, const char* name); | 
|  | }; | 
|  |  | 
|  | U_NAMESPACE_END | 
|  |  | 
|  | #else // U_ENABLE_TRACING | 
|  |  | 
|  | U_NAMESPACE_BEGIN | 
|  |  | 
|  | /** | 
|  | * Default trivial implementation when --enable-tracing is not used. | 
|  | */ | 
|  | class U_COMMON_API ResourceTracer { | 
|  | public: | 
|  | ResourceTracer() {} | 
|  |  | 
|  | ResourceTracer(const void*) {} | 
|  |  | 
|  | ResourceTracer(const void*, const char*) {} | 
|  |  | 
|  | ResourceTracer(const void*, int32_t) {} | 
|  |  | 
|  | ResourceTracer(const ResourceTracer&, const char*) {} | 
|  |  | 
|  | ResourceTracer(const ResourceTracer&, int32_t) {} | 
|  |  | 
|  | void trace(const char*) const {} | 
|  |  | 
|  | void traceOpen() const {} | 
|  |  | 
|  | void maybeTrace(const char*) const {} | 
|  | }; | 
|  |  | 
|  | /** | 
|  | * Default trivial implementation when --enable-tracing is not used. | 
|  | */ | 
|  | class FileTracer { | 
|  | public: | 
|  | static void traceOpen(const char*, const char*, const char*) {} | 
|  | }; | 
|  |  | 
|  | U_NAMESPACE_END | 
|  |  | 
|  | #endif // U_ENABLE_TRACING | 
|  |  | 
|  | #endif //__RESTRACE_H__ |