// © 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__