提交 3246a8eb 编写于 作者: B Behdad Esfahbod

[arrays] Merge ArrayOf's sub_array into hb_array_t's

上级 e6877e28
...@@ -567,6 +567,7 @@ struct hb_array_t ...@@ -567,6 +567,7 @@ struct hb_array_t
{ {
static_assert ((bool) (unsigned) hb_static_size (Type), ""); static_assert ((bool) (unsigned) hb_static_size (Type), "");
inline hb_array_t (void) : arrayZ (nullptr), len (0) {}
inline hb_array_t (const hb_array_t &o) : arrayZ (o.arrayZ), len (o.len) {} inline hb_array_t (const hb_array_t &o) : arrayZ (o.arrayZ), len (o.len) {}
inline hb_array_t (Type *array_, unsigned int len_) : arrayZ (array_), len (len_) {} inline hb_array_t (Type *array_, unsigned int len_) : arrayZ (array_), len (len_) {}
...@@ -582,6 +583,24 @@ struct hb_array_t ...@@ -582,6 +583,24 @@ struct hb_array_t
inline unsigned int get_size (void) const { return len * sizeof (Type); } inline unsigned int get_size (void) const { return len * sizeof (Type); }
inline hb_array_t<Type> sub_array (unsigned int start_offset, unsigned int *seg_count /* IN/OUT */) const
{
if (!seg_count) return hb_array_t<Type> ();
unsigned int count = len;
if (unlikely (start_offset > count))
count = 0;
else
count -= start_offset;
count = *seg_count = MIN (count, *seg_count);
return hb_array_t<Type> (arrayZ + start_offset, count);
}
inline hb_array_t<Type> sub_array (unsigned int start_offset, unsigned int seg_count) const
{ return sub_array (start_offset, &seg_count); }
inline hb_bytes_t as_bytes (void) const
{ return hb_bytes_t (arrayZ, len * sizeof (Type)); }
template <typename T> template <typename T>
inline Type *lsearch (const T &x, inline Type *lsearch (const T &x,
Type *not_found = nullptr) Type *not_found = nullptr)
...@@ -620,23 +639,8 @@ struct hb_array_t ...@@ -620,23 +639,8 @@ struct hb_array_t
::qsort (arrayZ + start, end - start, sizeof (Type), Type::cmp); ::qsort (arrayZ + start, end - start, sizeof (Type), Type::cmp);
} }
inline hb_array_t<Type> sub_array (unsigned int start_offset, unsigned int seg_count) const inline void free (void)
{ { ::free ((void *) arrayZ); arrayZ = nullptr; len = 0; }
unsigned int count = len;
if (unlikely (start_offset > count))
count = 0;
else
count -= start_offset;
count = MIN (count, seg_count);
return hb_array_t<Type> (arrayZ + start_offset, count);
}
inline hb_bytes_t as_bytes (void) const
{
return hb_bytes_t (arrayZ, len * sizeof (Type));
}
inline void free (void) { ::free ((void *) arrayZ); arrayZ = nullptr; len = 0; }
template <typename hb_sanitize_context_t> template <typename hb_sanitize_context_t>
inline bool sanitize (hb_sanitize_context_t *c) const inline bool sanitize (hb_sanitize_context_t *c) const
...@@ -660,9 +664,15 @@ enum hb_bfind_not_found_t ...@@ -660,9 +664,15 @@ enum hb_bfind_not_found_t
template <typename Type> template <typename Type>
struct hb_sorted_array_t : hb_array_t<Type> struct hb_sorted_array_t : hb_array_t<Type>
{ {
inline hb_sorted_array_t (void) : hb_array_t<Type> () {}
inline hb_sorted_array_t (const hb_array_t<Type> &o) : hb_array_t<Type> (o) {} inline hb_sorted_array_t (const hb_array_t<Type> &o) : hb_array_t<Type> (o) {}
inline hb_sorted_array_t (Type *array_, unsigned int len_) : hb_array_t<Type> (array_, len_) {} inline hb_sorted_array_t (Type *array_, unsigned int len_) : hb_array_t<Type> (array_, len_) {}
inline hb_sorted_array_t<Type> sub_array (unsigned int start_offset, unsigned int *seg_count /* IN/OUT */) const
{ return hb_sorted_array_t<Type> (((const hb_array_t<Type> *) (this))->sub_array (start_offset, seg_count)); }
inline hb_sorted_array_t<Type> sub_array (unsigned int start_offset, unsigned int seg_count) const
{ return sub_array (start_offset, &seg_count); }
template <typename T> template <typename T>
inline Type *bsearch (const T &x, Type *not_found = nullptr) inline Type *bsearch (const T &x, Type *not_found = nullptr)
{ {
......
...@@ -492,18 +492,6 @@ struct ArrayOf ...@@ -492,18 +492,6 @@ struct ArrayOf
HB_NO_CREATE_COPY_ASSIGN_TEMPLATE2 (ArrayOf, Type, LenType); HB_NO_CREATE_COPY_ASSIGN_TEMPLATE2 (ArrayOf, Type, LenType);
inline const Type *sub_array (unsigned int start_offset, unsigned int *pcount /* IN/OUT */) const
{
unsigned int count = len;
if (unlikely (start_offset > count))
count = 0;
else
count -= start_offset;
count = MIN (count, *pcount);
*pcount = count;
return arrayZ + start_offset;
}
inline const Type& operator [] (unsigned int i) const inline const Type& operator [] (unsigned int i) const
{ {
if (unlikely (i >= len)) return Null (Type); if (unlikely (i >= len)) return Null (Type);
...@@ -523,6 +511,15 @@ struct ArrayOf ...@@ -523,6 +511,15 @@ struct ArrayOf
inline hb_array_t<const Type> as_array (void) const inline hb_array_t<const Type> as_array (void) const
{ return hb_array (arrayZ, len); } { return hb_array (arrayZ, len); }
inline hb_array_t<const Type> sub_array (unsigned int start_offset, unsigned int count) const
{ return as_array ().sub_array (start_offset, count);}
inline hb_array_t<const Type> sub_array (unsigned int start_offset, unsigned int *count /* IN/OUT */) const
{ return as_array ().sub_array (start_offset, count);}
inline hb_array_t<Type> sub_array (unsigned int start_offset, unsigned int count)
{ return as_array ().sub_array (start_offset, count);}
inline hb_array_t<Type> sub_array (unsigned int start_offset, unsigned int *count /* IN/OUT */)
{ return as_array ().sub_array (start_offset, count);}
inline bool serialize (hb_serialize_context_t *c, inline bool serialize (hb_serialize_context_t *c,
unsigned int items_len) unsigned int items_len)
{ {
...@@ -777,6 +774,15 @@ struct SortedArrayOf : ArrayOf<Type, LenType> ...@@ -777,6 +774,15 @@ struct SortedArrayOf : ArrayOf<Type, LenType>
inline hb_sorted_array_t<const Type> as_array (void) const inline hb_sorted_array_t<const Type> as_array (void) const
{ return hb_sorted_array (this->arrayZ, this->len); } { return hb_sorted_array (this->arrayZ, this->len); }
inline hb_array_t<const Type> sub_array (unsigned int start_offset, unsigned int count) const
{ return as_array ().sub_array (start_offset, count);}
inline hb_array_t<const Type> sub_array (unsigned int start_offset, unsigned int *count /* IN/OUT */) const
{ return as_array ().sub_array (start_offset, count);}
inline hb_array_t<Type> sub_array (unsigned int start_offset, unsigned int count)
{ return as_array ().sub_array (start_offset, count);}
inline hb_array_t<Type> sub_array (unsigned int start_offset, unsigned int *count /* IN/OUT */)
{ return as_array ().sub_array (start_offset, count);}
template <typename T> template <typename T>
inline Type &bsearch (const T &x, Type &not_found = Crap (Type)) inline Type &bsearch (const T &x, Type &not_found = Crap (Type))
{ return *as_array ().bsearch (x, &not_found); } { return *as_array ().bsearch (x, &not_found); }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册