#ifndef XPathValue_h
#define XPathValue_h
#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(WTF::move(value))) { }
explicit Value(Node* value) : m_type(NodeSetValue), m_data(Data::create(value)) { }
explicit Value(PassRefPtr<Node> value) : m_type(NodeSetValue), m_data(Data::create(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 PassRefPtr<Data> create() { return adoptRef(new Data); }
static PassRefPtr<Data> create(const String& string) { return adoptRef(new Data(string)); }
static PassRefPtr<Data> create(NodeSet nodeSet) { return adoptRef(new Data(WTF::move(nodeSet))); }
static PassRefPtr<Data> create(PassRefPtr<Node> node) { return adoptRef(new Data(node)); }
String string;
NodeSet nodeSet;
private:
Data() { }
explicit Data(const String& string) : string(string) { }
explicit Data(NodeSet nodeSet) : nodeSet(WTF::move(nodeSet)) { }
explicit Data(PassRefPtr<Node> node) : nodeSet(node) { }
};
Type m_type;
bool m_bool;
double m_number;
RefPtr<Data> m_data;
};
}
}
#endif // XPath_Value_H