Mercurial > octave
annotate liboctave/array/idx-vector.cc @ 31204:a81fad5c9fef
idx_vector: Fix wrong length calculation (bug #62968).
* liboctave/array/idx-vector.cc: Fix wrong calculation for m_len in
(start, limit, step) constructor to account for incomplete intervals.
* liboctave/array/idx-vector.h: Add comment to (start, limit, step) constructor.
author | Maged Rifaat <magedrifaat@gmail.com> |
---|---|
date | Sat, 27 Aug 2022 13:41:44 +0200 |
parents | 796f54d4ddbf |
children | e88a07dec498 |
rev | line source |
---|---|
27923
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
1 //////////////////////////////////////////////////////////////////////// |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
2 // |
30564
796f54d4ddbf
update Octave Project Developers copyright for the new year
John W. Eaton <jwe@octave.org>
parents:
30394
diff
changeset
|
3 // Copyright (C) 1993-2022 The Octave Project Developers |
27923
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
4 // |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
5 // See the file COPYRIGHT.md in the top-level directory of this |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
6 // distribution or <https://octave.org/copyright/>. |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
7 // |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
8 // This file is part of Octave. |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
9 // |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
10 // Octave is free software: you can redistribute it and/or modify it |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
11 // under the terms of the GNU General Public License as published by |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
12 // the Free Software Foundation, either version 3 of the License, or |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
13 // (at your option) any later version. |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
14 // |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
15 // Octave is distributed in the hope that it will be useful, but |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
16 // WITHOUT ANY WARRANTY; without even the implied warranty of |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
17 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
18 // GNU General Public License for more details. |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
19 // |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
20 // You should have received a copy of the GNU General Public License |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
21 // along with Octave; see the file COPYING. If not, see |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
22 // <https://www.gnu.org/licenses/>. |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
23 // |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
24 //////////////////////////////////////////////////////////////////////// |
1 | 25 |
21724
aba2e6293dd8
use "#if ..." consistently instead of "#ifdef" and "#ifndef"
John W. Eaton <jwe@octave.org>
parents:
21660
diff
changeset
|
26 #if defined (HAVE_CONFIG_H) |
21301
40de9f8f23a6
Use '#include "config.h"' rather than <config.h>.
Rik <rik@octave.org>
parents:
21202
diff
changeset
|
27 # include "config.h" |
1 | 28 #endif |
29 | |
26569
0e77df67b522
Add static compile-time checking of printf functions in liboctave.
Markus Mützel <markus.muetzel@gmx.de>
parents:
26415
diff
changeset
|
30 #include <cinttypes> |
1343 | 31 #include <cstdlib> |
32 | |
25438
cb1606f78f6b
prefer <istream>, <ostream>, or <iosfwd> to <iostream> where possible
John W. Eaton <jwe@octave.org>
parents:
25054
diff
changeset
|
33 #include <ostream> |
164 | 34 |
8290
7cbe01c21986
improve dense array indexing
Jaroslav Hajek <highegg@gmail.com>
parents:
7774
diff
changeset
|
35 #include "idx-vector.h" |
7cbe01c21986
improve dense array indexing
Jaroslav Hajek <highegg@gmail.com>
parents:
7774
diff
changeset
|
36 #include "Array.h" |
10370
9c4daf174387
implement IDs for common liboctave exceptions
Jaroslav Hajek <highegg@gmail.com>
parents:
10339
diff
changeset
|
37 #include "Array-util.h" |
8384
a99b9113c58c
optimize sparse bool indexing
Jaroslav Hajek <highegg@gmail.com>
parents:
8379
diff
changeset
|
38 #include "Sparse.h" |
1352 | 39 #include "Range.h" |
40 | |
8379
ad8ed668e0a4
allow initialized local buffers
Jaroslav Hajek <highegg@gmail.com>
parents:
8375
diff
changeset
|
41 #include "oct-locbuf.h" |
1560 | 42 #include "lo-error.h" |
2500 | 43 #include "lo-mappers.h" |
1 | 44 |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
45 namespace octave |
8290
7cbe01c21986
improve dense array indexing
Jaroslav Hajek <highegg@gmail.com>
parents:
7774
diff
changeset
|
46 { |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
47 OCTAVE_NORETURN static void err_invalid_range (void) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
48 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
49 (*current_liboctave_error_handler) ("invalid range used as index"); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
50 } |
8290
7cbe01c21986
improve dense array indexing
Jaroslav Hajek <highegg@gmail.com>
parents:
7774
diff
changeset
|
51 |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
52 OCTAVE_NORETURN static void err_index_out_of_range (void) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
53 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
54 (*current_liboctave_error_handler) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
55 ("internal error: idx_vector index out of range"); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
56 } |
8290
7cbe01c21986
improve dense array indexing
Jaroslav Hajek <highegg@gmail.com>
parents:
7774
diff
changeset
|
57 |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
58 idx_vector::idx_vector_rep * idx_vector::nil_rep (void) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
59 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
60 static idx_vector_rep ivr; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
61 return &ivr; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
62 } |
7774
ce52af0e4a10
all false logical indexing fix
David Bateman <dbateman@free.fr>
parents:
7727
diff
changeset
|
63 |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
64 Array<octave_idx_type> idx_vector::idx_base_rep::as_array (void) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
65 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
66 (*current_liboctave_error_handler) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
67 ("internal error: as_array not allowed for this index class"); |
8384
a99b9113c58c
optimize sparse bool indexing
Jaroslav Hajek <highegg@gmail.com>
parents:
8379
diff
changeset
|
68 |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
69 // Never actually executed, but required to silence compiler warning |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
70 return Array<octave_idx_type> (); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
71 } |
227 | 72 |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
73 idx_vector::idx_colon_rep::idx_colon_rep (char c) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
74 : idx_base_rep () |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
75 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
76 if (c != ':') |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
77 (*current_liboctave_error_handler) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
78 ("internal error: invalid character converted to idx_vector; must be ':'"); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
79 } |
10273
3a8c13b71612
implement special-case optimization for sort of index vectors
Jaroslav Hajek <highegg@gmail.com>
parents:
10258
diff
changeset
|
80 |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
81 octave_idx_type |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
82 idx_vector::idx_colon_rep::checkelem (octave_idx_type i) const |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
83 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
84 if (i < 0) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
85 err_index_out_of_range (); |
10273
3a8c13b71612
implement special-case optimization for sort of index vectors
Jaroslav Hajek <highegg@gmail.com>
parents:
10258
diff
changeset
|
86 |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
87 return i; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
88 } |
10273
3a8c13b71612
implement special-case optimization for sort of index vectors
Jaroslav Hajek <highegg@gmail.com>
parents:
10258
diff
changeset
|
89 |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
90 idx_vector::idx_base_rep * |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
91 idx_vector::idx_colon_rep::sort_idx (Array<octave_idx_type>&) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
92 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
93 (*current_liboctave_error_handler) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
94 ("internal error: idx_colon_rep::sort_idx"); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
95 } |
9894
83bd7f34f9da
improve idx_vector->octave_value conversion
Jaroslav Hajek <highegg@gmail.com>
parents:
9879
diff
changeset
|
96 |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
97 std::ostream& idx_vector::idx_colon_rep::print (std::ostream& os) const |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
98 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
99 return os << ':'; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
100 } |
10425
0677c5d80b77
rewrite 1D sparse indexing
Jaroslav Hajek <highegg@gmail.com>
parents:
10370
diff
changeset
|
101 |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
102 idx_vector::idx_range_rep::idx_range_rep (octave_idx_type start, |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
103 octave_idx_type limit, |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
104 octave_idx_type step) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
105 : idx_base_rep (), m_start(start), |
31204
a81fad5c9fef
idx_vector: Fix wrong length calculation (bug #62968).
Maged Rifaat <magedrifaat@gmail.com>
parents:
30564
diff
changeset
|
106 // Round length away from zero to catch incomplete intervals |
a81fad5c9fef
idx_vector: Fix wrong length calculation (bug #62968).
Maged Rifaat <magedrifaat@gmail.com>
parents:
30564
diff
changeset
|
107 m_len (step |
a81fad5c9fef
idx_vector: Fix wrong length calculation (bug #62968).
Maged Rifaat <magedrifaat@gmail.com>
parents:
30564
diff
changeset
|
108 ? std::max ((limit - start + step - (step > 0 ? 1 : -1)) / step, |
a81fad5c9fef
idx_vector: Fix wrong length calculation (bug #62968).
Maged Rifaat <magedrifaat@gmail.com>
parents:
30564
diff
changeset
|
109 static_cast<octave_idx_type> (0)) |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
110 : -1), |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
111 m_step (step) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
112 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
113 if (m_len < 0) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
114 err_invalid_range (); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
115 if (m_start < 0) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
116 err_invalid_index (m_start); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
117 if (m_step < 0 && m_start + (m_len-1)*m_step < 0) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
118 err_invalid_index (m_start + (m_len-1)*m_step); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
119 } |
1560 | 120 |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
121 idx_vector::idx_range_rep::idx_range_rep (const range<double>& r) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
122 : idx_base_rep (), m_start (0), m_len (r.numel ()), m_step (1) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
123 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
124 if (m_len < 0) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
125 err_invalid_range (); |
10487 | 126 |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
127 if (m_len > 0) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
128 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
129 if (r.all_elements_are_ints ()) |
9772
3ac8ea48279b
improve index reduction rules
Jaroslav Hajek <highegg@gmail.com>
parents:
9757
diff
changeset
|
130 { |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
131 m_start = static_cast<octave_idx_type> (r.base ()) - 1; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
132 m_step = static_cast<octave_idx_type> (r.increment ()); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
133 if (m_start < 0) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
134 err_invalid_index (m_start); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
135 if (m_step < 0 && m_start + (m_len - 1)*m_step < 0) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
136 err_invalid_index (m_start + (m_len - 1)*m_step); |
9772
3ac8ea48279b
improve index reduction rules
Jaroslav Hajek <highegg@gmail.com>
parents:
9757
diff
changeset
|
137 } |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
138 else |
8290
7cbe01c21986
improve dense array indexing
Jaroslav Hajek <highegg@gmail.com>
parents:
7774
diff
changeset
|
139 { |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
140 // find first non-integer, then gripe about it |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
141 double b = r.base (); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
142 double inc = r.increment (); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
143 err_invalid_index (b != std::trunc (b) ? b : b + inc); |
8290
7cbe01c21986
improve dense array indexing
Jaroslav Hajek <highegg@gmail.com>
parents:
7774
diff
changeset
|
144 } |
7cbe01c21986
improve dense array indexing
Jaroslav Hajek <highegg@gmail.com>
parents:
7774
diff
changeset
|
145 } |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
146 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
147 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
148 octave_idx_type |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
149 idx_vector::idx_range_rep::checkelem (octave_idx_type i) const |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
150 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
151 if (i < 0 || i >= m_len) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
152 err_index_out_of_range (); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
153 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
154 return m_start + i*m_step; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
155 } |
10487 | 156 |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
157 idx_vector::idx_base_rep * idx_vector::idx_range_rep::sort_uniq_clone (bool) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
158 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
159 if (m_step < 0) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
160 return new idx_range_rep (m_start + (m_len - 1)*m_step, m_len, -m_step, DIRECT); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
161 else |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
162 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
163 m_count++; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
164 return this; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
165 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
166 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
167 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
168 idx_vector::idx_base_rep * |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
169 idx_vector::idx_range_rep::sort_idx (Array<octave_idx_type>& idx) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
170 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
171 if (m_step < 0 && m_len > 0) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
172 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
173 idx.clear (1, m_len); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
174 for (octave_idx_type i = 0; i < m_len; i++) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
175 idx.xelem (i) = m_len - 1 - i; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
176 return new idx_range_rep (m_start + (m_len - 1)*m_step, m_len, -m_step, DIRECT); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
177 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
178 else |
8290
7cbe01c21986
improve dense array indexing
Jaroslav Hajek <highegg@gmail.com>
parents:
7774
diff
changeset
|
179 { |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
180 idx.clear (1, m_len); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
181 for (octave_idx_type i = 0; i < m_len; i++) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
182 idx.xelem (i) = i; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
183 m_count++; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
184 return this; |
8290
7cbe01c21986
improve dense array indexing
Jaroslav Hajek <highegg@gmail.com>
parents:
7774
diff
changeset
|
185 } |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
186 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
187 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
188 std::ostream& idx_vector::idx_range_rep::print (std::ostream& os) const |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
189 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
190 os << m_start << ':' << m_step << ':' << m_start + m_len*m_step; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
191 return os; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
192 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
193 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
194 range<double> idx_vector::idx_range_rep::unconvert (void) const |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
195 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
196 return range<double>::make_n_element_range |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
197 (static_cast<double> (m_start+1), static_cast<double> (m_step), m_len); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
198 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
199 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
200 Array<octave_idx_type> idx_vector::idx_range_rep::as_array (void) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
201 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
202 Array<octave_idx_type> retval (dim_vector (1, m_len)); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
203 for (octave_idx_type i = 0; i < m_len; i++) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
204 retval.xelem (i) = m_start + i*m_step; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
205 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
206 return retval; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
207 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
208 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
209 inline octave_idx_type convert_index (octave_idx_type i, octave_idx_type& ext) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
210 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
211 if (i <= 0) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
212 err_invalid_index (i-1); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
213 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
214 if (ext < i) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
215 ext = i; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
216 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
217 return i - 1; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
218 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
219 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
220 inline octave_idx_type convert_index (double x, octave_idx_type& ext) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
221 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
222 octave_idx_type i = static_cast<octave_idx_type> (x); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
223 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
224 if (static_cast<double> (i) != x) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
225 err_invalid_index (x-1); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
226 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
227 return convert_index (i, ext); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
228 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
229 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
230 inline octave_idx_type convert_index (float x, octave_idx_type& ext) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
231 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
232 return convert_index (static_cast<double> (x), ext); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
233 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
234 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
235 template <typename T> |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
236 inline octave_idx_type convert_index (octave_int<T> x, octave_idx_type& ext) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
237 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
238 octave_idx_type i = octave_int<octave_idx_type> (x).value (); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
239 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
240 return convert_index (i, ext); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
241 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
242 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
243 template <typename T> |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
244 idx_vector::idx_scalar_rep::idx_scalar_rep (T x) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
245 : idx_base_rep (), m_data (0) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
246 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
247 octave_idx_type dummy = 0; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
248 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
249 m_data = convert_index (x, dummy); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
250 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
251 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
252 idx_vector::idx_scalar_rep::idx_scalar_rep (octave_idx_type i) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
253 : idx_base_rep (), m_data (i) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
254 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
255 if (m_data < 0) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
256 err_invalid_index (m_data); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
257 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
258 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
259 octave_idx_type |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
260 idx_vector::idx_scalar_rep::checkelem (octave_idx_type i) const |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
261 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
262 if (i != 0) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
263 err_index_out_of_range (); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
264 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
265 return m_data; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
266 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
267 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
268 idx_vector::idx_base_rep * |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
269 idx_vector::idx_scalar_rep::sort_idx (Array<octave_idx_type>& idx) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
270 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
271 idx.clear (1, 1); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
272 idx.fill (0); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
273 m_count++; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
274 return this; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
275 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
276 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
277 std::ostream& idx_vector::idx_scalar_rep::print (std::ostream& os) const |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
278 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
279 return os << m_data; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
280 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
281 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
282 double idx_vector::idx_scalar_rep::unconvert (void) const |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
283 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
284 return m_data + 1; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
285 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
286 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
287 Array<octave_idx_type> idx_vector::idx_scalar_rep::as_array (void) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
288 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
289 return Array<octave_idx_type> (dim_vector (1, 1), m_data); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
290 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
291 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
292 template <typename T> |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
293 idx_vector::idx_vector_rep::idx_vector_rep (const Array<T>& nda) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
294 : idx_base_rep (), m_data (nullptr), m_len (nda.numel ()), m_ext (0), |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
295 m_aowner (nullptr), m_orig_dims (nda.dims ()) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
296 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
297 if (m_len != 0) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
298 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
299 std::unique_ptr<octave_idx_type []> d (new octave_idx_type [m_len]); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
300 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
301 for (octave_idx_type i = 0; i < m_len; i++) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
302 d[i] = convert_index (nda.xelem (i), m_ext); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
303 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
304 m_data = d.release (); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
305 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
306 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
307 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
308 // Note that this makes a shallow copy of the index array. |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
309 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
310 idx_vector::idx_vector_rep::idx_vector_rep (const Array<octave_idx_type>& inda) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
311 : idx_base_rep (), m_data (inda.data ()), m_len (inda.numel ()), m_ext (0), |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
312 m_aowner (new Array<octave_idx_type> (inda)), m_orig_dims (inda.dims ()) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
313 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
314 if (m_len != 0) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
315 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
316 octave_idx_type max = -1; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
317 for (octave_idx_type i = 0; i < m_len; i++) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
318 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
319 octave_idx_type k = inda.xelem (i); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
320 if (k < 0) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
321 err_invalid_index (k); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
322 else if (k > max) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
323 max = k; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
324 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
325 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
326 m_ext = max + 1; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
327 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
328 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
329 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
330 idx_vector::idx_vector_rep::idx_vector_rep (const Array<octave_idx_type>& inda, |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
331 octave_idx_type ext, direct) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
332 : idx_base_rep (), m_data (inda.data ()), m_len (inda.numel ()), |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
333 m_ext (ext), m_aowner (new Array<octave_idx_type> (inda)), |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
334 m_orig_dims (inda.dims ()) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
335 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
336 // No checking. |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
337 if (m_ext < 0) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
338 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
339 octave_idx_type max = -1; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
340 for (octave_idx_type i = 0; i < m_len; i++) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
341 if (m_data[i] > max) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
342 max = m_data[i]; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
343 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
344 m_ext = max + 1; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
345 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
346 } |
10487 | 347 |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
348 idx_vector::idx_vector_rep::idx_vector_rep (bool b) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
349 : idx_base_rep (), m_data (nullptr), m_len (b ? 1 : 0), m_ext (0), |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
350 m_aowner (nullptr), m_orig_dims (m_len, m_len) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
351 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
352 if (m_len != 0) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
353 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
354 octave_idx_type *d = new octave_idx_type [1]; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
355 d[0] = 0; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
356 m_data = d; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
357 m_ext = 1; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
358 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
359 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
360 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
361 idx_vector::idx_vector_rep::idx_vector_rep (const Array<bool>& bnda, |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
362 octave_idx_type nnz) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
363 : idx_base_rep (), m_data (nullptr), m_len (nnz), m_ext (0), |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
364 m_aowner (nullptr), m_orig_dims () |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
365 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
366 if (nnz < 0) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
367 m_len = bnda.nnz (); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
368 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
369 const dim_vector dv = bnda.dims (); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
370 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
371 m_orig_dims = dv.make_nd_vector (m_len); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
372 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
373 if (m_len != 0) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
374 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
375 octave_idx_type *d = new octave_idx_type [m_len]; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
376 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
377 octave_idx_type ntot = bnda.numel (); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
378 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
379 octave_idx_type k = 0; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
380 for (octave_idx_type i = 0; i < ntot; i++) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
381 if (bnda.xelem (i)) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
382 d[k++] = i; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
383 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
384 m_data = d; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
385 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
386 m_ext = d[k-1] + 1; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
387 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
388 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
389 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
390 idx_vector::idx_vector_rep::idx_vector_rep (const Sparse<bool>& bnda) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
391 : idx_base_rep (), m_data (nullptr), m_len (bnda.nnz ()), m_ext (0), |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
392 m_aowner (nullptr), m_orig_dims () |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
393 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
394 const dim_vector dv = bnda.dims (); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
395 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
396 m_orig_dims = dv.make_nd_vector (m_len); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
397 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
398 if (m_len != 0) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
399 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
400 octave_idx_type *d = new octave_idx_type [m_len]; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
401 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
402 octave_idx_type k = 0; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
403 octave_idx_type nc = bnda.cols (); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
404 octave_idx_type nr = bnda.rows (); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
405 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
406 for (octave_idx_type j = 0; j < nc; j++) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
407 for (octave_idx_type i = bnda.cidx (j); i < bnda.cidx (j+1); i++) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
408 if (bnda.data (i)) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
409 d[k++] = j * nr + bnda.ridx (i); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
410 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
411 m_data = d; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
412 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
413 m_ext = d[k-1] + 1; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
414 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
415 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
416 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
417 idx_vector::idx_vector_rep::~idx_vector_rep (void) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
418 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
419 if (m_aowner) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
420 delete m_aowner; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
421 else |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
422 delete [] m_data; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
423 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
424 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
425 octave_idx_type |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
426 idx_vector::idx_vector_rep::checkelem (octave_idx_type n) const |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
427 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
428 if (n < 0 || n >= m_len) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
429 err_invalid_index (n); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
430 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
431 return xelem (n); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
432 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
433 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
434 idx_vector::idx_base_rep * |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
435 idx_vector::idx_vector_rep::sort_uniq_clone (bool uniq) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
436 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
437 if (m_len == 0) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
438 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
439 m_count++; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
440 return this; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
441 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
442 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
443 // This is wrapped in unique_ptr so that we don't leak on out-of-memory. |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
444 std::unique_ptr<idx_vector_rep> new_rep |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
445 (new idx_vector_rep (nullptr, m_len, m_ext, m_orig_dims, DIRECT)); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
446 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
447 if (m_ext > m_len*math::log2 (1.0 + m_len)) |
9879
034677ab6865
smarter treatment of mask indexing
Jaroslav Hajek <highegg@gmail.com>
parents:
9780
diff
changeset
|
448 { |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
449 // Use standard sort via octave_sort. |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
450 octave_idx_type *new_data = new octave_idx_type [m_len]; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
451 new_rep->m_data = new_data; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
452 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
453 std::copy_n (m_data, m_len, new_data); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
454 octave_sort<octave_idx_type> lsort; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
455 lsort.set_compare (ASCENDING); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
456 lsort.sort (new_data, m_len); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
457 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
458 if (uniq) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
459 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
460 octave_idx_type new_len = std::unique (new_data, new_data + m_len) |
30394
f3f3e3793fb5
maint: style check C++ files in liboctave/ ahead of 7.1 release.
Rik <rik@octave.org>
parents:
29569
diff
changeset
|
461 - new_data; |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
462 new_rep->m_len = new_len; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
463 if (new_rep->m_orig_dims.ndims () == 2 && new_rep->m_orig_dims(0) == 1) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
464 new_rep->m_orig_dims = dim_vector (1, new_len); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
465 else |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
466 new_rep->m_orig_dims = dim_vector (new_len, 1); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
467 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
468 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
469 else if (uniq) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
470 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
471 // Use two-pass bucket sort (only a mask array needed). |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
472 OCTAVE_LOCAL_BUFFER_INIT (bool, has, m_ext, false); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
473 for (octave_idx_type i = 0; i < m_len; i++) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
474 has[m_data[i]] = true; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
475 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
476 octave_idx_type new_len = 0; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
477 for (octave_idx_type i = 0; i < m_ext; i++) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
478 new_len += has[i]; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
479 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
480 new_rep->m_len = new_len; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
481 if (new_rep->m_orig_dims.ndims () == 2 && new_rep->m_orig_dims(0) == 1) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
482 new_rep->m_orig_dims = dim_vector (1, new_len); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
483 else |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
484 new_rep->m_orig_dims = dim_vector (new_len, 1); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
485 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
486 octave_idx_type *new_data = new octave_idx_type [new_len]; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
487 new_rep->m_data = new_data; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
488 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
489 for (octave_idx_type i = 0, j = 0; i < m_ext; i++) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
490 if (has[i]) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
491 new_data[j++] = i; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
492 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
493 else |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
494 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
495 // Use two-pass bucket sort. |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
496 OCTAVE_LOCAL_BUFFER_INIT (octave_idx_type, cnt, m_ext, 0); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
497 for (octave_idx_type i = 0; i < m_len; i++) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
498 cnt[m_data[i]]++; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
499 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
500 octave_idx_type *new_data = new octave_idx_type [m_len]; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
501 new_rep->m_data = new_data; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
502 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
503 for (octave_idx_type i = 0, j = 0; i < m_ext; i++) |
9879
034677ab6865
smarter treatment of mask indexing
Jaroslav Hajek <highegg@gmail.com>
parents:
9780
diff
changeset
|
504 { |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
505 for (octave_idx_type k = 0; k < cnt[i]; k++) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
506 new_data[j++] = i; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
507 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
508 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
509 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
510 return new_rep.release (); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
511 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
512 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
513 idx_vector::idx_base_rep * |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
514 idx_vector::idx_vector_rep::sort_idx (Array<octave_idx_type>& idx) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
515 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
516 // This is wrapped in unique_ptr so that we don't leak on out-of-memory. |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
517 std::unique_ptr<idx_vector_rep> new_rep |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
518 (new idx_vector_rep (nullptr, m_len, m_ext, m_orig_dims, DIRECT)); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
519 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
520 if (m_ext > m_len*math::log2 (1.0 + m_len)) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
521 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
522 // Use standard sort via octave_sort. |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
523 idx.clear (m_orig_dims); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
524 octave_idx_type *idx_data = idx.fortran_vec (); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
525 for (octave_idx_type i = 0; i < m_len; i++) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
526 idx_data[i] = i; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
527 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
528 octave_idx_type *new_data = new octave_idx_type [m_len]; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
529 new_rep->m_data = new_data; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
530 std::copy_n (m_data, m_len, new_data); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
531 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
532 octave_sort<octave_idx_type> lsort; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
533 lsort.set_compare (ASCENDING); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
534 lsort.sort (new_data, idx_data, m_len); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
535 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
536 else |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
537 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
538 // Use two-pass bucket sort. |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
539 OCTAVE_LOCAL_BUFFER_INIT (octave_idx_type, cnt, m_ext, 0); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
540 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
541 for (octave_idx_type i = 0; i < m_len; i++) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
542 cnt[m_data[i]]++; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
543 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
544 idx.clear (m_orig_dims); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
545 octave_idx_type *idx_data = idx.fortran_vec (); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
546 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
547 octave_idx_type *new_data = new octave_idx_type [m_len]; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
548 new_rep->m_data = new_data; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
549 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
550 for (octave_idx_type i = 0, k = 0; i < m_ext; i++) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
551 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
552 octave_idx_type j = cnt[i]; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
553 cnt[i] = k; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
554 k += j; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
555 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
556 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
557 for (octave_idx_type i = 0; i < m_len; i++) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
558 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
559 octave_idx_type j = m_data[i]; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
560 octave_idx_type k = cnt[j]++; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
561 new_data[k] = j; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
562 idx_data[k] = i; |
9879
034677ab6865
smarter treatment of mask indexing
Jaroslav Hajek <highegg@gmail.com>
parents:
9780
diff
changeset
|
563 } |
034677ab6865
smarter treatment of mask indexing
Jaroslav Hajek <highegg@gmail.com>
parents:
9780
diff
changeset
|
564 } |
10487 | 565 |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
566 return new_rep.release (); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
567 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
568 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
569 std::ostream& idx_vector::idx_vector_rep::print (std::ostream& os) const |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
570 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
571 os << '['; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
572 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
573 for (octave_idx_type i = 0; i < m_len - 1; i++) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
574 os << m_data[i] << ',' << ' '; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
575 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
576 if (m_len > 0) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
577 os << m_data[m_len-1]; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
578 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
579 os << ']'; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
580 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
581 return os; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
582 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
583 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
584 Array<double> idx_vector::idx_vector_rep::unconvert (void) const |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
585 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
586 Array<double> retval (m_orig_dims); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
587 for (octave_idx_type i = 0; i < m_len; i++) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
588 retval.xelem (i) = m_data[i] + 1; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
589 return retval; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
590 } |
8290
7cbe01c21986
improve dense array indexing
Jaroslav Hajek <highegg@gmail.com>
parents:
7774
diff
changeset
|
591 |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
592 Array<octave_idx_type> idx_vector::idx_vector_rep::as_array (void) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
593 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
594 if (m_aowner) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
595 return *m_aowner; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
596 else |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
597 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
598 Array<octave_idx_type> retval (m_orig_dims); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
599 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
600 if (m_data) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
601 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
602 std::memcpy (retval.fortran_vec (), m_data, m_len*sizeof (octave_idx_type)); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
603 // Delete the old copy and share the m_data instead to save memory. |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
604 delete [] m_data; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
605 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
606 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
607 m_data = retval.fortran_vec (); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
608 m_aowner = new Array<octave_idx_type> (retval); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
609 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
610 return retval; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
611 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
612 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
613 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
614 idx_vector::idx_mask_rep::idx_mask_rep (bool b) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
615 : idx_base_rep (), m_data (nullptr), m_len (b ? 1 : 0), m_ext (0), |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
616 m_lsti (-1), m_lste (-1), m_aowner (nullptr), m_orig_dims (m_len, m_len) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
617 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
618 if (m_len != 0) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
619 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
620 bool *d = new bool [1]; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
621 d[0] = true; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
622 m_data = d; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
623 m_ext = 1; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
624 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
625 } |
8290
7cbe01c21986
improve dense array indexing
Jaroslav Hajek <highegg@gmail.com>
parents:
7774
diff
changeset
|
626 |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
627 idx_vector::idx_mask_rep::idx_mask_rep (const Array<bool>& bnda, |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
628 octave_idx_type nnz) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
629 : idx_base_rep (), m_data (nullptr), m_len (nnz), m_ext (bnda.numel ()), |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
630 m_lsti (-1), m_lste (-1), m_aowner (nullptr), m_orig_dims () |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
631 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
632 if (nnz < 0) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
633 m_len = bnda.nnz (); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
634 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
635 // We truncate the extent as much as possible. For Matlab |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
636 // compatibility, but maybe it's not a bad idea anyway. |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
637 while (m_ext > 0 && ! bnda(m_ext-1)) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
638 m_ext--; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
639 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
640 const dim_vector dv = bnda.dims (); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
641 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
642 m_orig_dims = dv.make_nd_vector (m_len); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
643 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
644 m_aowner = new Array<bool> (bnda); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
645 m_data = bnda.data (); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
646 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
647 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
648 idx_vector::idx_mask_rep::~idx_mask_rep (void) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
649 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
650 if (m_aowner) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
651 delete m_aowner; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
652 else |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
653 delete [] m_data; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
654 } |
10487 | 655 |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
656 octave_idx_type idx_vector::idx_mask_rep::xelem (octave_idx_type n) const |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
657 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
658 if (n == m_lsti + 1) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
659 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
660 m_lsti = n; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
661 while (! m_data[++m_lste]) ; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
662 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
663 else |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
664 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
665 m_lsti = n++; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
666 m_lste = -1; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
667 while (n > 0) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
668 if (m_data[++m_lste]) --n; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
669 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
670 return m_lste; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
671 } |
10487 | 672 |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
673 octave_idx_type idx_vector::idx_mask_rep::checkelem (octave_idx_type n) const |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
674 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
675 if (n < 0 || n >= m_len) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
676 err_invalid_index (n); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
677 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
678 return xelem (n); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
679 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
680 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
681 std::ostream& idx_vector::idx_mask_rep::print (std::ostream& os) const |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
682 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
683 os << '['; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
684 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
685 for (octave_idx_type i = 0; i < m_ext - 1; i++) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
686 os << m_data[i] << ',' << ' '; |
10487 | 687 |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
688 if (m_ext > 0) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
689 os << m_data[m_ext-1]; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
690 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
691 os << ']'; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
692 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
693 return os; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
694 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
695 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
696 Array<bool> idx_vector::idx_mask_rep::unconvert (void) const |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
697 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
698 if (m_aowner) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
699 return *m_aowner; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
700 else |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
701 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
702 Array<bool> retval (dim_vector (m_ext, 1)); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
703 for (octave_idx_type i = 0; i < m_ext; i++) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
704 retval.xelem (i) = m_data[i]; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
705 return retval; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
706 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
707 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
708 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
709 Array<octave_idx_type> idx_vector::idx_mask_rep::as_array (void) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
710 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
711 if (m_aowner) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
712 return m_aowner->find ().reshape (m_orig_dims); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
713 else |
9725 | 714 { |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
715 Array<bool> retval (m_orig_dims); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
716 for (octave_idx_type i = 0, j = 0; i < m_ext; i++) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
717 if (m_data[i]) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
718 retval.xelem (j++) = i; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
719 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
720 return retval; |
9725 | 721 } |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
722 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
723 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
724 idx_vector::idx_base_rep * |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
725 idx_vector::idx_mask_rep::sort_idx (Array<octave_idx_type>& idx) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
726 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
727 idx.clear (m_len, 1); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
728 for (octave_idx_type i = 0; i < m_len; i++) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
729 idx.xelem (i) = i; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
730 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
731 m_count++; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
732 return this; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
733 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
734 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
735 const idx_vector idx_vector::colon (new idx_vector::idx_colon_rep ()); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
736 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
737 idx_vector::idx_vector (const Array<bool>& bnda) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
738 : m_rep (nullptr) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
739 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
740 // Convert only if it means saving at least half the memory. |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
741 static const int factor = (2 * sizeof (octave_idx_type)); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
742 octave_idx_type nnz = bnda.nnz (); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
743 if (nnz <= bnda.numel () / factor) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
744 m_rep = new idx_vector_rep (bnda, nnz); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
745 else |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
746 m_rep = new idx_mask_rep (bnda, nnz); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
747 } |
10487 | 748 |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
749 bool idx_vector::maybe_reduce (octave_idx_type n, const idx_vector& j, |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
750 octave_idx_type nj) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
751 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
752 bool reduced = false; |
10487 | 753 |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
754 // Empty index always reduces. |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
755 if (m_rep->length (n) == 0) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
756 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
757 *this = idx_vector (); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
758 return true; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
759 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
760 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
761 // Possibly skip singleton dims. |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
762 if (n == 1 && m_rep->is_colon_equiv (n)) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
763 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
764 *this = j; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
765 return true; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
766 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
767 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
768 if (nj == 1 && j.is_colon_equiv (nj)) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
769 return true; |
9725 | 770 |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
771 switch (j.idx_class ()) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
772 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
773 case class_colon: |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
774 switch (m_rep->idx_class ()) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
775 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
776 case class_colon: |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
777 // (:,:) reduces to (:) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
778 reduced = true; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
779 break; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
780 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
781 case class_scalar: |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
782 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
783 // (i,:) reduces to a range. |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
784 idx_scalar_rep *r = dynamic_cast<idx_scalar_rep *> (m_rep); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
785 octave_idx_type k = r->get_data (); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
786 *this = new idx_range_rep (k, nj, n, DIRECT); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
787 reduced = true; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
788 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
789 break; |
10475
739109ef88ee
helper idx_vector methods
Jaroslav Hajek <highegg@gmail.com>
parents:
10425
diff
changeset
|
790 |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
791 case class_range: |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
792 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
793 // (i:k:end,:) reduces to a range if i <= k and k divides n. |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
794 idx_range_rep *r = dynamic_cast<idx_range_rep *> (m_rep); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
795 octave_idx_type s = r->get_start (); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
796 octave_idx_type l = r->length (n); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
797 octave_idx_type t = r->get_step (); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
798 if (l*t == n) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
799 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
800 *this = new idx_range_rep (s, l * nj, t, DIRECT); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
801 reduced = true; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
802 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
803 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
804 break; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
805 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
806 default: |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
807 break; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
808 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
809 break; |
10487 | 810 |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
811 case class_range: |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
812 switch (m_rep->idx_class ()) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
813 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
814 case class_colon: |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
815 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
816 // (:,i:j) reduces to a range (the m_step must be 1) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
817 idx_range_rep *rj = dynamic_cast<idx_range_rep *> (j.m_rep); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
818 if (rj->get_step () == 1) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
819 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
820 octave_idx_type sj = rj->get_start (); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
821 octave_idx_type lj = rj->length (nj); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
822 *this = new idx_range_rep (sj * n, lj * n, 1, DIRECT); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
823 reduced = true; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
824 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
825 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
826 break; |
10487 | 827 |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
828 case class_scalar: |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
829 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
830 // (k,i:d:j) reduces to a range. |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
831 idx_scalar_rep *r = dynamic_cast<idx_scalar_rep *> (m_rep); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
832 idx_range_rep *rj = dynamic_cast<idx_range_rep *> (j.m_rep); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
833 octave_idx_type k = r->get_data (); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
834 octave_idx_type sj = rj->get_start (); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
835 octave_idx_type lj = rj->length (nj); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
836 octave_idx_type tj = rj->get_step (); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
837 *this = new idx_range_rep (n * sj + k, lj, n * tj, DIRECT); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
838 reduced = true; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
839 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
840 break; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
841 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
842 case class_range: |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
843 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
844 // (i:k:end,p:q) reduces to a range if i <= k and k divides n. |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
845 // (ones (1, m), ones (1, n)) reduces to (ones (1, m*n)) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
846 idx_range_rep *r = dynamic_cast<idx_range_rep *> (m_rep); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
847 octave_idx_type s = r->get_start (); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
848 octave_idx_type l = r->length (n); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
849 octave_idx_type t = r->get_step (); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
850 idx_range_rep *rj = dynamic_cast<idx_range_rep *> (j.m_rep); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
851 octave_idx_type sj = rj->get_start (); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
852 octave_idx_type lj = rj->length (nj); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
853 octave_idx_type tj = rj->get_step (); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
854 if ((l*t == n && tj == 1) || (t == 0 && tj == 0)) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
855 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
856 *this = new idx_range_rep (s + n * sj, l * lj, t, DIRECT); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
857 reduced = true; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
858 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
859 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
860 break; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
861 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
862 default: |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
863 break; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
864 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
865 break; |
10475
739109ef88ee
helper idx_vector methods
Jaroslav Hajek <highegg@gmail.com>
parents:
10425
diff
changeset
|
866 |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
867 case class_scalar: |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
868 switch (m_rep->idx_class ()) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
869 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
870 case class_scalar: |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
871 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
872 // (i,j) reduces to a single index. |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
873 idx_scalar_rep *r = dynamic_cast<idx_scalar_rep *> (m_rep); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
874 idx_scalar_rep *rj = dynamic_cast<idx_scalar_rep *> (j.m_rep); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
875 octave_idx_type k = r->get_data () + n * rj->get_data (); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
876 *this = new idx_scalar_rep (k, DIRECT); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
877 reduced = true; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
878 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
879 break; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
880 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
881 case class_range: |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
882 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
883 // (i:d:j,k) reduces to a range. |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
884 idx_range_rep *r = dynamic_cast<idx_range_rep *> (m_rep); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
885 idx_scalar_rep *rj = dynamic_cast<idx_scalar_rep *> (j.m_rep); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
886 octave_idx_type s = r->get_start (); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
887 octave_idx_type l = r->length (nj); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
888 octave_idx_type t = r->get_step (); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
889 octave_idx_type k = rj->get_data (); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
890 *this = new idx_range_rep (n * k + s, l, t, DIRECT); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
891 reduced = true; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
892 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
893 break; |
9479
d9716e3ee0dd
supply optimized compiled sub2ind & ind2sub
Jaroslav Hajek <highegg@gmail.com>
parents:
9124
diff
changeset
|
894 |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
895 case class_colon: |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
896 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
897 // (:,k) reduces to a range. |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
898 idx_scalar_rep *rj = dynamic_cast<idx_scalar_rep *> (j.m_rep); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
899 octave_idx_type k = rj->get_data (); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
900 *this = new idx_range_rep (n * k, n, 1, DIRECT); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
901 reduced = true; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
902 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
903 break; |
10487 | 904 |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
905 default: |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
906 break; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
907 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
908 break; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
909 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
910 default: |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
911 break; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
912 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
913 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
914 return reduced; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
915 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
916 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
917 bool idx_vector::is_cont_range (octave_idx_type n, octave_idx_type& l, |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
918 octave_idx_type& u) const |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
919 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
920 bool res = false; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
921 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
922 switch (m_rep->idx_class ()) |
10487 | 923 { |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
924 case class_colon: |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
925 l = 0; u = n; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
926 res = true; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
927 break; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
928 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
929 case class_range: |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
930 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
931 idx_range_rep *r = dynamic_cast<idx_range_rep *> (m_rep); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
932 if (r->get_step () == 1) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
933 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
934 l = r->get_start (); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
935 u = l + r->length (n); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
936 res = true; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
937 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
938 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
939 break; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
940 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
941 case class_scalar: |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
942 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
943 idx_scalar_rep *r = dynamic_cast<idx_scalar_rep *> (m_rep); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
944 l = r->get_data (); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
945 u = l + 1; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
946 res = true; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
947 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
948 break; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
949 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
950 case class_mask: |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
951 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
952 idx_mask_rep *r = dynamic_cast<idx_mask_rep *> (m_rep); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
953 octave_idx_type m_ext = r->extent (0); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
954 octave_idx_type m_len = r->length (0); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
955 if (m_ext == m_len) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
956 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
957 l = 0; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
958 u = m_len; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
959 res = true; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
960 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
961 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
962 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
963 default: |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
964 break; |
10487 | 965 } |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
966 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
967 return res; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
968 } |
10487 | 969 |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
970 octave_idx_type idx_vector::increment (void) const |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
971 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
972 octave_idx_type retval = 0; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
973 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
974 switch (m_rep->idx_class ()) |
10487 | 975 { |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
976 case class_colon: |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
977 retval = 1; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
978 break; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
979 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
980 case class_range: |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
981 retval = dynamic_cast<idx_range_rep *> (m_rep) -> get_step (); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
982 break; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
983 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
984 case class_vector: |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
985 case class_mask: |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
986 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
987 if (length (0) > 1) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
988 retval = elem (1) - elem (0); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
989 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
990 break; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
991 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
992 default: |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
993 break; |
10487 | 994 } |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
995 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
996 return retval; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
997 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
998 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
999 const octave_idx_type * idx_vector::raw (void) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1000 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1001 if (m_rep->idx_class () != class_vector) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1002 *this = idx_vector (as_array (), extent (0)); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1003 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1004 idx_vector_rep *r = dynamic_cast<idx_vector_rep *> (m_rep); |
10487 | 1005 |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1006 assert (r != nullptr); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1007 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1008 return r->get_data (); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1009 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1010 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1011 void idx_vector::copy_data (octave_idx_type *m_data) const |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1012 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1013 octave_idx_type m_len = m_rep->length (0); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1014 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1015 switch (m_rep->idx_class ()) |
10487 | 1016 { |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1017 case class_colon: |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1018 (*current_liboctave_error_handler) ("colon not allowed"); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1019 break; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1020 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1021 case class_range: |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1022 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1023 idx_range_rep *r = dynamic_cast<idx_range_rep *> (m_rep); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1024 octave_idx_type m_start = r->get_start (); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1025 octave_idx_type m_step = r->get_step (); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1026 octave_idx_type i, j; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1027 if (m_step == 1) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1028 for (i = m_start, j = m_start + m_len; i < j; i++) *m_data++ = i; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1029 else if (m_step == -1) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1030 for (i = m_start, j = m_start - m_len; i > j; i--) *m_data++ = i; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1031 else |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1032 for (i = 0, j = m_start; i < m_len; i++, j += m_step) *m_data++ = j; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1033 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1034 break; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1035 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1036 case class_scalar: |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1037 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1038 idx_scalar_rep *r = dynamic_cast<idx_scalar_rep *> (m_rep); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1039 *m_data = r->get_data (); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1040 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1041 break; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1042 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1043 case class_vector: |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1044 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1045 idx_vector_rep *r = dynamic_cast<idx_vector_rep *> (m_rep); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1046 const octave_idx_type *rdata = r->get_data (); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1047 std::copy_n (rdata, m_len, m_data); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1048 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1049 break; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1050 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1051 case class_mask: |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1052 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1053 idx_mask_rep *r = dynamic_cast<idx_mask_rep *> (m_rep); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1054 const bool *mask = r->get_data (); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1055 octave_idx_type m_ext = r->extent (0); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1056 for (octave_idx_type i = 0, j = 0; i < m_ext; i++) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1057 if (mask[i]) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1058 m_data[j++] = i; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1059 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1060 break; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1061 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1062 default: |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1063 assert (false); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1064 break; |
10487 | 1065 } |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1066 } |
10487 | 1067 |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1068 idx_vector idx_vector::complement (octave_idx_type n) const |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1069 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1070 idx_vector retval; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1071 if (extent (n) > n) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1072 (*current_liboctave_error_handler) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1073 ("internal error: out of range complement index requested"); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1074 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1075 if (idx_class () == class_mask) |
10702
c49911ab7ac7
implement missing copy_data case in idx_vector (bug #30099)
Jaroslav Hajek <highegg@gmail.com>
parents:
10620
diff
changeset
|
1076 { |
29568
a7cbd0e54e7a
use m_ prefix for data members in idx_vector classes
John W. Eaton <jwe@octave.org>
parents:
29567
diff
changeset
|
1077 idx_mask_rep *r = dynamic_cast<idx_mask_rep *> (m_rep); |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1078 octave_idx_type nz = r->length (0); |
29568
a7cbd0e54e7a
use m_ prefix for data members in idx_vector classes
John W. Eaton <jwe@octave.org>
parents:
29567
diff
changeset
|
1079 octave_idx_type m_ext = r->extent (0); |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1080 Array<bool> mask (dim_vector (n, 1)); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1081 const bool *m_data = r->get_data (); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1082 bool *ndata = mask.fortran_vec (); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1083 for (octave_idx_type i = 0; i < m_ext; i++) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1084 ndata[i] = ! m_data[i]; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1085 std::fill_n (ndata + m_ext, n - m_ext, true); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1086 retval = new idx_mask_rep (mask, n - nz); |
10702
c49911ab7ac7
implement missing copy_data case in idx_vector (bug #30099)
Jaroslav Hajek <highegg@gmail.com>
parents:
10620
diff
changeset
|
1087 } |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1088 else |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1089 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1090 Array<bool> mask (dim_vector (n, 1), true); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1091 fill (false, length (n), mask.fortran_vec ()); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1092 retval = idx_vector (mask); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1093 } |
3680 | 1094 |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1095 return retval; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1096 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1097 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1098 bool idx_vector::is_permutation (octave_idx_type n) const |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1099 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1100 bool retval = false; |
8290
7cbe01c21986
improve dense array indexing
Jaroslav Hajek <highegg@gmail.com>
parents:
7774
diff
changeset
|
1101 |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1102 if (is_colon_equiv (n)) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1103 retval = true; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1104 else if (length(n) == n && extent(n) == n) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1105 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1106 OCTAVE_LOCAL_BUFFER_INIT (bool, left, n, true); |
8290
7cbe01c21986
improve dense array indexing
Jaroslav Hajek <highegg@gmail.com>
parents:
7774
diff
changeset
|
1107 |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1108 retval = true; |
8367
445d27d79f4e
support permutation matrix objects
Jaroslav Hajek <highegg@gmail.com>
parents:
8333
diff
changeset
|
1109 |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1110 for (octave_idx_type i = 0, m_len = length (); i < m_len; i++) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1111 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1112 octave_idx_type k = xelem (i); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1113 if (left[k]) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1114 left[k] = false; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1115 else |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1116 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1117 retval = false; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1118 break; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1119 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1120 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1121 } |
8367
445d27d79f4e
support permutation matrix objects
Jaroslav Hajek <highegg@gmail.com>
parents:
8333
diff
changeset
|
1122 |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1123 return retval; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1124 } |
8367
445d27d79f4e
support permutation matrix objects
Jaroslav Hajek <highegg@gmail.com>
parents:
8333
diff
changeset
|
1125 |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1126 idx_vector idx_vector::inverse_permutation (octave_idx_type n) const |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1127 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1128 assert (n == length (n)); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1129 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1130 idx_vector retval; |
8367
445d27d79f4e
support permutation matrix objects
Jaroslav Hajek <highegg@gmail.com>
parents:
8333
diff
changeset
|
1131 |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1132 switch (idx_class ()) |
10512
aac9f4265048
rewrite sparse indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
10491
diff
changeset
|
1133 { |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1134 case class_range: |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1135 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1136 if (increment () == -1) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1137 retval = sorted (); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1138 else |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1139 retval = *this; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1140 break; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1141 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1142 case class_vector: |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1143 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1144 idx_vector_rep *r = dynamic_cast<idx_vector_rep *> (m_rep); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1145 const octave_idx_type *ri = r->get_data (); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1146 Array<octave_idx_type> idx (orig_dimensions ()); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1147 for (octave_idx_type i = 0; i < n; i++) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1148 idx.xelem (ri[i]) = i; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1149 retval = new idx_vector_rep (idx, r->extent (0), DIRECT); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1150 break; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1151 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1152 default: |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1153 retval = *this; |
10516
f0266ee4aabe
optimize some special indexing & assignment cases
Jaroslav Hajek <highegg@gmail.com>
parents:
10512
diff
changeset
|
1154 break; |
10512
aac9f4265048
rewrite sparse indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
10491
diff
changeset
|
1155 } |
aac9f4265048
rewrite sparse indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
10491
diff
changeset
|
1156 |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1157 return retval; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1158 } |
9879
034677ab6865
smarter treatment of mask indexing
Jaroslav Hajek <highegg@gmail.com>
parents:
9780
diff
changeset
|
1159 |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1160 idx_vector idx_vector::unmask (void) const |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1161 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1162 if (idx_class () == class_mask) |
10487 | 1163 { |
29568
a7cbd0e54e7a
use m_ prefix for data members in idx_vector classes
John W. Eaton <jwe@octave.org>
parents:
29567
diff
changeset
|
1164 idx_mask_rep *r = dynamic_cast<idx_mask_rep *> (m_rep); |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1165 const bool *m_data = r->get_data (); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1166 octave_idx_type m_ext = r->extent (0); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1167 octave_idx_type m_len = r->length (0); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1168 octave_idx_type *idata = new octave_idx_type [m_len]; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1169 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1170 for (octave_idx_type i = 0, j = 0; i < m_ext; i++) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1171 if (m_data[i]) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1172 idata[j++] = i; |
10487 | 1173 |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1174 m_ext = (m_len > 0 ? idata[m_len - 1] + 1 : 0); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1175 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1176 return new idx_vector_rep (idata, m_len, m_ext, r->orig_dimensions (), |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1177 DIRECT); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1178 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1179 else |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1180 return *this; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1181 } |
9479
d9716e3ee0dd
supply optimized compiled sub2ind & ind2sub
Jaroslav Hajek <highegg@gmail.com>
parents:
9124
diff
changeset
|
1182 |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1183 void idx_vector::unconvert (idx_class_type& iclass, |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1184 double& scalar, range<double>& range, |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1185 Array<double>& array, Array<bool>& mask) const |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1186 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1187 iclass = idx_class (); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1188 switch (iclass) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1189 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1190 case class_colon: |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1191 break; |
10516
f0266ee4aabe
optimize some special indexing & assignment cases
Jaroslav Hajek <highegg@gmail.com>
parents:
10512
diff
changeset
|
1192 |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1193 case class_range: |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1194 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1195 idx_range_rep *r = dynamic_cast<idx_range_rep *> (m_rep); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1196 range = r->unconvert (); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1197 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1198 break; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1199 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1200 case class_scalar: |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1201 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1202 idx_scalar_rep *r = dynamic_cast<idx_scalar_rep *> (m_rep); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1203 scalar = r->unconvert (); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1204 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1205 break; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1206 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1207 case class_vector: |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1208 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1209 idx_vector_rep *r = dynamic_cast<idx_vector_rep *> (m_rep); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1210 array = r->unconvert (); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1211 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1212 break; |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11570
diff
changeset
|
1213 |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1214 case class_mask: |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1215 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1216 idx_mask_rep *r = dynamic_cast<idx_mask_rep *> (m_rep); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1217 mask = r->unconvert (); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1218 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1219 break; |
1560 | 1220 |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1221 default: |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1222 assert (false); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1223 break; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1224 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1225 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1226 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1227 Array<octave_idx_type> idx_vector::as_array (void) const |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1228 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1229 return m_rep->as_array (); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1230 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1231 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1232 bool idx_vector::isvector (void) const |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1233 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1234 return idx_class () != class_vector || orig_dimensions ().isvector (); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1235 } |
8290
7cbe01c21986
improve dense array indexing
Jaroslav Hajek <highegg@gmail.com>
parents:
7774
diff
changeset
|
1236 |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1237 octave_idx_type |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1238 idx_vector::freeze (octave_idx_type z_len, const char *, bool resize_ok) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1239 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1240 if (! resize_ok && extent (z_len) > z_len) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1241 (*current_liboctave_error_handler) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1242 ("invalid matrix index = %" OCTAVE_IDX_TYPE_FORMAT, extent (z_len)); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1243 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1244 return length (z_len); |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1245 } |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1246 |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1247 octave_idx_type idx_vector::ones_count () const |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1248 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1249 octave_idx_type n = 0; |
10487 | 1250 |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1251 if (is_colon ()) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1252 n = 1; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1253 else |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1254 { |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1255 for (octave_idx_type i = 0; i < length (1); i++) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1256 if (xelem (i) == 0) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1257 n++; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1258 } |
10487 | 1259 |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1260 return n; |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1261 } |
1 | 1262 |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1263 // Instantiate the octave_int constructors we want. |
22197
e43d83253e28
refill multi-line macro definitions
John W. Eaton <jwe@octave.org>
parents:
22022
diff
changeset
|
1264 #define INSTANTIATE_SCALAR_VECTOR_REP_CONST(T) \ |
e43d83253e28
refill multi-line macro definitions
John W. Eaton <jwe@octave.org>
parents:
22022
diff
changeset
|
1265 template OCTAVE_API idx_vector::idx_scalar_rep::idx_scalar_rep (T); \ |
8319
c374691576f6
Fix for MSVC compilation
Michael Goffioul <michael.goffioul@gmail.com>
parents:
8301
diff
changeset
|
1266 template OCTAVE_API idx_vector::idx_vector_rep::idx_vector_rep (const Array<T>&); |
8290
7cbe01c21986
improve dense array indexing
Jaroslav Hajek <highegg@gmail.com>
parents:
7774
diff
changeset
|
1267 |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1268 INSTANTIATE_SCALAR_VECTOR_REP_CONST (float) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1269 INSTANTIATE_SCALAR_VECTOR_REP_CONST (double) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1270 INSTANTIATE_SCALAR_VECTOR_REP_CONST (octave_int8) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1271 INSTANTIATE_SCALAR_VECTOR_REP_CONST (octave_int16) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1272 INSTANTIATE_SCALAR_VECTOR_REP_CONST (octave_int32) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1273 INSTANTIATE_SCALAR_VECTOR_REP_CONST (octave_int64) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1274 INSTANTIATE_SCALAR_VECTOR_REP_CONST (octave_uint8) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1275 INSTANTIATE_SCALAR_VECTOR_REP_CONST (octave_uint16) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1276 INSTANTIATE_SCALAR_VECTOR_REP_CONST (octave_uint32) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1277 INSTANTIATE_SCALAR_VECTOR_REP_CONST (octave_uint64) |
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29568
diff
changeset
|
1278 } |
10620
6fb954475e21
fix off-by-1 error in idx_vector (bug #29851)
Jaroslav Hajek <highegg@gmail.com>
parents:
10516
diff
changeset
|
1279 |
6fb954475e21
fix off-by-1 error in idx_vector (bug #29851)
Jaroslav Hajek <highegg@gmail.com>
parents:
10516
diff
changeset
|
1280 /* |
6fb954475e21
fix off-by-1 error in idx_vector (bug #29851)
Jaroslav Hajek <highegg@gmail.com>
parents:
10516
diff
changeset
|
1281 |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14138
diff
changeset
|
1282 %!error id=Octave:index-out-of-bounds 1(find ([1,1] != 0)) |
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14138
diff
changeset
|
1283 %!assert ((1:3)(find ([1,0,1] != 0)), [1,3]) |
10620
6fb954475e21
fix off-by-1 error in idx_vector (bug #29851)
Jaroslav Hajek <highegg@gmail.com>
parents:
10516
diff
changeset
|
1284 |
6fb954475e21
fix off-by-1 error in idx_vector (bug #29851)
Jaroslav Hajek <highegg@gmail.com>
parents:
10516
diff
changeset
|
1285 */ |