Dune Core Modules (unstable)

indexidset.hh
1// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file LICENSE.md in module root
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
4// vi: set et ts=4 sw=2 sts=2:
5#ifndef DUNE_GRID_CONCEPTS_INDEX_SET_HH
6#define DUNE_GRID_CONCEPTS_INDEX_SET_HH
7
8#include <concepts>
9#include <type_traits>
10
11#include <dune/common/indices.hh>
12#include <dune/common/concepts/container.hh>
13#include <dune/common/concepts/hashable.hh>
14#include <dune/geometry/type.hh>
15#include <dune/grid/concepts/entity.hh>
16
17namespace Dune::Concept {
18namespace Impl {
19
20 // only check if Codim<cd>::Entity exists
21 template<class IS, int codim>
22 concept IndexSetEntityCodim =
23 (
24 !requires
25 {
26 typename IS::template Codim<codim>::Entity;
27 }
28 ) || (
29 Entity<typename IS::template Codim<codim>::Entity> &&
30 requires(const IS is, int i, unsigned int cc, const typename IS::template Codim<codim>::Entity& entity)
31 {
32 { is.template index<codim>(entity) } -> std::same_as<typename IS::IndexType>;
33 { is.index(entity) } -> std::same_as<typename IS::IndexType>;
34 { is.template subIndex<codim>(entity,i,cc) } -> std::same_as<typename IS::IndexType>;
35 { is.subIndex(entity,i,cc) } -> std::same_as<typename IS::IndexType>;
36 { is.contains(entity) } -> std::convertible_to<bool>;
37 }
38 );
39
40 template<class IS, std::size_t... c>
41 void indexSetEntityAllCodims(std::integer_sequence<std::size_t,c...>)
42 requires (IndexSetEntityCodim<IS,int(c)> &&...);
43
44} // end namespace Impl
45
54template<class IS>
55concept IndexSet = requires(const IS is, Dune::GeometryType type, int codim)
56{
57 { IS::dimension } -> std::convertible_to<int>;
58
59 requires RandomAccessContainer<typename IS::Types>;
60 { is.types(codim) } -> std::convertible_to<typename IS::Types>;
61
62 requires std::integral<typename IS::IndexType>;
63 { is.size(type) } -> std::convertible_to<typename IS::IndexType>;
64 { is.size(codim) } -> std::convertible_to<typename IS::IndexType>;
65} &&
66Impl::IndexSetEntityCodim<IS,0> &&
68 Impl::indexSetEntityAllCodims<IS>(range(from, to).to_integer_sequence());
69};
70
71namespace Impl {
72
73 // only check if Codim<cd>::Entity exists
74 template<class IS, int codim>
75 concept IdSetEntityCodim =
76 (
77 !requires
78 {
79 typename IS::template Codim<codim>::Entity;
80 }
81 ) || (
82 Entity<typename IS::template Codim<codim>::Entity> &&
83 requires(const IS is, const typename IS::template Codim<codim>::Entity& entity)
84 {
85 { is.template id<codim>(entity) } -> std::same_as<typename IS::IdType>;
86 { is.id(entity) } -> std::same_as<typename IS::IdType>;
87 }
88 );
89
90 template<class IS, std::size_t... c>
91 void idSetEntityAllCodims(std::integer_sequence<std::size_t,c...>)
92 requires (IdSetEntityCodim<IS,int(c)> &&...);
93
94} // end namespace Impl
95
104template<class IS>
105concept IdSet = requires(const IS is, const typename IS::template Codim<0>::Entity& entity, int i, unsigned int cc)
106{
107 requires Hashable<typename IS::IdType>;
108 requires std::totally_ordered<typename IS::IdType>;
109 { is.subId(entity,i,cc) } -> std::same_as<typename IS::IdType>;
110} &&
111Impl::IdSetEntityCodim<IS,0> &&
113 Impl::idSetEntityAllCodims<IS>(range(from, to).to_integer_sequence());
114};
115
116} // end namespace Dune::Concept
117
118#endif // DUNE_GRID_CONCEPTS_INDEX_SET_HH
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:105
Model of an index set.
Definition: indexidset.hh:55
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:33
Static tag representing a codimension.
Definition: dimension.hh:24
A unique label for each type of element that can occur in a grid.
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden & Uni Heidelberg  |  generated with Hugo v0.111.3 (Jan 9, 23:34, 2026)