This commit is contained in:
Behdad Esfahbod 2012-11-23 14:21:35 -05:00
parent c779d82b2f
commit dabe698fcb
3 changed files with 29 additions and 13 deletions

View File

@ -37,11 +37,6 @@
namespace OT { namespace OT {
/*
* Void!
*/
typedef struct {} void_t;
/* /*
* Casts * Casts

View File

@ -50,7 +50,7 @@ struct hb_closure_context_t
typedef return_t (*recurse_func_t) (hb_closure_context_t *c, unsigned int lookup_index); typedef return_t (*recurse_func_t) (hb_closure_context_t *c, unsigned int lookup_index);
template <typename T> template <typename T>
inline return_t process (const T &obj) { obj.closure (this); return void_t (); } inline return_t process (const T &obj) { obj.closure (this); return void_t (); }
static const return_t default_return_value (void) { return return_t (); } static return_t default_return_value (void) { return return_t (); }
bool stop_sublookup_iteration (const return_t r) const { return false; } bool stop_sublookup_iteration (const return_t r) const { return false; }
return_t recurse (unsigned int lookup_index) return_t recurse (unsigned int lookup_index)
{ {
@ -82,7 +82,6 @@ struct hb_closure_context_t
/* TODO Add TRACE_RETURN annotation to gsub. */
#ifndef HB_DEBUG_WOULD_APPLY #ifndef HB_DEBUG_WOULD_APPLY
#define HB_DEBUG_WOULD_APPLY (HB_DEBUG+0) #define HB_DEBUG_WOULD_APPLY (HB_DEBUG+0)
#endif #endif
@ -119,7 +118,6 @@ struct hb_would_apply_context_t
/* TODO Add TRACE_RETURN annotation to gsub. */
#ifndef HB_DEBUG_COLLECT_GLYPHS #ifndef HB_DEBUG_COLLECT_GLYPHS
#define HB_DEBUG_COLLECT_GLYPHS (HB_DEBUG+0) #define HB_DEBUG_COLLECT_GLYPHS (HB_DEBUG+0)
#endif #endif
@ -133,7 +131,7 @@ struct hb_collect_glyphs_context_t
typedef void_t return_t; typedef void_t return_t;
template <typename T> template <typename T>
inline return_t process (const T &obj) { obj.collect_glyphs (this); return void_t (); } inline return_t process (const T &obj) { obj.collect_glyphs (this); return void_t (); }
static const return_t default_return_value (void) { return return_t (); } static return_t default_return_value (void) { return return_t (); }
bool stop_iteration (const return_t r) const { return false; } bool stop_iteration (const return_t r) const { return false; }
return_t recurse (unsigned int lookup_index) return_t recurse (unsigned int lookup_index)
{ {
@ -170,7 +168,7 @@ struct hb_get_coverage_context_t
typedef const Coverage &return_t; typedef const Coverage &return_t;
template <typename T> template <typename T>
inline return_t process (const T &obj) { return obj.get_coverage (); } inline return_t process (const T &obj) { return obj.get_coverage (); }
static return_t default_return_value (void) { return Null(Coverage); } static const return_t default_return_value (void) { return Null(Coverage); }
bool stop_sublookup_iteration (const return_t r) const { return true; /* Unused */ } bool stop_sublookup_iteration (const return_t r) const { return true; /* Unused */ }
return_t recurse (unsigned int lookup_index) return_t recurse (unsigned int lookup_index)
{ return default_return_value (); } { return default_return_value (); }
@ -194,7 +192,7 @@ struct hb_apply_context_t
typedef return_t (*recurse_func_t) (hb_apply_context_t *c, unsigned int lookup_index); typedef return_t (*recurse_func_t) (hb_apply_context_t *c, unsigned int lookup_index);
template <typename T> template <typename T>
inline return_t process (const T &obj) { return obj.apply (this); } inline return_t process (const T &obj) { return obj.apply (this); }
static const return_t default_return_value (void) { return false; } static return_t default_return_value (void) { return false; }
bool stop_sublookup_iteration (const return_t r) const { return r; } bool stop_sublookup_iteration (const return_t r) const { return r; }
return_t recurse (unsigned int lookup_index) return_t recurse (unsigned int lookup_index)
{ {

View File

@ -62,6 +62,10 @@
#endif #endif
/* Void! */
typedef struct {} void_t;
/* Basics */ /* Basics */
@ -656,6 +660,24 @@ _hb_debug_msg<0> (const char *what HB_UNUSED,
#define DEBUG_MSG_FUNC(WHAT, OBJ, ...) _hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), HB_FUNC, false, 0, 0, __VA_ARGS__) #define DEBUG_MSG_FUNC(WHAT, OBJ, ...) _hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), HB_FUNC, false, 0, 0, __VA_ARGS__)
/*
* Printer
*/
template <typename T>
struct hb_printer_t {};
template <>
struct hb_printer_t<bool> {
const char *print (bool v) { return v ? "true" : "false"; }
};
template <>
struct hb_printer_t<void_t> {
const char *print (void_t v) { return ""; }
};
/* /*
* Trace * Trace
*/ */
@ -687,14 +709,15 @@ struct hb_auto_trace_t {
if (plevel) --*plevel; if (plevel) --*plevel;
} }
inline bool ret (bool v, unsigned int line = 0) template <typename T>
inline T ret (T v, unsigned int line = 0)
{ {
if (unlikely (returned)) { if (unlikely (returned)) {
fprintf (stderr, "OUCH, double calls to TRACE_RETURN. This is a bug, please report.\n"); fprintf (stderr, "OUCH, double calls to TRACE_RETURN. This is a bug, please report.\n");
return v; return v;
} }
_hb_debug_msg<max_level> (what, obj, NULL, true, plevel ? *plevel : 1, -1, "return %s (line %d)", v ? "true" : "false", line); _hb_debug_msg<max_level> (what, obj, NULL, true, plevel ? *plevel : 1, -1, "return %s (line %d)", hb_printer_t<bool>().print (v), line);
if (plevel) --*plevel; if (plevel) --*plevel;
plevel = NULL; plevel = NULL;
returned = true; returned = true;