historical/toontown-classic.git/panda/include/cppInstance.h
2024-01-16 11:20:27 -06:00

136 lines
4.3 KiB
C++

/**
* PANDA 3D SOFTWARE
* Copyright (c) Carnegie Mellon University. All rights reserved.
*
* All use of this software is subject to the terms of the revised BSD
* license. You should have received a copy of this license along
* with this source code in a file named "LICENSE."
*
* @file cppInstance.h
* @author drose
* @date 1999-10-19
*/
#ifndef CPPINSTANCE_H
#define CPPINSTANCE_H
#include "dtoolbase.h"
#include "cppDeclaration.h"
#include "cppType.h"
#include "cppTemplateParameterList.h"
class CPPInstanceIdentifier;
class CPPIdentifier;
class CPPParameterList;
class CPPScope;
class CPPExpression;
/**
*
*/
class CPPInstance : public CPPDeclaration {
public:
// Some of these flags clearly only make sense in certain contexts, e.g.
// for a function or method.
enum StorageClass {
SC_static = 0x0001,
SC_extern = 0x0002,
SC_c_binding = 0x0004,
SC_virtual = 0x0008,
SC_inline = 0x0010,
SC_explicit = 0x0020,
SC_register = 0x0040,
SC_pure_virtual = 0x0080,
SC_volatile = 0x0100,
SC_mutable = 0x0200,
SC_constexpr = 0x0400,
// This bit is only set by CPPStructType::check_virtual().
SC_inherited_virtual = 0x0800,
// This is a special "storage class" for methods tagged with the BLOCKING
// macro (i.e. the special __blocking keyword). These are methods that
// might block and therefore need to release Python threads for their
// duration.
SC_blocking = 0x1000,
// And this is for methods tagged with __extension, which declares
// extension methods defined separately from the source code.
SC_extension = 0x2000,
// These are for =default and =delete functions.
SC_defaulted = 0x4000,
SC_deleted = 0x8000,
SC_thread_local = 0x10000,
// This isn't really a storage class. It's only used temporarily by the
// parser, to make parsing specifier sequences a bit easier.
SC_const = 0x20000,
// Used to indicate that this is a parameter pack.
SC_parameter_pack = 0x40000,
};
CPPInstance(CPPType *type, const std::string &name, int storage_class = 0);
CPPInstance(CPPType *type, CPPIdentifier *ident, int storage_class = 0);
CPPInstance(CPPType *type, CPPInstanceIdentifier *ii,
int storage_class, const CPPFile &file);
CPPInstance(const CPPInstance &copy);
~CPPInstance();
static CPPInstance *
make_typecast_function(CPPInstance *inst, CPPIdentifier *ident,
CPPParameterList *parameters, int function_flags);
bool operator == (const CPPInstance &other) const;
bool operator != (const CPPInstance &other) const;
bool operator < (const CPPInstance &other) const;
void set_initializer(CPPExpression *initializer);
void set_alignment(int align);
void set_alignment(CPPExpression *const_expr);
bool is_scoped() const;
CPPScope *get_scope(CPPScope *current_scope, CPPScope *global_scope,
CPPPreprocessor *error_sink = nullptr) const;
std::string get_simple_name() const;
std::string get_local_name(CPPScope *scope = nullptr) const;
std::string get_fully_scoped_name() const;
void check_for_constructor(CPPScope *current_scope, CPPScope *global_scope);
virtual CPPDeclaration *
instantiate(const CPPTemplateParameterList *actual_params,
CPPScope *current_scope, CPPScope *global_scope,
CPPPreprocessor *error_sink = nullptr) const;
virtual bool is_fully_specified() const;
virtual CPPDeclaration *substitute_decl(SubstDecl &subst,
CPPScope *current_scope,
CPPScope *global_scope);
virtual void output(std::ostream &out, int indent_level, CPPScope *scope,
bool complete) const;
void output(std::ostream &out, int indent_level, CPPScope *scope,
bool complete, int num_default_parameters) const;
virtual SubType get_subtype() const;
virtual CPPInstance *as_instance();
CPPType *_type;
CPPIdentifier *_ident;
CPPExpression *_initializer;
int _storage_class;
CPPExpression *_alignment;
int _bit_width;
private:
typedef std::map<const CPPTemplateParameterList *, CPPInstance *, CPPTPLCompare> Instantiations;
Instantiations _instantiations;
};
#endif