[vector] Remove static_array

Was good idea, but with C++ types with constructor/destructor, was getting in
the way as compiler was destructing those items where it was not desired.
Since C++ does not allow zero-sized arrays, just remove it...
This commit is contained in:
Behdad Esfahbod 2018-12-27 17:56:22 -05:00
parent ab2258a419
commit fa333e34d6
11 changed files with 29 additions and 38 deletions

View File

@ -44,7 +44,7 @@ struct hb_aat_map_t
void fini () { chain_flags.fini (); }
public:
hb_vector_t<hb_mask_t, 1> chain_flags;
hb_vector_t<hb_mask_t> chain_flags;
};
struct hb_aat_map_builder_t
@ -84,7 +84,7 @@ struct hb_aat_map_builder_t
hb_face_t *face;
public:
hb_vector_t<feature_info_t, 32> features;
hb_vector_t<feature_info_t> features;
};

View File

@ -482,7 +482,7 @@ struct stack_t
protected:
bool error;
unsigned int count;
hb_vector_t<ELEM, kSizeLimit> elements;
hb_vector_t<ELEM> elements;
};
/* argument stack */

View File

@ -599,7 +599,7 @@ struct hb_face_builder_data_t
hb_blob_t *blob;
};
hb_vector_t<table_entry_t, 32> tables;
hb_vector_t<table_entry_t> tables;
};
static hb_face_builder_data_t *

View File

@ -45,7 +45,7 @@
template <typename item_t, typename lock_t>
struct hb_lockable_set_t
{
hb_vector_t <item_t, 1> items;
hb_vector_t<item_t> items;
void init () { items.init (); }

View File

@ -61,7 +61,7 @@ struct code_pair_t
hb_codepoint_t glyph;
};
typedef hb_vector_t<unsigned char, 1> str_buff_t;
typedef hb_vector_t<unsigned char> str_buff_t;
struct str_buff_vec_t : hb_vector_t<str_buff_t>
{
void fini () { SUPER::fini_deep (); }

View File

@ -643,7 +643,7 @@ struct hb_get_subtables_context_t :
hb_set_digest_t digest;
};
typedef hb_vector_t<hb_applicable_t, 2> array_t;
typedef hb_vector_t<hb_applicable_t> array_t;
/* Dispatch interface. */
const char *get_name () { return "GET_SUBTABLES"; }

View File

@ -167,9 +167,9 @@ struct hb_ot_map_t
hb_mask_t global_mask;
hb_vector_t<feature_map_t, 8> features;
hb_vector_t<lookup_map_t, 16> lookups[2]; /* GSUB/GPOS */
hb_vector_t<stage_map_t, 4> stages[2]; /* GSUB/GPOS */
hb_vector_t<feature_map_t> features;
hb_vector_t<lookup_map_t> lookups[2]; /* GSUB/GPOS */
hb_vector_t<stage_map_t> stages[2]; /* GSUB/GPOS */
};
enum hb_ot_map_feature_flags_t
@ -275,8 +275,8 @@ struct hb_ot_map_builder_t
private:
unsigned int current_stage[2]; /* GSUB/GPOS */
hb_vector_t<feature_info_t, 32> feature_infos;
hb_vector_t<stage_info_t, 8> stages[2]; /* GSUB/GPOS */
hb_vector_t<feature_info_t> feature_infos;
hb_vector_t<stage_info_t> stages[2]; /* GSUB/GPOS */
};

View File

@ -241,7 +241,7 @@ struct post
hb_blob_ptr_t<post> table;
uint32_t version;
const ArrayOf<HBUINT16> *glyphNameIndex;
hb_vector_t<uint32_t, 1> index_to_offset;
hb_vector_t<uint32_t> index_to_offset;
const uint8_t *pool;
hb_atomic_ptr_t<uint16_t *> gids_sorted_by_name;
};

View File

@ -186,8 +186,8 @@ struct hb_set_t
hb_object_header_t header;
bool successful; /* Allocations successful */
mutable unsigned int population;
hb_vector_t<page_map_t, 1> page_map;
hb_vector_t<page_t, 1> pages;
hb_vector_t<page_map_t> page_map;
hb_vector_t<page_t> pages;
void init_shallow ()
{

View File

@ -32,13 +32,13 @@
#include "hb-null.hh"
template <typename Type, unsigned int PreallocedCount=2>
template <typename Type>
struct hb_vector_t
{
typedef Type item_t;
enum { item_size = hb_static_size (Type) };
HB_NO_COPY_ASSIGN_TEMPLATE2 (hb_vector_t, Type, PreallocedCount);
HB_NO_COPY_ASSIGN_TEMPLATE (hb_vector_t, Type);
hb_vector_t () { init (); }
~hb_vector_t () { fini (); }
@ -46,13 +46,11 @@ struct hb_vector_t
private:
int allocated; /* == -1 means allocation failed. */
Type *arrayZ_;
Type static_array[PreallocedCount];
public:
void init ()
{
length = 0;
allocated = ARRAY_LENGTH (static_array);
allocated = length = 0;
arrayZ_ = nullptr;
}
@ -71,8 +69,8 @@ struct hb_vector_t
fini ();
}
const Type * arrayZ () const { return arrayZ_ ? arrayZ_ : static_array; }
Type * arrayZ () { return arrayZ_ ? arrayZ_ : static_array; }
const Type * arrayZ () const { return arrayZ_; }
Type * arrayZ () { return arrayZ_; }
Type& operator [] (int i_)
{
@ -158,22 +156,12 @@ struct hb_vector_t
new_allocated += (new_allocated >> 1) + 8;
Type *new_array = nullptr;
if (!arrayZ_)
{
new_array = (Type *) calloc (new_allocated, sizeof (Type));
if (new_array)
memcpy (new_array, static_array, length * sizeof (Type));
}
else
{
bool overflows =
(int) new_allocated < 0 ||
(new_allocated < allocated) ||
hb_unsigned_mul_overflows (new_allocated, sizeof (Type));
if (likely (!overflows))
new_array = (Type *) realloc (arrayZ_, new_allocated * sizeof (Type));
}
bool overflows =
(int) new_allocated < 0 ||
(new_allocated < allocated) ||
hb_unsigned_mul_overflows (new_allocated, sizeof (Type));
if (likely (!overflows))
new_array = (Type *) realloc (arrayZ_, new_allocated * sizeof (Type));
if (unlikely (!new_array))
{

View File

@ -377,6 +377,9 @@ static_assert ((sizeof (hb_var_int_t) == 4), "");
#define HB_NO_COPY_ASSIGN(TypeName) \
TypeName(const TypeName&); \
void operator=(const TypeName&)
#define HB_NO_COPY_ASSIGN_TEMPLATE(TypeName, T) \
TypeName(const TypeName<T>&); \
void operator=(const TypeName<T>&)
#define HB_NO_COPY_ASSIGN_TEMPLATE2(TypeName, T1, T2) \
TypeName(const TypeName<T1, T2>&); \
void operator=(const TypeName<T1, T2>&)