Annotation of parser3/src/types/pa_vstateless_class.h, revision 1.42.2.3
1.6 paf 1: /** @file
2: Parser: stateless class decls.
3:
1.42 paf 4: Copyright (c) 2001, 2003 ArtLebedev Group (http://www.artlebedev.com)
1.23 paf 5: Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru)
1.2 paf 6: */
7:
8: #ifndef PA_VSTATELESS_CLASS_H
9: #define PA_VSTATELESS_CLASS_H
1.27 paf 10:
1.42.2.3! paf 11: static const char* IDENT_VSTATELESS_CLASS_H="$Date: 2003/01/27 15:07:49 $";
1.2 paf 12:
1.13 paf 13: #include "pa_hash.h"
1.2 paf 14: #include "pa_vjunction.h"
15:
1.38 paf 16: // defines
17:
18: #define CLASS_NAME "CLASS"
19:
20: // forwards
21:
1.42.2.3! paf 22: class VStateless_class;
! 23: DECLARE_OBJECT_PTR(VStateless_class)
! 24:
1.2 paf 25: class Temp_method;
26:
1.6 paf 27: /**
1.30 paf 28: object' class. stores
29: - base: VClass::base()
30: - methods: VStateless_class::fmethods
1.6 paf 31:
1.30 paf 32: @see Method, VStateless_object, Temp_method
1.6 paf 33: */
1.39 paf 34: class VStateless_class: public Value {
1.19 paf 35: friend class Temp_method;
1.42.2.3! paf 36:
! 37: ConstStringPtr fname;
! 38: mutable CharPtr fname_cstr;
! 39: Hash<ConstStringPtr, Method *> fmethods;
! 40:
! 41: protected:
! 42:
! 43: VStateless_classPtr fbase;
! 44:
1.2 paf 45: public: // Value
46:
47: const char *type() const { return "stateless_class"; }
48:
1.5 paf 49: /// VStateless_class: this
1.42.2.1 paf 50: override VStateless_class *get_class() { return this; }
1.41 paf 51: /// VStateless_class: fbase
1.42.2.3! paf 52: override ValuePtr base() { return ValuePtr(fbase.get()); }
1.42.2.1 paf 53: override ValuePtr get_element(ConstStringPtr aname, Value& aself, bool looking_up);
1.2 paf 54:
55: public: // usage
56:
1.42.2.1 paf 57: VStateless_class(
58: ConstStringPtr aname=ConstStringPtrZero,
1.42.2.3! paf 59: VStateless_classPtr abase=VStateless_classPtrZero):
1.24 paf 60: fname(aname),
1.42.2.1 paf 61: fbase(abase) {
1.2 paf 62: }
63:
1.42.2.1 paf 64: ConstStringPtr name() const {
1.24 paf 65: if(!fname) {
66: if(fbase)
67: return fbase->name();
68:
69: throw Exception("parser.runtime",
1.42.2.1 paf 70: Exception::undefined_source,
1.24 paf 71: "getting name of nameless class");
72: }
73:
1.42.2.1 paf 74: return fname;
1.24 paf 75: }
1.42.2.1 paf 76: const char *name_cstr() const{
77: if(this) {
78: fname_cstr=name()->cstr();
79: return fname_cstr.get();
80: } else
81: return "<unknown>";
1.24 paf 82: }
1.42.2.1 paf 83: void set_name(ConstStringPtr aname) {
84: fname=aname;
1.24 paf 85: }
86:
1.42.2.1 paf 87: Method *get_method(ConstStringPtr name) const {
88: return fmethods.get(name);
1.2 paf 89: }
90:
1.42.2.1 paf 91: void add_method(ConstStringPtr name, Method& method);
1.40 paf 92:
1.2 paf 93: void add_native_method(
94: const char *cstr_name,
1.9 paf 95: Method::Call_type call_type,
1.2 paf 96: Native_code_ptr native_code,
97: int min_numbered_params_count, int max_numbered_params_count);
98:
1.42.2.3! paf 99: VStateless_classPtr set_base(VStateless_classPtr abase) {
! 100: VStateless_classPtr result=fbase;
1.2 paf 101: // remember the guy
1.32 paf 102: fbase=abase;
103: return result;
1.2 paf 104: }
1.42.2.3! paf 105: VStateless_classPtr base_class() { return fbase; }
1.2 paf 106:
1.30 paf 107: bool derived_from(VStateless_class& vclass) {
1.2 paf 108: return
1.42.2.3! paf 109: fbase.get()==&vclass ||
1.30 paf 110: fbase && fbase->derived_from(vclass);
1.31 paf 111: }
112:
1.11 paf 113: //@{
114: /// @name just stubs, real onces defined below the hierarchy
1.42.2.3! paf 115: virtual ValuePtr get_field(ConstStringPtr) { return 0; }
1.42.2.1 paf 116: virtual bool replace_field(ConstStringPtr, ValuePtr) { return false; }
1.21 paf 117: //@}
118:
119: /// @returns new value for current class, used in classes/ & VClass
1.42.2.3! paf 120: virtual ValuePtr create_new_value() { return 0; }
1.2 paf 121:
122: private: // Temp_method
123:
1.42.2.1 paf 124: void put_method(ConstStringPtr aname, Method * amethod) {
1.8 paf 125: fmethods.put(aname, amethod);
126: }
1.2 paf 127:
128: };
129:
1.6 paf 130: /// Auto-object used for temporarily substituting/removing class method
1.2 paf 131: class Temp_method {
132: VStateless_class& fclass;
1.42.2.1 paf 133: ConstStringPtr fname;
1.2 paf 134: Method *saved_method;
135: public:
1.42.2.1 paf 136: Temp_method(VStateless_class& aclass, ConstStringPtr aname, Method *amethod) :
1.2 paf 137: fclass(aclass),
138: fname(aname),
139: saved_method(aclass.get_method(aname)) {
140: fclass.put_method(aname, amethod);
141: }
142: ~Temp_method() {
143: fclass.put_method(fname, saved_method);
144: }
145: };
146:
147: #endif
E-mail: