From b854d4ff46602104343201361919f30169144cf1 Mon Sep 17 00:00:00 2001 From: David Corbett Date: Fri, 10 May 2019 22:51:49 -0400 Subject: [PATCH] [array] Fix rewinding --- src/hb-array.hh | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) 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) -- 2.7.4