#ifndef __TRIGGERSTATUS_H__
#define __TRIGGERSTATUS_H__
/*
* 对enum class的扩展，在对其进行赋值的时候，如果值变了就触发trigger，否则就置trigger=FALSE
* 适用于多次对某个状态赋值，但只需要第一次做某些处理的场景，典型的就是step condition第一次满足的时候打印日志，但之后就不再打了
*/
template <class T>
class TriggerStatus {
private:
	unsigned char _trigger =0;
public:
	T value;
	void clearTrigger() {
		_trigger = 0;
	}
	unsigned char trigger() {
		if (_trigger <= 0) {
			return 0;
		}
		else {
			return 1;
		}
	}
	TriggerStatus& operator=(const T& t) {
		if (_trigger < 0) {
			_trigger = 1;
			value = t;
			return *this;
		}
		if (value == t) {
			_trigger = 0;
		}
		else {
			value = t;
			_trigger = 1;
		}
		return *this;
	}
	TriggerStatus& operator=(const TriggerStatus& ts) {
		if (_trigger < 0) {
			_trigger = 1;
			value = ts.value;
			return *this;
		}
		if (value == ts.value) {
			_trigger = 0;
		}
		else {
			value = ts.value;
			_trigger = 1;
		}
		return *this;
	}
	unsigned char operator==(const TriggerStatus& ts) {
		if (value == ts.value) {
			return 1;
		}
		else {
			return 0;
		}
	}
	unsigned char operator!=(const TriggerStatus& ts) {
		if (value != ts.value) {
			return 1;
		}
		else {
			return 0;
		}
	}
	unsigned char operator==(const T& t) {
		if (value == t) {
			return 1;
		}
		else {
			return 0;
		}
	}
	unsigned char operator!=(const T& t) {
		if (value != t) {
			return 1;
		}
		else {
			return 0;
		}
	}
	TriggerStatus(const T& t) {
		value = t;
		_trigger = 0;
	}
};
#endif
