00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifndef DCCLASS_H
00016 #define DCCLASS_H
00017
00018 #include "dcbase.h"
00019 #include "dcField.h"
00020 #include "dcDeclaration.h"
00021 #include "dcPython.h"
00022
00023 #ifdef WITHIN_PANDA
00024 #include "pStatCollector.h"
00025 #include "configVariableBool.h"
00026
00027 extern ConfigVariableBool dc_multiple_inheritance;
00028 extern ConfigVariableBool dc_virtual_inheritance;
00029 extern ConfigVariableBool dc_sort_inheritance_by_file;
00030
00031 #else // WITHIN_PANDA
00032
00033 static const bool dc_multiple_inheritance = true;
00034 static const bool dc_virtual_inheritance = true;
00035 static const bool dc_sort_inheritance_by_file = false;
00036
00037 #endif // WITHIN_PANDA
00038
00039 class HashGenerator;
00040 class DCParameter;
00041
00042
00043
00044
00045
00046
00047 class EXPCL_DIRECT DCClass : public DCDeclaration {
00048 public:
00049 DCClass(DCFile *dc_file, const string &name,
00050 bool is_struct, bool bogus_class);
00051 ~DCClass();
00052
00053 PUBLISHED:
00054 virtual DCClass *as_class();
00055 virtual const DCClass *as_class() const;
00056
00057 INLINE DCFile *get_dc_file() const;
00058
00059 INLINE const string &get_name() const;
00060 INLINE int get_number() const;
00061
00062 int get_num_parents() const;
00063 DCClass *get_parent(int n) const;
00064
00065 bool has_constructor() const;
00066 DCField *get_constructor() const;
00067
00068 int get_num_fields() const;
00069 DCField *get_field(int n) const;
00070
00071 DCField *get_field_by_name(const string &name) const;
00072 DCField *get_field_by_index(int index_number) const;
00073
00074 int get_num_inherited_fields() const;
00075 DCField *get_inherited_field(int n) const;
00076
00077 INLINE bool is_struct() const;
00078 INLINE bool is_bogus_class() const;
00079 bool inherits_from_bogus_class() const;
00080
00081 INLINE void start_generate();
00082 INLINE void stop_generate();
00083
00084 virtual void output(ostream &out) const;
00085
00086 #ifdef HAVE_PYTHON
00087 bool has_class_def() const;
00088 void set_class_def(PyObject *class_def);
00089 PyObject *get_class_def() const;
00090 bool has_owner_class_def() const;
00091 void set_owner_class_def(PyObject *owner_class_def);
00092 PyObject *get_owner_class_def() const;
00093
00094 void receive_update(PyObject *distobj, DatagramIterator &di) const;
00095 void receive_update_broadcast_required(PyObject *distobj, DatagramIterator &di) const;
00096 void receive_update_broadcast_required_owner(PyObject *distobj, DatagramIterator &di) const;
00097 void receive_update_all_required(PyObject *distobj, DatagramIterator &di) const;
00098 void receive_update_other(PyObject *distobj, DatagramIterator &di) const;
00099
00100 void direct_update(PyObject *distobj, const string &field_name,
00101 const string &value_blob);
00102 void direct_update(PyObject *distobj, const string &field_name,
00103 const Datagram &datagram);
00104 bool pack_required_field(Datagram &datagram, PyObject *distobj,
00105 const DCField *field) const;
00106 bool pack_required_field(DCPacker &packer, PyObject *distobj,
00107 const DCField *field) const;
00108
00109
00110
00111 Datagram client_format_update(const string &field_name,
00112 DOID_TYPE do_id, PyObject *args) const;
00113 Datagram ai_format_update(const string &field_name, DOID_TYPE do_id,
00114 CHANNEL_TYPE to_id, CHANNEL_TYPE from_id, PyObject *args) const;
00115 Datagram ai_format_update_msg_type(const string &field_name, DOID_TYPE do_id,
00116 CHANNEL_TYPE to_id, CHANNEL_TYPE from_id, int msg_type, PyObject *args) const;
00117 Datagram ai_format_generate(PyObject *distobj, DOID_TYPE do_id, ZONEID_TYPE parent_id, ZONEID_TYPE zone_id,
00118 CHANNEL_TYPE district_channel_id, CHANNEL_TYPE from_channel_id,
00119 PyObject *optional_fields) const;
00120 Datagram client_format_generate_CMU(PyObject *distobj, DOID_TYPE do_id,
00121 ZONEID_TYPE zone_id, PyObject *optional_fields) const;
00122
00123 Datagram ai_database_generate_context(unsigned int context_id, DOID_TYPE parent_id, ZONEID_TYPE zone_id, CHANNEL_TYPE owner_channel,
00124 CHANNEL_TYPE database_server_id, CHANNEL_TYPE from_channel_id) const;
00125 Datagram ai_database_generate_context_old(unsigned int context_id, DOID_TYPE parent_id, ZONEID_TYPE zone_id,
00126 CHANNEL_TYPE database_server_id, CHANNEL_TYPE from_channel_id) const;
00127
00128 #endif
00129
00130 public:
00131 virtual void output(ostream &out, bool brief) const;
00132 virtual void write(ostream &out, bool brief, int indent_level) const;
00133 void output_instance(ostream &out, bool brief, const string &prename,
00134 const string &name, const string &postname) const;
00135 void generate_hash(HashGenerator &hashgen) const;
00136 void clear_inherited_fields();
00137 void rebuild_inherited_fields();
00138
00139 bool add_field(DCField *field);
00140 void add_parent(DCClass *parent);
00141 void set_number(int number);
00142
00143 private:
00144 void shadow_inherited_field(const string &name);
00145
00146 #ifdef WITHIN_PANDA
00147 PStatCollector _class_update_pcollector;
00148 PStatCollector _class_generate_pcollector;
00149 static PStatCollector _update_pcollector;
00150 static PStatCollector _generate_pcollector;
00151 #endif
00152
00153 DCFile *_dc_file;
00154
00155 string _name;
00156 bool _is_struct;
00157 bool _bogus_class;
00158 int _number;
00159
00160 typedef pvector<DCClass *> Parents;
00161 Parents _parents;
00162
00163 DCField *_constructor;
00164
00165 typedef pvector<DCField *> Fields;
00166 Fields _fields, _inherited_fields;
00167
00168 typedef pmap<string, DCField *> FieldsByName;
00169 FieldsByName _fields_by_name;
00170
00171 typedef pmap<int, DCField *> FieldsByIndex;
00172 FieldsByIndex _fields_by_index;
00173
00174 #ifdef HAVE_PYTHON
00175 PyObject *_class_def;
00176 PyObject *_owner_class_def;
00177 #endif
00178
00179 friend class DCField;
00180 };
00181
00182 #include "dcClass.I"
00183
00184 #endif