comparison liboctave/idx-vector.cc @ 10487:942386d6d1a5

style fixes
author John W. Eaton <jwe@octave.org>
date Fri, 02 Apr 2010 15:15:41 -0400
parents 4e64fbbd5c58
children d47802f0e557
comparison
equal deleted inserted replaced
10486:4e64fbbd5c58 10487:942386d6d1a5
224 convert_index (octave_idx_type i, bool& conv_error, 224 convert_index (octave_idx_type i, bool& conv_error,
225 octave_idx_type& ext) 225 octave_idx_type& ext)
226 { 226 {
227 if (i <= 0) 227 if (i <= 0)
228 conv_error = true; 228 conv_error = true;
229 if (ext < i) ext = i; 229
230 if (ext < i)
231 ext = i;
232
230 return i - 1; 233 return i - 1;
231 } 234 }
232 235
233 inline octave_idx_type 236 inline octave_idx_type
234 convert_index (double x, bool& conv_error, octave_idx_type& ext) 237 convert_index (double x, bool& conv_error, octave_idx_type& ext)
235 { 238 {
236 octave_idx_type i = static_cast<octave_idx_type> (x); 239 octave_idx_type i = static_cast<octave_idx_type> (x);
240
237 if (static_cast<double> (i) != x) 241 if (static_cast<double> (i) != x)
238 conv_error = true; 242 conv_error = true;
239 243
240 return convert_index (i, conv_error, ext); 244 return convert_index (i, conv_error, ext);
241 } 245 }
250 inline octave_idx_type 254 inline octave_idx_type
251 convert_index (octave_int<T> x, bool& conv_error, 255 convert_index (octave_int<T> x, bool& conv_error,
252 octave_idx_type& ext) 256 octave_idx_type& ext)
253 { 257 {
254 octave_idx_type i = octave_int<octave_idx_type> (x).value (); 258 octave_idx_type i = octave_int<octave_idx_type> (x).value ();
259
255 return convert_index (i, conv_error, ext); 260 return convert_index (i, conv_error, ext);
256 } 261 }
257 262
258 DEFINE_OCTAVE_ALLOCATOR(idx_vector::idx_scalar_rep); 263 DEFINE_OCTAVE_ALLOCATOR(idx_vector::idx_scalar_rep);
259 264
260 template <class T> 265 template <class T>
261 idx_vector::idx_scalar_rep::idx_scalar_rep (T x) 266 idx_vector::idx_scalar_rep::idx_scalar_rep (T x)
262 { 267 {
263 octave_idx_type dummy = 0; 268 octave_idx_type dummy = 0;
269
264 data = convert_index (x, err, dummy); 270 data = convert_index (x, err, dummy);
265 if (err) gripe_invalid_index (); 271
272 if (err)
273 gripe_invalid_index ();
266 } 274 }
267 275
268 idx_vector::idx_scalar_rep::idx_scalar_rep (octave_idx_type i) 276 idx_vector::idx_scalar_rep::idx_scalar_rep (octave_idx_type i)
269 : data (i) 277 : data (i)
270 { 278 {
276 } 284 }
277 285
278 octave_idx_type 286 octave_idx_type
279 idx_vector::idx_scalar_rep::checkelem (octave_idx_type i) const 287 idx_vector::idx_scalar_rep::checkelem (octave_idx_type i) const
280 { 288 {
281 if (i != 0) gripe_index_out_of_range (); 289 if (i != 0)
290 gripe_index_out_of_range ();
291
282 return data; 292 return data;
283 } 293 }
284 294
285 idx_vector::idx_base_rep * 295 idx_vector::idx_base_rep *
286 idx_vector::idx_scalar_rep::sort_idx (Array<octave_idx_type>& idx) 296 idx_vector::idx_scalar_rep::sort_idx (Array<octave_idx_type>& idx)
319 octave_idx_type *d = new octave_idx_type[len]; 329 octave_idx_type *d = new octave_idx_type[len];
320 for (octave_idx_type i = 0; i < len; i++) 330 for (octave_idx_type i = 0; i < len; i++)
321 d[i] = convert_index (nda.xelem (i), err, ext); 331 d[i] = convert_index (nda.xelem (i), err, ext);
322 data = d; 332 data = d;
323 333
324 if (err) gripe_invalid_index (); 334 if (err)
335 gripe_invalid_index ();
325 } 336 }
326 } 337 }
327 338
328 // Note that this makes a shallow copy of the index array. 339 // Note that this makes a shallow copy of the index array.
329 340
343 max = k; 354 max = k;
344 } 355 }
345 356
346 ext = max + 1; 357 ext = max + 1;
347 358
348 if (err) gripe_invalid_index (); 359 if (err)
360 gripe_invalid_index ();
349 } 361 }
350 } 362 }
351 363
352 idx_vector::idx_vector_rep::idx_vector_rep (const Array<octave_idx_type>& inda, 364 idx_vector::idx_vector_rep::idx_vector_rep (const Array<octave_idx_type>& inda,
353 octave_idx_type _ext, direct) 365 octave_idx_type _ext, direct)
354 : data (inda.data ()), len (inda.numel ()), ext (_ext), 366 : data (inda.data ()), len (inda.numel ()), ext (_ext),
355 aowner (new Array<octave_idx_type> (inda)), orig_dims (inda.dims ()) 367 aowner (new Array<octave_idx_type> (inda)), orig_dims (inda.dims ())
356 { 368 {
357 // No checking. 369 // No checking.
358 if (ext < 0) 370 if (ext < 0)
359 { 371 {
360 octave_idx_type max = -1; 372 octave_idx_type max = -1;
397 409
398 octave_idx_type ntot = bnda.length (); 410 octave_idx_type ntot = bnda.length ();
399 411
400 octave_idx_type k = 0; 412 octave_idx_type k = 0;
401 for (octave_idx_type i = 0; i < ntot; i++) 413 for (octave_idx_type i = 0; i < ntot; i++)
402 if (bnda.xelem (i)) d[k++] = i; 414 if (bnda.xelem (i))
415 d[k++] = i;
403 416
404 data = d; 417 data = d;
405 418
406 ext = d[k-1] + 1; 419 ext = d[k-1] + 1;
407 } 420 }
593 606
594 std::ostream& 607 std::ostream&
595 idx_vector::idx_vector_rep::print (std::ostream& os) const 608 idx_vector::idx_vector_rep::print (std::ostream& os) const
596 { 609 {
597 os << '['; 610 os << '[';
611
598 for (octave_idx_type ii = 0; ii < len - 1; ii++) 612 for (octave_idx_type ii = 0; ii < len - 1; ii++)
599 os << data[ii] << ',' << ' '; 613 os << data[ii] << ',' << ' ';
600 if (len > 0) os << data[len-1]; os << ']'; 614
615 if (len > 0)
616 os << data[len-1]; os << ']';
601 617
602 return os; 618 return os;
603 } 619 }
604 620
605 Array<double> 621 Array<double>
706 722
707 std::ostream& 723 std::ostream&
708 idx_vector::idx_mask_rep::print (std::ostream& os) const 724 idx_vector::idx_mask_rep::print (std::ostream& os) const
709 { 725 {
710 os << '['; 726 os << '[';
727
711 for (octave_idx_type ii = 0; ii < ext - 1; ii++) 728 for (octave_idx_type ii = 0; ii < ext - 1; ii++)
712 os << data[ii] << ',' << ' '; 729 os << data[ii] << ',' << ' ';
713 if (ext > 0) os << data[ext-1]; os << ']'; 730
731 if (ext > 0)
732 os << data[ext-1]; os << ']';
714 733
715 return os; 734 return os;
716 } 735 }
717 736
718 Array<bool> 737 Array<bool>
785 rep = new idx_range_rep (r); 804 rep = new idx_range_rep (r);
786 805
787 chkerr (); 806 chkerr ();
788 } 807 }
789 808
790 bool idx_vector::maybe_reduce (octave_idx_type n, const idx_vector& j, 809 bool
791 octave_idx_type nj) 810 idx_vector::maybe_reduce (octave_idx_type n, const idx_vector& j,
811 octave_idx_type nj)
792 { 812 {
793 bool reduced = false; 813 bool reduced = false;
794 814
795 // Empty index always reduces. 815 // Empty index always reduces.
796 if (rep->length (n) == 0) 816 if (rep->length (n) == 0)
816 { 836 {
817 case class_colon: 837 case class_colon:
818 // (:,:) reduces to (:) 838 // (:,:) reduces to (:)
819 reduced = true; 839 reduced = true;
820 break; 840 break;
841
821 case class_scalar: 842 case class_scalar:
822 { 843 {
823 // (i,:) reduces to a range. 844 // (i,:) reduces to a range.
824 idx_scalar_rep * r = dynamic_cast<idx_scalar_rep *> (rep); 845 idx_scalar_rep * r = dynamic_cast<idx_scalar_rep *> (rep);
825 octave_idx_type k = r->get_data (); 846 octave_idx_type k = r->get_data ();
826 *this = new idx_range_rep (k, nj, n, DIRECT); 847 *this = new idx_range_rep (k, nj, n, DIRECT);
827 reduced = true; 848 reduced = true;
828 break;
829 } 849 }
850 break;
851
830 case class_range: 852 case class_range:
831 { 853 {
832 // (i:k:end,:) reduces to a range if i <= k and k divides n. 854 // (i:k:end,:) reduces to a range if i <= k and k divides n.
833 idx_range_rep * r = dynamic_cast<idx_range_rep *> (rep); 855 idx_range_rep * r = dynamic_cast<idx_range_rep *> (rep);
834 octave_idx_type s = r->get_start (), l = r->length (n); 856 octave_idx_type s = r->get_start (), l = r->length (n);
836 if (l*t == n) 858 if (l*t == n)
837 { 859 {
838 *this = new idx_range_rep (s, l * nj, t, DIRECT); 860 *this = new idx_range_rep (s, l * nj, t, DIRECT);
839 reduced = true; 861 reduced = true;
840 } 862 }
841 break;
842 } 863 }
864 break;
865
843 default: 866 default:
844 break; 867 break;
845 } 868 }
846 break; 869 break;
870
847 case class_range: 871 case class_range:
848 switch (rep->idx_class ()) 872 switch (rep->idx_class ())
849 { 873 {
850 case class_colon: 874 case class_colon:
851 { 875 {
855 { 879 {
856 octave_idx_type sj = rj->get_start (), lj = rj->length (nj); 880 octave_idx_type sj = rj->get_start (), lj = rj->length (nj);
857 *this = new idx_range_rep (sj * n, lj * n, 1, DIRECT); 881 *this = new idx_range_rep (sj * n, lj * n, 1, DIRECT);
858 reduced = true; 882 reduced = true;
859 } 883 }
860 break;
861 } 884 }
885 break;
886
862 case class_scalar: 887 case class_scalar:
863 { 888 {
864 // (k,i:d:j) reduces to a range. 889 // (k,i:d:j) reduces to a range.
865 idx_scalar_rep * r = dynamic_cast<idx_scalar_rep *> (rep); 890 idx_scalar_rep * r = dynamic_cast<idx_scalar_rep *> (rep);
866 idx_range_rep * rj = dynamic_cast<idx_range_rep *> (j.rep); 891 idx_range_rep * rj = dynamic_cast<idx_range_rep *> (j.rep);
867 octave_idx_type k = r->get_data (); 892 octave_idx_type k = r->get_data ();
868 octave_idx_type sj = rj->get_start (), lj = rj->length (nj); 893 octave_idx_type sj = rj->get_start (), lj = rj->length (nj);
869 octave_idx_type tj = rj->get_step (); 894 octave_idx_type tj = rj->get_step ();
870 *this = new idx_range_rep (n * sj + k, lj, n * tj, DIRECT); 895 *this = new idx_range_rep (n * sj + k, lj, n * tj, DIRECT);
871 reduced = true; 896 reduced = true;
872 break;
873 } 897 }
898 break;
899
874 case class_range: 900 case class_range:
875 { 901 {
876 // (i:k:end,p:q) reduces to a range if i <= k and k divides n. 902 // (i:k:end,p:q) reduces to a range if i <= k and k divides n.
877 // (ones (1, m), ones (1, n)) reduces to (ones (1, m*n)) 903 // (ones (1, m), ones (1, n)) reduces to (ones (1, m*n))
878 idx_range_rep * r = dynamic_cast<idx_range_rep *> (rep); 904 idx_range_rep * r = dynamic_cast<idx_range_rep *> (rep);
884 if ((l*t == n && tj == 1) || (t == 0 && tj == 0)) 910 if ((l*t == n && tj == 1) || (t == 0 && tj == 0))
885 { 911 {
886 *this = new idx_range_rep (s + n * sj, l * lj, t, DIRECT); 912 *this = new idx_range_rep (s + n * sj, l * lj, t, DIRECT);
887 reduced = true; 913 reduced = true;
888 } 914 }
889 break;
890 } 915 }
916 break;
917
891 default: 918 default:
892 break; 919 break;
893 } 920 }
894 break; 921 break;
922
895 case class_scalar: 923 case class_scalar:
896 switch (rep->idx_class ()) 924 switch (rep->idx_class ())
897 { 925 {
898 case class_scalar: 926 case class_scalar:
899 { 927 {
901 idx_scalar_rep * r = dynamic_cast<idx_scalar_rep *> (rep); 929 idx_scalar_rep * r = dynamic_cast<idx_scalar_rep *> (rep);
902 idx_scalar_rep * rj = dynamic_cast<idx_scalar_rep *> (j.rep); 930 idx_scalar_rep * rj = dynamic_cast<idx_scalar_rep *> (j.rep);
903 octave_idx_type k = r->get_data () + n * rj->get_data (); 931 octave_idx_type k = r->get_data () + n * rj->get_data ();
904 *this = new idx_scalar_rep (k, DIRECT); 932 *this = new idx_scalar_rep (k, DIRECT);
905 reduced = true; 933 reduced = true;
906 break;
907 } 934 }
935 break;
936
908 case class_range: 937 case class_range:
909 { 938 {
910 // (i:d:j,k) reduces to a range. 939 // (i:d:j,k) reduces to a range.
911 idx_range_rep * r = dynamic_cast<idx_range_rep *> (rep); 940 idx_range_rep * r = dynamic_cast<idx_range_rep *> (rep);
912 idx_scalar_rep * rj = dynamic_cast<idx_scalar_rep *> (j.rep); 941 idx_scalar_rep * rj = dynamic_cast<idx_scalar_rep *> (j.rep);
913 octave_idx_type s = r->get_start (), l = r->length (nj); 942 octave_idx_type s = r->get_start (), l = r->length (nj);
914 octave_idx_type t = r->get_step (); 943 octave_idx_type t = r->get_step ();
915 octave_idx_type k = rj->get_data (); 944 octave_idx_type k = rj->get_data ();
916 *this = new idx_range_rep (n * k + s, l, t, DIRECT); 945 *this = new idx_range_rep (n * k + s, l, t, DIRECT);
917 reduced = true; 946 reduced = true;
918 break;
919 } 947 }
948 break;
949
920 case class_colon: 950 case class_colon:
921 { 951 {
922 // (:,k) reduces to a range. 952 // (:,k) reduces to a range.
923 idx_scalar_rep * rj = dynamic_cast<idx_scalar_rep *> (j.rep); 953 idx_scalar_rep * rj = dynamic_cast<idx_scalar_rep *> (j.rep);
924 octave_idx_type k = rj->get_data (); 954 octave_idx_type k = rj->get_data ();
925 *this = new idx_range_rep (n * k, n, 1, DIRECT); 955 *this = new idx_range_rep (n * k, n, 1, DIRECT);
926 reduced = true; 956 reduced = true;
927 break;
928 } 957 }
958 break;
959
929 default: 960 default:
930 break; 961 break;
931 } 962 }
932 break; 963 break;
964
933 default: 965 default:
934 break; 966 break;
935 } 967 }
936 968
937 return reduced; 969 return reduced;
940 bool 972 bool
941 idx_vector::is_cont_range (octave_idx_type n, 973 idx_vector::is_cont_range (octave_idx_type n,
942 octave_idx_type& l, octave_idx_type& u) const 974 octave_idx_type& l, octave_idx_type& u) const
943 { 975 {
944 bool res = false; 976 bool res = false;
977
945 switch (rep->idx_class ()) 978 switch (rep->idx_class ())
946 { 979 {
947 case class_colon: 980 case class_colon:
948 l = 0; u = n; 981 l = 0; u = n;
949 res = true; 982 res = true;
950 break; 983 break;
984
951 case class_range: 985 case class_range:
952 { 986 {
953 idx_range_rep * r = dynamic_cast<idx_range_rep *> (rep); 987 idx_range_rep * r = dynamic_cast<idx_range_rep *> (rep);
954 if (r->get_step () == 1) 988 if (r->get_step () == 1)
955 { 989 {
957 u = l + r->length (n); 991 u = l + r->length (n);
958 res = true; 992 res = true;
959 } 993 }
960 } 994 }
961 break; 995 break;
996
962 case class_scalar: 997 case class_scalar:
963 { 998 {
964 idx_scalar_rep * r = dynamic_cast<idx_scalar_rep *> (rep); 999 idx_scalar_rep * r = dynamic_cast<idx_scalar_rep *> (rep);
965 l = r->get_data (); 1000 l = r->get_data ();
966 u = l + 1; 1001 u = l + 1;
967 res = true; 1002 res = true;
968 } 1003 }
969 break; 1004 break;
1005
970 case class_mask: 1006 case class_mask:
971 { 1007 {
972 idx_mask_rep * r = dynamic_cast<idx_mask_rep *> (rep); 1008 idx_mask_rep * r = dynamic_cast<idx_mask_rep *> (rep);
973 octave_idx_type ext = r->extent (0), len = r->length (0); 1009 octave_idx_type ext = r->extent (0), len = r->length (0);
974 if (ext == len) 1010 if (ext == len)
976 l = 0; 1012 l = 0;
977 u = len; 1013 u = len;
978 res = true; 1014 res = true;
979 } 1015 }
980 } 1016 }
1017
981 default: 1018 default:
982 break; 1019 break;
983 } 1020 }
984 1021
985 return res; 1022 return res;
987 1024
988 octave_idx_type 1025 octave_idx_type
989 idx_vector::increment (void) const 1026 idx_vector::increment (void) const
990 { 1027 {
991 octave_idx_type retval = 0; 1028 octave_idx_type retval = 0;
1029
992 switch (rep->idx_class ()) 1030 switch (rep->idx_class ())
993 { 1031 {
994 case class_colon: 1032 case class_colon:
995 retval = 1; 1033 retval = 1;
1034 // fall through...
1035
996 case class_range: 1036 case class_range:
997 retval = dynamic_cast<idx_range_rep *> (rep) -> get_step (); 1037 retval = dynamic_cast<idx_range_rep *> (rep) -> get_step ();
998 break; 1038 break;
1039
999 case class_vector: 1040 case class_vector:
1000 { 1041 {
1001 if (length (0) > 1) 1042 if (length (0) > 1)
1002 retval = elem (1) - elem (0); 1043 retval = elem (1) - elem (0);
1003 } 1044 }
1045 break;
1046
1004 default: 1047 default:
1005 break; 1048 break;
1006 } 1049 }
1050
1007 return retval; 1051 return retval;
1008 } 1052 }
1009 1053
1010 const octave_idx_type * 1054 const octave_idx_type *
1011 idx_vector::raw (void) 1055 idx_vector::raw (void)
1012 { 1056 {
1013 if (rep->idx_class () != class_vector) 1057 if (rep->idx_class () != class_vector)
1014 *this = idx_vector (as_array (), extent (0)); 1058 *this = idx_vector (as_array (), extent (0));
1015 1059
1016 idx_vector_rep * r = dynamic_cast<idx_vector_rep *> (rep); 1060 idx_vector_rep * r = dynamic_cast<idx_vector_rep *> (rep);
1061
1017 assert (r != 0); 1062 assert (r != 0);
1063
1018 return r->get_data (); 1064 return r->get_data ();
1019 } 1065 }
1020 1066
1021 void 1067 void
1022 idx_vector::copy_data (octave_idx_type *data) const 1068 idx_vector::copy_data (octave_idx_type *data) const
1026 switch (rep->idx_class ()) 1072 switch (rep->idx_class ())
1027 { 1073 {
1028 case class_colon: 1074 case class_colon:
1029 current_liboctave_error_handler ("colon not allowed"); 1075 current_liboctave_error_handler ("colon not allowed");
1030 break; 1076 break;
1077
1031 case class_range: 1078 case class_range:
1032 { 1079 {
1033 idx_range_rep * r = dynamic_cast<idx_range_rep *> (rep); 1080 idx_range_rep * r = dynamic_cast<idx_range_rep *> (rep);
1034 octave_idx_type start = r->get_start (), step = r->get_step (); 1081 octave_idx_type start = r->get_start (), step = r->get_step ();
1035 octave_idx_type i, j; 1082 octave_idx_type i, j;
1036 if (step == 1) 1083 if (step == 1)
1037 for (i = start, j = start + len; i < j; i++) *data++ = i; 1084 for (i = start, j = start + len; i < j; i++) *data++ = i;
1038 else if (step == -1) 1085 else if (step == -1)
1039 for (i = start, j = start - len; i > j; i--) *data++ = i; 1086 for (i = start, j = start - len; i > j; i--) *data++ = i;
1040 else 1087 else
1041 for (i = 0, j = start; i < len; i++, j += step) *data++ = j; 1088 for (i = 0, j = start; i < len; i++, j += step) *data++ = j;
1042 } 1089 }
1043 break; 1090 break;
1091
1044 case class_scalar: 1092 case class_scalar:
1045 { 1093 {
1046 idx_scalar_rep * r = dynamic_cast<idx_scalar_rep *> (rep); 1094 idx_scalar_rep * r = dynamic_cast<idx_scalar_rep *> (rep);
1047 *data = r->get_data (); 1095 *data = r->get_data ();
1048 } 1096 }
1049 break; 1097 break;
1098
1050 case class_vector: 1099 case class_vector:
1051 { 1100 {
1052 idx_vector_rep * r = dynamic_cast<idx_vector_rep *> (rep); 1101 idx_vector_rep * r = dynamic_cast<idx_vector_rep *> (rep);
1053 const octave_idx_type *rdata = r->get_data (); 1102 const octave_idx_type *rdata = r->get_data ();
1054 copy_or_memcpy (len, rdata, data); 1103 copy_or_memcpy (len, rdata, data);
1055 } 1104 }
1056 break; 1105 break;
1106
1057 default: 1107 default:
1058 assert (false); 1108 assert (false);
1059 break; 1109 break;
1060 } 1110 }
1061
1062 } 1111 }
1063 1112
1064 idx_vector 1113 idx_vector
1065 idx_vector::complement (octave_idx_type n) const 1114 idx_vector::complement (octave_idx_type n) const
1066 { 1115 {
1077 cnt--; 1126 cnt--;
1078 } 1127 }
1079 } 1128 }
1080 1129
1081 octave_idx_type len = cnt, *data = new octave_idx_type[len]; 1130 octave_idx_type len = cnt, *data = new octave_idx_type[len];
1131
1082 for (octave_idx_type i = 0, j = 0; i < n; i++) 1132 for (octave_idx_type i = 0, j = 0; i < n; i++)
1083 if (left[i]) data[j++] = i; 1133 if (left[i])
1134 data[j++] = i;
1084 1135
1085 return new idx_vector_rep (data, len, 1136 return new idx_vector_rep (data, len,
1086 len ? data[len-1]+1 : 0, 1137 len ? data[len-1]+1 : 0,
1087 dim_vector (1, len), DIRECT); 1138 dim_vector (1, len), DIRECT);
1088 } 1139 }
1109 { 1160 {
1110 retval = false; 1161 retval = false;
1111 break; 1162 break;
1112 } 1163 }
1113 } 1164 }
1114
1115 } 1165 }
1116 1166
1117 return retval; 1167 return retval;
1118 } 1168 }
1119 1169
1124 { 1174 {
1125 idx_mask_rep * r = dynamic_cast<idx_mask_rep *> (rep); 1175 idx_mask_rep * r = dynamic_cast<idx_mask_rep *> (rep);
1126 const bool *data = r->get_data (); 1176 const bool *data = r->get_data ();
1127 octave_idx_type ext = r->extent (0), len = r->length (0); 1177 octave_idx_type ext = r->extent (0), len = r->length (0);
1128 octave_idx_type *idata = new octave_idx_type [len]; 1178 octave_idx_type *idata = new octave_idx_type [len];
1179
1129 for (octave_idx_type i = 0, j = 0; i < ext; i++) 1180 for (octave_idx_type i = 0, j = 0; i < ext; i++)
1130 if (data[i]) 1181 if (data[i])
1131 idata[j++] = i; 1182 idata[j++] = i;
1183
1132 ext = len > 0 ? idata[len - 1] : 0; 1184 ext = len > 0 ? idata[len - 1] : 0;
1133 return new idx_vector_rep (idata, len, ext, r->orig_dimensions (), DIRECT); 1185
1186 return new idx_vector_rep (idata, len, ext, r->orig_dimensions (),
1187 DIRECT);
1134 } 1188 }
1135 else 1189 else
1136 return *this; 1190 return *this;
1137 } 1191 }
1138 1192
1143 iclass = idx_class (); 1197 iclass = idx_class ();
1144 switch (iclass) 1198 switch (iclass)
1145 { 1199 {
1146 case class_colon: 1200 case class_colon:
1147 break; 1201 break;
1202
1148 case class_range: 1203 case class_range:
1149 { 1204 {
1150 idx_range_rep * r = dynamic_cast<idx_range_rep *> (rep); 1205 idx_range_rep *r = dynamic_cast<idx_range_rep *> (rep);
1151 range = r->unconvert (); 1206 range = r->unconvert ();
1152 } 1207 }
1153 break; 1208 break;
1209
1154 case class_scalar: 1210 case class_scalar:
1155 { 1211 {
1156 idx_scalar_rep * r = dynamic_cast<idx_scalar_rep *> (rep); 1212 idx_scalar_rep *r = dynamic_cast<idx_scalar_rep *> (rep);
1157 scalar = r->unconvert (); 1213 scalar = r->unconvert ();
1158 } 1214 }
1159 break; 1215 break;
1216
1160 case class_vector: 1217 case class_vector:
1161 { 1218 {
1162 idx_vector_rep * r = dynamic_cast<idx_vector_rep *> (rep); 1219 idx_vector_rep *r = dynamic_cast<idx_vector_rep *> (rep);
1163 array = r->unconvert (); 1220 array = r->unconvert ();
1164 } 1221 }
1165 break; 1222 break;
1223
1166 case class_mask: 1224 case class_mask:
1167 { 1225 {
1168 idx_mask_rep * r = dynamic_cast<idx_mask_rep *> (rep); 1226 idx_mask_rep *r = dynamic_cast<idx_mask_rep *> (rep);
1169 mask = r->unconvert (); 1227 mask = r->unconvert ();
1170 } 1228 }
1171 break; 1229 break;
1230
1172 default: 1231 default:
1173 assert (false); 1232 assert (false);
1174 break; 1233 break;
1175 } 1234 }
1176 } 1235 }
1197 1256
1198 octave_idx_type 1257 octave_idx_type
1199 idx_vector::ones_count () const 1258 idx_vector::ones_count () const
1200 { 1259 {
1201 octave_idx_type n = 0; 1260 octave_idx_type n = 0;
1261
1202 if (is_colon ()) 1262 if (is_colon ())
1203 n = 1; 1263 n = 1;
1204 else 1264 else
1205 for (octave_idx_type i = 0; i < length (1); i++) 1265 {
1206 if (xelem (i) == 0) n++; 1266 for (octave_idx_type i = 0; i < length (1); i++)
1267 if (xelem (i) == 0)
1268 n++;
1269 }
1270
1207 return n; 1271 return n;
1208 } 1272 }
1209 1273
1210 // Instantiate the octave_int constructors we want. 1274 // Instantiate the octave_int constructors we want.
1211 #define INSTANTIATE_SCALAR_VECTOR_REP_CONST(T) \ 1275 #define INSTANTIATE_SCALAR_VECTOR_REP_CONST(T) \