deal.II version GIT relicensing-1931-g88c382288c 2024-10-04 03:40:00+00:00
\(\newcommand{\dealvcentcolon}{\mathrel{\mathop{:}}}\) \(\newcommand{\dealcoloneq}{\dealvcentcolon\mathrel{\mkern-1.2mu}=}\) \(\newcommand{\jump}[1]{\left[\!\left[ #1 \right]\!\right]}\) \(\newcommand{\average}[1]{\left\{\!\left\{ #1 \right\}\!\right\}}\)
Loading...
Searching...
No Matches
table_indices.h
Go to the documentation of this file.
1// ------------------------------------------------------------------------
2//
3// SPDX-License-Identifier: LGPL-2.1-or-later
4// Copyright (C) 2005 - 2023 by the deal.II authors
5//
6// This file is part of the deal.II library.
7//
8// Part of the source code is dual licensed under Apache-2.0 WITH
9// LLVM-exception OR LGPL-2.1-or-later. Detailed license information
10// governing the source code and code contributions can be found in
11// LICENSE.md and CONTRIBUTING.md at the top level directory of deal.II.
12//
13// ------------------------------------------------------------------------
14
15#ifndef dealii_table_indices_h
16#define dealii_table_indices_h
17
18
19#include <deal.II/base/config.h>
20
23
24#include <algorithm>
25#include <iterator>
26#include <ostream>
27
28
30
31
42template <int N>
44{
45public:
46 static_assert(N > 0,
47 "TableIndices objects need to represent at least one index.");
48
49
53 constexpr TableIndices() = default;
54
64 template <typename... T>
65 constexpr TableIndices(const T... indices);
66
70 constexpr std::size_t
71 operator[](const unsigned int i) const;
72
76 constexpr std::size_t &
77 operator[](const unsigned int i);
78
82 constexpr bool
83 operator==(const TableIndices<N> &other) const;
84
88 constexpr bool
89 operator!=(const TableIndices<N> &other) const;
90
98
104 template <class Archive>
105 void
106 serialize(Archive &ar, const unsigned int version);
107
108protected:
112 std::size_t indices[N]{};
113};
114
115
116
117/* --------------------- Template and inline functions ---------------- */
118
119template <int N>
120template <typename... T>
121constexpr TableIndices<N>::TableIndices(const T... args)
122 : indices{static_cast<std::size_t>(args)...}
123{
124 static_assert(
126 "Not all of the parameters have integral type!");
127 static_assert(sizeof...(T) == N, "Wrong number of constructor arguments!");
128}
129
130
131template <int N>
132constexpr inline std::size_t
133TableIndices<N>::operator[](const unsigned int i) const
134{
135 AssertIndexRange(i, N);
136 return indices[i];
137}
138
139
140template <int N>
141constexpr inline std::size_t &
142TableIndices<N>::operator[](const unsigned int i)
143{
144 AssertIndexRange(i, N);
145 return indices[i];
146}
147
148
149template <int N>
150constexpr bool
152{
153 return std::equal(std::begin(indices),
154 std::end(indices),
155 std::begin(other.indices));
156}
157
158
159template <int N>
160constexpr bool
162{
163 return !(*this == other);
164}
165
166
167template <int N>
170{
171 std::sort(std::begin(indices), std::end(indices));
172}
173
174
175template <int N>
176template <class Archive>
177inline void
178TableIndices<N>::serialize(Archive &ar, const unsigned int)
179{
180 ar &indices;
181}
182
183
190template <int N>
191std::ostream &
192operator<<(std::ostream &out, const TableIndices<N> &indices)
193{
194 out << '[';
195 for (unsigned int i = 0; i < N; ++i)
196 {
197 out << indices[i];
198 if (i + 1 != N)
199 out << ',';
200 }
201 out << ']';
202
203 return out;
204}
205
206
208
209#endif
std::size_t indices[N]
void serialize(Archive &ar, const unsigned int version)
constexpr std::size_t & operator[](const unsigned int i)
DEAL_II_HOST constexpr void sort()
constexpr std::size_t operator[](const unsigned int i) const
constexpr TableIndices(const T... indices)
constexpr TableIndices()=default
constexpr bool operator==(const TableIndices< N > &other) const
constexpr bool operator!=(const TableIndices< N > &other) const
#define DEAL_II_NAMESPACE_OPEN
Definition config.h:498
#define DEAL_II_CONSTEXPR
Definition config.h:234
#define DEAL_II_NAMESPACE_CLOSE
Definition config.h:499
#define AssertIndexRange(index, range)
STL namespace.
#define DEAL_II_HOST
Definition numbers.h:40
std::ostream & operator<<(std::ostream &out, const TableIndices< N > &indices)