5#ifndef DUNE_DEBUGALIGN_HH
6#define DUNE_DEBUGALIGN_HH
31 std::function<void(
const char*, std::size_t,
const void*)>;
56 inline bool isAligned(
const void *p, std::size_t align)
60 return std::uintptr_t(p) % align == 0;
64 template<std::
size_t align,
class Impl>
67 void checkAlignment()
const
69 auto pimpl =
static_cast<const Impl*
>(
this);
86 namespace AlignedNumberImpl {
88 template<
class T, std::
size_t align = debugAlignment>
95 template<
class T, std::
size_t align>
97 :
public std::true_type {};
100 template<std::
size_t align = debugAlignment,
class T>
109 namespace AlignedNumberImpl {
112 template<
class T, std::
size_t align>
114 :
public AlignedBase<align, AlignedNumber<T, align> >
121 template<
class U, std::size_t uAlign,
122 class = std::enable_if_t<(align >= uAlign) &&
123 std::is_convertible<U, T>::value> >
128 class = std::enable_if_t<std::is_convertible<T, U>::value> >
129 explicit operator U()
const {
return value_; }
131 const T &
value()
const {
return value_; }
135 template<
class charT,
class Traits>
136 friend std::basic_istream<charT, Traits>&
139 return str >> u.value_;
142 template<
class charT,
class Traits>
143 friend std::basic_ostream<charT, Traits>&
144 operator<<(std::basic_ostream<charT, Traits>& str,
147 return str << u.value_;
159 template<class U = T, class = std::void_t<decltype(++std::declval<U&>())> >
162 template<
class U = T,
class = std::void_t<
decltype(--std::declval<U&>())> >
165 template<class U = T, class = std::void_t<decltype(std::declval<U&>()++)> >
166 decltype(
auto)
operator++(
int) {
return aligned<align>(value_++); }
168 template<class U = T, class = std::void_t<decltype(std::declval<U&>()--)> >
169 decltype(
auto)
operator--(
int) {
return aligned<align>(value_--); }
172 template<
class U = T,
173 class = std::void_t<decltype(+std::declval<const U&>())> >
174 decltype(
auto)
operator+()
const {
return aligned<align>(+value_); }
176 template<
class U = T,
177 class = std::void_t<
decltype(-std::declval<const U&>())> >
178 decltype(
auto)
operator-()
const {
return aligned<align>(-value_); }
185# pragma GCC diagnostic push
186# pragma GCC diagnostic ignored "-Wbool-operation"
189# pragma clang diagnostic push
190# pragma clang diagnostic ignored "-Wbool-operation"
192 template<
class U = T,
193 class = std::void_t<decltype(~std::declval<const U&>())> >
194 decltype(
auto)
operator~()
const {
return aligned<align>(~value_); }
196# pragma GCC diagnostic pop
199# pragma clang diagnostic pop
202 template<
class U = T,
203 class = std::void_t<decltype(!std::declval<const U&>())> >
204 decltype(
auto)
operator!()
const {
return aligned<align>(!value_); }
207#define DUNE_ASSIGN_OP(OP) \
208 template<class U, std::size_t uAlign, \
209 class = std::enable_if_t< \
210 ( uAlign <= align && \
211 sizeof(std::declval<T&>() OP std::declval<U>()) ) \
213 AlignedNumber &operator OP(const AlignedNumber<U, uAlign> &u) \
220 class = std::void_t<decltype(std::declval<T&>() OP \
221 std::declval<U>())> > \
222 AlignedNumber &operator OP(const U &u) \
228 static_assert(true, "Require semicolon to unconfuse editors")
248#define DUNE_BINARY_OP(OP) \
249 template<class T, std::size_t tAlign, class U, std::size_t uAlign, \
250 class = std::void_t<decltype(std::declval<T>() \
251 OP std::declval<U>())> > \
253 operator OP(const AlignedNumber<T, tAlign> &t, \
254 const AlignedNumber<U, uAlign> &u) \
257 return aligned<(tAlign > uAlign ? tAlign : uAlign)>(T(t) OP U(u)); \
260 template<class T, class U, std::size_t uAlign, \
261 class = std::void_t<decltype(std::declval<T>() \
262 OP std::declval<U>())> > \
264 operator OP(const T &t, const AlignedNumber<U, uAlign> &u) \
266 return aligned<uAlign>(t OP U(u)); \
269 template<class T, std::size_t tAlign, class U, \
270 class = std::void_t<decltype(std::declval<T>() \
271 OP std::declval<U>())> > \
273 operator OP(const AlignedNumber<T, tAlign> &t, const U &u) \
275 return aligned<tAlign>(T(t) OP u); \
278 static_assert(true, "Require semicolon to unconfuse editors")
310#define DUNE_UNARY_FUNC(name) \
311 template<class T, std::size_t align> \
312 decltype(auto) name(const AlignedNumber<T, align> &u) \
315 return aligned<align>(name(T(u))); \
317 static_assert(true, "Require semicolon to unconfuse editors")
410#undef DUNE_UNARY_FUNC
424 template<
class T, std::
size_t align>
429 return aligned<align>(
max(T(a), T(b)));
432 template<
class T, std::
size_t align>
436 return aligned<align>(
max(a, T(b)));
439 template<
class T, std::
size_t align>
443 return aligned<align>(
max(T(a), b));
446 template<
class T, std::
size_t align>
451 return aligned<align>(
min(T(a), T(b)));
454 template<
class T, std::
size_t align>
458 return aligned<align>(
min(a, T(b)));
461 template<
class T, std::
size_t align>
465 return aligned<align>(
min(T(a), b));
471 template<
class T, std::
size_t align>
472 AlignedNumber<T, align>
480 template<
class T, std::
size_t align>
486 template<
class T, std::
size_t align>
492 template<std::
size_t align>
498 template<std::
size_t align>
506 namespace Overloads {
508 template<
class T, std::
size_t align>
511 template<
class U,
class T, std::
size_t align>
516 template<
class T, std::
size_t align>
519 template<
class T, std::
size_t align>
526 template<
class T, std::
size_t align>
533 template<
class T, std::
size_t align>
539 return mask ? ifTrue : ifFalse;
542 template<std::
size_t align>
Traits for type conversions and type information.
A free function to provide the demangled class name of a given object or type as a string.
#define DUNE_BINARY_OP(OP)
Definition debugalign.hh:248
#define DUNE_UNARY_FUNC(name)
#define DUNE_ASSIGN_OP(OP)
Definition debugalign.hh:207
Default implementations for SIMD Implementations.
Basic definitions for SIMD Implementations.
std::integral_constant< std::size_t, i > index_constant
An index constant with value i.
Definition indices.hh:30
std::ostream & operator<<(std::ostream &s, const bigunsignedint< k > &x)
Definition bigunsignedint.hh:278
Mask< V > mask(ADLTag< 0, std::is_same< V, Mask< V > >::value >, const V &v)
implements Simd::mask()
Definition defaults.hh:153
Dune namespace.
Definition alignedallocator.hh:13
void violatedAlignment(const char *className, std::size_t expectedAlignment, const void *address)
called when an alignment violation is detected
Definition debugalign.cc:39
bool any_true(const AlignedNumber< bool, align > &val)
Definition debugalign.hh:493
bool all_true(const AlignedNumber< bool, align > &val)
Definition debugalign.hh:499
std::string className()
Provide the demangled class name of a type T as a string.
Definition classname.hh:47
static constexpr auto debugAlignment
an alignment large enough to trigger alignment errors
Definition debugalign.hh:84
const T1 cond(bool b, const T1 &v1, const T2 &v2)
conditional evaluate
Definition conditional.hh:28
AlignedNumber< T, align > aligned(T value)
align a value to a certain alignment
Definition debugalign.hh:101
ViolatedAlignmentHandler & violatedAlignmentHandler()
access the handler called by violatedAlignment()
Definition debugalign.cc:33
bool isAligned(const void *p, std::size_t align)
check whether an address conforms to the given alignment
Definition debugalign.hh:56
T max_value(const AlignedNumber< T, align > &val)
Definition debugalign.hh:481
std::function< void(const char *, std::size_t, const void *)> ViolatedAlignmentHandler
type of the handler called by violatedAlignment()
Definition debugalign.hh:31
T min_value(const AlignedNumber< T, align > &val)
Definition debugalign.hh:487
auto min(const AlignedNumber< T, align > &a, const AlignedNumber< T, align > &b)
Definition debugalign.hh:447
auto max(const AlignedNumber< T, align > &a, const AlignedNumber< T, align > &b)
Definition debugalign.hh:425
bool anyTrue(ADLTag< 5 >, const AlignedNumber< bool, align > &mask)
Definition debugalign.hh:543
T & lane(ADLTag< 5 >, std::size_t l, AlignedNumber< T, align > &v)
Definition debugalign.hh:520
Whether this type acts as a scalar in the context of (hierarchically blocked) containers.
Definition typetraits.hh:194
CRTP base mixin class to check alignment.
Definition debugalign.hh:66
~AlignedBase()
Definition debugalign.hh:77
AlignedBase & operator=(AlignedBase &&)=default
AlignedBase(AlignedBase &&)
Definition debugalign.hh:76
AlignedBase & operator=(const AlignedBase &)=default
AlignedBase(const AlignedBase &)
Definition debugalign.hh:75
AlignedBase()
Definition debugalign.hh:74
aligned wrappers for arithmetic types
Definition debugalign.hh:115
decltype(auto) operator+() const
Definition debugalign.hh:174
decltype(auto) operator--(int)
Definition debugalign.hh:169
DUNE_ASSIGN_OP * DUNE_ASSIGN_OP(/=);DUNE_ASSIGN_OP(%=
decltype(auto) operator++(int)
Definition debugalign.hh:166
decltype(auto) operator!() const
Definition debugalign.hh:204
T & value()
Definition debugalign.hh:132
const T & value() const
Definition debugalign.hh:131
DUNE_ASSIGN_OP^ DUNE_ASSIGN_OP(&=);DUNE_ASSIGN_OP(|=
friend std::basic_istream< charT, Traits > & operator>>(std::basic_istream< charT, Traits > &str, AlignedNumber &u)
Definition debugalign.hh:137
decltype(auto) operator~() const
Definition debugalign.hh:194
AlignedNumber(T value)
Definition debugalign.hh:120
AlignedNumber(const AlignedNumber< U, uAlign > &o)
Definition debugalign.hh:124
decltype(auto) operator-() const
Definition debugalign.hh:178
T type
Definition debugalign.hh:509
Tag used to force late-binding lookup in Dune::Simd::Overloads.
Definition base.hh:182
should have a member type type
Definition standard.hh:60
should have a member type type
Definition standard.hh:67
should be derived from a Dune::index_constant
Definition standard.hh:74