[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 (); } void fini () { chain_flags.fini (); }
public: public:
hb_vector_t<hb_mask_t, 1> chain_flags; hb_vector_t<hb_mask_t> chain_flags;
}; };
struct hb_aat_map_builder_t struct hb_aat_map_builder_t
@ -84,7 +84,7 @@ struct hb_aat_map_builder_t
hb_face_t *face; hb_face_t *face;
public: 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: protected:
bool error; bool error;
unsigned int count; unsigned int count;
hb_vector_t<ELEM, kSizeLimit> elements; hb_vector_t<ELEM> elements;
}; };
/* argument stack */ /* argument stack */

View File

@ -599,7 +599,7 @@ struct hb_face_builder_data_t
hb_blob_t *blob; 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 * static hb_face_builder_data_t *

View File

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

View File

@ -61,7 +61,7 @@ struct code_pair_t
hb_codepoint_t glyph; 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> struct str_buff_vec_t : hb_vector_t<str_buff_t>
{ {
void fini () { SUPER::fini_deep (); } void fini () { SUPER::fini_deep (); }

View File

@ -643,7 +643,7 @@ struct hb_get_subtables_context_t :
hb_set_digest_t digest; 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. */ /* Dispatch interface. */
const char *get_name () { return "GET_SUBTABLES"; } const char *get_name () { return "GET_SUBTABLES"; }

View File

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

View File

@ -241,7 +241,7 @@ struct post
hb_blob_ptr_t<post> table; hb_blob_ptr_t<post> table;
uint32_t version; uint32_t version;
const ArrayOf<HBUINT16> *glyphNameIndex; 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; const uint8_t *pool;
hb_atomic_ptr_t<uint16_t *> gids_sorted_by_name; 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; hb_object_header_t header;
bool successful; /* Allocations successful */ bool successful; /* Allocations successful */
mutable unsigned int population; mutable unsigned int population;
hb_vector_t<page_map_t, 1> page_map; hb_vector_t<page_map_t> page_map;
hb_vector_t<page_t, 1> pages; hb_vector_t<page_t> pages;
void init_shallow () void init_shallow ()
{ {

View File

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

View File

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