00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #if !defined (octave_struct_h)
00025 #define octave_struct_h 1
00026
00027 #include <cstdlib>
00028
00029 #include <iosfwd>
00030 #include <string>
00031
00032 #include "mx-base.h"
00033 #include "str-vec.h"
00034
00035 #include "error.h"
00036 #include "oct-alloc.h"
00037 #include "oct-map.h"
00038 #include "ov-base.h"
00039 #include "ov-typeinfo.h"
00040
00041 class octave_value_list;
00042
00043 class tree_walker;
00044
00045
00046
00047 class
00048 octave_struct : public octave_base_value
00049 {
00050 public:
00051
00052 octave_struct (void)
00053 : octave_base_value () { }
00054
00055 octave_struct (const Octave_map& m)
00056 : octave_base_value (), map (m) { }
00057
00058 octave_struct (const octave_struct& s)
00059 : octave_base_value (), map (s.map) { }
00060
00061 ~octave_struct (void) { }
00062
00063 octave_base_value *clone (void) const { return new octave_struct (*this); }
00064 octave_base_value *empty_clone (void) const { return new octave_struct (); }
00065
00066 Cell dotref (const octave_value_list& idx, bool auto_add = false);
00067
00068 octave_value subsref (const std::string& type,
00069 const std::list<octave_value_list>& idx)
00070 {
00071 octave_value_list tmp = subsref (type, idx, 1);
00072 return tmp.length () > 0 ? tmp(0) : octave_value ();
00073 }
00074
00075 octave_value_list subsref (const std::string&,
00076 const std::list<octave_value_list>&, int);
00077
00078 octave_value subsref (const std::string& type,
00079 const std::list<octave_value_list>& idx,
00080 bool auto_add);
00081
00082 static octave_value numeric_conv (const octave_value& val,
00083 const std::string& type);
00084
00085 octave_value subsasgn (const std::string& type,
00086 const std::list<octave_value_list>& idx,
00087 const octave_value& rhs);
00088
00089 octave_value squeeze (void) const { return map.squeeze (); }
00090
00091 octave_value permute (const Array<int>& vec, bool inv = false) const
00092 { return map.permute (vec, inv); }
00093
00094 octave_value do_index_op (const octave_value_list& idx,
00095 bool resize_ok = false);
00096
00097 dim_vector dims (void) const { return map.dims (); }
00098
00099 size_t byte_size (void) const;
00100
00101
00102
00103 octave_idx_type numel (void) const
00104 {
00105 dim_vector dv = dims ();
00106 return dv.numel ();
00107 }
00108
00109 octave_idx_type nfields (void) const { return map.nfields (); }
00110
00111 octave_value reshape (const dim_vector& new_dims) const
00112 { return map.reshape (new_dims); }
00113
00114 octave_value resize (const dim_vector& dv, bool = false) const
00115 { Octave_map tmap = map; tmap.resize (dv); return tmap; }
00116
00117 bool is_defined (void) const { return true; }
00118
00119 bool is_constant (void) const { return true; }
00120
00121 bool is_map (void) const { return true; }
00122
00123 Octave_map map_value (void) const { return map; }
00124
00125 string_vector map_keys (void) const { return map.keys (); }
00126
00127 void print (std::ostream& os, bool pr_as_read_syntax = false) const;
00128
00129 void print_raw (std::ostream& os, bool pr_as_read_syntax = false) const;
00130
00131 bool print_name_tag (std::ostream& os, const std::string& name) const;
00132
00133 bool save_ascii (std::ostream& os);
00134
00135 bool load_ascii (std::istream& is);
00136
00137 bool save_binary (std::ostream& os, bool& save_as_floats);
00138
00139 bool load_binary (std::istream& is, bool swap,
00140 oct_mach_info::float_format fmt);
00141
00142 #if defined (HAVE_HDF5)
00143 bool save_hdf5 (hid_t loc_id, const char *name, bool save_as_floats);
00144
00145 bool load_hdf5 (hid_t loc_id, const char *name, bool have_h5giterate_bug);
00146 #endif
00147
00148 mxArray *as_mxArray (void) const;
00149
00150 protected:
00151
00152
00153 Octave_map map;
00154
00155 private:
00156
00157 DECLARE_OCTAVE_ALLOCATOR
00158
00159 DECLARE_OV_TYPEID_FUNCTIONS_AND_DATA
00160 };
00161
00162 #endif
00163
00164
00165
00166
00167
00168