Skip to content

Commit 8b8419e

Browse files
committed
Fix SDim case for .size(), .empty()
* ra/expr.hh (dimv_size): Don't assume Dim. (dimv_empty): New function. * ra/arrays.hh (View, Container): Reuse dimv_empty(). (shared_borrowing): Handle SDim case for rank 1.
1 parent a5b139d commit 8b8419e

File tree

6 files changed

+37
-161
lines changed

6 files changed

+37
-161
lines changed

box/SConstruct

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ env.Prepend(CPPPATH=['..', '.'],
5050
LINKFLAGS=raflags['LINKFLAGS'])
5151

5252
[ra.to_test_ra(env, variant_dir)(example)
53-
for example in ['tuple-construct', 'iterator-as-ravel', 'view']]
53+
for example in ['tuple-construct', 'iterator-as-ravel']]
5454

5555
if not top['skip_summary']:
5656
atexit.register(lambda: ra.print_summary(GetBuildFailures, 'ra/box'))

box/view.cc

Lines changed: 0 additions & 154 deletions
This file was deleted.

ra/arrays.hh

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -116,9 +116,9 @@ struct View: public ViewBase<Dimv_>
116116
constexpr static dim_t step(auto k) requires (RAC(k, step)) { return simv[k].step; }
117117
constexpr dim_t step(int k) const requires (!(RAC(k, step))) { return dimv[k].step; }
118118
consteval static dim_t size() requires (CT) { return dimv_size(simv); }
119-
consteval static bool empty() requires (CT) { return any(0==map(&Dim::len, simv)); }
119+
consteval static bool empty() requires (CT) { return dimv_empty(simv); }
120120
constexpr dim_t size() const requires (!CT) { return dimv_size(dimv); }
121-
constexpr bool empty() const requires (!CT) { return any(0==map(&Dim::len, dimv)); }
121+
constexpr bool empty() const requires (!CT) { return dimv_empty(dimv); }
122122
constexpr View() requires (!CT) {} // used by Container constructors
123123
constexpr View(Dimv && dimv, P cp) requires (!CT && !std::is_reference_v<Dimv>): ViewBase<Dimv>(std::move(dimv)), cp(cp) {} // cannot assign dimv later
124124
constexpr View(Dimv const & dimv, P cp) requires (!CT): ViewBase<Dimv>(dimv), cp(cp) {} // cannot assign dimv later
@@ -280,7 +280,7 @@ struct Container
280280
constexpr static dim_t step(auto k) requires (RAC(k, step)) { return simv[k].step; }
281281
constexpr dim_t step(int k) const requires (!(RAC(k, step))) { return dimv[k].step; }
282282
constexpr dim_t size() const { return dimv_size(dimv); }
283-
constexpr bool empty() const { return any(0==map(&Dim::len, dimv)); }
283+
constexpr bool empty() const { return dimv_empty(dimv); }
284284
#undef RAC
285285
constexpr auto data(this auto && sf) { return storage_traits<Store>::data(sf.store); }
286286
constexpr auto view() { return View<T *, Dimv const &>(dimv, data()); }
@@ -367,7 +367,7 @@ shared_borrowing(Slice auto & s)
367367
using T = value_t<decltype(s)>;
368368
Shared<T, rank_s(s)> a;
369369
a.store = std::shared_ptr<T>(s.data(), [](T *){});
370-
a.dimv = s.dimv;
370+
if constexpr (1==rank_s(s)) { a.dimv[0] = s.dimv[0]; } else { a.dimv = s.dimv; } // [Dimv] = [SDim] etc.
371371
return a;
372372
}
373373

ra/expr.hh

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,8 @@ filldimv(Iterator auto && p, auto & dv)
223223
}
224224

225225
consteval auto c_dimv(auto lv) { std::array<Dim, ra::size(lv)> dv; filldimv(ra::iter(lv), dv); return dv; };
226-
constexpr dim_t dimv_size(auto const & dv) { dim_t s=1; for (Dim d: dv) { if (d.len<0) return d.len; else s*=d.len; } return s; }
226+
constexpr dim_t dimv_size(auto const & dv) { dim_t s=1; for (auto const & d: dv) { if (d.len<0) return d.len; else s*=d.len; } return s; }
227+
constexpr bool dimv_empty(auto const & dv) { for (auto const & d: dv) { if (0==d.len) return true; } return false; }
227228

228229
constexpr rank_t rank_sum(rank_t a, rank_t b) { return ANY==a || ANY==b ? ANY : a+b; }
229230
constexpr rank_t rank_diff(rank_t a, rank_t b) { return ANY==a || ANY==b ? ANY : a-b; }

test/ra-17.cc

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// -*- mode: c++; coding: utf-8 -*-
2-
// ra/test - View with custom dimv and generalized iter(Slice).
2+
// ra/test - View with custom dimv and iter(general Slice).
33

44
// (c) Daniel Llorens - 2026
55
// This library is free software; you can redistribute it and/or modify it under
@@ -12,9 +12,29 @@
1212

1313
using std::cout, std::endl;
1414

15+
template <class P, int R>
16+
auto ctad(ra::ViewBig<P, R> const & a)
17+
{
18+
return std::make_tuple<sizeof(std::remove_pointer_t<P>), R>;
19+
}
20+
1521
int main()
1622
{
1723
ra::TestRecorder tr(std::cout);
24+
#if 0 // FIXME
25+
tr.section("CTAD for ViewBig");
26+
{
27+
ra::Big<float, 1> a({10}, 0.);
28+
auto [xa, ya] = ctad(a());
29+
tr.test_eq(sizeof(float), xa);
30+
tr.test_eq(1, ya);
31+
ra::Big<double, 2> b({3, 3}, 0.);
32+
auto [xb, yb] = ctad(b());
33+
tr.test_eq(sizeof(double), xb);
34+
tr.test_eq(2, yb);
35+
}
36+
#endif
37+
tr.section("Custom dimv and iter(general Slice)");
1838
{
1939
int x[6] = { 1, 2, 3, 4, 5, 6 };
2040
auto v = ra::viewptr(x);

test/stl-compat.cc

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,15 @@ int main()
9292
tr.test(aa.empty());
9393
tr.test(a.begin()==a.end());
9494
}
95+
tr.section("empty()/size() corner case");
96+
{
97+
ra::Big<int, 1> a = {};
98+
ra::Big<int, 1> b = { 1, 2, 3 };
99+
tr.test(a.empty());
100+
tr.test(!b.empty());
101+
tr.test_eq(0, a.size());
102+
tr.test_eq(3, b.size());
103+
}
95104
tr.section("foreign vectors from std::");
96105
{
97106
tr.info("adapted std::array has static size").test_eq(3, size_s(ra::iter(std::array {1, 2, 0})));

0 commit comments

Comments
 (0)