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