Annotation of parser3/src/types/pa_method.h, revision 1.1.2.4.2.5
1.1.2.1 paf 1: /** @file
2: Parser: Method class decl.
3:
4: Copyright (c) 2001-2003 ArtLebedev Group (http://www.artlebedev.com)
5: Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru)
6: */
7:
8: #ifndef PA_METHOD_H
9: #define PA_METHOD_H
10:
1.1.2.4.2.5! paf 11: static const char* IDENT_METHOD_H="$Date: 2003/03/21 14:27:53 $";
1.1.2.4.2.1 paf 12:
1.1.2.1 paf 13:
14: /*#include "pa_string.h"
15: #include "pa_array.h"
16: #include "pa_exception.h"
17: */
18: #include "pa_operation.h"
19:
20: /**
21: native code method
22: params can be NULL when
23: method min&max params (see VStateless_class::add_native_method)
24: counts are zero.
25: */
1.1.2.4.2.5! paf 26: typedef void (*NativeCodePtr)(Request& request, MethodParams& params);
1.1.2.1 paf 27:
28:
29: /**
30: class method.
31:
32: methods can have
33: - named or
34: - numbered parameters
35:
36: methods can be
37: - parser or
38: - native onces
39:
40: holds
41: - parameter names or number limits
42: - local names
43: - code [parser or native]
44: */
45: class Method: public PA_Object {
46: public:
47:
48: /// allowed method call types
49: enum Call_type {
50: CT_ANY, ///< method can be called either statically or dynamically
51: CT_STATIC, ///< method can be called only statically
52: CT_DYNAMIC ///< method can be called only dynamically
53: };
54:
55: /// name for error reporting
1.1.2.4.2.4 paf 56: //const String& name;
1.1.2.1 paf 57: ///
58: Call_type call_type;
59: //@{
60: /// @name either numbered params // for native-code methods = operators
61: int min_numbered_params_count, max_numbered_params_count;
62: //@}
63: //@{
64: /// @name or named params&locals // for parser-code methods
1.1.2.4.2.3 paf 65: ArrayString* params_names; ArrayString* locals_names;
1.1.2.1 paf 66: //@}
67: //@{
68: /// @name the Code
1.1.2.4.2.3 paf 69: ArrayOperation* parser_code;/*OR*/NativeCodePtr native_code;
1.1.2.1 paf 70: //@}
71:
72: Method::Method(
1.1.2.4.2.4 paf 73: //const String& aname,
1.1.2.1 paf 74: Call_type call_type,
75: int amin_numbered_params_count, int amax_numbered_params_count,
1.1.2.4.2.3 paf 76: ArrayString* aparams_names, ArrayString* alocals_names,
77: ArrayOperation* aparser_code, NativeCodePtr anative_code) :
1.1.2.1 paf 78:
1.1.2.4.2.4 paf 79: //name(aname),
1.1.2.1 paf 80: call_type(call_type),
81: min_numbered_params_count(amin_numbered_params_count),
82: max_numbered_params_count(amax_numbered_params_count),
83: params_names(aparams_names), locals_names(alocals_names),
84: parser_code(aparser_code), native_code(anative_code) {
85: }
86:
87: /// call this before invoking to ensure proper actual numbered params count
88: void check_actual_numbered_params(
1.1.2.4.2.4 paf 89: Value& self, /*const String& actual_name, */MethodParams* actual_numbered_params) const;
1.1.2.1 paf 90: };
91:
92: /// Auto-object used for temporarily substituting/removing elements
93: class Temp_value_element {
94: Value& fwhere;
1.1.2.4.2.1 paf 95: const String& fname;
1.1.2.4.2.3 paf 96: Value* saved;
1.1.2.1 paf 97: public:
1.1.2.4.2.3 paf 98: Temp_value_element(Value& awhere, const String& aname, Value* awhat) :
1.1.2.1 paf 99: fwhere(awhere),
100: fname(aname),
101: saved(awhere.get_element(aname, awhere, false)) {
102: fwhere.put_element(aname, awhat, false);
103: }
104: ~Temp_value_element() {
105: fwhere.put_element(fname, saved, false);
106: }
107: };
108:
109:
110: #endif
E-mail: