Mercurial > hg > octave-lyh
annotate src/ov-class.h @ 13294:7dce7e110511
make concatenation of class objects work
* data.h: New file.
* src/Makefile.am (octinclude_HEADERS): Add it to the list.
* data.cc (attempt_type_conversion): New static function.
(do_class_concat): New function.
(do_cat): Use it if any elements of the list are objects.
Check whether any elements of the list are objects or cells.
Check whether all elements of the list are complex.
Check whether the first element of the list is a struct.
Maybe convert elements of the list to cells.
New tests for horzcat and vertcat.
* data.h (do_class_concat): Provide decl.
* ov-class.h (octave_class::octave_class): Allow optional parent
list.
* ov.h, ov.h (octave_value::octave_value (const Octave_map&,
const std::string&)): Likewise.
* pt-mat.cc (do_class_concat): New static function.
(tree_matrix::rvalue1): Use it to concatenate objects.
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Fri, 07 Oct 2011 22:16:07 -0400 |
parents | 2a8dcb5b3a00 |
children | 441af0aa125a |
rev | line source |
---|---|
7338 | 1 /* |
2 | |
11523 | 3 Copyright (C) 2007-2011 John W. Eaton |
10521
4d1fc073fbb7
add some missing copyright stmts
Jaroslav Hajek <highegg@gmail.com>
parents:
10313
diff
changeset
|
4 Copyright (C) 2009 VZLU Prague |
7338 | 5 |
6 This file is part of Octave. | |
7 | |
8 Octave is free software; you can redistribute it and/or modify it | |
9 under the terms of the GNU General Public License as published by the | |
7444 | 10 Free Software Foundation; either version 3 of the License, or (at your |
11 option) any later version. | |
7338 | 12 |
13 Octave is distributed in the hope that it will be useful, but WITHOUT | |
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
16 for more details. | |
17 | |
18 You should have received a copy of the GNU General Public License | |
7444 | 19 along with Octave; see the file COPYING. If not, see |
20 <http://www.gnu.org/licenses/>. | |
7338 | 21 |
22 */ | |
23 | |
24 #if !defined (octave_class_h) | |
25 #define octave_class_h 1 | |
26 | |
27 #include <cstdlib> | |
28 | |
8950
d865363208d6
include <iosfwd> instead of <iostream> in header files
John W. Eaton <jwe@octave.org>
parents:
8920
diff
changeset
|
29 #include <iosfwd> |
7338 | 30 #include <string> |
31 | |
32 #include "mx-base.h" | |
33 #include "str-vec.h" | |
34 | |
35 #include "error.h" | |
36 #include "oct-alloc.h" | |
37 #include "oct-map.h" | |
38 #include "ov-base.h" | |
39 #include "ov-typeinfo.h" | |
40 | |
41 class octave_value_list; | |
42 | |
43 class tree_walker; | |
44 | |
45 // Data structures. | |
46 | |
47 class | |
9529
8e5009334661
partially revert e79470be3ecb
Jaroslav Hajek <highegg@gmail.com>
parents:
9522
diff
changeset
|
48 octave_class : public octave_base_value |
7338 | 49 { |
50 public: | |
51 | |
52 octave_class (void) | |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11584
diff
changeset
|
53 : octave_base_value (), map (), c_name (), |
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11584
diff
changeset
|
54 parent_list (), obsolete_copies (0) |
11584
cda4aa780d58
Another round of initialising members in the constructor initialisation list
Pascal Dupuis <Pascal.Dupuis@uclouvain.be>
parents:
11523
diff
changeset
|
55 { } |
7338 | 56 |
13294
7dce7e110511
make concatenation of class objects work
John W. Eaton <jwe@octave.org>
parents:
13241
diff
changeset
|
57 octave_class (const octave_map& m, const std::string& id, |
7dce7e110511
make concatenation of class objects work
John W. Eaton <jwe@octave.org>
parents:
13241
diff
changeset
|
58 const std::list<std::string>& plist |
7dce7e110511
make concatenation of class objects work
John W. Eaton <jwe@octave.org>
parents:
13241
diff
changeset
|
59 = std::list<std::string> ()) |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11584
diff
changeset
|
60 : octave_base_value (), map (m), c_name (id), |
13294
7dce7e110511
make concatenation of class objects work
John W. Eaton <jwe@octave.org>
parents:
13241
diff
changeset
|
61 parent_list (plist), obsolete_copies (0) |
11584
cda4aa780d58
Another round of initialising members in the constructor initialisation list
Pascal Dupuis <Pascal.Dupuis@uclouvain.be>
parents:
11523
diff
changeset
|
62 { } |
7338 | 63 |
64 octave_class (const octave_class& s) | |
9529
8e5009334661
partially revert e79470be3ecb
Jaroslav Hajek <highegg@gmail.com>
parents:
9522
diff
changeset
|
65 : octave_base_value (s), map (s.map), c_name (s.c_name), |
8e5009334661
partially revert e79470be3ecb
Jaroslav Hajek <highegg@gmail.com>
parents:
9522
diff
changeset
|
66 parent_list (s.parent_list), obsolete_copies (0) { } |
9010
f914834836e7
Partial implementation of derived classes using the old form with "@" files.
rtshort@smoketree.phaselocked.com
parents:
8950
diff
changeset
|
67 |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11584
diff
changeset
|
68 octave_class (const octave_map& m, const std::string& id, |
9010
f914834836e7
Partial implementation of derived classes using the old form with "@" files.
rtshort@smoketree.phaselocked.com
parents:
8950
diff
changeset
|
69 const octave_value_list& parents); |
7338 | 70 |
71 ~octave_class (void) { } | |
72 | |
73 octave_base_value *clone (void) const { return new octave_class (*this); } | |
8785
70f5a0375afd
oct-map.h: fix think-o in previous change
John W. Eaton <jwe@octave.org>
parents:
8212
diff
changeset
|
74 |
9522
e79470be3ecb
implement subsasgn this-arg optimization
Jaroslav Hajek <highegg@gmail.com>
parents:
9521
diff
changeset
|
75 octave_base_value *unique_clone (void); |
e79470be3ecb
implement subsasgn this-arg optimization
Jaroslav Hajek <highegg@gmail.com>
parents:
9521
diff
changeset
|
76 |
8785
70f5a0375afd
oct-map.h: fix think-o in previous change
John W. Eaton <jwe@octave.org>
parents:
8212
diff
changeset
|
77 octave_base_value *empty_clone (void) const |
70f5a0375afd
oct-map.h: fix think-o in previous change
John W. Eaton <jwe@octave.org>
parents:
8212
diff
changeset
|
78 { |
10768
8a868004a437
use octave_map for octave_class
Jaroslav Hajek <highegg@gmail.com>
parents:
10742
diff
changeset
|
79 return new octave_class (octave_map (map.keys ()), class_name ()); |
8785
70f5a0375afd
oct-map.h: fix think-o in previous change
John W. Eaton <jwe@octave.org>
parents:
8212
diff
changeset
|
80 } |
7338 | 81 |
82 Cell dotref (const octave_value_list& idx); | |
83 | |
9329
67fc970dad7d
improve indexed assignment using indexed numel
Jaroslav Hajek <highegg@gmail.com>
parents:
9240
diff
changeset
|
84 Matrix size (void); |
67fc970dad7d
improve indexed assignment using indexed numel
Jaroslav Hajek <highegg@gmail.com>
parents:
9240
diff
changeset
|
85 |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11584
diff
changeset
|
86 octave_idx_type numel (const octave_value_list&); |
9329
67fc970dad7d
improve indexed assignment using indexed numel
Jaroslav Hajek <highegg@gmail.com>
parents:
9240
diff
changeset
|
87 |
7651
443a8f5a50fd
require both subsref variants to be defined in octave_value subclasses
John W. Eaton <jwe@octave.org>
parents:
7444
diff
changeset
|
88 octave_value subsref (const std::string& type, |
10313 | 89 const std::list<octave_value_list>& idx) |
7338 | 90 { |
7651
443a8f5a50fd
require both subsref variants to be defined in octave_value subclasses
John W. Eaton <jwe@octave.org>
parents:
7444
diff
changeset
|
91 octave_value_list tmp = subsref (type, idx, 1); |
443a8f5a50fd
require both subsref variants to be defined in octave_value subclasses
John W. Eaton <jwe@octave.org>
parents:
7444
diff
changeset
|
92 return tmp.length () > 0 ? tmp(0) : octave_value (); |
7338 | 93 } |
94 | |
95 octave_value_list subsref (const std::string& type, | |
10313 | 96 const std::list<octave_value_list>& idx, |
97 int nargout); | |
7338 | 98 |
13241
2a8dcb5b3a00
improve default indexing for objects
John W. Eaton <jwe@octave.org>
parents:
13141
diff
changeset
|
99 octave_value_list |
2a8dcb5b3a00
improve default indexing for objects
John W. Eaton <jwe@octave.org>
parents:
13141
diff
changeset
|
100 do_multi_index_op (int nargout, const octave_value_list& idx) |
2a8dcb5b3a00
improve default indexing for objects
John W. Eaton <jwe@octave.org>
parents:
13141
diff
changeset
|
101 { |
2a8dcb5b3a00
improve default indexing for objects
John W. Eaton <jwe@octave.org>
parents:
13141
diff
changeset
|
102 return subsref ("(", std::list<octave_value_list> (1, idx), nargout); |
2a8dcb5b3a00
improve default indexing for objects
John W. Eaton <jwe@octave.org>
parents:
13141
diff
changeset
|
103 } |
2a8dcb5b3a00
improve default indexing for objects
John W. Eaton <jwe@octave.org>
parents:
13141
diff
changeset
|
104 |
9529
8e5009334661
partially revert e79470be3ecb
Jaroslav Hajek <highegg@gmail.com>
parents:
9522
diff
changeset
|
105 static octave_value numeric_conv (const Cell& val, |
10313 | 106 const std::string& type); |
9529
8e5009334661
partially revert e79470be3ecb
Jaroslav Hajek <highegg@gmail.com>
parents:
9522
diff
changeset
|
107 |
9147
5579998f8acf
Update to OOP facilities.
rtshort@bristlecone.phaselocked.com
parents:
9010
diff
changeset
|
108 void assign(const std::string& k, const octave_value& rhs) |
5579998f8acf
Update to OOP facilities.
rtshort@bristlecone.phaselocked.com
parents:
9010
diff
changeset
|
109 { map.assign (k, rhs); }; |
5579998f8acf
Update to OOP facilities.
rtshort@bristlecone.phaselocked.com
parents:
9010
diff
changeset
|
110 |
7338 | 111 octave_value subsasgn (const std::string& type, |
10313 | 112 const std::list<octave_value_list>& idx, |
113 const octave_value& rhs); | |
7338 | 114 |
12171
d08901c05c1b
fix bug in class assignment to undefined object with index
John W. Eaton <jwe@octave.org>
parents:
11586
diff
changeset
|
115 octave_value undef_subsasgn (const std::string& type, |
d08901c05c1b
fix bug in class assignment to undefined object with index
John W. Eaton <jwe@octave.org>
parents:
11586
diff
changeset
|
116 const std::list<octave_value_list>& idx, |
d08901c05c1b
fix bug in class assignment to undefined object with index
John W. Eaton <jwe@octave.org>
parents:
11586
diff
changeset
|
117 const octave_value& rhs); |
d08901c05c1b
fix bug in class assignment to undefined object with index
John W. Eaton <jwe@octave.org>
parents:
11586
diff
changeset
|
118 |
8154
265a821f6555
Add subsindex and ismethod functions
David Bateman <dbateman@free.fr>
parents:
7651
diff
changeset
|
119 idx_vector index_vector (void) const; |
265a821f6555
Add subsindex and ismethod functions
David Bateman <dbateman@free.fr>
parents:
7651
diff
changeset
|
120 |
7338 | 121 dim_vector dims (void) const { return map.dims (); } |
122 | |
9529
8e5009334661
partially revert e79470be3ecb
Jaroslav Hajek <highegg@gmail.com>
parents:
9522
diff
changeset
|
123 size_t byte_size (void) const; |
8e5009334661
partially revert e79470be3ecb
Jaroslav Hajek <highegg@gmail.com>
parents:
9522
diff
changeset
|
124 |
8e5009334661
partially revert e79470be3ecb
Jaroslav Hajek <highegg@gmail.com>
parents:
9522
diff
changeset
|
125 // This is the number of elements in each field. The total number |
8e5009334661
partially revert e79470be3ecb
Jaroslav Hajek <highegg@gmail.com>
parents:
9522
diff
changeset
|
126 // of elements is numel () * nfields (). |
8e5009334661
partially revert e79470be3ecb
Jaroslav Hajek <highegg@gmail.com>
parents:
9522
diff
changeset
|
127 octave_idx_type numel (void) const |
8e5009334661
partially revert e79470be3ecb
Jaroslav Hajek <highegg@gmail.com>
parents:
9522
diff
changeset
|
128 { |
8e5009334661
partially revert e79470be3ecb
Jaroslav Hajek <highegg@gmail.com>
parents:
9522
diff
changeset
|
129 dim_vector dv = dims (); |
8e5009334661
partially revert e79470be3ecb
Jaroslav Hajek <highegg@gmail.com>
parents:
9522
diff
changeset
|
130 return dv.numel (); |
8e5009334661
partially revert e79470be3ecb
Jaroslav Hajek <highegg@gmail.com>
parents:
9522
diff
changeset
|
131 } |
8e5009334661
partially revert e79470be3ecb
Jaroslav Hajek <highegg@gmail.com>
parents:
9522
diff
changeset
|
132 |
8e5009334661
partially revert e79470be3ecb
Jaroslav Hajek <highegg@gmail.com>
parents:
9522
diff
changeset
|
133 octave_idx_type nfields (void) const { return map.nfields (); } |
8e5009334661
partially revert e79470be3ecb
Jaroslav Hajek <highegg@gmail.com>
parents:
9522
diff
changeset
|
134 |
9151 | 135 size_t nparents (void) const { return parent_list.size (); } |
136 | |
9529
8e5009334661
partially revert e79470be3ecb
Jaroslav Hajek <highegg@gmail.com>
parents:
9522
diff
changeset
|
137 octave_value reshape (const dim_vector& new_dims) const |
13141
e81ddf9cacd5
maint: untabify and remove trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
12619
diff
changeset
|
138 { |
12619
3b2e005e4219
Return octave_value of the same class as the original.
David Bateman <dbateman@free.fr>
parents:
12171
diff
changeset
|
139 octave_class retval = octave_class (*this); |
3b2e005e4219
Return octave_value of the same class as the original.
David Bateman <dbateman@free.fr>
parents:
12171
diff
changeset
|
140 retval.map = retval.map_value().reshape (new_dims); |
3b2e005e4219
Return octave_value of the same class as the original.
David Bateman <dbateman@free.fr>
parents:
12171
diff
changeset
|
141 return octave_value (new octave_class (retval)); |
3b2e005e4219
Return octave_value of the same class as the original.
David Bateman <dbateman@free.fr>
parents:
12171
diff
changeset
|
142 } |
9529
8e5009334661
partially revert e79470be3ecb
Jaroslav Hajek <highegg@gmail.com>
parents:
9522
diff
changeset
|
143 |
8e5009334661
partially revert e79470be3ecb
Jaroslav Hajek <highegg@gmail.com>
parents:
9522
diff
changeset
|
144 octave_value resize (const dim_vector& dv, bool = false) const |
13141
e81ddf9cacd5
maint: untabify and remove trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
12619
diff
changeset
|
145 { |
12619
3b2e005e4219
Return octave_value of the same class as the original.
David Bateman <dbateman@free.fr>
parents:
12171
diff
changeset
|
146 octave_class retval = octave_class (*this); |
3b2e005e4219
Return octave_value of the same class as the original.
David Bateman <dbateman@free.fr>
parents:
12171
diff
changeset
|
147 retval.map.resize (dv); |
3b2e005e4219
Return octave_value of the same class as the original.
David Bateman <dbateman@free.fr>
parents:
12171
diff
changeset
|
148 return octave_value (new octave_class (retval)); |
3b2e005e4219
Return octave_value of the same class as the original.
David Bateman <dbateman@free.fr>
parents:
12171
diff
changeset
|
149 } |
9529
8e5009334661
partially revert e79470be3ecb
Jaroslav Hajek <highegg@gmail.com>
parents:
9522
diff
changeset
|
150 |
8e5009334661
partially revert e79470be3ecb
Jaroslav Hajek <highegg@gmail.com>
parents:
9522
diff
changeset
|
151 bool is_defined (void) const { return true; } |
8e5009334661
partially revert e79470be3ecb
Jaroslav Hajek <highegg@gmail.com>
parents:
9522
diff
changeset
|
152 |
7338 | 153 bool is_map (void) const { return false; } |
154 | |
155 bool is_object (void) const { return true; } | |
156 | |
10742
604e13a89c7f
initial code for structs rewrite
Jaroslav Hajek <highegg@gmail.com>
parents:
10521
diff
changeset
|
157 octave_map map_value (void) const { return map; } |
604e13a89c7f
initial code for structs rewrite
Jaroslav Hajek <highegg@gmail.com>
parents:
10521
diff
changeset
|
158 |
7338 | 159 string_vector map_keys (void) const; |
160 | |
9151 | 161 std::list<std::string> parent_class_name_list (void) const |
162 { return parent_list; } | |
163 | |
9010
f914834836e7
Partial implementation of derived classes using the old form with "@" files.
rtshort@smoketree.phaselocked.com
parents:
8950
diff
changeset
|
164 string_vector parent_class_names (void) const |
f914834836e7
Partial implementation of derived classes using the old form with "@" files.
rtshort@smoketree.phaselocked.com
parents:
8950
diff
changeset
|
165 { return string_vector (parent_list); } |
f914834836e7
Partial implementation of derived classes using the old form with "@" files.
rtshort@smoketree.phaselocked.com
parents:
8950
diff
changeset
|
166 |
f914834836e7
Partial implementation of derived classes using the old form with "@" files.
rtshort@smoketree.phaselocked.com
parents:
8950
diff
changeset
|
167 octave_base_value *find_parent_class (const std::string&); |
f914834836e7
Partial implementation of derived classes using the old form with "@" files.
rtshort@smoketree.phaselocked.com
parents:
8950
diff
changeset
|
168 |
9767
0df32e0b2074
fix base class field assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
9581
diff
changeset
|
169 octave_base_value *unique_parent_class (const std::string&); |
0df32e0b2074
fix base class field assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
9581
diff
changeset
|
170 |
7338 | 171 void print (std::ostream& os, bool pr_as_read_syntax = false) const; |
172 | |
173 void print_raw (std::ostream& os, bool pr_as_read_syntax = false) const; | |
174 | |
175 bool print_name_tag (std::ostream& os, const std::string& name) const; | |
176 | |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11584
diff
changeset
|
177 void print_with_name (std::ostream& os, const std::string& name, |
10313 | 178 bool print_padding = true); |
7338 | 179 |
9190 | 180 bool reconstruct_exemplar (void); |
181 | |
9240
f27a8c07f0b2
clear -classes and support.
Robert T. Short <octave@phaselockedsystems.com>
parents:
9190
diff
changeset
|
182 static void clear_exemplar_map (void); |
f27a8c07f0b2
clear -classes and support.
Robert T. Short <octave@phaselockedsystems.com>
parents:
9190
diff
changeset
|
183 |
9182
23af5910e5f5
make load work for derived classses
Robert T. Short <octave@phaselockedsystems.com>
parents:
9151
diff
changeset
|
184 bool reconstruct_parents (void); |
23af5910e5f5
make load work for derived classses
Robert T. Short <octave@phaselockedsystems.com>
parents:
9151
diff
changeset
|
185 |
8212
ebf6f6a0f9a7
Allow saving/loading of classes. Add saveobj and loadobj methods
David Bateman <dbateman@free.fr>
parents:
8154
diff
changeset
|
186 bool save_ascii (std::ostream& os); |
7338 | 187 |
188 bool load_ascii (std::istream& is); | |
189 | |
190 bool save_binary (std::ostream& os, bool& save_as_floats); | |
191 | |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11584
diff
changeset
|
192 bool load_binary (std::istream& is, bool swap, |
10313 | 193 oct_mach_info::float_format fmt); |
7338 | 194 |
195 #if defined (HAVE_HDF5) | |
196 bool save_hdf5 (hid_t loc_id, const char *name, bool save_as_floats); | |
197 | |
9881
b3089dba88bf
Remove HDF5 cruft for older versions of HDF5
Kacper Kowalik
parents:
9767
diff
changeset
|
198 bool load_hdf5 (hid_t loc_id, const char *name); |
7338 | 199 #endif |
200 | |
201 mxArray *as_mxArray (void) const; | |
202 | |
9529
8e5009334661
partially revert e79470be3ecb
Jaroslav Hajek <highegg@gmail.com>
parents:
9522
diff
changeset
|
203 private: |
7338 | 204 |
10768
8a868004a437
use octave_map for octave_class
Jaroslav Hajek <highegg@gmail.com>
parents:
10742
diff
changeset
|
205 octave_map map; |
7338 | 206 |
207 DECLARE_OCTAVE_ALLOCATOR | |
208 | |
209 public: | |
210 int type_id (void) const { return t_id; } | |
211 std::string type_name (void) const { return t_name; } | |
212 std::string class_name (void) const { return c_name; } | |
213 | |
214 static int static_type_id (void) { return t_id; } | |
215 static std::string static_type_name (void) { return t_name; } | |
216 static std::string static_class_name (void) { return "<unknown>"; } | |
217 static void register_type (void); | |
218 | |
219 private: | |
220 static int t_id; | |
221 | |
222 static const std::string t_name; | |
223 std::string c_name; | |
9010
f914834836e7
Partial implementation of derived classes using the old form with "@" files.
rtshort@smoketree.phaselocked.com
parents:
8950
diff
changeset
|
224 std::list<std::string> parent_list; |
7338 | 225 |
9581
3d0d2bda3a0f
fix previous change, avoid duplicate loads of methods in descendant classes
Jaroslav Hajek <highegg@gmail.com>
parents:
9529
diff
changeset
|
226 bool in_class_method (void); |
10926
f687bd17ce21
fix field assignment from private class methods
Jaroslav Hajek <highegg@gmail.com>
parents:
10768
diff
changeset
|
227 std::string get_current_method_class (void); |
9151 | 228 |
12171
d08901c05c1b
fix bug in class assignment to undefined object with index
John W. Eaton <jwe@octave.org>
parents:
11586
diff
changeset
|
229 octave_value subsasgn_common (const octave_value& obj, |
d08901c05c1b
fix bug in class assignment to undefined object with index
John W. Eaton <jwe@octave.org>
parents:
11586
diff
changeset
|
230 const std::string& type, |
d08901c05c1b
fix bug in class assignment to undefined object with index
John W. Eaton <jwe@octave.org>
parents:
11586
diff
changeset
|
231 const std::list<octave_value_list>& idx, |
d08901c05c1b
fix bug in class assignment to undefined object with index
John W. Eaton <jwe@octave.org>
parents:
11586
diff
changeset
|
232 const octave_value& rhs); |
d08901c05c1b
fix bug in class assignment to undefined object with index
John W. Eaton <jwe@octave.org>
parents:
11586
diff
changeset
|
233 |
9522
e79470be3ecb
implement subsasgn this-arg optimization
Jaroslav Hajek <highegg@gmail.com>
parents:
9521
diff
changeset
|
234 int obsolete_copies; |
e79470be3ecb
implement subsasgn this-arg optimization
Jaroslav Hajek <highegg@gmail.com>
parents:
9521
diff
changeset
|
235 |
9151 | 236 public: |
237 // The list of field names and parent classes defines a class. We | |
238 // keep track of each class that has been created so that we know | |
239 class exemplar_info | |
240 { | |
241 public: | |
242 | |
243 exemplar_info (void) : field_names (), parent_class_names () { } | |
244 | |
245 exemplar_info (const octave_value& obj); | |
246 | |
247 exemplar_info (const exemplar_info& x) | |
248 : field_names (x.field_names), | |
10313 | 249 parent_class_names (x.parent_class_names) { } |
9151 | 250 |
251 exemplar_info& operator = (const exemplar_info& x) | |
252 { | |
253 if (&x != this) | |
10313 | 254 { |
255 field_names = x.field_names; | |
256 parent_class_names = x.parent_class_names; | |
257 } | |
9151 | 258 return *this; |
259 } | |
260 | |
261 octave_idx_type nfields (void) const { return field_names.length (); } | |
262 | |
263 size_t nparents (void) const { return parent_class_names.size (); } | |
264 | |
265 string_vector fields (void) const { return field_names; } | |
266 | |
267 std::list<std::string> parents (void) const { return parent_class_names; } | |
268 | |
269 bool compare (const octave_value& obj) const; | |
270 | |
271 private: | |
272 | |
273 string_vector field_names; | |
274 std::list<std::string> parent_class_names; | |
275 }; | |
276 | |
277 // A map from class names to lists of fields. | |
278 static std::map<std::string, exemplar_info> exemplar_map; | |
279 | |
280 typedef std::map<std::string, exemplar_info>::iterator exemplar_iterator; | |
281 typedef std::map<std::string, exemplar_info>::const_iterator exemplar_const_iterator; | |
7338 | 282 }; |
283 | |
284 #endif |