blob: fdb74a70d9fe78afddccd676d14e7ad9f3cd63eb (
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$
//
/* -*- c++ -*- */
// ============================================================================
//
// = LIBRARY
// TAO IDL
//
// = FILENAME
// valuetype.h
//
// = DESCRIPTION
// Concrete visitor for the Valuetype node.
// This one provides the generic visitor for valuetypes from which others
// will inherit.
//
// = AUTHOR
// Torsten Kuepper <kuepper2@lfa.uni-wuppertal.de>
// based on interface.h from Aniruddha Gokhale
//
// ============================================================================
#ifndef _BE_VALUETYPE_VALUETYPE_H_
#define _BE_VALUETYPE_VALUETYPE_H_
class be_visitor_valuetype : public be_visitor_scope
{
//
// = TITLE
// be_visitor_valuetype
//
// = DESCRIPTION
// This is a concrete visitor for valuetype that abstracts all common tasks
//
public:
be_visitor_valuetype (be_visitor_context *ctx);
// constructor
~be_visitor_valuetype (void);
// destructor
public:
virtual int visit_valuetype (be_valuetype *node);
// visit the valuetype node
virtual int visit_valuetype_scope (be_valuetype *node);
// visit the scope of the valuetype node
// (in public/private field order)
virtual void begin_public ();
virtual void begin_private ();
// =visit methods on all elements syntactically valid in a Valuetype scope
virtual int visit_attribute (be_attribute *node);
// visit attribute
virtual int visit_constant (be_constant *node);
// visit a constant
virtual int visit_enum (be_enum *node);
// visit an enum
virtual int visit_operation (be_operation *node);
// visit operation
virtual int visit_exception (be_exception *node);
// visit exception (not used)
virtual int visit_structure (be_structure *node);
// visit a structure
virtual int visit_union (be_union *node);
// visit a union
virtual int visit_typedef (be_typedef *node);
// visit the typedef node
virtual int visit_field (be_field *node);
// visit a field
// =helper methods for generation of fields
int gen_pd (be_valuetype *node);
// private data fields for scope
int gen_field_pd (be_field *node);
// private data for field
virtual int gen_init_defn (be_valuetype *node);
// generate the _init class definition
virtual int gen_init_impl (be_valuetype *node);
// generate the _init implementation
protected:
// There are three possible situations.
// (1) If there is no initializers but at least one operation.
// In this case we don't need to bother about factory.
//
// (2) There are no (operations or initializers) (i.e. only state
// members) then we need a concrete type-specific factory
// class whose create_for_unmarshal creates OBV_ class.
//
// (3) There is at least one operation and at least one initializer.
// In this case we need to generate abstract factory class.
//
// Here I reflect these situations.
enum FactoryStyle
{
FS_UNKNOWN,
FS_NO_FACTORY,
FS_CONCRETE_FACTORY,
FS_ABSTRACT_FACTORY
};
static FactoryStyle determine_factory_style (be_valuetype* node);
// determine what kind of factory needed
static idl_bool have_operation(be_valuetype* node);
// recurse down the inheritance tree to determine
// if valuetype has at least one operation/attribute.
static idl_bool obv_need_ref_counter(be_valuetype* node);
// check is VT needs a RefCounter mix-in in OBV_ class
// suppose that we are deciding for this node
static idl_bool obv_have_ref_counter(be_valuetype* node);
// recurse down the inheritance tree to see
// if node or one of its OBV_ base class already has RefCounter
};
#endif /* _BE_VALUETYPE_VALUETYPE_H_ */
|