summaryrefslogtreecommitdiff
path: root/trunk/TAO/TAO_IDL/be/be_predefined_type.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/TAO/TAO_IDL/be/be_predefined_type.cpp')
-rw-r--r--trunk/TAO/TAO_IDL/be/be_predefined_type.cpp249
1 files changed, 249 insertions, 0 deletions
diff --git a/trunk/TAO/TAO_IDL/be/be_predefined_type.cpp b/trunk/TAO/TAO_IDL/be/be_predefined_type.cpp
new file mode 100644
index 00000000000..c91e7d7d1a4
--- /dev/null
+++ b/trunk/TAO/TAO_IDL/be/be_predefined_type.cpp
@@ -0,0 +1,249 @@
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// TAO IDL
+//
+// = FILENAME
+// be_predefined_type.cpp
+//
+// = DESCRIPTION
+// Extension of class AST_PredefinedType that provides additional means for C++
+// mapping.
+//
+// = AUTHOR
+// Copyright 1994-1995 by Sun Microsystems, Inc.
+// and
+// Aniruddha Gokhale
+//
+// ============================================================================
+
+#include "be_predefined_type.h"
+#include "be_visitor.h"
+#include "utl_identifier.h"
+#include "global_extern.h"
+
+#include "ace/Log_Msg.h"
+#include "ace/ACE.h"
+#include "ace/OS_NS_stdio.h"
+
+ACE_RCSID (be,
+ be_predefined_type,
+ "$Id$")
+
+be_predefined_type::be_predefined_type (void)
+ : COMMON_Base (),
+ AST_Decl (),
+ AST_Type (),
+ AST_ConcreteType (),
+ AST_PredefinedType (),
+ be_decl (),
+ be_type ()
+{
+}
+
+be_predefined_type::be_predefined_type (AST_PredefinedType::PredefinedType t,
+ UTL_ScopedName *n)
+ : COMMON_Base (),
+ AST_Decl (AST_Decl::NT_pre_defined,
+ n,
+ true),
+ AST_Type (AST_Decl::NT_pre_defined,
+ n),
+ AST_ConcreteType (AST_Decl::NT_pre_defined,
+ n),
+ AST_PredefinedType (t,
+ n),
+ be_decl (AST_Decl::NT_pre_defined,
+ n),
+ be_type (AST_Decl::NT_pre_defined,
+ n)
+{
+ // Computes the repoID.
+ this->compute_repoID ();
+
+ // Computes the fully scoped typecode name.
+ this->compute_tc_name ();
+
+ // Compute the flattened fully scoped name.
+ this->AST_Decl::compute_flat_name ();
+
+ if (t == AST_PredefinedType::PT_object)
+ {
+ this->fwd_helper_name_ = "::CORBA::tao_Object";
+ }
+ else if (t == AST_PredefinedType::PT_value)
+ {
+ this->fwd_helper_name_ = "::CORBA::tao_ValueBase";
+ }
+ else if (t == AST_PredefinedType::PT_abstract)
+ {
+ this->fwd_helper_name_ = "::CORBA::tao_AbstractBase";
+ }
+
+ switch (t)
+ {
+ case AST_PredefinedType::PT_char:
+ case AST_PredefinedType::PT_wchar:
+ case AST_PredefinedType::PT_boolean:
+ case AST_PredefinedType::PT_octet:
+ idl_global->ambiguous_type_seen_ = true;
+ break;
+ case AST_PredefinedType::PT_any:
+ case AST_PredefinedType::PT_object:
+ case AST_PredefinedType::PT_value:
+ case AST_PredefinedType::PT_void:
+ case AST_PredefinedType::PT_pseudo:
+ case AST_PredefinedType::PT_abstract:
+ break;
+ default:
+ idl_global->basic_type_seen_ = true;
+ break;
+ }
+}
+
+// Overriden method.
+void
+be_predefined_type::compute_tc_name (void)
+{
+ // Start with the head as the CORBA namespace.
+ Identifier *corba_id = 0;
+ ACE_NEW (corba_id,
+ Identifier ("CORBA"));
+
+ ACE_NEW (this->tc_name_,
+ UTL_ScopedName (corba_id,
+ 0));
+
+ Identifier *id = 0;
+ UTL_ScopedName *conc_name = 0;
+
+ switch (this->pt ())
+ {
+ case AST_PredefinedType::PT_void:
+ ACE_NEW (id,
+ Identifier ("_tc_void"));
+ break;
+ case AST_PredefinedType::PT_long:
+ ACE_NEW (id,
+ Identifier ("_tc_long"));
+ break;
+ case AST_PredefinedType::PT_longlong:
+ ACE_NEW (id,
+ Identifier ("_tc_longlong"));
+ break;
+ case AST_PredefinedType::PT_ulong:
+ ACE_NEW (id,
+ Identifier ("_tc_ulong"));
+ break;
+ case AST_PredefinedType::PT_ulonglong:
+ ACE_NEW (id,
+ Identifier ("_tc_ulonglong"));
+ break;
+ case AST_PredefinedType::PT_short:
+ ACE_NEW (id,
+ Identifier ("_tc_short"));
+ break;
+ case AST_PredefinedType::PT_ushort:
+ ACE_NEW (id,
+ Identifier ("_tc_ushort"));
+ break;
+ case AST_PredefinedType::PT_float:
+ ACE_NEW (id,
+ Identifier ("_tc_float"));
+ break;
+ case AST_PredefinedType::PT_double:
+ ACE_NEW (id,
+ Identifier ("_tc_double"));
+ break;
+ case AST_PredefinedType::PT_longdouble:
+ ACE_NEW (id,
+ Identifier ("_tc_longdouble"));
+ break;
+ case AST_PredefinedType::PT_char:
+ ACE_NEW (id,
+ Identifier ("_tc_char"));
+ break;
+ case AST_PredefinedType::PT_wchar:
+ ACE_NEW (id,
+ Identifier ("_tc_wchar"));
+ break;
+ case AST_PredefinedType::PT_octet:
+ ACE_NEW (id,
+ Identifier ("_tc_octet"));
+ break;
+ case AST_PredefinedType::PT_boolean:
+ ACE_NEW (id,
+ Identifier ("_tc_boolean"));
+ break;
+ case AST_PredefinedType::PT_any:
+ ACE_NEW (id,
+ Identifier ("_tc_any"));
+ break;
+ case AST_PredefinedType::PT_object:
+ ACE_NEW (id,
+ Identifier ("_tc_Object"));
+ break;
+ case AST_PredefinedType::PT_value:
+ ACE_NEW (id,
+ Identifier ("_tc_ValueBase"));
+ break;
+ case AST_PredefinedType::PT_abstract:
+ ACE_NEW (id,
+ Identifier ("_tc_AbstractBase"));
+ break;
+ case AST_PredefinedType::PT_pseudo:
+ {
+ char tcname [100];
+ ACE_OS::sprintf (tcname,
+ "_tc_%s",
+ this->name ()->last_component ()->get_string ());
+
+ ACE_NEW (id,
+ Identifier (tcname));
+ break;
+ }
+ default:
+ ACE_ERROR ((LM_WARNING, "Unknown or invalid predefined type"));
+ break;
+ }
+
+ ACE_NEW (conc_name,
+ UTL_ScopedName (id,
+ 0));
+
+ this->tc_name_->nconc (conc_name);
+}
+
+void
+be_predefined_type::compute_repoID (void)
+{
+ switch (this->pt ())
+ {
+ case AST_PredefinedType::PT_object:
+ ACE::strdelete (this->repoID_);
+ this->repoID_ = ACE::strnew ("IDL:omg.org/CORBA/Object:1.0");
+ break;
+ default:
+ AST_Decl::compute_repoID ();
+ break;
+ }
+}
+
+int
+be_predefined_type::accept (be_visitor *visitor)
+{
+ return visitor->visit_predefined_type (this);
+}
+
+void
+be_predefined_type::destroy (void)
+{
+ this->AST_PredefinedType::destroy ();
+ this->be_type::destroy ();
+}
+
+// Narrowing
+IMPL_NARROW_METHODS2 (be_predefined_type, AST_PredefinedType, be_type)
+IMPL_NARROW_FROM_DECL (be_predefined_type)