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 197465 : Strides::Strides(const scipp::span<const scipp::index> &strides) 10 197465 : : 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 2588797 : Strides::Strides(const Dimensions &dims) { 16 2588797 : scipp::index offset{1}; 17 2588797 : resize(dims.ndim()); 18 3832002 : for (scipp::index i = dims.ndim() - 1; i >= 0; --i) { 19 1243205 : m_strides[i] = offset; 20 1243205 : offset *= dims.size(i); 21 : } 22 2588797 : } 23 : 24 82993 : bool Strides::operator==(const Strides &other) const noexcept { 25 82993 : return m_strides == other.m_strides; 26 : } 27 : 28 76512 : bool Strides::operator!=(const Strides &other) const noexcept { 29 76512 : return !operator==(other); 30 : } 31 : 32 74782 : void Strides::push_back(const scipp::index i) { m_strides.push_back(i); } 33 : 34 84973 : void Strides::clear() { m_strides.clear(); } 35 : 36 6217699 : void Strides::resize(const scipp::index size) { m_strides.resize(size); } 37 : 38 135529 : void Strides::erase(const scipp::index i) { 39 135529 : m_strides.erase(m_strides.begin() + i); 40 135529 : } 41 : 42 7458 : Strides transpose(const Strides &strides, Dimensions from, 43 : const scipp::span<const Dim> order) { 44 7458 : scipp::index i = 0; 45 25362 : for (const auto &dim : from) 46 17904 : from.resize(dim, strides[i++]); 47 7458 : from = core::transpose(from, order); 48 14900 : return Strides(from.shape()); 49 : } 50 : 51 : } // namespace scipp::core