pr16688.C   [plain text]


/* 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);
}