//  -*- c++ -*-

#include <kdebug.h>
#include "value.h"

namespace XPath {

//
// Value
//

Value::Value( const Value &res )
    : XPathNode( res )
{
    tp = res.tp;
}

Exception Value::toException()
{
    if ( tp == ValueException )
	return *(static_cast<Exception *>(this));
    else
	return Exception();
}

NodeSet Value::toNodeSet()
{
    if ( tp == ValueNodeSet )
	return *(static_cast<NodeSet *>(this));
    else
	return NodeSet();
}

Boolean Value::toBoolean()
{
    if ( tp == ValueBoolean )
	return *(static_cast<Boolean *>(this));
    else
	return Boolean();
}

Number Value::toNumber()
{
    if ( tp == ValueNumber )
	return *(static_cast<Number *>(this));
    else
	return Number();
}

String Value::toString()
{
    if ( tp == ValueString )
	return *(static_cast<String *>(this));
    else
	return String();
}

QString Value::qstring() const
{
    QString s;

    switch ( tp ) {
	case ValueNull:
	    s = QString("Null");
	    break;
	case ValueException:
	    s = QString("Exception");
	    break;
	case ValueNodeSet:
	    s = QString("NodeSet");
	    break;
	case ValueBoolean:
	    s = QString("Boolean");
	    break;
	case ValueNumber:
	    s = QString("Number");
	    break;
	case ValueString:
	    s = QString("String");
	    break;
	default:
	    s = QString("Unknown");
	    break;
    }

    return s;
}

//
// Exception
//

Exception::Exception()
    : Value(ValueException)
{
}

Exception::Exception( const Exception &x )
    : Value(ValueException), msg(x.msg)
{
}

Exception::Exception( const QString &m )
    : Value(ValueException), msg(m)
{
}

Exception::~Exception()
{
}

QString Exception::qstring() const
{
    return QString("Exception '%1'").arg(msg);
}

//
// NodeSet
//

NodeSet::NodeSet()
    : Value( ValueNodeSet )
{
}

NodeSet::NodeSet( const NodeSet &ns )
    : Value( ValueNodeSet )
{
    val = ns.val;
}

NodeSet::~NodeSet()
{
}

//
// Boolean
//
Boolean::Boolean()
    : Value( ValueBoolean ), val(false)
{
}

Boolean::Boolean( const Boolean &b )
    : Value( ValueBoolean ), val(b.val)
{
}

Boolean::~Boolean()
{
}

QString Boolean::qstring() const
{
    return QString("Boolean %1").arg(val ? "true" : "false");
}

//
// Number
//

Number::~Number()
{
}

QString Number::qstring() const
{
    return QString("Number %1").arg(val);
}


//
// String
//

QString String::qstring() const
{
    if ( val.isNull() )
	return QString("String <null>");
    else
	return QString("String '%1'").arg(val);
}

}; // namespace XPath

// Local Variables:
// c-basic-offset: 4
// End:
