Mercurial > octave
annotate liboctave/array/Range.h @ 30188:e424d966dca7
replace rangeidx helper classes with lambda expressions
* Range.h, Range.cc (rangeidx_helper, __rangeidx_helper): Delete.
(range<T>::index): Use lambda expression instead of rangeidx_helper
class instance.
(Range::index): Likewise, for __rangeidx_helper.
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Thu, 16 Sep 2021 12:49:01 -0400 |
parents | 4c88a452519c |
children | 41eecdf76372 |
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 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
|
43 class |
3ef055ca1d5e
Export template class definition instead of template class instantiations (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
44 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
|
45 range |
28635
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 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
49 range (void) |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
50 : 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
|
51 { } |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
52 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
53 // 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
|
54 // 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
|
55 // 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
|
56 // 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
|
57 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
58 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
|
59 : 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
|
60 m_final (), m_numel () |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
61 { |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
62 init (); |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
63 } |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
64 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
65 range (const T& base, const T& limit) |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
66 : 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
|
67 { |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
68 init (); |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
69 } |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
70 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
71 // Allow conversion from (presumably) properly constructed Range |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
72 // 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
|
73 // 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
|
74 // and numel must be consistent. |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
75 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
76 // 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
|
77 // consistent. |
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 // 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
|
80 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
81 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
|
82 octave_idx_type numel) |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
83 : 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
|
84 m_final (limit), m_numel (numel) |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
85 { } |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
86 |
28639
7ebe185e3818
new octave_value constructors for integer and float ranges.
John W. Eaton <jwe@octave.org>
parents:
28638
diff
changeset
|
87 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
|
88 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
|
89 : 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
|
90 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
|
91 { } |
7ebe185e3818
new octave_value constructors for integer and float ranges.
John W. Eaton <jwe@octave.org>
parents:
28638
diff
changeset
|
92 |
28635
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
93 // 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
|
94 // 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
|
95 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
96 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
|
97 { |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
98 // 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
|
99 // 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
|
100 // 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
|
101 // purpose of this strange constructor form. |
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 return range<T> (base, T (), base, numel); |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
104 } |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
105 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
106 // 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
|
107 // 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
|
108 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
109 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
|
110 octave_idx_type numel) |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
111 { |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
112 // 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
|
113 // 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
|
114 // 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
|
115 // purpose of this strange constructor form. |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
116 |
28646
e26201931ea3
new template class for octave_range objects
John W. Eaton <jwe@octave.org>
parents:
28639
diff
changeset
|
117 T final_val = base + (numel - 1) * increment; |
28635
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
118 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
119 return range<T> (base, increment, final_val, numel); |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
120 } |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
121 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
122 range (const range<T>&) = default; |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
123 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
124 range<T>& operator = (const range<T>&) = default; |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
125 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
126 ~range (void) = default; |
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 T base (void) const { return m_base; } |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
129 T increment (void) const { return m_increment; } |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
130 T limit (void) const { return m_limit; } |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
131 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
132 T final_value (void) const { return m_final; } |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
133 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
134 T min (void) const |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
135 { |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
136 return (m_numel > 0 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
137 ? m_increment > T (0) ? base () : final_value () |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
138 : T (0)); |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
139 } |
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 T max (void) const |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
142 { |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
143 return (m_numel > 0 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
144 ? m_increment > T (0) ? final_value () : base () |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
145 : T (0)); |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
146 } |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
147 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
148 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
|
149 |
29353
715344f405f0
improve handling of nan, infinite value, and empty ranges (bug #59229)
John W. Eaton <jwe@octave.org>
parents:
29352
diff
changeset
|
150 // 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
|
151 // 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
|
152 // 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
|
153 // 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
|
154 // 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
|
155 // 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
|
156 // 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
|
157 |
715344f405f0
improve handling of nan, infinite value, and empty ranges (bug #59229)
John W. Eaton <jwe@octave.org>
parents:
29352
diff
changeset
|
158 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
|
159 |
28635
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
160 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
|
161 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
162 octave_idx_type rows (void) const { return 1; } |
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 octave_idx_type cols (void) const { return numel (); } |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
165 octave_idx_type columns (void) const { return numel (); } |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
166 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
167 bool isempty (void) const { return numel () == 0; } |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
168 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
169 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
|
170 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
171 sortmode issorted (sortmode mode = ASCENDING) const |
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 if (m_numel > 1 && m_increment > T (0)) |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
174 mode = (mode == DESCENDING) ? UNSORTED : ASCENDING; |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
175 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
|
176 mode = (mode == ASCENDING) ? UNSORTED : DESCENDING; |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
177 else |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
178 mode = (mode == UNSORTED) ? ASCENDING : mode; |
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 return mode; |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
181 } |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
182 |
29226
3ef055ca1d5e
Export template class definition instead of template class instantiations (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
183 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
|
184 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
185 // 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
|
186 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
187 T checkelem (octave_idx_type i) const |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
188 { |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
189 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
|
190 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
|
191 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
192 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
|
193 // 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
|
194 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
|
195 else if (i < m_numel - 1) |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
196 return m_base + T (i) * m_increment; |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
197 else |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
198 return final_value (); |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
199 } |
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 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
|
202 { |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
203 // Ranges are *always* row vectors. |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
204 if (i != 0) |
28857
43ad651cf5a0
eliminate unnecessary uses of octave:: namespace qualifier
John W. Eaton <jwe@octave.org>
parents:
28646
diff
changeset
|
205 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
|
206 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
207 return checkelem (j); |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
208 } |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
209 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
210 T elem (octave_idx_type i) const |
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 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
|
213 // 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
|
214 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
|
215 else if (i < m_numel - 1) |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
216 return m_base + T (i) * m_increment; |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
217 else |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
218 return final_value (); |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
219 } |
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 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
|
222 { |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
223 return elem (j); |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
224 } |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
225 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
226 T operator () (octave_idx_type i) const |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
227 { |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
228 return elem (i); |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
229 } |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
230 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
231 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
|
232 { |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
233 return elem (i, j); |
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 |
30188
e424d966dca7
replace rangeidx helper classes with lambda expressions
John W. Eaton <jwe@octave.org>
parents:
29954
diff
changeset
|
236 Array<T> index (const idx_vector& idx) const |
28635
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
237 { |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
238 Array<T> retval; |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
239 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
240 octave_idx_type n = m_numel; |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
241 |
30188
e424d966dca7
replace rangeidx helper classes with lambda expressions
John W. Eaton <jwe@octave.org>
parents:
29954
diff
changeset
|
242 if (idx.is_colon ()) |
28635
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 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
|
245 } |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
246 else |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
247 { |
30188
e424d966dca7
replace rangeidx helper classes with lambda expressions
John W. Eaton <jwe@octave.org>
parents:
29954
diff
changeset
|
248 if (idx.extent (n) != n) |
e424d966dca7
replace rangeidx helper classes with lambda expressions
John W. Eaton <jwe@octave.org>
parents:
29954
diff
changeset
|
249 err_index_out_of_range (1, 1, idx.extent (n), n, dims ()); |
28635
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
250 |
30188
e424d966dca7
replace rangeidx helper classes with lambda expressions
John W. Eaton <jwe@octave.org>
parents:
29954
diff
changeset
|
251 dim_vector idx_dims = idx.orig_dimensions (); |
e424d966dca7
replace rangeidx helper classes with lambda expressions
John W. Eaton <jwe@octave.org>
parents:
29954
diff
changeset
|
252 octave_idx_type idx_len = idx.length (n); |
28635
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
253 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
254 // taken from Array.cc. |
30188
e424d966dca7
replace rangeidx helper classes with lambda expressions
John W. Eaton <jwe@octave.org>
parents:
29954
diff
changeset
|
255 if (n != 1 && idx_dims.isvector ()) |
e424d966dca7
replace rangeidx helper classes with lambda expressions
John W. Eaton <jwe@octave.org>
parents:
29954
diff
changeset
|
256 idx_dims = dim_vector (1, idx_len); |
28635
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
257 |
30188
e424d966dca7
replace rangeidx helper classes with lambda expressions
John W. Eaton <jwe@octave.org>
parents:
29954
diff
changeset
|
258 retval.clear (idx_dims); |
28635
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 // idx_vector loop across all values in i, |
30188
e424d966dca7
replace rangeidx helper classes with lambda expressions
John W. Eaton <jwe@octave.org>
parents:
29954
diff
changeset
|
261 // executing the lambda expression for each index value. |
e424d966dca7
replace rangeidx helper classes with lambda expressions
John W. Eaton <jwe@octave.org>
parents:
29954
diff
changeset
|
262 |
e424d966dca7
replace rangeidx helper classes with lambda expressions
John W. Eaton <jwe@octave.org>
parents:
29954
diff
changeset
|
263 T *array = retval.fortran_vec (); |
e424d966dca7
replace rangeidx helper classes with lambda expressions
John W. Eaton <jwe@octave.org>
parents:
29954
diff
changeset
|
264 |
e424d966dca7
replace rangeidx helper classes with lambda expressions
John W. Eaton <jwe@octave.org>
parents:
29954
diff
changeset
|
265 idx.loop (n, [=, &array] (octave_idx_type i) { |
e424d966dca7
replace rangeidx helper classes with lambda expressions
John W. Eaton <jwe@octave.org>
parents:
29954
diff
changeset
|
266 if (i == 0) |
e424d966dca7
replace rangeidx helper classes with lambda expressions
John W. Eaton <jwe@octave.org>
parents:
29954
diff
changeset
|
267 // Required for proper NaN handling. |
e424d966dca7
replace rangeidx helper classes with lambda expressions
John W. Eaton <jwe@octave.org>
parents:
29954
diff
changeset
|
268 *array++ = m_numel == 0 ? m_final : m_base; |
e424d966dca7
replace rangeidx helper classes with lambda expressions
John W. Eaton <jwe@octave.org>
parents:
29954
diff
changeset
|
269 else if (i < m_numel - 1) |
e424d966dca7
replace rangeidx helper classes with lambda expressions
John W. Eaton <jwe@octave.org>
parents:
29954
diff
changeset
|
270 *array++ = m_base + T (i) * m_increment; |
e424d966dca7
replace rangeidx helper classes with lambda expressions
John W. Eaton <jwe@octave.org>
parents:
29954
diff
changeset
|
271 else |
e424d966dca7
replace rangeidx helper classes with lambda expressions
John W. Eaton <jwe@octave.org>
parents:
29954
diff
changeset
|
272 *array++ = m_final; |
e424d966dca7
replace rangeidx helper classes with lambda expressions
John W. Eaton <jwe@octave.org>
parents:
29954
diff
changeset
|
273 }); |
28635
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
274 } |
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 return retval; |
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 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
279 Array<T> diag (octave_idx_type k) const |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
280 { |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
281 return array_value ().diag (k); |
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 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
284 Array<T> array_value (void) const |
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 octave_idx_type nel = numel (); |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
287 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
288 Array<T> retval (dim_vector (1, nel)); |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
289 |
29353
715344f405f0
improve handling of nan, infinite value, and empty ranges (bug #59229)
John W. Eaton <jwe@octave.org>
parents:
29352
diff
changeset
|
290 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
|
291 // 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
|
292 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
|
293 else if (nel > 1) |
28635
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
294 { |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
295 // 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
|
296 // 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
|
297 retval(0) = m_base; |
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 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
|
300 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
|
301 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
302 retval.xelem (nel - 1) = final_value (); |
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 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
305 return retval; |
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 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
308 private: |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
309 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
310 T m_base; |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
311 T m_increment; |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
312 T m_limit; |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
313 T m_final; |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
314 octave_idx_type m_numel; |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
315 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
316 // 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
|
317 // 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
|
318 // operator. |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
319 |
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
|
320 // 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
|
321 // 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
|
322 |
03c283f73b9a
specialize range<T>::init instead of defining get_numel and get_final_value
John W. Eaton <jwe@octave.org>
parents:
29351
diff
changeset
|
323 void init (void) |
28635
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
324 { |
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
|
325 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
|
326 || (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
|
327 || (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
|
328 ? 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
|
329 : (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
|
330 |
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
|
331 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
|
332 } |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
333 }; |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
334 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
335 // Specializations defined externally. |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
336 |
29226
3ef055ca1d5e
Export template class definition instead of template class instantiations (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
337 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
|
338 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
|
339 |
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
|
340 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
|
341 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
|
342 |
29353
715344f405f0
improve handling of nan, infinite value, and empty ranges (bug #59229)
John W. Eaton <jwe@octave.org>
parents:
29352
diff
changeset
|
343 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
|
344 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
|
345 |
29226
3ef055ca1d5e
Export template class definition instead of template class instantiations (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
346 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
|
347 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
|
348 } |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
349 |
1860 | 350 class |
351 Range | |
3 | 352 { |
17769
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
353 public: |
1860 | 354 |
29954
4c88a452519c
rename OCTAVE_USE_DEPRECATED_FUNCTIONS macro and attempt to make it work
John W. Eaton <jwe@octave.org>
parents:
29569
diff
changeset
|
355 #if defined (OCTAVE_PROVIDE_DEPRECATED_SYMBOLS) |
28638
98192ec1621f
replace Range with range<double>
John W. Eaton <jwe@octave.org>
parents:
28637
diff
changeset
|
356 OCTAVE_DEPRECATED (7, "use the 'octave::range<double>' class instead") |
1528 | 357 Range (void) |
28524
455fe4a6f22c
deprecate arithmetic operators for ranges; eliminate use in Octave
John W. Eaton <jwe@octave.org>
parents:
28402
diff
changeset
|
358 : 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
|
359 { } |
1528 | 360 |
28635
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
361 // 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
|
362 // 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
|
363 // 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
|
364 // reset limit to the computed final value. |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
365 |
28638
98192ec1621f
replace Range with range<double>
John W. Eaton <jwe@octave.org>
parents:
28637
diff
changeset
|
366 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
|
367 Range (const octave::range<double>& r) |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
368 : 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
|
369 m_numel (r.numel ()) |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
370 { } |
29954
4c88a452519c
rename OCTAVE_USE_DEPRECATED_FUNCTIONS macro and attempt to make it work
John W. Eaton <jwe@octave.org>
parents:
29569
diff
changeset
|
371 #endif |
1528 | 372 |
27023
fc256e9d882e
use default ctors, dtors, and assignment ops in Matrix, intNDArray, and Cell
John W. Eaton <jwe@octave.org>
parents:
26377
diff
changeset
|
373 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
|
374 |
fc256e9d882e
use default ctors, dtors, and assignment ops in Matrix, intNDArray, and Cell
John W. Eaton <jwe@octave.org>
parents:
26377
diff
changeset
|
375 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
|
376 |
fc256e9d882e
use default ctors, dtors, and assignment ops in Matrix, intNDArray, and Cell
John W. Eaton <jwe@octave.org>
parents:
26377
diff
changeset
|
377 ~Range (void) = default; |
3 | 378 |
29954
4c88a452519c
rename OCTAVE_USE_DEPRECATED_FUNCTIONS macro and attempt to make it work
John W. Eaton <jwe@octave.org>
parents:
29569
diff
changeset
|
379 #if defined (OCTAVE_PROVIDE_DEPRECATED_SYMBOLS) |
28638
98192ec1621f
replace Range with range<double>
John W. Eaton <jwe@octave.org>
parents:
28637
diff
changeset
|
380 OCTAVE_DEPRECATED (7, "use the 'octave::range<double>' class instead") |
1528 | 381 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
|
382 : m_base (b), m_limit (l), m_inc (1), m_numel (numel_internal ()) |
20513 | 383 { |
28592
e70c859c4bff
allow infinite limits on for loop ranges (bug #45143)
John W. Eaton <jwe@octave.org>
parents:
28524
diff
changeset
|
384 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
|
385 m_limit = limit_internal (); |
20513 | 386 } |
1528 | 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") |
1528 | 389 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
|
390 : m_base (b), m_limit (l), m_inc (i), m_numel (numel_internal ()) |
20513 | 391 { |
28592
e70c859c4bff
allow infinite limits on for loop ranges (bug #45143)
John W. Eaton <jwe@octave.org>
parents:
28524
diff
changeset
|
392 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
|
393 m_limit = limit_internal (); |
20513 | 394 } |
1528 | 395 |
28524
455fe4a6f22c
deprecate arithmetic operators for ranges; eliminate use in Octave
John W. Eaton <jwe@octave.org>
parents:
28402
diff
changeset
|
396 // 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
|
397 // 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
|
398 |
28635
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
399 // 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
|
400 // 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
|
401 |
28638
98192ec1621f
replace Range with range<double>
John W. Eaton <jwe@octave.org>
parents:
28637
diff
changeset
|
402 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
|
403 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
|
404 : 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
|
405 { |
28592
e70c859c4bff
allow infinite limits on for loop ranges (bug #45143)
John W. Eaton <jwe@octave.org>
parents:
28524
diff
changeset
|
406 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
|
407 m_limit = limit_internal (); |
17769
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
408 } |
29954
4c88a452519c
rename OCTAVE_USE_DEPRECATED_FUNCTIONS macro and attempt to make it work
John W. Eaton <jwe@octave.org>
parents:
29569
diff
changeset
|
409 #endif |
8589
0131fa223dbc
make length invariant in range-scalar ops
Jaroslav Hajek <highegg@gmail.com>
parents:
8553
diff
changeset
|
410 |
28592
e70c859c4bff
allow infinite limits on for loop ranges (bug #45143)
John W. Eaton <jwe@octave.org>
parents:
28524
diff
changeset
|
411 // 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
|
412 bool ok (void) const |
e70c859c4bff
allow infinite limits on for loop ranges (bug #45143)
John W. Eaton <jwe@octave.org>
parents:
28524
diff
changeset
|
413 { |
e70c859c4bff
allow infinite limits on for loop ranges (bug #45143)
John W. Eaton <jwe@octave.org>
parents:
28524
diff
changeset
|
414 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
|
415 && (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
|
416 } |
8589
0131fa223dbc
make length invariant in range-scalar ops
Jaroslav Hajek <highegg@gmail.com>
parents:
8553
diff
changeset
|
417 |
28402
09a3c0e91e6e
style update for Range class
John W. Eaton <jwe@octave.org>
parents:
28004
diff
changeset
|
418 double base (void) const { return m_base; } |
09a3c0e91e6e
style update for Range class
John W. Eaton <jwe@octave.org>
parents:
28004
diff
changeset
|
419 double limit (void) const { return m_limit; } |
09a3c0e91e6e
style update for Range class
John W. Eaton <jwe@octave.org>
parents:
28004
diff
changeset
|
420 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
|
421 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
|
422 |
28637
fb37f50d5ba8
new Range::final_value function
John W. Eaton <jwe@octave.org>
parents:
28636
diff
changeset
|
423 // 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
|
424 // 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
|
425 // 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
|
426 // 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
|
427 // 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
|
428 // 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
|
429 // be fixed with the new template range class. |
fb37f50d5ba8
new Range::final_value function
John W. Eaton <jwe@octave.org>
parents:
28636
diff
changeset
|
430 double final_value (void) const { return m_limit; } |
25812
fc74c8d2a584
Clean up liboctave Range implementation.
Rik <rik@octave.org>
parents:
25054
diff
changeset
|
431 |
28402
09a3c0e91e6e
style update for Range class
John W. Eaton <jwe@octave.org>
parents:
28004
diff
changeset
|
432 octave_idx_type numel (void) const { return m_numel; } |
25812
fc74c8d2a584
Clean up liboctave Range implementation.
Rik <rik@octave.org>
parents:
25054
diff
changeset
|
433 |
28402
09a3c0e91e6e
style update for Range class
John W. Eaton <jwe@octave.org>
parents:
28004
diff
changeset
|
434 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
|
435 |
24780
0d21e2a1cdfc
new element access operators for Range objects
John W. Eaton <jwe@octave.org>
parents:
24534
diff
changeset
|
436 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
|
437 |
0d21e2a1cdfc
new element access operators for Range objects
John W. Eaton <jwe@octave.org>
parents:
24534
diff
changeset
|
438 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
|
439 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
|
440 |
23577
80c42f4cca13
maint: Deprecate is_empty and replace with isempty.
Rik <rik@octave.org>
parents:
23564
diff
changeset
|
441 bool isempty (void) const { return numel () == 0; } |
80c42f4cca13
maint: Deprecate is_empty and replace with isempty.
Rik <rik@octave.org>
parents:
23564
diff
changeset
|
442 |
29226
3ef055ca1d5e
Export template class definition instead of template class instantiations (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
443 OCTAVE_API bool all_elements_are_ints (void) const; |
2383 | 444 |
29226
3ef055ca1d5e
Export template class definition instead of template class instantiations (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
445 OCTAVE_API Matrix matrix_value (void) const; |
645 | 446 |
29226
3ef055ca1d5e
Export template class definition instead of template class instantiations (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
447 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
|
448 OCTAVE_API double max (void) const; |
3 | 449 |
29226
3ef055ca1d5e
Export template class definition instead of template class instantiations (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
450 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
|
451 OCTAVE_API void sort_internal (Array<octave_idx_type>& sidx, bool ascending = true); |
7458 | 452 |
29226
3ef055ca1d5e
Export template class definition instead of template class instantiations (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
453 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
|
454 |
29226
3ef055ca1d5e
Export template class definition instead of template class instantiations (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
455 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
|
456 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
|
457 sortmode mode = ASCENDING) const; |
208 | 458 |
29226
3ef055ca1d5e
Export template class definition instead of template class instantiations (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
459 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
|
460 |
29226
3ef055ca1d5e
Export template class definition instead of template class instantiations (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
461 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
|
462 |
9986
672e1b49e01e
optimize indexing of ranges by single subscripts
Jaroslav Hajek <highegg@gmail.com>
parents:
8971
diff
changeset
|
463 // 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
|
464 |
29226
3ef055ca1d5e
Export template class definition instead of template class instantiations (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
465 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
|
466 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
|
467 |
29226
3ef055ca1d5e
Export template class definition instead of template class instantiations (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
468 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
|
469 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
|
470 { return elem (j); } |
9986
672e1b49e01e
optimize indexing of ranges by single subscripts
Jaroslav Hajek <highegg@gmail.com>
parents:
8971
diff
changeset
|
471 |
23487
af2f1f3dbe06
eliminate --enable-bounds-check configure option
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
472 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
|
473 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
|
474 { return elem (i, j); } |
23487
af2f1f3dbe06
eliminate --enable-bounds-check configure option
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
475 |
29569
29a1f8fd8ee6
move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29359
diff
changeset
|
476 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
|
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 void set_base (double b); |
4811 | 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 void set_limit (double l); |
4811 | 481 |
29226
3ef055ca1d5e
Export template class definition instead of template class instantiations (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
482 OCTAVE_API void set_inc (double i); |
1528 | 483 |
17769
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
484 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
|
485 const Range& r); |
6108 | 486 friend OCTAVE_API std::istream& operator >> (std::istream& is, Range& r); |
3 | 487 |
8971 | 488 friend OCTAVE_API Range operator - (const Range& r); |
489 friend OCTAVE_API Range operator + (double x, const Range& r); | |
490 friend OCTAVE_API Range operator + (const Range& r, double x); | |
491 friend OCTAVE_API Range operator - (double x, const Range& r); | |
492 friend OCTAVE_API Range operator - (const Range& r, double x); | |
493 friend OCTAVE_API Range operator * (double x, const Range& r); | |
494 friend OCTAVE_API Range operator * (const Range& r, double x); | |
495 | |
17769
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
496 private: |
1860 | 497 |
28402
09a3c0e91e6e
style update for Range class
John W. Eaton <jwe@octave.org>
parents:
28004
diff
changeset
|
498 double m_base; |
09a3c0e91e6e
style update for Range class
John W. Eaton <jwe@octave.org>
parents:
28004
diff
changeset
|
499 double m_limit; |
09a3c0e91e6e
style update for Range class
John W. Eaton <jwe@octave.org>
parents:
28004
diff
changeset
|
500 double m_inc; |
1860 | 501 |
28402
09a3c0e91e6e
style update for Range class
John W. Eaton <jwe@octave.org>
parents:
28004
diff
changeset
|
502 octave_idx_type m_numel; |
4811 | 503 |
29226
3ef055ca1d5e
Export template class definition instead of template class instantiations (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
504 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
|
505 |
29226
3ef055ca1d5e
Export template class definition instead of template class instantiations (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
506 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
|
507 |
29226
3ef055ca1d5e
Export template class definition instead of template class instantiations (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
508 OCTAVE_API void init (void); |
8971 | 509 |
18852
47d4b680d0e0
improve accuracy of range/scalar arithmetic (bug #42589)
John W. Eaton <jwe@octave.org>
parents:
17769
diff
changeset
|
510 protected: |
47d4b680d0e0
improve accuracy of range/scalar arithmetic (bug #42589)
John W. Eaton <jwe@octave.org>
parents:
17769
diff
changeset
|
511 |
28524
455fe4a6f22c
deprecate arithmetic operators for ranges; eliminate use in Octave
John W. Eaton <jwe@octave.org>
parents:
28402
diff
changeset
|
512 // 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
|
513 // operators are removed. |
18852
47d4b680d0e0
improve accuracy of range/scalar arithmetic (bug #42589)
John W. Eaton <jwe@octave.org>
parents:
17769
diff
changeset
|
514 |
47d4b680d0e0
improve accuracy of range/scalar arithmetic (bug #42589)
John W. Eaton <jwe@octave.org>
parents:
17769
diff
changeset
|
515 // 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
|
516 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
|
517 : 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
|
518 { } |
3 | 519 }; |
520 | |
29954
4c88a452519c
rename OCTAVE_USE_DEPRECATED_FUNCTIONS macro and attempt to make it work
John W. Eaton <jwe@octave.org>
parents:
29569
diff
changeset
|
521 #if defined (OCTAVE_PROVIDE_DEPRECATED_SYMBOLS) |
28524
455fe4a6f22c
deprecate arithmetic operators for ranges; eliminate use in Octave
John W. Eaton <jwe@octave.org>
parents:
28402
diff
changeset
|
522 OCTAVE_DEPRECATED (7, "arithmetic operations on Range objects are unreliable") |
6108 | 523 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
|
524 |
455fe4a6f22c
deprecate arithmetic operators for ranges; eliminate use in Octave
John W. Eaton <jwe@octave.org>
parents:
28402
diff
changeset
|
525 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
|
526 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
|
527 |
455fe4a6f22c
deprecate arithmetic operators for ranges; eliminate use in Octave
John W. Eaton <jwe@octave.org>
parents:
28402
diff
changeset
|
528 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
|
529 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
|
530 |
455fe4a6f22c
deprecate arithmetic operators for ranges; eliminate use in Octave
John W. Eaton <jwe@octave.org>
parents:
28402
diff
changeset
|
531 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
|
532 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
|
533 |
455fe4a6f22c
deprecate arithmetic operators for ranges; eliminate use in Octave
John W. Eaton <jwe@octave.org>
parents:
28402
diff
changeset
|
534 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
|
535 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
|
536 |
455fe4a6f22c
deprecate arithmetic operators for ranges; eliminate use in Octave
John W. Eaton <jwe@octave.org>
parents:
28402
diff
changeset
|
537 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
|
538 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
|
539 |
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") |
8553
c7ff200e45f5
optimize range-scalar ops
Jaroslav Hajek <highegg@gmail.com>
parents:
7620
diff
changeset
|
541 extern OCTAVE_API Range operator * (const Range& r, double x); |
29954
4c88a452519c
rename OCTAVE_USE_DEPRECATED_FUNCTIONS macro and attempt to make it work
John W. Eaton <jwe@octave.org>
parents:
29569
diff
changeset
|
542 #endif |
8553
c7ff200e45f5
optimize range-scalar ops
Jaroslav Hajek <highegg@gmail.com>
parents:
7620
diff
changeset
|
543 |
3 | 544 #endif |