From 864eba3fec3cc34abeb94836d015e9a1a2353a97 Mon Sep 17 00:00:00 2001 From: BrianMichell Date: Wed, 18 Sep 2024 18:55:02 +0000 Subject: [PATCH 1/2] Implemented conversion from SliceDescriptor to RangeDescriptor<> --- mdio/dataset_test.cc | 13 +++++++++++++ mdio/variable.h | 39 ++++++++++++++++++++++----------------- mdio/variable_test.cc | 22 ++++++++++++++++++++++ 3 files changed, 57 insertions(+), 17 deletions(-) diff --git a/mdio/dataset_test.cc b/mdio/dataset_test.cc index 3f7d515..ea616a0 100644 --- a/mdio/dataset_test.cc +++ b/mdio/dataset_test.cc @@ -583,6 +583,19 @@ TEST(Dataset, selRange) { ASSERT_TRUE(sliceRes.ok()) << sliceRes.status(); } +TEST(Dataset, legacySliceDescriptor) { + std::string path = "zarrs/selTester.mdio"; + auto dsRes = makePopulated(path); + ASSERT_TRUE(dsRes.ok()) << dsRes.status(); + auto ds = dsRes.value(); + + mdio::SliceDescriptor ilRange = {"inline", 2, 5, 1}; + + // ds.sel does not, and will not, support the legacy slice descriptor + auto sliceRes = ds.isel(ilRange); + ASSERT_TRUE(sliceRes.ok()) << sliceRes.status(); +} + TEST(Dataset, selRangeFlippedStartStop) { std::string path = "zarrs/selTester.mdio"; auto dsRes = makePopulated(path); diff --git a/mdio/variable.h b/mdio/variable.h index 2cc9bc6..e587723 100644 --- a/mdio/variable.h +++ b/mdio/variable.h @@ -62,6 +62,24 @@ struct extract_descriptor_Ttype; template struct outer_type; +/** + * @brief A descriptor for slicing a Variable or Dataset. + * @tparam T The type of the range. Default is `Index` for `isel` based slicing. + * @param label The label of the dimension to slice. The recommended is to use a + * label instead of an index. + * @param start The start index or value of the slice. + * @param stop The stop index or value of the slice. + * @param step The step index or value of the slice. Default is 1. + */ +template +struct RangeDescriptor { + using type = T; + DimensionIdentifier label; + T start; + T stop; + Index step = 1; +}; + /** * @brief A descriptor for slicing a Variable. * A struct representing how to slice a Variable or Dataset. @@ -88,24 +106,11 @@ struct SliceDescriptor { Index start; Index stop; Index step; -}; -/** - * @brief A descriptor for slicing a Variable or Dataset. - * @tparam T The type of the range. Default is `Index` for `isel` based slicing. - * @param label The label of the dimension to slice. The recommended is to use a - * label instead of an index. - * @param start The start index or value of the slice. - * @param stop The stop index or value of the slice. - * @param step The step index or value of the slice. Default is 1. - */ -template -struct RangeDescriptor { - using type = T; - DimensionIdentifier label; - T start; - T stop; - Index step = 1; + // Implicit conversion to RangeDescriptor + operator RangeDescriptor() const { + return {label, start, stop, step}; + } }; /** diff --git a/mdio/variable_test.cc b/mdio/variable_test.cc index 860d748..2f84805 100644 --- a/mdio/variable_test.cc +++ b/mdio/variable_test.cc @@ -548,6 +548,28 @@ TEST(Variable, slice) { std::filesystem::remove_all("name"); } +TEST(Variable, legacySliceDescriptor) { + auto variable = + mdio::Variable<>::Open(json_good, mdio::constants::kCreateClean).value(); + + // compile time example + mdio::SliceDescriptor desc1 = {"x", 0, 5, 1}; + mdio::SliceDescriptor desc2 = {"y", 5, 11, 1}; + + auto result = variable.slice(desc2, desc1); + ASSERT_TRUE(result.ok()); + + auto domain = result->dimensions(); + + EXPECT_THAT(domain.labels(), ::testing::ElementsAre("x", "y")); + + EXPECT_THAT(domain.origin(), ::testing::ElementsAre(0, 5)); + + EXPECT_THAT(domain.shape(), ::testing::ElementsAre(5, 6)); + + std::filesystem::remove_all("name"); +} + TEST(Variable, sliceTyped) { auto variable = mdio::Variable::Open( json_good, mdio::constants::kCreateClean) From dae2796e9ff2b939724a2e984c5aa61030c07103 Mon Sep 17 00:00:00 2001 From: BrianMichell Date: Wed, 18 Sep 2024 18:56:58 +0000 Subject: [PATCH 2/2] Formatting --- mdio/variable.h | 4 +--- mdio/variable_test.cc | 26 +++++++++++++------------- 2 files changed, 14 insertions(+), 16 deletions(-) diff --git a/mdio/variable.h b/mdio/variable.h index e587723..00e1718 100644 --- a/mdio/variable.h +++ b/mdio/variable.h @@ -108,9 +108,7 @@ struct SliceDescriptor { Index step; // Implicit conversion to RangeDescriptor - operator RangeDescriptor() const { - return {label, start, stop, step}; - } + operator RangeDescriptor() const { return {label, start, stop, step}; } }; /** diff --git a/mdio/variable_test.cc b/mdio/variable_test.cc index 2f84805..44f8cd3 100644 --- a/mdio/variable_test.cc +++ b/mdio/variable_test.cc @@ -549,25 +549,25 @@ TEST(Variable, slice) { } TEST(Variable, legacySliceDescriptor) { - auto variable = - mdio::Variable<>::Open(json_good, mdio::constants::kCreateClean).value(); + auto variable = + mdio::Variable<>::Open(json_good, mdio::constants::kCreateClean).value(); - // compile time example - mdio::SliceDescriptor desc1 = {"x", 0, 5, 1}; - mdio::SliceDescriptor desc2 = {"y", 5, 11, 1}; + // compile time example + mdio::SliceDescriptor desc1 = {"x", 0, 5, 1}; + mdio::SliceDescriptor desc2 = {"y", 5, 11, 1}; - auto result = variable.slice(desc2, desc1); - ASSERT_TRUE(result.ok()); + auto result = variable.slice(desc2, desc1); + ASSERT_TRUE(result.ok()); - auto domain = result->dimensions(); - - EXPECT_THAT(domain.labels(), ::testing::ElementsAre("x", "y")); + auto domain = result->dimensions(); - EXPECT_THAT(domain.origin(), ::testing::ElementsAre(0, 5)); + EXPECT_THAT(domain.labels(), ::testing::ElementsAre("x", "y")); - EXPECT_THAT(domain.shape(), ::testing::ElementsAre(5, 6)); + EXPECT_THAT(domain.origin(), ::testing::ElementsAre(0, 5)); - std::filesystem::remove_all("name"); + EXPECT_THAT(domain.shape(), ::testing::ElementsAre(5, 6)); + + std::filesystem::remove_all("name"); } TEST(Variable, sliceTyped) {