* Copyright 2014, Rene Gollent, rene@gollent.com.
* Distributed under the terms of the MIT License.
*/
#include "ExpressionInfo.h"
#include "Type.h"
#include "Value.h"
#include "ValueNode.h"
ExpressionResult::ExpressionResult()
:
fResultKind(EXPRESSION_RESULT_KIND_UNKNOWN),
fPrimitiveValue(NULL),
fValueNodeValue(NULL),
fTypeResult(NULL)
{
}
ExpressionResult::~ExpressionResult()
{
if (fPrimitiveValue != NULL)
fPrimitiveValue->ReleaseReference();
if (fValueNodeValue != NULL)
fValueNodeValue->ReleaseReference();
if (fTypeResult != NULL)
fTypeResult->ReleaseReference();
}
void
ExpressionResult::SetToPrimitive(Value* value)
{
_Unset();
fPrimitiveValue = value;
if (fPrimitiveValue != NULL) {
fPrimitiveValue->AcquireReference();
fResultKind = EXPRESSION_RESULT_KIND_PRIMITIVE;
}
}
void
ExpressionResult::SetToValueNode(ValueNodeChild* child)
{
_Unset();
fValueNodeValue = child;
if (fValueNodeValue != NULL) {
fValueNodeValue->AcquireReference();
fResultKind = EXPRESSION_RESULT_KIND_VALUE_NODE;
}
ValueNode* node = child->Node();
if (node == NULL)
return;
fPrimitiveValue = node->GetValue();
if (fPrimitiveValue != NULL)
fPrimitiveValue->AcquireReference();
}
void
ExpressionResult::SetToType(Type* type)
{
_Unset();
fTypeResult = type;
if (fTypeResult != NULL) {
fTypeResult->AcquireReference();
fResultKind = EXPRESSION_RESULT_KIND_TYPE;
}
}
void
ExpressionResult::_Unset()
{
if (fPrimitiveValue != NULL) {
fPrimitiveValue->ReleaseReference();
fPrimitiveValue = NULL;
}
if (fValueNodeValue != NULL) {
fValueNodeValue->ReleaseReference();
fValueNodeValue = NULL;
}
if (fTypeResult != NULL) {
fTypeResult->ReleaseReference();
fTypeResult = NULL;
}
fResultKind = EXPRESSION_RESULT_KIND_UNKNOWN;
}
ExpressionInfo::ExpressionInfo()
:
fExpression()
{
}
ExpressionInfo::ExpressionInfo(const ExpressionInfo& other)
:
fExpression(other.fExpression)
{
}
ExpressionInfo::~ExpressionInfo()
{
}
ExpressionInfo::ExpressionInfo(const BString& expression)
:
fExpression(expression)
{
}
void
ExpressionInfo::SetTo(const BString& expression)
{
fExpression = expression;
}
void
ExpressionInfo::AddListener(Listener* listener)
{
fListeners.Add(listener);
}
void
ExpressionInfo::RemoveListener(Listener* listener)
{
fListeners.Remove(listener);
}
void
ExpressionInfo::NotifyExpressionEvaluated(status_t result,
ExpressionResult* value)
{
for (ListenerList::Iterator it = fListeners.GetIterator();
Listener* listener = it.Next();) {
listener->ExpressionEvaluated(this, result, value);
}
}
ExpressionInfo::Listener::~Listener()
{
}