CommonTools
Utils
src
MethodSetter.cc
Go to the documentation of this file.
1
#include "
CommonTools/Utils/src/MethodSetter.h
"
2
3
#include "
CommonTools/Utils/interface/Exception.h
"
4
#include "
CommonTools/Utils/src/ErrorCodes.h
"
5
#include "
CommonTools/Utils/src/MethodInvoker.h
"
6
#include "
CommonTools/Utils/src/findDataMember.h
"
7
#include "
CommonTools/Utils/src/findMethod.h
"
8
#include "
CommonTools/Utils/src/returnType.h
"
9
10
#include <string>
11
12
using namespace
reco::parser
;
13
using namespace
std
;
14
15
void
MethodSetter::operator()
(
const
char
*
begin
,
const
char
*
end
)
const
{
16
string
name
(
begin
,
end
);
17
string::size_type
parenthesis =
name
.find_first_of(
'('
);
18
if
((*
begin
==
'['
) || (*
begin
==
'('
)) {
19
name
.insert(0,
"operator.."
);
// operator..[arg];
20
parenthesis = 10;
// ^--- idx = 10
21
name
[8] = *
begin
;
// operator[.[arg];
22
name
[9] =
name
[
name
.size() - 1];
// operator[][arg];
23
name
[10] =
'('
;
// operator[](arg];
24
name
[
name
.size() - 1] =
')'
;
// operator[](arg);
25
// we don't actually need the last two, but just for extra care
26
//std::cout << "Transformed {" << string(begin,end) << "} into
27
// {"<< name <<"}" << std::endl;
28
}
29
std::vector<AnyMethodArgument>
args
;
30
if
(parenthesis != string::npos) {
31
name
.erase(parenthesis,
name
.size());
32
if
(intStack_.empty()) {
33
throw
Exception
(
begin
) <<
"expected method argument, but non given."
;
34
}
35
for
(vector<AnyMethodArgument>::const_iterator
i
= intStack_.begin();
i
!= intStack_.end(); ++
i
) {
36
args
.push_back(*
i
);
37
}
38
intStack_.clear();
39
}
40
string::size_type
endOfExpr =
name
.find_last_of(
' '
);
41
if
(endOfExpr != string::npos) {
42
name
.erase(endOfExpr,
name
.size());
43
}
44
//std::cerr << "Pushing [" << name << "] with " << args.size()
45
// << " args " << (lazy_ ? "(lazy)" : "(immediate)") << std::endl;
46
if
(lazy_) {
47
// for lazy parsing we just push method name and arguments
48
lazyMethStack_.push_back(
LazyInvoker
(
name
,
args
));
49
}
else
{
50
// otherwise we really have to resolve the method
51
push(
name
,
args
,
begin
);
52
}
53
//std::cerr << "Pushed [" << name << "] with " << args.size() <<
54
// " args " << (lazy_ ? "(lazy)" : "(immediate)") << std::endl;
55
}
56
57
bool
MethodSetter::push
(
const
string
&
name
,
const
vector<AnyMethodArgument>&
args
,
const
char
*
begin
,
bool
deep)
const
{
58
edm::TypeWithDict
type
= typeStack_.back();
59
vector<AnyMethodArgument> fixups;
60
int
error
= 0;
61
pair<edm::FunctionWithDict, bool>
mem
=
reco::findMethod
(
type
,
name
,
args
, fixups,
begin
,
error
);
62
if
(
bool
(
mem
.first)) {
63
// We found the method.
64
edm::TypeWithDict
retType =
reco::returnType
(
mem
.first);
65
if
(!
bool
(retType)) {
66
// Invalid return type, fatal error, throw.
67
throw
Exception
(
begin
) <<
"member \""
<<
mem
.first.name() <<
"\" return type is invalid:\n"
68
<<
" return type: \""
<<
mem
.first.typeName() <<
"\"\n"
;
69
}
70
typeStack_.push_back(retType);
71
// check for edm::Ref, edm::RefToBase, edm::Ptr
72
if
(
mem
.second) {
73
// Without fixups.
74
//std::cout << "Mem.second, so book " << mem.first.name() <<
75
// " without fixups." << std::endl;
76
methStack_.push_back(
MethodInvoker
(
mem
.first));
77
if
(!deep) {
78
return
false
;
79
}
80
// note: we have not found the method, so we have not
81
// fixupped the arguments
82
push(
name
,
args
,
begin
);
83
}
else
{
84
// With fixups.
85
//std::cout << "Not mem.second, so book " << mem.first.name()
86
// << " with #args = " << fixups.size() << std::endl;
87
methStack_.push_back(
MethodInvoker
(
mem
.first, fixups));
88
}
89
return
true
;
90
}
91
if
(
error
!=
reco::parser::kNameDoesNotExist
) {
92
// Fatal error, throw.
93
switch
(
error
) {
94
case
reco::parser::kIsNotPublic
:
95
throw
Exception
(
begin
) <<
"method named \""
<<
name
<<
"\" for type \""
<<
type
.name()
96
<<
"\" is not publically accessible."
;
97
break
;
98
case
reco::parser::kIsStatic
:
99
throw
Exception
(
begin
) <<
"method named \""
<<
name
<<
"\" for type \""
<<
type
.name() <<
"\" is static."
;
100
break
;
101
case
reco::parser::kIsNotConst
:
102
throw
Exception
(
begin
) <<
"method named \""
<<
name
<<
"\" for type \""
<<
type
.name() <<
"\" is not const."
;
103
break
;
104
case
reco::parser::kWrongNumberOfArguments
:
105
throw
Exception
(
begin
) <<
"method named \""
<<
name
<<
"\" for type \""
<<
type
.name()
106
<<
"\" was passed the wrong number of arguments."
;
107
break
;
108
case
reco::parser::kWrongArgumentType
:
109
throw
Exception
(
begin
) <<
"method named \""
<<
name
<<
"\" for type \""
<<
type
.name()
110
<<
"\" was passed the wrong types of arguments."
;
111
break
;
112
default
:
113
throw
Exception
(
begin
) <<
"method named \""
<<
name
<<
"\" for type \""
<<
type
.name()
114
<<
"\" is not usable in this context."
;
115
}
116
}
117
// Not a method, check for a data member.
118
error
= 0;
119
edm::MemberWithDict
member(
reco::findDataMember
(
type
,
name
,
error
));
120
if
(!
bool
(member)) {
121
// Not a data member either, fatal error, throw.
122
switch
(
error
) {
123
case
reco::parser::kNameDoesNotExist
:
124
throw
Exception
(
begin
) <<
"no method or data member named \""
<<
name
<<
"\" found for type \""
<<
type
.name()
125
<<
"\""
;
126
break
;
127
case
reco::parser::kIsNotPublic
:
128
throw
Exception
(
begin
) <<
"data member named \""
<<
name
<<
"\" for type \""
<<
type
.name()
129
<<
"\" is not publically accessible."
;
130
break
;
131
default
:
132
throw
Exception
(
begin
) <<
"data member named \""
<<
name
<<
"\" for type \""
<<
type
.name()
133
<<
"\" is not usable in this context."
;
134
break
;
135
}
136
}
137
// Ok, it was a data member.
138
typeStack_.push_back(member.
typeOf
());
139
methStack_.push_back(
MethodInvoker
(member));
140
return
true
;
141
}
writedatasetfile.args
args
Definition:
writedatasetfile.py:18
mps_fire.i
i
Definition:
mps_fire.py:355
reco::findDataMember
edm::MemberWithDict findDataMember(const edm::TypeWithDict &iType, const std::string &iName, int &oError)
Definition:
findDataMember.cc:30
reco::parser::kIsNotPublic
Definition:
ErrorCodes.h:33
ErrorCodes.h
reco::parser::kNameDoesNotExist
Definition:
ErrorCodes.h:32
reco::parser::MethodSetter::operator()
void operator()(const char *, const char *) const
Definition:
MethodSetter.cc:15
reco::parser::MethodInvoker
Definition:
MethodInvoker.h:27
mem
uint16_t mem[nChs][nEvts]
Definition:
recycleTccEmu.cc:13
relativeConstraints.error
error
Definition:
relativeConstraints.py:53
end
#define end
Definition:
vmac.h:39
trigger::size_type
uint16_t size_type
Definition:
TriggerTypeDefs.h:18
reco::parser::kIsNotConst
Definition:
ErrorCodes.h:35
Exception.h
edm::MemberWithDict::typeOf
TypeWithDict typeOf() const
Definition:
MemberWithDict.cc:18
reco::findMethod
std::pair< edm::FunctionWithDict, bool > findMethod(const edm::TypeWithDict &t, const std::string &name, const std::vector< AnyMethodArgument > &args, std::vector< AnyMethodArgument > &fixuppedArgs, const char *iIterator, int &oError)
Definition:
findMethod.cc:130
reco::returnType
edm::TypeWithDict returnType(const edm::FunctionWithDict &func)
Definition:
returnType.cc:16
edm::TypeWithDict
Definition:
TypeWithDict.h:38
reco::parser::LazyInvoker
Keeps different SingleInvokers for each dynamic type of the objects passed to invoke()
Definition:
MethodInvoker.h:95
edm::MemberWithDict
Definition:
MemberWithDict.h:19
MethodInvoker.h
returnType.h
reco::parser::kIsStatic
Definition:
ErrorCodes.h:34
reco::parser
Definition:
cutParser.h:9
type
type
Definition:
HCALResponse.h:21
std
Definition:
JetResolutionObject.h:76
Exception
Definition:
hltDiff.cc:246
findDataMember.h
reco::parser::MethodSetter::push
bool push(const std::string &, const std::vector< AnyMethodArgument > &, const char *, bool deep=true) const
Definition:
MethodSetter.cc:57
Skims_PA_cff.name
name
Definition:
Skims_PA_cff.py:17
reco::parser::kWrongNumberOfArguments
Definition:
ErrorCodes.h:40
findMethod.h
begin
#define begin
Definition:
vmac.h:32
reco::parser::kWrongArgumentType
Definition:
ErrorCodes.h:41
MethodSetter.h
Generated for CMSSW Reference Manual by
1.8.16