8#include <similie/misc/specialization.hpp>
22 template <
class Elem,
class Vect>
23 static constexpr Elem run_elem(Elem elem, [[maybe_unused]] Vect)
28 template <
class Elem,
class Vect>
29 static constexpr Vect run_vect([[maybe_unused]] Elem, Vect vect)
35 static constexpr bool run_negative([[maybe_unused]] Vect vect,
bool negative)
41template <
class HeadTag,
class... TailTag>
42struct Reorient<HeadTag, TailTag...>
44 template <
class Elem,
class Vect>
45 static constexpr Elem run_elem(Elem elem, Vect vect)
47 if (vect.template get<HeadTag>() == -1) {
48 elem.template uid<HeadTag>()--;
50 return Reorient<TailTag...>::run_elem(elem, vect);
53 template <
class Elem,
class Vect>
54 static constexpr Vect run_vect(Elem elem, Vect vect)
56 if (vect.template get<HeadTag>() == -1) {
57 vect.template get<HeadTag>() = 1;
59 return Reorient<TailTag...>::run_vect(elem, vect);
63 static constexpr bool run_negative(Vect vect,
bool negative)
66 TailTag...>::run_negative(vect, (vect.template get<HeadTag>() == -1) != negative);
73template <std::size_t K,
class... Tag>
74class Simplex :
public ddc::DiscreteElement<Tag...>
84 static constexpr std::size_t s_k = K;
89 template <
class Tag_,
class... T>
90 requires(!ddc::type_seq_contains_v<ddc::detail::TypeSeq<Tag_>, ddc::detail::TypeSeq<T...>>)
91 static constexpr ddc::DiscreteVector<Tag_> add_eventually_null_dimensions_(
92 [[maybe_unused]] ddc::DiscreteVector<T...> vect)
94 return ddc::DiscreteVector<Tag_> {0};
97 template <
class Tag_,
class... T>
98 requires(ddc::type_seq_contains_v<ddc::detail::TypeSeq<Tag_>, ddc::detail::TypeSeq<T...>>)
99 static constexpr ddc::DiscreteVector<Tag_> add_eventually_null_dimensions_(
100 ddc::DiscreteVector<T...> vect)
102 return ddc::DiscreteVector<Tag_>(vect);
105 template <
class... T>
112 KOKKOS_DEFAULTED_FUNCTION
constexpr Simplex() =
default;
118 template <misc::Specialization<ddc::DiscreteVector> T>
121 T vect = ddc::DiscreteVector<> {},
123 :
base_type(detail::Reorient<Tag...>::run_elem(elem, add_null_dimensions(vect)))
124 , m_vect(detail::Reorient<Tag...>::run_vect(elem, add_null_dimensions(vect)))
125 , m_negative(detail::Reorient<Tag...>::run_negative(add_null_dimensions(vect),
negative))
127 assert(((m_vect.template get<Tag>() == 0 || m_vect.template get<Tag>() == 1) && ...)
128 &&
"simplex vector must contain only -1, 0 or 1");
131 template <misc::Specialization<ddc::DiscreteVector> T = ddc::DiscreteVector<>>
133 std::integral_constant<std::size_t, K>,
135 T vect = ddc::DiscreteVector<> {},
137 :
base_type(detail::Reorient<Tag...>::run_elem(elem, add_null_dimensions(vect)))
138 , m_vect(detail::Reorient<Tag...>::run_vect(elem, add_null_dimensions(vect)))
139 , m_negative(detail::Reorient<Tag...>::run_negative(add_null_dimensions(vect),
negative))
141 assert(((m_vect.template get<Tag>() == 0 || m_vect.template get<Tag>() == 1) && ...)
142 &&
"simplex vector must contain only -1, 0 or 1");
151 static KOKKOS_FUNCTION
constexpr std::size_t
dimension() noexcept
158 return base_type {this->
template uid<Tag>()...};
163 return base_type {this->
template uid<Tag>()...};
181 KOKKOS_FUNCTION
bool const&
negative() const noexcept
196 }
else if (t == -1) {
199 assert(
false &&
"simplex must be multiplied by 1 or -1");
211template <
class... Tag,
class... T>
212Simplex(ddc::DiscreteElement<Tag...>, ddc::DiscreteVector<T...>) ->
Simplex<
sizeof...(T), Tag...>;
214template <
class... Tag,
class... T>
216 ddc::DiscreteVector<T...>,
217 bool) ->
Simplex<
sizeof...(T), Tag...>;
221template <std::
size_t K,
class Dom>
222struct SimplexForDomain;
224template <std::size_t K,
class... Tag>
225struct SimplexForDomain<K, ddc::DiscreteDomain<Tag...>>
227 using type =
Simplex<K, Tag...>;
232template <std::
size_t K,
class Dom>
235template <std::size_t K,
class... Tag>
240 out << (simplex.
negative() ?
" <- " :
" -> ");
KOKKOS_FUNCTION constexpr Simplex(discrete_element_type elem, T vect=ddc::DiscreteVector<> {}, bool negative=false) noexcept
KOKKOS_FUNCTION bool operator==(Simplex< s_k, Tag... > simplex)
KOKKOS_FUNCTION discrete_vector_type const & discrete_vector() const noexcept
KOKKOS_FUNCTION constexpr Simplex(std::integral_constant< std::size_t, K >, discrete_element_type elem, T vect=ddc::DiscreteVector<> {}, bool negative=false) noexcept
KOKKOS_FUNCTION bool const & negative() const noexcept
KOKKOS_DEFAULTED_FUNCTION Simplex & operator=(Simplex &&other)=default
KOKKOS_FUNCTION bool & negative() noexcept
KOKKOS_DEFAULTED_FUNCTION ~Simplex()=default
KOKKOS_FUNCTION base_type discrete_element() noexcept
KOKKOS_FUNCTION auto operator*(T t)
KOKKOS_DEFAULTED_FUNCTION constexpr Simplex(Simplex const &)=default
ddc::DiscreteVector< Tag... > discrete_vector_type
KOKKOS_FUNCTION discrete_vector_type & discrete_vector() noexcept
static KOKKOS_FUNCTION constexpr std::size_t dimension() noexcept
KOKKOS_FUNCTION const base_type discrete_element() const noexcept
KOKKOS_DEFAULTED_FUNCTION constexpr Simplex()=default
KOKKOS_DEFAULTED_FUNCTION Simplex & operator=(Simplex const &other)=default
ddc::DiscreteElement< Tag... > base_type
base_type discrete_element_type
KOKKOS_DEFAULTED_FUNCTION constexpr Simplex(Simplex &&)=default
KOKKOS_FUNCTION Simplex< s_k, Tag... > operator-()
std::ostream & operator<<(std::ostream &out, ChainType const &chain)
Simplex(ddc::DiscreteElement< Tag... >, ddc::DiscreteVector< T... >) -> Simplex< sizeof...(T), Tag... >
detail::SimplexForDomain< K, Dom >::type simplex_for_domain_t
The top-level namespace of SimiLie.