annotate liboctave/array/Range.h @ 30564:796f54d4ddbf stable

update Octave Project Developers copyright for the new year In files that have the "Octave Project Developers" copyright notice, update for 2021. In all .txi and .texi files except gpl.txi and gpl.texi in the doc/liboctave and doc/interpreter directories, change the copyright to "Octave Project Developers", the same as used for other source files. Update copyright notices for 2022 (not done since 2019). For gpl.txi and gpl.texi, change the copyright notice to be "Free Software Foundation, Inc." and leave the date at 2007 only because this file only contains the text of the GPL, not anything created by the Octave Project Developers. Add Paul Thomas to contributors.in.
author John W. Eaton <jwe@octave.org>
date Tue, 28 Dec 2021 18:22:40 -0500
parents bd67d0045e21
children 2989202f92f8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
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
e02d6b664394 [project @ 1994-03-09 21:08:03 by jwe]
jwe
parents: 238
diff changeset
27 #define octave_Range_h 1
e02d6b664394 [project @ 1994-03-09 21:08:03 by jwe]
jwe
parents: 238
diff changeset
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
1032e24f199f make sort work for ranges
John W. Eaton <jwe@octave.org>
parents: 7017
diff changeset
32
30429
e38202d3628d provide header file for forward declaration of Array<T> template
John W. Eaton <jwe@octave.org>
parents: 30420
diff changeset
33 #include "Array-fwd.h"
4810
72a6d410a14a [project @ 2004-03-03 18:49:39 by jwe]
jwe
parents: 4192
diff changeset
34 #include "dMatrix.h"
28004
403df0b32204 update out_of_range error messages
John W. Eaton <jwe@octave.org>
parents: 27923
diff changeset
35 #include "dim-vector.h"
28635
b6371946f106 new template for range objects
John W. Eaton <jwe@octave.org>
parents: 28592
diff changeset
36 #include "lo-error.h"
7458
1032e24f199f make sort work for ranges
John W. Eaton <jwe@octave.org>
parents: 7017
diff changeset
37 #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
38 #include "range-fwd.h"
3
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
39
28635
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>
30489
bd67d0045e21 use separate files for MArray, intNDArray, and range template forward decls
John W. Eaton <jwe@octave.org>
parents: 30429
diff changeset
43 class range
28635
b6371946f106 new template for range objects
John W. Eaton <jwe@octave.org>
parents: 28592
diff changeset
44 {
b6371946f106 new template for range objects
John W. Eaton <jwe@octave.org>
parents: 28592
diff changeset
45 public:
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 range (void)
30416
4736bc8e9804 Allow descending ranges of all integer types (bug #61132).
Markus Mützel <markus.muetzel@gmx.de>
parents: 30405
diff changeset
48 : 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
49 m_reverse (false)
28635
b6371946f106 new template for range objects
John W. Eaton <jwe@octave.org>
parents: 28592
diff changeset
50 { }
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 // 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
53 // 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
54 // 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
55 // 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
56
30416
4736bc8e9804 Allow descending ranges of all integer types (bug #61132).
Markus Mützel <markus.muetzel@gmx.de>
parents: 30405
diff changeset
57 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
58 bool reverse = false)
28635
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),
30416
4736bc8e9804 Allow descending ranges of all integer types (bug #61132).
Markus Mützel <markus.muetzel@gmx.de>
parents: 30405
diff changeset
60 m_final (), m_numel (), m_reverse (reverse)
28635
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)
30416
4736bc8e9804 Allow descending ranges of all integer types (bug #61132).
Markus Mützel <markus.muetzel@gmx.de>
parents: 30405
diff changeset
66 : 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
67 m_reverse (false)
28635
b6371946f106 new template for range objects
John W. Eaton <jwe@octave.org>
parents: 28592
diff changeset
68 {
b6371946f106 new template for range objects
John W. Eaton <jwe@octave.org>
parents: 28592
diff changeset
69 init ();
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
b6371946f106 new template for range objects
John W. Eaton <jwe@octave.org>
parents: 28592
diff changeset
72 // Allow conversion from (presumably) properly constructed Range
b6371946f106 new template for range objects
John W. Eaton <jwe@octave.org>
parents: 28592
diff changeset
73 // 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
74 // 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
75 // and numel must be consistent.
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 // 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
78 // consistent.
b6371946f106 new template for range objects
John W. Eaton <jwe@octave.org>
parents: 28592
diff changeset
79
b6371946f106 new template for range objects
John W. Eaton <jwe@octave.org>
parents: 28592
diff changeset
80 // 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
81
b6371946f106 new template for range objects
John W. Eaton <jwe@octave.org>
parents: 28592
diff changeset
82 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
83 octave_idx_type numel, bool reverse = false)
28635
b6371946f106 new template for range objects
John W. Eaton <jwe@octave.org>
parents: 28592
diff changeset
84 : 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
85 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
86 { }
b6371946f106 new template for range objects
John W. Eaton <jwe@octave.org>
parents: 28592
diff changeset
87
28639
7ebe185e3818 new octave_value constructors for integer and float ranges.
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
88 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
89 const T& final, octave_idx_type numel, bool reverse = false)
28639
7ebe185e3818 new octave_value constructors for integer and float ranges.
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
90 : 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
91 m_final (final), m_numel (numel), m_reverse (reverse)
28639
7ebe185e3818 new octave_value constructors for integer and float ranges.
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
92 { }
7ebe185e3818 new octave_value constructors for integer and float ranges.
John W. Eaton <jwe@octave.org>
parents: 28638
diff changeset
93
28635
b6371946f106 new template for range objects
John W. Eaton <jwe@octave.org>
parents: 28592
diff changeset
94 // 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
95 // 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
96
30416
4736bc8e9804 Allow descending ranges of all integer types (bug #61132).
Markus Mützel <markus.muetzel@gmx.de>
parents: 30405
diff changeset
97 static range<T> make_constant (const T& base, octave_idx_type numel,
30420
366aa563dd2e style fixes for Range.h and Range.cc
John W. Eaton <jwe@octave.org>
parents: 30416
diff changeset
98 bool reverse = false)
28635
b6371946f106 new template for range objects
John W. Eaton <jwe@octave.org>
parents: 28592
diff changeset
99 {
b6371946f106 new template for range objects
John W. Eaton <jwe@octave.org>
parents: 28592
diff changeset
100 // 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
101 // 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
102 // 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
103 // purpose of this strange constructor form.
b6371946f106 new template for range objects
John W. Eaton <jwe@octave.org>
parents: 28592
diff changeset
104
30416
4736bc8e9804 Allow descending ranges of all integer types (bug #61132).
Markus Mützel <markus.muetzel@gmx.de>
parents: 30405
diff changeset
105 return range<T> (base, T (), base, numel, reverse);
28635
b6371946f106 new template for range objects
John W. Eaton <jwe@octave.org>
parents: 28592
diff changeset
106 }
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 // 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
109 // 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
110
b6371946f106 new template for range objects
John W. Eaton <jwe@octave.org>
parents: 28592
diff changeset
111 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
112 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
113 bool reverse = false)
28635
b6371946f106 new template for range objects
John W. Eaton <jwe@octave.org>
parents: 28592
diff changeset
114 {
b6371946f106 new template for range objects
John W. Eaton <jwe@octave.org>
parents: 28592
diff changeset
115 // 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
116 // 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
117 // 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
118 // purpose of this strange constructor form.
b6371946f106 new template for range objects
John W. Eaton <jwe@octave.org>
parents: 28592
diff changeset
119
30416
4736bc8e9804 Allow descending ranges of all integer types (bug #61132).
Markus Mützel <markus.muetzel@gmx.de>
parents: 30405
diff changeset
120 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
121 : base + (numel - 1) * increment);
28635
b6371946f106 new template for range objects
John W. Eaton <jwe@octave.org>
parents: 28592
diff changeset
122
30416
4736bc8e9804 Allow descending ranges of all integer types (bug #61132).
Markus Mützel <markus.muetzel@gmx.de>
parents: 30405
diff changeset
123 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
124 }
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 (const range<T>&) = 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 range<T>& operator = (const range<T>&) = default;
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;
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 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);
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
373 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
374 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
375 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
376 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
377 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
378 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
379 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
380 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
381
29353
715344f405f0 improve handling of nan, infinite value, and empty ranges (bug #59229)
John W. Eaton <jwe@octave.org>
parents: 29352
diff changeset
382 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
383 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
384
29226
3ef055ca1d5e Export template class definition instead of template class instantiations (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents: 28857
diff changeset
385 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
386 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
387 }
b6371946f106 new template for range objects
John W. Eaton <jwe@octave.org>
parents: 28592
diff changeset
388
1860
821870c30840 [project @ 1996-02-04 10:04:58 by jwe]
jwe
parents: 1528
diff changeset
389 class
821870c30840 [project @ 1996-02-04 10:04:58 by jwe]
jwe
parents: 1528
diff changeset
390 Range
3
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
391 {
17769
49a5a4be04a1 maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents: 17744
diff changeset
392 public:
1860
821870c30840 [project @ 1996-02-04 10:04:58 by jwe]
jwe
parents: 1528
diff changeset
393
29954
4c88a452519c rename OCTAVE_USE_DEPRECATED_FUNCTIONS macro and attempt to make it work
John W. Eaton <jwe@octave.org>
parents: 29569
diff changeset
394 #if defined (OCTAVE_PROVIDE_DEPRECATED_SYMBOLS)
28638
98192ec1621f replace Range with range<double>
John W. Eaton <jwe@octave.org>
parents: 28637
diff changeset
395 OCTAVE_DEPRECATED (7, "use the 'octave::range<double>' class instead")
1528
dc527156c38c [project @ 1995-10-05 01:44:18 by jwe]
jwe
parents: 1315
diff changeset
396 Range (void)
28524
455fe4a6f22c deprecate arithmetic operators for ranges; eliminate use in Octave
John W. Eaton <jwe@octave.org>
parents: 28402
diff changeset
397 : 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
398 { }
1528
dc527156c38c [project @ 1995-10-05 01:44:18 by jwe]
jwe
parents: 1315
diff changeset
399
28635
b6371946f106 new template for range objects
John W. Eaton <jwe@octave.org>
parents: 28592
diff changeset
400 // 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
401 // 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
402 // 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
403 // reset limit to the computed final value.
b6371946f106 new template for range objects
John W. Eaton <jwe@octave.org>
parents: 28592
diff changeset
404
28638
98192ec1621f replace Range with range<double>
John W. Eaton <jwe@octave.org>
parents: 28637
diff changeset
405 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
406 Range (const octave::range<double>& r)
b6371946f106 new template for range objects
John W. Eaton <jwe@octave.org>
parents: 28592
diff changeset
407 : 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
408 m_numel (r.numel ())
b6371946f106 new template for range objects
John W. Eaton <jwe@octave.org>
parents: 28592
diff changeset
409 { }
29954
4c88a452519c rename OCTAVE_USE_DEPRECATED_FUNCTIONS macro and attempt to make it work
John W. Eaton <jwe@octave.org>
parents: 29569
diff changeset
410 #endif
1528
dc527156c38c [project @ 1995-10-05 01:44:18 by jwe]
jwe
parents: 1315
diff changeset
411
27023
fc256e9d882e use default ctors, dtors, and assignment ops in Matrix, intNDArray, and Cell
John W. Eaton <jwe@octave.org>
parents: 26377
diff changeset
412 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
413
fc256e9d882e use default ctors, dtors, and assignment ops in Matrix, intNDArray, and Cell
John W. Eaton <jwe@octave.org>
parents: 26377
diff changeset
414 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
415
fc256e9d882e use default ctors, dtors, and assignment ops in Matrix, intNDArray, and Cell
John W. Eaton <jwe@octave.org>
parents: 26377
diff changeset
416 ~Range (void) = default;
3
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
417
29954
4c88a452519c rename OCTAVE_USE_DEPRECATED_FUNCTIONS macro and attempt to make it work
John W. Eaton <jwe@octave.org>
parents: 29569
diff changeset
418 #if defined (OCTAVE_PROVIDE_DEPRECATED_SYMBOLS)
28638
98192ec1621f replace Range with range<double>
John W. Eaton <jwe@octave.org>
parents: 28637
diff changeset
419 OCTAVE_DEPRECATED (7, "use the 'octave::range<double>' class instead")
1528
dc527156c38c [project @ 1995-10-05 01:44:18 by jwe]
jwe
parents: 1315
diff changeset
420 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
421 : m_base (b), m_limit (l), m_inc (1), m_numel (numel_internal ())
20513
96153b16febe Overhaul Range object in liboctave.
Rik <rik@octave.org>
parents: 20228
diff changeset
422 {
28592
e70c859c4bff allow infinite limits on for loop ranges (bug #45143)
John W. Eaton <jwe@octave.org>
parents: 28524
diff changeset
423 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
424 m_limit = limit_internal ();
20513
96153b16febe Overhaul Range object in liboctave.
Rik <rik@octave.org>
parents: 20228
diff changeset
425 }
1528
dc527156c38c [project @ 1995-10-05 01:44:18 by jwe]
jwe
parents: 1315
diff changeset
426
28638
98192ec1621f replace Range with range<double>
John W. Eaton <jwe@octave.org>
parents: 28637
diff changeset
427 OCTAVE_DEPRECATED (7, "use the 'octave::range<double>' class instead")
1528
dc527156c38c [project @ 1995-10-05 01:44:18 by jwe]
jwe
parents: 1315
diff changeset
428 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
429 : m_base (b), m_limit (l), m_inc (i), m_numel (numel_internal ())
20513
96153b16febe Overhaul Range object in liboctave.
Rik <rik@octave.org>
parents: 20228
diff changeset
430 {
28592
e70c859c4bff allow infinite limits on for loop ranges (bug #45143)
John W. Eaton <jwe@octave.org>
parents: 28524
diff changeset
431 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
432 m_limit = limit_internal ();
20513
96153b16febe Overhaul Range object in liboctave.
Rik <rik@octave.org>
parents: 20228
diff changeset
433 }
1528
dc527156c38c [project @ 1995-10-05 01:44:18 by jwe]
jwe
parents: 1315
diff changeset
434
28524
455fe4a6f22c deprecate arithmetic operators for ranges; eliminate use in Octave
John W. Eaton <jwe@octave.org>
parents: 28402
diff changeset
435 // 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
436 // 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
437
28635
b6371946f106 new template for range objects
John W. Eaton <jwe@octave.org>
parents: 28592
diff changeset
438 // 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
439 // 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
440
28638
98192ec1621f replace Range with range<double>
John W. Eaton <jwe@octave.org>
parents: 28637
diff changeset
441 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
442 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
443 : 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
444 {
28592
e70c859c4bff allow infinite limits on for loop ranges (bug #45143)
John W. Eaton <jwe@octave.org>
parents: 28524
diff changeset
445 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
446 m_limit = limit_internal ();
17769
49a5a4be04a1 maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents: 17744
diff changeset
447 }
29954
4c88a452519c rename OCTAVE_USE_DEPRECATED_FUNCTIONS macro and attempt to make it work
John W. Eaton <jwe@octave.org>
parents: 29569
diff changeset
448 #endif
8589
0131fa223dbc make length invariant in range-scalar ops
Jaroslav Hajek <highegg@gmail.com>
parents: 8553
diff changeset
449
28592
e70c859c4bff allow infinite limits on for loop ranges (bug #45143)
John W. Eaton <jwe@octave.org>
parents: 28524
diff changeset
450 // 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
451 bool ok (void) const
e70c859c4bff allow infinite limits on for loop ranges (bug #45143)
John W. Eaton <jwe@octave.org>
parents: 28524
diff changeset
452 {
e70c859c4bff allow infinite limits on for loop ranges (bug #45143)
John W. Eaton <jwe@octave.org>
parents: 28524
diff changeset
453 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
454 && (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
455 }
8589
0131fa223dbc make length invariant in range-scalar ops
Jaroslav Hajek <highegg@gmail.com>
parents: 8553
diff changeset
456
28402
09a3c0e91e6e style update for Range class
John W. Eaton <jwe@octave.org>
parents: 28004
diff changeset
457 double base (void) const { return m_base; }
09a3c0e91e6e style update for Range class
John W. Eaton <jwe@octave.org>
parents: 28004
diff changeset
458 double limit (void) const { return m_limit; }
09a3c0e91e6e style update for Range class
John W. Eaton <jwe@octave.org>
parents: 28004
diff changeset
459 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
460 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
461
28637
fb37f50d5ba8 new Range::final_value function
John W. Eaton <jwe@octave.org>
parents: 28636
diff changeset
462 // 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
463 // 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
464 // 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
465 // 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
466 // 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
467 // 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
468 // be fixed with the new template range class.
fb37f50d5ba8 new Range::final_value function
John W. Eaton <jwe@octave.org>
parents: 28636
diff changeset
469 double final_value (void) const { return m_limit; }
25812
fc74c8d2a584 Clean up liboctave Range implementation.
Rik <rik@octave.org>
parents: 25054
diff changeset
470
28402
09a3c0e91e6e style update for Range class
John W. Eaton <jwe@octave.org>
parents: 28004
diff changeset
471 octave_idx_type numel (void) const { return m_numel; }
25812
fc74c8d2a584 Clean up liboctave Range implementation.
Rik <rik@octave.org>
parents: 25054
diff changeset
472
28402
09a3c0e91e6e style update for Range class
John W. Eaton <jwe@octave.org>
parents: 28004
diff changeset
473 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
474
24780
0d21e2a1cdfc new element access operators for Range objects
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
475 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
476
0d21e2a1cdfc new element access operators for Range objects
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
477 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
478 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
479
23577
80c42f4cca13 maint: Deprecate is_empty and replace with isempty.
Rik <rik@octave.org>
parents: 23564
diff changeset
480 bool isempty (void) const { return numel () == 0; }
80c42f4cca13 maint: Deprecate is_empty and replace with isempty.
Rik <rik@octave.org>
parents: 23564
diff changeset
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 bool all_elements_are_ints (void) const;
2383
096529066838 [project @ 1996-10-12 17:50:47 by jwe]
jwe
parents: 1993
diff changeset
483
29226
3ef055ca1d5e Export template class definition instead of template class instantiations (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents: 28857
diff changeset
484 OCTAVE_API Matrix matrix_value (void) const;
645
21cb3c7dc9e3 [project @ 1994-08-24 06:19:54 by jwe]
jwe
parents: 461
diff changeset
485
29226
3ef055ca1d5e Export template class definition instead of template class instantiations (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents: 28857
diff changeset
486 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
487 OCTAVE_API double max (void) const;
3
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
488
29226
3ef055ca1d5e Export template class definition instead of template class instantiations (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents: 28857
diff changeset
489 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
490 OCTAVE_API void sort_internal (Array<octave_idx_type>& sidx, bool ascending = true);
7458
1032e24f199f make sort work for ranges
John W. Eaton <jwe@octave.org>
parents: 7017
diff changeset
491
29226
3ef055ca1d5e Export template class definition instead of template class instantiations (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents: 28857
diff changeset
492 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
493
29226
3ef055ca1d5e Export template class definition instead of template class instantiations (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents: 28857
diff changeset
494 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
495 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
496 sortmode mode = ASCENDING) const;
208
380cb9ccc889 [project @ 1993-11-12 10:35:05 by jwe]
jwe
parents: 3
diff changeset
497
29226
3ef055ca1d5e Export template class definition instead of template class instantiations (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents: 28857
diff changeset
498 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
499
29226
3ef055ca1d5e Export template class definition instead of template class instantiations (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents: 28857
diff changeset
500 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
501
9986
672e1b49e01e optimize indexing of ranges by single subscripts
Jaroslav Hajek <highegg@gmail.com>
parents: 8971
diff changeset
502 // 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
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 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
505 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
506
29226
3ef055ca1d5e Export template class definition instead of template class instantiations (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents: 28857
diff changeset
507 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
508 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
509 { return elem (j); }
9986
672e1b49e01e optimize indexing of ranges by single subscripts
Jaroslav Hajek <highegg@gmail.com>
parents: 8971
diff changeset
510
23487
af2f1f3dbe06 eliminate --enable-bounds-check configure option
John W. Eaton <jwe@octave.org>
parents: 23220
diff changeset
511 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
512 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
513 { return elem (i, j); }
23487
af2f1f3dbe06 eliminate --enable-bounds-check configure option
John W. Eaton <jwe@octave.org>
parents: 23220
diff changeset
514
29569
29a1f8fd8ee6 move idx_vector classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 29359
diff changeset
515 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
516
29226
3ef055ca1d5e Export template class definition instead of template class instantiations (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents: 28857
diff changeset
517 OCTAVE_API void set_base (double b);
4811
198f3712c692 [project @ 2004-03-03 19:24:33 by jwe]
jwe
parents: 4810
diff changeset
518
29226
3ef055ca1d5e Export template class definition instead of template class instantiations (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents: 28857
diff changeset
519 OCTAVE_API void set_limit (double l);
4811
198f3712c692 [project @ 2004-03-03 19:24:33 by jwe]
jwe
parents: 4810
diff changeset
520
29226
3ef055ca1d5e Export template class definition instead of template class instantiations (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents: 28857
diff changeset
521 OCTAVE_API void set_inc (double i);
1528
dc527156c38c [project @ 1995-10-05 01:44:18 by jwe]
jwe
parents: 1315
diff changeset
522
17769
49a5a4be04a1 maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents: 17744
diff changeset
523 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
524 const Range& r);
6108
143b556ce725 [project @ 2006-10-27 01:45:54 by jwe]
jwe
parents: 5347
diff changeset
525 friend OCTAVE_API std::istream& operator >> (std::istream& is, Range& r);
3
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
526
8971
967a692ddfe2 fix range arithmetics
Jaroslav Hajek <highegg@gmail.com>
parents: 8950
diff changeset
527 friend OCTAVE_API Range operator - (const Range& r);
967a692ddfe2 fix range arithmetics
Jaroslav Hajek <highegg@gmail.com>
parents: 8950
diff changeset
528 friend OCTAVE_API Range operator + (double x, const Range& r);
967a692ddfe2 fix range arithmetics
Jaroslav Hajek <highegg@gmail.com>
parents: 8950
diff changeset
529 friend OCTAVE_API Range operator + (const Range& r, double x);
967a692ddfe2 fix range arithmetics
Jaroslav Hajek <highegg@gmail.com>
parents: 8950
diff changeset
530 friend OCTAVE_API Range operator - (double x, const Range& r);
967a692ddfe2 fix range arithmetics
Jaroslav Hajek <highegg@gmail.com>
parents: 8950
diff changeset
531 friend OCTAVE_API Range operator - (const Range& r, double x);
967a692ddfe2 fix range arithmetics
Jaroslav Hajek <highegg@gmail.com>
parents: 8950
diff changeset
532 friend OCTAVE_API Range operator * (double x, const Range& r);
967a692ddfe2 fix range arithmetics
Jaroslav Hajek <highegg@gmail.com>
parents: 8950
diff changeset
533 friend OCTAVE_API Range operator * (const Range& r, double x);
967a692ddfe2 fix range arithmetics
Jaroslav Hajek <highegg@gmail.com>
parents: 8950
diff changeset
534
17769
49a5a4be04a1 maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents: 17744
diff changeset
535 private:
1860
821870c30840 [project @ 1996-02-04 10:04:58 by jwe]
jwe
parents: 1528
diff changeset
536
28402
09a3c0e91e6e style update for Range class
John W. Eaton <jwe@octave.org>
parents: 28004
diff changeset
537 double m_base;
09a3c0e91e6e style update for Range class
John W. Eaton <jwe@octave.org>
parents: 28004
diff changeset
538 double m_limit;
09a3c0e91e6e style update for Range class
John W. Eaton <jwe@octave.org>
parents: 28004
diff changeset
539 double m_inc;
1860
821870c30840 [project @ 1996-02-04 10:04:58 by jwe]
jwe
parents: 1528
diff changeset
540
28402
09a3c0e91e6e style update for Range class
John W. Eaton <jwe@octave.org>
parents: 28004
diff changeset
541 octave_idx_type m_numel;
4811
198f3712c692 [project @ 2004-03-03 19:24:33 by jwe]
jwe
parents: 4810
diff changeset
542
29226
3ef055ca1d5e Export template class definition instead of template class instantiations (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents: 28857
diff changeset
543 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
544
29226
3ef055ca1d5e Export template class definition instead of template class instantiations (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents: 28857
diff changeset
545 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
546
29226
3ef055ca1d5e Export template class definition instead of template class instantiations (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents: 28857
diff changeset
547 OCTAVE_API void init (void);
8971
967a692ddfe2 fix range arithmetics
Jaroslav Hajek <highegg@gmail.com>
parents: 8950
diff changeset
548
18852
47d4b680d0e0 improve accuracy of range/scalar arithmetic (bug #42589)
John W. Eaton <jwe@octave.org>
parents: 17769
diff changeset
549 protected:
47d4b680d0e0 improve accuracy of range/scalar arithmetic (bug #42589)
John W. Eaton <jwe@octave.org>
parents: 17769
diff changeset
550
28524
455fe4a6f22c deprecate arithmetic operators for ranges; eliminate use in Octave
John W. Eaton <jwe@octave.org>
parents: 28402
diff changeset
551 // 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
552 // operators are removed.
18852
47d4b680d0e0 improve accuracy of range/scalar arithmetic (bug #42589)
John W. Eaton <jwe@octave.org>
parents: 17769
diff changeset
553
47d4b680d0e0 improve accuracy of range/scalar arithmetic (bug #42589)
John W. Eaton <jwe@octave.org>
parents: 17769
diff changeset
554 // 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
555 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
556 : 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
557 { }
3
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
558 };
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
559
29954
4c88a452519c rename OCTAVE_USE_DEPRECATED_FUNCTIONS macro and attempt to make it work
John W. Eaton <jwe@octave.org>
parents: 29569
diff changeset
560 #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
561 OCTAVE_DEPRECATED (7, "arithmetic operations on Range objects are unreliable")
6108
143b556ce725 [project @ 2006-10-27 01:45:54 by jwe]
jwe
parents: 5347
diff changeset
562 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
563
455fe4a6f22c deprecate arithmetic operators for ranges; eliminate use in Octave
John W. Eaton <jwe@octave.org>
parents: 28402
diff changeset
564 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
565 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
566
455fe4a6f22c deprecate arithmetic operators for ranges; eliminate use in Octave
John W. Eaton <jwe@octave.org>
parents: 28402
diff changeset
567 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
568 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
569
455fe4a6f22c deprecate arithmetic operators for ranges; eliminate use in Octave
John W. Eaton <jwe@octave.org>
parents: 28402
diff changeset
570 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
571 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
572
455fe4a6f22c deprecate arithmetic operators for ranges; eliminate use in Octave
John W. Eaton <jwe@octave.org>
parents: 28402
diff changeset
573 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
574 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
575
455fe4a6f22c deprecate arithmetic operators for ranges; eliminate use in Octave
John W. Eaton <jwe@octave.org>
parents: 28402
diff changeset
576 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
577 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
578
455fe4a6f22c deprecate arithmetic operators for ranges; eliminate use in Octave
John W. Eaton <jwe@octave.org>
parents: 28402
diff changeset
579 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
580 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
581 #endif
8553
c7ff200e45f5 optimize range-scalar ops
Jaroslav Hajek <highegg@gmail.com>
parents: 7620
diff changeset
582
3
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
583 #endif