00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifndef DCFIELD_H
00016 #define DCFIELD_H
00017
00018 #include "dcbase.h"
00019 #include "dcPackerInterface.h"
00020 #include "dcKeywordList.h"
00021 #include "dcPython.h"
00022
00023 #ifdef WITHIN_PANDA
00024 #include "pStatCollector.h"
00025 #endif
00026
00027 class DCPacker;
00028 class DCAtomicField;
00029 class DCMolecularField;
00030 class DCParameter;
00031 class DCSwitch;
00032 class DCClass;
00033 class HashGenerator;
00034
00035
00036
00037
00038
00039
00040 class EXPCL_DIRECT DCField : public DCPackerInterface, public DCKeywordList {
00041 public:
00042 DCField();
00043 DCField(const string &name, DCClass *dclass);
00044 virtual ~DCField();
00045
00046 PUBLISHED:
00047 INLINE int get_number() const;
00048 INLINE DCClass *get_class() const;
00049
00050 virtual DCField *as_field();
00051 virtual const DCField *as_field() const;
00052 virtual DCAtomicField *as_atomic_field();
00053 virtual const DCAtomicField *as_atomic_field() const;
00054 virtual DCMolecularField *as_molecular_field();
00055 virtual const DCMolecularField *as_molecular_field() const;
00056 virtual DCParameter *as_parameter();
00057 virtual const DCParameter *as_parameter() const;
00058
00059 string format_data(const string &packed_data, bool show_field_names = true);
00060 string parse_string(const string &formatted_string);
00061
00062 bool validate_ranges(const string &packed_data) const;
00063
00064 INLINE bool has_default_value() const;
00065 INLINE const string &get_default_value() const;
00066
00067 INLINE bool is_bogus_field() const;
00068
00069 INLINE bool is_required() const;
00070 INLINE bool is_broadcast() const;
00071 INLINE bool is_ram() const;
00072 INLINE bool is_db() const;
00073 INLINE bool is_clsend() const;
00074 INLINE bool is_clrecv() const;
00075 INLINE bool is_ownsend() const;
00076 INLINE bool is_ownrecv() const;
00077 INLINE bool is_airecv() const;
00078
00079 INLINE void output(ostream &out) const;
00080 INLINE void write(ostream &out, int indent_level) const;
00081
00082 #ifdef HAVE_PYTHON
00083 bool pack_args(DCPacker &packer, PyObject *sequence) const;
00084 PyObject *unpack_args(DCPacker &packer) const;
00085
00086 void receive_update(DCPacker &packer, PyObject *distobj) const;
00087
00088 Datagram client_format_update(DOID_TYPE do_id, PyObject *args) const;
00089 Datagram ai_format_update(DOID_TYPE do_id, CHANNEL_TYPE to_id, CHANNEL_TYPE from_id,
00090 PyObject *args) const;
00091 Datagram ai_format_update_msg_type(DOID_TYPE do_id, CHANNEL_TYPE to_id, CHANNEL_TYPE from_id,
00092 int msg_type, PyObject *args) const;
00093 #endif
00094
00095 public:
00096 virtual void output(ostream &out, bool brief) const=0;
00097 virtual void write(ostream &out, bool brief, int indent_level) const=0;
00098 virtual void generate_hash(HashGenerator &hashgen) const;
00099 virtual bool pack_default_value(DCPackData &pack_data, bool &pack_error) const;
00100 virtual void set_name(const string &name);
00101
00102 INLINE void set_number(int number);
00103 INLINE void set_class(DCClass *dclass);
00104 INLINE void set_default_value(const string &default_value);
00105
00106 #ifdef HAVE_PYTHON
00107 static string get_pystr(PyObject *value);
00108 #endif
00109
00110 protected:
00111 void refresh_default_value();
00112
00113 protected:
00114 DCClass *_dclass;
00115 int _number;
00116 bool _default_value_stale;
00117 bool _has_default_value;
00118 bool _bogus_field;
00119
00120 private:
00121 string _default_value;
00122
00123 #ifdef WITHIN_PANDA
00124 PStatCollector _field_update_pcollector;
00125 #endif
00126 };
00127
00128 INLINE ostream &operator << (ostream &out, const DCField &field) {
00129 field.output(out);
00130 return out;
00131 }
00132
00133 #include "dcField.I"
00134
00135 #endif