diff --git a/src/Makefile.sources b/src/Makefile.sources index fb4e4a2c4..80b8e261c 100644 --- a/src/Makefile.sources +++ b/src/Makefile.sources @@ -14,6 +14,7 @@ HB_BASE_sources = \ hb-face.cc \ hb-font-private.hh \ hb-font.cc \ + hb-iter-private.hh \ hb-map-private.hh \ hb-map.cc \ hb-machinery-private.hh \ diff --git a/src/hb-iter-private.hh b/src/hb-iter-private.hh new file mode 100644 index 000000000..a22675cd7 --- /dev/null +++ b/src/hb-iter-private.hh @@ -0,0 +1,147 @@ +/* + * Copyright © 2018 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Google Author(s): Behdad Esfahbod + */ + +#ifndef HB_ITER_PRIVATE_HH +#define HB_ITER_PRIVATE_HH + +#include "hb-private.hh" + + +/* Unified iterator object. + * + * The goal of this template is to make the same iterator interface + * available to all types, and make it very easy and compact to use. + * Iterator objects are small, light-weight, objects that can be + * copied by value. If the collection / object being iterated on + * is writable, then the iterator points to lvalues, otherwise it + * returns rvalues. + * + * The way to declare, initialize, and use iterators, eg.: + * + * Iter s (src); + * Iter t (dst); + * for (; s && t; s++, t++) + * *s = *t; + */ + +template +struct Iter; + +template +struct Iter +{ + inline Iter (const T &c); +}; + +template +struct Iter +{ + /* Type of items. */ + typedef T Value; + + /* Constructors. */ + inline Iter (T *array_, int length_) : + array (array_), length (MAX (length_, 0)) {} + template + inline Iter (T (&array_)[length_]) : + array (array_), length (length_) {} + + /* Emptiness. */ + inline operator bool (void) const { return bool (length); } + + /* Current item. */ + inline T &operator * (void) + { + if (unlikely (!length)) return CrapOrNull(T); + return *array; + } + inline T &operator -> (void) + { + return (operator *); + } + + /* Next. */ + inline Iter & operator ++ (void) + { + if (unlikely (!length)) return *this; + array++; + length--; + return *this; + } + /* Might return void, or a copy of pre-increment iterator. */ + inline void operator ++ (int) + { + if (unlikely (!length)) return; + array++; + length--; + } + + /* Some iterators might implement len(). */ + inline unsigned int len (void) const { return length; } + + /* Some iterators might implement fast-forward. + * Only implement it if it's constant-time. */ + inline void operator += (unsigned int n) + { + n = MIN (n, length); + array += n; + length -= n; + } + + /* Some iterators might implement random-access. + * Only implement it if it's constant-time. */ + inline Iter & operator [] (unsigned int i) + { + if (unlikely (i >= length)) return CrapOrNull(T); + return array[i]; + } + + private: + T *array; + unsigned int length; +}; + +/* XXX Remove + * Just to test these compile. */ +static inline void +m (void) +{ + const int src[10] = {}; + int dst[20]; + + Iter s (src); + Iter s2 (src, 5); + Iter t (dst); + + s2 = s; + + for (; s && t; s++, t++) + { + *t = *s; + } +} + +#endif /* HB_ITER_PRIVATE_HH */ diff --git a/src/hb-machinery-private.hh b/src/hb-machinery-private.hh index 5fafadbec..649788c16 100644 --- a/src/hb-machinery-private.hh +++ b/src/hb-machinery-private.hh @@ -30,6 +30,7 @@ #define HB_MACHINERY_PRIVATE_HH #include "hb-private.hh" +#include "hb-iter-private.hh" namespace OT {