Line data Source code
1 : /*
2 : * Copyright (c) 2013-2015: G-CSC, Goethe University Frankfurt
3 : * Author: Sebastian Reiter
4 : *
5 : * This file is part of UG4.
6 : *
7 : * UG4 is free software: you can redistribute it and/or modify it under the
8 : * terms of the GNU Lesser General Public License version 3 (as published by the
9 : * Free Software Foundation) with the following additional attribution
10 : * requirements (according to LGPL/GPL v3 §7):
11 : *
12 : * (1) The following notice must be displayed in the Appropriate Legal Notices
13 : * of covered and combined works: "Based on UG4 (www.ug4.org/license)".
14 : *
15 : * (2) The following notice must be displayed at a prominent place in the
16 : * terminal output of covered works: "Based on UG4 (www.ug4.org/license)".
17 : *
18 : * (3) The following bibliography is recommended for citation and must be
19 : * preserved in all covered files:
20 : * "Reiter, S., Vogel, A., Heppner, I., Rupp, M., and Wittum, G. A massively
21 : * parallel geometric multigrid solver on hierarchically distributed grids.
22 : * Computing and visualization in science 16, 4 (2013), 151-164"
23 : * "Vogel, A., Reiter, S., Rupp, M., Nägel, A., and Wittum, G. UG4 -- a novel
24 : * flexible software system for simulating pde based models on high performance
25 : * computers. Computing and visualization in science 16, 4 (2013), 165-179"
26 : *
27 : * This program is distributed in the hope that it will be useful,
28 : * but WITHOUT ANY WARRANTY; without even the implied warranty of
29 : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
30 : * GNU Lesser General Public License for more details.
31 : */
32 :
33 : #ifndef __H__UG__ntree_iterator__
34 : #define __H__UG__ntree_iterator__
35 :
36 : #include <cassert>
37 :
38 : namespace ug{
39 :
40 : /// this iterator is used by the ntree class to provide access to the elements of a given node
41 : template <class elem_t, class entry_t>
42 : class const_ntree_element_iterator
43 : {
44 : public:
45 : typedef const_ntree_element_iterator this_type;
46 : typedef std::forward_iterator_tag iterator_category;
47 : typedef size_t difference_type;
48 : typedef elem_t* pointer;
49 : typedef elem_t value_type;
50 : typedef value_type& reference;
51 :
52 : const_ntree_element_iterator() : m_entries(NULL), m_entryInd(s_invalidIndex) {}
53 : const_ntree_element_iterator(const entry_t* entries, size_t entryInd) :
54 : m_entries(entries), m_entryInd(entryInd) {}
55 :
56 0 : this_type operator ++() {increment(); return *this;}
57 : this_type operator ++(int unused) {this_type i = *this; increment(); return i;}
58 :
59 : bool operator ==(const this_type& iter) const {return equal(iter);}
60 : bool operator !=(const this_type& iter) const {return !equal(iter);}
61 :
62 : value_type operator *() const
63 : {
64 : assert(m_entryInd != s_invalidIndex);
65 0 : return m_entries[m_entryInd].elem;
66 : }
67 :
68 : private:
69 : inline bool equal(const this_type& other) const
70 : {
71 : return m_entryInd == other.m_entryInd;
72 : }
73 :
74 : void increment()
75 : {
76 : assert(m_entries);
77 : assert(m_entryInd != s_invalidIndex);
78 0 : m_entryInd = m_entries[m_entryInd].nextEntryInd;
79 : }
80 :
81 : /// marks an index as invalid
82 : static const size_t s_invalidIndex = -1;
83 :
84 : const entry_t* m_entries;
85 : size_t m_entryInd;
86 : };
87 :
88 : }// end of namespace
89 :
90 : #endif
|