71 template <
typename T,
typename D>
friend class std::unique_ptr;
79 idx_base_rep () : m_count (1) { }
81 OCTAVE_DISABLE_COPY_MOVE (idx_base_rep)
83 virtual ~idx_base_rep () =
default;
98 virtual idx_class_type idx_class ()
const {
return class_invalid; }
101 virtual idx_base_rep * sort_uniq_clone (
bool uniq =
false) = 0;
112 virtual std::ostream& print (std::ostream& os)
const = 0;
120 class OCTAVE_API idx_colon_rep :
public idx_base_rep
124 idx_colon_rep () =
default;
128 OCTAVE_DISABLE_COPY_MOVE (idx_colon_rep)
130 ~idx_colon_rep () =
default;
140 idx_class_type idx_class ()
const {
return class_colon; }
142 idx_base_rep * sort_uniq_clone (
bool =
false)
143 { m_count++;
return this; }
149 OCTAVE_API std::ostream& print (std::ostream& os)
const;
153 enum direct { DIRECT };
156 class OCTAVE_API idx_range_rep :
public idx_base_rep
160 idx_range_rep () =
delete;
164 : idx_base_rep (), m_start (start), m_len (
len), m_step (step) { }
173 OCTAVE_DISABLE_COPY_MOVE (idx_range_rep)
175 ~idx_range_rep () =
default;
178 {
return m_start + i * m_step; }
186 return m_len ? std::max (n, m_start + 1 + (m_step < 0 ? 0 : m_step * (m_len - 1))) : n;
189 idx_class_type idx_class ()
const {
return class_range; }
191 OCTAVE_API idx_base_rep * sort_uniq_clone (
bool uniq =
false);
196 {
return m_start == 0 && m_step == 1 && m_len == n; }
205 OCTAVE_API std::ostream& print (std::ostream& os)
const;
217 class OCTAVE_API idx_scalar_rep :
public idx_base_rep
221 idx_scalar_rep () =
delete;
223 idx_scalar_rep (
octave_idx_type i, direct) : idx_base_rep (), m_data (i) { }
225 OCTAVE_DISABLE_COPY_MOVE (idx_scalar_rep)
227 ~idx_scalar_rep () =
default;
232 template <
typename T>
233 idx_scalar_rep (T
x);
242 {
return std::max (n, m_data + 1); }
244 idx_class_type idx_class ()
const {
return class_scalar; }
246 idx_base_rep * sort_uniq_clone (
bool =
false)
247 { m_count++;
return this; }
252 {
return n == 1 && m_data == 0; }
258 OCTAVE_API std::ostream& print (std::ostream& os)
const;
270 class OCTAVE_API idx_vector_rep :
public idx_base_rep
275 : m_data (nullptr), m_len (0), m_ext (0), m_aowner (nullptr), m_orig_dims () { }
280 : idx_base_rep (), m_data (data), m_len (
len), m_ext (ext),
281 m_aowner (nullptr), m_orig_dims (od)
290 template <
typename T>
299 OCTAVE_DISABLE_COPY_MOVE (idx_vector_rep)
310 {
return std::max (n, m_ext); }
312 idx_class_type idx_class ()
const {
return class_vector; }
314 idx_base_rep * sort_uniq_clone (
bool uniq =
false);
318 dim_vector orig_dimensions ()
const {
return m_orig_dims; }
322 OCTAVE_API std::ostream& print (std::ostream& os)
const;
347 class OCTAVE_API idx_mask_rep :
public idx_base_rep
351 idx_mask_rep () =
delete;
356 : idx_base_rep (), m_data (data), m_len (
len), m_ext (ext),
357 m_lsti (-1), m_lste (-1), m_aowner (nullptr), m_orig_dims (od)
364 OCTAVE_DISABLE_COPY_MOVE (idx_mask_rep)
375 {
return std::max (n, m_ext); }
377 idx_class_type idx_class ()
const {
return class_mask; }
379 idx_base_rep * sort_uniq_clone (
bool =
false)
380 { m_count++;
return this; }
384 dim_vector orig_dimensions ()
const {
return m_orig_dims; }
387 {
return m_len == n && m_ext == n; }
389 const bool * get_data ()
const {
return m_data; }
391 OCTAVE_API std::ostream& print (std::ostream& os)
const;
424 static OCTAVE_API idx_vector_rep * nil_rep ();
434#if OCTAVE_SIZEOF_INT != OCTAVE_SIZEOF_IDX_TYPE
439#if (OCTAVE_SIZEOF_F77_INT_TYPE != OCTAVE_SIZEOF_IDX_TYPE \
440 && OCTAVE_SIZEOF_F77_INT_TYPE != OCTAVE_SIZEOF_INT)
447 : m_rep (new idx_range_rep (start, limit, step)) { }
453 return idx_vector (
new idx_range_rep (start,
len, step, DIRECT));
457 : m_rep (new idx_vector_rep (inda)) { }
461 : m_rep (new idx_vector_rep (inda, ext, DIRECT)) { }
471 template <
typename T>
481 template <
typename T>
483 : m_rep (new idx_vector_rep (nda)) { }
499 if (--m_rep->m_count == 0 && m_rep != nil_rep ())
507 if (--m_rep->m_count == 0 && m_rep != nil_rep ())
519 {
return m_rep->length (n); }
522 {
return m_rep->extent (n); }
525 {
return m_rep->xelem (n); }
528 {
return m_rep->xelem (n); }
531 {
return m_rep->xelem (n); }
534 {
return m_rep->idx_class () == class_colon; }
537 {
return m_rep->idx_class () == class_scalar; }
540 {
return m_rep->idx_class () == class_range; }
543 {
return m_rep->is_colon_equiv (n); }
546 {
return idx_vector (m_rep->sort_uniq_clone (uniq)); }
549 {
return idx_vector (m_rep->sort_idx (sidx)); }
554 {
return orig_dimensions () (0); }
557 {
return orig_dimensions () (1); }
560 {
return (! is_colon () && orig_dimensions ().any_zero ()); }
564 std::ostream&
print (std::ostream& os)
const {
return m_rep->print (os); }
567 {
return a.
print (os); }
577 template <
typename T>
583 switch (m_rep->idx_class ())
586 (*current_liboctave_error_handler) (
"unexpected: invalid index");
590 std::copy_n (src,
len, dest);
595 idx_range_rep *r =
dynamic_cast<idx_range_rep *
> (m_rep);
598 const T *ssrc = src + start;
600 std::copy_n (ssrc,
len, dest);
602 std::reverse_copy (ssrc -
len + 1, ssrc + 1, dest);
604 std::fill_n (dest,
len, *ssrc);
615 idx_scalar_rep *r =
dynamic_cast<idx_scalar_rep *
> (m_rep);
616 dest[0] = src[r->get_data ()];
622 idx_vector_rep *r =
dynamic_cast<idx_vector_rep *
> (m_rep);
625 dest[i] = src[data[i]];
631 idx_mask_rep *r =
dynamic_cast<idx_mask_rep *
> (m_rep);
632 const bool *data = r->get_data ();
635 if (data[i]) *dest++ = src[i];
656 template <
typename T>
662 switch (m_rep->idx_class ())
665 (*current_liboctave_error_handler) (
"unexpected: invalid index");
669 std::copy_n (src,
len, dest);
674 idx_range_rep *r =
dynamic_cast<idx_range_rep *
> (m_rep);
677 T *sdest = dest + start;
679 std::copy_n (src,
len, sdest);
681 std::reverse_copy (src, src +
len, sdest -
len + 1);
692 idx_scalar_rep *r =
dynamic_cast<idx_scalar_rep *
> (m_rep);
693 dest[r->get_data ()] = src[0];
699 idx_vector_rep *r =
dynamic_cast<idx_vector_rep *
> (m_rep);
702 dest[data[i]] = src[i];
708 idx_mask_rep *r =
dynamic_cast<idx_mask_rep *
> (m_rep);
709 const bool *data = r->get_data ();
712 if (data[i]) dest[i] = *src++;
733 template <
typename T>
739 switch (m_rep->idx_class ())
742 (*current_liboctave_error_handler) (
"unexpected: invalid index");
746 std::fill_n (dest,
len, val);
751 idx_range_rep *r =
dynamic_cast<idx_range_rep *
> (m_rep);
754 T *sdest = dest + start;
756 std::fill_n (sdest,
len, val);
758 std::fill (sdest -
len + 1, sdest + 1, val);
769 idx_scalar_rep *r =
dynamic_cast<idx_scalar_rep *
> (m_rep);
770 dest[r->get_data ()] = val;
776 idx_vector_rep *r =
dynamic_cast<idx_vector_rep *
> (m_rep);
785 idx_mask_rep *r =
dynamic_cast<idx_mask_rep *
> (m_rep);
786 const bool *data = r->get_data ();
789 if (data[i]) dest[i] = val;
808 template <
typename Functor>
814 switch (m_rep->idx_class ())
817 (*current_liboctave_error_handler) (
"unexpected: invalid index");
826 idx_range_rep *r =
dynamic_cast<idx_range_rep *
> (m_rep);
831 for (i = start, j = start +
len; i < j; i++) body (i);
833 for (i = start, j = start -
len; i > j; i--) body (i);
835 for (i = 0, j = start; i <
len; i++, j += step) body (j);
841 idx_scalar_rep *r =
dynamic_cast<idx_scalar_rep *
> (m_rep);
842 body (r->get_data ());
848 idx_vector_rep *r =
dynamic_cast<idx_vector_rep *
> (m_rep);
856 idx_mask_rep *r =
dynamic_cast<idx_mask_rep *
> (m_rep);
857 const bool *data = r->get_data ();
860 if (data[i]) body (i);
881 template <
typename Functor>
887 switch (m_rep->idx_class ())
890 (*current_liboctave_error_handler) (
"unexpected: invalid index");
896 for (i = 0; i <
len && body (i); i++) ;
903 idx_range_rep *r =
dynamic_cast<idx_range_rep *
> (m_rep);
908 for (i = start, j = start +
len; i < j && body (i); i++) ;
910 for (i = start, j = start -
len; i > j && body (i); i--) ;
912 for (i = 0, j = start; i <
len && body (j); i++, j += step) ;
919 idx_scalar_rep *r =
dynamic_cast<idx_scalar_rep *
> (m_rep);
920 ret = (body (r->get_data ()) ? 1 : 0);
926 idx_vector_rep *r =
dynamic_cast<idx_vector_rep *
> (m_rep);
929 for (i = 0; i <
len && body (data[i]); i++) ;
936 idx_mask_rep *r =
dynamic_cast<idx_mask_rep *
> (m_rep);
937 const bool *data = r->get_data ();
1014 {
return (*
this) (n); }
1017 {
return is_colon_equiv (n); }
1023 { *
this = sorted (uniq); }
1031 idx_base_rep *m_rep;