Panda3D
|
00001 // Filename: dcField.h 00002 // Created by: drose (11Oct00) 00003 // 00004 //////////////////////////////////////////////////////////////////// 00005 // 00006 // PANDA 3D SOFTWARE 00007 // Copyright (c) Carnegie Mellon University. All rights reserved. 00008 // 00009 // All use of this software is subject to the terms of the revised BSD 00010 // license. You should have received a copy of this license along 00011 // with this source code in a file named "LICENSE." 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 // Class : DCField 00037 // Description : A single field of a Distributed Class, either atomic 00038 // or molecular. 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