File:  [parser3project] / parser3 / src / types / pa_vobject.h
Revision 1.73: download - view: text, annotated - select for diffs - revision graph
Sat Apr 25 13:38:46 2026 UTC (7 weeks, 5 days ago) by moko
Branches: MAIN
CVS tags: HEAD
Copyright year updated, websites links changed to https://

/**	@file
	Parser: @b object class decl.

	Copyright (c) 2001-2026 Art. Lebedev Studio (https://www.artlebedev.com)
	Authors: Konstantin Morshnev <moko@design.ru>, Alexandr Petrosian <paf@design.ru>
*/

#ifndef PA_VOBJECT_H
#define PA_VOBJECT_H

#define IDENT_PA_VOBJECT_H "$Id: pa_vobject.h,v 1.73 2026/04/25 13:38:46 moko Exp $"

// includes

#include "pa_vjunction.h"
#include "pa_vclass.h"
#include "pa_vstateless_object.h"
#include "pa_vfile.h"

// defines

#define BASE_NAME "BASE"

/**	parser class instance, stores 
	- class VObject::fclass;
	- fields VObject::ffields (dynamic, not static, which are stored in class).
*/
class VObject: public Value {

	VClass& fclass;
	HashStringValue ffields;

	enum State {
		IS_GETTER_ACTIVE = 0x01,
		IS_SETTER_ACTIVE = 0x02
	};

	int state; // default setter & getter state

public: // Value
	
	const char* type() const { return fclass.type(); }
	override bool is(const char* atype);

	/// VObject: fclass
	override VStateless_class *get_class() { return &fclass; }

	override bool is_defined() const;
	override Value& as_expr_result();
	override int as_int() const;
	override double as_double() const;
	override bool as_bool() const;
	override VFile* as_vfile();
	
	override HashStringValue* get_hash();
	override Table *get_table();
	override HashStringValue* get_fields() { return &ffields; }
	override HashStringValue* get_fields_reference() { return &ffields; }

	override Value* get_element(const String& aname);
	override const VJunction* put_element(const String& name, Value* value);
#ifdef FEATURE_GET_ELEMENT4CALL
	override Value* get_element4call(const String& aname);
#endif

	override const String* get_json_string(Json_options& options);

	/// VObject default getter & setter support
	override void enable_default_getter(){ state |= IS_GETTER_ACTIVE; }
	override void enable_default_setter(){ if(fclass.has_default_setter()) state |= IS_SETTER_ACTIVE; }
	override void disable_default_getter(){ state &= ~IS_GETTER_ACTIVE; }
	override void disable_default_setter(){ state &= ~IS_SETTER_ACTIVE; }
	override bool is_enabled_default_getter(){ return (state & IS_GETTER_ACTIVE) > 0; }
	override bool is_enabled_default_setter(){ return (state & IS_SETTER_ACTIVE) > 0; }

public: // creation

	VObject(VClass& aclass): fclass(aclass), state(IS_GETTER_ACTIVE){}

private:

	Value* get_scalar_value(const char* as_something) const;
};

///	Auto-objects used for temporarily disabling setter/getter

class Temp_disable_default_getter {
	Value& fwhere;
public:
	Temp_disable_default_getter(Value& awhere) : fwhere(awhere) {
		fwhere.disable_default_getter();
	}
	~Temp_disable_default_getter() { 
		fwhere.enable_default_getter();
	}
};

class Temp_disable_default_setter {
	Value& fwhere;
public:
	Temp_disable_default_setter(Value& awhere) : fwhere(awhere) {
		fwhere.disable_default_setter();
	}
	~Temp_disable_default_setter() { 
		fwhere.enable_default_setter();
	}
};

#endif

E-mail: