1#ifndef DUNE_GRID_SPGRID_DIRECTION_HH
2#define DUNE_GRID_SPGRID_DIRECTION_HH
8#include <dune/grid/spgrid/multiindex.hh>
19 typedef SPDirection< dim > This;
21 static_assert( (dim >= 0) && (dim < 8*
sizeof(
unsigned long )),
"Invalid dimension." );
24 friend class SPDirectionIterator;
27 static const int dimension = dim;
31 explicit SPDirection (
unsigned long bits ) : bits_( bits ) {}
33 bool operator== (
const This &other )
const {
return (bits_ == other.bits_); }
34 bool operator!= (
const This &other )
const {
return (bits_ != other.bits_); }
36 unsigned int operator[] (
int i )
const {
return bits_[ i ]; }
38 int mydimension ()
const {
return bits_.count(); }
39 int codimension ()
const {
return dimension - mydimension(); }
41 unsigned long bits ()
const {
return bits_.to_ulong(); }
44 std::bitset< dimension > bits_;
52 template<
int dim,
int mydim >
53 class SPBasicEntityDirection
55 typedef SPBasicEntityDirection< dim, mydim > This;
57 static_assert( (mydim >= 0) && (mydim <= dim),
"Invalid entity dimension." );
60 static const int dimension = dim;
62 typedef SPDirection< dimension > Direction;
64 int mydimension ()
const {
return mydim; }
72 template<
int dim,
int mydim >
73 class SPEntityDirection
74 :
public SPBasicEntityDirection< dim, mydim >
76 typedef SPEntityDirection< dim, mydim > This;
77 typedef SPBasicEntityDirection< dim, mydim > Base;
80 using Base::dimension;
82 typedef typename Base::Direction Direction;
84 SPEntityDirection () : direction_( 0u ) {}
87 operator Direction ()
const {
return direction_; }
95 class SPEntityDirection< dim, 0 >
96 :
public SPBasicEntityDirection< dim, 0 >
98 typedef SPEntityDirection< dim, 0 > This;
99 typedef SPBasicEntityDirection< dim, 0 > Base;
102 using Base::dimension;
104 typedef typename Base::Direction Direction;
106 SPEntityDirection () =
default;
107 explicit SPEntityDirection (
const SPMultiIndex< dimension > &
id ) { assert( Direction(
id ) ==
static_cast< Direction
>( This() ) ); }
109 operator Direction ()
const {
return Direction( 0u ); }
114 class SPEntityDirection< dim, dim >
115 :
public SPBasicEntityDirection< dim, dim >
117 typedef SPEntityDirection< dim, dim > This;
118 typedef SPBasicEntityDirection< dim, dim > Base;
121 using Base::dimension;
123 typedef typename Base::Direction Direction;
125 SPEntityDirection () =
default;
126 explicit SPEntityDirection (
const SPMultiIndex< dimension > &
id ) { assert( Direction(
id ) ==
static_cast< Direction
>( This() ) ); }
128 operator Direction ()
const {
return Direction( (1u << dim) - 1u ); }
133 class SPEntityDirection< 0, 0 >
134 :
public SPBasicEntityDirection< 0, 0 >
136 typedef SPEntityDirection< 0, 0 > This;
137 typedef SPBasicEntityDirection< 0, 0 > Base;
140 using Base::dimension;
142 typedef Base::Direction Direction;
144 SPEntityDirection () =
default;
145 explicit SPEntityDirection (
const SPMultiIndex< dimension > &
id ) { assert( Direction(
id ) ==
static_cast< Direction
>( This() ) ); }
147 operator Direction ()
const {
return Direction( 0u ); }
155 template<
int dim,
int codim >
156 class SPDirectionIterator
158 typedef SPDirectionIterator< dim, codim > This;
161 typedef SPDirection< dim > Direction;
163 SPDirectionIterator () : bits_( (1u << (dim - codim)) - 1u ) {}
164 explicit SPDirectionIterator (
const Direction &direction ) : bits_( direction.bits() ) {}
166 SPDirectionIterator (
const This & ) =
default;
167 SPDirectionIterator ( This && ) =
default;
169 This &operator= (
const This & ) =
default;
170 This &operator= ( This && ) =
default;
172 operator bool ()
const {
return (bits_ != ((1u << dim) - (1u << codim) + 1u)); }
174 Direction operator* ()
const {
return Direction( bits_ ); }
176 const This &operator++ ();
188 const int SPDirection< dim >::dimension;
194 for(
int i = 0; i < dimension; ++i )
195 bits_[ i ] = (
id[ i ] & 1);
203 template<
int dim,
int mydim >
204 const int SPBasicEntityDirection< dim, mydim >::dimension;
211 template<
int dim,
int codim >
212 inline const typename SPDirectionIterator< dim, codim >::This &
213 SPDirectionIterator< dim, codim >::operator++ ()
218 }
while( *
this && (Direction( bits_ ).mydimension() != (dim - codim)) );
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