]> git.saurik.com Git - apple/icu.git/blobdiff - icuSources/common/restrace.h
ICU-66108.tar.gz
[apple/icu.git] / icuSources / common / restrace.h
diff --git a/icuSources/common/restrace.h b/icuSources/common/restrace.h
new file mode 100644 (file)
index 0000000..ef29eae
--- /dev/null
@@ -0,0 +1,147 @@
+// © 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__