tmplinst_cs.cpp

来自「这是广泛使用的通信开源项目,对于大容量,高并发的通讯要求完全能够胜任,他广泛可用」· C++ 代码 · 共 1,290 行 · 第 1/3 页

CPP
1,290
字号

  if (this->visit_scope (node) != 0)
    {
      ACE_ERROR_RETURN ((LM_ERROR,
                         "(%N:%l) be_visitor_tmplinst_cs::"
                         "visit_structure - visit scope failed\n"),
                        -1);
    }

  if (node->imported ())
    {
      this->this_mode_generated (node, I_TRUE);
      return 0;
    }

  // For _var and/or _out tmp]ate clases.
  this->gen_common_tmplinst (node, os);

  if (be_global->any_support ())
    {
      TAO_OutStream *tmp = os;

      if (be_global->gen_anyop_files ())
        {
          os = tao_cg->anyop_source ();
        }

      *os << be_nl << be_nl
          << this->prefix_ << this->linebreak_ << be_idt << be_idt_nl
          << "TAO::Any_Dual_Impl_T<" << this->linebreak_
          << be_idt << be_idt_nl
          << node->name () << this->linebreak_ << be_uidt_nl
          << ">" << this->suffix_ << be_uidt << be_uidt << be_uidt;

      os = tmp;
    }

  this->this_mode_generated (node, I_TRUE);
  return 0;
}

idl_bool
be_visitor_tmplinst_cs::this_mode_generated (be_decl *node) const
{
  switch (this->mode_)
    {
      case TMPL_CLASS:
        return node->cli_tmpl_class_gen ();
      case PRAGMA_INST:
        return node->cli_pragma_inst_gen ();
      default:
        return I_FALSE;
    }
}

void
be_visitor_tmplinst_cs::this_mode_generated (be_decl *node,
                                             idl_bool val)
{
  switch (this->mode_)
    {
      case TMPL_CLASS:
        node->cli_tmpl_class_gen (val);
        break;
      case PRAGMA_INST:
        node->cli_pragma_inst_gen (val);
        break;
      default:
        break;
    }
}

void
be_visitor_tmplinst_cs::gen_managed_type_tmplinst (be_sequence *node,
                                                   be_type *bt)
{
  TAO_OutStream *os = this->ctx_->stream ();

  switch (node->managed_type ())
    {
      case be_sequence::MNG_OBJREF:
        *os << be_nl << be_nl
            << this->prefix_ << this->linebreak_ << be_idt << be_idt_nl
            << "TAO_Object_Manager<" << this->linebreak_ << be_idt << be_idt_nl
            << bt->name () << "," << this->linebreak_ << be_nl
            << bt->name () << "_var" << this->linebreak_ << be_uidt_nl
            << ">" << this->suffix_ << be_uidt << be_uidt << be_uidt;

        break;
      case be_sequence::MNG_VALUE:
        *os << be_nl << be_nl
            << this->prefix_ << this->linebreak_ << be_idt << be_idt_nl
            << "TAO_Valuetype_Manager<" << this->linebreak_
            << be_idt << be_idt_nl
            << bt->name () << "," << this->linebreak_ << be_nl
            << bt->name () << "_var" << this->linebreak_ << be_uidt_nl
            << ">" << this->suffix_ << be_uidt << be_uidt << be_uidt;

        break;
      case be_sequence::MNG_PSEUDO:
        *os << be_nl << be_nl
            << this->prefix_ << this->linebreak_ << be_idt << be_idt_nl
            << "TAO_Pseudo_Object_Manager<" << this->linebreak_
            << be_idt << be_idt_nl
            << bt->name () << this->linebreak_ << be_uidt_nl
            << ">" << this->suffix_ << be_uidt << be_uidt << be_uidt;

        break;
      default:
        //  String and Wstring managed types are not template classes.
        break;
    }
}

int
be_visitor_tmplinst_cs::gen_varout_tmplinst (be_sequence *node,
                                             be_type *bt)
{
  TAO_OutStream *os = this->ctx_->stream ();

  switch (node->managed_type ())
    {
      case be_sequence::MNG_OBJREF:
        *os << be_nl << be_nl
            << this->prefix_ << this->linebreak_ << be_idt << be_idt_nl
            << "TAO_MngSeq_Var_T<" << this->linebreak_ << be_idt << be_idt_nl
            << node->name () << "," << this->linebreak_ << be_nl
            << "TAO_Object_Manager<" << this->linebreak_
            << be_idt << be_idt_nl
            << bt->name () << "," << this->linebreak_ << be_nl
            << bt->name () << "_var" << this->linebreak_
            << be_uidt_nl
            << ">" << this->linebreak_ << be_uidt << be_uidt_nl
            << ">" << this->suffix_
            << be_uidt << be_uidt << be_uidt;

        *os << be_nl << be_nl
            << this->prefix_ << this->linebreak_ << be_idt << be_idt_nl
            << "TAO_Seq_Var_Base_T<" << this->linebreak_ << be_idt << be_idt_nl
            << node->name () << "," << this->linebreak_ << be_nl
            << "TAO_Object_Manager<" << this->linebreak_
            << be_idt << be_idt_nl
            << bt->name () << "," << this->linebreak_ << be_nl
            << bt->name () << "_var" << this->linebreak_ << be_uidt_nl
            << ">" << this->linebreak_ << be_uidt << be_uidt_nl
            << ">" << this->suffix_
            << be_uidt << be_uidt << be_uidt;

        *os << be_nl << be_nl
            << this->prefix_ << this->linebreak_ << be_idt << be_idt_nl
            << "TAO_MngSeq_Out_T<" << this->linebreak_ << be_idt << be_idt_nl
            << node->name () << "," << this->linebreak_ << be_nl
            << node->name () << "_var," << this->linebreak_ << be_nl
            << "TAO_Object_Manager<" << this->linebreak_
            << be_idt << be_idt_nl
            << bt->name () << "," << this->linebreak_ << be_nl
            << bt->name () << "_var" << this->linebreak_ << be_uidt_nl
            << ">" << this->linebreak_ << be_uidt << be_uidt_nl
            << ">" << this->suffix_
            << be_uidt << be_uidt << be_uidt;

        break;
      case be_sequence::MNG_PSEUDO:
        *os << be_nl << be_nl
            << this->prefix_ << this->linebreak_ << be_idt << be_idt_nl
            << "TAO_MngSeq_Var_T<" << this->linebreak_ << be_idt << be_idt_nl
            << node->name () << "," << this->linebreak_ << be_nl
            << "TAO_Pseudo_Object_Manager<" << this->linebreak_
            << be_idt << be_idt_nl
            << bt->name () << this->linebreak_ << be_uidt_nl
            << ">" << this->linebreak_ << be_uidt << be_uidt_nl
            << ">" << this->suffix_
            << be_uidt << be_uidt << be_uidt;

        *os << be_nl << be_nl
            << this->prefix_ << this->linebreak_ << be_idt << be_idt_nl
            << "TAO_Seq_Var_Base_T<" << this->linebreak_
            << be_idt << be_idt_nl
            << node->name () << "," << this->linebreak_ << be_nl
            << "TAO_Pseudo_Object_Manager<" << this->linebreak_
            << be_idt << be_idt_nl
            << bt->name () << this->linebreak_ << be_uidt_nl
            << ">" << this->linebreak_ << be_uidt << be_uidt_nl
            << ">" << this->suffix_
            << be_uidt << be_uidt << be_uidt;

        *os << be_nl << be_nl
            << this->prefix_ << this->linebreak_ << be_idt << be_idt_nl
            << "TAO_MngSeq_Out_T<" << this->linebreak_ << be_idt << be_idt_nl
            << node->name () << "," << this->linebreak_ << be_nl
            << node->name () << "_var," << this->linebreak_ << be_nl
            << "TAO_Pseudo_Object_Manager<" << this->linebreak_
            << be_idt << be_idt_nl
            << bt->name () << this->linebreak_ << be_uidt_nl
            << ">" << this->linebreak_ << be_uidt << be_uidt_nl
            << ">" << this->suffix_
            << be_uidt << be_uidt << be_uidt;

        break;
      case be_sequence::MNG_VALUE:
        *os << be_nl << be_nl
            << this->prefix_ << this->linebreak_ << be_idt << be_idt_nl
            << "TAO_MngSeq_Var_T<" << this->linebreak_ << be_idt << be_idt_nl
            << node->name () << "," << this->linebreak_ << be_nl
            << "TAO_Valuetype_Manager<" << this->linebreak_
            << be_idt << be_idt_nl
            << bt->name () << "," << this->linebreak_ << be_nl
            << bt->name () << "_var" << this->linebreak_ << be_uidt_nl
            << ">" << this->linebreak_ << be_uidt << be_uidt_nl
            << ">" << this->suffix_
            << be_uidt << be_uidt << be_uidt;

        *os << be_nl << be_nl
            << this->prefix_ << this->linebreak_ << be_idt << be_idt_nl
            << "TAO_Seq_Var_Base_T<" << this->linebreak_ << be_idt << be_idt_nl
            << node->name () << "," << this->linebreak_ << be_nl
            << "TAO_Valuetype_Manager<" << this->linebreak_
            << be_idt << be_idt_nl
            << bt->name () << "," << this->linebreak_ << be_nl
            << bt->name () << "_var" << this->linebreak_ << be_uidt_nl
            << ">" << this->linebreak_ << be_uidt << be_uidt_nl
            << ">" << this->suffix_
            << be_uidt << be_uidt << be_uidt;

        *os << be_nl << be_nl
            << this->prefix_ << this->linebreak_ << be_idt << be_idt_nl
            << "TAO_MngSeq_Out_T<" << this->linebreak_ << be_idt << be_idt_nl
            << node->name () << "," << this->linebreak_ << be_nl
            << node->name () << "_var," << this->linebreak_ << be_nl
            << "TAO_Valuetype_Manager<" << this->linebreak_
            << be_idt << be_idt_nl
            << bt->name () << "," << this->linebreak_ << be_nl
            << bt->name () << "_var" << this->linebreak_ << be_uidt_nl
            << ">" << this->linebreak_ << be_uidt << be_uidt_nl
            << ">" << this->suffix_
            << be_uidt << be_uidt << be_uidt;

        break;
      case be_sequence::MNG_STRING:
        *os << be_nl << be_nl
            << this->prefix_ << this->linebreak_ << be_idt << be_idt_nl
            << "TAO_MngSeq_Var_T<" << this->linebreak_ << be_idt << be_idt_nl
            << node->name () << "," << this->linebreak_ << be_nl
            <<"TAO_SeqElem_String_Manager" << this->linebreak_ << be_uidt_nl
            << ">" << this->suffix_
            << be_uidt << be_uidt << be_uidt;

        *os << be_nl << be_nl
            << this->prefix_ << this->linebreak_ << be_idt << be_idt_nl
            << "TAO_Seq_Var_Base_T<" << this->linebreak_
            << be_idt << be_idt_nl
            << node->name () << "," << this->linebreak_ << be_nl
            <<"TAO_SeqElem_String_Manager" << this->linebreak_ << be_uidt_nl
            << ">" << this->suffix_
            << be_uidt << be_uidt << be_uidt;

        *os << be_nl << be_nl
            << this->prefix_ << this->linebreak_ << be_idt << be_idt_nl
            << "TAO_MngSeq_Out_T<" << this->linebreak_ << be_idt << be_idt_nl
            << node->name () << "," << this->linebreak_ << be_nl
            << node->name () << "_var," << this->linebreak_ << be_nl
            <<"TAO_SeqElem_String_Manager" << this->linebreak_ << be_uidt_nl
            << ">" << this->suffix_
            << be_uidt << be_uidt << be_uidt;

        break;
      case be_sequence::MNG_WSTRING:
        *os << be_nl << be_nl
            << this->prefix_ << this->linebreak_ << be_idt << be_idt_nl
            << "TAO_MngSeq_Var_T<" << this->linebreak_ << be_idt << be_idt_nl
            << node->name () << "," << this->linebreak_ << be_nl
            <<"TAO_SeqElem_WString_Manager" << this->linebreak_ << be_uidt_nl
            << ">" << this->suffix_
            << be_uidt << be_uidt << be_uidt;

        *os << be_nl << be_nl
            << this->prefix_ << this->linebreak_ << be_idt << be_idt_nl
            << "TAO_Seq_Var_Base_T<" << this->linebreak_
            << be_idt << be_idt_nl
            << node->name () << "," << this->linebreak_ << be_nl
            <<"TAO_SeqElem_WString_Manager" << this->linebreak_ << be_uidt_nl
            << ">" << this->suffix_
            << be_uidt << be_uidt << be_uidt;

        *os << be_nl << be_nl
            << this->prefix_ << this->linebreak_ << be_idt << be_idt_nl
            << "TAO_MngSeq_Out_T<" << this->linebreak_ << be_idt << be_idt_nl
            << node->name () << "," << this->linebreak_ << be_nl
            << node->name () << "_var," << this->linebreak_ << be_nl
            <<"TAO_SeqElem_WString_Manager" << this->linebreak_ << be_uidt_nl
            << ">" << this->suffix_
            << be_uidt << be_uidt << be_uidt;

        break;
      default: // not a managed type
        {
          AST_Type::SIZE_TYPE st = bt->size_type ();

          *os << be_nl << be_nl
              << this->prefix_ << this->linebreak_ << be_idt << be_idt_nl
              << (st == AST_Type::FIXED ? "TAO_FixedSeq_Var_T<"
                                        : "TAO_VarSeq_Var_T<")
              << this->linebreak_ << be_idt << be_idt_nl
              << node->name () << "," << this->linebreak_ << be_nl
              << bt->name () << this->linebreak_ << be_uidt_nl
              << ">" << this->suffix_
              << be_uidt << be_uidt << be_uidt;

          *os << be_nl << be_nl
              << this->prefix_ << this->linebreak_ << be_idt << be_idt_nl
              << "TAO_Seq_Var_Base_T<" << this->linebreak_
              << be_idt << be_idt_nl
              << node->name () << "," << this->linebreak_ << be_nl
              << bt->name () << this->linebreak_ << be_uidt_nl
              << ">" << this->suffix_
              << be_uidt << be_uidt << be_uidt;

          *os << be_nl << be_nl
              << this->prefix_ << this->linebreak_ << be_idt << be_idt_nl
              << "TAO_Seq_Out_T<" << this->linebreak_
              << be_idt << be_idt_nl
              << node->name () << "," << this->linebreak_ << be_nl
              << node->name () << "_var," << this->linebreak_ << be_nl
              << bt->name () << this->linebreak_ << be_uidt_nl
              << ">" << this->suffix_
              << be_uidt << be_uidt << be_uidt;
        }

        break;
    }

  return 0;
}

int
be_visitor_tmplinst_cs::gen_base_class_tmplinst (be_sequence *node)
{
  TAO_OutStream *os = this->ctx_->stream ();

  // A generated sequence is a unique class type for each IDL typedef,
  // but the base template class may not be. So, when generating the
  // explicit template instantiation of the base class, we use the
  // unaliased element type and the bound (if any) in the #ifdef guard to
  // prevent duplicates.

  be_type *bt = be_type::narrow_from_decl (node->base_type ());
  AST_Decl::NodeType nt = bt->node_type ();

  if (nt == AST_Decl::NT_typedef)
    {
      be_typedef *td = be_typedef::narrow_from_decl (bt);
      bt = td->primitive_base_type ();
    }

  static char ifdef_suffix [NAMEBUFSIZE];

  ACE_OS::memset (ifdef_suffix,
                  '\0',
                  NAMEBUFSIZE);

  if (node->unbounded ())
    {
      ACE_OS::sprintf (ifdef_suffix,
                       "%s",
                       "explicit");
    }
  else
    {
      ACE_OS::sprintf (ifdef_suffix,
                       "%ld_%s",
                       node->max_size ()->ev ()->u.ulval,
                       "explicit");
    }

  os->gen_ifdef_macro (bt->flat_name (), ifdef_suffix);

  *os << be_nl << be_nl
      << this->prefix_ << this->linebreak_ << be_idt << be_idt_nl;

  int status = node->gen_base_class_name (os,
                                          this->linebreak_,
                                          idl_global->root ());

  // Pass it to the base constructor.
  if (status == -1)
    {
      ACE_ERROR_RETURN ((LM_ERROR,
                         "(%N:%l) be_visitor_tmplinst_cs::"
                         "gen_base_class_tmplinst - "
                         "codegen for base sequence class failed\n"),
                        -1);
    }

  *os << this->suffix_ << be_uidt << be_uidt;

  os->gen_endif ();

  return 0;
}

void
be_visitor_tmplinst_cs::gen_common_tmplinst (be_type *node,
                                             TAO_OutStream *os)
{
  idl_bool fixed = (node->size_type () == AST_Type::FIXED);

  *os << be_nl << be_nl
      << this->prefix_ << this->linebreak_ << be_idt << be_idt_nl
      << "TAO_" << (fixed ? "Fixed" : "Var") << "_Var_T<"
      << this->linebreak_ << be_idt << be_idt_nl
      << node->name () << this->linebreak_ << be_uidt_nl
      << ">" << this->suffix_ << be_uidt << be_uidt << be_uidt;

  *os << be_nl << be_nl
      << this->prefix_ << this->linebreak_ << be_idt << be_idt_nl
      << "TAO_Var_Base_T<" << this->linebreak_ << be_idt << be_idt_nl
      << node->name () << this->linebreak_ << be_uidt_nl
      << ">" << this->suffix_ << be_uidt << be_uidt << be_uidt;

  if (!fixed)
    {
      *os << be_nl<< be_nl
          << this->prefix_ << this->linebreak_ << be_idt << be_idt_nl
          << "TAO_Out_T<" << this->linebreak_ << be_idt << be_idt_nl
          << node->name () << "," << this->linebreak_ << be_nl
          << node->name () << "_var" << this->linebreak_ << be_uidt_nl
          << ">" << this->suffix_ << be_uidt << be_uidt << be_uidt;
    }
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?