⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 result.h

📁 由一个古老的BASIC解释器改进而成, 保留了ANSI C固有的艺术美感.
💻 H
字号:
// result.h

#ifndef RESULT_H_
#define RESULT_H_

#ifdef __BORLANDC__
#pragma warn -inl
#endif

#include "var.h"

class BlResult {
public:
	BlResult () :
		vartype (VarUndef)
	{ }
	BlResult (BlNumber num) :
		vartype (VarNumber),
		varnumber (num)
	{ }
	BlResult (BlInteger inum) :
		vartype (VarInteger),
		varinteger (inum)
	{ }
	BlResult (const BlResult & br) :
		vartype (br.vartype)
	{
		switch (vartype)
		{
		case VarString:
			varstr= br.varstr;
			break;
		case VarNumber:
			varnumber= br.varnumber;
			break;
		case VarInteger:
			varinteger= br.varinteger;
			break;
		default:
			;
		}
	}
	VarType type () const { return vartype; }
	bool is_numeric () const { return is_numeric_type (vartype); }
	const std::string & str () const
	{
        	if (vartype != VarString)
        		throw ErrMismatch;
		return varstr;
	}
        std::string & str ()
        {
        	if (vartype != VarString)
        		throw ErrMismatch;
                return varstr;
        }
	BlNumber number () const
	{
		switch (vartype)
		{
		case VarNumber:
			return varnumber;
		case VarInteger:
			return varinteger;
		case VarString:
			throw ErrMismatch;
		default:
			throw ErrBlassicInternal;
		}
	}
	BlInteger integer () const
	{
		switch (vartype)
		{
		case VarNumber:
			return BlInteger (varnumber);
		case VarInteger:
			return varinteger;
		case VarString:
			throw ErrMismatch;
		default:
			throw ErrBlassicInternal;
		}
	}
	bool tobool () const
	{
		switch (vartype)
		{
		case VarNumber:
			return varnumber != 0.0;
		case VarInteger:
			return varinteger != 0;
		case VarString:
			throw ErrMismatch;
		default:
			throw ErrBlassicInternal;
		}
	}
	void integertonumber ()
	{
		vartype= VarNumber;
		varnumber= varinteger;
	}
	void numbertointeger ()
	{
		vartype= VarInteger;
		varinteger= BlInteger (varnumber);
	}
	/*BlResult & */ void operator = (const std::string & nstr)
	{
		vartype= VarString;
		varstr= nstr;
		//return * this;
	}
	/*BlResult & */ void operator = (BlNumber num)
	{
		vartype= VarNumber;
		varnumber= num;
		//varstr.erase ();
		//return * this;
	}
	/*BlResult & */ void operator = (BlInteger inum)
	{
		vartype= VarInteger;
		varinteger= inum;
		//varstr.erase ();
		//return * this;
	}
	/*BlResult & */ void operator = (int inum)
	{
		vartype= VarInteger;
		varinteger= inum;
		//varstr.erase ();
		//return * this;
	}
	/*BlResult & */ void operator = (size_t inum)
	{
		vartype= VarInteger;
		varinteger= inum;
		//varstr.erase ();
		//return * this;
	}
	/*BlResult & */ void operator += (const BlResult & br)
	{
		switch (vartype)
		{
		case VarString:
			varstr+= br.str ();
			break;
		case VarNumber:
			varnumber+= br.number ();
			break;
		case VarInteger:
			switch (br.vartype)
			{
			case VarInteger:
				varinteger+= br.integer ();
				break;
			default:
				integertonumber ();
				varnumber+= br.number ();
			}
			break;
		default:
			throw ErrBlassicInternal;
		}
		//return * this;
	}
	/*BlResult & */ void operator -= (const BlResult & br)
	{
		switch (vartype)
		{
		case VarNumber:
			varnumber-= br.number ();
			break;
		case VarInteger:
			switch (br.vartype)
			{
			case VarInteger:
				varinteger-= br.integer ();
				break;
			default:
				vartype= VarNumber;
				varnumber= varinteger;
				varnumber-= br.number ();
			}
			break;
		case VarString:
			throw ErrMismatch;
		default:
			throw ErrBlassicInternal;
		}
		//return * this;
	}
	/*BlResult & */ void operator *= (const BlResult & br)
	{
		switch (vartype)
		{
		case VarNumber:
			varnumber*= br.number ();
			break;
		case VarInteger:
			switch (br.vartype)
			{
			case VarInteger:
				varinteger*= br.integer ();
				break;
			default:
				integertonumber ();
				varnumber*= br.number ();
			}
			break;
		case VarString:
			throw ErrMismatch;
		default:
			throw ErrBlassicInternal;
		}
		//return * this;
	}
	/*BlResult & */ void operator /= (const BlResult & br)
	{
		switch (vartype)
		{
		case VarInteger:
			integertonumber ();
		case VarNumber:
			{
				BlNumber n= br.number ();
				if (n == 0)
					throw ErrDivZero;
				varnumber/= n;
			}
			break;
		case VarString:
			throw ErrMismatch;
		default:
			throw ErrBlassicInternal;
		}
		//return * this;
	}
	BlResult operator - ()
	{
		switch (vartype)
		{
		case VarNumber:
			return BlResult (-varnumber);
		case VarInteger:
			return BlResult (-varinteger);
		case VarString:
			throw ErrMismatch;
		default:
			throw ErrBlassicInternal;
		}
	}
	/*BlResult & */ void operator %= (const BlResult & br)
	{
		switch (vartype)
		{
		case VarInteger:
			break;
		case VarNumber:
			numbertointeger ();
			break;
		case VarString:
			throw ErrMismatch;
		default:
			throw ErrBlassicInternal;
		}
		BlInteger r= br.integer ();
		if (r == 0)
			throw ErrDivZero;
		varinteger= varinteger %  r;
		//return * this;
	}
	bool operator == (const BlResult & br)
	{
		switch (vartype)
		{
		case VarString:
			return varstr == br.str ();
		case VarNumber:
			return varnumber == br.number ();
		case VarInteger:
			switch (br.vartype)
			{
			case VarInteger:
				return varinteger == br.varinteger;
			case VarNumber:
				return varinteger == br.varnumber;
			case VarString:
				throw ErrMismatch;
			default:
				throw ErrBlassicInternal;
			}
		default:
			throw ErrBlassicInternal;
		}
	}
	bool operator != (const BlResult & br)
	{
		return ! operator == (br);
	}
	bool operator < (const BlResult & br)
	{
		switch (vartype)
		{
		case VarString:
			return varstr < br.str ();
		case VarNumber:
			return varnumber < br.number ();
		case VarInteger:
			return number () < br.number ();
		default:
			throw ErrBlassicInternal;
		}
	}
	bool operator <= (const BlResult & br)
	{
		switch (vartype)
		{
		case VarString:
			return varstr <= br.str ();
		case VarNumber:
			return varnumber <= br.number ();
		case VarInteger:
			return number () <= br.number ();
		default:
			throw ErrBlassicInternal;
		}
	}
	bool operator > (const BlResult & br)
	{
		return ! operator <= (br);
	}
	bool operator >= (const BlResult & br)
	{
		return ! operator < (br);
	}
private:
	VarType vartype;
	std::string varstr;
	union {
		BlNumber varnumber;
		BlInteger varinteger;
	};
};

#endif

// Fin de result.h

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -