Dune Core Modules (2.9.0)

direction.hh
1#ifndef DUNE_GRID_SPGRID_DIRECTION_HH
2#define DUNE_GRID_SPGRID_DIRECTION_HH
3
4#include <bitset>
5#include <cassert>
6
8#include <dune/grid/spgrid/multiindex.hh>
9
10namespace Dune
11{
12
13 // SPDirection
14 // -----------
15
16 template< int dim >
17 class SPDirection
18 {
19 typedef SPDirection< dim > This;
20
21 static_assert( (dim >= 0) && (dim < 8*sizeof( unsigned long )), "Invalid dimension." );
22
23 template< int, int >
24 friend class SPDirectionIterator;
25
26 public:
27 static const int dimension = dim;
28
29 explicit SPDirection ( const SPMultiIndex< dimension > &id );
30
31 explicit SPDirection ( unsigned long bits ) : bits_( bits ) {}
32
33 bool operator== ( const This &other ) const { return (bits_ == other.bits_); }
34 bool operator!= ( const This &other ) const { return (bits_ != other.bits_); }
35
36 unsigned int operator[] ( int i ) const { return bits_[ i ]; }
37
38 int mydimension () const { return bits_.count(); }
39 int codimension () const { return dimension - mydimension(); }
40
41 unsigned long bits () const { return bits_.to_ulong(); }
42
43 private:
44 std::bitset< dimension > bits_;
45 };
46
47
48
49 // SPBasicEntityDirection
50 // ----------------------
51
52 template< int dim, int mydim >
53 class SPBasicEntityDirection
54 {
55 typedef SPBasicEntityDirection< dim, mydim > This;
56
57 static_assert( (mydim >= 0) && (mydim <= dim), "Invalid entity dimension." );
58
59 public:
60 static const int dimension = dim;
61
62 typedef SPDirection< dimension > Direction;
63
64 int mydimension () const { return mydim; }
65 };
66
67
68
69 // SPEntityDirection
70 // -----------------
71
72 template< int dim, int mydim >
73 class SPEntityDirection
74 : public SPBasicEntityDirection< dim, mydim >
75 {
76 typedef SPEntityDirection< dim, mydim > This;
77 typedef SPBasicEntityDirection< dim, mydim > Base;
78
79 public:
80 using Base::dimension;
81
82 typedef typename Base::Direction Direction;
83
84 SPEntityDirection () : direction_( 0u ) {}
85 explicit SPEntityDirection ( const SPMultiIndex< dimension > &id ) : direction_( id ) {}
86
87 operator Direction () const { return direction_; }
88
89 private:
90 Direction direction_;
91 };
92
93
94 template< int dim >
95 class SPEntityDirection< dim, 0 >
96 : public SPBasicEntityDirection< dim, 0 >
97 {
98 typedef SPEntityDirection< dim, 0 > This;
99 typedef SPBasicEntityDirection< dim, 0 > Base;
100
101 public:
102 using Base::dimension;
103
104 typedef typename Base::Direction Direction;
105
106 SPEntityDirection () = default;
107 explicit SPEntityDirection ( const SPMultiIndex< dimension > &id ) { assert( Direction( id ) == static_cast< Direction >( This() ) ); }
108
109 operator Direction () const { return Direction( 0u ); }
110 };
111
112
113 template< int dim >
114 class SPEntityDirection< dim, dim >
115 : public SPBasicEntityDirection< dim, dim >
116 {
117 typedef SPEntityDirection< dim, dim > This;
118 typedef SPBasicEntityDirection< dim, dim > Base;
119
120 public:
121 using Base::dimension;
122
123 typedef typename Base::Direction Direction;
124
125 SPEntityDirection () = default;
126 explicit SPEntityDirection ( const SPMultiIndex< dimension > &id ) { assert( Direction( id ) == static_cast< Direction >( This() ) ); }
127
128 operator Direction () const { return Direction( (1u << dim) - 1u ); }
129 };
130
131
132 template< >
133 class SPEntityDirection< 0, 0 >
134 : public SPBasicEntityDirection< 0, 0 >
135 {
136 typedef SPEntityDirection< 0, 0 > This;
137 typedef SPBasicEntityDirection< 0, 0 > Base;
138
139 public:
140 using Base::dimension;
141
142 typedef Base::Direction Direction;
143
144 SPEntityDirection () = default;
145 explicit SPEntityDirection ( const SPMultiIndex< dimension > &id ) { assert( Direction( id ) == static_cast< Direction >( This() ) ); }
146
147 operator Direction () const { return Direction( 0u ); }
148 };
149
150
151
152 // SPDirectionIterator
153 // -------------------
154
155 template< int dim, int codim >
156 class SPDirectionIterator
157 {
158 typedef SPDirectionIterator< dim, codim > This;
159
160 public:
161 typedef SPDirection< dim > Direction;
162
163 SPDirectionIterator () : bits_( (1u << (dim - codim)) - 1u ) {}
164 explicit SPDirectionIterator ( const Direction &direction ) : bits_( direction.bits() ) {}
165
166 SPDirectionIterator ( const This & ) = default;
167 SPDirectionIterator ( This && ) = default;
168
169 This &operator= ( const This & ) = default;
170 This &operator= ( This && ) = default;
171
172 operator bool () const { return (bits_ != ((1u << dim) - (1u << codim) + 1u)); }
173
174 Direction operator* () const { return Direction( bits_ ); }
175
176 const This &operator++ ();
177
178 private:
179 unsigned long bits_;
180 };
181
182
183
184 // Implementation of SPDirection
185 // -----------------------------
186
187 template< int dim >
188 const int SPDirection< dim >::dimension;
189
190
191 template< int dim >
192 inline SPDirection< dim >::SPDirection ( const SPMultiIndex< dimension > &id )
193 {
194 for( int i = 0; i < dimension; ++i )
195 bits_[ i ] = (id[ i ] & 1);
196 }
197
198
199
200 // Implementation of SPBasicEntityDirection
201 // ----------------------------------------
202
203 template< int dim, int mydim >
204 const int SPBasicEntityDirection< dim, mydim >::dimension;
205
206
207
208 // Implementation of SPDirectionIterator
209 // -------------------------------------
210
211 template< int dim, int codim >
212 inline const typename SPDirectionIterator< dim, codim >::This &
213 SPDirectionIterator< dim, codim >::operator++ ()
214 {
215 assert( *this );
216 do {
217 ++bits_;
218 } while( *this && (Direction( bits_ ).mydimension() != (dim - codim)) );
219 return *this;
220 }
221
222} // namespace Dune
223
224#endif // #ifndef DUNE_GRID_SPGRID_DIRECTION_HH
miscellaneous helper functions
EnableIfInterOperable< T1, T2, bool >::type operator==(const ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2, V2, R2, D > &rhs)
Checks for equality.
Definition: iteratorfacades.hh:237
EnableIfInterOperable< T1, T2, bool >::type operator!=(const ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2, V2, R2, D > &rhs)
Checks for inequality.
Definition: iteratorfacades.hh:259
Dune namespace.
Definition: alignedallocator.hh:13
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.111.3 (Jul 15, 22:36, 2024)