Panda3D

typedWritable.h

00001 // Filename: typedWritable.h
00002 // Created by:  jason (08Jun00)
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 __TYPED_WRITABLE_
00016 #define __TYPED_WRITABLE_
00017 
00018 #include "typedObject.h"
00019 #include "vector_typedWritable.h"
00020 #include "pvector.h"
00021 #include "lightMutex.h"
00022 #include "updateSeq.h"
00023 
00024 class BamReader;
00025 class BamWriter;
00026 class Datagram;
00027 class DatagramIterator;
00028 class ReferenceCount;
00029 
00030 ////////////////////////////////////////////////////////////////////
00031 //       Class : TypedWritable
00032 // Description : Base class for objects that can be written to and
00033 //               read from Bam files.
00034 //               
00035 //               See also TypedObject for detailed instructions.
00036 ////////////////////////////////////////////////////////////////////
00037 
00038 class EXPCL_PANDA_PUTIL TypedWritable : public TypedObject {
00039 public:
00040   static TypedWritable* const Null;
00041 
00042   INLINE TypedWritable();
00043   INLINE TypedWritable(const TypedWritable &copy);
00044   INLINE void operator = (const TypedWritable &copy);
00045 
00046   virtual ~TypedWritable();
00047 
00048   virtual void write_datagram(BamWriter *manager, Datagram &dg);
00049   virtual void update_bam_nested(BamWriter *manager);
00050 
00051   virtual int complete_pointers(TypedWritable **p_list, BamReader *manager);
00052   virtual bool require_fully_complete() const;
00053 
00054   virtual void fillin(DatagramIterator &scan, BamReader *manager);
00055   virtual void finalize(BamReader *manager);
00056 
00057   virtual ReferenceCount *as_reference_count();
00058 
00059 PUBLISHED:
00060   INLINE void mark_bam_modified();
00061   INLINE UpdateSeq get_bam_modified() const;
00062 
00063 #ifdef HAVE_PYTHON
00064   PyObject *__reduce__(PyObject *self) const;
00065   PyObject *__reduce_persist__(PyObject *self, PyObject *pickler) const;
00066 #endif
00067 
00068   INLINE string encode_to_bam_stream() const;
00069   bool encode_to_bam_stream(string &data, BamWriter *writer = NULL) const;
00070   static bool decode_raw_from_bam_stream(TypedWritable *&ptr, 
00071                                          ReferenceCount *&ref_ptr,
00072                                          const string &data,
00073                                          BamReader *reader = NULL);
00074 
00075 public:
00076 #ifdef HAVE_PYTHON
00077   static PyObject *find_global_decode(PyObject *this_class, const char *func_name);
00078 #endif
00079 
00080 private:
00081   // We may need to store a list of the BamWriter(s) that have a
00082   // reference to this object, so that we can remove the object from
00083   // those tables when it destructs.
00084   typedef pvector<BamWriter *> BamWriters;
00085   BamWriters *_bam_writers;
00086   static LightMutex _bam_writers_lock;
00087 
00088   UpdateSeq _bam_modified;
00089 
00090 public:
00091   static TypeHandle get_class_type() {
00092     return _type_handle;
00093   }
00094   static void init_type() {
00095     TypedObject::init_type();
00096     register_type(_type_handle, "TypedWritable",
00097                   TypedObject::get_class_type());
00098     TypeRegistry::ptr()->record_alternate_name(_type_handle, "TypedWriteable");
00099   }
00100   virtual TypeHandle get_type() const {
00101     return get_class_type();
00102   }
00103   virtual TypeHandle force_init_type() {
00104     init_type();
00105     return get_class_type();
00106   }
00107 
00108 private:
00109   static TypeHandle _type_handle;
00110 
00111   friend class BamWriter;
00112 };
00113 
00114 #ifdef HAVE_PYTHON
00115 BEGIN_PUBLISH
00116 PyObject *py_decode_TypedWritable_from_bam_stream(PyObject *this_class, const string &data);
00117 PyObject *py_decode_TypedWritable_from_bam_stream_persist(PyObject *unpickler, PyObject *this_class, const string &data);
00118 END_PUBLISH
00119 #endif
00120 
00121 #include "typedWritable.I"
00122 
00123 #endif
00124 
00125 
 All Classes Functions Variables Enumerations