#pragma once
#include "XPathNodeSet.h"
namespace WebCore {
namespace XPath {
class Value {
public:
enum Type { NodeSetValue, BooleanValue, NumberValue, StringValue };
Value(bool value) : m_type(BooleanValue), m_bool(value) { }
Value(unsigned value) : m_type(NumberValue), m_number(value) { }
Value(double value) : m_type(NumberValue), m_number(value) { }
Value(const String& value) : m_type(StringValue), m_data(Data::create(value)) { }
Value(const char* value) : m_type(StringValue), m_data(Data::create(value)) { }
explicit Value(NodeSet&& value)
: m_type(NodeSetValue), m_data(Data::create(WTFMove(value)))
{ }
explicit Value(Node* value)
: m_type(NodeSetValue), m_data(Data::create(value))
{ }
explicit Value(RefPtr<Node>&& value)
: m_type(NodeSetValue), m_data(Data::create(WTFMove(value)))
{ }
Type type() const { return m_type; }
bool isNodeSet() const { return m_type == NodeSetValue; }
bool isBoolean() const { return m_type == BooleanValue; }
bool isNumber() const { return m_type == NumberValue; }
bool isString() const { return m_type == StringValue; }
const NodeSet& toNodeSet() const;
bool toBoolean() const;
double toNumber() const;
String toString() const;
NodeSet& modifiableNodeSet();
private:
Value(void*) = delete;
struct Data : public RefCounted<Data> {
static Ref<Data> create() { return adoptRef(*new Data); }
static Ref<Data> create(const String& string) { return adoptRef(*new Data(string)); }
static Ref<Data> create(NodeSet&& nodeSet) { return adoptRef(*new Data(WTFMove(nodeSet))); }
static Ref<Data> create(RefPtr<Node>&& node) { return adoptRef(*new Data(WTFMove(node))); }
String string;
NodeSet nodeSet;
private:
Data() { }
explicit Data(const String& string)
: string(string)
{ }
explicit Data(NodeSet&& nodeSet)
: nodeSet(WTFMove(nodeSet))
{ }
explicit Data(RefPtr<Node>&& node)
: nodeSet(WTFMove(node))
{ }
};
Type m_type;
bool m_bool;
double m_number;
RefPtr<Data> m_data;
};
} }