Line data Source code
1 : // SPDX-License-Identifier: BSD-3-Clause 2 : // Copyright (c) 2023 Scipp contributors (https://github.com/scipp) 3 : /// @file 4 : /// @author Simon Heybrock 5 : #include "scipp/core/strides.h" 6 : 7 : namespace scipp::core { 8 : 9 192282 : Strides::Strides(const scipp::span<const scipp::index> &strides) 10 192282 : : m_strides(strides.begin(), strides.end()) {} 11 : 12 139 : Strides::Strides(const std::initializer_list<scipp::index> strides) 13 139 : : m_strides(strides) {} 14 : 15 2583376 : Strides::Strides(const Dimensions &dims) { 16 2583376 : scipp::index offset{1}; 17 2583376 : resize(dims.ndim()); 18 3817733 : for (scipp::index i = dims.ndim() - 1; i >= 0; --i) { 19 1234357 : m_strides[i] = offset; 20 1234357 : offset *= dims.size(i); 21 : } 22 2583376 : } 23 : 24 82739 : bool Strides::operator==(const Strides &other) const noexcept { 25 82739 : return m_strides == other.m_strides; 26 : } 27 : 28 76332 : bool Strides::operator!=(const Strides &other) const noexcept { 29 76332 : return !operator==(other); 30 : } 31 : 32 72529 : void Strides::push_back(const scipp::index i) { m_strides.push_back(i); } 33 : 34 83271 : void Strides::clear() { m_strides.clear(); } 35 : 36 6202468 : void Strides::resize(const scipp::index size) { m_strides.resize(size); } 37 : 38 135480 : void Strides::erase(const scipp::index i) { 39 135480 : m_strides.erase(m_strides.begin() + i); 40 135480 : } 41 : 42 6559 : Strides transpose(const Strides &strides, Dimensions from, 43 : const scipp::span<const Dim> order) { 44 6559 : scipp::index i = 0; 45 21544 : for (const auto &dim : from) 46 14985 : from.resize(dim, strides[i++]); 47 6559 : from = core::transpose(from, order); 48 13102 : return Strides(from.shape()); 49 : } 50 : 51 : } // namespace scipp::core