blob: ce88bc2b2dc9cb1526f99b31a4d1d584330273f6 [file] [log] [blame]
/* PR 16688. Test provided by Wolfgang Bangerth. The alias analyzer
was aborting when trying to group aliases. */
/* { dg-do compile } */
/* { dg-options "-O2" } */
template<typename _Tp>
struct iterator_traits;
template<typename _Tp>
struct iterator_traits<_Tp*> {
typedef _Tp& reference;
};
template<typename _Iterator> struct NI {
_Iterator current;
typedef typename iterator_traits<_Iterator>::reference reference;
NI() { }
NI(const _Iterator& __i) : current(__i) { }
reference operator*() const { return *current; }
NI& operator++() { return *this; }
const _Iterator& base() const { return current; }
};
template<typename _IteratorL, typename _IteratorR>
inline int
operator-(const NI<_IteratorL>& __lhs,
const NI<_IteratorR>& __rhs)
{ return __lhs.base() - __rhs.base(); }
template<typename _II, typename _OI>
inline _OI
__copy_aux(_II __first, _II __last, _OI __result)
{
struct __copy {
static _OI
copy(_II __first, _II __last, _OI __result)
{
for (; __first != __last; ++__result, ++__first)
*__result = *__first;
return __result;
}
};
return __copy::copy(__first, __last, __result);
}
struct __copy_normal
{
template<typename _II, typename _OI>
static _OI
copy_n(_II __first, _II __last, _OI __result)
{
return __copy_aux(__first, __last, __result);
}
};
template<typename _InputIterator, typename _OutputIterator>
inline _OutputIterator
copy(_InputIterator __first, _InputIterator __last,
_OutputIterator __result)
{
return __copy_normal::copy_n(__first, __last, __result);
}
template <typename T, typename U, typename V>
void uninitialized_fill_n(T,U,V);
template<typename _Tp>
struct _Vector_base {
struct _Vector_impl {
_Tp* start;
_Tp* finish;
_Tp* end_of_storage;
_Vector_impl() : start(0), finish(0), end_of_storage(0)
{ }
} impl;
_Vector_base(unsigned __n) {
impl.start = allocate(__n);
impl.finish = impl.start;
impl.end_of_storage = impl.start + __n;
}
~_Vector_base() {
deallocate(impl.start,
impl.end_of_storage - impl.start);
}
_Tp* allocate(unsigned __n);
void deallocate(_Tp* __p, unsigned __n);
NI<_Tp*> begin() { return NI<_Tp*> (impl.start); }
};
template<typename _Tp>
struct vector : _Vector_base<_Tp>
{
vector(int __n)
: _Vector_base<_Tp>(__n)
{
uninitialized_fill_n(this->impl.start, __n, _Tp());
}
};
struct Tensor
{
Tensor ();
Tensor (const Tensor &);
double values[2];
};
inline
Tensor::Tensor (const Tensor &p)
{
for (unsigned int i=0; i<2; ++i)
values[i] = p.values[i];
}
struct TriaAccessor
{
typedef void * AccessorData;
void copy_from (const TriaAccessor &);
void operator = (const TriaAccessor *);
TriaAccessor & operator = (const TriaAccessor &);
bool operator == (const TriaAccessor &) const;
bool operator != (const TriaAccessor &) const;
void operator ++ ();
int state () const;
bool used () const;
int present_level;
int present_index;
int** levels;
};
inline int TriaAccessor::state () const {
if ((present_level>=0) && (present_index>=0))
return 0;
else
if ((present_level==-1) && (present_index==-1))
return 1;
else
return 2;
}
inline
void TriaAccessor::operator ++ () {
++this->present_index;
while (this->present_index >=
static_cast<int>(*this->levels[this->present_level]))
{
++this->present_level;
this->present_index = 0;
if (this->present_level >= static_cast<int>(1))
{
this->present_level = this->present_index = -1;
return;
}
}
}
struct MGDoFObjectAccessor : TriaAccessor {};
struct TriaRawIterator
{
TriaRawIterator ();
TriaRawIterator (const TriaRawIterator &);
TriaRawIterator (const MGDoFObjectAccessor &a);
const MGDoFObjectAccessor & operator * () const;
MGDoFObjectAccessor & operator * ();
const MGDoFObjectAccessor * operator -> () const;
MGDoFObjectAccessor * operator -> ();
TriaRawIterator & operator = (const TriaRawIterator &);
bool operator == (const TriaRawIterator &) const;
bool operator != (const TriaRawIterator &) const;
bool operator < (const TriaRawIterator &) const;
MGDoFObjectAccessor accessor;
TriaRawIterator & operator ++ ();
};
struct TriaIterator : TriaRawIterator
{
TriaIterator ();
TriaIterator (const TriaIterator &i);
TriaIterator &
operator = (const TriaIterator &);
TriaIterator &
operator = (const TriaRawIterator &);
};
inline
TriaRawIterator::TriaRawIterator (const TriaRawIterator &i) :
accessor (i.accessor) {}
inline
TriaIterator::TriaIterator (const TriaIterator &i) :
TriaRawIterator (static_cast<TriaRawIterator >(i)) {}
inline
TriaRawIterator & TriaRawIterator::operator ++ () {
while (++accessor, (this->accessor.state() == 0))
if (this->accessor.used() == true)
return *this;
return *this;
}
struct Comp {
Comp (const Tensor &dir) : dir(dir) {}
bool operator () (const TriaIterator &c1, const TriaIterator &c2) const;
const Tensor dir;
};
template<typename Iter>
void x1(Iter first, Iter last, int i, Comp comp)
{
x1(Iter(), last, i, comp);
}
template<typename Iter>
inline void x2(Iter first, Iter last, Comp comp)
{
if (first.base() != last.base())
x1(first, last, (last - first), comp);
}
void downstream_dg (const Tensor& direction)
{
vector<TriaIterator> ordered_cells(13);
const Comp comparator(direction);
TriaIterator begin, end;
copy (begin, end, ordered_cells.begin());
x2 (ordered_cells.begin(), ordered_cells.begin(), comparator);
}