提交 f8a0ec50 编写于 作者: B Behdad Esfahbod

[set] Add fallback implementation of int-vector type

上级 deed4a48
...@@ -35,31 +35,64 @@ ...@@ -35,31 +35,64 @@
* hb_set_t * hb_set_t
*/ */
struct Union struct HbOpOr
{ {
static const bool passthru_left = true; static const bool passthru_left = true;
static const bool passthru_right = true; static const bool passthru_right = true;
template <typename T> static void process (T &o, const T &a, const T &b) { o = a | b; } template <typename T> static void process (T &o, const T &a, const T &b) { o = a | b; }
}; };
struct Intersect struct HbOpAnd
{ {
static const bool passthru_left = false; static const bool passthru_left = false;
static const bool passthru_right = false; static const bool passthru_right = false;
template <typename T> static void process (T &o, const T &a, const T &b) { o = a & b; } template <typename T> static void process (T &o, const T &a, const T &b) { o = a & b; }
}; };
struct Subtract struct HbOpMinus
{ {
static const bool passthru_left = true; static const bool passthru_left = true;
static const bool passthru_right = false; static const bool passthru_right = false;
template <typename T> static void process (T &o, const T &a, const T &b) { o = a & ~b; } template <typename T> static void process (T &o, const T &a, const T &b) { o = a & ~b; }
}; };
struct SymmetricDifference struct HbOpXor
{ {
static const bool passthru_left = true; static const bool passthru_left = true;
static const bool passthru_right = true; static const bool passthru_right = true;
template <typename T> static void process (T &o, const T &a, const T &b) { o = a ^ b; } template <typename T> static void process (T &o, const T &a, const T &b) { o = a ^ b; }
}; };
template <typename elt_t, unsigned int byte_size>
struct vector_like_t
{
elt_t& operator [] (unsigned int i) { return v[i]; }
const elt_t& operator [] (unsigned int i) const { return v[i]; }
template <class Op>
inline vector_like_t process (const vector_like_t &o) const
{
vector_like_t r;
for (unsigned int i = 0; i < ARRAY_LENGTH (v); i++)
Op::process (r.v[i], v[i], o.v[i]);
return r;
}
inline vector_like_t operator | (const vector_like_t &o) const
{ return process<HbOpOr> (o); }
inline vector_like_t operator & (const vector_like_t &o) const
{ return process<HbOpAnd> (o); }
inline vector_like_t operator ^ (const vector_like_t &o) const
{ return process<HbOpXor> (o); }
inline vector_like_t operator ~ () const
{
vector_like_t r;
for (unsigned int i = 0; i < ARRAY_LENGTH (v); i++)
r.v[i] = ~v[i];
return r;
}
private:
static_assert (byte_size / sizeof (elt_t) * sizeof (elt_t) == byte_size);
elt_t v[byte_size / sizeof (elt_t)];
};
struct hb_set_t struct hb_set_t
{ {
struct page_map_t struct page_map_t
...@@ -156,22 +189,15 @@ struct hb_set_t ...@@ -156,22 +189,15 @@ struct hb_set_t
return 0; return 0;
} }
typedef uint64_t elt_t;
static const unsigned int PAGE_BITS = 512; /* Use to tune. */ static const unsigned int PAGE_BITS = 512; /* Use to tune. */
static_assert ((PAGE_BITS & ((PAGE_BITS) - 1)) == 0, ""); static_assert ((PAGE_BITS & ((PAGE_BITS) - 1)) == 0, "");
#if 1 typedef uint64_t elt_t;
#if 0
typedef elt_t vector_t __attribute__((vector_size (PAGE_BITS / 8))); typedef elt_t vector_t __attribute__((vector_size (PAGE_BITS / 8)));
#else #else
struct vector_t typedef vector_like_t<elt_t, PAGE_BITS / 8> vector_t;
{
elt_t& operator [] (unsigned int i) { return v[i]; }
const elt_t& operator [] (unsigned int i) const { return v[i]; }
private:
elt_t v[PAGE_BITS / (sizeof (elt_t) * 8)];
};
#endif #endif
vector_t v; vector_t v;
...@@ -383,19 +409,19 @@ struct hb_set_t ...@@ -383,19 +409,19 @@ struct hb_set_t
inline void union_ (const hb_set_t *other) inline void union_ (const hb_set_t *other)
{ {
process<Union> (other); process<HbOpOr> (other);
} }
inline void intersect (const hb_set_t *other) inline void intersect (const hb_set_t *other)
{ {
process<Intersect> (other); process<HbOpAnd> (other);
} }
inline void subtract (const hb_set_t *other) inline void subtract (const hb_set_t *other)
{ {
process<Subtract> (other); process<HbOpMinus> (other);
} }
inline void symmetric_difference (const hb_set_t *other) inline void symmetric_difference (const hb_set_t *other)
{ {
process<SymmetricDifference> (other); process<HbOpXor> (other);
} }
inline bool next (hb_codepoint_t *codepoint) const inline bool next (hb_codepoint_t *codepoint) const
{ {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册