16 #ifndef OPENKALMAN_VECTORSPACEDESCRIPTORRANGE_HPP 17 #define OPENKALMAN_VECTORSPACEDESCRIPTORRANGE_HPP 20 #include <type_traits> 25 template<
typename Indexible>
30 using difference_type = std::ptrdiff_t;
31 using value_type = std::decay_t<decltype(get_vector_space_descriptor<0>(std::declval<Indexible>()))>;
32 static_assert(dynamic_pattern<value_type>);
33 constexpr
Iterator(
const Indexible&
indexible,
const std::size_t p) : my_indexible{indexible}, pos{p} {}
35 constexpr
auto& operator++() noexcept { ++pos;
return *
this; }
36 constexpr
auto operator++(
int) noexcept {
auto temp = *
this; ++*
this;
return temp; }
37 constexpr
auto& operator--() noexcept { --pos;
return *
this; }
38 constexpr
auto operator--(
int) noexcept {
auto temp = *
this; --*
this;
return temp; }
39 constexpr
auto& operator+=(
const difference_type diff) noexcept { pos += diff;
return *
this; }
40 constexpr
auto& operator-=(
const difference_type diff) noexcept { pos -= diff;
return *
this; }
41 constexpr
auto operator+(
const difference_type diff)
const noexcept {
return Iterator {pos + diff}; }
42 constexpr
auto operator-(
const difference_type diff)
const noexcept {
return Iterator {pos - diff}; }
43 constexpr
auto operator+(
const Iterator& other)
const noexcept {
return Iterator {pos + other.pos}; }
44 constexpr difference_type operator-(
const Iterator& other)
const noexcept {
return pos - other.pos; }
46 constexpr
bool operator==(
const Iterator& other)
const noexcept {
return pos == other.pos; }
47 #ifdef __cpp_impl_three_way_comparison 48 constexpr
auto operator<=>(
const Iterator& other)
const noexcept {
return pos <=> other.pos; }
50 constexpr
bool operator!=(
const Iterator& other)
const noexcept {
return pos != other.pos; }
51 constexpr
bool operator<(
const Iterator& other)
const noexcept {
return pos < other.pos; }
52 constexpr
bool operator>(
const Iterator& other)
const noexcept {
return pos > other.pos; }
53 constexpr
bool operator<=(
const Iterator& other)
const noexcept {
return pos <= other.pos; }
54 constexpr
bool operator>=(
const Iterator& other)
const noexcept {
return pos >= other.pos; }
59 const Indexible& my_indexible;
67 constexpr VectorSpaceDescriptorRange(VectorSpaceDescriptorRange&& other) : my_indexible {other.my_indexible} {}
69 constexpr VectorSpaceDescriptorRange(
const Indexible&
indexible) : my_indexible {indexible} {}
71 constexpr
auto begin()
const {
return Iterator {my_indexible, 0}; }
75 constexpr std::size_t size()
const {
return count_indices(my_indexible); }
79 const Indexible& my_indexible;
85 #endif //OPENKALMAN_VECTORSPACEDESCRIPTORRANGE_HPP constexpr auto count_indices(const T &t)
Get the number of indices available to address the components of an indexible object.
Definition: count_indices.hpp:33
Definition: VectorSpaceDescriptorRange.hpp:28
Definition for coordinates::dynamic_pattern.
constexpr bool indexible
T is a generalized tensor type.
Definition: indexible.hpp:32
Definition: basics.hpp:48
constexpr auto get_vector_space_descriptor(const T &t, const N &n)
Get the coordinates::pattern object for index N of indexible object T.
Definition: get_vector_space_descriptor.hpp:56
Definition: VectorSpaceDescriptorRange.hpp:26