Mercurial > octave
annotate liboctave/array/Range.h @ 29569:29a1f8fd8ee6
move idx_vector classes inside octave namespace
* idx-vector.h, idx-vector.cc:
Move idx_vector classes inside octave namespace. Update all uses
outside of octave namespace to use octave:: tag.
* Sparse.h: Eliminate forward declaration of idx_vector.
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Wed, 28 Apr 2021 13:46:02 -0400 |
parents | 7854d5752dd2 |
children | 4c88a452519c |
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 // |
29358
0a5b15007766
update Octave Project Developers copyright for the new year
John W. Eaton <jwe@octave.org>
parents:
28004
diff
changeset
|
3 // Copyright (C) 1993-2021 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 //////////////////////////////////////////////////////////////////////// |
3 | 25 |
20791
f7084eae3318
maint: Use Octave coding conventions for #if statements.
Rik <rik@octave.org>
parents:
20513
diff
changeset
|
26 #if ! defined (octave_Range_h) |
382 | 27 #define octave_Range_h 1 |
28 | |
21244
1473547f50f5
include octave-config.h in public header files
John W. Eaton <jwe@octave.org>
parents:
21221
diff
changeset
|
29 #include "octave-config.h" |
1473547f50f5
include octave-config.h in public header files
John W. Eaton <jwe@octave.org>
parents:
21221
diff
changeset
|
30 |
8950
d865363208d6
include <iosfwd> instead of <iostream> in header files
John W. Eaton <jwe@octave.org>
parents:
8920
diff
changeset
|
31 #include <iosfwd> |
7458 | 32 |
4810 | 33 #include "dMatrix.h" |
28004
403df0b32204
update out_of_range error messages
John W. Eaton <jwe@octave.org>
parents:
27923
diff
changeset
|
34 #include "dim-vector.h" |
28635
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
35 #include "lo-error.h" |
7458 | 36 #include "oct-sort.h" |
3 | 37 |
28635
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
38 template <typename T> class Array; |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
39 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
40 namespace octave |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
41 { |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
42 // Helper class used solely for idx_vector.loop () function call |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
43 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
44 template <typename T> |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
45 class rangeidx_helper |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
46 { |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
47 public: |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
48 |
29353
715344f405f0
improve handling of nan, infinite value, and empty ranges (bug #59229)
John W. Eaton <jwe@octave.org>
parents:
29352
diff
changeset
|
49 rangeidx_helper (T *array, T base, T increment, T final_value, |
715344f405f0
improve handling of nan, infinite value, and empty ranges (bug #59229)
John W. Eaton <jwe@octave.org>
parents:
29352
diff
changeset
|
50 octave_idx_type numel) |
715344f405f0
improve handling of nan, infinite value, and empty ranges (bug #59229)
John W. Eaton <jwe@octave.org>
parents:
29352
diff
changeset
|
51 : m_array (array), m_base (base), m_increment (increment), |
715344f405f0
improve handling of nan, infinite value, and empty ranges (bug #59229)
John W. Eaton <jwe@octave.org>
parents:
29352
diff
changeset
|
52 m_final (final_value), |
715344f405f0
improve handling of nan, infinite value, and empty ranges (bug #59229)
John W. Eaton <jwe@octave.org>
parents:
29352
diff
changeset
|
53 m_nmax (numel-1) |
715344f405f0
improve handling of nan, infinite value, and empty ranges (bug #59229)
John W. Eaton <jwe@octave.org>
parents:
29352
diff
changeset
|
54 { } |
28635
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
55 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
56 void operator () (octave_idx_type i) |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
57 { |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
58 if (i == 0) |
29353
715344f405f0
improve handling of nan, infinite value, and empty ranges (bug #59229)
John W. Eaton <jwe@octave.org>
parents:
29352
diff
changeset
|
59 // Required for proper NaN handling. |
715344f405f0
improve handling of nan, infinite value, and empty ranges (bug #59229)
John W. Eaton <jwe@octave.org>
parents:
29352
diff
changeset
|
60 *m_array++ = m_nmax == 0 ? m_final : m_base; |
715344f405f0
improve handling of nan, infinite value, and empty ranges (bug #59229)
John W. Eaton <jwe@octave.org>
parents:
29352
diff
changeset
|
61 else if (i < m_nmax) |
715344f405f0
improve handling of nan, infinite value, and empty ranges (bug #59229)
John W. Eaton <jwe@octave.org>
parents:
29352
diff
changeset
|
62 *m_array++ = m_base + T (i) * m_increment; |
28635
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
63 else |
29353
715344f405f0
improve handling of nan, infinite value, and empty ranges (bug #59229)
John W. Eaton <jwe@octave.org>
parents:
29352
diff
changeset
|
64 *m_array++ = m_final; |
28635
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
65 } |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
66 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
67 private: |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
68 |
29353
715344f405f0
improve handling of nan, infinite value, and empty ranges (bug #59229)
John W. Eaton <jwe@octave.org>
parents:
29352
diff
changeset
|
69 T *m_array, m_base, m_increment, m_final; |
715344f405f0
improve handling of nan, infinite value, and empty ranges (bug #59229)
John W. Eaton <jwe@octave.org>
parents:
29352
diff
changeset
|
70 octave_idx_type m_nmax; |
28635
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
71 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
72 }; |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
73 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
74 template <typename T> |
29226
3ef055ca1d5e
Export template class definition instead of template class instantiations (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
75 class |
3ef055ca1d5e
Export template class definition instead of template class instantiations (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
76 OCTAVE_API |
3ef055ca1d5e
Export template class definition instead of template class instantiations (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
77 range |
28635
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
78 { |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
79 public: |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
80 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
81 range (void) |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
82 : m_base (0), m_increment (0), m_limit (0), m_final (0), m_numel (0) |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
83 { } |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
84 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
85 // LIMIT is an upper limit and may be outside the range of actual |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
86 // values. For floating point ranges, we perform a tolerant check |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
87 // to attempt to capture limit in the set of values if it is "close" |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
88 // to the value of base + a multiple of the increment. |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
89 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
90 range (const T& base, const T& increment, const T& limit) |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
91 : m_base (base), m_increment (increment), m_limit (limit), |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
92 m_final (), m_numel () |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
93 { |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
94 init (); |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
95 } |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
96 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
97 range (const T& base, const T& limit) |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
98 : m_base (base), m_increment (1), m_limit (limit), m_final (), m_numel () |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
99 { |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
100 init (); |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
101 } |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
102 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
103 // Allow conversion from (presumably) properly constructed Range |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
104 // objects and to create constant ranges (see the static |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
105 // make_constant method). The values of base, limit, increment, |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
106 // and numel must be consistent. |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
107 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
108 // FIXME: Actually check that base, limit, increment, and numel are |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
109 // consistent. |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
110 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
111 // FIXME: Is there a way to limit this to T == double? |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
112 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
113 range (const T& base, const T& increment, const T& limit, |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
114 octave_idx_type numel) |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
115 : m_base (base), m_increment (increment), m_limit (limit), |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
116 m_final (limit), m_numel (numel) |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
117 { } |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
118 |
28639
7ebe185e3818
new octave_value constructors for integer and float ranges.
John W. Eaton <jwe@octave.org>
parents:
28638
diff
changeset
|
119 range (const T& base, const T& increment, const T& limit, |
7ebe185e3818
new octave_value constructors for integer and float ranges.
John W. Eaton <jwe@octave.org>
parents:
28638
diff
changeset
|
120 const T& final, octave_idx_type numel) |
7ebe185e3818
new octave_value constructors for integer and float ranges.
John W. Eaton <jwe@octave.org>
parents:
28638
diff
changeset
|
121 : m_base (base), m_increment (increment), m_limit (limit), |
7ebe185e3818
new octave_value constructors for integer and float ranges.
John W. Eaton <jwe@octave.org>
parents:
28638
diff
changeset
|
122 m_final (final), m_numel (numel) |
7ebe185e3818
new octave_value constructors for integer and float ranges.
John W. Eaton <jwe@octave.org>
parents:
28638
diff
changeset
|
123 { } |
7ebe185e3818
new octave_value constructors for integer and float ranges.
John W. Eaton <jwe@octave.org>
parents:
28638
diff
changeset
|
124 |
28635
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
125 // We don't use a constructor for this because it will conflict with |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
126 // range<T> (base, limit) when T is octave_idx_type. |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
127 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
128 static range<T> make_constant (const T& base, octave_idx_type numel) |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
129 { |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
130 // We could just make this constructor public, but it allows |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
131 // inconsistent ranges to be constructed. And it is probably much |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
132 // clearer to see "make_constant" instead of puzzling over the |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
133 // purpose of this strange constructor form. |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
134 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
135 return range<T> (base, T (), base, numel); |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
136 } |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
137 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
138 // We don't use a constructor for this because it will conflict with |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
139 // range<T> (base, limit, increment) when T is octave_idx_type. |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
140 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
141 static range<T> make_n_element_range (const T& base, const T& increment, |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
142 octave_idx_type numel) |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
143 { |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
144 // We could just make this constructor public, but it allows |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
145 // inconsistent ranges to be constructed. And it is probably much |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
146 // clearer to see "make_constant" instead of puzzling over the |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
147 // purpose of this strange constructor form. |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
148 |
28646
e26201931ea3
new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents:
28639
diff
changeset
|
149 T final_val = base + (numel - 1) * increment; |
28635
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
150 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
151 return range<T> (base, increment, final_val, numel); |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
152 } |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
153 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
154 range (const range<T>&) = default; |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
155 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
156 range<T>& operator = (const range<T>&) = default; |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
157 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
158 ~range (void) = default; |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
159 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
160 T base (void) const { return m_base; } |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
161 T increment (void) const { return m_increment; } |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
162 T limit (void) const { return m_limit; } |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
163 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
164 T final_value (void) const { return m_final; } |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
165 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
166 T min (void) const |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
167 { |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
168 return (m_numel > 0 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
169 ? m_increment > T (0) ? base () : final_value () |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
170 : T (0)); |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
171 } |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
172 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
173 T max (void) const |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
174 { |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
175 return (m_numel > 0 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
176 ? m_increment > T (0) ? final_value () : base () |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
177 : T (0)); |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
178 } |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
179 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
180 octave_idx_type numel (void) const { return m_numel; } |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
181 |
29353
715344f405f0
improve handling of nan, infinite value, and empty ranges (bug #59229)
John W. Eaton <jwe@octave.org>
parents:
29352
diff
changeset
|
182 // To support things like "for i = 1:Inf; ...; end" that are |
715344f405f0
improve handling of nan, infinite value, and empty ranges (bug #59229)
John W. Eaton <jwe@octave.org>
parents:
29352
diff
changeset
|
183 // required for Matlab compatibility, creation of a range object |
715344f405f0
improve handling of nan, infinite value, and empty ranges (bug #59229)
John W. Eaton <jwe@octave.org>
parents:
29352
diff
changeset
|
184 // like 1:Inf is allowed with m_numel set to |
715344f405f0
improve handling of nan, infinite value, and empty ranges (bug #59229)
John W. Eaton <jwe@octave.org>
parents:
29352
diff
changeset
|
185 // numeric_limits<octave_idx_type>::max(). However, it is not |
715344f405f0
improve handling of nan, infinite value, and empty ranges (bug #59229)
John W. Eaton <jwe@octave.org>
parents:
29352
diff
changeset
|
186 // possible to store these ranges. The following function allows |
715344f405f0
improve handling of nan, infinite value, and empty ranges (bug #59229)
John W. Eaton <jwe@octave.org>
parents:
29352
diff
changeset
|
187 // us to easily distinguish ranges with an infinite number of |
715344f405f0
improve handling of nan, infinite value, and empty ranges (bug #59229)
John W. Eaton <jwe@octave.org>
parents:
29352
diff
changeset
|
188 // elements. There are specializations for double and float. |
715344f405f0
improve handling of nan, infinite value, and empty ranges (bug #59229)
John W. Eaton <jwe@octave.org>
parents:
29352
diff
changeset
|
189 |
715344f405f0
improve handling of nan, infinite value, and empty ranges (bug #59229)
John W. Eaton <jwe@octave.org>
parents:
29352
diff
changeset
|
190 bool is_storable (void) const { return true; } |
715344f405f0
improve handling of nan, infinite value, and empty ranges (bug #59229)
John W. Eaton <jwe@octave.org>
parents:
29352
diff
changeset
|
191 |
28635
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
192 dim_vector dims (void) const { return dim_vector (1, m_numel); } |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
193 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
194 octave_idx_type rows (void) const { return 1; } |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
195 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
196 octave_idx_type cols (void) const { return numel (); } |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
197 octave_idx_type columns (void) const { return numel (); } |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
198 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
199 bool isempty (void) const { return numel () == 0; } |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
200 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
201 bool all_elements_are_ints (void) const { return true; } |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
202 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
203 sortmode issorted (sortmode mode = ASCENDING) const |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
204 { |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
205 if (m_numel > 1 && m_increment > T (0)) |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
206 mode = (mode == DESCENDING) ? UNSORTED : ASCENDING; |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
207 else if (m_numel > 1 && m_increment < T (0)) |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
208 mode = (mode == ASCENDING) ? UNSORTED : DESCENDING; |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
209 else |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
210 mode = (mode == UNSORTED) ? ASCENDING : mode; |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
211 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
212 return mode; |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
213 } |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
214 |
29226
3ef055ca1d5e
Export template class definition instead of template class instantiations (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
215 OCTAVE_API octave_idx_type nnz (void) const; |
28635
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
216 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
217 // Support for single-index subscripting, without generating matrix cache. |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
218 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
219 T checkelem (octave_idx_type i) const |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
220 { |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
221 if (i < 0 || i >= m_numel) |
28857
43ad651cf5a0
eliminate unnecessary uses of octave:: namespace qualifier
John W. Eaton <jwe@octave.org>
parents:
28646
diff
changeset
|
222 err_index_out_of_range (2, 2, i+1, m_numel, dims ()); |
28635
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
223 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
224 if (i == 0) |
29353
715344f405f0
improve handling of nan, infinite value, and empty ranges (bug #59229)
John W. Eaton <jwe@octave.org>
parents:
29352
diff
changeset
|
225 // Required for proper NaN handling. |
715344f405f0
improve handling of nan, infinite value, and empty ranges (bug #59229)
John W. Eaton <jwe@octave.org>
parents:
29352
diff
changeset
|
226 return m_numel == 1 ? final_value () : m_base; |
28635
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
227 else if (i < m_numel - 1) |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
228 return m_base + T (i) * m_increment; |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
229 else |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
230 return final_value (); |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
231 } |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
232 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
233 T checkelem (octave_idx_type i, octave_idx_type j) const |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
234 { |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
235 // Ranges are *always* row vectors. |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
236 if (i != 0) |
28857
43ad651cf5a0
eliminate unnecessary uses of octave:: namespace qualifier
John W. Eaton <jwe@octave.org>
parents:
28646
diff
changeset
|
237 err_index_out_of_range (1, 1, i+1, m_numel, dims ()); |
28635
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
238 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
239 return checkelem (j); |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
240 } |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
241 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
242 T elem (octave_idx_type i) const |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
243 { |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
244 if (i == 0) |
29353
715344f405f0
improve handling of nan, infinite value, and empty ranges (bug #59229)
John W. Eaton <jwe@octave.org>
parents:
29352
diff
changeset
|
245 // Required for proper NaN handling. |
715344f405f0
improve handling of nan, infinite value, and empty ranges (bug #59229)
John W. Eaton <jwe@octave.org>
parents:
29352
diff
changeset
|
246 return m_numel == 1 ? final_value () : m_base; |
28635
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
247 else if (i < m_numel - 1) |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
248 return m_base + T (i) * m_increment; |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
249 else |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
250 return final_value (); |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
251 } |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
252 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
253 T elem (octave_idx_type /* i */, octave_idx_type j) const |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
254 { |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
255 return elem (j); |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
256 } |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
257 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
258 T operator () (octave_idx_type i) const |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
259 { |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
260 return elem (i); |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
261 } |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
262 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
263 T operator () (octave_idx_type i, octave_idx_type j) const |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
264 { |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
265 return elem (i, j); |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
266 } |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
267 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
268 Array<T> index (const idx_vector& i) const |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
269 { |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
270 Array<T> retval; |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
271 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
272 octave_idx_type n = m_numel; |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
273 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
274 if (i.is_colon ()) |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
275 { |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
276 retval = array_value ().reshape (dim_vector (m_numel, 1)); |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
277 } |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
278 else |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
279 { |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
280 if (i.extent (n) != n) |
28857
43ad651cf5a0
eliminate unnecessary uses of octave:: namespace qualifier
John W. Eaton <jwe@octave.org>
parents:
28646
diff
changeset
|
281 err_index_out_of_range (1, 1, i.extent (n), n, dims ()); |
28635
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
282 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
283 dim_vector rd = i.orig_dimensions (); |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
284 octave_idx_type il = i.length (n); |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
285 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
286 // taken from Array.cc. |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
287 if (n != 1 && rd.isvector ()) |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
288 rd = dim_vector (1, il); |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
289 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
290 retval.clear (rd); |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
291 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
292 // idx_vector loop across all values in i, |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
293 // executing __rangeidx_helper (i) for each i |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
294 i.loop (n, rangeidx_helper<T> (retval.fortran_vec (), |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
295 m_base, m_increment, final_value (), |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
296 m_numel)); |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
297 } |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
298 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
299 return retval; |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
300 } |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
301 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
302 Array<T> diag (octave_idx_type k) const |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
303 { |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
304 return array_value ().diag (k); |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
305 } |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
306 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
307 Array<T> array_value (void) const |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
308 { |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
309 octave_idx_type nel = numel (); |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
310 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
311 Array<T> retval (dim_vector (1, nel)); |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
312 |
29353
715344f405f0
improve handling of nan, infinite value, and empty ranges (bug #59229)
John W. Eaton <jwe@octave.org>
parents:
29352
diff
changeset
|
313 if (nel == 1) |
715344f405f0
improve handling of nan, infinite value, and empty ranges (bug #59229)
John W. Eaton <jwe@octave.org>
parents:
29352
diff
changeset
|
314 // Required for proper NaN handling. |
715344f405f0
improve handling of nan, infinite value, and empty ranges (bug #59229)
John W. Eaton <jwe@octave.org>
parents:
29352
diff
changeset
|
315 retval(0) = final_value (); |
715344f405f0
improve handling of nan, infinite value, and empty ranges (bug #59229)
John W. Eaton <jwe@octave.org>
parents:
29352
diff
changeset
|
316 else if (nel > 1) |
28635
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
317 { |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
318 // The first element must always be *exactly* the base. |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
319 // E.g, -0 would otherwise become +0 in the loop (-0 + 0*increment). |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
320 retval(0) = m_base; |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
321 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
322 for (octave_idx_type i = 1; i < nel - 1; i++) |
28646
e26201931ea3
new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents:
28639
diff
changeset
|
323 retval.xelem (i) = m_base + i * m_increment; |
28635
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
324 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
325 retval.xelem (nel - 1) = final_value (); |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
326 } |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
327 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
328 return retval; |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
329 } |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
330 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
331 private: |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
332 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
333 T m_base; |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
334 T m_increment; |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
335 T m_limit; |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
336 T m_final; |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
337 octave_idx_type m_numel; |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
338 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
339 // Setting the number of elements to zero when the increment is zero |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
340 // is intentional and matches the behavior of Matlab's colon |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
341 // operator. |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
342 |
29352
03c283f73b9a
specialize range<T>::init instead of defining get_numel and get_final_value
John W. Eaton <jwe@octave.org>
parents:
29351
diff
changeset
|
343 // These calculations are appropriate for integer ranges. There are |
03c283f73b9a
specialize range<T>::init instead of defining get_numel and get_final_value
John W. Eaton <jwe@octave.org>
parents:
29351
diff
changeset
|
344 // specializations for double and float. |
03c283f73b9a
specialize range<T>::init instead of defining get_numel and get_final_value
John W. Eaton <jwe@octave.org>
parents:
29351
diff
changeset
|
345 |
03c283f73b9a
specialize range<T>::init instead of defining get_numel and get_final_value
John W. Eaton <jwe@octave.org>
parents:
29351
diff
changeset
|
346 void init (void) |
28635
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
347 { |
29352
03c283f73b9a
specialize range<T>::init instead of defining get_numel and get_final_value
John W. Eaton <jwe@octave.org>
parents:
29351
diff
changeset
|
348 m_numel = ((m_increment == T (0) |
03c283f73b9a
specialize range<T>::init instead of defining get_numel and get_final_value
John W. Eaton <jwe@octave.org>
parents:
29351
diff
changeset
|
349 || (m_limit > m_base && m_increment < T (0)) |
03c283f73b9a
specialize range<T>::init instead of defining get_numel and get_final_value
John W. Eaton <jwe@octave.org>
parents:
29351
diff
changeset
|
350 || (m_limit < m_base && m_increment > T (0))) |
03c283f73b9a
specialize range<T>::init instead of defining get_numel and get_final_value
John W. Eaton <jwe@octave.org>
parents:
29351
diff
changeset
|
351 ? T (0) |
03c283f73b9a
specialize range<T>::init instead of defining get_numel and get_final_value
John W. Eaton <jwe@octave.org>
parents:
29351
diff
changeset
|
352 : (m_limit - m_base + m_increment) / m_increment); |
28635
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
353 |
29352
03c283f73b9a
specialize range<T>::init instead of defining get_numel and get_final_value
John W. Eaton <jwe@octave.org>
parents:
29351
diff
changeset
|
354 m_final = m_base + (m_numel - 1) * m_increment; |
28635
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
355 } |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
356 }; |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
357 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
358 // Specializations defined externally. |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
359 |
29226
3ef055ca1d5e
Export template class definition instead of template class instantiations (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
360 template <> OCTAVE_API bool range<double>::all_elements_are_ints (void) const; |
3ef055ca1d5e
Export template class definition instead of template class instantiations (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
361 template <> OCTAVE_API bool range<float>::all_elements_are_ints (void) const; |
28635
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
362 |
29352
03c283f73b9a
specialize range<T>::init instead of defining get_numel and get_final_value
John W. Eaton <jwe@octave.org>
parents:
29351
diff
changeset
|
363 template <> OCTAVE_API void range<double>::init (void); |
03c283f73b9a
specialize range<T>::init instead of defining get_numel and get_final_value
John W. Eaton <jwe@octave.org>
parents:
29351
diff
changeset
|
364 template <> OCTAVE_API void range<float>::init (void); |
28635
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
365 |
29353
715344f405f0
improve handling of nan, infinite value, and empty ranges (bug #59229)
John W. Eaton <jwe@octave.org>
parents:
29352
diff
changeset
|
366 template <> OCTAVE_API bool range<double>::is_storable (void) const; |
715344f405f0
improve handling of nan, infinite value, and empty ranges (bug #59229)
John W. Eaton <jwe@octave.org>
parents:
29352
diff
changeset
|
367 template <> OCTAVE_API bool range<float>::is_storable (void) const; |
715344f405f0
improve handling of nan, infinite value, and empty ranges (bug #59229)
John W. Eaton <jwe@octave.org>
parents:
29352
diff
changeset
|
368 |
29226
3ef055ca1d5e
Export template class definition instead of template class instantiations (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
369 template <> OCTAVE_API octave_idx_type range<double>::nnz (void) const; |
29351
326a7ca62c43
also define range<float>::nnz specialization
John W. Eaton <jwe@octave.org>
parents:
29226
diff
changeset
|
370 template <> OCTAVE_API octave_idx_type range<float>::nnz (void) const; |
28635
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
371 } |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
372 |
1860 | 373 class |
374 Range | |
3 | 375 { |
17769
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
376 public: |
1860 | 377 |
28638
98192ec1621f
replace Range with range<double>
John W. Eaton <jwe@octave.org>
parents:
28637
diff
changeset
|
378 OCTAVE_DEPRECATED (7, "use the 'octave::range<double>' class instead") |
1528 | 379 Range (void) |
28524
455fe4a6f22c
deprecate arithmetic operators for ranges; eliminate use in Octave
John W. Eaton <jwe@octave.org>
parents:
28402
diff
changeset
|
380 : m_base (0), m_limit (0), m_inc (0), m_numel (0) |
28402
09a3c0e91e6e
style update for Range class
John W. Eaton <jwe@octave.org>
parents:
28004
diff
changeset
|
381 { } |
1528 | 382 |
28635
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
383 // Assume range is already properly constructed, so just copy internal |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
384 // values. However, we set LIMIT to the computed final value because |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
385 // that mimics the behavior of the other Range class constructors that |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
386 // reset limit to the computed final value. |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
387 |
28638
98192ec1621f
replace Range with range<double>
John W. Eaton <jwe@octave.org>
parents:
28637
diff
changeset
|
388 OCTAVE_DEPRECATED (7, "use the 'octave::range<double>' class instead") |
28635
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
389 Range (const octave::range<double>& r) |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
390 : m_base (r.base ()), m_limit (r.final_value ()), m_inc (r.increment ()), |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
391 m_numel (r.numel ()) |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
392 { } |
1528 | 393 |
27023
fc256e9d882e
use default ctors, dtors, and assignment ops in Matrix, intNDArray, and Cell
John W. Eaton <jwe@octave.org>
parents:
26377
diff
changeset
|
394 Range (const Range& r) = default; |
fc256e9d882e
use default ctors, dtors, and assignment ops in Matrix, intNDArray, and Cell
John W. Eaton <jwe@octave.org>
parents:
26377
diff
changeset
|
395 |
fc256e9d882e
use default ctors, dtors, and assignment ops in Matrix, intNDArray, and Cell
John W. Eaton <jwe@octave.org>
parents:
26377
diff
changeset
|
396 Range& operator = (const Range& r) = default; |
fc256e9d882e
use default ctors, dtors, and assignment ops in Matrix, intNDArray, and Cell
John W. Eaton <jwe@octave.org>
parents:
26377
diff
changeset
|
397 |
fc256e9d882e
use default ctors, dtors, and assignment ops in Matrix, intNDArray, and Cell
John W. Eaton <jwe@octave.org>
parents:
26377
diff
changeset
|
398 ~Range (void) = default; |
3 | 399 |
28638
98192ec1621f
replace Range with range<double>
John W. Eaton <jwe@octave.org>
parents:
28637
diff
changeset
|
400 OCTAVE_DEPRECATED (7, "use the 'octave::range<double>' class instead") |
1528 | 401 Range (double b, double l) |
28524
455fe4a6f22c
deprecate arithmetic operators for ranges; eliminate use in Octave
John W. Eaton <jwe@octave.org>
parents:
28402
diff
changeset
|
402 : m_base (b), m_limit (l), m_inc (1), m_numel (numel_internal ()) |
20513 | 403 { |
28592
e70c859c4bff
allow infinite limits on for loop ranges (bug #45143)
John W. Eaton <jwe@octave.org>
parents:
28524
diff
changeset
|
404 if (! octave::math::isinf (m_limit)) |
e70c859c4bff
allow infinite limits on for loop ranges (bug #45143)
John W. Eaton <jwe@octave.org>
parents:
28524
diff
changeset
|
405 m_limit = limit_internal (); |
20513 | 406 } |
1528 | 407 |
28638
98192ec1621f
replace Range with range<double>
John W. Eaton <jwe@octave.org>
parents:
28637
diff
changeset
|
408 OCTAVE_DEPRECATED (7, "use the 'octave::range<double>' class instead") |
1528 | 409 Range (double b, double l, double i) |
28524
455fe4a6f22c
deprecate arithmetic operators for ranges; eliminate use in Octave
John W. Eaton <jwe@octave.org>
parents:
28402
diff
changeset
|
410 : m_base (b), m_limit (l), m_inc (i), m_numel (numel_internal ()) |
20513 | 411 { |
28592
e70c859c4bff
allow infinite limits on for loop ranges (bug #45143)
John W. Eaton <jwe@octave.org>
parents:
28524
diff
changeset
|
412 if (! octave::math::isinf (m_limit)) |
e70c859c4bff
allow infinite limits on for loop ranges (bug #45143)
John W. Eaton <jwe@octave.org>
parents:
28524
diff
changeset
|
413 m_limit = limit_internal (); |
20513 | 414 } |
1528 | 415 |
28524
455fe4a6f22c
deprecate arithmetic operators for ranges; eliminate use in Octave
John W. Eaton <jwe@octave.org>
parents:
28402
diff
changeset
|
416 // NOTE: The following constructor may be deprecated and removed after |
455fe4a6f22c
deprecate arithmetic operators for ranges; eliminate use in Octave
John W. Eaton <jwe@octave.org>
parents:
28402
diff
changeset
|
417 // the arithmetic operators are removed. |
455fe4a6f22c
deprecate arithmetic operators for ranges; eliminate use in Octave
John W. Eaton <jwe@octave.org>
parents:
28402
diff
changeset
|
418 |
28635
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
419 // For operators' usage (to preserve element count) and to create |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
420 // constant row vectors (obsolete usage). |
28524
455fe4a6f22c
deprecate arithmetic operators for ranges; eliminate use in Octave
John W. Eaton <jwe@octave.org>
parents:
28402
diff
changeset
|
421 |
28638
98192ec1621f
replace Range with range<double>
John W. Eaton <jwe@octave.org>
parents:
28637
diff
changeset
|
422 OCTAVE_DEPRECATED (7, "use the 'octave::range<double>' class instead") |
16169
0303fda3e929
Fix range behavior with -0 endpoints (bug #38423)
Rik <rik@octave.org>
parents:
15271
diff
changeset
|
423 Range (double b, double i, octave_idx_type n) |
28524
455fe4a6f22c
deprecate arithmetic operators for ranges; eliminate use in Octave
John W. Eaton <jwe@octave.org>
parents:
28402
diff
changeset
|
424 : m_base (b), m_limit (b + (n-1) * i), m_inc (i), m_numel (n) |
17769
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
425 { |
28592
e70c859c4bff
allow infinite limits on for loop ranges (bug #45143)
John W. Eaton <jwe@octave.org>
parents:
28524
diff
changeset
|
426 if (! octave::math::isinf (m_limit)) |
e70c859c4bff
allow infinite limits on for loop ranges (bug #45143)
John W. Eaton <jwe@octave.org>
parents:
28524
diff
changeset
|
427 m_limit = limit_internal (); |
17769
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
428 } |
8589
0131fa223dbc
make length invariant in range-scalar ops
Jaroslav Hajek <highegg@gmail.com>
parents:
8553
diff
changeset
|
429 |
28592
e70c859c4bff
allow infinite limits on for loop ranges (bug #45143)
John W. Eaton <jwe@octave.org>
parents:
28524
diff
changeset
|
430 // The range has a finite number of elements. |
e70c859c4bff
allow infinite limits on for loop ranges (bug #45143)
John W. Eaton <jwe@octave.org>
parents:
28524
diff
changeset
|
431 bool ok (void) const |
e70c859c4bff
allow infinite limits on for loop ranges (bug #45143)
John W. Eaton <jwe@octave.org>
parents:
28524
diff
changeset
|
432 { |
e70c859c4bff
allow infinite limits on for loop ranges (bug #45143)
John W. Eaton <jwe@octave.org>
parents:
28524
diff
changeset
|
433 return (octave::math::isfinite (m_limit) |
e70c859c4bff
allow infinite limits on for loop ranges (bug #45143)
John W. Eaton <jwe@octave.org>
parents:
28524
diff
changeset
|
434 && (m_numel >= 0 || m_numel == -2)); |
17769
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
435 } |
8589
0131fa223dbc
make length invariant in range-scalar ops
Jaroslav Hajek <highegg@gmail.com>
parents:
8553
diff
changeset
|
436 |
28402
09a3c0e91e6e
style update for Range class
John W. Eaton <jwe@octave.org>
parents:
28004
diff
changeset
|
437 double base (void) const { return m_base; } |
09a3c0e91e6e
style update for Range class
John W. Eaton <jwe@octave.org>
parents:
28004
diff
changeset
|
438 double limit (void) const { return m_limit; } |
09a3c0e91e6e
style update for Range class
John W. Eaton <jwe@octave.org>
parents:
28004
diff
changeset
|
439 double inc (void) const { return m_inc; } |
28636
a3db48e66ef8
use Range::increment instead of Range::inc
John W. Eaton <jwe@octave.org>
parents:
28635
diff
changeset
|
440 double increment (void) const { return m_inc; } |
21134
2e5c1f766ac9
provide replacement hints for deprecated C++ functions
John W. Eaton <jwe@octave.org>
parents:
21040
diff
changeset
|
441 |
28637
fb37f50d5ba8
new Range::final_value function
John W. Eaton <jwe@octave.org>
parents:
28636
diff
changeset
|
442 // We adjust the limit to be the final value, so return that. We |
fb37f50d5ba8
new Range::final_value function
John W. Eaton <jwe@octave.org>
parents:
28636
diff
changeset
|
443 // could introduce a new variable to store the final value separately, |
fb37f50d5ba8
new Range::final_value function
John W. Eaton <jwe@octave.org>
parents:
28636
diff
changeset
|
444 // but it seems like that would just add confusion. If we changed |
fb37f50d5ba8
new Range::final_value function
John W. Eaton <jwe@octave.org>
parents:
28636
diff
changeset
|
445 // the meaning of the limit function, we would change the behavior of |
fb37f50d5ba8
new Range::final_value function
John W. Eaton <jwe@octave.org>
parents:
28636
diff
changeset
|
446 // programs that expect limit to be the final value instead of the |
fb37f50d5ba8
new Range::final_value function
John W. Eaton <jwe@octave.org>
parents:
28636
diff
changeset
|
447 // value of the limit when the range was created. This problem will |
fb37f50d5ba8
new Range::final_value function
John W. Eaton <jwe@octave.org>
parents:
28636
diff
changeset
|
448 // be fixed with the new template range class. |
fb37f50d5ba8
new Range::final_value function
John W. Eaton <jwe@octave.org>
parents:
28636
diff
changeset
|
449 double final_value (void) const { return m_limit; } |
25812
fc74c8d2a584
Clean up liboctave Range implementation.
Rik <rik@octave.org>
parents:
25054
diff
changeset
|
450 |
28402
09a3c0e91e6e
style update for Range class
John W. Eaton <jwe@octave.org>
parents:
28004
diff
changeset
|
451 octave_idx_type numel (void) const { return m_numel; } |
25812
fc74c8d2a584
Clean up liboctave Range implementation.
Rik <rik@octave.org>
parents:
25054
diff
changeset
|
452 |
28402
09a3c0e91e6e
style update for Range class
John W. Eaton <jwe@octave.org>
parents:
28004
diff
changeset
|
453 dim_vector dims (void) const { return dim_vector (1, m_numel); } |
28004
403df0b32204
update out_of_range error messages
John W. Eaton <jwe@octave.org>
parents:
27923
diff
changeset
|
454 |
24780
0d21e2a1cdfc
new element access operators for Range objects
John W. Eaton <jwe@octave.org>
parents:
24534
diff
changeset
|
455 octave_idx_type rows (void) const { return 1; } |
0d21e2a1cdfc
new element access operators for Range objects
John W. Eaton <jwe@octave.org>
parents:
24534
diff
changeset
|
456 |
0d21e2a1cdfc
new element access operators for Range objects
John W. Eaton <jwe@octave.org>
parents:
24534
diff
changeset
|
457 octave_idx_type cols (void) const { return numel (); } |
0d21e2a1cdfc
new element access operators for Range objects
John W. Eaton <jwe@octave.org>
parents:
24534
diff
changeset
|
458 octave_idx_type columns (void) const { return numel (); } |
0d21e2a1cdfc
new element access operators for Range objects
John W. Eaton <jwe@octave.org>
parents:
24534
diff
changeset
|
459 |
23577
80c42f4cca13
maint: Deprecate is_empty and replace with isempty.
Rik <rik@octave.org>
parents:
23564
diff
changeset
|
460 bool isempty (void) const { return numel () == 0; } |
80c42f4cca13
maint: Deprecate is_empty and replace with isempty.
Rik <rik@octave.org>
parents:
23564
diff
changeset
|
461 |
29226
3ef055ca1d5e
Export template class definition instead of template class instantiations (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
462 OCTAVE_API bool all_elements_are_ints (void) const; |
2383 | 463 |
29226
3ef055ca1d5e
Export template class definition instead of template class instantiations (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
464 OCTAVE_API Matrix matrix_value (void) const; |
645 | 465 |
29226
3ef055ca1d5e
Export template class definition instead of template class instantiations (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
466 OCTAVE_API double min (void) const; |
3ef055ca1d5e
Export template class definition instead of template class instantiations (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
467 OCTAVE_API double max (void) const; |
3 | 468 |
29226
3ef055ca1d5e
Export template class definition instead of template class instantiations (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
469 OCTAVE_API void sort_internal (bool ascending = true); |
3ef055ca1d5e
Export template class definition instead of template class instantiations (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
470 OCTAVE_API void sort_internal (Array<octave_idx_type>& sidx, bool ascending = true); |
7458 | 471 |
29226
3ef055ca1d5e
Export template class definition instead of template class instantiations (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
472 OCTAVE_API Matrix diag (octave_idx_type k = 0) const; |
7620
36594d5bbe13
Move diag function into the octave_value class
David Bateman <dbateman@free.fr>
parents:
7463
diff
changeset
|
473 |
29226
3ef055ca1d5e
Export template class definition instead of template class instantiations (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
474 OCTAVE_API Range sort (octave_idx_type dim = 0, sortmode mode = ASCENDING) const; |
3ef055ca1d5e
Export template class definition instead of template class instantiations (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
475 OCTAVE_API Range sort (Array<octave_idx_type>& sidx, octave_idx_type dim = 0, |
10312
cbc402e64d83
untabify liboctave header files
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
476 sortmode mode = ASCENDING) const; |
208 | 477 |
29226
3ef055ca1d5e
Export template class definition instead of template class instantiations (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
478 OCTAVE_API sortmode issorted (sortmode mode = ASCENDING) const; |
23588
0549061d35b9
maint: Deprecate is_sorted and replace with issorted.
Rik <rik@octave.org>
parents:
23577
diff
changeset
|
479 |
29226
3ef055ca1d5e
Export template class definition instead of template class instantiations (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
480 OCTAVE_API octave_idx_type nnz (void) const; |
24859
00ecff875f8a
Add nnz implementation for Range type (bug #53185).
maorshutman <maorus12@gmail.com>
parents:
24799
diff
changeset
|
481 |
9986
672e1b49e01e
optimize indexing of ranges by single subscripts
Jaroslav Hajek <highegg@gmail.com>
parents:
8971
diff
changeset
|
482 // Support for single-index subscripting, without generating matrix cache. |
672e1b49e01e
optimize indexing of ranges by single subscripts
Jaroslav Hajek <highegg@gmail.com>
parents:
8971
diff
changeset
|
483 |
29226
3ef055ca1d5e
Export template class definition instead of template class instantiations (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
484 OCTAVE_API double checkelem (octave_idx_type i) const; |
3ef055ca1d5e
Export template class definition instead of template class instantiations (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
485 OCTAVE_API double checkelem (octave_idx_type i, octave_idx_type j) const; |
9986
672e1b49e01e
optimize indexing of ranges by single subscripts
Jaroslav Hajek <highegg@gmail.com>
parents:
8971
diff
changeset
|
486 |
29226
3ef055ca1d5e
Export template class definition instead of template class instantiations (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
487 OCTAVE_API double elem (octave_idx_type i) const; |
24799
74a596fd6bab
Fix unused variable warning in Range elem(i,j) function introduced in 0d21e2a1cdfc.
Rik <rik@octave.org>
parents:
24780
diff
changeset
|
488 double elem (octave_idx_type /* i */, octave_idx_type j) const |
74a596fd6bab
Fix unused variable warning in Range elem(i,j) function introduced in 0d21e2a1cdfc.
Rik <rik@octave.org>
parents:
24780
diff
changeset
|
489 { return elem (j); } |
9986
672e1b49e01e
optimize indexing of ranges by single subscripts
Jaroslav Hajek <highegg@gmail.com>
parents:
8971
diff
changeset
|
490 |
23487
af2f1f3dbe06
eliminate --enable-bounds-check configure option
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
491 double operator () (octave_idx_type i) const { return elem (i); } |
24780
0d21e2a1cdfc
new element access operators for Range objects
John W. Eaton <jwe@octave.org>
parents:
24534
diff
changeset
|
492 double operator () (octave_idx_type i, octave_idx_type j) const |
0d21e2a1cdfc
new element access operators for Range objects
John W. Eaton <jwe@octave.org>
parents:
24534
diff
changeset
|
493 { return elem (i, j); } |
23487
af2f1f3dbe06
eliminate --enable-bounds-check configure option
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
494 |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29359
diff
changeset
|
495 OCTAVE_API Array<double> index (const octave::idx_vector& i) const; |
9986
672e1b49e01e
optimize indexing of ranges by single subscripts
Jaroslav Hajek <highegg@gmail.com>
parents:
8971
diff
changeset
|
496 |
29226
3ef055ca1d5e
Export template class definition instead of template class instantiations (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
497 OCTAVE_API void set_base (double b); |
4811 | 498 |
29226
3ef055ca1d5e
Export template class definition instead of template class instantiations (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
499 OCTAVE_API void set_limit (double l); |
4811 | 500 |
29226
3ef055ca1d5e
Export template class definition instead of template class instantiations (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
501 OCTAVE_API void set_inc (double i); |
1528 | 502 |
17769
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
503 friend OCTAVE_API std::ostream& operator << (std::ostream& os, |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
504 const Range& r); |
6108 | 505 friend OCTAVE_API std::istream& operator >> (std::istream& is, Range& r); |
3 | 506 |
8971 | 507 friend OCTAVE_API Range operator - (const Range& r); |
508 friend OCTAVE_API Range operator + (double x, const Range& r); | |
509 friend OCTAVE_API Range operator + (const Range& r, double x); | |
510 friend OCTAVE_API Range operator - (double x, const Range& r); | |
511 friend OCTAVE_API Range operator - (const Range& r, double x); | |
512 friend OCTAVE_API Range operator * (double x, const Range& r); | |
513 friend OCTAVE_API Range operator * (const Range& r, double x); | |
514 | |
17769
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
515 private: |
1860 | 516 |
28402
09a3c0e91e6e
style update for Range class
John W. Eaton <jwe@octave.org>
parents:
28004
diff
changeset
|
517 double m_base; |
09a3c0e91e6e
style update for Range class
John W. Eaton <jwe@octave.org>
parents:
28004
diff
changeset
|
518 double m_limit; |
09a3c0e91e6e
style update for Range class
John W. Eaton <jwe@octave.org>
parents:
28004
diff
changeset
|
519 double m_inc; |
1860 | 520 |
28402
09a3c0e91e6e
style update for Range class
John W. Eaton <jwe@octave.org>
parents:
28004
diff
changeset
|
521 octave_idx_type m_numel; |
4811 | 522 |
29226
3ef055ca1d5e
Export template class definition instead of template class instantiations (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
523 OCTAVE_API octave_idx_type numel_internal (void) const; |
21321
79a51b7e00b6
eliminate some copy and paste code fragments in the Range class
John W. Eaton <jwe@octave.org>
parents:
21244
diff
changeset
|
524 |
29226
3ef055ca1d5e
Export template class definition instead of template class instantiations (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
525 OCTAVE_API double limit_internal (void) const; |
21321
79a51b7e00b6
eliminate some copy and paste code fragments in the Range class
John W. Eaton <jwe@octave.org>
parents:
21244
diff
changeset
|
526 |
29226
3ef055ca1d5e
Export template class definition instead of template class instantiations (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
527 OCTAVE_API void init (void); |
8971 | 528 |
18852
47d4b680d0e0
improve accuracy of range/scalar arithmetic (bug #42589)
John W. Eaton <jwe@octave.org>
parents:
17769
diff
changeset
|
529 protected: |
47d4b680d0e0
improve accuracy of range/scalar arithmetic (bug #42589)
John W. Eaton <jwe@octave.org>
parents:
17769
diff
changeset
|
530 |
28524
455fe4a6f22c
deprecate arithmetic operators for ranges; eliminate use in Octave
John W. Eaton <jwe@octave.org>
parents:
28402
diff
changeset
|
531 // NOTE: The following constructor may be removed when the arithmetic |
455fe4a6f22c
deprecate arithmetic operators for ranges; eliminate use in Octave
John W. Eaton <jwe@octave.org>
parents:
28402
diff
changeset
|
532 // operators are removed. |
18852
47d4b680d0e0
improve accuracy of range/scalar arithmetic (bug #42589)
John W. Eaton <jwe@octave.org>
parents:
17769
diff
changeset
|
533 |
47d4b680d0e0
improve accuracy of range/scalar arithmetic (bug #42589)
John W. Eaton <jwe@octave.org>
parents:
17769
diff
changeset
|
534 // For operators' usage (to allow all values to be set directly). |
47d4b680d0e0
improve accuracy of range/scalar arithmetic (bug #42589)
John W. Eaton <jwe@octave.org>
parents:
17769
diff
changeset
|
535 Range (double b, double l, double i, octave_idx_type n) |
28524
455fe4a6f22c
deprecate arithmetic operators for ranges; eliminate use in Octave
John W. Eaton <jwe@octave.org>
parents:
28402
diff
changeset
|
536 : m_base (b), m_limit (l), m_inc (i), m_numel (n) |
28592
e70c859c4bff
allow infinite limits on for loop ranges (bug #45143)
John W. Eaton <jwe@octave.org>
parents:
28524
diff
changeset
|
537 { } |
3 | 538 }; |
539 | |
28524
455fe4a6f22c
deprecate arithmetic operators for ranges; eliminate use in Octave
John W. Eaton <jwe@octave.org>
parents:
28402
diff
changeset
|
540 OCTAVE_DEPRECATED (7, "arithmetic operations on Range objects are unreliable") |
6108 | 541 extern OCTAVE_API Range operator - (const Range& r); |
28524
455fe4a6f22c
deprecate arithmetic operators for ranges; eliminate use in Octave
John W. Eaton <jwe@octave.org>
parents:
28402
diff
changeset
|
542 |
455fe4a6f22c
deprecate arithmetic operators for ranges; eliminate use in Octave
John W. Eaton <jwe@octave.org>
parents:
28402
diff
changeset
|
543 OCTAVE_DEPRECATED (7, "arithmetic operations on Range objects are unreliable") |
8553
c7ff200e45f5
optimize range-scalar ops
Jaroslav Hajek <highegg@gmail.com>
parents:
7620
diff
changeset
|
544 extern OCTAVE_API Range operator + (double x, const Range& r); |
28524
455fe4a6f22c
deprecate arithmetic operators for ranges; eliminate use in Octave
John W. Eaton <jwe@octave.org>
parents:
28402
diff
changeset
|
545 |
455fe4a6f22c
deprecate arithmetic operators for ranges; eliminate use in Octave
John W. Eaton <jwe@octave.org>
parents:
28402
diff
changeset
|
546 OCTAVE_DEPRECATED (7, "arithmetic operations on Range objects are unreliable") |
8553
c7ff200e45f5
optimize range-scalar ops
Jaroslav Hajek <highegg@gmail.com>
parents:
7620
diff
changeset
|
547 extern OCTAVE_API Range operator + (const Range& r, double x); |
28524
455fe4a6f22c
deprecate arithmetic operators for ranges; eliminate use in Octave
John W. Eaton <jwe@octave.org>
parents:
28402
diff
changeset
|
548 |
455fe4a6f22c
deprecate arithmetic operators for ranges; eliminate use in Octave
John W. Eaton <jwe@octave.org>
parents:
28402
diff
changeset
|
549 OCTAVE_DEPRECATED (7, "arithmetic operations on Range objects are unreliable") |
8553
c7ff200e45f5
optimize range-scalar ops
Jaroslav Hajek <highegg@gmail.com>
parents:
7620
diff
changeset
|
550 extern OCTAVE_API Range operator - (double x, const Range& r); |
28524
455fe4a6f22c
deprecate arithmetic operators for ranges; eliminate use in Octave
John W. Eaton <jwe@octave.org>
parents:
28402
diff
changeset
|
551 |
455fe4a6f22c
deprecate arithmetic operators for ranges; eliminate use in Octave
John W. Eaton <jwe@octave.org>
parents:
28402
diff
changeset
|
552 OCTAVE_DEPRECATED (7, "arithmetic operations on Range objects are unreliable") |
8553
c7ff200e45f5
optimize range-scalar ops
Jaroslav Hajek <highegg@gmail.com>
parents:
7620
diff
changeset
|
553 extern OCTAVE_API Range operator - (const Range& r, double x); |
28524
455fe4a6f22c
deprecate arithmetic operators for ranges; eliminate use in Octave
John W. Eaton <jwe@octave.org>
parents:
28402
diff
changeset
|
554 |
455fe4a6f22c
deprecate arithmetic operators for ranges; eliminate use in Octave
John W. Eaton <jwe@octave.org>
parents:
28402
diff
changeset
|
555 OCTAVE_DEPRECATED (7, "arithmetic operations on Range objects are unreliable") |
8553
c7ff200e45f5
optimize range-scalar ops
Jaroslav Hajek <highegg@gmail.com>
parents:
7620
diff
changeset
|
556 extern OCTAVE_API Range operator * (double x, const Range& r); |
28524
455fe4a6f22c
deprecate arithmetic operators for ranges; eliminate use in Octave
John W. Eaton <jwe@octave.org>
parents:
28402
diff
changeset
|
557 |
455fe4a6f22c
deprecate arithmetic operators for ranges; eliminate use in Octave
John W. Eaton <jwe@octave.org>
parents:
28402
diff
changeset
|
558 OCTAVE_DEPRECATED (7, "arithmetic operations on Range objects are unreliable") |
8553
c7ff200e45f5
optimize range-scalar ops
Jaroslav Hajek <highegg@gmail.com>
parents:
7620
diff
changeset
|
559 extern OCTAVE_API Range operator * (const Range& r, double x); |
c7ff200e45f5
optimize range-scalar ops
Jaroslav Hajek <highegg@gmail.com>
parents:
7620
diff
changeset
|
560 |
3 | 561 #endif |