Annotation of parser3/src/types/pa_vstring.h, revision 1.43
1.23 paf 1: /** @file
2: Parser: @b string parser class decl.
1.13 paf 3:
1.40 paf 4: Copyright (c) 2001, 2002 ArtLebedev Group (http://www.artlebedev.com)
1.41 paf 5: Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru)
1.1 paf 6:
1.43 ! paf 7: $Id: pa_vstring.h,v 1.42 2002/02/20 10:40:08 paf Exp $
1.1 paf 8: */
9:
10: #ifndef PA_VSTRING_H
11: #define PA_VSTRING_H
12:
13: #include <stdlib.h>
14:
1.4 paf 15: #include "pa_vstateless_object.h"
1.1 paf 16: #include "pa_vdouble.h"
1.24 paf 17:
18: extern Methoded *string_class;
1.1 paf 19:
1.43 ! paf 20: /** the string object of string class.
! 21: specialized light version for VString
! 22:
! 23: "of some class" means "with some set of methods".
! 24: */
! 25: class VStateless_string_object : public VAliased {
! 26: public: // Value
! 27:
! 28: /// VStateless_string_object: fclass_real
! 29: VStateless_class *get_class() { return string_class; }
! 30:
! 31: /// VStateless_string_object: +$method
! 32: Value *get_element(const String& name) {
! 33: // $CLASS << actually abscent due to VString::hide_class=true, but for possible future VAliased::get_element implementation changes...
! 34: if(Value *result=VAliased::get_element(name))
! 35: return result;
! 36:
! 37: // $method=junction(self+class+method)
! 38: if(Junction *junction=string_class->get_junction(*this, name))
! 39: return NEW VJunction(*junction);
! 40:
! 41: return 0;
! 42: }
! 43:
! 44: public: // creation
! 45:
! 46: VStateless_string_object(Pool& apool) : VAliased(apool) {}
! 47:
! 48: };
! 49:
! 50:
1.13 paf 51: /// value of type 'string'. implemented with @c String
1.43 ! paf 52: class VString : public VStateless_string_object {
1.1 paf 53: public: // Value
54:
55: const char *type() const { return "string"; }
1.31 parser 56: /// VString: eq ''=false, ne ''=true
1.42 paf 57: bool is_defined() const { return !fstring->is_empty(); }
1.32 parser 58: /// VString: 0 or !0
1.34 parser 59: bool as_bool() const { return as_double()!=0; }
1.16 paf 60: /// VString: true
1.17 paf 61: bool is_string() const { return true; }
1.14 paf 62: /// VString: fstring as VDouble or this depending on return_string_as_is
1.16 paf 63: Value *as_expr_result(bool return_string_as_is=false) {
1.14 paf 64: if(return_string_as_is)
65: return this;
66: else
1.16 paf 67: return NEW VDouble(pool(), as_double());
1.14 paf 68: }
1.13 paf 69: /// VString: fstring
1.38 paf 70: const String *get_string() { return fstring; };
1.13 paf 71: /// VString: fstring
1.38 paf 72: double as_double() const { return fstring->as_double(); }
1.26 parser 73: /// VString: fstring
1.38 paf 74: int as_int() const { return fstring->as_int(); }
1.20 paf 75:
76: /// VString: vfile
1.29 parser 77: VFile *as_vfile(String::Untaint_lang lang=String::UL_UNSPECIFIED,
78: bool origins_mode=false);
1.9 paf 79:
1.21 paf 80: /// VString: $method
1.9 paf 81: Value *get_element(const String& name) {
1.21 paf 82: // $method
1.43 ! paf 83: if(Value *result=VStateless_string_object::get_element(name))
1.9 paf 84: return result;
85:
86: // bad $string.field
1.36 parser 87: bark("(%s) does not have fields",
88: "%s method not found", &name); return 0;
1.9 paf 89: }
1.12 paf 90:
91: protected: // VAliased
92:
1.15 paf 93: /// disable .CLASS element. @see VAliased::get_element
1.19 paf 94: bool hide_class() { return true; }
1.1 paf 95:
96: public: // usage
97:
1.43 ! paf 98: /* VString(Pool& apool) : VStateless_string_object(apool),
1.38 paf 99: fstring(new(apool) String(apool)) {
1.1 paf 100: }
1.43 ! paf 101: */
! 102: VString(const String& avalue) : VStateless_string_object(avalue.pool()),
1.38 paf 103: fstring(&avalue) {
1.1 paf 104: }
105:
1.38 paf 106: const String& string() { return *fstring; }
107: void set_string(const String& astring) { fstring=&astring; }
1.1 paf 108:
109: private:
1.38 paf 110: const String *fstring;
1.1 paf 111:
112: };
113:
114: #endif
E-mail: