15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright 2005 Frerich Raabe <raabe@kde.org>
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2006 Apple Computer, Inc.
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met:
802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch *
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer.
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer in the
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    documentation and/or other materials provided with the distribution.
1402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch *
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef XPathValue_h
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define XPathValue_h
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/xml/XPathNodeSet.h"
31e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#include "wtf/text/WTFString.h"
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
355d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)namespace XPath {
365d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
37197021e6b966cfb06891637935ef33fff06433d1Ben Murdochstruct EvaluationContext;
38197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
395d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)class ValueData : public RefCountedWillBeGarbageCollectedFinalized<ValueData> {
405d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)public:
415d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    static PassRefPtrWillBeRawPtr<ValueData> create() { return adoptRefWillBeNoop(new ValueData); }
425d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    static PassRefPtrWillBeRawPtr<ValueData> create(const NodeSet& nodeSet) { return adoptRefWillBeNoop(new ValueData(nodeSet)); }
435d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    static PassRefPtrWillBeRawPtr<ValueData> create(PassOwnPtrWillBeRawPtr<NodeSet> nodeSet) { return adoptRefWillBeNoop(new ValueData(nodeSet)); }
445d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    static PassRefPtrWillBeRawPtr<ValueData> create(const String& string) { return adoptRefWillBeNoop(new ValueData(string)); }
455d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    void trace(Visitor*);
465d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    NodeSet& nodeSet() { return *m_nodeSet; }
475d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
485d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    String m_string;
495d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
505d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)private:
515d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    ValueData() : m_nodeSet(NodeSet::create()) { }
525d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    explicit ValueData(const NodeSet& nodeSet) : m_nodeSet(NodeSet::create(nodeSet)) { }
535d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    explicit ValueData(PassOwnPtrWillBeRawPtr<NodeSet> nodeSet) : m_nodeSet(nodeSet) { }
545d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    explicit ValueData(const String& string) : m_string(string), m_nodeSet(NodeSet::create()) { }
555d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
565d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    OwnPtrWillBeMember<NodeSet> m_nodeSet;
575d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)};
585d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
595d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)// Copying Value objects makes their data partially shared, so care has to be taken when dealing with copies.
605d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)class Value {
615d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    DISALLOW_ALLOCATION();
625d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)public:
635d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    enum Type { NodeSetValue, BooleanValue, NumberValue, StringValue };
645d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
655d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    Value(unsigned value) : m_type(NumberValue), m_bool(false), m_number(value) { }
665d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    Value(unsigned long value) : m_type(NumberValue), m_bool(false), m_number(value) { }
675d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    Value(double value) : m_type(NumberValue), m_bool(false), m_number(value) { }
685d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
695d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    Value(const char* value) : m_type(StringValue), m_bool(false), m_number(0), m_data(ValueData::create(value)) { }
705d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    Value(const String& value) : m_type(StringValue), m_bool(false), m_number(0), m_data(ValueData::create(value)) { }
715d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    Value(const NodeSet& value) : m_type(NodeSetValue), m_bool(false), m_number(0), m_data(ValueData::create(value)) { }
725d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    Value(Node* value) : m_type(NodeSetValue), m_bool(false), m_number(0), m_data(ValueData::create()) { m_data->nodeSet().append(value); }
735d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    void trace(Visitor*);
745d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
755d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    // This is needed to safely implement constructing from bool - with normal
765d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    // function overloading, any pointer type would match.
775d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    template<typename T> Value(T);
785d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
795d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    static const struct AdoptTag { } adopt;
805d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    Value(PassOwnPtrWillBeRawPtr<NodeSet> value, const AdoptTag&) : m_type(NodeSetValue), m_bool(false), m_number(0),  m_data(ValueData::create(value)) { }
815d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
825d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    Type type() const { return m_type; }
835d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
845d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    bool isNodeSet() const { return m_type == NodeSetValue; }
855d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    bool isBoolean() const { return m_type == BooleanValue; }
865d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    bool isNumber() const { return m_type == NumberValue; }
875d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    bool isString() const { return m_type == StringValue; }
885d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
89197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // If this is called during XPathExpression::evaluate(), EvaluationContext
90197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // should be passed.
91197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    const NodeSet& toNodeSet(EvaluationContext*) const;
92197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    NodeSet& modifiableNodeSet(EvaluationContext&);
935d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    bool toBoolean() const;
945d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    double toNumber() const;
955d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    String toString() const;
965d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
975d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)private:
985d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    Type m_type;
995d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    bool m_bool;
1005d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    double m_number;
1015d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    RefPtrWillBeMember<ValueData> m_data;
1025d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)};
1035d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
1045d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)template<>
1055d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)inline Value::Value(bool value)
1065d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    : m_type(BooleanValue)
1075d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    , m_bool(value)
1085d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    , m_number(0)
1095d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles){
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1125d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)}
1135d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
1145d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)}
1155d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#endif // XPathValue_h
116