Mercurial > octave
annotate liboctave/array/Range.h @ 31608:23664317f0d3
maint: merge stable to default
author | Rik <rik@octave.org> |
---|---|
date | Thu, 01 Dec 2022 20:05:44 -0800 |
parents | dfa5d9c3ae72 aac27ad79be6 |
children | 5f11de0e7440 |
rev | line source |
---|---|
27923
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
1 //////////////////////////////////////////////////////////////////////// |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
2 // |
30564
796f54d4ddbf
update Octave Project Developers copyright for the new year
John W. Eaton <jwe@octave.org>
parents:
30489
diff
changeset
|
3 // Copyright (C) 1993-2022 The Octave Project Developers |
27923
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
4 // |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
5 // See the file COPYRIGHT.md in the top-level directory of this |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
6 // distribution or <https://octave.org/copyright/>. |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
7 // |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
8 // This file is part of Octave. |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
9 // |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
10 // Octave is free software: you can redistribute it and/or modify it |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
11 // under the terms of the GNU General Public License as published by |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
12 // the Free Software Foundation, either version 3 of the License, or |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
13 // (at your option) any later version. |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
14 // |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
15 // Octave is distributed in the hope that it will be useful, but |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
16 // WITHOUT ANY WARRANTY; without even the implied warranty of |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
17 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
18 // GNU General Public License for more details. |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
19 // |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
20 // You should have received a copy of the GNU General Public License |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
21 // along with Octave; see the file COPYING. If not, see |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
22 // <https://www.gnu.org/licenses/>. |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
23 // |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
24 //////////////////////////////////////////////////////////////////////// |
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> |
30835
2989202f92f8
only allow range<FLOAT> to be instantiated
John W. Eaton <jwe@octave.org>
parents:
30564
diff
changeset
|
32 #include <type_traits> |
7458 | 33 |
30429
e38202d3628d
provide header file for forward declaration of Array<T> template
John W. Eaton <jwe@octave.org>
parents:
30420
diff
changeset
|
34 #include "Array-fwd.h" |
4810 | 35 #include "dMatrix.h" |
28004
403df0b32204
update out_of_range error messages
John W. Eaton <jwe@octave.org>
parents:
27923
diff
changeset
|
36 #include "dim-vector.h" |
28635
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
37 #include "lo-error.h" |
7458 | 38 #include "oct-sort.h" |
30489
bd67d0045e21
use separate files for MArray, intNDArray, and range template forward decls
John W. Eaton <jwe@octave.org>
parents:
30429
diff
changeset
|
39 #include "range-fwd.h" |
3 | 40 |
31605
e88a07dec498
maint: Use macros to begin/end C++ namespaces.
Rik <rik@octave.org>
parents:
30853
diff
changeset
|
41 OCTAVE_BEGIN_NAMESPACE(octave) |
e88a07dec498
maint: Use macros to begin/end C++ namespaces.
Rik <rik@octave.org>
parents:
30853
diff
changeset
|
42 |
30835
2989202f92f8
only allow range<FLOAT> to be instantiated
John W. Eaton <jwe@octave.org>
parents:
30564
diff
changeset
|
43 // For now, only define for floating point types. However, we only |
2989202f92f8
only allow range<FLOAT> to be instantiated
John W. Eaton <jwe@octave.org>
parents:
30564
diff
changeset
|
44 // need range<float> as a temporary local variable in make_float_range |
2989202f92f8
only allow range<FLOAT> to be instantiated
John W. Eaton <jwe@octave.org>
parents:
30564
diff
changeset
|
45 // in ov.cc. |
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 template <typename T> |
30835
2989202f92f8
only allow range<FLOAT> to be instantiated
John W. Eaton <jwe@octave.org>
parents:
30564
diff
changeset
|
48 class |
2989202f92f8
only allow range<FLOAT> to be instantiated
John W. Eaton <jwe@octave.org>
parents:
30564
diff
changeset
|
49 range<T, typename std::enable_if<std::is_floating_point<T>::value>::type> |
31607
aac27ad79be6
maint: Re-indent code after switch to using namespace macros.
Rik <rik@octave.org>
parents:
31605
diff
changeset
|
50 { |
28635
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
51 public: |
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 range (void) |
30416
4736bc8e9804
Allow descending ranges of all integer types (bug #61132).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30405
diff
changeset
|
54 : m_base (0), m_increment (0), m_limit (0), m_final (0), m_numel (0), |
4736bc8e9804
Allow descending ranges of all integer types (bug #61132).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30405
diff
changeset
|
55 m_reverse (false) |
28635
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
56 { } |
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 // 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
|
59 // 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
|
60 // 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
|
61 // to the value of base + a multiple of the increment. |
30835
2989202f92f8
only allow range<FLOAT> to be instantiated
John W. Eaton <jwe@octave.org>
parents:
30564
diff
changeset
|
62 |
30416
4736bc8e9804
Allow descending ranges of all integer types (bug #61132).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30405
diff
changeset
|
63 range (const T& base, const T& increment, const T& limit, |
30420
366aa563dd2e
style fixes for Range.h and Range.cc
John W. Eaton <jwe@octave.org>
parents:
30416
diff
changeset
|
64 bool reverse = false) |
28635
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
65 : m_base (base), m_increment (increment), m_limit (limit), |
30416
4736bc8e9804
Allow descending ranges of all integer types (bug #61132).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30405
diff
changeset
|
66 m_final (), m_numel (), m_reverse (reverse) |
28635
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 range (const T& base, const T& limit) |
30416
4736bc8e9804
Allow descending ranges of all integer types (bug #61132).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30405
diff
changeset
|
72 : m_base (base), m_increment (1), m_limit (limit), m_final (), m_numel (), |
4736bc8e9804
Allow descending ranges of all integer types (bug #61132).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30405
diff
changeset
|
73 m_reverse (false) |
28635
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
74 { |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
75 init (); |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
76 } |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
77 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
78 // Allow conversion from (presumably) properly constructed Range |
30853
fc3bd70cd1be
eliminate range<T>::make_constant function
John W. Eaton <jwe@octave.org>
parents:
30852
diff
changeset
|
79 // objects. The values of base, limit, increment, and numel must be |
fc3bd70cd1be
eliminate range<T>::make_constant function
John W. Eaton <jwe@octave.org>
parents:
30852
diff
changeset
|
80 // consistent. |
28635
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
81 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
82 // FIXME: Actually check that base, limit, increment, and numel are |
30853
fc3bd70cd1be
eliminate range<T>::make_constant function
John W. Eaton <jwe@octave.org>
parents:
30852
diff
changeset
|
83 // consistent? |
28635
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 range (const T& base, const T& increment, const T& limit, |
30420
366aa563dd2e
style fixes for Range.h and Range.cc
John W. Eaton <jwe@octave.org>
parents:
30416
diff
changeset
|
86 octave_idx_type numel, bool reverse = false) |
28635
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
87 : m_base (base), m_increment (increment), m_limit (limit), |
30416
4736bc8e9804
Allow descending ranges of all integer types (bug #61132).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30405
diff
changeset
|
88 m_final (limit), m_numel (numel), m_reverse (reverse) |
28635
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 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
91 // 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
|
92 // 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
|
93 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
94 static range<T> make_n_element_range (const T& base, const T& increment, |
30416
4736bc8e9804
Allow descending ranges of all integer types (bug #61132).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30405
diff
changeset
|
95 octave_idx_type numel, |
4736bc8e9804
Allow descending ranges of all integer types (bug #61132).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30405
diff
changeset
|
96 bool reverse = false) |
28635
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 |
30853
fc3bd70cd1be
eliminate range<T>::make_constant function
John W. Eaton <jwe@octave.org>
parents:
30852
diff
changeset
|
100 // clearer to see "make_n_element_range" instead of puzzling over the |
28635
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 |
30416
4736bc8e9804
Allow descending ranges of all integer types (bug #61132).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30405
diff
changeset
|
103 T final_val = (reverse ? base - (numel - 1) * increment |
4736bc8e9804
Allow descending ranges of all integer types (bug #61132).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30405
diff
changeset
|
104 : base + (numel - 1) * increment); |
28635
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
105 |
30416
4736bc8e9804
Allow descending ranges of all integer types (bug #61132).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30405
diff
changeset
|
106 return range<T> (base, increment, final_val, numel, reverse); |
28635
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 |
30835
2989202f92f8
only allow range<FLOAT> to be instantiated
John W. Eaton <jwe@octave.org>
parents:
30564
diff
changeset
|
109 range (const range<T>& r) |
2989202f92f8
only allow range<FLOAT> to be instantiated
John W. Eaton <jwe@octave.org>
parents:
30564
diff
changeset
|
110 : m_base (r.m_base), m_increment (r.m_increment), |
2989202f92f8
only allow range<FLOAT> to be instantiated
John W. Eaton <jwe@octave.org>
parents:
30564
diff
changeset
|
111 m_limit (r.m_limit), m_final (r.m_final), |
2989202f92f8
only allow range<FLOAT> to be instantiated
John W. Eaton <jwe@octave.org>
parents:
30564
diff
changeset
|
112 m_numel (r.m_numel), m_reverse (r.m_reverse) |
2989202f92f8
only allow range<FLOAT> to be instantiated
John W. Eaton <jwe@octave.org>
parents:
30564
diff
changeset
|
113 { } |
28635
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
114 |
30835
2989202f92f8
only allow range<FLOAT> to be instantiated
John W. Eaton <jwe@octave.org>
parents:
30564
diff
changeset
|
115 range<T>& operator = (const range<T>& r) |
2989202f92f8
only allow range<FLOAT> to be instantiated
John W. Eaton <jwe@octave.org>
parents:
30564
diff
changeset
|
116 { |
2989202f92f8
only allow range<FLOAT> to be instantiated
John W. Eaton <jwe@octave.org>
parents:
30564
diff
changeset
|
117 if (this != &r) |
2989202f92f8
only allow range<FLOAT> to be instantiated
John W. Eaton <jwe@octave.org>
parents:
30564
diff
changeset
|
118 { |
2989202f92f8
only allow range<FLOAT> to be instantiated
John W. Eaton <jwe@octave.org>
parents:
30564
diff
changeset
|
119 m_base = r.m_base; |
2989202f92f8
only allow range<FLOAT> to be instantiated
John W. Eaton <jwe@octave.org>
parents:
30564
diff
changeset
|
120 m_increment = r.m_increment; |
2989202f92f8
only allow range<FLOAT> to be instantiated
John W. Eaton <jwe@octave.org>
parents:
30564
diff
changeset
|
121 m_limit = r.m_limit; |
2989202f92f8
only allow range<FLOAT> to be instantiated
John W. Eaton <jwe@octave.org>
parents:
30564
diff
changeset
|
122 m_final = r.m_final; |
2989202f92f8
only allow range<FLOAT> to be instantiated
John W. Eaton <jwe@octave.org>
parents:
30564
diff
changeset
|
123 m_numel = r.m_numel; |
2989202f92f8
only allow range<FLOAT> to be instantiated
John W. Eaton <jwe@octave.org>
parents:
30564
diff
changeset
|
124 m_reverse = r.m_reverse; |
2989202f92f8
only allow range<FLOAT> to be instantiated
John W. Eaton <jwe@octave.org>
parents:
30564
diff
changeset
|
125 } |
29353
715344f405f0
improve handling of nan, infinite value, and empty ranges (bug #59229)
John W. Eaton <jwe@octave.org>
parents:
29352
diff
changeset
|
126 |
30835
2989202f92f8
only allow range<FLOAT> to be instantiated
John W. Eaton <jwe@octave.org>
parents:
30564
diff
changeset
|
127 return *this; |
2989202f92f8
only allow range<FLOAT> to be instantiated
John W. Eaton <jwe@octave.org>
parents:
30564
diff
changeset
|
128 } |
28635
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 ~range (void) = default; |
29353
715344f405f0
improve handling of nan, infinite value, and empty ranges (bug #59229)
John W. Eaton <jwe@octave.org>
parents:
29352
diff
changeset
|
131 |
28635
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
132 T base (void) const { return m_base; } |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
133 T increment (void) const { return m_increment; } |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
134 T limit (void) const { return m_limit; } |
30416
4736bc8e9804
Allow descending ranges of all integer types (bug #61132).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30405
diff
changeset
|
135 bool reverse (void) const { return m_reverse; } |
28635
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 T final_value (void) const { return m_final; } |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
138 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
139 T min (void) const |
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 return (m_numel > 0 |
30416
4736bc8e9804
Allow descending ranges of all integer types (bug #61132).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30405
diff
changeset
|
142 ? ((m_reverse ? m_increment > T (0) |
4736bc8e9804
Allow descending ranges of all integer types (bug #61132).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30405
diff
changeset
|
143 : m_increment > T (0)) ? base () : final_value ()) |
28635
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
144 : T (0)); |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
145 } |
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 T max (void) const |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
148 { |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
149 return (m_numel > 0 |
30416
4736bc8e9804
Allow descending ranges of all integer types (bug #61132).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30405
diff
changeset
|
150 ? ((m_reverse ? m_increment < T (0) |
4736bc8e9804
Allow descending ranges of all integer types (bug #61132).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30405
diff
changeset
|
151 : m_increment > T (0)) ? final_value () : base ()) |
28635
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
152 : T (0)); |
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 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
155 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
|
156 |
29353
715344f405f0
improve handling of nan, infinite value, and empty ranges (bug #59229)
John W. Eaton <jwe@octave.org>
parents:
29352
diff
changeset
|
157 // 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
|
158 // 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
|
159 // 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
|
160 // 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
|
161 // 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
|
162 // 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
|
163 // 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
|
164 |
715344f405f0
improve handling of nan, infinite value, and empty ranges (bug #59229)
John W. Eaton <jwe@octave.org>
parents:
29352
diff
changeset
|
165 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
|
166 |
28635
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
167 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
|
168 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
169 octave_idx_type rows (void) const { return 1; } |
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 octave_idx_type cols (void) const { return numel (); } |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
172 octave_idx_type columns (void) const { return numel (); } |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
173 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
174 bool isempty (void) const { return numel () == 0; } |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
175 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
176 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
|
177 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
178 sortmode issorted (sortmode mode = ASCENDING) const |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
179 { |
30416
4736bc8e9804
Allow descending ranges of all integer types (bug #61132).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30405
diff
changeset
|
180 if (m_numel > 1 && (m_reverse ? m_increment < T (0) |
4736bc8e9804
Allow descending ranges of all integer types (bug #61132).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30405
diff
changeset
|
181 : m_increment > T (0))) |
4736bc8e9804
Allow descending ranges of all integer types (bug #61132).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30405
diff
changeset
|
182 mode = ((mode == DESCENDING) ? UNSORTED : ASCENDING); |
4736bc8e9804
Allow descending ranges of all integer types (bug #61132).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30405
diff
changeset
|
183 else if (m_numel > 1 && (m_reverse ? m_increment > T (0) |
4736bc8e9804
Allow descending ranges of all integer types (bug #61132).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30405
diff
changeset
|
184 : m_increment < T (0))) |
4736bc8e9804
Allow descending ranges of all integer types (bug #61132).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30405
diff
changeset
|
185 mode = ((mode == ASCENDING) ? UNSORTED : DESCENDING); |
28635
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
186 else |
30416
4736bc8e9804
Allow descending ranges of all integer types (bug #61132).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30405
diff
changeset
|
187 mode = ((mode == UNSORTED) ? ASCENDING : mode); |
28635
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 return mode; |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
190 } |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
191 |
29226
3ef055ca1d5e
Export template class definition instead of template class instantiations (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
192 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
|
193 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
194 // 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
|
195 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
196 T checkelem (octave_idx_type i) const |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
197 { |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
198 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
|
199 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
|
200 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
201 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
|
202 // Required for proper NaN handling. |
30416
4736bc8e9804
Allow descending ranges of all integer types (bug #61132).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30405
diff
changeset
|
203 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
|
204 else if (i < m_numel - 1) |
30416
4736bc8e9804
Allow descending ranges of all integer types (bug #61132).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30405
diff
changeset
|
205 return (m_reverse ? m_base + T (i) * m_increment |
4736bc8e9804
Allow descending ranges of all integer types (bug #61132).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30405
diff
changeset
|
206 : m_base + T (i) * m_increment); |
28635
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
207 else |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
208 return final_value (); |
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 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
211 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
|
212 { |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
213 // Ranges are *always* row vectors. |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
214 if (i != 0) |
28857
43ad651cf5a0
eliminate unnecessary uses of octave:: namespace qualifier
John W. Eaton <jwe@octave.org>
parents:
28646
diff
changeset
|
215 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
|
216 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
217 return checkelem (j); |
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 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
220 T elem (octave_idx_type i) const |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
221 { |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
222 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
|
223 // Required for proper NaN handling. |
30416
4736bc8e9804
Allow descending ranges of all integer types (bug #61132).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30405
diff
changeset
|
224 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
|
225 else if (i < m_numel - 1) |
30416
4736bc8e9804
Allow descending ranges of all integer types (bug #61132).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30405
diff
changeset
|
226 return (m_reverse ? m_base - T (i) * m_increment |
4736bc8e9804
Allow descending ranges of all integer types (bug #61132).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30405
diff
changeset
|
227 : m_base + T (i) * m_increment); |
28635
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
228 else |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
229 return final_value (); |
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 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
232 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
|
233 { |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
234 return elem (j); |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
235 } |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
236 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
237 T operator () (octave_idx_type i) const |
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 elem (i); |
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 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
|
243 { |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
244 return elem (i, j); |
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 |
30188
e424d966dca7
replace rangeidx helper classes with lambda expressions
John W. Eaton <jwe@octave.org>
parents:
29954
diff
changeset
|
247 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
|
248 { |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
249 Array<T> retval; |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
250 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
251 octave_idx_type n = m_numel; |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
252 |
30188
e424d966dca7
replace rangeidx helper classes with lambda expressions
John W. Eaton <jwe@octave.org>
parents:
29954
diff
changeset
|
253 if (idx.is_colon ()) |
28635
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 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
|
256 } |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
257 else |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
258 { |
30188
e424d966dca7
replace rangeidx helper classes with lambda expressions
John W. Eaton <jwe@octave.org>
parents:
29954
diff
changeset
|
259 if (idx.extent (n) != n) |
e424d966dca7
replace rangeidx helper classes with lambda expressions
John W. Eaton <jwe@octave.org>
parents:
29954
diff
changeset
|
260 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
|
261 |
30188
e424d966dca7
replace rangeidx helper classes with lambda expressions
John W. Eaton <jwe@octave.org>
parents:
29954
diff
changeset
|
262 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
|
263 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
|
264 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
265 // taken from Array.cc. |
30188
e424d966dca7
replace rangeidx helper classes with lambda expressions
John W. Eaton <jwe@octave.org>
parents:
29954
diff
changeset
|
266 if (n != 1 && idx_dims.isvector ()) |
e424d966dca7
replace rangeidx helper classes with lambda expressions
John W. Eaton <jwe@octave.org>
parents:
29954
diff
changeset
|
267 idx_dims = dim_vector (1, idx_len); |
28635
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
268 |
30188
e424d966dca7
replace rangeidx helper classes with lambda expressions
John W. Eaton <jwe@octave.org>
parents:
29954
diff
changeset
|
269 retval.clear (idx_dims); |
28635
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
270 |
30189
41eecdf76372
* Range.h, Range.cc: Fix comments missed in previous change.
John W. Eaton <jwe@octave.org>
parents:
30188
diff
changeset
|
271 // Loop over all values in IDX, executing the lambda |
41eecdf76372
* Range.h, Range.cc: Fix comments missed in previous change.
John W. Eaton <jwe@octave.org>
parents:
30188
diff
changeset
|
272 // expression for each index value. |
30188
e424d966dca7
replace rangeidx helper classes with lambda expressions
John W. Eaton <jwe@octave.org>
parents:
29954
diff
changeset
|
273 |
e424d966dca7
replace rangeidx helper classes with lambda expressions
John W. Eaton <jwe@octave.org>
parents:
29954
diff
changeset
|
274 T *array = retval.fortran_vec (); |
e424d966dca7
replace rangeidx helper classes with lambda expressions
John W. Eaton <jwe@octave.org>
parents:
29954
diff
changeset
|
275 |
30394
f3f3e3793fb5
maint: style check C++ files in liboctave/ ahead of 7.1 release.
Rik <rik@octave.org>
parents:
30392
diff
changeset
|
276 idx.loop (n, [=, &array] (octave_idx_type i) |
f3f3e3793fb5
maint: style check C++ files in liboctave/ ahead of 7.1 release.
Rik <rik@octave.org>
parents:
30392
diff
changeset
|
277 { |
30188
e424d966dca7
replace rangeidx helper classes with lambda expressions
John W. Eaton <jwe@octave.org>
parents:
29954
diff
changeset
|
278 if (i == 0) |
e424d966dca7
replace rangeidx helper classes with lambda expressions
John W. Eaton <jwe@octave.org>
parents:
29954
diff
changeset
|
279 // Required for proper NaN handling. |
30416
4736bc8e9804
Allow descending ranges of all integer types (bug #61132).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30405
diff
changeset
|
280 *array++ = (m_numel == 0 ? m_final : m_base); |
30188
e424d966dca7
replace rangeidx helper classes with lambda expressions
John W. Eaton <jwe@octave.org>
parents:
29954
diff
changeset
|
281 else if (i < m_numel - 1) |
30416
4736bc8e9804
Allow descending ranges of all integer types (bug #61132).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30405
diff
changeset
|
282 *array++ = (m_reverse ? m_base - T (i) * m_increment |
4736bc8e9804
Allow descending ranges of all integer types (bug #61132).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30405
diff
changeset
|
283 : m_base + T (i) * m_increment); |
30188
e424d966dca7
replace rangeidx helper classes with lambda expressions
John W. Eaton <jwe@octave.org>
parents:
29954
diff
changeset
|
284 else |
e424d966dca7
replace rangeidx helper classes with lambda expressions
John W. Eaton <jwe@octave.org>
parents:
29954
diff
changeset
|
285 *array++ = m_final; |
e424d966dca7
replace rangeidx helper classes with lambda expressions
John W. Eaton <jwe@octave.org>
parents:
29954
diff
changeset
|
286 }); |
28635
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 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
289 return retval; |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
290 } |
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 Array<T> diag (octave_idx_type k) const |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
293 { |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
294 return array_value ().diag (k); |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
295 } |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
296 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
297 Array<T> array_value (void) const |
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 octave_idx_type nel = numel (); |
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 Array<T> retval (dim_vector (1, nel)); |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
302 |
29353
715344f405f0
improve handling of nan, infinite value, and empty ranges (bug #59229)
John W. Eaton <jwe@octave.org>
parents:
29352
diff
changeset
|
303 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
|
304 // 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
|
305 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
|
306 else if (nel > 1) |
28635
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 // 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
|
309 // 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
|
310 retval(0) = m_base; |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
311 |
30416
4736bc8e9804
Allow descending ranges of all integer types (bug #61132).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30405
diff
changeset
|
312 if (m_reverse) |
4736bc8e9804
Allow descending ranges of all integer types (bug #61132).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30405
diff
changeset
|
313 for (octave_idx_type i = 1; i < nel - 1; i++) |
4736bc8e9804
Allow descending ranges of all integer types (bug #61132).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30405
diff
changeset
|
314 retval.xelem (i) = m_base - i * m_increment; |
4736bc8e9804
Allow descending ranges of all integer types (bug #61132).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30405
diff
changeset
|
315 else |
4736bc8e9804
Allow descending ranges of all integer types (bug #61132).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30405
diff
changeset
|
316 for (octave_idx_type i = 1; i < nel - 1; i++) |
4736bc8e9804
Allow descending ranges of all integer types (bug #61132).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30405
diff
changeset
|
317 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
|
318 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
319 retval.xelem (nel - 1) = final_value (); |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
320 } |
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 return retval; |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
323 } |
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 private: |
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 T m_base; |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
328 T m_increment; |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
329 T m_limit; |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
330 T m_final; |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
331 octave_idx_type m_numel; |
30416
4736bc8e9804
Allow descending ranges of all integer types (bug #61132).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30405
diff
changeset
|
332 bool m_reverse; |
28635
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 // 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
|
335 // 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
|
336 // operator. |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
337 |
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
|
338 // 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
|
339 // 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
|
340 |
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 void init (void) |
28635
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
342 { |
30416
4736bc8e9804
Allow descending ranges of all integer types (bug #61132).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30405
diff
changeset
|
343 if (m_reverse) |
4736bc8e9804
Allow descending ranges of all integer types (bug #61132).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30405
diff
changeset
|
344 { |
4736bc8e9804
Allow descending ranges of all integer types (bug #61132).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30405
diff
changeset
|
345 m_numel = ((m_increment == T (0) |
4736bc8e9804
Allow descending ranges of all integer types (bug #61132).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30405
diff
changeset
|
346 || (m_limit > m_base && m_increment > T (0)) |
4736bc8e9804
Allow descending ranges of all integer types (bug #61132).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30405
diff
changeset
|
347 || (m_limit < m_base && m_increment < T (0))) |
4736bc8e9804
Allow descending ranges of all integer types (bug #61132).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30405
diff
changeset
|
348 ? T (0) |
4736bc8e9804
Allow descending ranges of all integer types (bug #61132).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30405
diff
changeset
|
349 : (m_base - m_limit - m_increment) / m_increment); |
28635
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
350 |
30416
4736bc8e9804
Allow descending ranges of all integer types (bug #61132).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30405
diff
changeset
|
351 m_final = m_base - (m_numel - 1) * m_increment; |
4736bc8e9804
Allow descending ranges of all integer types (bug #61132).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30405
diff
changeset
|
352 } |
4736bc8e9804
Allow descending ranges of all integer types (bug #61132).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30405
diff
changeset
|
353 else |
4736bc8e9804
Allow descending ranges of all integer types (bug #61132).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30405
diff
changeset
|
354 { |
4736bc8e9804
Allow descending ranges of all integer types (bug #61132).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30405
diff
changeset
|
355 m_numel = ((m_increment == T (0) |
4736bc8e9804
Allow descending ranges of all integer types (bug #61132).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30405
diff
changeset
|
356 || (m_limit > m_base && m_increment < T (0)) |
4736bc8e9804
Allow descending ranges of all integer types (bug #61132).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30405
diff
changeset
|
357 || (m_limit < m_base && m_increment > T (0))) |
4736bc8e9804
Allow descending ranges of all integer types (bug #61132).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30405
diff
changeset
|
358 ? T (0) |
4736bc8e9804
Allow descending ranges of all integer types (bug #61132).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30405
diff
changeset
|
359 : (m_limit - m_base + m_increment) / m_increment); |
4736bc8e9804
Allow descending ranges of all integer types (bug #61132).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30405
diff
changeset
|
360 |
4736bc8e9804
Allow descending ranges of all integer types (bug #61132).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30405
diff
changeset
|
361 m_final = m_base + (m_numel - 1) * m_increment; |
4736bc8e9804
Allow descending ranges of all integer types (bug #61132).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30405
diff
changeset
|
362 } |
28635
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
363 } |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
364 }; |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
365 |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
366 // Specializations defined externally. |
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
367 |
29226
3ef055ca1d5e
Export template class definition instead of template class instantiations (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
368 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
|
369 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
|
370 |
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
|
371 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
|
372 template <> OCTAVE_API void range<float>::init (void); |
30835
2989202f92f8
only allow range<FLOAT> to be instantiated
John W. Eaton <jwe@octave.org>
parents:
30564
diff
changeset
|
373 |
2989202f92f8
only allow range<FLOAT> to be instantiated
John W. Eaton <jwe@octave.org>
parents:
30564
diff
changeset
|
374 // For now, only define for floating point types. However, we only |
2989202f92f8
only allow range<FLOAT> to be instantiated
John W. Eaton <jwe@octave.org>
parents:
30564
diff
changeset
|
375 // need range<float> as a temporary local variable in make_float_range |
2989202f92f8
only allow range<FLOAT> to be instantiated
John W. Eaton <jwe@octave.org>
parents:
30564
diff
changeset
|
376 // in ov.cc. |
2989202f92f8
only allow range<FLOAT> to be instantiated
John W. Eaton <jwe@octave.org>
parents:
30564
diff
changeset
|
377 |
2989202f92f8
only allow range<FLOAT> to be instantiated
John W. Eaton <jwe@octave.org>
parents:
30564
diff
changeset
|
378 #if 0 |
2989202f92f8
only allow range<FLOAT> to be instantiated
John W. Eaton <jwe@octave.org>
parents:
30564
diff
changeset
|
379 |
30405
20cefb3b0da6
range: Use specialization of init function for octave_int<T> types (bug #61300).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30394
diff
changeset
|
380 template <> OCTAVE_API void range<octave_int8>::init (void); |
20cefb3b0da6
range: Use specialization of init function for octave_int<T> types (bug #61300).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30394
diff
changeset
|
381 template <> OCTAVE_API void range<octave_int16>::init (void); |
20cefb3b0da6
range: Use specialization of init function for octave_int<T> types (bug #61300).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30394
diff
changeset
|
382 template <> OCTAVE_API void range<octave_int32>::init (void); |
20cefb3b0da6
range: Use specialization of init function for octave_int<T> types (bug #61300).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30394
diff
changeset
|
383 template <> OCTAVE_API void range<octave_int64>::init (void); |
20cefb3b0da6
range: Use specialization of init function for octave_int<T> types (bug #61300).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30394
diff
changeset
|
384 template <> OCTAVE_API void range<octave_uint8>::init (void); |
20cefb3b0da6
range: Use specialization of init function for octave_int<T> types (bug #61300).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30394
diff
changeset
|
385 template <> OCTAVE_API void range<octave_uint16>::init (void); |
20cefb3b0da6
range: Use specialization of init function for octave_int<T> types (bug #61300).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30394
diff
changeset
|
386 template <> OCTAVE_API void range<octave_uint32>::init (void); |
20cefb3b0da6
range: Use specialization of init function for octave_int<T> types (bug #61300).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30394
diff
changeset
|
387 template <> OCTAVE_API void range<octave_uint64>::init (void); |
28635
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
388 |
30835
2989202f92f8
only allow range<FLOAT> to be instantiated
John W. Eaton <jwe@octave.org>
parents:
30564
diff
changeset
|
389 #endif |
2989202f92f8
only allow range<FLOAT> to be instantiated
John W. Eaton <jwe@octave.org>
parents:
30564
diff
changeset
|
390 |
29353
715344f405f0
improve handling of nan, infinite value, and empty ranges (bug #59229)
John W. Eaton <jwe@octave.org>
parents:
29352
diff
changeset
|
391 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
|
392 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
|
393 |
29226
3ef055ca1d5e
Export template class definition instead of template class instantiations (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
394 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
|
395 template <> OCTAVE_API octave_idx_type range<float>::nnz (void) const; |
31605
e88a07dec498
maint: Use macros to begin/end C++ namespaces.
Rik <rik@octave.org>
parents:
30853
diff
changeset
|
396 |
e88a07dec498
maint: Use macros to begin/end C++ namespaces.
Rik <rik@octave.org>
parents:
30853
diff
changeset
|
397 OCTAVE_END_NAMESPACE(octave) |
28635
b6371946f106
new template for range objects
John W. Eaton <jwe@octave.org>
parents:
28592
diff
changeset
|
398 |
29954
4c88a452519c
rename OCTAVE_USE_DEPRECATED_FUNCTIONS macro and attempt to make it work
John W. Eaton <jwe@octave.org>
parents:
29569
diff
changeset
|
399 #endif |