Port _nil objects to Null() machinery

Finally, unified!
This commit is contained in:
Behdad Esfahbod 2018-08-06 06:17:48 -07:00
parent 1abd427acf
commit 3506672ce9
14 changed files with 137 additions and 113 deletions

View File

@ -76,6 +76,7 @@ struct hb_blob_t
void *user_data;
hb_destroy_func_t destroy;
};
DECLARE_NULL_INSTANCE (hb_blob_t);
#endif /* HB_BLOB_PRIVATE_HH */

View File

@ -45,6 +45,20 @@
#include <stdlib.h>
DEFINE_NULL_INSTANCE (hb_blob_t) =
{
HB_OBJECT_HEADER_STATIC,
true, /* immutable */
nullptr, /* data */
0, /* length */
HB_MEMORY_MODE_READONLY, /* mode */
nullptr, /* user_data */
nullptr /* destroy */
};
/**
* hb_blob_create: (skip)
* @data: Pointer to blob data.
@ -182,20 +196,7 @@ hb_blob_copy_writable_or_fail (hb_blob_t *blob)
hb_blob_t *
hb_blob_get_empty (void)
{
static const hb_blob_t _hb_blob_nil = {
HB_OBJECT_HEADER_STATIC,
true, /* immutable */
nullptr, /* data */
0, /* length */
HB_MEMORY_MODE_READONLY, /* mode */
nullptr, /* user_data */
nullptr /* destroy */
};
return const_cast<hb_blob_t *> (&_hb_blob_nil);
return const_cast<hb_blob_t *> (&Null(hb_blob_t));
}
/**

View File

@ -83,7 +83,8 @@ HB_MARK_AS_FLAG_T (hb_buffer_scratch_flags_t);
* hb_buffer_t
*/
struct hb_buffer_t {
struct hb_buffer_t
{
hb_object_header_t header;
ASSERT_POD ();
@ -352,6 +353,7 @@ struct hb_buffer_t {
info[i].mask &= ~HB_GLYPH_FLAG_UNSAFE_TO_BREAK;
}
};
DECLARE_NULL_INSTANCE (hb_buffer_t);
/* Loop over clusters. Duplicated in foreach_syllable(). */

View File

@ -701,6 +701,28 @@ hb_buffer_t::guess_segment_properties (void)
/* Public API */
DEFINE_NULL_INSTANCE (hb_buffer_t) =
{
HB_OBJECT_HEADER_STATIC,
const_cast<hb_unicode_funcs_t *> (&_hb_Null_hb_unicode_funcs_t),
HB_BUFFER_FLAG_DEFAULT,
HB_BUFFER_CLUSTER_LEVEL_DEFAULT,
HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT,
HB_BUFFER_SCRATCH_FLAG_DEFAULT,
HB_BUFFER_MAX_LEN_DEFAULT,
HB_BUFFER_MAX_OPS_DEFAULT,
HB_BUFFER_CONTENT_TYPE_INVALID,
HB_SEGMENT_PROPERTIES_DEFAULT,
false, /* successful */
true, /* have_output */
true /* have_positions */
/* Zero is good enough for everything else. */
};
/**
* hb_buffer_create: (Xconstructor)
*
@ -743,27 +765,7 @@ hb_buffer_create (void)
hb_buffer_t *
hb_buffer_get_empty (void)
{
static const hb_buffer_t _hb_buffer_nil = {
HB_OBJECT_HEADER_STATIC,
const_cast<hb_unicode_funcs_t *> (&_hb_unicode_funcs_nil),
HB_BUFFER_FLAG_DEFAULT,
HB_BUFFER_CLUSTER_LEVEL_DEFAULT,
HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT,
HB_BUFFER_SCRATCH_FLAG_DEFAULT,
HB_BUFFER_MAX_LEN_DEFAULT,
HB_BUFFER_MAX_OPS_DEFAULT,
HB_BUFFER_CONTENT_TYPE_INVALID,
HB_SEGMENT_PROPERTIES_DEFAULT,
false, /* successful */
true, /* have_output */
true /* have_positions */
/* Zero is good enough for everything else. */
};
return const_cast<hb_buffer_t *> (&_hb_buffer_nil);
return const_cast<hb_buffer_t *> (&Null(hb_buffer_t));
}
/**

View File

@ -39,7 +39,8 @@
* hb_face_t
*/
struct hb_face_t {
struct hb_face_t
{
hb_object_header_t header;
ASSERT_POD ();
@ -94,8 +95,7 @@ struct hb_face_t {
HB_INTERNAL void load_upem (void) const;
HB_INTERNAL void load_num_glyphs (void) const;
};
extern HB_INTERNAL const hb_face_t _hb_face_nil;
DECLARE_NULL_INSTANCE (hb_face_t);
#define HB_SHAPER_DATA_CREATE_FUNC_EXTRA_ARGS
#define HB_SHAPER_IMPLEMENT(shaper) HB_SHAPER_DATA_PROTOTYPE(shaper, face);

View File

@ -63,7 +63,8 @@ hb_face_count (hb_blob_t *blob)
* hb_face_t
*/
const hb_face_t _hb_face_nil = {
DEFINE_NULL_INSTANCE (hb_face_t) =
{
HB_OBJECT_HEADER_STATIC,
true, /* immutable */
@ -215,7 +216,7 @@ hb_face_create (hb_blob_t *blob,
hb_face_t *
hb_face_get_empty (void)
{
return const_cast<hb_face_t *> (&_hb_face_nil);
return const_cast<hb_face_t *> (&Null(hb_face_t));
}

View File

@ -35,7 +35,6 @@
#include "hb-shaper-private.hh"
/*
* hb_font_funcs_t
*/
@ -57,7 +56,8 @@
HB_FONT_FUNC_IMPLEMENT (glyph_from_name) \
/* ^--- Add new callbacks here */
struct hb_font_funcs_t {
struct hb_font_funcs_t
{
hb_object_header_t header;
ASSERT_POD ();
@ -89,14 +89,15 @@ struct hb_font_funcs_t {
]) (void);
} get;
};
DECLARE_NULL_INSTANCE (hb_font_funcs_t);
/*
* hb_font_t
*/
struct hb_font_t {
struct hb_font_t
{
hb_object_header_t header;
ASSERT_POD ();
@ -553,6 +554,7 @@ struct hb_font_t {
return (float) v * scale / face->get_upem ();
}
};
DECLARE_NULL_INSTANCE (hb_font_t);
#define HB_SHAPER_DATA_CREATE_FUNC_EXTRA_ARGS
#define HB_SHAPER_IMPLEMENT(shaper) HB_SHAPER_DATA_PROTOTYPE(shaper, font);

View File

@ -341,7 +341,8 @@ hb_font_get_glyph_from_name_parent (hb_font_t *font,
return font->parent->get_glyph_from_name (name, len, glyph);
}
static const hb_font_funcs_t _hb_font_funcs_nil = {
DEFINE_NULL_INSTANCE (hb_font_funcs_t) =
{
HB_OBJECT_HEADER_STATIC,
true, /* immutable */
@ -364,6 +365,7 @@ static const hb_font_funcs_t _hb_font_funcs_nil = {
}
}
};
static const hb_font_funcs_t _hb_font_funcs_parent = {
HB_OBJECT_HEADER_STATIC,
@ -1100,6 +1102,37 @@ hb_font_glyph_from_string (hb_font_t *font,
* hb_font_t
*/
DEFINE_NULL_INSTANCE (hb_font_t) =
{
HB_OBJECT_HEADER_STATIC,
true, /* immutable */
nullptr, /* parent */
const_cast<hb_face_t *> (&_hb_Null_hb_face_t),
1000, /* x_scale */
1000, /* y_scale */
0, /* x_ppem */
0, /* y_ppem */
0, /* ptem */
0, /* num_coords */
nullptr, /* coords */
const_cast<hb_font_funcs_t *> (&_hb_Null_hb_font_funcs_t), /* klass */
nullptr, /* user_data */
nullptr, /* destroy */
{
#define HB_SHAPER_IMPLEMENT(shaper) HB_SHAPER_DATA_INVALID,
#include "hb-shaper-list.hh"
#undef HB_SHAPER_IMPLEMENT
}
};
/**
* hb_font_create: (Xconstructor)
* @face: a face.
@ -1187,36 +1220,7 @@ hb_font_create_sub_font (hb_font_t *parent)
hb_font_t *
hb_font_get_empty (void)
{
static const hb_font_t _hb_font_nil = {
HB_OBJECT_HEADER_STATIC,
true, /* immutable */
nullptr, /* parent */
const_cast<hb_face_t *> (&_hb_face_nil),
1000, /* x_scale */
1000, /* y_scale */
0, /* x_ppem */
0, /* y_ppem */
0, /* ptem */
0, /* num_coords */
nullptr, /* coords */
const_cast<hb_font_funcs_t *> (&_hb_font_funcs_nil), /* klass */
nullptr, /* user_data */
nullptr, /* destroy */
{
#define HB_SHAPER_IMPLEMENT(shaper) HB_SHAPER_DATA_INVALID,
#include "hb-shaper-list.hh"
#undef HB_SHAPER_IMPLEMENT
}
};
return const_cast<hb_font_t *> (&_hb_font_nil);
return const_cast<hb_font_t *> (&Null(hb_font_t));
}
/**

View File

@ -59,10 +59,19 @@ template <> \
} \
namespace Namespace { \
static_assert (true, "Just so we take semicolon after.")
#define DEFINE_NULL_NAMESPACE_BYTES(Namespace, Type) \
const unsigned char _hb_Null_##Namespace##_##Type[Namespace::Type::min_size]
/* Specializaitons for arbitrary-content Null objects expressed as struct initializer. */
#define DECLARE_NULL_INSTANCE(Type) \
extern HB_INTERNAL const Type _hb_Null_##Type; \
template <> \
/*static*/ inline const Type& Null<Type> (void) { \
return _hb_Null_##Type; \
} \
static_assert (true, "Just so we take semicolon after.")
#define DEFINE_NULL_INSTANCE(Type) \
const Type _hb_Null_##Type
/* Global writable pool. Enlarge as necessary. */

View File

@ -205,8 +205,6 @@ struct arabic_fallback_plan_t
hb_ot_layout_lookup_accelerator_t accel_array[ARABIC_FALLBACK_MAX_LOOKUPS];
};
static const arabic_fallback_plan_t arabic_fallback_plan_nil = {};
#if (defined(_WIN32) || defined(__CYGWIN__)) && !defined(HB_NO_WIN1256)
#define HB_WITH_WIN1256
#endif
@ -215,7 +213,8 @@ static const arabic_fallback_plan_t arabic_fallback_plan_nil = {};
#include "hb-ot-shape-complex-arabic-win1256.hh"
#endif
struct ManifestLookup {
struct ManifestLookup
{
OT::Tag tag;
OT::OffsetTo<OT::SubstLookup> lookupOffset;
};
@ -299,7 +298,7 @@ arabic_fallback_plan_create (const hb_ot_shape_plan_t *plan,
{
arabic_fallback_plan_t *fallback_plan = (arabic_fallback_plan_t *) calloc (1, sizeof (arabic_fallback_plan_t));
if (unlikely (!fallback_plan))
return const_cast<arabic_fallback_plan_t *> (&arabic_fallback_plan_nil);
return const_cast<arabic_fallback_plan_t *> (&Null(arabic_fallback_plan_t));
fallback_plan->num_lookups = 0;
fallback_plan->free_lookups = false;
@ -315,13 +314,13 @@ arabic_fallback_plan_create (const hb_ot_shape_plan_t *plan,
return fallback_plan;
free (fallback_plan);
return const_cast<arabic_fallback_plan_t *> (&arabic_fallback_plan_nil);
return const_cast<arabic_fallback_plan_t *> (&Null(arabic_fallback_plan_t));
}
static void
arabic_fallback_plan_destroy (arabic_fallback_plan_t *fallback_plan)
{
if (!fallback_plan || fallback_plan == &arabic_fallback_plan_nil)
if (!fallback_plan || fallback_plan == &Null(arabic_fallback_plan_t))
return;
for (unsigned int i = 0; i < fallback_plan->num_lookups; i++)

View File

@ -51,6 +51,7 @@ struct hb_shape_plan_t
struct hb_shaper_data_t shaper_data;
};
DECLARE_NULL_INSTANCE (hb_shape_plan_t);
#define HB_SHAPER_DATA_CREATE_FUNC_EXTRA_ARGS \
, const hb_feature_t *user_features \

View File

@ -88,6 +88,31 @@ hb_shape_plan_plan (hb_shape_plan_t *shape_plan,
* hb_shape_plan_t
*/
DEFINE_NULL_INSTANCE (hb_shape_plan_t) =
{
HB_OBJECT_HEADER_STATIC,
true, /* default_shaper_list */
nullptr, /* face */
HB_SEGMENT_PROPERTIES_DEFAULT, /* props */
nullptr, /* shaper_func */
nullptr, /* shaper_name */
nullptr, /* user_features */
0, /* num_user_featurs */
nullptr, /* coords */
0, /* num_coords */
{
#define HB_SHAPER_IMPLEMENT(shaper) HB_SHAPER_DATA_INVALID,
#include "hb-shaper-list.hh"
#undef HB_SHAPER_IMPLEMENT
}
};
/**
* hb_shape_plan_create: (Xconstructor)
* @face:
@ -188,30 +213,7 @@ hb_shape_plan_create2 (hb_face_t *face,
hb_shape_plan_t *
hb_shape_plan_get_empty (void)
{
static const hb_shape_plan_t _hb_shape_plan_nil = {
HB_OBJECT_HEADER_STATIC,
true, /* default_shaper_list */
nullptr, /* face */
HB_SEGMENT_PROPERTIES_DEFAULT, /* props */
nullptr, /* shaper_func */
nullptr, /* shaper_name */
nullptr, /* user_features */
0, /* num_user_featurs */
nullptr, /* coords */
0, /* num_coords */
{
#define HB_SHAPER_IMPLEMENT(shaper) HB_SHAPER_DATA_INVALID,
#include "hb-shaper-list.hh"
#undef HB_SHAPER_IMPLEMENT
}
};
return const_cast<hb_shape_plan_t *> (&_hb_shape_plan_nil);
return const_cast<hb_shape_plan_t *> (&Null(hb_shape_plan_t));
}
/**

View File

@ -60,7 +60,8 @@ extern HB_INTERNAL const uint8_t _hb_modified_combining_class[256];
HB_UNICODE_FUNC_IMPLEMENT (hb_script_t, script) \
/* ^--- Add new simple callbacks here */
struct hb_unicode_funcs_t {
struct hb_unicode_funcs_t
{
hb_object_header_t header;
ASSERT_POD ();
@ -263,9 +264,7 @@ HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS_SIMPLE
#undef HB_UNICODE_FUNC_IMPLEMENT
} destroy;
};
extern HB_INTERNAL const hb_unicode_funcs_t _hb_unicode_funcs_nil;
DECLARE_NULL_INSTANCE (hb_unicode_funcs_t);
/* Modified combining marks */

View File

@ -185,7 +185,8 @@ hb_unicode_funcs_create (hb_unicode_funcs_t *parent)
}
const hb_unicode_funcs_t _hb_unicode_funcs_nil = {
DEFINE_NULL_INSTANCE (hb_unicode_funcs_t) =
{
HB_OBJECT_HEADER_STATIC,
nullptr, /* parent */
@ -209,7 +210,7 @@ const hb_unicode_funcs_t _hb_unicode_funcs_nil = {
hb_unicode_funcs_t *
hb_unicode_funcs_get_empty (void)
{
return const_cast<hb_unicode_funcs_t *> (&_hb_unicode_funcs_nil);
return const_cast<hb_unicode_funcs_t *> (&Null(hb_unicode_funcs_t));
}
/**