#pragma once

// [cfg-var.h]: configurable variable class 'cfgVariable'
//
// -------------------------------------------------------------------------------------------- //

#define _CRT_SECURE_NO_WARNINGS
#include <string>

namespace nse
{
	class cfgVariable {
	public:

		enum VAR_TYPE { IS_UNDEF, IS_INT, IS_DOUBLE, IS_STRING, IS_BOOLEAN };

		cfgVariable();
		cfgVariable(const char* value);
		cfgVariable(const char* name,
			const char* value);
		~cfgVariable();

		cfgVariable(const cfgVariable& var);
		const cfgVariable& operator=(cfgVariable var);
		void swap(cfgVariable& a);

		cfgVariable& operator+=(const cfgVariable& var);
		cfgVariable& operator-=(const cfgVariable& var);
		cfgVariable& operator*=(const cfgVariable& var);
		cfgVariable& operator/=(const cfgVariable& var);
		cfgVariable& operator%=(const cfgVariable& var);
		cfgVariable& operator^=(const cfgVariable& var);

		const cfgVariable operator+(const cfgVariable& var) const;
		const cfgVariable operator-(const cfgVariable& var) const;
		const cfgVariable operator*(const cfgVariable& var) const;
		const cfgVariable operator/(const cfgVariable& var) const;
		const cfgVariable operator%(const cfgVariable& var) const;
		const cfgVariable operator^(const cfgVariable& var) const;

		const cfgVariable operator-() const;
		const cfgVariable operator+() const;

		void set(const char* name, const char* value);
		void change_name(const char* name);
		// name == NULL - not changing variable name

		void clear();

		int get_value(int* value) const;
		int get_value(float* value) const;
		int get_value(double* value) const;
		int get_value(char** value) const;
		int get_value(std::string& value) const;
		int get_value(bool* value) const;

		VAR_TYPE get_type() const;

		bool is_varname(const char* ex_name) const;
		bool is_valid_name() const;	// name not empty string
		bool is_valid_type() const;	// type != IS_UNDEF
		bool is_eq_name(const cfgVariable& var) const;

		void print() const;

	private:

		char* name;		// default name = empty string = "\0";
						// always keeping name as string != NULL
		VAR_TYPE type;

		int eint;
		double edouble;
		char *estring;
		bool ebool;

		size_t name_memsize;	// memory handler for name string
	};
}