00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #if !defined (octave_oct_obj_h)
00026 #define octave_oct_obj_h 1
00027
00028 #include <string>
00029 #include <vector>
00030
00031 #include "oct-alloc.h"
00032 #include "str-vec.h"
00033 #include "Array.h"
00034
00035 #include "ov.h"
00036 #include "Cell.h"
00037
00038 class
00039 OCTINTERP_API
00040 octave_value_list
00041 {
00042 public:
00043
00044 octave_value_list (void)
00045 : data () { }
00046
00047 explicit octave_value_list (octave_idx_type n)
00048 : data (dim_vector (1, n)) { }
00049
00050 octave_value_list (octave_idx_type n, const octave_value& val)
00051 : data (dim_vector (1, n), val) { }
00052
00053 octave_value_list (const octave_value& tc)
00054 : data (1, tc) { }
00055
00056 octave_value_list (const Array<octave_value>& d)
00057 : data (d.reshape (dim_vector (1, d.numel ()))) { }
00058
00059 octave_value_list (const Cell& tc)
00060 : data (tc.reshape (dim_vector (1, tc.numel ()))) { }
00061
00062 octave_value_list (const octave_value_list& obj)
00063 : data (obj.data), names (obj.names) { }
00064
00065
00066 octave_value_list (const std::list<octave_value_list>&);
00067
00068 ~octave_value_list (void) { }
00069
00070 void *operator new (size_t size)
00071 { return allocator.alloc (size); }
00072
00073 void operator delete (void *p, size_t size)
00074 { allocator.free (p, size); }
00075
00076
00077
00078 void *operator new (size_t size, void *p)
00079 { return ::operator new (size, p); }
00080
00081 void operator delete (void *p, void *)
00082 {
00083 #if defined (HAVE_PLACEMENT_DELETE)
00084 ::operator delete (p, static_cast<void *> (0));
00085 #else
00086 ::operator delete (p);
00087 #endif
00088 }
00089
00090 octave_value_list& operator = (const octave_value_list& obj)
00091 {
00092 if (this != &obj)
00093 {
00094 data = obj.data;
00095 names = obj.names;
00096 }
00097
00098 return *this;
00099 }
00100
00101 Array<octave_value> array_value (void) const { return data; }
00102
00103 Cell cell_value (void) const { return array_value (); }
00104
00105
00106
00107 octave_value& operator () (octave_idx_type n) { return elem (n); }
00108
00109 octave_value operator () (octave_idx_type n) const { return elem (n); }
00110
00111 octave_idx_type length (void) const { return data.length (); }
00112
00113 bool empty (void) const { return length () == 0; }
00114
00115 void resize (octave_idx_type n) { data.resize (n); }
00116
00117 void resize (octave_idx_type n, const octave_value& val)
00118 { data.resize (n, val); }
00119
00120 octave_value_list& prepend (const octave_value& val);
00121
00122 octave_value_list& append (const octave_value& val);
00123
00124 octave_value_list& append (const octave_value_list& lst);
00125
00126 octave_value_list& reverse (void);
00127
00128 octave_value_list
00129 slice (octave_idx_type offset, octave_idx_type len) const
00130 { return data.index (idx_vector (offset, offset + len)); }
00131
00132 octave_value_list
00133 splice (octave_idx_type offset, octave_idx_type len,
00134 const octave_value_list& lst = octave_value_list ()) const;
00135
00136 bool all_strings_p (void) const;
00137
00138 bool all_scalars (void) const;
00139
00140 bool has_magic_colon (void) const;
00141
00142 string_vector make_argv (const std::string& = std::string()) const;
00143
00144 void stash_name_tags (const string_vector& nm) { names = nm; }
00145
00146 string_vector name_tags (void) const { return names; }
00147
00148 void make_storable_values (void);
00149
00150 private:
00151
00152 static octave_allocator allocator;
00153
00154 Array<octave_value> data;
00155
00156
00157
00158 string_vector names;
00159
00160 octave_value& elem (octave_idx_type n)
00161 {
00162 if (n >= length ())
00163 resize (n + 1);
00164
00165 return data(n);
00166 }
00167
00168 octave_value elem (octave_idx_type n) const
00169 { return data(n); }
00170 };
00171
00172 #endif
00173
00174
00175
00176
00177
00178