tmplinst_cs.cpp

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

CPP
1,290
字号
    }

  // For arg/return type helper template classes.

  idl_bool wide = (node->width () != 1);

  TAO_OutStream *os = this->ctx_->stream ();

  os->gen_ifdef_macro (node->flat_name (), "arg_traits_tmplinst");

  *os << be_nl << be_nl
      << this->prefix_ << " TAO::Arg_Traits<TAO::" << alias->local_name ()
      << "_" << bound << ">" << this->suffix_;

  *os << be_nl << be_nl
      << this->prefix_ << " TAO::BD_" << (wide ? "W" : "")
      << "String_Arg_Traits<" << bound << ">" << this->suffix_;

  os->gen_endif ();

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

int
be_visitor_tmplinst_cs::visit_array (be_array *node)
{
  if (this->this_mode_generated (node))
    {
      return 0;
    }

  TAO_OutStream *os = this->ctx_->stream ();

  // For arg/return type helper template classes.
  if (node->seen_in_operation ())
    {
      idl_bool variable = (node->size_type () == AST_Type::VARIABLE);

      os->gen_ifdef_macro (node->flat_name (), "arg_traits_tmplinst");

      *os << be_nl << be_nl << this->prefix_ << " TAO::Arg_Traits<"
          << node->name () << ">" << this->suffix_;

      *os << be_nl << be_nl
          << this->prefix_ << this->linebreak_ << be_idt << be_idt_nl
          << "TAO::" << (variable ? "Var" : "Fixed") << "_Array_Arg_Traits_T<"
          << this->linebreak_ << be_idt << be_idt_nl
          << node->name () << "," << this->linebreak_ << be_nl
          << node->name () << "_slice," << this->linebreak_ << be_nl
          << node->name () << "_var," << this->linebreak_ << be_nl;

      if (variable)
        {
          *os << node->name () << "_out," << this->linebreak_ << be_nl;
        }

      *os << node->name () << "_forany" << this->linebreak_ << be_uidt_nl
          << ">" << this->suffix_ << be_uidt << be_uidt << be_uidt;

      os->gen_endif ();
    }

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

  // To hold the full name, whether anonymous or not.
  char fname [NAMEBUFSIZE];
  ACE_OS::memset (fname,
                  '\0',
                  NAMEBUFSIZE);

  if (this->ctx_->alias ())
    {
      // Typedefed node.
      ACE_OS::sprintf (fname, "%s",
                       node->full_name ());
    }
  else
    {
      // For anonymous arrays ...
      // we have to generate a name for us that has an underscope prepended to
      // our local name. This needs to be inserted after the parents's name.
      if (node->is_nested ())
        {
          be_decl *parent =
            be_scope::narrow_from_scope (node->defined_in ())->decl ();
          ACE_OS::sprintf (fname,
                           "%s::_%s",
                           parent->full_name (),
                           node->local_name ()->get_string ());
        }
      else
        {
          ACE_OS::sprintf (fname,
                           "_%s",
                           node->full_name ());
        }
    }

  // For array traits template class.

  *os << be_nl << be_nl
      << this->prefix_ << this->linebreak_ << be_idt << be_idt_nl
      << "TAO::Array_Traits<" << this->linebreak_ << be_idt << be_idt_nl
      << fname << "," << this->linebreak_ << be_nl
      << fname << "_slice" << this->linebreak_ << be_uidt_nl
      << ">" << this->suffix_ << be_uidt << be_uidt << be_uidt;

  // For _var, _out and _forany template classes.

  idl_bool fixed = (node->size_type () == AST_Type::FIXED);

  if (this->ctx_->alias () != 0)
    {
      *os << be_nl << be_nl
          << this->prefix_ << this->linebreak_ << be_idt << be_idt_nl
          << "TAO_" << (fixed ? "Fixed" : "Var") << "Array_Var_T<"
          << this->linebreak_ << be_idt << be_idt_nl
          << fname << "," << this->linebreak_ << be_nl
          << fname << "_slice" << 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_Array_Out_T<" << this->linebreak_ << be_idt << be_idt_nl
          << fname << "," << this->linebreak_ << be_nl
          << fname << "_var," << this->linebreak_ << be_nl
          << fname << "_slice" << 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_Array_Var_Base_T<" << this->linebreak_ << be_idt
          << be_idt_nl
          << fname << "," << this->linebreak_ << be_nl
          << fname << "_slice" << 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_Array_Forany_T<" << this->linebreak_ << be_idt << be_idt_nl
      << fname << "," << this->linebreak_ << be_nl
      << fname << "_slice" << this->linebreak_ << be_uidt_nl
      << ">" << this->suffix_ << be_uidt << be_uidt << be_uidt;

  // For Any impl template class.
  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_Array_Impl_T<" << this->linebreak_
          << be_idt << be_idt_nl
          << fname << "_slice," << this->linebreak_ << be_nl
          << fname << "_forany" << this->linebreak_ << be_uidt_nl
          << ">" << this->suffix_ << be_uidt << be_uidt << be_uidt;

      os = tmp;
    }

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

int
be_visitor_tmplinst_cs::visit_attribute (be_attribute *node)
{
  if (this->this_mode_generated (node)
      || node->imported ()
      || node->is_local ())
    {
      return 0;
    }

  const char * S = "";

  be_visitor_arg_tmplinst visitor (this->ctx_,
                                   this->mode_,
                                   this->prefix_,
                                   this->suffix_,
                                   this->linebreak_,
                                   S);
  be_type *bt = be_type::narrow_from_decl (node->field_type ());
  visitor.direction ();

  if (bt->accept (&visitor) != 0)
    {
      ACE_ERROR_RETURN ((LM_ERROR,
                         "(%N:%l) be_visitor_tmplinst_cs::"
                         "visit_attribute - "
                         "codegen for return type failed\n"),
                        -1);
    }

  if (!node->readonly ())
    {
      visitor.direction (AST_Argument::dir_IN);

      if (bt->accept (&visitor) != 0)
        {
          ACE_ERROR_RETURN ((LM_ERROR,
                             "(%N:%l) be_visitor_tmplinst_cs::"
                             "visit_attribute - "
                             "codegen for IN parameter failed\n"),
                            -1);
        }
    }

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

int
be_visitor_tmplinst_cs::visit_enum (be_enum *node)
{
  if (this->this_mode_generated (node))
    {
      return 0;
    }

  TAO_OutStream *os = this->ctx_->stream ();

  // For arg/return type helper template classes.

  if (node->seen_in_operation ())
    {
      os->gen_ifdef_macro (node->flat_name (), "arg_traits_tmplinst");

      *os << be_nl << be_nl
          << this->prefix_ << " TAO::Arg_Traits<" << node->name ()
          << ">" << this->suffix_;

      *os << be_nl << be_nl
          << this->prefix_ << " TAO::Basic_Arg_Traits_T<" << node->name ()
          << ">" << this->suffix_;

      os->gen_endif ();
    }

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

  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_Basic_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;
}

int
be_visitor_tmplinst_cs::visit_exception (be_exception *node)
{
  if (this->this_mode_generated (node) || node->imported ())
    {
      return 0;
    }

  TAO_OutStream *os = this->ctx_->stream ();

  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;
}

int
be_visitor_tmplinst_cs::visit_structure (be_structure *node)
{
  if (this->this_mode_generated (node))
    {
      return 0;
    }

  TAO_OutStream *os = this->ctx_->stream ();

  // For arg/return type helper template classes.
  if (node->seen_in_operation ())
    {
      idl_bool variable = (node->size_type () == AST_Type::VARIABLE);

      os->gen_ifdef_macro (node->flat_name (), "arg_traits_tmplinst");

      *os << be_nl << be_nl
          << this->prefix_ << " TAO::Arg_Traits<" << node->name ()
          << ">" << this->suffix_;

      *os << be_nl << be_nl
          << this->prefix_ << this->linebreak_ << be_idt << be_idt_nl
          << "TAO::" << (variable ? "Var" : "Fixed") << "_Size_Arg_Traits_T<"
          << this->linebreak_ << be_idt << be_idt_nl
          << node->name ();

      if (variable)
        {
          *os << "," << this->linebreak_ << be_nl
              << node->name () << "_var," << this->linebreak_ << be_nl
              << node->name () << "_out";
        }

      *os << this->linebreak_ << be_uidt_nl
          << ">" << this->suffix_ << be_uidt << be_uidt << be_uidt;

      os->gen_endif ();
    }

  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;
}

int
be_visitor_tmplinst_cs::visit_union (be_union *node)
{
  if (this->this_mode_generated (node))
    {
      return 0;
    }

  TAO_OutStream *os = this->ctx_->stream ();

  if (node->seen_in_operation ())
    {
      idl_bool variable = (node->size_type () == AST_Type::VARIABLE);

      os->gen_ifdef_macro (node->flat_name (), "arg_traits_tmplinst");

      *os << be_nl << be_nl
          << this->prefix_ << " TAO::Arg_Traits<" << node->name ()
          << ">" << this->suffix_;

      *os << be_nl << be_nl
          << this->prefix_ << this->linebreak_ << be_idt << be_idt_nl
          << "TAO::" << (variable ? "Var" : "Fixed") << "_Size_Arg_Traits_T<"
          << this->linebreak_ << be_idt << be_idt_nl
          << node->name ();

      if (variable)
        {
          *os << "," << this->linebreak_ << be_nl
              << node->name () << "_var," << this->linebreak_ << be_nl
              << node->name () << "_out";
        }

      *os << this->linebreak_ << be_uidt_nl
          << ">" << this->suffix_ << be_uidt << be_uidt << be_uidt;

      os->gen_endif ();
    }

⌨️ 快捷键说明

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