| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210 |
- // Filename: cppTBDType.cxx
- // Created by: drose (05Nov99)
- //
- ////////////////////////////////////////////////////////////////////
- //
- // PANDA 3D SOFTWARE
- // Copyright (c) 2001, Disney Enterprises, Inc. All rights reserved
- //
- // All use of this software is subject to the terms of the Panda 3d
- // Software license. You should have received a copy of this license
- // along with this source code; you will also find a current copy of
- // the license at http://www.panda3d.org/license.txt .
- //
- // To contact the maintainers of this program write to
- // [email protected] .
- //
- ////////////////////////////////////////////////////////////////////
- #include "cppTBDType.h"
- #include "cppIdentifier.h"
- #include "cppSimpleType.h"
- ////////////////////////////////////////////////////////////////////
- // Function: CPPTBDType::Constructor
- // Access: Public
- // Description:
- ////////////////////////////////////////////////////////////////////
- CPPTBDType::
- CPPTBDType(CPPIdentifier *ident) :
- CPPType(CPPFile()),
- _ident(ident)
- {
- _subst_decl_recursive_protect = false;
- }
- ////////////////////////////////////////////////////////////////////
- // Function: CPPTBDType::resolve_type
- // Access: Public, Virtual
- // Description: If this CPPType object is a forward reference or
- // other nonspecified reference to a type that might now
- // be known a real type, returns the real type.
- // Otherwise returns the type itself.
- ////////////////////////////////////////////////////////////////////
- CPPType *CPPTBDType::
- resolve_type(CPPScope *current_scope, CPPScope *global_scope) {
- CPPType *type = _ident->find_type(current_scope, global_scope);
- if (type != NULL) {
- return type;
- }
- return this;
- }
- ////////////////////////////////////////////////////////////////////
- // Function: CPPTBDType::is_tbd
- // Access: Public, Virtual
- // Description: Returns true if the type, or any nested type within
- // the type, is a CPPTBDType and thus isn't fully
- // determined right now. In this case, calling
- // resolve_type() may or may not resolve the type.
- ////////////////////////////////////////////////////////////////////
- bool CPPTBDType::
- is_tbd() const {
- return true;
- }
- ////////////////////////////////////////////////////////////////////
- // Function: CPPTBDType::get_simple_name
- // Access: Public, Virtual
- // Description: Returns a fundametal one-word name for the type.
- // This name will not include any scoping operators or
- // template parameters, so it may not be a compilable
- // reference to the type.
- ////////////////////////////////////////////////////////////////////
- string CPPTBDType::
- get_simple_name() const {
- return _ident->get_simple_name();
- }
- ////////////////////////////////////////////////////////////////////
- // Function: CPPTBDType::get_local_name
- // Access: Public, Virtual
- // Description: Returns the compilable, correct name for this type
- // within the indicated scope. If the scope is NULL,
- // within the scope the type is declared in.
- ////////////////////////////////////////////////////////////////////
- string CPPTBDType::
- get_local_name(CPPScope *scope) const {
- return _ident->get_local_name(scope);
- }
- ////////////////////////////////////////////////////////////////////
- // Function: CPPTBDType::get_fully_scoped_name
- // Access: Public, Virtual
- // Description: Returns the compilable, correct name for the type,
- // with completely explicit scoping.
- ////////////////////////////////////////////////////////////////////
- string CPPTBDType::
- get_fully_scoped_name() const {
- return _ident->get_fully_scoped_name();
- }
- ////////////////////////////////////////////////////////////////////
- // Function: CPPTBDType::substitute_decl
- // Access: Public, Virtual
- // Description:
- ////////////////////////////////////////////////////////////////////
- CPPDeclaration *CPPTBDType::
- substitute_decl(CPPDeclaration::SubstDecl &subst,
- CPPScope *current_scope, CPPScope *global_scope) {
- CPPDeclaration *top =
- CPPDeclaration::substitute_decl(subst, current_scope, global_scope);
- if (top != this) {
- return top;
- }
- // Protect against recursive entry into this function block. I know
- // it's ugly--have you got any better suggestions?
- if (_subst_decl_recursive_protect) {
- // We're already executing this block.
- return this;
- }
- _subst_decl_recursive_protect = true;
- CPPTBDType *rep = new CPPTBDType(*this);
- rep->_ident = _ident->substitute_decl(subst, current_scope, global_scope);
- if (rep->_ident == _ident) {
- delete rep;
- rep = this;
- }
- rep = CPPType::new_type(rep)->as_tbd_type();
- assert(rep != NULL);
- CPPType *result = rep;
- // Can we now define it as a real type?
- CPPType *type = rep->_ident->find_type(current_scope, global_scope, subst);
- if (type != NULL) {
- result = type;
- }
- subst.insert(SubstDecl::value_type(this, result));
- _subst_decl_recursive_protect = false;
- return result;
- }
- ////////////////////////////////////////////////////////////////////
- // Function: CPPTBDType::output
- // Access: Public, Virtual
- // Description:
- ////////////////////////////////////////////////////////////////////
- void CPPTBDType::
- output(ostream &out, int, CPPScope *, bool) const {
- out /* << "typename " */ << *_ident;
- }
- ////////////////////////////////////////////////////////////////////
- // Function: CPPTBDType::get_subtype
- // Access: Public, Virtual
- // Description:
- ////////////////////////////////////////////////////////////////////
- CPPDeclaration::SubType CPPTBDType::
- get_subtype() const {
- return ST_tbd;
- }
- ////////////////////////////////////////////////////////////////////
- // Function: CPPTBDType::as_tbd_type
- // Access: Public, Virtual
- // Description:
- ////////////////////////////////////////////////////////////////////
- CPPTBDType *CPPTBDType::
- as_tbd_type() {
- return this;
- }
- ////////////////////////////////////////////////////////////////////
- // Function: CPPTBDType::is_equal
- // Access: Protected, Virtual
- // Description: Called by CPPDeclaration() to determine whether this type is
- // equivalent to another type of the same type.
- ////////////////////////////////////////////////////////////////////
- bool CPPTBDType::
- is_equal(const CPPDeclaration *other) const {
- const CPPTBDType *ot = ((CPPDeclaration *)other)->as_tbd_type();
- assert(ot != NULL);
- return (*_ident) == (*ot->_ident);
- }
- ////////////////////////////////////////////////////////////////////
- // Function: CPPTBDType::is_less
- // Access: Protected, Virtual
- // Description: Called by CPPDeclaration() to determine whether this type
- // should be ordered before another type of the same
- // type, in an arbitrary but fixed ordering.
- ////////////////////////////////////////////////////////////////////
- bool CPPTBDType::
- is_less(const CPPDeclaration *other) const {
- const CPPTBDType *ot = ((CPPDeclaration *)other)->as_tbd_type();
- assert(ot != NULL);
- return (*_ident) < (*ot->_ident);
- }
|