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
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042 #ifndef _sequence_h
00043 #define _sequence_h 1
00044
00045
00046 #include <stack>
00047
00048 #ifndef _basetype_h
00049 #include "BaseType.h"
00050 #endif
00051
00052 #ifndef _constructor_h
00053 #include "Constructor.h"
00054 #endif
00055
00056 #ifndef constraint_evaluator_h
00057 #include "ConstraintEvaluator.h"
00058 #endif
00059
00060
00061 #include "XDRUtils.h"
00062
00063 namespace libdap
00064 {
00065
00068 typedef vector<BaseType *> BaseTypeRow;
00069
00071 typedef vector<BaseTypeRow *> SequenceValues;
00072
00171 class Sequence: public Constructor
00172 {
00173 private:
00174
00175
00176 SequenceValues d_values;
00177
00178
00179
00180 int d_row_number;
00181
00182
00183
00184
00185
00186
00187
00188
00189 int d_starting_row_number;
00190 int d_row_stride;
00191 int d_ending_row_number;
00192
00193
00194 bool d_unsent_data;
00195
00196
00197
00198
00199 bool d_wrote_soi;
00200
00201
00202 bool d_leaf_sequence;
00203
00204
00205 bool d_top_most;
00206
00207 void _duplicate(const Sequence &s);
00208 BaseType *m_leaf_match(const string &name, btp_stack *s = 0);
00209 BaseType *m_exact_match(const string &name, btp_stack *s = 0);
00210
00211 bool is_end_of_rows(int i);
00212
00213 friend class SequenceTest;
00214
00215 protected:
00216
00217 typedef stack<SequenceValues*> sequence_values_stack_t;
00218
00219 virtual bool serialize_parent_part_one(const string &dataset, DDS &dds,
00220 ConstraintEvaluator &eval,
00221 Marshaller &m);
00222 virtual void serialize_parent_part_two(const string &dataset, DDS &dds,
00223 ConstraintEvaluator &eval,
00224 Marshaller &m);
00225 virtual bool serialize_leaf(const string &dataset, DDS &dds,
00226 ConstraintEvaluator &eval,
00227 Marshaller &m, bool ce_eval);
00228
00229 virtual void intern_data_private(const string &dataset,
00230 ConstraintEvaluator &eval,
00231 DDS &dds,
00232 sequence_values_stack_t &sequence_values_stack);
00233 virtual void intern_data_for_leaf(const string &dataset, DDS &dds,
00234 ConstraintEvaluator &eval,
00235 sequence_values_stack_t &sequence_values_stack);
00236
00237 virtual void intern_data_parent_part_one(const string &dataset, DDS &dds,
00238 ConstraintEvaluator &eval,
00239 sequence_values_stack_t &sequence_values_stack);
00240
00241 virtual void intern_data_parent_part_two(const string &dataset, DDS &dds,
00242 ConstraintEvaluator &eval,
00243 sequence_values_stack_t &sequence_values_stack);
00244
00245 public:
00246
00247 Sequence(const string &n = "");
00248
00249 Sequence(const Sequence &rhs);
00250
00251 virtual ~Sequence();
00252
00253 Sequence &operator=(const Sequence &rhs);
00254
00255 virtual BaseType *ptr_duplicate();
00256
00257 virtual string toString();
00258
00259 virtual int element_count(bool leaves = false);
00260
00261 virtual bool is_linear();
00262
00263 virtual void set_send_p(bool state);
00264 virtual void set_read_p(bool state);
00265 virtual void set_in_selection(bool state);
00266
00267 virtual unsigned int width();
00268
00269 virtual int length();
00270
00271 virtual int number_of_rows();
00272
00273 virtual bool read_row(int row, const string &dataset, DDS &dds,
00274 ConstraintEvaluator &eval, bool ce_eval = true);
00275
00276 virtual void intern_data(const string &dataset, ConstraintEvaluator &eval,
00277 DDS &dds);
00278 virtual bool serialize(const string &dataset, ConstraintEvaluator &eval,
00279 DDS &dds, Marshaller &m, bool ce_eval = true);
00280 virtual bool deserialize(UnMarshaller &um, DDS *dds, bool reuse = false);
00281
00283 void reset_row_number();
00284
00285 int get_starting_row_number();
00286
00287 virtual int get_row_stride();
00288
00289 virtual int get_ending_row_number();
00290
00291 virtual void set_row_number_constraint(int start, int stop, int stride = 1);
00292
00294 bool get_unsent_data()
00295 {
00296 return d_unsent_data;
00297 }
00298
00300 void set_unsent_data(bool usd)
00301 {
00302 d_unsent_data = usd;
00303 }
00304
00305
00306 virtual unsigned int val2buf(void *val, bool reuse = false);
00307 virtual unsigned int buf2val(void **val);
00308
00309 virtual void set_value(SequenceValues &values);
00310 virtual SequenceValues value();
00311
00312 virtual BaseType *var(const string &name, bool exact_match = true,
00313 btp_stack *s = 0);
00314 virtual BaseType *var(const string &n, btp_stack &s);
00315
00316 virtual BaseType *var_value(size_t row, const string &name);
00317
00318 virtual BaseType *var_value(size_t row, size_t i);
00319
00320 virtual BaseTypeRow *row_value(size_t row);
00321
00322 virtual void add_var(BaseType *, Part part = nil);
00323 virtual void print_one_row(FILE *out, int row, string space,
00324 bool print_row_num = false);
00325 virtual void print_one_row(ostream &out, int row, string space,
00326 bool print_row_num = false);
00327 virtual void print_val_by_rows(FILE *out, string space = "",
00328 bool print_decl_p = true,
00329 bool print_row_numbers = true);
00330 virtual void print_val_by_rows(ostream &out, string space = "",
00331 bool print_decl_p = true,
00332 bool print_row_numbers = true);
00333 virtual void print_val(FILE *out, string space = "",
00334 bool print_decl_p = true);
00335 virtual void print_val(ostream &out, string space = "",
00336 bool print_decl_p = true);
00337
00338 virtual bool check_semantics(string &msg, bool all = false);
00339
00340 virtual void set_leaf_p(bool state);
00341
00342 virtual bool is_leaf_sequence();
00343
00344 virtual void set_leaf_sequence(int lvl = 1);
00345
00346 virtual void dump(ostream &strm) const ;
00347 };
00348
00349 }
00350
00351 #endif //_sequence_h