[meta] fix type traits on gcc 4.9 #3526
Signed-off-by: Thomas Devoogdt <thomas.devoogdt@barco.com>
This commit is contained in:
parent
e4e053c8b3
commit
c657c4e1f8
|
@ -188,6 +188,17 @@ template <> struct hb_int_max<signed long long> : hb_integral_constant<signed l
|
||||||
template <> struct hb_int_max<unsigned long long> : hb_integral_constant<unsigned long long, ULLONG_MAX> {};
|
template <> struct hb_int_max<unsigned long long> : hb_integral_constant<unsigned long long, ULLONG_MAX> {};
|
||||||
#define hb_int_max(T) hb_int_max<T>::value
|
#define hb_int_max(T) hb_int_max<T>::value
|
||||||
|
|
||||||
|
#if __GNUG__ && __GNUC__ < 5
|
||||||
|
#define hb_is_trivially_copyable(T) __has_trivial_copy(T)
|
||||||
|
#define hb_is_trivially_copy_assignable(T) (__has_trivial_copy(T) && __has_trivial_assign(T))
|
||||||
|
#define hb_is_trivially_constructible(T) __has_trivial_constructor(T)
|
||||||
|
#define hb_is_trivially_destructible(T) __has_trivial_destructor(T)
|
||||||
|
#else
|
||||||
|
#define hb_is_trivially_copyable(T) std::is_trivially_copyable<T>::value
|
||||||
|
#define hb_is_trivially_copy_assignable(T) std::is_trivially_copy_assignable<T>::value
|
||||||
|
#define hb_is_trivially_constructible(T) std::is_trivially_constructible<T>::value
|
||||||
|
#define hb_is_trivially_destructible(T) std::is_trivially_destructible<T>::value
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Class traits. */
|
/* Class traits. */
|
||||||
|
|
||||||
|
|
|
@ -33,6 +33,7 @@
|
||||||
#include "hb-blob.hh"
|
#include "hb-blob.hh"
|
||||||
#include "hb-face.hh"
|
#include "hb-face.hh"
|
||||||
#include "hb-machinery.hh"
|
#include "hb-machinery.hh"
|
||||||
|
#include "hb-meta.hh"
|
||||||
#include "hb-subset.hh"
|
#include "hb-subset.hh"
|
||||||
|
|
||||||
|
|
||||||
|
@ -518,7 +519,7 @@ struct UnsizedArrayOf
|
||||||
{
|
{
|
||||||
TRACE_SANITIZE (this);
|
TRACE_SANITIZE (this);
|
||||||
if (unlikely (!sanitize_shallow (c, count))) return_trace (false);
|
if (unlikely (!sanitize_shallow (c, count))) return_trace (false);
|
||||||
if (!sizeof... (Ts) && std::is_trivially_copyable<Type>::value) return_trace (true);
|
if (!sizeof... (Ts) && hb_is_trivially_copyable(Type)) return_trace (true);
|
||||||
for (unsigned int i = 0; i < count; i++)
|
for (unsigned int i = 0; i < count; i++)
|
||||||
if (unlikely (!c->dispatch (arrayZ[i], std::forward<Ts> (ds)...)))
|
if (unlikely (!c->dispatch (arrayZ[i], std::forward<Ts> (ds)...)))
|
||||||
return_trace (false);
|
return_trace (false);
|
||||||
|
@ -707,7 +708,7 @@ struct ArrayOf
|
||||||
{
|
{
|
||||||
TRACE_SANITIZE (this);
|
TRACE_SANITIZE (this);
|
||||||
if (unlikely (!sanitize_shallow (c))) return_trace (false);
|
if (unlikely (!sanitize_shallow (c))) return_trace (false);
|
||||||
if (!sizeof... (Ts) && std::is_trivially_copyable<Type>::value) return_trace (true);
|
if (!sizeof... (Ts) && hb_is_trivially_copyable(Type)) return_trace (true);
|
||||||
unsigned int count = len;
|
unsigned int count = len;
|
||||||
for (unsigned int i = 0; i < count; i++)
|
for (unsigned int i = 0; i < count; i++)
|
||||||
if (unlikely (!c->dispatch (arrayZ[i], std::forward<Ts> (ds)...)))
|
if (unlikely (!c->dispatch (arrayZ[i], std::forward<Ts> (ds)...)))
|
||||||
|
@ -835,7 +836,7 @@ struct HeadlessArrayOf
|
||||||
{
|
{
|
||||||
TRACE_SANITIZE (this);
|
TRACE_SANITIZE (this);
|
||||||
if (unlikely (!sanitize_shallow (c))) return_trace (false);
|
if (unlikely (!sanitize_shallow (c))) return_trace (false);
|
||||||
if (!sizeof... (Ts) && std::is_trivially_copyable<Type>::value) return_trace (true);
|
if (!sizeof... (Ts) && hb_is_trivially_copyable(Type)) return_trace (true);
|
||||||
unsigned int count = get_length ();
|
unsigned int count = get_length ();
|
||||||
for (unsigned int i = 0; i < count; i++)
|
for (unsigned int i = 0; i < count; i++)
|
||||||
if (unlikely (!c->dispatch (arrayZ[i], std::forward<Ts> (ds)...)))
|
if (unlikely (!c->dispatch (arrayZ[i], std::forward<Ts> (ds)...)))
|
||||||
|
@ -884,7 +885,7 @@ struct ArrayOfM1
|
||||||
{
|
{
|
||||||
TRACE_SANITIZE (this);
|
TRACE_SANITIZE (this);
|
||||||
if (unlikely (!sanitize_shallow (c))) return_trace (false);
|
if (unlikely (!sanitize_shallow (c))) return_trace (false);
|
||||||
if (!sizeof... (Ts) && std::is_trivially_copyable<Type>::value) return_trace (true);
|
if (!sizeof... (Ts) && hb_is_trivially_copyable(Type)) return_trace (true);
|
||||||
unsigned int count = lenM1 + 1;
|
unsigned int count = lenM1 + 1;
|
||||||
for (unsigned int i = 0; i < count; i++)
|
for (unsigned int i = 0; i < count; i++)
|
||||||
if (unlikely (!c->dispatch (arrayZ[i], std::forward<Ts> (ds)...)))
|
if (unlikely (!c->dispatch (arrayZ[i], std::forward<Ts> (ds)...)))
|
||||||
|
@ -1070,7 +1071,7 @@ struct VarSizedBinSearchArrayOf
|
||||||
{
|
{
|
||||||
TRACE_SANITIZE (this);
|
TRACE_SANITIZE (this);
|
||||||
if (unlikely (!sanitize_shallow (c))) return_trace (false);
|
if (unlikely (!sanitize_shallow (c))) return_trace (false);
|
||||||
if (!sizeof... (Ts) && std::is_trivially_copyable<Type>::value) return_trace (true);
|
if (!sizeof... (Ts) && hb_is_trivially_copyable(Type)) return_trace (true);
|
||||||
unsigned int count = get_length ();
|
unsigned int count = get_length ();
|
||||||
for (unsigned int i = 0; i < count; i++)
|
for (unsigned int i = 0; i < count; i++)
|
||||||
if (unlikely (!(*this)[i].sanitize (c, std::forward<Ts> (ds)...)))
|
if (unlikely (!(*this)[i].sanitize (c, std::forward<Ts> (ds)...)))
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
|
|
||||||
#include "hb.hh"
|
#include "hb.hh"
|
||||||
#include "hb-array.hh"
|
#include "hb-array.hh"
|
||||||
|
#include "hb-meta.hh"
|
||||||
#include "hb-null.hh"
|
#include "hb-null.hh"
|
||||||
|
|
||||||
|
|
||||||
|
@ -202,14 +203,14 @@ struct hb_vector_t : std::conditional<sorted, hb_vector_t<Type, false>, hb_empty
|
||||||
bool in_error () const { return allocated < 0; }
|
bool in_error () const { return allocated < 0; }
|
||||||
|
|
||||||
template <typename T = Type,
|
template <typename T = Type,
|
||||||
hb_enable_if (std::is_trivially_copy_assignable<T>::value)>
|
hb_enable_if (hb_is_trivially_copy_assignable(T))>
|
||||||
Type *
|
Type *
|
||||||
realloc_vector (unsigned new_allocated)
|
realloc_vector (unsigned new_allocated)
|
||||||
{
|
{
|
||||||
return (Type *) hb_realloc (arrayZ, new_allocated * sizeof (Type));
|
return (Type *) hb_realloc (arrayZ, new_allocated * sizeof (Type));
|
||||||
}
|
}
|
||||||
template <typename T = Type,
|
template <typename T = Type,
|
||||||
hb_enable_if (!std::is_trivially_copy_assignable<T>::value)>
|
hb_enable_if (!hb_is_trivially_copy_assignable(T))>
|
||||||
Type *
|
Type *
|
||||||
realloc_vector (unsigned new_allocated)
|
realloc_vector (unsigned new_allocated)
|
||||||
{
|
{
|
||||||
|
@ -229,7 +230,7 @@ struct hb_vector_t : std::conditional<sorted, hb_vector_t<Type, false>, hb_empty
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T = Type,
|
template <typename T = Type,
|
||||||
hb_enable_if (std::is_trivially_constructible<T>::value ||
|
hb_enable_if (hb_is_trivially_constructible(T) ||
|
||||||
!std::is_default_constructible<T>::value)>
|
!std::is_default_constructible<T>::value)>
|
||||||
void
|
void
|
||||||
grow_vector (unsigned size)
|
grow_vector (unsigned size)
|
||||||
|
@ -238,7 +239,7 @@ struct hb_vector_t : std::conditional<sorted, hb_vector_t<Type, false>, hb_empty
|
||||||
length = size;
|
length = size;
|
||||||
}
|
}
|
||||||
template <typename T = Type,
|
template <typename T = Type,
|
||||||
hb_enable_if (!std::is_trivially_constructible<T>::value &&
|
hb_enable_if (!hb_is_trivially_constructible(T) &&
|
||||||
std::is_default_constructible<T>::value)>
|
std::is_default_constructible<T>::value)>
|
||||||
void
|
void
|
||||||
grow_vector (unsigned size)
|
grow_vector (unsigned size)
|
||||||
|
@ -251,14 +252,14 @@ struct hb_vector_t : std::conditional<sorted, hb_vector_t<Type, false>, hb_empty
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T = Type,
|
template <typename T = Type,
|
||||||
hb_enable_if (std::is_trivially_destructible<T>::value)>
|
hb_enable_if (hb_is_trivially_destructible(T))>
|
||||||
void
|
void
|
||||||
shrink_vector (unsigned size)
|
shrink_vector (unsigned size)
|
||||||
{
|
{
|
||||||
length = size;
|
length = size;
|
||||||
}
|
}
|
||||||
template <typename T = Type,
|
template <typename T = Type,
|
||||||
hb_enable_if (!std::is_trivially_destructible<T>::value)>
|
hb_enable_if (!hb_is_trivially_destructible(T))>
|
||||||
void
|
void
|
||||||
shrink_vector (unsigned size)
|
shrink_vector (unsigned size)
|
||||||
{
|
{
|
||||||
|
@ -270,7 +271,7 @@ struct hb_vector_t : std::conditional<sorted, hb_vector_t<Type, false>, hb_empty
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T = Type,
|
template <typename T = Type,
|
||||||
hb_enable_if (std::is_trivially_copy_assignable<T>::value)>
|
hb_enable_if (hb_is_trivially_copy_assignable(T))>
|
||||||
void
|
void
|
||||||
shift_down_vector (unsigned i)
|
shift_down_vector (unsigned i)
|
||||||
{
|
{
|
||||||
|
@ -279,7 +280,7 @@ struct hb_vector_t : std::conditional<sorted, hb_vector_t<Type, false>, hb_empty
|
||||||
(length - i) * sizeof (Type));
|
(length - i) * sizeof (Type));
|
||||||
}
|
}
|
||||||
template <typename T = Type,
|
template <typename T = Type,
|
||||||
hb_enable_if (!std::is_trivially_copy_assignable<T>::value)>
|
hb_enable_if (!hb_is_trivially_copy_assignable(T))>
|
||||||
void
|
void
|
||||||
shift_down_vector (unsigned i)
|
shift_down_vector (unsigned i)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue