LCOV - code coverage report
Current view: top level - dataset - slice.cpp (source / functions) Hit Total Coverage
Test: coverage.info Lines: 32 32 100.0 %
Date: 2024-04-28 01:25:40 Functions: 14 14 100.0 %

          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 Owen Arnold, Simon Heybrock
       5             : #include <sstream>
       6             : 
       7             : #include "scipp/dataset/slice.h"
       8             : #include "scipp/variable/slice.h"
       9             : 
      10             : namespace scipp::dataset {
      11             : 
      12             : namespace {
      13             : 
      14         304 : template <class T> const auto &get_coord(const T &data, const Dim dim) {
      15         304 :   const auto &coords = data.coords();
      16         304 :   if (coords.contains(dim))
      17         604 :     return coords[dim];
      18             : 
      19           2 :   std::ostringstream oss;
      20           2 :   oss << "Invalid slice dimension: '" << dim
      21           2 :       << "': no coordinate for that dimension. Coordinates are (";
      22           4 :   for (auto it = coords.keys_begin(); it != coords.keys_end(); ++it) {
      23           2 :     oss << to_string(*it) << ", ";
      24             :   }
      25           2 :   oss << ")";
      26           2 :   throw except::DimensionError(oss.str());
      27           2 : }
      28             : 
      29             : template <class T>
      30         158 : T slice(const T &data, const Dim dim, const Variable &value) {
      31             :   return data.slice(
      32         304 :       std::make_from_tuple<Slice>(get_slice_params(data, dim, value)));
      33             : }
      34             : 
      35             : template <class T>
      36          80 : T slice(const T &data, const Dim dim, const Variable &begin,
      37             :         const Variable &end) {
      38             :   return data.slice(
      39         142 :       std::make_from_tuple<Slice>(get_slice_params(data, dim, begin, end)));
      40             : }
      41             : 
      42             : } // namespace
      43             : 
      44             : std::tuple<Dim, scipp::index>
      45         140 : get_slice_params(const DataArray &data, const Dim dim, const Variable &value) {
      46         140 :   return get_slice_params(data.dims(), get_coord(data, dim), value);
      47             : }
      48             : 
      49             : std::tuple<Dim, scipp::index, scipp::index>
      50          90 : get_slice_params(const DataArray &data, const Dim dim, const Variable &begin,
      51             :                  const Variable &end) {
      52          90 :   return get_slice_params(data.dims(), get_coord(data, dim), begin, end);
      53             : }
      54             : 
      55             : std::tuple<Dim, scipp::index>
      56          27 : get_slice_params(const Dataset &data, const Dim dim, const Variable &value) {
      57          27 :   return get_slice_params(data.dims(), get_coord(data, dim), value);
      58             : }
      59             : 
      60             : std::tuple<Dim, scipp::index, scipp::index>
      61          47 : get_slice_params(const Dataset &data, const Dim dim, const Variable &begin,
      62             :                  const Variable &end) {
      63          47 :   return get_slice_params(data.dims(), get_coord(data, dim), begin, end);
      64             : }
      65             : 
      66         133 : DataArray slice(const DataArray &data, const Dim dim, const Variable &value) {
      67         133 :   return slice<DataArray>(data, dim, value);
      68             : }
      69             : 
      70          40 : DataArray slice(const DataArray &data, const Dim dim, const Variable &begin,
      71             :                 const Variable &end) {
      72          40 :   return slice<DataArray>(data, dim, begin, end);
      73             : }
      74             : 
      75          25 : Dataset slice(const Dataset &ds, const Dim dim, const Variable &value) {
      76          25 :   return slice<Dataset>(ds, dim, value);
      77             : }
      78             : 
      79          40 : Dataset slice(const Dataset &ds, const Dim dim, const Variable &begin,
      80             :               const Variable &end) {
      81          40 :   return slice<Dataset>(ds, dim, begin, end);
      82             : }
      83             : 
      84             : } // namespace scipp::dataset

Generated by: LCOV version 1.14