{
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 (Type *array_, unsigned int len_) : arrayZ (array_), len (len_) {}
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>
inline Type *lsearch (const T &x,
Type *not_found = nullptr)
::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
- {
- 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; }
+ inline void free (void)
+ { ::free ((void *) arrayZ); arrayZ = nullptr; len = 0; }
template <typename hb_sanitize_context_t>
inline bool sanitize (hb_sanitize_context_t *c) const
template <typename 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 (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>
inline Type *bsearch (const T &x, Type *not_found = nullptr)
{
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
{
if (unlikely (i >= len)) return Null (Type);
inline hb_array_t<const Type> as_array (void) const
{ 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,
unsigned int items_len)
{
inline hb_sorted_array_t<const Type> as_array (void) const
{ 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>
inline Type &bsearch (const T &x, Type ¬_found = Crap (Type))
{ return *as_array ().bsearch (x, ¬_found); }