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(DDS &dds,
00220 ConstraintEvaluator &eval,
00221 Marshaller &m);
00222 virtual void serialize_parent_part_two(DDS &dds,
00223 ConstraintEvaluator &eval,
00224 Marshaller &m);
00225 virtual bool serialize_leaf(DDS &dds,
00226 ConstraintEvaluator &eval,
00227 Marshaller &m, bool ce_eval);
00228
00229 virtual void intern_data_private( ConstraintEvaluator &eval,
00230 DDS &dds,
00231 sequence_values_stack_t &sequence_values_stack);
00232 virtual void intern_data_for_leaf(DDS &dds,
00233 ConstraintEvaluator &eval,
00234 sequence_values_stack_t &sequence_values_stack);
00235
00236 virtual void intern_data_parent_part_one(DDS &dds,
00237 ConstraintEvaluator &eval,
00238 sequence_values_stack_t &sequence_values_stack);
00239
00240 virtual void intern_data_parent_part_two(DDS &dds,
00241 ConstraintEvaluator &eval,
00242 sequence_values_stack_t &sequence_values_stack);
00243
00244 public:
00245
00246 Sequence(const string &n);
00247 Sequence(const string &n, const string &d);
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, DDS &dds,
00274 ConstraintEvaluator &eval, bool ce_eval = true);
00275
00276 virtual void intern_data(ConstraintEvaluator &eval, DDS &dds);
00277 virtual bool serialize(ConstraintEvaluator &eval, DDS &dds,
00278 Marshaller &m, bool ce_eval = true);
00279 virtual bool deserialize(UnMarshaller &um, DDS *dds, bool reuse = false);
00280
00282 void reset_row_number();
00283
00284 int get_starting_row_number();
00285
00286 virtual int get_row_stride();
00287
00288 virtual int get_ending_row_number();
00289
00290 virtual void set_row_number_constraint(int start, int stop, int stride = 1);
00291
00293 bool get_unsent_data()
00294 {
00295 return d_unsent_data;
00296 }
00297
00299 void set_unsent_data(bool usd)
00300 {
00301 d_unsent_data = usd;
00302 }
00303
00304
00305 virtual unsigned int val2buf(void *val, bool reuse = false);
00306 virtual unsigned int buf2val(void **val);
00307
00308 virtual void set_value(SequenceValues &values);
00309 virtual SequenceValues value();
00310
00311 virtual BaseType *var(const string &name, bool exact_match = true,
00312 btp_stack *s = 0);
00313 virtual BaseType *var(const string &n, btp_stack &s);
00314
00315 virtual BaseType *var_value(size_t row, const string &name);
00316
00317 virtual BaseType *var_value(size_t row, size_t i);
00318
00319 virtual BaseTypeRow *row_value(size_t row);
00320
00321 virtual void add_var(BaseType *, Part part = nil);
00322 virtual void print_one_row(ostream &out, int row, string space,
00323 bool print_row_num = false);
00324 virtual void print_val_by_rows(ostream &out, string space = "",
00325 bool print_decl_p = true,
00326 bool print_row_numbers = true);
00327 virtual void print_val(ostream &out, string space = "",
00328 bool print_decl_p = true);
00329
00330
00331 virtual void print_one_row(FILE *out, int row, string space,
00332 bool print_row_num = false);
00333 virtual void print_val_by_rows(FILE *out, string space = "",
00334 bool print_decl_p = true,
00335 bool print_row_numbers = true);
00336 virtual void print_val(FILE *out, string space = "",
00337 bool print_decl_p = true);
00338
00339
00340 virtual bool check_semantics(string &msg, bool all = false);
00341
00342 virtual void set_leaf_p(bool state);
00343
00344 virtual bool is_leaf_sequence();
00345
00346 virtual void set_leaf_sequence(int lvl = 1);
00347
00348 virtual void dump(ostream &strm) const ;
00349 };
00350
00351 }
00352
00353 #endif //_sequence_h