blob: ef29eaed578107ad55bc3d4189249050b2f2b8a4 [file] [log] [blame]
// © 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__