pr16688.C revision 1.1.1.1
1/* PR 16688.  Test provided by Wolfgang Bangerth.  The alias analyzer
2   was aborting when trying to group aliases.  */
3
4/* { dg-do compile } */
5/* { dg-options "-O2" } */
6
7template<typename _Tp>
8struct iterator_traits;
9
10template<typename _Tp>
11struct iterator_traits<_Tp*> {
12    typedef _Tp& reference;
13};
14
15template<typename _Iterator> struct NI {
16    _Iterator current;
17
18    typedef typename iterator_traits<_Iterator>::reference reference;
19
20    NI() { }
21
22    NI(const _Iterator& __i) : current(__i) { }
23
24    reference operator*() const { return *current; }
25
26    NI& operator++() { return *this; }
27
28    const _Iterator& base() const { return current; }
29};
30
31template<typename _IteratorL, typename _IteratorR>
32inline int
33operator-(const NI<_IteratorL>& __lhs,
34          const NI<_IteratorR>& __rhs)
35{ return __lhs.base() - __rhs.base(); }
36
37
38template<typename _II, typename _OI>
39inline _OI
40__copy_aux(_II __first, _II __last, _OI __result)
41{
42  struct __copy {
43      static _OI
44      copy(_II __first, _II __last, _OI __result)
45        {
46          for (; __first != __last; ++__result, ++__first)
47            *__result = *__first;
48          return __result;
49        }
50  };
51
52  return __copy::copy(__first, __last, __result);
53}
54
55struct __copy_normal
56{
57    template<typename _II, typename _OI>
58    static _OI
59    copy_n(_II __first, _II __last, _OI __result)
60      {
61        return __copy_aux(__first, __last, __result);
62      }
63};
64template<typename _InputIterator, typename _OutputIterator>
65inline _OutputIterator
66copy(_InputIterator __first, _InputIterator __last,
67     _OutputIterator __result)
68{
69  return __copy_normal::copy_n(__first, __last, __result);
70}
71
72template <typename T, typename U, typename V>
73void uninitialized_fill_n(T,U,V);
74
75
76template<typename _Tp>
77struct _Vector_base {
78    struct _Vector_impl {
79        _Tp* start;
80        _Tp* finish;
81        _Tp* end_of_storage;
82        _Vector_impl() : start(0), finish(0), end_of_storage(0)
83          { }
84    } impl;
85
86    _Vector_base(unsigned __n) {
87      impl.start = allocate(__n);
88      impl.finish = impl.start;
89      impl.end_of_storage = impl.start + __n;
90    }
91
92    ~_Vector_base() {
93      deallocate(impl.start,
94                    impl.end_of_storage - impl.start);
95    }
96
97    _Tp* allocate(unsigned __n);
98
99    void deallocate(_Tp* __p, unsigned __n);
100
101    NI<_Tp*> begin() { return NI<_Tp*> (impl.start); }
102};
103
104
105template<typename _Tp>
106struct vector : _Vector_base<_Tp>
107{
108    vector(int __n)
109                    : _Vector_base<_Tp>(__n)
110      {
111        uninitialized_fill_n(this->impl.start, __n, _Tp());
112      }
113};
114
115
116
117struct Tensor
118{
119    Tensor ();
120    Tensor (const Tensor &);
121
122    double values[2];
123};
124
125
126inline
127Tensor::Tensor (const Tensor &p)
128{
129  for (unsigned int i=0; i<2; ++i)
130    values[i] = p.values[i];
131}
132
133
134struct TriaAccessor
135{
136    typedef void * AccessorData;
137
138    void copy_from (const TriaAccessor &);
139    void operator = (const TriaAccessor *);
140
141    TriaAccessor & operator = (const TriaAccessor &);
142
143    bool operator == (const TriaAccessor &) const;
144
145    bool operator != (const TriaAccessor &) const;
146    void operator ++ ();
147
148    int state () const;
149    bool used () const;
150
151    int present_level;
152    int present_index;
153    int** levels;
154};
155
156inline int TriaAccessor::state () const {
157  if ((present_level>=0) && (present_index>=0))
158    return 0;
159  else
160    if ((present_level==-1) && (present_index==-1))
161      return 1;
162    else
163      return 2;
164}
165
166
167inline
168void TriaAccessor::operator ++ () {
169  ++this->present_index;
170
171  while (this->present_index >=
172         static_cast<int>(*this->levels[this->present_level]))
173    {
174      ++this->present_level;
175      this->present_index = 0;
176
177      if (this->present_level >= static_cast<int>(1))
178        {
179
180          this->present_level = this->present_index = -1;
181          return;
182        }
183    }
184}
185
186struct MGDoFObjectAccessor : TriaAccessor {};
187
188
189
190struct TriaRawIterator
191{
192    TriaRawIterator ();
193
194    TriaRawIterator (const TriaRawIterator &);
195    TriaRawIterator (const MGDoFObjectAccessor &a);
196    const MGDoFObjectAccessor & operator * () const;
197
198    MGDoFObjectAccessor & operator * ();
199    const MGDoFObjectAccessor * operator -> () const;
200
201    MGDoFObjectAccessor * operator -> ();
202
203    TriaRawIterator & operator = (const TriaRawIterator &);
204
205    bool operator == (const TriaRawIterator &) const;
206    bool operator != (const TriaRawIterator &) const;
207    bool operator < (const TriaRawIterator &) const;
208    MGDoFObjectAccessor accessor;
209
210    TriaRawIterator & operator ++ ();
211};
212
213struct TriaIterator : TriaRawIterator
214{
215    TriaIterator ();
216
217    TriaIterator (const TriaIterator &i);
218
219    TriaIterator &
220    operator = (const TriaIterator &);
221
222    TriaIterator &
223    operator = (const TriaRawIterator &);
224};
225
226
227inline
228TriaRawIterator::TriaRawIterator (const TriaRawIterator &i) :
229                accessor (i.accessor) {}
230
231inline
232TriaIterator::TriaIterator (const TriaIterator &i) :
233                TriaRawIterator (static_cast<TriaRawIterator >(i)) {}
234
235inline
236TriaRawIterator & TriaRawIterator::operator ++ () {
237  while (++accessor, (this->accessor.state() == 0))
238    if (this->accessor.used() == true)
239      return *this;
240  return *this;
241}
242
243struct Comp {
244    Comp (const Tensor &dir) : dir(dir) {}
245
246    bool operator () (const TriaIterator &c1, const TriaIterator &c2) const;
247    const Tensor dir;
248};
249
250
251template<typename Iter>
252void x1(Iter first, Iter last, int i, Comp comp)
253{
254  x1(Iter(), last, i, comp);
255}
256
257template<typename Iter>
258inline void x2(Iter first, Iter last, Comp comp)
259{
260  if (first.base() != last.base())
261    x1(first, last, (last - first), comp);
262}
263
264void downstream_dg (const Tensor& direction)
265{
266  vector<TriaIterator> ordered_cells(13);
267  const Comp comparator(direction);
268
269  TriaIterator begin, end;
270
271  copy (begin, end, ordered_cells.begin());
272  x2 (ordered_cells.begin(), ordered_cells.begin(), comparator);
273}
274