From: David Corbett Date: Sat, 11 May 2019 02:51:49 +0000 (-0400) Subject: [array] Fix rewinding X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=b854d4ff46602104343201361919f30169144cf1;p=platform%2Fupstream%2FlibHarfBuzzSharp.git [array] Fix rewinding --- diff --git a/src/hb-array.hh b/src/hb-array.hh index 003fc5b..705bc6a 100644 --- a/src/hb-array.hh +++ b/src/hb-array.hh @@ -42,20 +42,20 @@ struct hb_array_t : hb_iter_with_fallback_t, Type&> /* * Constructors. */ - hb_array_t () : arrayZ (nullptr), length (0) {} - hb_array_t (Type *array_, unsigned int length_) : arrayZ (array_), length (length_) {} + hb_array_t () : arrayZ (nullptr), length (0), backwards_length (0) {} + hb_array_t (Type *array_, unsigned int length_) : arrayZ (array_), length (length_), backwards_length (0) {} template - hb_array_t (Type (&array_)[length_]) : arrayZ (array_), length (length_) {} + hb_array_t (Type (&array_)[length_]) : arrayZ (array_), length (length_), backwards_length (0) {} template hb_array_t (const hb_array_t &o) : hb_iter_with_fallback_t, Type&> (), - arrayZ (o.arrayZ), length (o.length) {} + arrayZ (o.arrayZ), length (o.length), backwards_length (o.backwards_length) {} template hb_array_t& operator = (const hb_array_t &o) - { arrayZ = o.arrayZ; length = o.length; return *this; } + { arrayZ = o.arrayZ; length = o.length; backwards_length = o.backwards_length; return *this; } /* * Iterator implementation. @@ -72,17 +72,20 @@ struct hb_array_t : hb_iter_with_fallback_t, Type&> if (unlikely (n > length)) n = length; length -= n; + backwards_length += n; arrayZ += n; } void __rewind__ (unsigned n) { - if (unlikely (n > length)) - n = length; - length -= n; + if (unlikely (n > backwards_length)) + n = backwards_length; + length += n; + backwards_length -= n; + arrayZ -= n; } unsigned __len__ () const { return length; } bool operator != (const hb_array_t& o) const - { return arrayZ != o.arrayZ || length != o.length; } + { return arrayZ != o.arrayZ || length != o.length || backwards_length != o.backwards_length; } /* Extra operators. */ @@ -199,6 +202,7 @@ struct hb_array_t : hb_iter_with_fallback_t, Type&> public: Type *arrayZ; unsigned int length; + unsigned int backwards_length; }; template inline hb_array_t hb_array (T *array, unsigned int length)