Panda3D

dcField.h

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
 All Classes Functions Variables Enumerations