Annotation of parser3/src/types/pa_method.h, revision 1.1.2.1
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:
! 11: static const char* IDENT_METHOD_H="$Date: 2003/02/03 11:46:48 $";
! 12:
! 13: #include "pa_pool.h"
! 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: */
! 26: typedef void (*NativeCodePtr)(Request& request,
! 27: StringPtr method_name,
! 28: MethodParams& params);
! 29:
! 30:
! 31: typedef Array<StringPtr> ArrayString; DECLARE_OBJECT_PTR(ArrayString);
! 32:
! 33: /**
! 34: class method.
! 35:
! 36: methods can have
! 37: - named or
! 38: - numbered parameters
! 39:
! 40: methods can be
! 41: - parser or
! 42: - native onces
! 43:
! 44: holds
! 45: - parameter names or number limits
! 46: - local names
! 47: - code [parser or native]
! 48: */
! 49: class Method: public PA_Object {
! 50: public:
! 51:
! 52: /// allowed method call types
! 53: enum Call_type {
! 54: CT_ANY, ///< method can be called either statically or dynamically
! 55: CT_STATIC, ///< method can be called only statically
! 56: CT_DYNAMIC ///< method can be called only dynamically
! 57: };
! 58:
! 59: /// name for error reporting
! 60: StringPtr name;
! 61: ///
! 62: Call_type call_type;
! 63: //@{
! 64: /// @name either numbered params // for native-code methods = operators
! 65: int min_numbered_params_count, max_numbered_params_count;
! 66: //@}
! 67: //@{
! 68: /// @name or named params&locals // for parser-code methods
! 69: ArrayStringPtr params_names; ArrayStringPtr locals_names;
! 70: //@}
! 71: //@{
! 72: /// @name the Code
! 73: ArrayOperationPtr parser_code;/*OR*/NativeCodePtr native_code;
! 74: //@}
! 75:
! 76: Method::Method(
! 77: StringPtr aname,
! 78: Call_type call_type,
! 79: int amin_numbered_params_count, int amax_numbered_params_count,
! 80: ArrayStringPtr aparams_names, ArrayStringPtr alocals_names,
! 81: ArrayOperationPtr aparser_code, NativeCodePtr anative_code) :
! 82:
! 83: name(aname),
! 84: call_type(call_type),
! 85: min_numbered_params_count(amin_numbered_params_count),
! 86: max_numbered_params_count(amax_numbered_params_count),
! 87: params_names(aparams_names), locals_names(alocals_names),
! 88: parser_code(aparser_code), native_code(anative_code) {
! 89: }
! 90:
! 91: /// call this before invoking to ensure proper actual numbered params count
! 92: void check_actual_numbered_params(
! 93: Value& self, StringPtr actual_name, MethodParams& actual_numbered_params) const;
! 94: };
! 95:
! 96: /// Auto-object used for temporarily substituting/removing elements
! 97: class Temp_value_element {
! 98: Value& fwhere;
! 99: StringPtr fname;
! 100: ValuePtr saved;
! 101: public:
! 102: Temp_value_element(Value& awhere, StringPtr aname, ValuePtr awhat) :
! 103: fwhere(awhere),
! 104: fname(aname),
! 105: saved(awhere.get_element(aname, awhere, false)) {
! 106: fwhere.put_element(aname, awhat, false);
! 107: }
! 108: ~Temp_value_element() {
! 109: fwhere.put_element(fname, saved, false);
! 110: }
! 111: };
! 112:
! 113:
! 114: #endif
! 115:
E-mail: