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

📄 interval.cpp

📁 粗糙集应用软件
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//-------------------------------------------------------------------
// Author........: Aleksander 豩rn
// Date..........:
// Description...:
// Revisions.....:
//===================================================================

#include <stdafx.h> // Precompiled headers.
#include <copyright.h>

#include <kernel/basic/interval.h>
#include <kernel/basic/string.h>
#include <kernel/basic/undefined.h>
#include <kernel/basic/message.h>

#include <kernel/system/float.h>
#include <kernel/system/math.h>

//-------------------------------------------------------------------
// Methods for class Interval.
//===================================================================

//-------------------------------------------------------------------
// Constructors/destructor.
//===================================================================

//-------------------------------------------------------------------
// Method........: Constructor
// Author........: Aleksander 豩rn
// Date..........:
// Description...:
// Comments......:
// Revisions.....:
//===================================================================

Interval::Interval() {
	MakeInterval(FromInclude(), Undefined::Float(), Undefined::Float(), To());
}

//-------------------------------------------------------------------
// Method........: Constructor
// Author........: Aleksander 豩rn
// Date..........:
// Description...:
// Comments......:
// Revisions.....:
//===================================================================

Interval::Interval(const Interval &in) {
	MakeInterval(in.GetLowerDelimiter(), in.GetLowerValue(), in.GetUpperValue(), in.GetUpperDelimiter());
}

//-------------------------------------------------------------------
// Method........: Constructor
// Author........: Aleksander 豩rn
// Date..........:
// Description...:
// Comments......:
// Revisions.....:
//===================================================================

Interval::Interval(char ldelimiter, float lvalue, float uvalue, char udelimiter) {
	MakeInterval(ldelimiter, lvalue, uvalue, udelimiter);
}

//-------------------------------------------------------------------
// Method........: Constructor
// Author........: Aleksander 豩rn
// Date..........:
// Description...:
// Comments......: If the string does not define a valid interval,
//                 the interval defaults to an invalid range.
// Revisions.....:
//===================================================================

Interval::Interval(const String &interval) {

	String copy = interval;

	// Allow surrounding whitespace.
	copy.Trim(" \t\n");

	// Extract delimiters.
	char ldelimiter = copy.First();
	char udelimiter = copy.Last();

	// Initialize values to define an invalid range.
	float lvalue = 1.0;
	float uvalue = 0.0;

	int index = copy.Search(1, Separator());

	// Extract values, if possible.
	if (index != -1) {

		String lstring = copy.GetSubstring(1, index - 1);
		String ustring = copy.GetSubstring(index + 1, copy.GetLength() - index - 2);

		// Allow surrounding whitespace.
		lstring.Trim(" \t\n");
		ustring.Trim(" \t\n");

		if (lstring == Infinity())
			lvalue = -FLT_MAX;
		else if (lstring.IsFloat())
			lvalue = lstring.GetFloat();

		if (ustring == Infinity())
			uvalue = FLT_MAX;
		else if (ustring.IsFloat())
			uvalue = ustring.GetFloat();

	}

	MakeInterval(ldelimiter, lvalue, uvalue, udelimiter);

}

//-------------------------------------------------------------------
// Method........: Destructor
// Author........: Aleksander 豩rn
// Date..........:
// Description...:
// Comments......:
// Revisions.....:
//===================================================================

Interval::~Interval() {
}

//-------------------------------------------------------------------
// Mutators.
//===================================================================

//-------------------------------------------------------------------
// Method........: SetLowerDelimiter/SetUpperDelimiter
// Author........: Aleksander 豩rn
// Date..........:
// Description...:
// Comments......:
// Revisions.....:
//===================================================================

bool
Interval::SetLowerDelimiter(char delimiter) {
	ldelimiter_ = delimiter;
	return (delimiter == From() || delimiter == FromInclude());
}

bool
Interval::SetUpperDelimiter(char delimiter) {
	udelimiter_ = delimiter;
	return (delimiter == To() || delimiter == ToInclude());
}

//-------------------------------------------------------------------
// Method........: SetLowerValue/SetUpperValue
// Author........: Aleksander 豩rn
// Date..........:
// Description...:
// Comments......: Undefined::Float() is interpreted as +/- infinity.
// Revisions.....:
//===================================================================

bool
Interval::SetLowerValue(float value) {
	if (value == Undefined::Float())
		value = -FLT_MAX;
	lvalue_ = value;
	return true;
}

bool
Interval::SetUpperValue(float value) {
	if (value == Undefined::Float())
		value = FLT_MAX;
	uvalue_ = value;
	return true;
}

//-------------------------------------------------------------------
// Method........: Merge
// Author........: Aleksander 豩rn
// Date..........:
// Description...:
// Comments......: Interval validity assumed. Not thoroughly debugged.
// Revisions.....:
//===================================================================

bool
Interval::Merge(const Interval &interval) {

	// Determine new range.
	float lvalue = (GetLowerValue() < interval.GetLowerValue()) ? GetLowerValue() : interval.GetLowerValue();
	float uvalue = (GetUpperValue() > interval.GetUpperValue()) ? GetUpperValue() : interval.GetUpperValue();

	char ldelimiter = GetLowerDelimiter();
	char udelimiter = GetUpperDelimiter();

	// New delimiters?
	if (lvalue == interval.GetLowerValue() && interval.GetLowerDelimiter() == FromInclude())
		ldelimiter = FromInclude();

	if (uvalue == interval.GetUpperValue() && interval.GetUpperDelimiter() == ToInclude())
		udelimiter = ToInclude();

	return MakeInterval(ldelimiter, lvalue, uvalue, udelimiter);

}

//-------------------------------------------------------------------
// Property querying methods.
//===================================================================

//-------------------------------------------------------------------
// Method........: IsValid
// Author........: Aleksander 豩rn
// Date..........:
// Description...: Returns true if the interval defines a valid range.
// Comments......:
// Revisions.....:
//===================================================================

bool
Interval::IsValid() const {

	// Is the lvalue delimiter valid?
	if (GetLowerDelimiter() != From() && GetLowerDelimiter() != FromInclude())
		return false;

	// Is the uvalue delimiter valid?
	if (GetUpperDelimiter() != To() && GetUpperDelimiter() != ToInclude())
		return false;

	// Is the range clearly invalid?
	if (GetLowerValue() > GetUpperValue())
		return false;

	// The range may have degenerated into a point.
	if (GetLowerValue() == GetUpperValue()) {
		if (GetLowerDelimiter() != FromInclude() || GetUpperDelimiter() != ToInclude())
			return false;
	}

	return true;

}

//-------------------------------------------------------------------
// Method........: IsFinite/IsInfinite
// Author........: Aleksander 豩rn
// Date..........:
// Description...: Returns true if the interval is finite/infinite.
// Comments......: Interval validity assumed.
// Revisions.....:
//===================================================================

bool
Interval::IsFinite() const {
	return (GetLength() != FLT_MAX);
}

bool
Interval::IsInfinite() const {
	return !IsFinite();
}

//-------------------------------------------------------------------
// Method........: IsAbove
// Author........: Aleksander 豩rn
// Date..........:
// Description...: Returns true if this interval is "above" the input
//                 interval.
// Comments......: Interval validity assumed. Not thoroughly debugged.
// Revisions.....:
//===================================================================

bool
Interval::IsAbove(const Interval &interval) const {
	return ((GetLowerValue() > interval.GetUpperValue()) ||
		      (GetLowerValue() == interval.GetUpperValue() && !(GetLowerDelimiter() == FromInclude() && interval.GetUpperDelimiter() == ToInclude())));
}

//-------------------------------------------------------------------

⌨️ 快捷键说明

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