Qore Programming Language  0.8.7
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
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 
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 
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