5#ifndef DUNE_GRID_CONCEPTS_INDEX_SET_HH 
    6#define DUNE_GRID_CONCEPTS_INDEX_SET_HH 
   11#include <dune/common/indices.hh> 
   12#include <dune/common/concepts/container.hh> 
   13#include <dune/common/concepts/hashable.hh> 
   15#include <dune/grid/concepts/entity.hh> 
   20  template<
class IS, 
int codim>
 
   21  concept IndexSetEntityCodim = Entity<typename IS::template Codim<codim>::Entity> &&
 
   22    requires(
const IS is, 
int i, 
unsigned int cc, 
const typename IS::template Codim<codim>::Entity& entity)
 
   24    { is.template index<codim>(entity)         } -> std::same_as<typename IS::IndexType>;
 
   25    { is.index(entity)                         } -> std::same_as<typename IS::IndexType>;
 
   26    { is.template subIndex<codim>(entity,i,cc) } -> std::same_as<typename IS::IndexType>;
 
   27    { is.subIndex(entity,i,cc)                 } -> std::same_as<typename IS::IndexType>;
 
   28    { is.contains(entity)                      } -> std::convertible_to<bool>;
 
   31  template<
class IS, std::size_t... c>
 
   32  void indexSetEntityAllCodims(std::integer_sequence<std::size_t,c...>)
 
   33    requires (IndexSetEntityCodim<IS,int(c)> &&...);
 
   46  { IS::dimension   } -> std::convertible_to<int>;
 
   48  requires RandomAccessContainer<typename IS::Types>;
 
   49  { is.types(codim) } -> std::convertible_to<typename IS::Types>;
 
   51  requires std::integral<typename IS::IndexType>;
 
   52  { is.size(type)   } -> std::convertible_to<typename IS::IndexType>;
 
   53  { is.size(codim)  } -> std::convertible_to<typename IS::IndexType>;
 
   55Impl::IndexSetEntityCodim<IS,0> &&
 
   57  Impl::indexSetEntityAllCodims<IS>(
range(from, to).to_integer_sequence());
 
   62  template<
class IS, 
int codim>
 
   66    { is.template id<codim>(entity) } -> std::same_as<typename IS::IdType>;
 
   67    { is.id(entity)                 } -> std::same_as<typename IS::IdType>;
 
   70  template<
class IS, std::size_t... c>
 
   71  void idSetEntityAllCodims(std::integer_sequence<std::size_t,c...>)
 
   72    requires (IdSetEntityCodim<IS,int(c)> &&...);
 
   83concept IdSet = 
requires(
const IS is, 
const typename IS::template Codim<0>::Entity& entity, 
int i, 
unsigned int cc)
 
   85  requires Hashable<typename IS::IdType>;
 
   86  requires std::totally_ordered<typename IS::IdType>;
 
   87  { is.subId(entity,i,cc) } -> std::same_as<typename IS::IdType>;
 
   89Impl::IdSetEntityCodim<IS,0> &&
 
   91  Impl::idSetEntityAllCodims<IS>(
range(from, to).to_integer_sequence());
 
Wrapper class for entities.
Definition: entity.hh:66
 
Unique label for each type of entities that can occur in DUNE grids.
Definition: type.hh:114
 
Model of an id set.
Definition: indexidset.hh:83
 
Model of an index set.
Definition: indexidset.hh:44
 
std::integral_constant< std::size_t, i > index_constant
An index constant with value i.
Definition: indices.hh:29
 
static constexpr IntegralRange< std::decay_t< T > > range(T &&from, U &&to) noexcept
free standing function for setting up a range based for loop over an integer range for (auto i: range...
Definition: rangeutilities.hh:288
 
Namespace for concepts.
Definition: concept.hh:34
 
Static tag representing a codimension.
Definition: dimension.hh:24
 
A unique label for each type of element that can occur in a grid.