summaryrefslogtreecommitdiff
path: root/trunk/TAO/TAO_IDL/be/be_visitor_structure/serializer_op_ch.cpp
blob: 7b5b502332b8946d51e0accefc3379fc8ce74f3c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
//
// $Id$
//

// ============================================================================
//
// = LIBRARY
//    TAO IDL
//
// = FILENAME
//    serializer_op_ch.cpp
//
// = DESCRIPTION
//    Visitor generating code for TAO::DCPS::Serializer operators for 
//    structures. This uses compiled marshaling.
//
// = AUTHOR
//    Scott Harris <harris_s@ociweb.com> based on code by Aniruddha Gokhale
//
// ============================================================================

ACE_RCSID (be_visitor_structure, 
           serializer_op_ch, 
           "$Id$")

#include "global_extern.h"

// ***************************************************************************
// Structure visitor for generating Serializer operator declarations in the client header
// ***************************************************************************

be_visitor_structure_serializer_op_ch::be_visitor_structure_serializer_op_ch (
    be_visitor_context *ctx
  )
  : be_visitor_structure (ctx)
{
}

be_visitor_structure_serializer_op_ch::~be_visitor_structure_serializer_op_ch (void)
{
}

int
be_visitor_structure_serializer_op_ch::visit_structure (be_structure *node)
{
  if (node->cli_hdr_serializer_op_gen ()
      || node->imported ()
      || node->is_local ())
    {
      return 0;
    }

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

  *os << be_nl << be_nl << "// TAO_IDL - Generated from" << be_nl
      << "// " << __FILE__ << ":" << __LINE__ << be_nl << be_nl;

  IDL_GlobalData::DCPS_Data_Type_Info* info;
  if (0 != (info =  idl_global->is_dcps_type(node->name())))
    {
      *os << be_global->stub_export_macro () 
          << " ::CORBA::Boolean _dcps_has_key(const " 
          << node->name() << "& val);" << be_nl;

      *os << "// This structure supports use of std::map with a key" << be_nl
          << "// defined by one or more #pragma DCPS_DATA_KEY lines." << be_nl
          << "struct " << be_global->stub_export_macro () << " " 
          << node->name()->last_component() << "KeyLessThan " << be_nl
          << "{" << be_idt_nl
          << "bool operator() (" << be_idt << be_idt_nl
          << "const " << node->name() << "& v1," << be_nl
          << "const " << node->name() << "& v2) const"  << be_uidt << be_uidt_nl 
          << "{" << be_idt_nl;

      if (info->key_list_.is_empty())
        {
          *os << "ACE_UNUSED_ARG(v1);" << be_nl;
          *os << "ACE_UNUSED_ARG(v2);" << be_nl;
          *os << "// if no DCPS_DATA_KEY values then return false" << be_nl
              << "// to allow use of map with just one entry" << be_nl;
          *os << "return false;" << be_nl;
        }
      else
        {
          *os << "return ";
          IDL_GlobalData::DCPS_Data_Type_Info_Iter iter (info->key_list_);

          for (ACE_CString *kp = 0;
               iter.next (kp) != 0;
               )
            {
              *os << "v1." << kp->c_str () << " < " << "v2." << kp->c_str ();
              iter.advance ();
              if (iter.done ()) 
                *os << ";" << be_uidt_nl;
              else
                *os << " || " << be_nl;
            }
        }
      *os << "}" << be_uidt_nl
          << "};" << be_nl << be_nl;
    }

  //- _dcps_max_marshaled_size(type) method 
  *os << be_global->stub_export_macro () 
      << " size_t _dcps_max_marshaled_size (const " 
      << node->name() << "& _tao_aggregate);" << be_nl;
  //- _tao_is_bounded_size(type) method 
  *os << be_global->stub_export_macro () 
      << " ::CORBA::Boolean _tao_is_bounded_size (const " 
      << node->name() << "& _tao_aggregate);" << be_nl;
  //- _dcps_find_size(type) method 
  *os << be_global->stub_export_macro () 
      << " size_t _dcps_find_size (const " 
      << node->name() << "& _tao_aggregate);" << be_nl;

  *os << be_global->stub_export_macro () << " ::CORBA::Boolean"
      << " operator<< (TAO::DCPS::Serializer &, const " << node->name ()
      << " &);" << be_nl;
  *os << be_global->stub_export_macro () << " ::CORBA::Boolean"
      << " operator>> (TAO::DCPS::Serializer &, "
      << node->name () << " &);";


  // Set the substate as generating code for the types defined in our scope.
  this->ctx_->sub_state(TAO_CodeGen::TAO_CDR_SCOPE);

  if (this->visit_scope (node) == -1)
    {
      ACE_ERROR_RETURN ((LM_ERROR,
                         "(%N:%l) be_visitor_structure_serializer_op_ch::"
                         "visit_structure - "
                         "codegen for scope failed\n"), 
                        -1);
    }


  node->cli_hdr_serializer_op_gen (1);
  return 0;
}