Qore Programming Language
0.8.7
Main Page
Related Pages
Modules
Classes
Files
File List
File Members
All
Classes
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
include
qore
CallReferenceNode.h
1
/* -*- mode: c++; indent-tabs-mode: nil -*- */
2
/*
3
CallReferenceNode.h
4
5
Qore Programming Language
6
7
Copyright 2003 - 2013 David Nichols
8
9
This library is free software; you can redistribute it and/or
10
modify it under the terms of the GNU Lesser General Public
11
License as published by the Free Software Foundation; either
12
version 2.1 of the License, or (at your option) any later version.
13
14
This library is distributed in the hope that it will be useful,
15
but WITHOUT ANY WARRANTY; without even the implied warranty of
16
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17
Lesser General Public License for more details.
18
19
You should have received a copy of the GNU Lesser General Public
20
License along with this library; if not, write to the Free Software
21
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
22
*/
23
24
#ifndef _QORE_FUNCTIONREFERENCENODE_H
25
26
#define _QORE_FUNCTIONREFERENCENODE_H
27
29
31
class
AbstractCallReferenceNode
:
public
AbstractQoreNode
{
32
private
:
34
36
DLLLOCAL
virtual
AbstractQoreNode
*realCopy()
const
;
37
39
41
DLLLOCAL
virtual
bool
is_equal_soft(
const
AbstractQoreNode
*v,
ExceptionSink
*xsink)
const
;
42
44
46
DLLLOCAL
virtual
bool
is_equal_hard(
const
AbstractQoreNode
*v,
ExceptionSink
*xsink)
const
;
47
48
protected
:
50
52
DLLLOCAL
virtual
AbstractQoreNode
*
evalImpl
(
ExceptionSink
*xsink)
const
;
53
55
57
DLLLOCAL
virtual
AbstractQoreNode
*
evalImpl
(
bool
&needs_deref,
ExceptionSink
*xsink)
const
;
58
60
62
DLLLOCAL
virtual
int64
bigIntEvalImpl
(
ExceptionSink
*xsink)
const
;
63
65
67
DLLLOCAL
virtual
int
integerEvalImpl
(
ExceptionSink
*xsink)
const
;
68
70
72
DLLLOCAL
virtual
bool
boolEvalImpl
(
ExceptionSink
*xsink)
const
;
73
75
77
DLLLOCAL
virtual
double
floatEvalImpl
(
ExceptionSink
*xsink)
const
;
78
80
DLLLOCAL
AbstractCallReferenceNode
(
bool
n_needs_eval,
bool
n_there_can_be_only_one,
qore_type_t
n_type =
NT_FUNCREF
);
81
82
public
:
83
DLLLOCAL
AbstractCallReferenceNode
(
bool
n_needs_eval =
false
,
qore_type_t
n_type =
NT_FUNCREF
);
84
85
DLLLOCAL
virtual
~AbstractCallReferenceNode();
86
88
90
DLLEXPORT
virtual
bool
getAsBoolImpl
()
const
;
91
93
99
DLLLOCAL
virtual
int
getAsString
(
QoreString
&str,
int
foff,
ExceptionSink
*xsink)
const
;
100
102
109
DLLLOCAL
virtual
QoreString
*
getAsString
(
bool
&del,
int
foff,
ExceptionSink
*xsink)
const
;
110
112
DLLLOCAL
virtual
const
char
*
getTypeName
()
const
;
113
114
DLLLOCAL
static
const
char
*getStaticTypeName() {
115
return
"call reference"
;
116
}
117
};
118
120
class
ResolvedCallReferenceNode
:
public
AbstractCallReferenceNode
{
121
public
:
123
DLLLOCAL
ResolvedCallReferenceNode
(
bool
n_needs_eval =
false
,
qore_type_t
n_type =
NT_FUNCREF
);
124
126
131
DLLLOCAL
virtual
AbstractQoreNode
*
exec
(
const
QoreListNode
*args,
ExceptionSink
*xsink)
const
= 0;
132
133
DLLLOCAL
virtual
int64 bigIntExec(
const
QoreListNode
*args,
ExceptionSink
*xsink)
const
{
134
ReferenceHolder<AbstractQoreNode>
rv(
exec
(args, xsink), xsink);
135
return
rv ? rv->
getAsBigInt
() : 0;
136
}
137
138
DLLLOCAL
virtual
int
intExec(
const
QoreListNode
*args,
ExceptionSink
*xsink)
const
{
139
ReferenceHolder<AbstractQoreNode>
rv(
exec
(args, xsink), xsink);
140
return
rv ? rv->
getAsInt
() : 0;
141
}
142
143
DLLLOCAL
virtual
bool
boolExec(
const
QoreListNode
*args,
ExceptionSink
*xsink)
const
{
144
ReferenceHolder<AbstractQoreNode>
rv(
exec
(args, xsink), xsink);
145
return
rv ? rv->
getAsBool
() :
false
;
146
}
147
148
DLLLOCAL
virtual
double
floatExec(
const
QoreListNode
*args,
ExceptionSink
*xsink)
const
{
149
ReferenceHolder<AbstractQoreNode>
rv(
exec
(args, xsink), xsink);
150
return
rv ? rv->
getAsFloat
() : 0.0;
151
}
152
154
157
DLLLOCAL
virtual
QoreProgram
*
getProgram
()
const
;
158
159
DLLLOCAL
virtual
class
QoreFunction *getFunction() = 0;
160
161
DLLLOCAL ResolvedCallReferenceNode *refRefSelf()
const
{
162
ref
();
163
return
const_cast<
ResolvedCallReferenceNode *
>
(
this
);
164
}
165
};
166
167
#endif