Panda3D

interrogateType.h

00001 // Filename: interrogateType.h
00002 // Created by:  drose (31Jul00)
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 INTERROGATETYPE_H
00016 #define INTERROGATETYPE_H
00017 
00018 #include "dtoolbase.h"
00019 
00020 #include "interrogateComponent.h"
00021 
00022 #include <vector>
00023 
00024 class IndexRemapper;
00025 class CPPType;
00026 class CPPScope;
00027 
00028 ////////////////////////////////////////////////////////////////////
00029 //       Class : InterrogateType
00030 // Description : An internal representation of a type.
00031 ////////////////////////////////////////////////////////////////////
00032 class EXPCL_DTOOLCONFIG InterrogateType : public InterrogateComponent {
00033 public:
00034   InterrogateType(InterrogateModuleDef *def = NULL);
00035   InterrogateType(const InterrogateType &copy);
00036   void operator = (const InterrogateType &copy);
00037 
00038   INLINE bool is_global() const;
00039 
00040   INLINE bool has_scoped_name() const;
00041   INLINE const string &get_scoped_name() const;
00042 
00043   INLINE bool has_true_name() const;
00044   INLINE const string &get_true_name() const;
00045 
00046   INLINE bool has_comment() const;
00047   INLINE const string &get_comment() const;
00048 
00049   INLINE bool is_nested() const;
00050   INLINE TypeIndex get_outer_class() const;
00051 
00052   INLINE bool is_atomic() const;
00053   INLINE AtomicToken get_atomic_token() const;
00054   INLINE bool is_unsigned() const;
00055   INLINE bool is_signed() const;
00056   INLINE bool is_long() const;
00057   INLINE bool is_longlong() const;
00058   INLINE bool is_short() const;
00059 
00060   INLINE bool is_wrapped() const;
00061   INLINE bool is_pointer() const;
00062   INLINE bool is_const() const;
00063   INLINE TypeIndex get_wrapped_type() const;
00064 
00065   INLINE bool is_enum() const;
00066   INLINE int number_of_enum_values() const;
00067   INLINE const string &get_enum_value_name(int n) const;
00068   INLINE const string &get_enum_value_scoped_name(int n) const;
00069   INLINE int get_enum_value(int n) const;
00070 
00071   INLINE bool is_struct() const;
00072   INLINE bool is_class() const;
00073   INLINE bool is_union() const;
00074 
00075   INLINE bool is_fully_defined() const;
00076   INLINE bool is_unpublished() const;
00077   INLINE int number_of_constructors() const;
00078   INLINE FunctionIndex get_constructor(int n) const;
00079   INLINE bool has_destructor() const;
00080   INLINE bool destructor_is_inherited() const;
00081   INLINE FunctionIndex get_destructor() const;
00082   INLINE int number_of_elements() const;
00083   INLINE ElementIndex get_element(int n) const;
00084   INLINE int number_of_methods() const;
00085   INLINE FunctionIndex get_method(int n) const;
00086   INLINE int number_of_make_seqs() const;
00087   INLINE MakeSeqIndex get_make_seq(int n) const;
00088 
00089   INLINE int number_of_casts() const;
00090   INLINE FunctionIndex get_cast(int n) const;
00091 
00092   INLINE int number_of_derivations() const;
00093   INLINE TypeIndex get_derivation(int n) const;
00094 
00095   INLINE bool derivation_has_upcast(int n) const;
00096   INLINE FunctionIndex derivation_get_upcast(int n) const;
00097 
00098   INLINE bool derivation_downcast_is_impossible(int n) const;
00099   INLINE bool derivation_has_downcast(int n) const;
00100   INLINE FunctionIndex derivation_get_downcast(int n) const;
00101 
00102   INLINE int number_of_nested_types() const;
00103   INLINE TypeIndex get_nested_type(int n) const;
00104 
00105   void merge_with(const InterrogateType &other);
00106   void output(ostream &out) const;
00107   void input(istream &in);
00108 
00109   void remap_indices(const IndexRemapper &remap);
00110 
00111 private:
00112   enum Flags {
00113     F_global               = 0x000001,
00114     F_atomic               = 0x000002,
00115     F_unsigned             = 0x000004,
00116     F_signed               = 0x000008,
00117     F_long                 = 0x000010,
00118     F_longlong             = 0x000020,
00119     F_short                = 0x000040,
00120     F_wrapped              = 0x000080,
00121     F_pointer              = 0x000100,
00122     F_const                = 0x000200,
00123     F_struct               = 0x000400,
00124     F_class                = 0x000800,
00125     F_union                = 0x001000,
00126     F_fully_defined        = 0x002000,
00127     F_true_destructor      = 0x004000,
00128     F_private_destructor   = 0x008000,
00129     F_inherited_destructor = 0x010000,
00130     F_implicit_destructor  = 0x020000,
00131     F_nested               = 0x040000,
00132     F_enum                 = 0x080000,
00133     F_unpublished          = 0x100000,
00134   };
00135 
00136 public:
00137   int _flags;
00138 
00139   string _scoped_name;
00140   string _true_name;
00141   string _comment;
00142   TypeIndex _outer_class;
00143   AtomicToken _atomic_token;
00144   TypeIndex _wrapped_type;
00145 
00146   typedef vector<FunctionIndex> Functions;
00147   Functions _constructors;
00148   FunctionIndex _destructor;
00149 
00150   typedef vector<ElementIndex> Elements;
00151   Elements _elements;
00152   Functions _methods;
00153   Functions _casts;
00154 
00155   typedef vector<MakeSeqIndex> MakeSeqs;
00156   MakeSeqs _make_seqs;
00157 
00158   enum DerivationFlags {
00159     DF_upcast               = 0x01,
00160     DF_downcast             = 0x02,
00161     DF_downcast_impossible  = 0x04
00162   };
00163 
00164 public:
00165   // This nested class must be declared public just so we can declare
00166   // the external ostream and istream I/O operator functions, on the
00167   // SGI compiler.  Arguably a compiler bug, but what can you do.
00168   class Derivation {
00169   public:
00170     void output(ostream &out) const;
00171     void input(istream &in);
00172 
00173     int _flags;
00174     TypeIndex _base;
00175     FunctionIndex _upcast;
00176     FunctionIndex _downcast;
00177   };
00178 
00179 private:
00180   typedef vector<Derivation> Derivations;
00181   Derivations _derivations;
00182 
00183 public:
00184   // This nested class must also be public, for the same reason.
00185   class EnumValue {
00186   public:
00187     void output(ostream &out) const;
00188     void input(istream &in);
00189 
00190     string _name;
00191     string _scoped_name;
00192     int _value;
00193   };
00194 
00195 private:
00196   typedef vector<EnumValue> EnumValues;
00197   EnumValues _enum_values;
00198 
00199   typedef vector<TypeIndex> Types;
00200   Types _nested_types;
00201 
00202 public:
00203   // The rest of the members in this class aren't part of the public
00204   // interface to interrogate, but are used internally as the
00205   // interrogate database is built.  They are valid only during the
00206   // session of interrogate that generates the database, and will not
00207   // be filled in when the database is reloaded from disk.
00208   CPPType *_cpptype;
00209   CPPScope *_cppscope;
00210 
00211   friend class InterrogateBuilder;
00212 };
00213 
00214 INLINE ostream &operator << (ostream &out, const InterrogateType &type);
00215 INLINE istream &operator >> (istream &in, InterrogateType &type);
00216 
00217 INLINE ostream &operator << (ostream &out, const InterrogateType::Derivation &d);
00218 INLINE istream &operator >> (istream &in, InterrogateType::Derivation &d);
00219 
00220 INLINE ostream &operator << (ostream &out, const InterrogateType::EnumValue &d);
00221 INLINE istream &operator >> (istream &in, InterrogateType::EnumValue &d);
00222 
00223 #include "interrogateType.I"
00224 
00225 #include <set>
00226 #include <map>
00227 struct Dtool_PyTypedObject;
00228 typedef std::map< int , Dtool_PyTypedObject *>   RunTimeTypeDictionary;
00229 typedef std::set<int >                           RunTimeTypeList;
00230 
00231 EXPCL_DTOOLCONFIG  RunTimeTypeDictionary & GetRunTimeDictionary();
00232 EXPCL_DTOOLCONFIG  RunTimeTypeList & GetRunTimeTypeList();
00233 
00234 
00235 #endif
 All Classes Functions Variables Enumerations