70 lines
2.5 KiB
C++
70 lines
2.5 KiB
C++
/*
|
|
* Copyright © 2019,2020 David Corbett
|
|
*
|
|
* 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.
|
|
*/
|
|
|
|
#ifndef HB_OT_SHAPE_COMPLEX_MACHINE_INDEX_HH
|
|
#define HB_OT_SHAPE_COMPLEX_MACHINE_INDEX_HH
|
|
|
|
#include "hb.hh"
|
|
|
|
|
|
template <typename Iter>
|
|
struct machine_index_t :
|
|
hb_iter_with_fallback_t<machine_index_t<Iter>,
|
|
typename Iter::item_t>
|
|
{
|
|
machine_index_t (const Iter& it) : it (it) {}
|
|
machine_index_t (const machine_index_t& o) : it (o.it) {}
|
|
|
|
static constexpr bool is_random_access_iterator = Iter::is_random_access_iterator;
|
|
static constexpr bool is_sorted_iterator = Iter::is_sorted_iterator;
|
|
|
|
typename Iter::item_t __item__ () const { return *it; }
|
|
typename Iter::item_t __item_at__ (unsigned i) const { return it[i]; }
|
|
unsigned __len__ () const { return it.len (); }
|
|
void __next__ () { ++it; }
|
|
void __forward__ (unsigned n) { it += n; }
|
|
void __prev__ () { --it; }
|
|
void __rewind__ (unsigned n) { it -= n; }
|
|
void operator = (unsigned n)
|
|
{ unsigned index = (*it).first; if (index < n) it += n - index; else if (index > n) it -= index - n; }
|
|
void operator = (const machine_index_t& o) { *this = (*o.it).first; }
|
|
bool operator == (const machine_index_t& o) const { return (*it).first == (*o.it).first; }
|
|
bool operator != (const machine_index_t& o) const { return !(*this == o); }
|
|
|
|
private:
|
|
Iter it;
|
|
};
|
|
struct
|
|
{
|
|
template <typename Iter,
|
|
hb_requires (hb_is_iterable (Iter))>
|
|
machine_index_t<hb_iter_type<Iter>>
|
|
operator () (Iter&& it) const
|
|
{ return machine_index_t<hb_iter_type<Iter>> (hb_iter (it)); }
|
|
}
|
|
HB_FUNCOBJ (machine_index);
|
|
|
|
|
|
#endif /* HB_OT_SHAPE_COMPLEX_MACHINE_INDEX_HH */
|