@@ -105,7 +105,7 @@ maybe_len(auto const & v, K k) { if constexpr (is_constant<K> && (ANY!=v.len_s(k
105105
106106// Sequence iterator.
107107
108- template <class I >
108+ template <class I = dim_t >
109109struct Seq
110110{
111111 I i;
@@ -232,25 +232,33 @@ struct Dim { dim_t len, step; };
232232inline std::ostream &
233233operator <<(std::ostream & o, Dim const & dim) { std::print (o, " [Dim {} {}]" , dim.len , dim.step ); return o; }
234234
235+ constexpr void
236+ resize (auto & a, dim_t s)
237+ {
238+ if constexpr (ANY==size_s (a)) {
239+ RA_CK (s>=0 , " Bad resize " , s, " ." );
240+ a.resize (s);
241+ } else {
242+ RA_CK (s==start (a).len (0 ) || UNB==s, " Bad resize " , s, " , need " , start (a).len (0 ), " ." );
243+ }
244+ }
245+
235246constexpr dim_t
236- filldimv (auto const & shape , auto & dimv)
247+ filldimv (Iterator auto && p , auto & dimv)
237248{
238- map (&Dim::len, dimv) = shape;
249+ ra::resize (dimv, 0 ==rank_s (p) ? 1 : ra::size (p)); // [ra37]
250+ for (rank_t k=0 ; k<ra::size (dimv); ++k, p.mov (p.step (0 ))) { dimv[k].len = *p; }
239251 dim_t s = 1 ;
240252 for (int k=ra::size (dimv); --k>=0 ;) {
241253 dimv[k].step = s;
242254 RA_CK (dimv[k].len >=0 , " Bad len[" , k, " ] " , dimv[k].len , " ." );
243- // gcc 14.2, no warning with sanitizers
244- #pragma GCC diagnostic push
245- #pragma GCC diagnostic warning "-Wmaybe-uninitialized"
246255 s *= dimv[k].len ;
247- #pragma GCC diagnostic pop
248256 }
249257 return s;
250258}
251259
252260consteval auto
253- default_dims (auto const & lv) { std::array<Dim, ra::size (lv)> dv; filldimv (lv , dv); return dv; };
261+ default_dims (auto const & lv) { std::array<Dim, ra::size (lv)> dv; filldimv (start (lv) , dv); return dv; };
254262
255263constexpr rank_t rank_sum (rank_t a, rank_t b) { return ANY==a || ANY==b ? ANY : a+b; }
256264constexpr rank_t rank_diff (rank_t a, rank_t b) { return ANY==a || ANY==b ? ANY : a-b; }
@@ -325,10 +333,7 @@ struct Cell: public std::conditional_t<is_constant<Dimv>, CellSmall<P, Dimv, Spe
325333 constexpr operator decltype (*c.cp) () const { return to_scalar (*this ); }
326334 constexpr auto save () const { return c.cp ; }
327335 constexpr void load (P p) { c.cp =p; }
328- #pragma GCC diagnostic push
329- #pragma GCC diagnostic warning "-Waggressive-loop-optimizations" // gcc14.3/15.1 -O3 only
330336 constexpr void mov (dim_t d) { std::ranges::advance (c.cp , d); }
331- #pragma GCC diagnostic pop
332337};
333338
334339// rank 1 special case for fovs or iota. FIXME make Ptr a Slice with iter() -> Cell.
@@ -365,10 +370,7 @@ struct Ptr final
365370 constexpr decltype (*cp) operator*() const { return *cp; }
366371 constexpr auto save () const { return cp; }
367372 constexpr void load (P p) { cp=p; }
368- #pragma GCC diagnostic push
369- #pragma GCC diagnostic warning "-Waggressive-loop-optimizations" // gcc14.3/15.1 -O3 only
370373 constexpr void mov (dim_t d) { std::ranges::advance (cp, d); }
371- #pragma GCC diagnostic pop
372374};
373375
374376template <class X > using sarg = std::conditional_t <is_constant<std::decay_t <X>> || is_scalar<X>, std::decay_t <X>, X>;
@@ -496,9 +498,10 @@ reframe(A && a, Dest)
496498 }
497499}
498500
501+ // I != dim_t may warn "-Waggressive-loop-optimizations" in std::advance(i, ...) in gcc14/15.1 -O3
499502template <int w=0 , class I =dim_t , class N =ic_t <dim_t (UNB)>, class S =ic_t <dim_t (1 )>>
500503constexpr auto
501- iota (N && n=N {}, I && i=0 , S && s=S(maybe_step<S>))
504+ iota (N && n=N {}, I && i=dim_t ( 0 ) , S && s=S(maybe_step<S>))
502505{
503506 return reframe (Ptr<Seq<sarg<I>>, sarg<N>, sarg<S>> { {RA_FW (i)}, RA_FW (n), RA_FW (s) }, ilist_t <w> {});
504507}
0 commit comments