diff options
author | Lars Knoll <lars.knoll@nokia.com> | 2009-03-23 09:34:13 (GMT) |
---|---|---|
committer | Simon Hausmann <simon.hausmann@nokia.com> | 2009-03-23 09:34:13 (GMT) |
commit | 67ad0519fd165acee4a4d2a94fa502e9e4847bd0 (patch) | |
tree | 1dbf50b3dff8d5ca7e9344733968c72704eb15ff /src/xmlpatterns/type | |
download | Qt-67ad0519fd165acee4a4d2a94fa502e9e4847bd0.zip Qt-67ad0519fd165acee4a4d2a94fa502e9e4847bd0.tar.gz Qt-67ad0519fd165acee4a4d2a94fa502e9e4847bd0.tar.bz2 |
Long live Qt!
Diffstat (limited to 'src/xmlpatterns/type')
75 files changed, 12130 insertions, 0 deletions
diff --git a/src/xmlpatterns/type/qabstractnodetest.cpp b/src/xmlpatterns/type/qabstractnodetest.cpp new file mode 100644 index 0000000..12860ca --- /dev/null +++ b/src/xmlpatterns/type/qabstractnodetest.cpp @@ -0,0 +1,78 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qabstractnodetest_p.h" + +QT_BEGIN_NAMESPACE + +using namespace QPatternist; + +AbstractNodeTest::AbstractNodeTest(const ItemType::Ptr &primaryType) : m_primaryType(primaryType) +{ + Q_ASSERT(m_primaryType); +} + +bool AbstractNodeTest::xdtTypeMatches(const ItemType::Ptr &other) const +{ + Q_ASSERT(other); + + if(other->isNodeType()) + { + if(*other == *this) + return true; + else + return xdtTypeMatches(other->xdtSuperType()); + } + else + return false; +} + +ItemType::Ptr AbstractNodeTest::atomizedType() const +{ + return m_primaryType->atomizedType(); +} + +ItemType::Ptr AbstractNodeTest::xdtSuperType() const +{ + return m_primaryType; +} + +QT_END_NAMESPACE diff --git a/src/xmlpatterns/type/qabstractnodetest_p.h b/src/xmlpatterns/type/qabstractnodetest_p.h new file mode 100644 index 0000000..c1abbb5 --- /dev/null +++ b/src/xmlpatterns/type/qabstractnodetest_p.h @@ -0,0 +1,87 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. + +#ifndef Patternist_AbstractNodeTest_H +#define Patternist_AbstractNodeTest_H + +#include "qanynodetype_p.h" + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +namespace QPatternist +{ + /** + * @short A name test that is of the type <tt>prefix:ncName</tt>. + * + * @ingroup Patternist_types + * @author Frans Englich <fenglich@trolltech.com> + */ + class AbstractNodeTest : public AnyNodeType + { + public: + AbstractNodeTest(const ItemType::Ptr &primaryType); + + virtual bool xdtTypeMatches(const ItemType::Ptr &other) const; + virtual ItemType::Ptr xdtSuperType() const; + virtual ItemType::Ptr atomizedType() const; + + protected: + const ItemType::Ptr m_primaryType; + }; +} + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif diff --git a/src/xmlpatterns/type/qanyitemtype.cpp b/src/xmlpatterns/type/qanyitemtype.cpp new file mode 100644 index 0000000..80b7010 --- /dev/null +++ b/src/xmlpatterns/type/qanyitemtype.cpp @@ -0,0 +1,90 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qatomictype_p.h" +#include "qbuiltintypes_p.h" + +#include "qanyitemtype_p.h" + +QT_BEGIN_NAMESPACE + +using namespace QPatternist; + +AnyItemType::AnyItemType() +{ +} + +bool AnyItemType::itemMatches(const Item &) const +{ + return true; +} + +bool AnyItemType::xdtTypeMatches(const ItemType::Ptr &) const +{ + return true; +} + +QString AnyItemType::displayName(const NamePool::Ptr &) const +{ + return QLatin1String("item()"); +} + +ItemType::Ptr AnyItemType::xdtSuperType() const +{ + return ItemType::Ptr(); +} + +bool AnyItemType::isNodeType() const +{ + return false; +} + +bool AnyItemType::isAtomicType() const +{ + return false; +} + +ItemType::Ptr AnyItemType::atomizedType() const +{ + return BuiltinTypes::xsAnyAtomicType; +} + +QT_END_NAMESPACE diff --git a/src/xmlpatterns/type/qanyitemtype_p.h b/src/xmlpatterns/type/qanyitemtype_p.h new file mode 100644 index 0000000..04f82b2 --- /dev/null +++ b/src/xmlpatterns/type/qanyitemtype_p.h @@ -0,0 +1,119 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. + +#ifndef Patternist_AnyItemType_H +#define Patternist_AnyItemType_H + +#include "qatomictype_p.h" + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +namespace QPatternist +{ + + /** + * @short Represents the <tt>item()</tt> item type. + * + * @ingroup Patternist_types + * @author Frans Englich <fenglich@trolltech.com> + */ + class AnyItemType : public ItemType + { + public: + /** + * @returns always "item()" + */ + virtual QString displayName(const NamePool::Ptr &np) const; + + /** + * @returns always @c true + */ + virtual bool itemMatches(const Item &item) const; + + /** + * @returns always 0, item() is the super type in the + * XPath Data Model hierarchy + */ + virtual ItemType::Ptr xdtSuperType() const; + + /** + * @returns always @c false + */ + virtual bool isNodeType() const; + + /** + * @returns always @c false + */ + virtual bool isAtomicType() const; + + /** + * @returns always @c true + */ + virtual bool xdtTypeMatches(const ItemType::Ptr &type) const; + + /** + * @returns xs:anyAtomicType + */ + virtual ItemType::Ptr atomizedType() const; + + protected: + friend class BuiltinTypes; + AnyItemType(); + }; +} + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif diff --git a/src/xmlpatterns/type/qanynodetype.cpp b/src/xmlpatterns/type/qanynodetype.cpp new file mode 100644 index 0000000..baf4226 --- /dev/null +++ b/src/xmlpatterns/type/qanynodetype.cpp @@ -0,0 +1,98 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qbuiltintypes_p.h" +#include "qitem_p.h" + +#include "qanynodetype_p.h" + +QT_BEGIN_NAMESPACE + +using namespace QPatternist; + +bool AnyNodeType::xdtTypeMatches(const ItemType::Ptr &other) const +{ + return other->isNodeType(); +} + +bool AnyNodeType::itemMatches(const Item &item) const +{ + return item.isNode(); +} + +ItemType::Ptr AnyNodeType::atomizedType() const +{ + return BuiltinTypes::xsAnyAtomicType; +} + +QString AnyNodeType::displayName(const NamePool::Ptr &) const +{ + return QLatin1String("node()"); +} + +ItemType::Ptr AnyNodeType::xdtSuperType() const +{ + return BuiltinTypes::item; +} + +bool AnyNodeType::isNodeType() const +{ + return true; +} + +bool AnyNodeType::isAtomicType() const +{ + return false; +} + +QXmlNodeModelIndex::NodeKind AnyNodeType::nodeKind() const +{ + /* node() is an abstract type, so we don't have a value for it in + * QXmlNodeModelIndex::NodeKind. */ + return QXmlNodeModelIndex::NodeKind(0); +} + +PatternPriority AnyNodeType::patternPriority() const +{ + return -0.5; +} + +QT_END_NAMESPACE diff --git a/src/xmlpatterns/type/qanynodetype_p.h b/src/xmlpatterns/type/qanynodetype_p.h new file mode 100644 index 0000000..f34b4a1 --- /dev/null +++ b/src/xmlpatterns/type/qanynodetype_p.h @@ -0,0 +1,113 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. + +#ifndef Patternist_AnyNodeType_H +#define Patternist_AnyNodeType_H + +#include "qatomictype_p.h" +#include "qitem_p.h" + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +namespace QPatternist +{ + /** + * @short Represents the <tt>node()</tt> item type. + * + * @ingroup Patternist_types + * @see BuiltinNodeType + * @author Frans Englich <fenglich@trolltech.com> + */ + class AnyNodeType : public ItemType + { + public: + + typedef QExplicitlySharedDataPointer<AnyNodeType> Ptr; + + virtual bool xdtTypeMatches(const ItemType::Ptr &other) const; + virtual bool itemMatches(const Item &item) const; + virtual QString displayName(const NamePool::Ptr &np) const; + + virtual ItemType::Ptr xdtSuperType() const; + + virtual bool isNodeType() const; + virtual bool isAtomicType() const; + + /** + * @see <a href="http://www.w3.org/TR/xpath-datamodel/#acc-summ-typed-value">XQuery 1.0 + * and XPath 2.0 Data Model, G.15 dm:typed-value Accessor</a> + */ + virtual ItemType::Ptr atomizedType() const; + + /** + * @returns the node kind this node ItemType tests for. If it matches any node, zero is returned. + */ + virtual QXmlNodeModelIndex::NodeKind nodeKind() const; + + virtual PatternPriority patternPriority() const; + + protected: + friend class BuiltinTypes; + + inline AnyNodeType() + { + } + + }; +} + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif diff --git a/src/xmlpatterns/type/qanysimpletype.cpp b/src/xmlpatterns/type/qanysimpletype.cpp new file mode 100644 index 0000000..c685d54 --- /dev/null +++ b/src/xmlpatterns/type/qanysimpletype.cpp @@ -0,0 +1,83 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qbuiltintypes_p.h" + +#include "qanysimpletype_p.h" + +QT_BEGIN_NAMESPACE + +using namespace QPatternist; + +AnySimpleType::AnySimpleType() +{ +} + +AnySimpleType::~AnySimpleType() +{ +} + +QXmlName AnySimpleType::name(const NamePool::Ptr &np) const +{ + return np->allocateQName(StandardNamespaces::xs, QLatin1String("anySimpleType")); +} + +QString AnySimpleType::displayName(const NamePool::Ptr &np) const +{ + return np->displayName(name(np)); +} + +SchemaType::Ptr AnySimpleType::wxsSuperType() const +{ + return BuiltinTypes::xsAnyType; +} + +SchemaType::TypeCategory AnySimpleType::category() const +{ + return None; +} + +SchemaType::DerivationMethod AnySimpleType::derivationMethod() const +{ + return DerivationRestriction; +} + +QT_END_NAMESPACE diff --git a/src/xmlpatterns/type/qanysimpletype_p.h b/src/xmlpatterns/type/qanysimpletype_p.h new file mode 100644 index 0000000..b91c7d0 --- /dev/null +++ b/src/xmlpatterns/type/qanysimpletype_p.h @@ -0,0 +1,118 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. + +#ifndef Patternist_AnySimpleType_H +#define Patternist_AnySimpleType_H + +#include "qanytype_p.h" + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +namespace QPatternist +{ + class AtomicType; + + /** + * @short Represents the @c xs:anySimpleType item type. + * + * @ingroup Patternist_types + * @see <a href="http://www.w3.org/TR/xmlschema-2/#dt-anySimpleType">XML Schema Part 2: + * Datatypes Second Edition, The simple ur-type definition</a> + * @author Frans Englich <fenglich@trolltech.com> + */ + class AnySimpleType : public AnyType + { + public: + friend class BuiltinTypes; + + virtual ~AnySimpleType(); + + virtual QXmlName name(const NamePool::Ptr &np) const; + + /** + * @returns always @c xs:anySimpleType + */ + virtual QString displayName(const NamePool::Ptr &np) const; + + /** + * @returns always BuiltinTypes::xsAnyType + */ + virtual SchemaType::Ptr wxsSuperType() const; + + /** + * xs:anySimpleType is the special "simple ur-type". Therefore this function + * returns SchemaType::None + * + * @returns SchemaType::None + */ + virtual TypeCategory category() const; + + /** + * The simple ur-type is a "special restriction of the ur-type definition", + * according to XML Schema Part 2: Datatypes Second Edition about xs:anySimpleType + * + * @returns DERIVATION_RESTRICTION + */ + virtual SchemaType::DerivationMethod derivationMethod() const; + + protected: + AnySimpleType(); + + }; +} + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif diff --git a/src/xmlpatterns/type/qanytype.cpp b/src/xmlpatterns/type/qanytype.cpp new file mode 100644 index 0000000..95ad2b3 --- /dev/null +++ b/src/xmlpatterns/type/qanytype.cpp @@ -0,0 +1,93 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qatomictype_p.h" + +#include "qanytype_p.h" + +QT_BEGIN_NAMESPACE + +using namespace QPatternist; + +AnyType::~AnyType() +{ +} + +bool AnyType::wxsTypeMatches(const SchemaType::Ptr &other) const +{ + if(other) + return this == other.data() ? true : wxsTypeMatches(other->wxsSuperType()); + else + return false; +} + +bool AnyType::isAbstract() const +{ + return false; +} + +QXmlName AnyType::name(const NamePool::Ptr &np) const +{ + return np->allocateQName(StandardNamespaces::xs, QLatin1String("anyType")); +} + +QString AnyType::displayName(const NamePool::Ptr &) const +{ + /* A bit faster than calling name()->displayName() */ + return QLatin1String("xs:anyType"); +} + +SchemaType::Ptr AnyType::wxsSuperType() const +{ + return SchemaType::Ptr(); +} + +SchemaType::TypeCategory AnyType::category() const +{ + return None; +} + +SchemaType::DerivationMethod AnyType::derivationMethod() const +{ + return NoDerivation; +} + +QT_END_NAMESPACE diff --git a/src/xmlpatterns/type/qanytype_p.h b/src/xmlpatterns/type/qanytype_p.h new file mode 100644 index 0000000..70477af --- /dev/null +++ b/src/xmlpatterns/type/qanytype_p.h @@ -0,0 +1,132 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. + +#ifndef Patternist_AnyType_H +#define Patternist_AnyType_H + +#include "qschematype_p.h" + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +namespace QPatternist +{ + class AtomicType; + + /** + * @short Represents the @c xs:anyType item type. + * + * @ingroup Patternist_types + * @author Frans Englich <fenglich@trolltech.com> + */ + class AnyType : public SchemaType + { + public: + + typedef QExplicitlySharedDataPointer<AnyType> Ptr; + friend class BuiltinTypes; + + virtual ~AnyType(); + + virtual QXmlName name(const NamePool::Ptr &np) const; + + /** + * @returns always "xs:anyType" + */ + virtual QString displayName(const NamePool::Ptr &np) const; + + /** + * @returns always @c false + */ + virtual bool isAbstract() const; + + /** + * @returns @c null, since <tt>xs:anyType</tt> has no base type, it is the ur-type. + * + * @returns always @c null + */ + virtual SchemaType::Ptr wxsSuperType() const; + + /** + * @returns @c true only if @p other is xsAnyType. + */ + virtual bool wxsTypeMatches(const SchemaType::Ptr &other) const; + + /** + * <tt>xs:anyType</tt> is the "ur-type" and special. Therefore, this function + * returns SchemaType::None. + * + * @returns SchemaType::None + */ + virtual TypeCategory category() const; + + /** + * @returns always NoDerivation. + */ + virtual DerivationMethod derivationMethod() const; + + protected: + /** + * @short This constructor is protected, because this + * class must be sub-classed. + */ + inline AnyType() + { + } + }; +} + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif diff --git a/src/xmlpatterns/type/qatomiccasterlocator.cpp b/src/xmlpatterns/type/qatomiccasterlocator.cpp new file mode 100644 index 0000000..5376d6f --- /dev/null +++ b/src/xmlpatterns/type/qatomiccasterlocator.cpp @@ -0,0 +1,82 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qatomiccasterlocator_p.h" + +QT_BEGIN_NAMESPACE + +using namespace QPatternist; + +#define implCasterVisit(type) \ +AtomicTypeVisitorResult::Ptr AtomicCasterLocator::visit(const type *, \ + const SourceLocationReflection *const) const \ +{ \ + return AtomicTypeVisitorResult::Ptr(); \ +} + +implCasterVisit(AnyAtomicType) +implCasterVisit(AnyURIType) +implCasterVisit(Base64BinaryType) +implCasterVisit(BooleanType) +implCasterVisit(DateTimeType) +implCasterVisit(DateType) +implCasterVisit(DayTimeDurationType) +implCasterVisit(DecimalType) +implCasterVisit(DoubleType) +implCasterVisit(DurationType) +implCasterVisit(FloatType) +implCasterVisit(GDayType) +implCasterVisit(GMonthDayType) +implCasterVisit(GMonthType) +implCasterVisit(GYearMonthType) +implCasterVisit(GYearType) +implCasterVisit(HexBinaryType) +implCasterVisit(IntegerType) +implCasterVisit(NOTATIONType) +implCasterVisit(QNameType) +implCasterVisit(StringType) +implCasterVisit(SchemaTimeType) +implCasterVisit(UntypedAtomicType) +implCasterVisit(YearMonthDurationType) + +#undef implCasterVisit + +QT_END_NAMESPACE diff --git a/src/xmlpatterns/type/qatomiccasterlocator_p.h b/src/xmlpatterns/type/qatomiccasterlocator_p.h new file mode 100644 index 0000000..14e6360 --- /dev/null +++ b/src/xmlpatterns/type/qatomiccasterlocator_p.h @@ -0,0 +1,126 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. + +#ifndef Patternist_AtomicCasterLocator_H +#define Patternist_AtomicCasterLocator_H + +#include "qatomictypedispatch_p.h" + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +namespace QPatternist +{ + /** + * @author Frans Englich <fenglich@trolltech.com> + */ + class AtomicCasterLocator : public AtomicTypeVisitor + { + public: + typedef QExplicitlySharedDataPointer<AtomicCasterLocator> Ptr; + + virtual AtomicTypeVisitorResult::Ptr visit(const AnyAtomicType *, + const SourceLocationReflection *const reflection) const; + virtual AtomicTypeVisitorResult::Ptr visit(const AnyURIType *, + const SourceLocationReflection *const reflection) const; + virtual AtomicTypeVisitorResult::Ptr visit(const Base64BinaryType *, + const SourceLocationReflection *const reflection) const; + virtual AtomicTypeVisitorResult::Ptr visit(const BooleanType *, + const SourceLocationReflection *const reflection) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DateTimeType *, + const SourceLocationReflection *const reflection) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DateType *, + const SourceLocationReflection *const reflection) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DayTimeDurationType *, + const SourceLocationReflection *const reflection) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DecimalType *, + const SourceLocationReflection *const reflection) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DoubleType *, + const SourceLocationReflection *const reflection) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DurationType *, + const SourceLocationReflection *const reflection) const; + virtual AtomicTypeVisitorResult::Ptr visit(const FloatType *, + const SourceLocationReflection *const reflection) const; + virtual AtomicTypeVisitorResult::Ptr visit(const GDayType *, + const SourceLocationReflection *const reflection) const; + virtual AtomicTypeVisitorResult::Ptr visit(const GMonthDayType *, + const SourceLocationReflection *const reflection) const; + virtual AtomicTypeVisitorResult::Ptr visit(const GMonthType *, + const SourceLocationReflection *const reflection) const; + virtual AtomicTypeVisitorResult::Ptr visit(const GYearMonthType *, + const SourceLocationReflection *const reflection) const; + virtual AtomicTypeVisitorResult::Ptr visit(const GYearType *, + const SourceLocationReflection *const reflection) const; + virtual AtomicTypeVisitorResult::Ptr visit(const HexBinaryType *, + const SourceLocationReflection *const reflection) const; + virtual AtomicTypeVisitorResult::Ptr visit(const IntegerType *, + const SourceLocationReflection *const reflection) const; + virtual AtomicTypeVisitorResult::Ptr visit(const NOTATIONType *, + const SourceLocationReflection *const reflection) const; + virtual AtomicTypeVisitorResult::Ptr visit(const QNameType *, + const SourceLocationReflection *const reflection) const; + virtual AtomicTypeVisitorResult::Ptr visit(const StringType *, + const SourceLocationReflection *const reflection) const; + virtual AtomicTypeVisitorResult::Ptr visit(const SchemaTimeType *, + const SourceLocationReflection *const reflection) const; + virtual AtomicTypeVisitorResult::Ptr visit(const UntypedAtomicType *, + const SourceLocationReflection *const reflection) const; + virtual AtomicTypeVisitorResult::Ptr visit(const YearMonthDurationType *, + const SourceLocationReflection *const reflection) const; + }; +} + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif diff --git a/src/xmlpatterns/type/qatomiccasterlocators.cpp b/src/xmlpatterns/type/qatomiccasterlocators.cpp new file mode 100644 index 0000000..9e1e444 --- /dev/null +++ b/src/xmlpatterns/type/qatomiccasterlocators.cpp @@ -0,0 +1,252 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qabstractfloatcasters_p.h" + +#include "qatomiccasterlocators_p.h" + +QT_BEGIN_NAMESPACE + +using namespace QPatternist; + +#define impl(owner, mather, type) \ +AtomicTypeVisitorResult::Ptr owner::visit(const type *, \ + const SourceLocationReflection *const) const \ +{ \ + return AtomicTypeVisitorResult::Ptr(new mather()); \ +} + +#define implSelf(owner) impl(To##owner##CasterLocator, SelfToSelfCaster, owner##Type) + +/* xs:string */ +implSelf(String) +impl(ToStringCasterLocator, ToStringCaster<TypeString>, AnyURIType) +impl(ToStringCasterLocator, ToStringCaster<TypeString>, Base64BinaryType) +impl(ToStringCasterLocator, ToStringCaster<TypeString>, BooleanType) +impl(ToStringCasterLocator, ToStringCaster<TypeString>, DateTimeType) +impl(ToStringCasterLocator, ToStringCaster<TypeString>, DateType) +impl(ToStringCasterLocator, ToStringCaster<TypeString>, DayTimeDurationType) +impl(ToStringCasterLocator, ToStringCaster<TypeString>, DecimalType) +impl(ToStringCasterLocator, ToStringCaster<TypeString>, DoubleType) +impl(ToStringCasterLocator, ToStringCaster<TypeString>, DurationType) +impl(ToStringCasterLocator, ToStringCaster<TypeString>, FloatType) +impl(ToStringCasterLocator, ToStringCaster<TypeString>, GDayType) +impl(ToStringCasterLocator, ToStringCaster<TypeString>, GMonthDayType) +impl(ToStringCasterLocator, ToStringCaster<TypeString>, GMonthType) +impl(ToStringCasterLocator, ToStringCaster<TypeString>, GYearMonthType) +impl(ToStringCasterLocator, ToStringCaster<TypeString>, GYearType) +impl(ToStringCasterLocator, ToStringCaster<TypeString>, HexBinaryType) +impl(ToStringCasterLocator, ToStringCaster<TypeString>, IntegerType) +impl(ToStringCasterLocator, ToStringCaster<TypeString>, NOTATIONType) +impl(ToStringCasterLocator, ToStringCaster<TypeString>, QNameType) +impl(ToStringCasterLocator, ToStringCaster<TypeString>, SchemaTimeType) +impl(ToStringCasterLocator, ToStringCaster<TypeString>, UntypedAtomicType) +impl(ToStringCasterLocator, ToStringCaster<TypeString>, YearMonthDurationType) + +/* xs:untypedAtomic */ +implSelf(UntypedAtomic) +impl(ToUntypedAtomicCasterLocator, ToUntypedAtomicCaster, AnyURIType) +impl(ToUntypedAtomicCasterLocator, ToUntypedAtomicCaster, Base64BinaryType) +impl(ToUntypedAtomicCasterLocator, ToUntypedAtomicCaster, BooleanType) +impl(ToUntypedAtomicCasterLocator, ToUntypedAtomicCaster, DateTimeType) +impl(ToUntypedAtomicCasterLocator, ToUntypedAtomicCaster, DateType) +impl(ToUntypedAtomicCasterLocator, ToUntypedAtomicCaster, DayTimeDurationType) +impl(ToUntypedAtomicCasterLocator, ToUntypedAtomicCaster, DecimalType) +impl(ToUntypedAtomicCasterLocator, ToUntypedAtomicCaster, DoubleType) +impl(ToUntypedAtomicCasterLocator, ToUntypedAtomicCaster, DurationType) +impl(ToUntypedAtomicCasterLocator, ToUntypedAtomicCaster, FloatType) +impl(ToUntypedAtomicCasterLocator, ToUntypedAtomicCaster, GDayType) +impl(ToUntypedAtomicCasterLocator, ToUntypedAtomicCaster, GMonthDayType) +impl(ToUntypedAtomicCasterLocator, ToUntypedAtomicCaster, GMonthType) +impl(ToUntypedAtomicCasterLocator, ToUntypedAtomicCaster, GYearMonthType) +impl(ToUntypedAtomicCasterLocator, ToUntypedAtomicCaster, GYearType) +impl(ToUntypedAtomicCasterLocator, ToUntypedAtomicCaster, HexBinaryType) +impl(ToUntypedAtomicCasterLocator, ToUntypedAtomicCaster, IntegerType) +impl(ToUntypedAtomicCasterLocator, ToUntypedAtomicCaster, NOTATIONType) +impl(ToUntypedAtomicCasterLocator, ToUntypedAtomicCaster, QNameType) +impl(ToUntypedAtomicCasterLocator, ToUntypedAtomicCaster, StringType) +impl(ToUntypedAtomicCasterLocator, ToUntypedAtomicCaster, SchemaTimeType) +impl(ToUntypedAtomicCasterLocator, ToUntypedAtomicCaster, YearMonthDurationType) + +/* xs:anyURI */ +implSelf(AnyURI) +impl(ToAnyURICasterLocator, ToAnyURICaster, StringType) +impl(ToAnyURICasterLocator, ToAnyURICaster, UntypedAtomicType) + +/* xs:boolean */ +implSelf(Boolean) +impl(ToBooleanCasterLocator, NumericToBooleanCaster, DoubleType) +impl(ToBooleanCasterLocator, NumericToBooleanCaster, FloatType) +impl(ToBooleanCasterLocator, NumericToBooleanCaster, DecimalType) +impl(ToBooleanCasterLocator, NumericToBooleanCaster, IntegerType) +impl(ToBooleanCasterLocator, StringToBooleanCaster, StringType) +impl(ToBooleanCasterLocator, StringToBooleanCaster, UntypedAtomicType) + +/* xs:double */ +implSelf(Double) +impl(ToDoubleCasterLocator, BooleanToDoubleCaster, BooleanType) +impl(ToDoubleCasterLocator, NumericToDoubleCaster, FloatType) +impl(ToDoubleCasterLocator, NumericToDoubleCaster, DecimalType) +impl(ToDoubleCasterLocator, NumericToDoubleCaster, IntegerType) +impl(ToDoubleCasterLocator, StringToDoubleCaster, StringType) +impl(ToDoubleCasterLocator, StringToDoubleCaster, UntypedAtomicType) + +/* xs:float */ +implSelf(Float) +impl(ToFloatCasterLocator, BooleanToFloatCaster, BooleanType) +impl(ToFloatCasterLocator, NumericToFloatCaster, DoubleType) +impl(ToFloatCasterLocator, NumericToFloatCaster, DecimalType) +impl(ToFloatCasterLocator, NumericToFloatCaster, IntegerType) +impl(ToFloatCasterLocator, StringToFloatCaster, StringType) +impl(ToFloatCasterLocator, StringToFloatCaster, UntypedAtomicType) + +/* xs:decimal */ +implSelf(Decimal) +impl(ToDecimalCasterLocator, BooleanToDecimalCaster, BooleanType) +impl(ToDecimalCasterLocator, NumericToDecimalCaster<false>, DoubleType) +impl(ToDecimalCasterLocator, NumericToDecimalCaster<false>, FloatType) +impl(ToDecimalCasterLocator, NumericToDecimalCaster<false>, IntegerType) +impl(ToDecimalCasterLocator, StringToDecimalCaster, StringType) +impl(ToDecimalCasterLocator, StringToDecimalCaster, UntypedAtomicType) + +/* xs:integer */ +implSelf(Integer) +impl(ToIntegerCasterLocator, BooleanToIntegerCaster, BooleanType) +impl(ToIntegerCasterLocator, NumericToDecimalCaster<true>, DoubleType) +impl(ToIntegerCasterLocator, NumericToDecimalCaster<true>, FloatType) +impl(ToIntegerCasterLocator, NumericToDecimalCaster<true>, DecimalType) +impl(ToIntegerCasterLocator, StringToIntegerCaster, StringType) +impl(ToIntegerCasterLocator, StringToIntegerCaster, UntypedAtomicType) + +/* xs:base64binary */ +implSelf(Base64Binary) +impl(ToBase64BinaryCasterLocator, HexBinaryToBase64BinaryCaster, HexBinaryType) +impl(ToBase64BinaryCasterLocator, StringToBase64BinaryCaster, StringType) +impl(ToBase64BinaryCasterLocator, StringToBase64BinaryCaster, UntypedAtomicType) + +/* xs:hexBinary */ +implSelf(HexBinary) +impl(ToHexBinaryCasterLocator, Base64BinaryToHexBinaryCaster, Base64BinaryType) +impl(ToHexBinaryCasterLocator, StringToHexBinaryCaster, StringType) +impl(ToHexBinaryCasterLocator, StringToHexBinaryCaster, UntypedAtomicType) + +/* xs:QName */ +implSelf(QName) +impl(ToQNameCasterLocator, ToStringCaster<TypeString>, StringType) + +/* xs:gYear */ +implSelf(GYear) +impl(ToGYearCasterLocator, StringToGYearCaster, StringType) +impl(ToGYearCasterLocator, StringToGYearCaster, UntypedAtomicType) +impl(ToGYearCasterLocator, AbstractDateTimeToGYearCaster, DateType) +impl(ToGYearCasterLocator, AbstractDateTimeToGYearCaster, DateTimeType) + +/* xs:gDay */ +implSelf(GDay) +impl(ToGDayCasterLocator, StringToGDayCaster, StringType) +impl(ToGDayCasterLocator, StringToGDayCaster, UntypedAtomicType) +impl(ToGDayCasterLocator, AbstractDateTimeToGDayCaster, DateType) +impl(ToGDayCasterLocator, AbstractDateTimeToGDayCaster, DateTimeType) + +/* xs:gMonth */ +implSelf(GMonth) +impl(ToGMonthCasterLocator, StringToGMonthCaster, StringType) +impl(ToGMonthCasterLocator, StringToGMonthCaster, UntypedAtomicType) +impl(ToGMonthCasterLocator, AbstractDateTimeToGMonthCaster, DateType) +impl(ToGMonthCasterLocator, AbstractDateTimeToGMonthCaster, DateTimeType) + +/* xs:gYearMonth */ +implSelf(GYearMonth) +impl(ToGYearMonthCasterLocator, StringToGYearMonthCaster, StringType) +impl(ToGYearMonthCasterLocator, StringToGYearMonthCaster, UntypedAtomicType) +impl(ToGYearMonthCasterLocator, AbstractDateTimeToGYearMonthCaster, DateType) +impl(ToGYearMonthCasterLocator, AbstractDateTimeToGYearMonthCaster, DateTimeType) + +/* xs:gMonthDay */ +implSelf(GMonthDay) +impl(ToGMonthDayCasterLocator, StringToGMonthDayCaster, StringType) +impl(ToGMonthDayCasterLocator, StringToGMonthDayCaster, UntypedAtomicType) +impl(ToGMonthDayCasterLocator, AbstractDateTimeToGMonthDayCaster, DateType) +impl(ToGMonthDayCasterLocator, AbstractDateTimeToGMonthDayCaster, DateTimeType) + +/* xs:dateTime */ +implSelf(DateTime) +impl(ToDateTimeCasterLocator, StringToDateTimeCaster, StringType) +impl(ToDateTimeCasterLocator, AbstractDateTimeToDateTimeCaster, DateType) +impl(ToDateTimeCasterLocator, StringToDateTimeCaster, UntypedAtomicType) + +/* xs:time */ +implSelf(SchemaTime) +impl(ToSchemaTimeCasterLocator, StringToTimeCaster, StringType) +impl(ToSchemaTimeCasterLocator, AbstractDateTimeToTimeCaster, DateTimeType) +impl(ToSchemaTimeCasterLocator, StringToTimeCaster, UntypedAtomicType) + +/* xs:date */ +implSelf(Date) +impl(ToDateCasterLocator, StringToDateCaster, StringType) +impl(ToDateCasterLocator, AbstractDateTimeToDateCaster, DateTimeType) +impl(ToDateCasterLocator, StringToDateCaster, UntypedAtomicType) + +/* xs:duration */ +implSelf(Duration) +impl(ToDurationCasterLocator, AbstractDurationToDurationCaster, DayTimeDurationType) +impl(ToDurationCasterLocator, AbstractDurationToDurationCaster, YearMonthDurationType) +impl(ToDurationCasterLocator, StringToDurationCaster, StringType) +impl(ToDurationCasterLocator, StringToDurationCaster, UntypedAtomicType) + +/* xs:dayTimeDuration */ +implSelf(DayTimeDuration) +impl(ToDayTimeDurationCasterLocator, AbstractDurationToDayTimeDurationCaster, DurationType) +impl(ToDayTimeDurationCasterLocator, AbstractDurationToDayTimeDurationCaster, YearMonthDurationType) +impl(ToDayTimeDurationCasterLocator, StringToDayTimeDurationCaster, StringType) +impl(ToDayTimeDurationCasterLocator, StringToDayTimeDurationCaster, UntypedAtomicType) + +/* xs:yearMonthDuration */ +implSelf(YearMonthDuration) +impl(ToYearMonthDurationCasterLocator, AbstractDurationToYearMonthDurationCaster, DayTimeDurationType) +impl(ToYearMonthDurationCasterLocator, AbstractDurationToYearMonthDurationCaster, DurationType) +impl(ToYearMonthDurationCasterLocator, StringToYearMonthDurationCaster, StringType) +impl(ToYearMonthDurationCasterLocator, StringToYearMonthDurationCaster, UntypedAtomicType) + +#undef implSelf +#undef impl + +QT_END_NAMESPACE diff --git a/src/xmlpatterns/type/qatomiccasterlocators_p.h b/src/xmlpatterns/type/qatomiccasterlocators_p.h new file mode 100644 index 0000000..aa905de --- /dev/null +++ b/src/xmlpatterns/type/qatomiccasterlocators_p.h @@ -0,0 +1,909 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. + +#ifndef Patternist_AtomicCasterLocators_H +#define Patternist_AtomicCasterLocators_H + +#include "qatomiccasterlocator_p.h" +#include "qatomiccasters_p.h" +//#include "qderivedinteger_p.h" + +/** + * @file + * @short Contains AtomicCasterLocator sub-classes that finds classes + * which can perform casting from one atomic value to another. + */ + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +namespace QPatternist +{ + /** + * @author Frans Englich <fenglich@trolltech.com> + */ + class ToStringCasterLocator : public AtomicCasterLocator + { + public: + using AtomicCasterLocator::visit; + virtual AtomicTypeVisitorResult::Ptr visit(const AnyURIType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const Base64BinaryType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const BooleanType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DateTimeType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DateType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DayTimeDurationType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DecimalType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DoubleType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DurationType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const FloatType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const GDayType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const GMonthDayType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const GMonthType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const GYearMonthType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const GYearType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const HexBinaryType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const IntegerType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const NOTATIONType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const QNameType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const StringType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const SchemaTimeType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const UntypedAtomicType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const YearMonthDurationType *, + const SourceLocationReflection *const r) const; + }; + + /** + * @author Frans Englich <fenglich@trolltech.com> + */ + class ToUntypedAtomicCasterLocator : public AtomicCasterLocator + { + public: + using AtomicCasterLocator::visit; + virtual AtomicTypeVisitorResult::Ptr visit(const AnyURIType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const Base64BinaryType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const BooleanType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DateTimeType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DateType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DayTimeDurationType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DecimalType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DoubleType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DurationType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const FloatType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const GDayType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const GMonthDayType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const GMonthType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const GYearMonthType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const GYearType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const HexBinaryType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const IntegerType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const NOTATIONType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const QNameType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const StringType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const SchemaTimeType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const UntypedAtomicType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const YearMonthDurationType *, + const SourceLocationReflection *const r) const; + }; + + /** + * @author Frans Englich <fenglich@trolltech.com> + */ + class ToAnyURICasterLocator : public AtomicCasterLocator + { + public: + using AtomicCasterLocator::visit; + virtual AtomicTypeVisitorResult::Ptr visit(const UntypedAtomicType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const StringType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const AnyURIType *, + const SourceLocationReflection *const r) const; + }; + + /** + * @author Frans Englich <fenglich@trolltech.com> + */ + class ToBooleanCasterLocator : public AtomicCasterLocator + { + public: + using AtomicCasterLocator::visit; + virtual AtomicTypeVisitorResult::Ptr visit(const BooleanType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DecimalType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DoubleType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const FloatType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const IntegerType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const UntypedAtomicType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const StringType *, + const SourceLocationReflection *const r) const; + }; + + /** + * @author Frans Englich <fenglich@trolltech.com> + */ + class ToDoubleCasterLocator : public AtomicCasterLocator + { + public: + using AtomicCasterLocator::visit; + virtual AtomicTypeVisitorResult::Ptr visit(const BooleanType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DoubleType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DecimalType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const FloatType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const IntegerType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const UntypedAtomicType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const StringType *, + const SourceLocationReflection *const r) const; + }; + + /** + * @author Frans Englich <fenglich@trolltech.com> + */ + class ToFloatCasterLocator : public AtomicCasterLocator + { + public: + using AtomicCasterLocator::visit; + virtual AtomicTypeVisitorResult::Ptr visit(const BooleanType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DecimalType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DoubleType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const FloatType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const IntegerType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const UntypedAtomicType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const StringType *, + const SourceLocationReflection *const r) const; + }; + + /** + * @author Frans Englich <fenglich@trolltech.com> + */ + class ToDecimalCasterLocator : public AtomicCasterLocator + { + public: + using AtomicCasterLocator::visit; + virtual AtomicTypeVisitorResult::Ptr visit(const BooleanType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DecimalType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DoubleType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const FloatType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const IntegerType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const UntypedAtomicType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const StringType *, + const SourceLocationReflection *const r) const; + }; + + /** + * @author Frans Englich <fenglich@trolltech.com> + */ + class ToIntegerCasterLocator : public AtomicCasterLocator + { + public: + using AtomicCasterLocator::visit; + virtual AtomicTypeVisitorResult::Ptr visit(const BooleanType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DecimalType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DoubleType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const FloatType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const IntegerType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const StringType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const UntypedAtomicType *, + const SourceLocationReflection *const r) const; + }; + + /** + * @author Frans Englich <fenglich@trolltech.com> + */ + class ToBase64BinaryCasterLocator : public AtomicCasterLocator + { + public: + using AtomicCasterLocator::visit; + virtual AtomicTypeVisitorResult::Ptr visit(const Base64BinaryType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const HexBinaryType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const StringType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const UntypedAtomicType *, + const SourceLocationReflection *const r) const; + }; + + /** + * @author Frans Englich <fenglich@trolltech.com> + */ + class ToHexBinaryCasterLocator : public AtomicCasterLocator + { + public: + using AtomicCasterLocator::visit; + virtual AtomicTypeVisitorResult::Ptr visit(const Base64BinaryType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const HexBinaryType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const StringType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const UntypedAtomicType *, + const SourceLocationReflection *const r) const; + }; + + /** + * @author Frans Englich <fenglich@trolltech.com> + */ + class ToQNameCasterLocator : public AtomicCasterLocator + { + public: + using AtomicCasterLocator::visit; + virtual AtomicTypeVisitorResult::Ptr visit(const QNameType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const StringType *, + const SourceLocationReflection *const r) const; + }; + + /** + * @author Frans Englich <fenglich@trolltech.com> + */ + class ToGYearCasterLocator : public AtomicCasterLocator + { + public: + using AtomicCasterLocator::visit; + virtual AtomicTypeVisitorResult::Ptr visit(const DateTimeType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DateType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const GYearType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const StringType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const UntypedAtomicType *, + const SourceLocationReflection *const r) const; + }; + + /** + * @author Frans Englich <fenglich@trolltech.com> + */ + class ToGDayCasterLocator : public AtomicCasterLocator + { + public: + using AtomicCasterLocator::visit; + virtual AtomicTypeVisitorResult::Ptr visit(const DateTimeType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DateType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const GDayType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const StringType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const UntypedAtomicType *, + const SourceLocationReflection *const r) const; + }; + + /** + * @author Frans Englich <fenglich@trolltech.com> + */ + class ToGMonthCasterLocator : public AtomicCasterLocator + { + public: + using AtomicCasterLocator::visit; + virtual AtomicTypeVisitorResult::Ptr visit(const DateTimeType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DateType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const GMonthType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const StringType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const UntypedAtomicType *, + const SourceLocationReflection *const r) const; + }; + + /** + * @author Frans Englich <fenglich@trolltech.com> + */ + class ToGYearMonthCasterLocator : public AtomicCasterLocator + { + public: + using AtomicCasterLocator::visit; + virtual AtomicTypeVisitorResult::Ptr visit(const DateTimeType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DateType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const GYearMonthType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const StringType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const UntypedAtomicType *, + const SourceLocationReflection *const r) const; + }; + + /** + * @author Frans Englich <fenglich@trolltech.com> + */ + class ToGMonthDayCasterLocator : public AtomicCasterLocator + { + public: + using AtomicCasterLocator::visit; + virtual AtomicTypeVisitorResult::Ptr visit(const DateTimeType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DateType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const GMonthDayType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const StringType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const UntypedAtomicType *, + const SourceLocationReflection *const r) const; + }; + + /** + * @author Frans Englich <fenglich@trolltech.com> + */ + class ToDateTimeCasterLocator : public AtomicCasterLocator + { + public: + using AtomicCasterLocator::visit; + virtual AtomicTypeVisitorResult::Ptr visit(const DateTimeType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DateType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const StringType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const UntypedAtomicType *, + const SourceLocationReflection *const r) const; + }; + + /** + * @author Frans Englich <fenglich@trolltech.com> + */ + class ToDateCasterLocator : public AtomicCasterLocator + { + public: + using AtomicCasterLocator::visit; + virtual AtomicTypeVisitorResult::Ptr visit(const DateTimeType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DateType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const StringType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const UntypedAtomicType *, + const SourceLocationReflection *const r) const; + }; + + /** + * @author Frans Englich <fenglich@trolltech.com> + */ + class ToSchemaTimeCasterLocator : public AtomicCasterLocator + { + public: + using AtomicCasterLocator::visit; + virtual AtomicTypeVisitorResult::Ptr visit(const DateTimeType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const SchemaTimeType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const StringType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const UntypedAtomicType *, + const SourceLocationReflection *const r) const; + }; + + /** + * @author Frans Englich <fenglich@trolltech.com> + */ + class ToDurationCasterLocator : public AtomicCasterLocator + { + public: + using AtomicCasterLocator::visit; + virtual AtomicTypeVisitorResult::Ptr visit(const DayTimeDurationType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DurationType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const StringType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const UntypedAtomicType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const YearMonthDurationType *, + const SourceLocationReflection *const r) const; + }; + + /** + * @author Frans Englich <fenglich@trolltech.com> + */ + class ToDayTimeDurationCasterLocator : public AtomicCasterLocator + { + public: + using AtomicCasterLocator::visit; + virtual AtomicTypeVisitorResult::Ptr visit(const DayTimeDurationType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DurationType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const StringType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const UntypedAtomicType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const YearMonthDurationType *, + const SourceLocationReflection *const r) const; + }; + + /** + * @author Frans Englich <fenglich@trolltech.com> + */ + class ToYearMonthDurationCasterLocator : public AtomicCasterLocator + { + public: + using AtomicCasterLocator::visit; + virtual AtomicTypeVisitorResult::Ptr visit(const DayTimeDurationType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DurationType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const StringType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const UntypedAtomicType *, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const YearMonthDurationType *, + const SourceLocationReflection *const r) const; + }; + + /** + * @author Frans Englich <fenglich@trolltech.com> + */ + template<TypeOfDerivedInteger type> + class ToDerivedIntegerCasterLocator : public ToIntegerCasterLocator + { + public: + using ToIntegerCasterLocator::visit; + + virtual AtomicTypeVisitorResult::Ptr visit(const BooleanType *, + const SourceLocationReflection *const r) const + { + Q_UNUSED(r); + return AtomicTypeVisitorResult::Ptr(new BooleanToDerivedIntegerCaster<type>()); + } + + virtual AtomicTypeVisitorResult::Ptr visit(const StringType *, + const SourceLocationReflection *const r) const + { + Q_UNUSED(r); + return AtomicTypeVisitorResult::Ptr(new StringToDerivedIntegerCaster<type>()); + } + + virtual AtomicTypeVisitorResult::Ptr visit(const AnyURIType *, + const SourceLocationReflection *const r) const + { + Q_UNUSED(r); + return AtomicTypeVisitorResult::Ptr(new StringToDerivedIntegerCaster<type>()); + } + + virtual AtomicTypeVisitorResult::Ptr visit(const UntypedAtomicType *, + const SourceLocationReflection *const r) const + { + Q_UNUSED(r); + return AtomicTypeVisitorResult::Ptr(new StringToDerivedIntegerCaster<type>()); + } + + virtual AtomicTypeVisitorResult::Ptr visit(const IntegerType *, + const SourceLocationReflection *const r) const + { + Q_UNUSED(r); + return AtomicTypeVisitorResult::Ptr(new NumericToDerivedIntegerCaster<type>()); + } + + virtual AtomicTypeVisitorResult::Ptr visit(const DerivedIntegerType<TypeByte> *, + const SourceLocationReflection *const r) const + { + Q_UNUSED(r); + return AtomicTypeVisitorResult::Ptr(new NumericToDerivedIntegerCaster<type>()); + } + + virtual AtomicTypeVisitorResult::Ptr visit(const DerivedIntegerType<TypeInt> *, + const SourceLocationReflection *const r) const + { + Q_UNUSED(r); + return AtomicTypeVisitorResult::Ptr(new NumericToDerivedIntegerCaster<type>()); + } + + virtual AtomicTypeVisitorResult::Ptr visit(const DerivedIntegerType<TypeLong> *, + const SourceLocationReflection *const r) const + { + Q_UNUSED(r); + return AtomicTypeVisitorResult::Ptr(new NumericToDerivedIntegerCaster<type>()); + } + + virtual AtomicTypeVisitorResult::Ptr visit(const DerivedIntegerType<TypeNegativeInteger> *, + const SourceLocationReflection *const r) const + { + Q_UNUSED(r); + return AtomicTypeVisitorResult::Ptr(new NumericToDerivedIntegerCaster<type>()); + } + + virtual AtomicTypeVisitorResult::Ptr visit(const DerivedIntegerType<TypeNonNegativeInteger> *, + const SourceLocationReflection *const r) const + { + Q_UNUSED(r); + return AtomicTypeVisitorResult::Ptr(new NumericToDerivedIntegerCaster<type>()); + } + + virtual AtomicTypeVisitorResult::Ptr visit(const DerivedIntegerType<TypeNonPositiveInteger> *, + const SourceLocationReflection *const r) const + { + Q_UNUSED(r); + return AtomicTypeVisitorResult::Ptr(new NumericToDerivedIntegerCaster<type>()); + } + + virtual AtomicTypeVisitorResult::Ptr visit(const DerivedIntegerType<TypePositiveInteger> *, + const SourceLocationReflection *const r) const + { + Q_UNUSED(r); + return AtomicTypeVisitorResult::Ptr(new NumericToDerivedIntegerCaster<type>()); + } + + virtual AtomicTypeVisitorResult::Ptr visit(const DerivedIntegerType<TypeShort> *, + const SourceLocationReflection *const r) const + { + Q_UNUSED(r); + return AtomicTypeVisitorResult::Ptr(new NumericToDerivedIntegerCaster<type>()); + } + + virtual AtomicTypeVisitorResult::Ptr visit(const DerivedIntegerType<TypeUnsignedByte> *, + const SourceLocationReflection *const r) const + { + Q_UNUSED(r); + return AtomicTypeVisitorResult::Ptr(new NumericToDerivedIntegerCaster<type>()); + } + + virtual AtomicTypeVisitorResult::Ptr visit(const DerivedIntegerType<TypeUnsignedInt> *, + const SourceLocationReflection *const r) const + { + Q_UNUSED(r); + return AtomicTypeVisitorResult::Ptr(new NumericToDerivedIntegerCaster<type>()); + } + + virtual AtomicTypeVisitorResult::Ptr visit(const DerivedIntegerType<TypeUnsignedLong> *, + const SourceLocationReflection *const r) const + { + Q_UNUSED(r); + return AtomicTypeVisitorResult::Ptr(new NumericToDerivedIntegerCaster<type>()); + } + + virtual AtomicTypeVisitorResult::Ptr visit(const DerivedIntegerType<TypeUnsignedShort> *, + const SourceLocationReflection *const r) const + { + Q_UNUSED(r); + return AtomicTypeVisitorResult::Ptr(new NumericToDerivedIntegerCaster<type>()); + } + + virtual AtomicTypeVisitorResult::Ptr visit(const DoubleType *, + const SourceLocationReflection *const r) const + { + Q_UNUSED(r); + return AtomicTypeVisitorResult::Ptr(new NumericToDerivedIntegerCaster<type>()); + } + + virtual AtomicTypeVisitorResult::Ptr visit(const FloatType *, + const SourceLocationReflection *const r) const + { + Q_UNUSED(r); + return AtomicTypeVisitorResult::Ptr(new NumericToDerivedIntegerCaster<type>()); + } + }; + + /** + * @author Frans Englich <fenglich@trolltech.com> + */ + template<TypeOfDerivedString type> + class ToDerivedStringCasterLocator : public ToStringCasterLocator + { + public: + using ToStringCasterLocator::visit; + + virtual AtomicTypeVisitorResult::Ptr visit(const BooleanType *, + const SourceLocationReflection *const r) const + { + Q_UNUSED(r); + return AtomicTypeVisitorResult::Ptr(new AnyToDerivedStringCaster<type>()); + } + + virtual AtomicTypeVisitorResult::Ptr visit(const StringType *, + const SourceLocationReflection *const r) const + { + Q_UNUSED(r); + return AtomicTypeVisitorResult::Ptr(new AnyToDerivedStringCaster<type>()); + } + + virtual AtomicTypeVisitorResult::Ptr visit(const AnyURIType *, + const SourceLocationReflection *const r) const + { + Q_UNUSED(r); + return AtomicTypeVisitorResult::Ptr(new AnyToDerivedStringCaster<type>()); + } + + virtual AtomicTypeVisitorResult::Ptr visit(const UntypedAtomicType *, + const SourceLocationReflection *const r) const + { + Q_UNUSED(r); + return AtomicTypeVisitorResult::Ptr(new AnyToDerivedStringCaster<type>()); + } + + // TODO TypeString not handled + virtual AtomicTypeVisitorResult::Ptr visit(const DerivedStringType<TypeNormalizedString> *, + const SourceLocationReflection *const r) const + { + Q_UNUSED(r); + return AtomicTypeVisitorResult::Ptr(new AnyToDerivedStringCaster<type>()); + } + + virtual AtomicTypeVisitorResult::Ptr visit(const DerivedStringType<TypeToken> *, + const SourceLocationReflection *const r) const + { + Q_UNUSED(r); + return AtomicTypeVisitorResult::Ptr(new AnyToDerivedStringCaster<type>()); + } + + virtual AtomicTypeVisitorResult::Ptr visit(const DerivedStringType<TypeLanguage> *, + const SourceLocationReflection *const r) const + { + Q_UNUSED(r); + return AtomicTypeVisitorResult::Ptr(new AnyToDerivedStringCaster<type>()); + } + + virtual AtomicTypeVisitorResult::Ptr visit(const DerivedStringType<TypeNMTOKEN> *, + const SourceLocationReflection *const r) const + { + Q_UNUSED(r); + return AtomicTypeVisitorResult::Ptr(new AnyToDerivedStringCaster<type>()); + } + + virtual AtomicTypeVisitorResult::Ptr visit(const DerivedStringType<TypeName> *, + const SourceLocationReflection *const r) const + { + Q_UNUSED(r); + return AtomicTypeVisitorResult::Ptr(new AnyToDerivedStringCaster<type>()); + } + + virtual AtomicTypeVisitorResult::Ptr visit(const DerivedStringType<TypeNCName> *, + const SourceLocationReflection *const r) const + { + Q_UNUSED(r); + return AtomicTypeVisitorResult::Ptr(new AnyToDerivedStringCaster<type>()); + } + + virtual AtomicTypeVisitorResult::Ptr visit(const DerivedStringType<TypeID> *, + const SourceLocationReflection *const r) const + { + Q_UNUSED(r); + return AtomicTypeVisitorResult::Ptr(new AnyToDerivedStringCaster<type>()); + } + + virtual AtomicTypeVisitorResult::Ptr visit(const DerivedStringType<TypeIDREF> *, + const SourceLocationReflection *const r) const + { + Q_UNUSED(r); + return AtomicTypeVisitorResult::Ptr(new AnyToDerivedStringCaster<type>()); + } + + virtual AtomicTypeVisitorResult::Ptr visit(const DerivedStringType<TypeENTITY> *, + const SourceLocationReflection *const r) const + { + Q_UNUSED(r); + return AtomicTypeVisitorResult::Ptr(new AnyToDerivedStringCaster<type>()); + } + + virtual AtomicTypeVisitorResult::Ptr visit(const DateTimeType *, + const SourceLocationReflection *const r) const + { + Q_UNUSED(r); + return AtomicTypeVisitorResult::Ptr(new AnyToDerivedStringCaster<type>()); + } + + virtual AtomicTypeVisitorResult::Ptr visit(const DateType *, + const SourceLocationReflection *const r) const + { + Q_UNUSED(r); + return AtomicTypeVisitorResult::Ptr(new AnyToDerivedStringCaster<type>()); + } + + virtual AtomicTypeVisitorResult::Ptr visit(const SchemaTimeType *, + const SourceLocationReflection *const r) const + { + Q_UNUSED(r); + return AtomicTypeVisitorResult::Ptr(new AnyToDerivedStringCaster<type>()); + } + + virtual AtomicTypeVisitorResult::Ptr visit(const FloatType *, + const SourceLocationReflection *const r) const + { + Q_UNUSED(r); + return AtomicTypeVisitorResult::Ptr(new AnyToDerivedStringCaster<type>()); + } + + virtual AtomicTypeVisitorResult::Ptr visit(const DoubleType *, + const SourceLocationReflection *const r) const + { + Q_UNUSED(r); + return AtomicTypeVisitorResult::Ptr(new AnyToDerivedStringCaster<type>()); + } + + virtual AtomicTypeVisitorResult::Ptr visit(const DecimalType *, + const SourceLocationReflection *const r) const + { + Q_UNUSED(r); + return AtomicTypeVisitorResult::Ptr(new AnyToDerivedStringCaster<type>()); + } + + virtual AtomicTypeVisitorResult::Ptr visit(const IntegerType *, + const SourceLocationReflection *const r) const + { + Q_UNUSED(r); + return AtomicTypeVisitorResult::Ptr(new AnyToDerivedStringCaster<type>()); + } + + virtual AtomicTypeVisitorResult::Ptr visit(const DurationType *, + const SourceLocationReflection *const r) const + { + Q_UNUSED(r); + return AtomicTypeVisitorResult::Ptr(new AnyToDerivedStringCaster<type>()); + } + + virtual AtomicTypeVisitorResult::Ptr visit(const GYearMonthType *, + const SourceLocationReflection *const r) const + { + Q_UNUSED(r); + return AtomicTypeVisitorResult::Ptr(new AnyToDerivedStringCaster<type>()); + } + + virtual AtomicTypeVisitorResult::Ptr visit(const GYearType *, + const SourceLocationReflection *const r) const + { + Q_UNUSED(r); + return AtomicTypeVisitorResult::Ptr(new AnyToDerivedStringCaster<type>()); + } + + virtual AtomicTypeVisitorResult::Ptr visit(const GMonthDayType *, + const SourceLocationReflection *const r) const + { + Q_UNUSED(r); + return AtomicTypeVisitorResult::Ptr(new AnyToDerivedStringCaster<type>()); + } + + virtual AtomicTypeVisitorResult::Ptr visit(const GDayType *, + const SourceLocationReflection *const r) const + { + Q_UNUSED(r); + return AtomicTypeVisitorResult::Ptr(new AnyToDerivedStringCaster<type>()); + } + + virtual AtomicTypeVisitorResult::Ptr visit(const GMonthType *, + const SourceLocationReflection *const r) const + { + Q_UNUSED(r); + return AtomicTypeVisitorResult::Ptr(new AnyToDerivedStringCaster<type>()); + } + + virtual AtomicTypeVisitorResult::Ptr visit(const QNameType *, + const SourceLocationReflection *const r) const + { + Q_UNUSED(r); + return AtomicTypeVisitorResult::Ptr(new AnyToDerivedStringCaster<type>()); + } + }; +} + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif diff --git a/src/xmlpatterns/type/qatomiccomparatorlocator.cpp b/src/xmlpatterns/type/qatomiccomparatorlocator.cpp new file mode 100644 index 0000000..5aa55b1 --- /dev/null +++ b/src/xmlpatterns/type/qatomiccomparatorlocator.cpp @@ -0,0 +1,91 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qatomiccomparatorlocator_p.h" + +QT_BEGIN_NAMESPACE + +using namespace QPatternist; + +AtomicComparatorLocator::AtomicComparatorLocator() +{ +} + +AtomicComparatorLocator::~AtomicComparatorLocator() +{ +} + +#define implCompVisit(type) \ +AtomicTypeVisitorResult::Ptr \ +AtomicComparatorLocator::visit(const type *, \ + const qint16, \ + const SourceLocationReflection *const) const \ +{ \ + return AtomicTypeVisitorResult::Ptr(); \ +} + +implCompVisit(AnyAtomicType) +implCompVisit(AnyURIType) +implCompVisit(Base64BinaryType) +implCompVisit(BooleanType) +implCompVisit(DateTimeType) +implCompVisit(DateType) +implCompVisit(DayTimeDurationType) +implCompVisit(DecimalType) +implCompVisit(DoubleType) +implCompVisit(DurationType) +implCompVisit(FloatType) +implCompVisit(GDayType) +implCompVisit(GMonthDayType) +implCompVisit(GMonthType) +implCompVisit(GYearMonthType) +implCompVisit(GYearType) +implCompVisit(HexBinaryType) +implCompVisit(IntegerType) +implCompVisit(NOTATIONType) +implCompVisit(QNameType) +implCompVisit(StringType) +implCompVisit(SchemaTimeType) +implCompVisit(UntypedAtomicType) +implCompVisit(YearMonthDurationType) +#undef implCompVisit + +QT_END_NAMESPACE diff --git a/src/xmlpatterns/type/qatomiccomparatorlocator_p.h b/src/xmlpatterns/type/qatomiccomparatorlocator_p.h new file mode 100644 index 0000000..d18e6d9 --- /dev/null +++ b/src/xmlpatterns/type/qatomiccomparatorlocator_p.h @@ -0,0 +1,132 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. + +#ifndef Patternist_AtomicComparatorLocator_H +#define Patternist_AtomicComparatorLocator_H + +#include "qatomictypedispatch_p.h" + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +namespace QPatternist +{ + + /** + * @todo Docs missing + * + * @ingroup Patternist_types + * @author Frans Englich <fenglich@trolltech.com> + */ + class AtomicComparatorLocator : public ParameterizedAtomicTypeVisitor + { + public: + typedef QExplicitlySharedDataPointer<AtomicComparatorLocator> Ptr; + AtomicComparatorLocator(); + virtual ~AtomicComparatorLocator(); + + virtual AtomicTypeVisitorResult::Ptr visit(const AnyAtomicType *, const qint16 op, + const SourceLocationReflection *const) const; + virtual AtomicTypeVisitorResult::Ptr visit(const AnyURIType *, const qint16 op, + const SourceLocationReflection *const) const; + virtual AtomicTypeVisitorResult::Ptr visit(const Base64BinaryType *, const qint16 op, + const SourceLocationReflection *const) const; + virtual AtomicTypeVisitorResult::Ptr visit(const BooleanType *, const qint16 op, + const SourceLocationReflection *const) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DateTimeType *, const qint16 op, + const SourceLocationReflection *const) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DateType *, const qint16 op, + const SourceLocationReflection *const) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DayTimeDurationType *, const qint16 op, + const SourceLocationReflection *const) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DecimalType *, const qint16 op, + const SourceLocationReflection *const) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DoubleType *, const qint16 op, + const SourceLocationReflection *const) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DurationType *, const qint16 op, + const SourceLocationReflection *const) const; + virtual AtomicTypeVisitorResult::Ptr visit(const FloatType *, const qint16 op, + const SourceLocationReflection *const) const; + virtual AtomicTypeVisitorResult::Ptr visit(const GDayType *, const qint16 op, + const SourceLocationReflection *const) const; + virtual AtomicTypeVisitorResult::Ptr visit(const GMonthDayType *, const qint16 op, + const SourceLocationReflection *const) const; + virtual AtomicTypeVisitorResult::Ptr visit(const GMonthType *, const qint16 op, + const SourceLocationReflection *const) const; + virtual AtomicTypeVisitorResult::Ptr visit(const GYearMonthType *, const qint16 op, + const SourceLocationReflection *const) const; + virtual AtomicTypeVisitorResult::Ptr visit(const GYearType *, const qint16 op, + const SourceLocationReflection *const) const; + virtual AtomicTypeVisitorResult::Ptr visit(const HexBinaryType *, const qint16 op, + const SourceLocationReflection *const) const; + virtual AtomicTypeVisitorResult::Ptr visit(const IntegerType *, const qint16 op, + const SourceLocationReflection *const) const; + virtual AtomicTypeVisitorResult::Ptr visit(const NOTATIONType *, const qint16 op, + const SourceLocationReflection *const) const; + virtual AtomicTypeVisitorResult::Ptr visit(const QNameType *, const qint16 op, + const SourceLocationReflection *const) const; + virtual AtomicTypeVisitorResult::Ptr visit(const StringType *, const qint16 op, + const SourceLocationReflection *const) const; + virtual AtomicTypeVisitorResult::Ptr visit(const SchemaTimeType *, const qint16 op, + const SourceLocationReflection *const) const; + virtual AtomicTypeVisitorResult::Ptr visit(const UntypedAtomicType *, const qint16 op, + const SourceLocationReflection *const) const; + virtual AtomicTypeVisitorResult::Ptr visit(const YearMonthDurationType *, const qint16 op, + const SourceLocationReflection *const) const; + }; +} + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif diff --git a/src/xmlpatterns/type/qatomiccomparatorlocators.cpp b/src/xmlpatterns/type/qatomiccomparatorlocators.cpp new file mode 100644 index 0000000..d400a5e --- /dev/null +++ b/src/xmlpatterns/type/qatomiccomparatorlocators.cpp @@ -0,0 +1,232 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qatomiccomparators_p.h" + +#include "qatomiccomparatorlocators_p.h" + +QT_BEGIN_NAMESPACE + +using namespace QPatternist; + +static const AtomicComparator::Operators AllCompOperators(AtomicComparator::OperatorNotEqual | + AtomicComparator::OperatorGreaterOrEqual | + AtomicComparator::OperatorLessOrEqual | + AtomicComparator::OperatorLessThanNaNLeast | + AtomicComparator::OperatorLessThanNaNGreatest); +/* --------------------------------------------------------------- */ +#define addVisitor(owner, type, comp, validOps) \ +AtomicTypeVisitorResult::Ptr \ +owner##ComparatorLocator::visit(const type *, \ + const qint16 op, \ + const SourceLocationReflection *const) const \ +{ \ + /* Note the extra paranteses around validOps. */ \ + if(((validOps) & AtomicComparator::Operator(op)) == op) \ + return AtomicTypeVisitorResult::Ptr(new comp()); \ + else \ + return AtomicTypeVisitorResult::Ptr(); \ +} +/* --------------------------------------------------------------- */ +#define visitorForDouble(owner, type) \ +AtomicTypeVisitorResult::Ptr \ +owner##ComparatorLocator::visit(const type *, \ + const qint16 op, \ + const SourceLocationReflection *const) const \ +{ \ + if(((AtomicComparator::OperatorNotEqual | \ + AtomicComparator::OperatorGreaterOrEqual | \ + AtomicComparator::OperatorLessOrEqual) & AtomicComparator::Operator(op)) == op) \ + return AtomicTypeVisitorResult::Ptr(new AbstractFloatComparator()); \ + else if(op == AtomicComparator::OperatorLessThanNaNLeast) \ + return AtomicTypeVisitorResult::Ptr(new AbstractFloatSortComparator<AtomicComparator::OperatorLessThanNaNLeast>()); \ + else if(op == AtomicComparator::OperatorLessThanNaNGreatest) \ + return AtomicTypeVisitorResult::Ptr(new AbstractFloatSortComparator<AtomicComparator::OperatorLessThanNaNGreatest>()); \ + else \ + return AtomicTypeVisitorResult::Ptr(); \ +} +/* --------------------------------------------------------------- */ + +/* ----------- xs:string, xs:anyURI, xs:untypedAtomic ----------- */ +addVisitor(String, StringType, StringComparator, + AllCompOperators) +addVisitor(String, UntypedAtomicType, StringComparator, + AllCompOperators) +addVisitor(String, AnyURIType, StringComparator, + AllCompOperators) +/* --------------------------------------------------------------- */ + +/* ------------------------- xs:hexBinary ------------------------ */ +addVisitor(HexBinary, HexBinaryType, BinaryDataComparator, + AtomicComparator::OperatorEqual | + AtomicComparator::OperatorNotEqual) +/* --------------------------------------------------------------- */ + +/* ----------------------- xs:base64Binary ----------------------- */ +addVisitor(Base64Binary, Base64BinaryType, BinaryDataComparator, + AtomicComparator::OperatorEqual | + AtomicComparator::OperatorNotEqual) +/* --------------------------------------------------------------- */ + +/* -------------------------- xs:boolean ------------------------- */ +addVisitor(Boolean, BooleanType, BooleanComparator, + AllCompOperators) +/* --------------------------------------------------------------- */ + +/* -------------------------- xs:double -------------------------- */ +visitorForDouble(Double, DoubleType) +visitorForDouble(Double, FloatType) +visitorForDouble(Double, DecimalType) +visitorForDouble(Double, IntegerType) +/* --------------------------------------------------------------- */ + +/* --------------------------- xs:float -------------------------- */ +visitorForDouble(Float, DoubleType) +visitorForDouble(Float, FloatType) +visitorForDouble(Float, DecimalType) +visitorForDouble(Float, IntegerType) +/* --------------------------------------------------------------- */ + +/* -------------------------- xs:decimal ------------------------- */ +visitorForDouble(Decimal, DoubleType) +visitorForDouble(Decimal, FloatType) +addVisitor(Decimal, DecimalType, DecimalComparator, + AllCompOperators) +addVisitor(Decimal, IntegerType, DecimalComparator, + AllCompOperators) +/* --------------------------------------------------------------- */ + +/* ------------------------- xs:integer -------------------------- */ +visitorForDouble(Integer, DoubleType) +visitorForDouble(Integer, FloatType) +addVisitor(Integer, DecimalType, DecimalComparator, + AllCompOperators) +addVisitor(Integer, IntegerType, IntegerComparator, + AllCompOperators) +/* --------------------------------------------------------------- */ + +/* -------------------------- xs:QName --------------------------- */ +addVisitor(QName, QNameType, QNameComparator, + AtomicComparator::OperatorEqual | + AtomicComparator::OperatorNotEqual) +/* --------------------------------------------------------------- */ + +/* -------------------------- xs:gYear --------------------------- */ +addVisitor(GYear, GYearType, AbstractDateTimeComparator, + AtomicComparator::OperatorEqual | + AtomicComparator::OperatorNotEqual) +/* --------------------------------------------------------------- */ + +/* -------------------------- xs:gDay ---------------------------- */ +addVisitor(GDay, GDayType, AbstractDateTimeComparator, + AtomicComparator::OperatorEqual | + AtomicComparator::OperatorNotEqual) +/* --------------------------------------------------------------- */ + +/* -------------------------- xs:gMonth -------------------------- */ +addVisitor(GMonth, GMonthType, AbstractDateTimeComparator, + AtomicComparator::OperatorEqual | + AtomicComparator::OperatorNotEqual) +/* --------------------------------------------------------------- */ + +/* ------------------------ xs:gYearMonth ------------------------ */ +addVisitor(GYearMonth, GYearMonthType, AbstractDateTimeComparator, + AtomicComparator::OperatorEqual | + AtomicComparator::OperatorNotEqual) +/* --------------------------------------------------------------- */ + +/* ------------------------ xs:gMonthDay ------------------------- */ +addVisitor(GMonthDay, GMonthDayType, AbstractDateTimeComparator, + AtomicComparator::OperatorEqual | + AtomicComparator::OperatorNotEqual) +/* --------------------------------------------------------------- */ + +/* ------------------------ xs:dateTime -------------------------- */ +addVisitor(DateTime, DateTimeType, AbstractDateTimeComparator, + AllCompOperators) +/* --------------------------------------------------------------- */ + +/* -------------------------- xs:time ---------------------------- */ +addVisitor(SchemaTime, SchemaTimeType, AbstractDateTimeComparator, + AllCompOperators) +/* --------------------------------------------------------------- */ + +/* -------------------------- xs:date ---------------------------- */ +addVisitor(Date, DateType, AbstractDateTimeComparator, + AllCompOperators) +/* --------------------------------------------------------------- */ + +/* ------------------------ xs:duration -------------------------- */ +addVisitor(Duration, DayTimeDurationType, AbstractDurationComparator, + AtomicComparator::OperatorEqual | + AtomicComparator::OperatorNotEqual) +addVisitor(Duration, DurationType, AbstractDurationComparator, + AtomicComparator::OperatorEqual | + AtomicComparator::OperatorNotEqual) +addVisitor(Duration, YearMonthDurationType, AbstractDurationComparator, + AtomicComparator::OperatorEqual | + AtomicComparator::OperatorNotEqual) +/* --------------------------------------------------------------- */ + +/* ------------------ xs:dayTimeDuration ------------------------ */ +addVisitor(DayTimeDuration, DayTimeDurationType, AbstractDurationComparator, + AllCompOperators) +addVisitor(DayTimeDuration, DurationType, AbstractDurationComparator, + AtomicComparator::OperatorEqual | + AtomicComparator::OperatorNotEqual) +addVisitor(DayTimeDuration, YearMonthDurationType, AbstractDurationComparator, + AtomicComparator::OperatorEqual | + AtomicComparator::OperatorNotEqual) +/* --------------------------------------------------------------- */ + +/* ------------------- xs:yearMonthDuration --------------------- */ +addVisitor(YearMonthDuration, DayTimeDurationType, AbstractDurationComparator, + AtomicComparator::OperatorEqual | + AtomicComparator::OperatorNotEqual) +addVisitor(YearMonthDuration, DurationType, AbstractDurationComparator, + AtomicComparator::OperatorEqual | + AtomicComparator::OperatorNotEqual) +addVisitor(YearMonthDuration, YearMonthDurationType, AbstractDurationComparator, + AllCompOperators) +/* --------------------------------------------------------------- */ +#undef addVisitor + +QT_END_NAMESPACE diff --git a/src/xmlpatterns/type/qatomiccomparatorlocators_p.h b/src/xmlpatterns/type/qatomiccomparatorlocators_p.h new file mode 100644 index 0000000..b9aa36f --- /dev/null +++ b/src/xmlpatterns/type/qatomiccomparatorlocators_p.h @@ -0,0 +1,356 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. + +#ifndef Patternist_AtomicComparatorLocators_H +#define Patternist_AtomicComparatorLocators_H + +#include "qatomiccomparatorlocator_p.h" + +/** + * @file + * @short Contains AtomicComparatorLocator sub-classes that finds classes + * which can compare atomic values. + */ + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +namespace QPatternist +{ + + /** + * @author Frans Englich <fenglich@trolltech.com> + */ + class DoubleComparatorLocator : public AtomicComparatorLocator + { + using AtomicComparatorLocator::visit; + virtual AtomicTypeVisitorResult::Ptr visit(const DoubleType *, + const qint16 op, + const SourceLocationReflection *const) const; + virtual AtomicTypeVisitorResult::Ptr visit(const FloatType *, + const qint16 op, + const SourceLocationReflection *const) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DecimalType *, + const qint16 op, + const SourceLocationReflection *const) const; + virtual AtomicTypeVisitorResult::Ptr visit(const IntegerType *, + const qint16 op, + const SourceLocationReflection *const) const; + }; + + /** + * @author Frans Englich <fenglich@trolltech.com> + */ + class FloatComparatorLocator : public AtomicComparatorLocator + { + using AtomicComparatorLocator::visit; + virtual AtomicTypeVisitorResult::Ptr visit(const DoubleType *, + const qint16 op, + const SourceLocationReflection *const) const; + virtual AtomicTypeVisitorResult::Ptr visit(const FloatType *, + const qint16 op, + const SourceLocationReflection *const) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DecimalType *, + const qint16 op, + const SourceLocationReflection *const) const; + virtual AtomicTypeVisitorResult::Ptr visit(const IntegerType *, + const qint16 op, + const SourceLocationReflection *const) const; + }; + + /** + * @author Frans Englich <fenglich@trolltech.com> + */ + class DecimalComparatorLocator : public AtomicComparatorLocator + { + using AtomicComparatorLocator::visit; + virtual AtomicTypeVisitorResult::Ptr visit(const DoubleType *, + const qint16 op, + const SourceLocationReflection *const) const; + virtual AtomicTypeVisitorResult::Ptr visit(const FloatType *, + const qint16 op, + const SourceLocationReflection *const) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DecimalType *, + const qint16 op, + const SourceLocationReflection *const) const; + virtual AtomicTypeVisitorResult::Ptr visit(const IntegerType *, + const qint16 op, + const SourceLocationReflection *const) const; + }; + + /** + * @author Frans Englich <fenglich@trolltech.com> + */ + class IntegerComparatorLocator : public AtomicComparatorLocator + { + using AtomicComparatorLocator::visit; + virtual AtomicTypeVisitorResult::Ptr visit(const DoubleType *, + const qint16 op, + const SourceLocationReflection *const) const; + virtual AtomicTypeVisitorResult::Ptr visit(const FloatType *, + const qint16 op, + const SourceLocationReflection *const) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DecimalType *, + const qint16 op, + const SourceLocationReflection *const) const; + virtual AtomicTypeVisitorResult::Ptr visit(const IntegerType *, + const qint16 op, + const SourceLocationReflection *const) const; + }; + + /** + * @author Frans Englich <fenglich@trolltech.com> + */ + class BooleanComparatorLocator : public AtomicComparatorLocator + { + using AtomicComparatorLocator::visit; + virtual AtomicTypeVisitorResult::Ptr visit(const BooleanType *, + const qint16 op, + const SourceLocationReflection *const) const; + }; + + /** + * @author Frans Englich <fenglich@trolltech.com> + */ + class Base64BinaryComparatorLocator : public AtomicComparatorLocator + { + using AtomicComparatorLocator::visit; + virtual AtomicTypeVisitorResult::Ptr visit(const Base64BinaryType *, + const qint16 op, + const SourceLocationReflection *const) const; + }; + + /** + * @author Frans Englich <fenglich@trolltech.com> + */ + class HexBinaryComparatorLocator : public AtomicComparatorLocator + { + using AtomicComparatorLocator::visit; + virtual AtomicTypeVisitorResult::Ptr visit(const HexBinaryType *, + const qint16 op, + const SourceLocationReflection *const) const; + }; + + /** + * @author Frans Englich <fenglich@trolltech.com> + */ + class QNameComparatorLocator : public AtomicComparatorLocator + { + using AtomicComparatorLocator::visit; + virtual AtomicTypeVisitorResult::Ptr visit(const QNameType *, + const qint16 op, + const SourceLocationReflection *const) const; + }; + + /** + * @author Frans Englich <fenglich@trolltech.com> + */ + class StringComparatorLocator : public AtomicComparatorLocator + { + using AtomicComparatorLocator::visit; + virtual AtomicTypeVisitorResult::Ptr visit(const StringType *, + const qint16 op, + const SourceLocationReflection *const) const; + virtual AtomicTypeVisitorResult::Ptr visit(const UntypedAtomicType *, + const qint16 op, + const SourceLocationReflection *const) const; + virtual AtomicTypeVisitorResult::Ptr visit(const AnyURIType *, + const qint16 op, + const SourceLocationReflection *const) const; + }; + + + /** + * @author Frans Englich <fenglich@trolltech.com> + */ + class GYearComparatorLocator : public AtomicComparatorLocator + { + using AtomicComparatorLocator::visit; + virtual AtomicTypeVisitorResult::Ptr visit(const GYearType *, + const qint16 op, + const SourceLocationReflection *const) const; + }; + + /** + * @author Frans Englich <fenglich@trolltech.com> + */ + class GMonthComparatorLocator : public AtomicComparatorLocator + { + using AtomicComparatorLocator::visit; + virtual AtomicTypeVisitorResult::Ptr visit(const GMonthType *, + const qint16 op, + const SourceLocationReflection *const) const; + }; + + /** + * @author Frans Englich <fenglich@trolltech.com> + */ + class GYearMonthComparatorLocator : public AtomicComparatorLocator + { + using AtomicComparatorLocator::visit; + virtual AtomicTypeVisitorResult::Ptr visit(const GYearMonthType *, + const qint16 op, + const SourceLocationReflection *const) const; + }; + + /** + * @author Frans Englich <fenglich@trolltech.com> + */ + class GMonthDayComparatorLocator : public AtomicComparatorLocator + { + using AtomicComparatorLocator::visit; + virtual AtomicTypeVisitorResult::Ptr visit(const GMonthDayType *, + const qint16 op, + const SourceLocationReflection *const) const; + }; + + /** + * @author Frans Englich <fenglich@trolltech.com> + */ + class GDayComparatorLocator : public AtomicComparatorLocator + { + using AtomicComparatorLocator::visit; + virtual AtomicTypeVisitorResult::Ptr visit(const GDayType *, + const qint16 op, + const SourceLocationReflection *const) const; + }; + + /** + * @author Frans Englich <fenglich@trolltech.com> + */ + class DateTimeComparatorLocator : public AtomicComparatorLocator + { + using AtomicComparatorLocator::visit; + virtual AtomicTypeVisitorResult::Ptr visit(const DateTimeType *, + const qint16 op, + const SourceLocationReflection *const) const; + }; + + /** + * @author Frans Englich <fenglich@trolltech.com> + */ + class SchemaTimeComparatorLocator : public AtomicComparatorLocator + { + using AtomicComparatorLocator::visit; + virtual AtomicTypeVisitorResult::Ptr visit(const SchemaTimeType *, + const qint16 op, + const SourceLocationReflection *const) const; + }; + + /** + * @author Frans Englich <fenglich@trolltech.com> + */ + class DateComparatorLocator : public AtomicComparatorLocator + { + using AtomicComparatorLocator::visit; + virtual AtomicTypeVisitorResult::Ptr visit(const DateType *, + const qint16 op, + const SourceLocationReflection *const) const; + }; + + /** + * @author Frans Englich <fenglich@trolltech.com> + */ + class DurationComparatorLocator : public AtomicComparatorLocator + { + using AtomicComparatorLocator::visit; + virtual AtomicTypeVisitorResult::Ptr visit(const DayTimeDurationType *, + const qint16 op, + const SourceLocationReflection *const) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DurationType *, + const qint16 op, + const SourceLocationReflection *const) const; + virtual AtomicTypeVisitorResult::Ptr visit(const YearMonthDurationType *, + const qint16 op, + const SourceLocationReflection *const) const; + }; + + /** + * @author Frans Englich <fenglich@trolltech.com> + */ + class DayTimeDurationComparatorLocator : public AtomicComparatorLocator + { + using AtomicComparatorLocator::visit; + virtual AtomicTypeVisitorResult::Ptr visit(const DayTimeDurationType *, + const qint16 op, + const SourceLocationReflection *const) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DurationType *, + const qint16 op, + const SourceLocationReflection *const) const; + virtual AtomicTypeVisitorResult::Ptr visit(const YearMonthDurationType *, + const qint16 op, + const SourceLocationReflection *const) const; + }; + + /** + * @author Frans Englich <fenglich@trolltech.com> + */ + class YearMonthDurationComparatorLocator : public AtomicComparatorLocator + { + using AtomicComparatorLocator::visit; + virtual AtomicTypeVisitorResult::Ptr visit(const DayTimeDurationType *, + const qint16 op, + const SourceLocationReflection *const) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DurationType *, + const qint16 op, + const SourceLocationReflection *const) const; + virtual AtomicTypeVisitorResult::Ptr visit(const YearMonthDurationType *, + const qint16 op, + const SourceLocationReflection *const) const; + }; +} + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif diff --git a/src/xmlpatterns/type/qatomicmathematicianlocator.cpp b/src/xmlpatterns/type/qatomicmathematicianlocator.cpp new file mode 100644 index 0000000..c7650c9 --- /dev/null +++ b/src/xmlpatterns/type/qatomicmathematicianlocator.cpp @@ -0,0 +1,85 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qatomicmathematicianlocator_p.h" + +QT_BEGIN_NAMESPACE + +using namespace QPatternist; + +AtomicMathematicianLocator::~AtomicMathematicianLocator() +{ +} + +#define implVisit(type) \ +AtomicTypeVisitorResult::Ptr AtomicMathematicianLocator::visit(const type *, const qint16, \ + const SourceLocationReflection *const) const \ +{ \ + return AtomicTypeVisitorResult::Ptr(); \ +} + +implVisit(AnyAtomicType) +implVisit(AnyURIType) +implVisit(Base64BinaryType) +implVisit(BooleanType) +implVisit(DateTimeType) +implVisit(DateType) +implVisit(DayTimeDurationType) +implVisit(DecimalType) +implVisit(DoubleType) +implVisit(DurationType) +implVisit(FloatType) +implVisit(GDayType) +implVisit(GMonthDayType) +implVisit(GMonthType) +implVisit(GYearMonthType) +implVisit(GYearType) +implVisit(HexBinaryType) +implVisit(IntegerType) +implVisit(NOTATIONType) +implVisit(QNameType) +implVisit(StringType) +implVisit(SchemaTimeType) +implVisit(UntypedAtomicType) +implVisit(YearMonthDurationType) +#undef implVisit + +QT_END_NAMESPACE diff --git a/src/xmlpatterns/type/qatomicmathematicianlocator_p.h b/src/xmlpatterns/type/qatomicmathematicianlocator_p.h new file mode 100644 index 0000000..19ee6e7 --- /dev/null +++ b/src/xmlpatterns/type/qatomicmathematicianlocator_p.h @@ -0,0 +1,158 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. + +#ifndef Patternist_AtomicTypeVisitorResultLocator_H +#define Patternist_AtomicTypeVisitorResultLocator_H + +#include "qatomictypedispatch_p.h" + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +namespace QPatternist +{ + /** + * @todo Docs missing + * + * @author Frans Englich <fenglich@trolltech.com> + */ + class AtomicMathematicianLocator : public ParameterizedAtomicTypeVisitor + { + public: + typedef QExplicitlySharedDataPointer<AtomicMathematicianLocator> Ptr; + + inline AtomicMathematicianLocator() + { + } + + virtual ~AtomicMathematicianLocator(); + + virtual AtomicTypeVisitorResult::Ptr visit(const AnyAtomicType *, + const qint16 op, + const SourceLocationReflection *const reflection) const; + virtual AtomicTypeVisitorResult::Ptr visit(const AnyURIType *, + const qint16 op, + const SourceLocationReflection *const reflection) const; + virtual AtomicTypeVisitorResult::Ptr visit(const Base64BinaryType *, + const qint16 op, + const SourceLocationReflection *const reflection) const; + virtual AtomicTypeVisitorResult::Ptr visit(const BooleanType *, + const qint16 op, + const SourceLocationReflection *const reflection) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DateTimeType *, + const qint16 op, + const SourceLocationReflection *const reflection) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DateType *, + const qint16 op, + const SourceLocationReflection *const reflection) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DayTimeDurationType *, + const qint16 op, + const SourceLocationReflection *const reflection) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DecimalType *, + const qint16 op, + const SourceLocationReflection *const reflection) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DoubleType *, + const qint16 op, + const SourceLocationReflection *const reflection) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DurationType *, + const qint16 op, + const SourceLocationReflection *const reflection) const; + virtual AtomicTypeVisitorResult::Ptr visit(const FloatType *, + const qint16 op, + const SourceLocationReflection *const reflection) const; + virtual AtomicTypeVisitorResult::Ptr visit(const GDayType *, + const qint16 op, + const SourceLocationReflection *const reflection) const; + virtual AtomicTypeVisitorResult::Ptr visit(const GMonthDayType *, + const qint16 op, + const SourceLocationReflection *const reflection) const; + virtual AtomicTypeVisitorResult::Ptr visit(const GMonthType *, + const qint16 op, + const SourceLocationReflection *const reflection) const; + virtual AtomicTypeVisitorResult::Ptr visit(const GYearMonthType *, + const qint16 op, + const SourceLocationReflection *const reflection) const; + virtual AtomicTypeVisitorResult::Ptr visit(const GYearType *, + const qint16 op, + const SourceLocationReflection *const reflection) const; + virtual AtomicTypeVisitorResult::Ptr visit(const HexBinaryType *, + const qint16 op, + const SourceLocationReflection *const reflection) const; + virtual AtomicTypeVisitorResult::Ptr visit(const IntegerType *, + const qint16 op, + const SourceLocationReflection *const reflection) const; + virtual AtomicTypeVisitorResult::Ptr visit(const NOTATIONType *, + const qint16 op, + const SourceLocationReflection *const reflection) const; + virtual AtomicTypeVisitorResult::Ptr visit(const QNameType *, + const qint16 op, + const SourceLocationReflection *const reflection) const; + virtual AtomicTypeVisitorResult::Ptr visit(const StringType *, + const qint16 op, + const SourceLocationReflection *const reflection) const; + virtual AtomicTypeVisitorResult::Ptr visit(const SchemaTimeType *, + const qint16 op, + const SourceLocationReflection *const reflection) const; + virtual AtomicTypeVisitorResult::Ptr visit(const UntypedAtomicType *, + const qint16 op, + const SourceLocationReflection *const reflection) const; + virtual AtomicTypeVisitorResult::Ptr visit(const YearMonthDurationType *, + const qint16 op, + const SourceLocationReflection *const reflection) const; + }; +} + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif diff --git a/src/xmlpatterns/type/qatomicmathematicianlocators.cpp b/src/xmlpatterns/type/qatomicmathematicianlocators.cpp new file mode 100644 index 0000000..92d7b2c --- /dev/null +++ b/src/xmlpatterns/type/qatomicmathematicianlocators.cpp @@ -0,0 +1,168 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qabstractfloatmathematician_p.h" +#include "qatomicmathematicianlocators_p.h" +#include "qatomicmathematicians_p.h" + +QT_BEGIN_NAMESPACE + +using namespace QPatternist; + +#define implMathVisit(ownerClass, visitor, mather, validOps) \ +AtomicTypeVisitorResult::Ptr \ +ownerClass##MathematicianLocator::visit(const visitor *, const qint16 op, \ + const SourceLocationReflection *const r) const \ +{ \ + Q_UNUSED(r) \ + /* Note the extra paranteses around validOps. */ \ + if(((validOps) & AtomicMathematician::Operator(op)) == op) \ + return AtomicTypeVisitorResult::Ptr(new mather()); \ + else \ + return AtomicTypeVisitorResult::Ptr(); \ +} + +#define implReportingMathVisit(ownerClass, visitor, mather, validOps) \ +AtomicTypeVisitorResult::Ptr \ +ownerClass##MathematicianLocator::visit(const visitor *, const qint16 op, \ + const SourceLocationReflection *const r) const \ +{ \ + /* Note the extra paranteses around validOps. */ \ + if(((validOps) & AtomicMathematician::Operator(op)) == op) \ + return AtomicTypeVisitorResult::Ptr(new mather(r)); \ + else \ + return AtomicTypeVisitorResult::Ptr(); \ +} + +#define implRevReportingMathVisit(ownerClass, visitor, mather, validOps) \ +AtomicTypeVisitorResult::Ptr \ +ownerClass##MathematicianLocator::visit(const visitor *, const qint16 op, \ + const SourceLocationReflection *const r) const \ +{ \ + /* Note the extra paranteses around validOps. */ \ + if(((validOps) & AtomicMathematician::Operator(op)) == op) \ + return AtomicTypeVisitorResult::Ptr(new OperandSwitcherMathematician( \ + AtomicMathematician::Ptr(new mather(r)))); \ + else \ + return AtomicTypeVisitorResult::Ptr(); \ +} + +static const AtomicMathematician::Operators AllMathOperators(AtomicMathematician::Add | + AtomicMathematician::Div | + AtomicMathematician::IDiv | + AtomicMathematician::Mod | + AtomicMathematician::Multiply | + AtomicMathematician::Substract); + +static const AtomicMathematician::Operators DivMultiply(AtomicMathematician::Multiply | + AtomicMathematician::Div); + +static const AtomicMathematician::Operators DurationOps(AtomicMathematician::Div | + AtomicMathematician::Substract | + AtomicMathematician::Add); + +static const AtomicMathematician::Operators DTOps(AtomicMathematician::Substract | + AtomicMathematician::Add); + +implReportingMathVisit(Double, DecimalType, DoubleMathematician, AllMathOperators) +implReportingMathVisit(Double, DoubleType, DoubleMathematician, AllMathOperators) +implReportingMathVisit(Double, FloatType, DoubleMathematician, AllMathOperators) +implReportingMathVisit(Double, IntegerType, DoubleMathematician, AllMathOperators) +implRevReportingMathVisit(Double, YearMonthDurationType, DurationNumericMathematician, AtomicMathematician::Multiply) +implRevReportingMathVisit(Double, DayTimeDurationType, DurationNumericMathematician, AtomicMathematician::Multiply) + +implReportingMathVisit(Float, DecimalType, FloatMathematician, AllMathOperators) +implReportingMathVisit(Float, DoubleType, DoubleMathematician, AllMathOperators) +implReportingMathVisit(Float, FloatType, FloatMathematician, AllMathOperators) +implReportingMathVisit(Float, IntegerType, FloatMathematician, AllMathOperators) +implRevReportingMathVisit(Float, YearMonthDurationType, DurationNumericMathematician, AtomicMathematician::Multiply) +implRevReportingMathVisit(Float, DayTimeDurationType, DurationNumericMathematician, AtomicMathematician::Multiply) + +implReportingMathVisit(Decimal, DecimalType, DecimalMathematician, AllMathOperators) +implReportingMathVisit(Decimal, DoubleType, DoubleMathematician, AllMathOperators) +implReportingMathVisit(Decimal, FloatType, FloatMathematician, AllMathOperators) +implReportingMathVisit(Decimal, IntegerType, DecimalMathematician, AllMathOperators) +implRevReportingMathVisit(Decimal, YearMonthDurationType, DurationNumericMathematician, AtomicMathematician::Multiply) +implRevReportingMathVisit(Decimal, DayTimeDurationType, DurationNumericMathematician, AtomicMathematician::Multiply) + +implReportingMathVisit(Integer, DecimalType, DecimalMathematician, AllMathOperators) +implReportingMathVisit(Integer, DoubleType, DoubleMathematician, AllMathOperators) +implReportingMathVisit(Integer, FloatType, FloatMathematician, AllMathOperators) +implReportingMathVisit(Integer, IntegerType, IntegerMathematician, AllMathOperators) +implRevReportingMathVisit(Integer, YearMonthDurationType, DurationNumericMathematician, AtomicMathematician::Multiply) +implRevReportingMathVisit(Integer, DayTimeDurationType, DurationNumericMathematician, AtomicMathematician::Multiply) + +implRevReportingMathVisit(DayTimeDuration, DateTimeType, DateTimeDurationMathematician, AtomicMathematician::Add) +implRevReportingMathVisit(DayTimeDuration, DateType, DateTimeDurationMathematician, AtomicMathematician::Add) +implMathVisit(DayTimeDuration, DayTimeDurationType, DurationDurationMathematician, DurationOps) +implReportingMathVisit(DayTimeDuration, DecimalType, DurationNumericMathematician, DivMultiply) +implReportingMathVisit(DayTimeDuration, DoubleType, DurationNumericMathematician, DivMultiply) +implReportingMathVisit(DayTimeDuration, FloatType, DurationNumericMathematician, DivMultiply) +implReportingMathVisit(DayTimeDuration, IntegerType, DurationNumericMathematician, DivMultiply) +implRevReportingMathVisit(DayTimeDuration, SchemaTimeType, DateTimeDurationMathematician, AtomicMathematician::Add) + +implRevReportingMathVisit(YearMonthDuration, DateTimeType, DateTimeDurationMathematician, AtomicMathematician::Add) +implRevReportingMathVisit(YearMonthDuration, DateType, DateTimeDurationMathematician, AtomicMathematician::Add) +implReportingMathVisit(YearMonthDuration, DecimalType, DurationNumericMathematician, DivMultiply) +implReportingMathVisit(YearMonthDuration, DoubleType, DurationNumericMathematician, DivMultiply) +implReportingMathVisit(YearMonthDuration, FloatType, DurationNumericMathematician, DivMultiply) +implReportingMathVisit(YearMonthDuration, IntegerType, DurationNumericMathematician, DivMultiply) +implMathVisit(YearMonthDuration, YearMonthDurationType, DurationDurationMathematician, DurationOps) + +implMathVisit(Date, DateType, AbstractDateTimeMathematician, + AtomicMathematician::Substract) +implReportingMathVisit(Date, YearMonthDurationType, DateTimeDurationMathematician, DTOps) +implReportingMathVisit(Date, DayTimeDurationType, DateTimeDurationMathematician, DTOps) + +implMathVisit(SchemaTime, SchemaTimeType, AbstractDateTimeMathematician, + AtomicMathematician::Substract) +implReportingMathVisit(SchemaTime, DayTimeDurationType, DateTimeDurationMathematician, DTOps) + +implMathVisit(DateTime, DateTimeType, AbstractDateTimeMathematician, + AtomicMathematician::Substract) +implReportingMathVisit(DateTime, YearMonthDurationType, DateTimeDurationMathematician, DTOps) +implReportingMathVisit(DateTime, DayTimeDurationType, DateTimeDurationMathematician, DTOps) + +#undef implMathVisit +#undef implReportingMathVisit +#undef implRevReportingMathVisit + +QT_END_NAMESPACE diff --git a/src/xmlpatterns/type/qatomicmathematicianlocators_p.h b/src/xmlpatterns/type/qatomicmathematicianlocators_p.h new file mode 100644 index 0000000..5ef958a --- /dev/null +++ b/src/xmlpatterns/type/qatomicmathematicianlocators_p.h @@ -0,0 +1,249 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. + +#ifndef Patternist_AtomicMathematicianLocators_H +#define Patternist_AtomicMathematicianLocators_H + +#include "qatomicmathematician_p.h" +#include "qatomicmathematicianlocator_p.h" + +/** + * @file + * @short Contains AtomicMathematicianLocator sub-classes that finds classes + * which can perform arithmetics between atomic values. + */ + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +namespace QPatternist +{ + /** + * @author Frans Englich <fenglich@trolltech.com> + * @todo docs + */ + class DoubleMathematicianLocator : public AtomicMathematicianLocator + { + using AtomicMathematicianLocator::visit; + virtual AtomicTypeVisitorResult::Ptr visit(const DayTimeDurationType *, const qint16 op, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DecimalType *, const qint16 op, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DoubleType *, const qint16 op, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const FloatType *, const qint16 op, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const IntegerType *, const qint16 op, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const YearMonthDurationType *, const qint16 op, + const SourceLocationReflection *const r) const; + }; + + /** + * @author Frans Englich <fenglich@trolltech.com> + * @todo docs + */ + class FloatMathematicianLocator : public AtomicMathematicianLocator + { + using AtomicMathematicianLocator::visit; + virtual AtomicTypeVisitorResult::Ptr visit(const DayTimeDurationType *, const qint16 op, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DecimalType *, const qint16 op, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DoubleType *, const qint16 op, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const FloatType *, const qint16 op, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const IntegerType *, const qint16 op, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const YearMonthDurationType *, const qint16 op, + const SourceLocationReflection *const r) const; + }; + + /** + * @author Frans Englich <fenglich@trolltech.com> + * @todo docs + */ + class DecimalMathematicianLocator : public AtomicMathematicianLocator + { + using AtomicMathematicianLocator::visit; + virtual AtomicTypeVisitorResult::Ptr visit(const DayTimeDurationType *, const qint16 op, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DecimalType *, const qint16 op, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DoubleType *, const qint16 op, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const FloatType *, const qint16 op, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const IntegerType *, const qint16 op, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const YearMonthDurationType *, const qint16 op, + const SourceLocationReflection *const r) const; + }; + + /** + * @author Frans Englich <fenglich@trolltech.com> + * @todo docs + */ + class IntegerMathematicianLocator : public AtomicMathematicianLocator + { + using AtomicMathematicianLocator::visit; + virtual AtomicTypeVisitorResult::Ptr visit(const DayTimeDurationType *, const qint16 op, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DecimalType *, const qint16 op, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DoubleType *, const qint16 op, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const FloatType *, const qint16 op, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const IntegerType *, const qint16 op, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const YearMonthDurationType *, const qint16 op, + const SourceLocationReflection *const r) const; + }; + + /** + * @author Frans Englich <fenglich@trolltech.com> + * @todo docs + */ + class DateMathematicianLocator : public AtomicMathematicianLocator + { + using AtomicMathematicianLocator::visit; + virtual AtomicTypeVisitorResult::Ptr visit(const DateType *, const qint16 op, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const YearMonthDurationType *, const qint16 op, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DayTimeDurationType *, const qint16 op, + const SourceLocationReflection *const r) const; + }; + + /** + * @author Frans Englich <fenglich@trolltech.com> + * @todo docs + */ + class SchemaTimeMathematicianLocator : public AtomicMathematicianLocator + { + using AtomicMathematicianLocator::visit; + virtual AtomicTypeVisitorResult::Ptr visit(const SchemaTimeType *, const qint16 op, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DayTimeDurationType *, const qint16 op, + const SourceLocationReflection *const r) const; + }; + + /** + * @author Frans Englich <fenglich@trolltech.com> + * @todo docs + */ + class DateTimeMathematicianLocator : public AtomicMathematicianLocator + { + using AtomicMathematicianLocator::visit; + virtual AtomicTypeVisitorResult::Ptr visit(const DateTimeType *, const qint16 op, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const YearMonthDurationType *, const qint16 op, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DayTimeDurationType *, const qint16 op, + const SourceLocationReflection *const r) const; + }; + /** + * @author Frans Englich <fenglich@trolltech.com> + * @todo docs + */ + class DayTimeDurationMathematicianLocator : public AtomicMathematicianLocator + { + using AtomicMathematicianLocator::visit; + virtual AtomicTypeVisitorResult::Ptr visit(const DateTimeType *, const qint16 op, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DateType *, const qint16 op, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DayTimeDurationType *, const qint16 op, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DecimalType *, const qint16 op, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DoubleType *, const qint16 op, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const FloatType *, const qint16 op, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const IntegerType *, const qint16 op, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const SchemaTimeType *, const qint16 op, + const SourceLocationReflection *const r) const; + }; + + /** + * @author Frans Englich <fenglich@trolltech.com> + * @todo docs + */ + class YearMonthDurationMathematicianLocator : public AtomicMathematicianLocator + { + using AtomicMathematicianLocator::visit; + virtual AtomicTypeVisitorResult::Ptr visit(const DateTimeType *, const qint16 op, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DateType *, const qint16 op, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DecimalType *, const qint16 op, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const DoubleType *, const qint16 op, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const FloatType *, const qint16 op, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const IntegerType *, const qint16 op, + const SourceLocationReflection *const r) const; + virtual AtomicTypeVisitorResult::Ptr visit(const YearMonthDurationType *, const qint16 op, + const SourceLocationReflection *const r) const; + }; +} + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif diff --git a/src/xmlpatterns/type/qatomictype.cpp b/src/xmlpatterns/type/qatomictype.cpp new file mode 100644 index 0000000..45f291a --- /dev/null +++ b/src/xmlpatterns/type/qatomictype.cpp @@ -0,0 +1,118 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qitem_p.h" +#include "qbuiltintypes_p.h" +#include "qitem_p.h" +#include "qschematypefactory_p.h" +#include "qxmlname.h" + +#include "qatomictype_p.h" + +QT_BEGIN_NAMESPACE + +using namespace QPatternist; + +AtomicType::AtomicType() +{ +} + +AtomicType::~AtomicType() +{ +} + +bool AtomicType::xdtTypeMatches(const ItemType::Ptr &other) const +{ + if(other->isAtomicType()) + { + if(*other == *this) + return true; + else + return xdtTypeMatches(other->xdtSuperType()); + } + else + return false; +} + +bool AtomicType::itemMatches(const Item &item) const +{ + Q_ASSERT(item); + if(item.isNode()) + return false; + else + { + const SchemaType::Ptr t(static_cast<AtomicType *>(item.type().data())); + return wxsTypeMatches(t); + } +} + +ItemType::Ptr AtomicType::atomizedType() const +{ + return AtomicType::Ptr(const_cast<AtomicType *>(this)); +} + +QString AtomicType::displayName(const NamePool::Ptr &) const +{ + /* A bit faster than calling name()->displayName() */ + return QLatin1String("xs:anyAtomicType"); +} + +bool AtomicType::isNodeType() const +{ + return false; +} + +bool AtomicType::isAtomicType() const +{ + return true; +} + +SchemaType::TypeCategory AtomicType::category() const +{ + return SimpleTypeAtomic; +} + +SchemaType::DerivationMethod AtomicType::derivationMethod() const +{ + return DerivationRestriction; +} + +QT_END_NAMESPACE diff --git a/src/xmlpatterns/type/qatomictype_p.h b/src/xmlpatterns/type/qatomictype_p.h new file mode 100644 index 0000000..92b7853 --- /dev/null +++ b/src/xmlpatterns/type/qatomictype_p.h @@ -0,0 +1,160 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. + +#ifndef Patternist_AtomicType_H +#define Patternist_AtomicType_H + +#include "qanysimpletype_p.h" +#include "qatomiccasterlocator_p.h" +#include "qatomiccomparatorlocator_p.h" +#include "qatomicmathematicianlocator_p.h" +#include "qatomictypedispatch_p.h" +#include "qitemtype_p.h" + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +namespace QPatternist +{ + class Item; + class SourceLocationReflection; + + /** + * @short Base class for all classes that implements atomic types. + * + * AtomicType does not implement @c xs:anyAtomicType, it is the C++ + * base class for classes that implement atomic types, such as @c xs:anyAtomicType. + * + * @ingroup Patternist_types + * @author Frans Englich <fenglich@trolltech.com> + */ + class AtomicType : public ItemType, + public AnySimpleType + { + public: + + typedef QExplicitlySharedDataPointer<AtomicType> Ptr; + + virtual ~AtomicType(); + + /** + * Implements a generic algorithm which relies on wxsTypeMatches(). + * + * @returns @c true depending on if @p item is an atomic type, and that + * AtomicValue::itemType()'s SequenceType::itemType() matches this type. + */ + virtual bool itemMatches(const Item &item) const; + + /** + * @returns the result of SharedQXmlName::displayName(), of the SharedQName + * object returned from the name() function. + */ + virtual QString displayName(const NamePool::Ptr &np) const; + + /** + * returns always @c false + */ + virtual bool isNodeType() const; + + /** + * returns always @c true + */ + virtual bool isAtomicType() const; + + /** + * Determines whether @p other is equal to this type, or is a + * sub-type of this type. + * + * The implementation is generic, relying on operator==() + * and xdtSuperType(). + */ + virtual bool xdtTypeMatches(const ItemType::Ptr &other) const; + + /** + * @returns always 'this' + */ + virtual ItemType::Ptr atomizedType() const; + + /** + * @returns always SchemaType::SimpleTypeAtomic + */ + virtual TypeCategory category() const; + + /** + * @returns DerivationRestriction + */ + virtual DerivationMethod derivationMethod() const; + + virtual AtomicTypeVisitorResult::Ptr + accept(const QExplicitlySharedDataPointer<AtomicTypeVisitor> &visitor, + const SourceLocationReflection *const) const = 0; + + virtual AtomicTypeVisitorResult::Ptr + accept(const ParameterizedAtomicTypeVisitor::Ptr &visitor, + const qint16 param, + const SourceLocationReflection *const) const = 0; + + virtual AtomicComparatorLocator::Ptr comparatorLocator() const = 0; + virtual AtomicMathematicianLocator::Ptr mathematicianLocator() const = 0; + virtual AtomicCasterLocator::Ptr casterLocator() const = 0; + + protected: + AtomicType(); + + }; +} + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif diff --git a/src/xmlpatterns/type/qatomictypedispatch_p.h b/src/xmlpatterns/type/qatomictypedispatch_p.h new file mode 100644 index 0000000..2158fd8 --- /dev/null +++ b/src/xmlpatterns/type/qatomictypedispatch_p.h @@ -0,0 +1,277 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. + +#ifndef Patternist_AtomicTypeDispatch_H +#define Patternist_AtomicTypeDispatch_H + +#include <QSharedData> + + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +namespace QPatternist +{ + class AnyAtomicType; + class AnyURIType; + class Base64BinaryType; + class BooleanType; + class DateTimeType; + class DateType; + class DayTimeDurationType; + class DecimalType; + class DoubleType; + class DurationType; + class FloatType; + class GDayType; + class GMonthDayType; + class GMonthType; + class GYearMonthType; + class GYearType; + class HexBinaryType; + class IntegerType; + class NOTATIONType; + class QNameType; + class SourceLocationReflection; + class StringType; + class SchemaTimeType; + class UntypedAtomicType; + class YearMonthDurationType; + + enum TypeOfDerivedInteger + { + TypeByte, + TypeInt, + TypeLong, + TypeNegativeInteger, + TypeNonNegativeInteger, + TypeNonPositiveInteger, + TypePositiveInteger, + TypeShort, + TypeUnsignedByte, + TypeUnsignedInt, + TypeUnsignedLong, + TypeUnsignedShort + }; + + template<TypeOfDerivedInteger DerivedType> class DerivedIntegerType; + + enum TypeOfDerivedString + { + TypeString, + TypeNormalizedString, + TypeToken, + TypeLanguage, + TypeNMTOKEN, + TypeName, + TypeNCName, + TypeID, + TypeIDREF, + TypeENTITY + }; + + template<TypeOfDerivedString DerivedType> class DerivedStringType; + + /** + * @todo Documentation's missing: + * - Add link to wikipedia's "multiple dispatch" and "visitor" page. + * - Add link to http://www.eptacom.net/pubblicazioni/pub_eng/mdisp.html + * + * @defgroup Patternist_types_dispatch Atomic Type Dispatching + */ + + /** + * @todo Docs missing + * + * @ingroup Patternist_types_dispatch + * @author Frans Englich <fenglich@trolltech.com> + */ + class AtomicTypeVisitorResult : public QSharedData + { + public: + typedef QExplicitlySharedDataPointer<AtomicTypeVisitorResult> Ptr; + AtomicTypeVisitorResult() {} + virtual ~AtomicTypeVisitorResult() {} + }; + + /** + * @todo Docs missing + * + * @see ParameterizedAtomicTypeVisitor + * @ingroup Patternist_types_dispatch + * @author Frans Englich <fenglich@trolltech.com> + */ + class AtomicTypeVisitor : public QSharedData + { + public: + typedef QExplicitlySharedDataPointer<AtomicTypeVisitor> Ptr; + virtual ~AtomicTypeVisitor() {} + + virtual AtomicTypeVisitorResult::Ptr visit(const AnyAtomicType *, + const SourceLocationReflection *const reflection) const = 0; + virtual AtomicTypeVisitorResult::Ptr visit(const AnyURIType *, + const SourceLocationReflection *const reflection) const = 0; + virtual AtomicTypeVisitorResult::Ptr visit(const Base64BinaryType *, + const SourceLocationReflection *const reflection) const = 0; + virtual AtomicTypeVisitorResult::Ptr visit(const BooleanType *, + const SourceLocationReflection *const reflection) const = 0; + virtual AtomicTypeVisitorResult::Ptr visit(const DateTimeType *, + const SourceLocationReflection *const reflection) const = 0; + virtual AtomicTypeVisitorResult::Ptr visit(const DateType *, + const SourceLocationReflection *const reflection) const = 0; + virtual AtomicTypeVisitorResult::Ptr visit(const DayTimeDurationType *, + const SourceLocationReflection *const reflection) const = 0; + virtual AtomicTypeVisitorResult::Ptr visit(const DecimalType *, + const SourceLocationReflection *const reflection) const = 0; + virtual AtomicTypeVisitorResult::Ptr visit(const DoubleType *, + const SourceLocationReflection *const reflection) const = 0; + virtual AtomicTypeVisitorResult::Ptr visit(const DurationType *, + const SourceLocationReflection *const reflection) const = 0; + virtual AtomicTypeVisitorResult::Ptr visit(const FloatType *, + const SourceLocationReflection *const reflection) const = 0; + virtual AtomicTypeVisitorResult::Ptr visit(const GDayType *, + const SourceLocationReflection *const reflection) const = 0; + virtual AtomicTypeVisitorResult::Ptr visit(const GMonthDayType *, + const SourceLocationReflection *const reflection) const = 0; + virtual AtomicTypeVisitorResult::Ptr visit(const GMonthType *, + const SourceLocationReflection *const reflection) const = 0; + virtual AtomicTypeVisitorResult::Ptr visit(const GYearMonthType *, + const SourceLocationReflection *const reflection) const = 0; + virtual AtomicTypeVisitorResult::Ptr visit(const GYearType *, + const SourceLocationReflection *const reflection) const = 0; + virtual AtomicTypeVisitorResult::Ptr visit(const HexBinaryType *, + const SourceLocationReflection *const reflection) const = 0; + virtual AtomicTypeVisitorResult::Ptr visit(const IntegerType *, + const SourceLocationReflection *const reflection) const = 0; + virtual AtomicTypeVisitorResult::Ptr visit(const NOTATIONType *, + const SourceLocationReflection *const reflection) const = 0; + virtual AtomicTypeVisitorResult::Ptr visit(const QNameType *, + const SourceLocationReflection *const reflection) const = 0; + virtual AtomicTypeVisitorResult::Ptr visit(const StringType *, + const SourceLocationReflection *const reflection) const = 0; + virtual AtomicTypeVisitorResult::Ptr visit(const SchemaTimeType *, + const SourceLocationReflection *const reflection) const = 0; + virtual AtomicTypeVisitorResult::Ptr visit(const UntypedAtomicType *, + const SourceLocationReflection *const reflection) const = 0; + virtual AtomicTypeVisitorResult::Ptr visit(const YearMonthDurationType *, + const SourceLocationReflection *const reflection) const = 0; + }; + + /** + * @todo Docs missing + * + * @see AtomicTypeVisitor + * @ingroup Patternist_types_dispatch + * @author Frans Englich <fenglich@trolltech.com> + */ + class ParameterizedAtomicTypeVisitor : public QSharedData + { + public: + typedef QExplicitlySharedDataPointer<ParameterizedAtomicTypeVisitor> Ptr; + virtual ~ParameterizedAtomicTypeVisitor() {} + + virtual AtomicTypeVisitorResult::Ptr visit(const AnyAtomicType *, const qint16 param, + const SourceLocationReflection *const reflection) const = 0; + virtual AtomicTypeVisitorResult::Ptr visit(const AnyURIType *, const qint16 param, + const SourceLocationReflection *const reflection) const = 0; + virtual AtomicTypeVisitorResult::Ptr visit(const Base64BinaryType *, const qint16 param, + const SourceLocationReflection *const reflection) const = 0; + virtual AtomicTypeVisitorResult::Ptr visit(const BooleanType *, const qint16 param, + const SourceLocationReflection *const reflection) const = 0; + virtual AtomicTypeVisitorResult::Ptr visit(const DateTimeType *, const qint16 param, + const SourceLocationReflection *const reflection) const = 0; + virtual AtomicTypeVisitorResult::Ptr visit(const DateType *, const qint16 param, + const SourceLocationReflection *const reflection) const = 0; + virtual AtomicTypeVisitorResult::Ptr visit(const DayTimeDurationType *, const qint16 param, + const SourceLocationReflection *const reflection) const = 0; + virtual AtomicTypeVisitorResult::Ptr visit(const DecimalType *, const qint16 param, + const SourceLocationReflection *const reflection) const = 0; + virtual AtomicTypeVisitorResult::Ptr visit(const DoubleType *, const qint16 param, + const SourceLocationReflection *const reflection) const = 0; + virtual AtomicTypeVisitorResult::Ptr visit(const DurationType *, const qint16 param, + const SourceLocationReflection *const reflection) const = 0; + virtual AtomicTypeVisitorResult::Ptr visit(const FloatType *, const qint16 param, + const SourceLocationReflection *const reflection) const = 0; + virtual AtomicTypeVisitorResult::Ptr visit(const GDayType *, const qint16 param, + const SourceLocationReflection *const reflection) const = 0; + virtual AtomicTypeVisitorResult::Ptr visit(const GMonthDayType *, const qint16 param, + const SourceLocationReflection *const reflection) const = 0; + virtual AtomicTypeVisitorResult::Ptr visit(const GMonthType *, const qint16 param, + const SourceLocationReflection *const reflection) const = 0; + virtual AtomicTypeVisitorResult::Ptr visit(const GYearMonthType *, const qint16 param, + const SourceLocationReflection *const reflection) const = 0; + virtual AtomicTypeVisitorResult::Ptr visit(const GYearType *, const qint16 param, + const SourceLocationReflection *const reflection) const = 0; + virtual AtomicTypeVisitorResult::Ptr visit(const HexBinaryType *, const qint16 param, + const SourceLocationReflection *const reflection) const = 0; + virtual AtomicTypeVisitorResult::Ptr visit(const IntegerType *, const qint16 param, + const SourceLocationReflection *const reflection) const = 0; + virtual AtomicTypeVisitorResult::Ptr visit(const NOTATIONType *, const qint16 param, + const SourceLocationReflection *const reflection) const = 0; + virtual AtomicTypeVisitorResult::Ptr visit(const QNameType *, const qint16 param, + const SourceLocationReflection *const reflection) const = 0; + virtual AtomicTypeVisitorResult::Ptr visit(const StringType *, const qint16 param, + const SourceLocationReflection *const reflection) const = 0; + virtual AtomicTypeVisitorResult::Ptr visit(const SchemaTimeType *, const qint16 param, + const SourceLocationReflection *const reflection) const = 0; + virtual AtomicTypeVisitorResult::Ptr visit(const UntypedAtomicType *, const qint16 param, + const SourceLocationReflection *const reflection) const = 0; + virtual AtomicTypeVisitorResult::Ptr visit(const YearMonthDurationType *, const qint16 param, + const SourceLocationReflection *const reflection) const = 0; + }; +} + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif diff --git a/src/xmlpatterns/type/qbasictypesfactory.cpp b/src/xmlpatterns/type/qbasictypesfactory.cpp new file mode 100644 index 0000000..662308c --- /dev/null +++ b/src/xmlpatterns/type/qbasictypesfactory.cpp @@ -0,0 +1,128 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + + +#include "qbuiltintypes_p.h" +#include "qcommonnamespaces_p.h" + +#include "qbasictypesfactory_p.h" + +QT_BEGIN_NAMESPACE + +using namespace QPatternist; + +SchemaTypeFactory::Ptr BasicTypesFactory::self(const NamePool::Ptr &np) +{ + /* We don't store a global static here, because it's dependent on the NamePool. */ + return SchemaTypeFactory::Ptr(new BasicTypesFactory(np)); +} + +BasicTypesFactory::BasicTypesFactory(const NamePool::Ptr &np) +{ + m_types.reserve(48); + +#define add(aName) m_types.insert(BuiltinTypes::aName->name(np), AtomicType::Ptr(BuiltinTypes::aName)) +#define addNA(aName) m_types.insert(BuiltinTypes::aName->name(np), BuiltinTypes::aName) + add(xsString); + add(xsBoolean); + add(xsDecimal); + add(xsDouble); + add(xsFloat); + add(xsDate); + add(xsTime); + add(xsDateTime); + add(xsDuration); + add(xsAnyURI); + add(xsGDay); + add(xsGMonthDay); + add(xsGMonth); + add(xsGYearMonth); + add(xsGYear); + add(xsBase64Binary); + add(xsHexBinary); + add(xsQName); + add(xsInteger); + addNA(xsAnyType); + addNA(xsAnySimpleType); + add(xsYearMonthDuration); + add(xsDayTimeDuration); + add(xsAnyAtomicType); + addNA(xsUntyped); + add(xsUntypedAtomic); + add(xsNOTATION); + /* Add derived primitives. */ + add(xsNonPositiveInteger); + add(xsNegativeInteger); + add(xsLong); + add(xsInt); + add(xsShort); + add(xsByte); + add(xsNonNegativeInteger); + add(xsUnsignedLong); + add(xsUnsignedInt); + add(xsUnsignedShort); + add(xsUnsignedByte); + add(xsPositiveInteger); + add(xsNormalizedString); + add(xsToken); + add(xsLanguage); + add(xsNMTOKEN); + add(xsName); + add(xsNCName); + add(xsID); + add(xsIDREF); + add(xsENTITY); + +#undef add +#undef addNA +} + +SchemaType::Ptr BasicTypesFactory::createSchemaType(const QXmlName name) const +{ + return m_types.value(name); +} + +SchemaType::Hash BasicTypesFactory::types() const +{ + return m_types; +} + +QT_END_NAMESPACE diff --git a/src/xmlpatterns/type/qbasictypesfactory_p.h b/src/xmlpatterns/type/qbasictypesfactory_p.h new file mode 100644 index 0000000..9b2db3e --- /dev/null +++ b/src/xmlpatterns/type/qbasictypesfactory_p.h @@ -0,0 +1,121 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. + +#ifndef Patternist_BuiltinTypesFactory_H +#define Patternist_BuiltinTypesFactory_H + +#include <QHash> +#include "qschematypefactory_p.h" + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +namespace QPatternist +{ + + /** + * @short Factory for creating schema types for the types defined in XSL-T 2.0. + * + * Theses types are essentially the builtin primitive types, plus @c xs:integer, + * and the types defined in the XPath Data Model. + * + * @ingroup Patternist_types + * @see <a href="http://www.w3.org/TR/xpath-datamodel/#types-predefined">XQuery 1.0 and + * XPath 2.0 Data Model, 2.6.2 Predefined Types</a> + * @see <a href="http://www.w3.org/TR/xslt20/#built-in-types">XSL Transformations (XSLT) + * Version 2.0, 3.13 Built-in Types</a> + * @see <a href="http://www.w3.org/TR/xmlschema-2/#built-in-primitive-datatypes">XML Schema + * Part 2: Datatypes Second Edition, 3.2 Primitive datatypes</a> + * @author Frans Englich <fenglich@trolltech.com> + */ + class BasicTypesFactory : public SchemaTypeFactory + { + public: + + /** + * Creates a primitive type for @p name. If @p name is not supported, + * @c null is returned. + * The intened supported types are the builtin primitive and derived types. + * That is, the 19 W3C XML Schema types, and the additional 5 in the XPath Data MOdel. + * + * @note This does not handle user defined types, only builtin types. + * @todo Update documentation, proportionally with progress. + */ + virtual SchemaType::Ptr createSchemaType(const QXmlName ) const; + + virtual SchemaType::Hash types() const; + + /** + * @returns the singleton instance of BasicTypesFactory. + */ + static SchemaTypeFactory::Ptr self(const NamePool::Ptr &np); + + protected: + /** + * This constructor is protected. Use the static self() function + * to retrieve a singleton instance. + */ + BasicTypesFactory(const NamePool::Ptr &np); + + private: + /** + * A dictonary of builtin primitive and derived primitives. + */ + SchemaType::Hash m_types; + }; +} + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif diff --git a/src/xmlpatterns/type/qbuiltinatomictype.cpp b/src/xmlpatterns/type/qbuiltinatomictype.cpp new file mode 100644 index 0000000..48106a7 --- /dev/null +++ b/src/xmlpatterns/type/qbuiltinatomictype.cpp @@ -0,0 +1,94 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qatomictype_p.h" +#include "qitem_p.h" +#include "qbuiltintypes_p.h" +#include "qschematype_p.h" + +#include "qbuiltinatomictype_p.h" + +QT_BEGIN_NAMESPACE + +using namespace QPatternist; + +BuiltinAtomicType::BuiltinAtomicType(const AtomicType::Ptr &base, + const AtomicComparatorLocator::Ptr &comp, + const AtomicMathematicianLocator::Ptr &mather, + const AtomicCasterLocator::Ptr &casterlocator) + : m_superType(base), + m_comparatorLocator(comp), + m_mathematicianLocator(mather), + m_casterLocator(casterlocator) +{ +} + +SchemaType::Ptr BuiltinAtomicType::wxsSuperType() const +{ + return m_superType; +} + +ItemType::Ptr BuiltinAtomicType::xdtSuperType() const +{ + return m_superType; +} + +bool BuiltinAtomicType::isAbstract() const +{ + return false; +} + +AtomicComparatorLocator::Ptr BuiltinAtomicType::comparatorLocator() const +{ + return m_comparatorLocator; +} + +AtomicMathematicianLocator::Ptr BuiltinAtomicType::mathematicianLocator() const +{ + return m_mathematicianLocator; +} + +AtomicCasterLocator::Ptr BuiltinAtomicType::casterLocator() const +{ + return m_casterLocator; +} + +QT_END_NAMESPACE diff --git a/src/xmlpatterns/type/qbuiltinatomictype_p.h b/src/xmlpatterns/type/qbuiltinatomictype_p.h new file mode 100644 index 0000000..de94fa1 --- /dev/null +++ b/src/xmlpatterns/type/qbuiltinatomictype_p.h @@ -0,0 +1,130 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. + +#ifndef Patternist_BuiltinAtomicType_H +#define Patternist_BuiltinAtomicType_H + +#include "qatomictype_p.h" + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +namespace QPatternist +{ + + /** + * @short Instances of this class represents types that are sub-classes + * of @c xs:anyAtomicType. + * + * Retrieving instances of builtin types is done + * via BuiltinTypesFactory::createSchemaType(), not by instantiating this + * class manually. + * + * @ingroup Patternist_types + * @author Frans Englich <fenglich@trolltech.com> + */ + class BuiltinAtomicType : public AtomicType + { + public: + + typedef QExplicitlySharedDataPointer<BuiltinAtomicType> Ptr; + + /** + * @returns always @c false + */ + virtual bool isAbstract() const; + + /** + * @returns the base type as specified in the constructors baseType argument. + */ + virtual SchemaType::Ptr wxsSuperType() const; + + /** + * @returns the same type as wxsSuperType(), except for the type @c xs:anyAtomicType, which + * returns item() + */ + virtual ItemType::Ptr xdtSuperType() const; + + virtual AtomicComparatorLocator::Ptr comparatorLocator() const; + virtual AtomicMathematicianLocator::Ptr mathematicianLocator() const; + virtual AtomicCasterLocator::Ptr casterLocator() const; + + protected: + friend class BuiltinTypes; + + /** + * @param baseType the type that is the super type of the constructed + * atomic type. In the case of AnyAtomicType, @c null is passed. + * @param comp the AtomicComparatorLocator this type should return. May be @c null. + * @param mather similar to @p comp, this is the AtomicMathematicianLocator + * that's appropriate for this type May be @c null. + * @param casterLocator the CasterLocator that locates classes performing + * casting with this type. May be @c null. + */ + BuiltinAtomicType(const AtomicType::Ptr &baseType, + const AtomicComparatorLocator::Ptr &comp, + const AtomicMathematicianLocator::Ptr &mather, + const AtomicCasterLocator::Ptr &casterLocator); + + private: + const AtomicType::Ptr m_superType; + const AtomicComparatorLocator::Ptr m_comparatorLocator; + const AtomicMathematicianLocator::Ptr m_mathematicianLocator; + const AtomicCasterLocator::Ptr m_casterLocator; + }; +} + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif diff --git a/src/xmlpatterns/type/qbuiltinatomictypes.cpp b/src/xmlpatterns/type/qbuiltinatomictypes.cpp new file mode 100644 index 0000000..ac38f5e --- /dev/null +++ b/src/xmlpatterns/type/qbuiltinatomictypes.cpp @@ -0,0 +1,226 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qatomicmathematicianlocators_p.h" +#include "qbuiltintypes_p.h" + +#include "qbuiltinatomictypes_p.h" + +QT_BEGIN_NAMESPACE + +using namespace QPatternist; + +/* -------------------------------------------------------------- */ +#define implAccept(className) \ +AtomicTypeVisitorResult::Ptr className##Type::accept(const AtomicTypeVisitor::Ptr &v, \ + const SourceLocationReflection *const r) const \ +{ \ + return v->visit(this, r); \ +} \ + \ +AtomicTypeVisitorResult::Ptr \ +className##Type::accept(const ParameterizedAtomicTypeVisitor::Ptr &v, \ + const qint16 op, \ + const SourceLocationReflection *const r) const \ +{ \ + return v->visit(this, op, r); \ +} + +#define deployComp(className, qname, parent, comp, mather, caster) \ +className##Type::className##Type() : BuiltinAtomicType(BuiltinTypes::parent, \ + comp, \ + mather, \ + caster) \ +{ \ +} \ +implAccept(className) + +#define deployBase(className, qname, parent) deployComp(className, qname, parent, \ + AtomicComparatorLocator::Ptr(), \ + AtomicMathematicianLocator::Ptr(), \ + AtomicCasterLocator::Ptr()) + +#define deployFull(className, qname, parent) \ +deployComp(className, qname, parent, \ + AtomicComparatorLocator::Ptr(new className##ComparatorLocator()), \ + AtomicMathematicianLocator::Ptr(), \ + AtomicCasterLocator::Ptr(new To##className##CasterLocator())) + +#define deployMathComp(className, qname, parent) \ +deployComp(className, qname, parent, \ + AtomicComparatorLocator::Ptr(new className##ComparatorLocator()), \ + AtomicMathematicianLocator::Ptr(new className##MathematicianLocator()), \ + AtomicCasterLocator::Ptr(new To##className##CasterLocator())) +/* -------------------------------------------------------------- */ + +/* -------------------------------------------------------------- */ +/* xs:anyURI & xs:untypedAtomic are much treated like strings. This ensures + * they get the correct operators and automatically takes care of type promotion. */ +deployComp(UntypedAtomic, xsUntypedAtomic, xsAnyAtomicType, + AtomicComparatorLocator::Ptr(new StringComparatorLocator()), + AtomicMathematicianLocator::Ptr(), + AtomicCasterLocator::Ptr(new ToUntypedAtomicCasterLocator())) +deployComp(AnyURI, xsAnyURI, xsAnyAtomicType, + AtomicComparatorLocator::Ptr(new StringComparatorLocator()), + AtomicMathematicianLocator::Ptr(), + AtomicCasterLocator::Ptr(new ToAnyURICasterLocator())) + +deployBase(NOTATION, xsNOTATION, xsAnyAtomicType) + +deployMathComp(Float, xsFloat, numeric) +deployMathComp(Double, xsDouble, numeric) +deployMathComp(Decimal, xsDecimal, numeric) +deployMathComp(DayTimeDuration, xsDayTimeDuration, xsDuration) +deployMathComp(YearMonthDuration, xsYearMonthDuration, xsDuration) +deployMathComp(Date, xsDate, xsAnyAtomicType) +deployMathComp(DateTime, xsDateTime, xsAnyAtomicType) +deployMathComp(SchemaTime, xsTime, xsAnyAtomicType) + +deployFull(Base64Binary, xsBase64Binary, xsAnyAtomicType) +deployFull(Boolean, xsBoolean, xsAnyAtomicType) +deployFull(Duration, xsDuration, xsAnyAtomicType) +deployFull(GDay, xsGDay, xsAnyAtomicType) +deployFull(GMonth, xsGMonth, xsAnyAtomicType) +deployFull(GMonthDay, xsGMonthDay, xsAnyAtomicType) +deployFull(GYear, xsGYear, xsAnyAtomicType) +deployFull(GYearMonth, xsGYearMonth, xsAnyAtomicType) +deployFull(HexBinary, xsHexBinary, xsAnyAtomicType) +deployFull(QName, xsQName, xsAnyAtomicType) +/* --------------------------------------------------------------- */ + +/* --------------------------------------------------------------- */ +StringType::StringType(const AtomicType::Ptr &pType, + const AtomicCasterLocator::Ptr &casterLoc) +: BuiltinAtomicType(pType, + AtomicComparatorLocator::Ptr(new StringComparatorLocator()), + AtomicMathematicianLocator::Ptr(), + casterLoc) +{ +} +implAccept(String) +/* --------------------------------------------------------------- */ + +/* --------------------------------------------------------------- */ +IntegerType::IntegerType(const AtomicType::Ptr &pType, + const AtomicCasterLocator::Ptr &casterLoc) +: BuiltinAtomicType(pType, + AtomicComparatorLocator::Ptr(new IntegerComparatorLocator()), + AtomicMathematicianLocator::Ptr(new IntegerMathematicianLocator()), + casterLoc) +{ +} +implAccept(Integer) +/* --------------------------------------------------------------- */ + +/* ---------------------- Special Overrides ---------------------- */ +AnyAtomicType::AnyAtomicType() : BuiltinAtomicType(AtomicType::Ptr(), + AtomicComparatorLocator::Ptr(), + AtomicMathematicianLocator::Ptr(), + AtomicCasterLocator::Ptr()) +{ +} +implAccept(AnyAtomic) + +ItemType::Ptr AnyAtomicType::xdtSuperType() const +{ + return BuiltinTypes::item; +} + +SchemaType::Ptr AnyAtomicType::wxsSuperType() const +{ + return BuiltinTypes::xsAnySimpleType; +} + +bool AnyAtomicType::isAbstract() const +{ + return true; +} + +bool NOTATIONType::isAbstract() const +{ + return true; +} + +#define implementName(className, typeName) \ +QXmlName className##Type::name(const NamePool::Ptr &np) const \ +{ \ + return np->allocateQName(StandardNamespaces::xs, typeName); \ +} \ + \ +QString className##Type::displayName(const NamePool::Ptr &np) const \ +{ \ + return np->displayName(name(np)); \ +} + +implementName(AnyAtomic, QLatin1String("anyAtomicType")) +implementName(AnyURI, QLatin1String("anyURI")) +implementName(Base64Binary, QLatin1String("base64Binary")) +implementName(Boolean, QLatin1String("boolean")) +implementName(Date, QLatin1String("date")) +implementName(DateTime, QLatin1String("dateTime")) +implementName(DayTimeDuration, QLatin1String("dayTimeDuration")) +implementName(Decimal, QLatin1String("decimal")) +implementName(Double, QLatin1String("double")) +implementName(Duration, QLatin1String("duration")) +implementName(Float, QLatin1String("float")) +implementName(GDay, QLatin1String("gDay")) +implementName(GMonthDay, QLatin1String("gMonthDay")) +implementName(GMonth, QLatin1String("gMonth")) +implementName(GYearMonth, QLatin1String("gYearMonth")) +implementName(GYear, QLatin1String("gYear")) +implementName(HexBinary, QLatin1String("hexBinary")) +implementName(Integer, QLatin1String("integer")) +implementName(NOTATION, QLatin1String("NOTATION")) +implementName(QName, QLatin1String("QName")) +implementName(String, QLatin1String("string")) +implementName(SchemaTime, QLatin1String("time")) +implementName(UntypedAtomic, QLatin1String("untypedAtomic")) +implementName(YearMonthDuration, QLatin1String("yearMonthDuration")) +/* --------------------------------------------------------------- */ + +#undef implAccept +#undef implementName +#undef deployComp +#undef deployBase +#undef deployFull +#undef deployMathComp + +QT_END_NAMESPACE diff --git a/src/xmlpatterns/type/qbuiltinatomictypes_p.h b/src/xmlpatterns/type/qbuiltinatomictypes_p.h new file mode 100644 index 0000000..3906978 --- /dev/null +++ b/src/xmlpatterns/type/qbuiltinatomictypes_p.h @@ -0,0 +1,789 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. + +#ifndef Patternist_BuiltinAtomicTypes_H +#define Patternist_BuiltinAtomicTypes_H + +#include "qatomiccasterlocators_p.h" +#include "qatomiccomparatorlocators_p.h" +#include "qbuiltinatomictype_p.h" + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +namespace QPatternist +{ + + /** + * @short Implements the type @c xs:anyAtomicType. + * + * @ingroup Patternist_types + * @author Frans Englich <fenglich@trolltech.com> + */ + class AnyAtomicType : public BuiltinAtomicType + { + public: + typedef QExplicitlySharedDataPointer<AnyAtomicType> Ptr; + + virtual AtomicTypeVisitorResult::Ptr accept(const AtomicTypeVisitor::Ptr &visitor, + const SourceLocationReflection *const reflection) const; + virtual AtomicTypeVisitorResult::Ptr accept(const ParameterizedAtomicTypeVisitor::Ptr &visitor, + const qint16 op, + const SourceLocationReflection *const reflection) const; + virtual QXmlName name(const NamePool::Ptr &np) const; + virtual QString displayName(const NamePool::Ptr &np) const; + + /** + * Overridden to return <tt>item()</tt>. + * + * @returns BuiltinTypes::item + */ + virtual ItemType::Ptr xdtSuperType() const; + + /** + * Overridden to return @c xs:anySimpleType. + * + * @returns BuiltinTypes::xsAnySimpleType + */ + virtual SchemaType::Ptr wxsSuperType() const; + + /** + * Overridden to return @c true, @c xs:anyAtomicType is abstract. + * + * @returns always @c true + */ + virtual bool isAbstract() const; + + protected: + friend class BuiltinTypes; + AnyAtomicType(); + }; + + /** + * @short Implements the type @c xs:untypedAtomic. + * + * @ingroup Patternist_types + * @author Frans Englich <fenglich@trolltech.com> + */ + class UntypedAtomicType : public BuiltinAtomicType + { + public: + typedef QExplicitlySharedDataPointer<UntypedAtomicType> Ptr; + + virtual AtomicTypeVisitorResult::Ptr accept(const AtomicTypeVisitor::Ptr &visitor, + const SourceLocationReflection *const reflection) const; + virtual AtomicTypeVisitorResult::Ptr accept(const ParameterizedAtomicTypeVisitor::Ptr &visitor, + const qint16 op, + const SourceLocationReflection *const reflection) const; + virtual QXmlName name(const NamePool::Ptr &np) const; + virtual QString displayName(const NamePool::Ptr &np) const; + + protected: + friend class BuiltinTypes; + UntypedAtomicType(); + }; + + /** + * @short Implements the type @c xs:dateTime. + * + * @ingroup Patternist_types + * @author Frans Englich <fenglich@trolltech.com> + */ + class DateTimeType : public BuiltinAtomicType + { + public: + typedef QExplicitlySharedDataPointer<DateTimeType> Ptr; + + virtual AtomicTypeVisitorResult::Ptr accept(const AtomicTypeVisitor::Ptr &visitor, + const SourceLocationReflection *const reflection) const; + virtual AtomicTypeVisitorResult::Ptr accept(const ParameterizedAtomicTypeVisitor::Ptr &visitor, + const qint16 op, + const SourceLocationReflection *const reflection) const; + + virtual QXmlName name(const NamePool::Ptr &np) const; + virtual QString displayName(const NamePool::Ptr &np) const; + protected: + friend class BuiltinTypes; + DateTimeType(); + }; + + /** + * @short Implements the type @c xs:date. + * + * @ingroup Patternist_types + * @author Frans Englich <fenglich@trolltech.com> + */ + class DateType : public BuiltinAtomicType + { + public: + typedef QExplicitlySharedDataPointer<DateType> Ptr; + + virtual AtomicTypeVisitorResult::Ptr accept(const AtomicTypeVisitor::Ptr &visitor, + const SourceLocationReflection *const reflection) const; + virtual AtomicTypeVisitorResult::Ptr accept(const ParameterizedAtomicTypeVisitor::Ptr &visitor, + const qint16 op, + const SourceLocationReflection *const reflection) const; + virtual QXmlName name(const NamePool::Ptr &np) const; + virtual QString displayName(const NamePool::Ptr &np) const; + + protected: + friend class BuiltinTypes; + DateType(); + }; + + /** + * @short Implements the type @c xs:time. + * + * @ingroup Patternist_types + * @author Frans Englich <fenglich@trolltech.com> + */ + class SchemaTimeType : public BuiltinAtomicType + { + public: + typedef QExplicitlySharedDataPointer<SchemaTimeType> Ptr; + + virtual AtomicTypeVisitorResult::Ptr accept(const AtomicTypeVisitor::Ptr &visitor, + const SourceLocationReflection *const reflection) const; + virtual AtomicTypeVisitorResult::Ptr accept(const ParameterizedAtomicTypeVisitor::Ptr &visitor, + const qint16 op, + const SourceLocationReflection *const reflection) const; + + virtual QXmlName name(const NamePool::Ptr &np) const; + virtual QString displayName(const NamePool::Ptr &np) const; + + protected: + friend class BuiltinTypes; + SchemaTimeType(); + }; + + /** + * @short Implements the type @c xs:duration. + * + * @ingroup Patternist_types + * @author Frans Englich <fenglich@trolltech.com> + */ + class DurationType : public BuiltinAtomicType + { + public: + typedef QExplicitlySharedDataPointer<DurationType> Ptr; + + virtual AtomicTypeVisitorResult::Ptr accept(const AtomicTypeVisitor::Ptr &visitor, + const SourceLocationReflection *const reflection) const; + virtual AtomicTypeVisitorResult::Ptr accept(const ParameterizedAtomicTypeVisitor::Ptr &visitor, + const qint16 op, + const SourceLocationReflection *const reflection) const; + virtual QXmlName name(const NamePool::Ptr &np) const; + virtual QString displayName(const NamePool::Ptr &np) const; + + protected: + friend class BuiltinTypes; + DurationType(); + }; + + /** + * @short Implements the type @c xs:yearMonthDuration. + * + * @ingroup Patternist_types + * @author Frans Englich <fenglich@trolltech.com> + */ + class YearMonthDurationType : public BuiltinAtomicType + { + public: + typedef QExplicitlySharedDataPointer<YearMonthDurationType> Ptr; + + virtual AtomicTypeVisitorResult::Ptr accept(const AtomicTypeVisitor::Ptr &visitor, + const SourceLocationReflection *const reflection) const; + virtual AtomicTypeVisitorResult::Ptr accept(const ParameterizedAtomicTypeVisitor::Ptr &visitor, + const qint16 op, + const SourceLocationReflection *const reflection) const; + virtual QXmlName name(const NamePool::Ptr &np) const; + virtual QString displayName(const NamePool::Ptr &np) const; + + protected: + friend class BuiltinTypes; + YearMonthDurationType(); + }; + + /** + * @short Implements the type @c xs:dayTimeDuration. + * + * @ingroup Patternist_types + * @author Frans Englich <fenglich@trolltech.com> + */ + class DayTimeDurationType : public BuiltinAtomicType + { + public: + typedef QExplicitlySharedDataPointer<DayTimeDurationType> Ptr; + + virtual AtomicTypeVisitorResult::Ptr accept(const AtomicTypeVisitor::Ptr &visitor, + const SourceLocationReflection *const reflection) const; + virtual AtomicTypeVisitorResult::Ptr accept(const ParameterizedAtomicTypeVisitor::Ptr &visitor, + const qint16 op, + const SourceLocationReflection *const reflection) const; + virtual QXmlName name(const NamePool::Ptr &np) const; + virtual QString displayName(const NamePool::Ptr &np) const; + + protected: + friend class BuiltinTypes; + DayTimeDurationType(); + }; + + /** + * @short Implements the type @c xs:double. + * + * @ingroup Patternist_types + * @author Frans Englich <fenglich@trolltech.com> + */ + class DoubleType : public BuiltinAtomicType + { + public: + typedef QExplicitlySharedDataPointer<DoubleType> Ptr; + + virtual AtomicTypeVisitorResult::Ptr accept(const AtomicTypeVisitor::Ptr &visitor, + const SourceLocationReflection *const reflection) const; + virtual AtomicTypeVisitorResult::Ptr accept(const ParameterizedAtomicTypeVisitor::Ptr &visitor, + const qint16 op, + const SourceLocationReflection *const reflection) const; + virtual QXmlName name(const NamePool::Ptr &np) const; + virtual QString displayName(const NamePool::Ptr &np) const; + + protected: + friend class BuiltinTypes; + DoubleType(); + }; + + /** + * @short Implements the type @c xs:float. + * + * @ingroup Patternist_types + * @author Frans Englich <fenglich@trolltech.com> + */ + class FloatType : public BuiltinAtomicType + { + public: + typedef QExplicitlySharedDataPointer<FloatType> Ptr; + + virtual AtomicTypeVisitorResult::Ptr accept(const AtomicTypeVisitor::Ptr &visitor, + const SourceLocationReflection *const reflection) const; + virtual AtomicTypeVisitorResult::Ptr accept(const ParameterizedAtomicTypeVisitor::Ptr &visitor, + const qint16 op, + const SourceLocationReflection *const reflection) const; + virtual QXmlName name(const NamePool::Ptr &np) const; + virtual QString displayName(const NamePool::Ptr &np) const; + + protected: + FloatType(); + friend class BuiltinTypes; + }; + + /** + * @short Implements the type @c xs:decimal. + * + * @ingroup Patternist_types + * @author Frans Englich <fenglich@trolltech.com> + */ + class DecimalType : public BuiltinAtomicType + { + public: + typedef QExplicitlySharedDataPointer<DecimalType> Ptr; + + virtual AtomicTypeVisitorResult::Ptr accept(const AtomicTypeVisitor::Ptr &visitor, + const SourceLocationReflection *const reflection) const; + virtual AtomicTypeVisitorResult::Ptr accept(const ParameterizedAtomicTypeVisitor::Ptr &visitor, + const qint16 op, + const SourceLocationReflection *const reflection) const; + virtual QXmlName name(const NamePool::Ptr &np) const; + virtual QString displayName(const NamePool::Ptr &np) const; + + protected: + friend class BuiltinTypes; + DecimalType(); + }; + + /** + * @short Implements the type @c xs:integer. + * + * IntegerType instances are used for representing all different xs:integer + * types. The purpose of this is that xs:integer sub-types must use the + * class, IntegerType, in order to use the correct behavior in call + * dispatch situations. That is, all xs:integer sub-types must use the + * same AtomicComparator as xs:integer itself uses, and that is achieved + * this way. + * + * @ingroup Patternist_types + * @author Frans Englich <fenglich@trolltech.com> + */ + class IntegerType : public BuiltinAtomicType + { + public: + typedef QExplicitlySharedDataPointer<IntegerType> Ptr; + + virtual AtomicTypeVisitorResult::Ptr accept(const AtomicTypeVisitor::Ptr &visitor, + const SourceLocationReflection *const reflection) const; + virtual AtomicTypeVisitorResult::Ptr accept(const ParameterizedAtomicTypeVisitor::Ptr &visitor, + const qint16 op, + const SourceLocationReflection *const reflection) const; + virtual QXmlName name(const NamePool::Ptr &np) const; + virtual QString displayName(const NamePool::Ptr &np) const; + + protected: + friend class BuiltinTypes; + IntegerType(const AtomicType::Ptr &parentType, + const AtomicCasterLocator::Ptr &casterLocator); + }; + + template<TypeOfDerivedInteger derivedType> + class DerivedIntegerType : public IntegerType + { + public: + using IntegerType::accept; + + virtual AtomicTypeVisitorResult::Ptr accept(const AtomicTypeVisitor::Ptr &v, + const SourceLocationReflection *const r) const + { + return v->visit(this, r); + } + + virtual QXmlName name(const NamePool::Ptr &np) const + { + switch(derivedType) + { + case TypeByte: return np->allocateQName(StandardNamespaces::xs, QLatin1String("byte")); + case TypeInt: return np->allocateQName(StandardNamespaces::xs, QLatin1String("int")); + case TypeLong: return np->allocateQName(StandardNamespaces::xs, QLatin1String("long")); + case TypeNegativeInteger: return np->allocateQName(StandardNamespaces::xs, QLatin1String("negativeInteger")); + case TypeNonNegativeInteger: return np->allocateQName(StandardNamespaces::xs, QLatin1String("nonNegativeInteger")); + case TypeNonPositiveInteger: return np->allocateQName(StandardNamespaces::xs, QLatin1String("nonPositiveInteger")); + case TypePositiveInteger: return np->allocateQName(StandardNamespaces::xs, QLatin1String("positiveInteger")); + case TypeShort: return np->allocateQName(StandardNamespaces::xs, QLatin1String("short")); + case TypeUnsignedByte: return np->allocateQName(StandardNamespaces::xs, QLatin1String("unsignedByte")); + case TypeUnsignedInt: return np->allocateQName(StandardNamespaces::xs, QLatin1String("unsignedInt")); + case TypeUnsignedLong: return np->allocateQName(StandardNamespaces::xs, QLatin1String("unsignedLong")); + case TypeUnsignedShort: return np->allocateQName(StandardNamespaces::xs, QLatin1String("unsignedShort")); + } + + Q_ASSERT_X(false, "DerivedIntegerType::name()", "Invalid value in instantiation."); + return QXmlName(); + } + + virtual QString displayName(const NamePool::Ptr &np) const + { + return np->displayName(name(np)); + } + + protected: + friend class BuiltinTypes; + + DerivedIntegerType(const AtomicType::Ptr &parentType, + const AtomicCasterLocator::Ptr &casterLoc) : IntegerType(parentType, casterLoc) + { + } + + }; + + /** + * @short Implements the type @c xs:gYearMonth. + * + * @ingroup Patternist_types + * @author Frans Englich <fenglich@trolltech.com> + */ + class GYearMonthType : public BuiltinAtomicType + { + public: + typedef QExplicitlySharedDataPointer<GYearMonthType> Ptr; + + virtual AtomicTypeVisitorResult::Ptr accept(const AtomicTypeVisitor::Ptr &visitor, + const SourceLocationReflection *const reflection) const; + virtual AtomicTypeVisitorResult::Ptr accept(const ParameterizedAtomicTypeVisitor::Ptr &visitor, + const qint16 op, + const SourceLocationReflection *const reflection) const; + virtual QXmlName name(const NamePool::Ptr &np) const; + virtual QString displayName(const NamePool::Ptr &np) const; + + protected: + friend class BuiltinTypes; + GYearMonthType(); + }; + + /** + * @short Implements the type @c xs:gYear. + * + * @ingroup Patternist_types + * @author Frans Englich <fenglich@trolltech.com> + */ + class GYearType : public BuiltinAtomicType + { + public: + typedef QExplicitlySharedDataPointer<GYearType> Ptr; + + virtual AtomicTypeVisitorResult::Ptr accept(const AtomicTypeVisitor::Ptr &visitor, + const SourceLocationReflection *const reflection) const; + virtual AtomicTypeVisitorResult::Ptr accept(const ParameterizedAtomicTypeVisitor::Ptr &visitor, + const qint16 op, + const SourceLocationReflection *const reflection) const; + virtual QXmlName name(const NamePool::Ptr &np) const; + virtual QString displayName(const NamePool::Ptr &np) const; + + protected: + friend class BuiltinTypes; + GYearType(); + }; + + /** + * @short Implements the type @c xs:gMonthDay. + * + * @ingroup Patternist_types + * @author Frans Englich <fenglich@trolltech.com> + */ + class GMonthDayType : public BuiltinAtomicType + { + public: + typedef QExplicitlySharedDataPointer<GMonthDayType> Ptr; + + virtual AtomicTypeVisitorResult::Ptr accept(const AtomicTypeVisitor::Ptr &visitor, + const SourceLocationReflection *const reflection) const; + virtual AtomicTypeVisitorResult::Ptr accept(const ParameterizedAtomicTypeVisitor::Ptr &visitor, + const qint16 op, + const SourceLocationReflection *const reflection) const; + virtual QXmlName name(const NamePool::Ptr &np) const; + virtual QString displayName(const NamePool::Ptr &np) const; + + protected: + friend class BuiltinTypes; + GMonthDayType(); + }; + + /** + * @short Implements the type @c xs:gDay. + * + * @ingroup Patternist_types + * @author Frans Englich <fenglich@trolltech.com> + */ + class GDayType : public BuiltinAtomicType + { + public: + typedef QExplicitlySharedDataPointer<GDayType> Ptr; + + virtual AtomicTypeVisitorResult::Ptr accept(const AtomicTypeVisitor::Ptr &visitor, + const SourceLocationReflection *const reflection) const; + virtual AtomicTypeVisitorResult::Ptr accept(const ParameterizedAtomicTypeVisitor::Ptr &visitor, + const qint16 op, + const SourceLocationReflection *const reflection) const; + virtual QXmlName name(const NamePool::Ptr &np) const; + virtual QString displayName(const NamePool::Ptr &np) const; + + protected: + friend class BuiltinTypes; + GDayType(); + }; + + /** + * @short Implements the type @c xs:gMonth. + * + * @ingroup Patternist_types + * @author Frans Englich <fenglich@trolltech.com> + */ + class GMonthType : public BuiltinAtomicType + { + public: + typedef QExplicitlySharedDataPointer<GMonthType> Ptr; + + virtual AtomicTypeVisitorResult::Ptr accept(const AtomicTypeVisitor::Ptr &visitor, + const SourceLocationReflection *const reflection) const; + virtual AtomicTypeVisitorResult::Ptr accept(const ParameterizedAtomicTypeVisitor::Ptr &visitor, + const qint16 op, + const SourceLocationReflection *const reflection) const; + virtual QXmlName name(const NamePool::Ptr &np) const; + virtual QString displayName(const NamePool::Ptr &np) const; + + protected: + friend class BuiltinTypes; + GMonthType(); + }; + + /** + * @short Implements the type @c xs:boolean. + * + * @ingroup Patternist_types + * @author Frans Englich <fenglich@trolltech.com> + */ + class BooleanType : public BuiltinAtomicType + { + public: + typedef QExplicitlySharedDataPointer<BooleanType> Ptr; + + virtual AtomicTypeVisitorResult::Ptr accept(const AtomicTypeVisitor::Ptr &visitor, + const SourceLocationReflection *const reflection) const; + virtual AtomicTypeVisitorResult::Ptr accept(const ParameterizedAtomicTypeVisitor::Ptr &visitor, + const qint16 op, + const SourceLocationReflection *const reflection) const; + virtual QXmlName name(const NamePool::Ptr &np) const; + virtual QString displayName(const NamePool::Ptr &np) const; + + protected: + friend class BuiltinTypes; + BooleanType(); + }; + + /** + * @short Implements the type @c xs:base64Binary. + * + * @ingroup Patternist_types + * @author Frans Englich <fenglich@trolltech.com> + */ + class Base64BinaryType : public BuiltinAtomicType + { + public: + typedef QExplicitlySharedDataPointer<Base64BinaryType> Ptr; + + virtual AtomicTypeVisitorResult::Ptr accept(const AtomicTypeVisitor::Ptr &visitor, + const SourceLocationReflection *const reflection) const; + virtual AtomicTypeVisitorResult::Ptr accept(const ParameterizedAtomicTypeVisitor::Ptr &visitor, + const qint16 op, + const SourceLocationReflection *const reflection) const; + virtual QXmlName name(const NamePool::Ptr &np) const; + virtual QString displayName(const NamePool::Ptr &np) const; + + protected: + friend class BuiltinTypes; + Base64BinaryType(); + }; + + /** + * @short Implements the type @c xs:hexBinary. + * + * @ingroup Patternist_types + * @author Frans Englich <fenglich@trolltech.com> + */ + class HexBinaryType : public BuiltinAtomicType + { + public: + typedef QExplicitlySharedDataPointer<HexBinaryType> Ptr; + + virtual AtomicTypeVisitorResult::Ptr accept(const AtomicTypeVisitor::Ptr &visitor, + const SourceLocationReflection *const reflection) const; + virtual AtomicTypeVisitorResult::Ptr accept(const ParameterizedAtomicTypeVisitor::Ptr &visitor, + const qint16 op, + const SourceLocationReflection *const reflection) const; + virtual QXmlName name(const NamePool::Ptr &np) const; + virtual QString displayName(const NamePool::Ptr &np) const; + + protected: + friend class BuiltinTypes; + HexBinaryType(); + }; + + /** + * @short Implements the type @c xs:anyURI. + * + * @ingroup Patternist_types + * @author Frans Englich <fenglich@trolltech.com> + */ + class AnyURIType : public BuiltinAtomicType + { + public: + typedef QExplicitlySharedDataPointer<AnyURIType> Ptr; + + virtual AtomicTypeVisitorResult::Ptr accept(const AtomicTypeVisitor::Ptr &visitor, + const SourceLocationReflection *const reflection) const; + virtual AtomicTypeVisitorResult::Ptr accept(const ParameterizedAtomicTypeVisitor::Ptr &visitor, + const qint16 op, + const SourceLocationReflection *const reflection) const; + virtual QXmlName name(const NamePool::Ptr &np) const; + virtual QString displayName(const NamePool::Ptr &np) const; + + protected: + friend class BuiltinTypes; + AnyURIType(); + }; + + /** + * @short Implements the type @c xs:QName. + * + * @ingroup Patternist_types + * @author Frans Englich <fenglich@trolltech.com> + */ + class QNameType : public BuiltinAtomicType + { + public: + typedef QExplicitlySharedDataPointer<QNameType> Ptr; + + virtual AtomicTypeVisitorResult::Ptr accept(const AtomicTypeVisitor::Ptr &visitor, + const SourceLocationReflection *const reflection) const; + virtual AtomicTypeVisitorResult::Ptr accept(const ParameterizedAtomicTypeVisitor::Ptr &visitor, + const qint16 op, + const SourceLocationReflection *const reflection) const; + virtual QXmlName name(const NamePool::Ptr &np) const; + virtual QString displayName(const NamePool::Ptr &np) const; + + protected: + friend class BuiltinTypes; + QNameType(); + }; + + /** + * Represents the xs:string type and all derived types of + * xs:string, such as xs:token. + * + * StringType instances are used for representing all different string + * types. The purpose of this is that xs:string sub-types must use the + * class, StringType, in order to use the correct behavior in call + * dispatch situations. That is, all xs:string sub-types must use the + * same AtomicComparator as xs:string itself uses, and that is achieved + * this way. + * + * @ingroup Patternist_types + * @author Frans Englich <fenglich@trolltech.com> + */ + class StringType : public BuiltinAtomicType + { + public: + typedef QExplicitlySharedDataPointer<StringType> Ptr; + + virtual AtomicTypeVisitorResult::Ptr accept(const AtomicTypeVisitor::Ptr &visitor, + const SourceLocationReflection *const reflection) const; + virtual AtomicTypeVisitorResult::Ptr accept(const ParameterizedAtomicTypeVisitor::Ptr &visitor, + const qint16 op, + const SourceLocationReflection *const reflection) const; + virtual QXmlName name(const NamePool::Ptr &np) const; + virtual QString displayName(const NamePool::Ptr &np) const; + + protected: + friend class BuiltinTypes; + StringType(const AtomicType::Ptr &parentType, + const AtomicCasterLocator::Ptr &casterLoc); + }; + + template<TypeOfDerivedString derivedType> + class DerivedStringType : public StringType + { + public: + using StringType::accept; + + virtual AtomicTypeVisitorResult::Ptr accept(const AtomicTypeVisitor::Ptr &v, + const SourceLocationReflection *const r) const + { + return v->visit(this, r); + } + + virtual QXmlName name(const NamePool::Ptr &np) const + { + switch(derivedType) + { + case TypeString: return np->allocateQName(StandardNamespaces::xs, QLatin1String("string")); + case TypeNormalizedString: return np->allocateQName(StandardNamespaces::xs, QLatin1String("normalizedString")); + case TypeToken: return np->allocateQName(StandardNamespaces::xs, QLatin1String("token")); + case TypeLanguage: return np->allocateQName(StandardNamespaces::xs, QLatin1String("language")); + case TypeNMTOKEN: return np->allocateQName(StandardNamespaces::xs, QLatin1String("NMTOKEN")); + case TypeName: return np->allocateQName(StandardNamespaces::xs, QLatin1String("Name")); + case TypeNCName: return np->allocateQName(StandardNamespaces::xs, QLatin1String("NCName")); + case TypeID: return np->allocateQName(StandardNamespaces::xs, QLatin1String("ID")); + case TypeIDREF: return np->allocateQName(StandardNamespaces::xs, QLatin1String("IDREF")); + case TypeENTITY: return np->allocateQName(StandardNamespaces::xs, QLatin1String("ENTITY")); + } + + Q_ASSERT_X(false, "DerivedStringType::name()", "Invalid value in instantiation."); + return QXmlName(); + } + + virtual QString displayName(const NamePool::Ptr &np) const + { + return np->displayName(name(np)); + } + + protected: + friend class BuiltinTypes; + + DerivedStringType(const AtomicType::Ptr &parentType, + const AtomicCasterLocator::Ptr &casterLoc) : StringType(parentType, casterLoc) + { + } + + }; + + /** + * @short Implements the type @c xs:NOTATION. + * + * @ingroup Patternist_types + * @author Frans Englich <fenglich@trolltech.com> + */ + class NOTATIONType : public BuiltinAtomicType + { + public: + typedef QExplicitlySharedDataPointer<NOTATIONType> Ptr; + + virtual AtomicTypeVisitorResult::Ptr accept(const AtomicTypeVisitor::Ptr &visitor, + const SourceLocationReflection *const reflection) const; + virtual AtomicTypeVisitorResult::Ptr accept(const ParameterizedAtomicTypeVisitor::Ptr &visitor, + const qint16 op, + const SourceLocationReflection *const reflection) const; + virtual QXmlName name(const NamePool::Ptr &np) const; + virtual QString displayName(const NamePool::Ptr &np) const; + + /** + * Overridden to return @c true, xs:NOTATION is abstract. + * + * @returns always @c true + */ + virtual bool isAbstract() const; + + protected: + friend class BuiltinTypes; + NOTATIONType(); + }; +} + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif diff --git a/src/xmlpatterns/type/qbuiltinnodetype.cpp b/src/xmlpatterns/type/qbuiltinnodetype.cpp new file mode 100644 index 0000000..d3d55ad --- /dev/null +++ b/src/xmlpatterns/type/qbuiltinnodetype.cpp @@ -0,0 +1,165 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +/** + * @file + * @short This file is included by BuiltintNodeType.h. + * If you need includes in this file, put them in BuiltintNodeType.h, outside of the namespace. + */ + +template <const QXmlNodeModelIndex::NodeKind kind> +BuiltinNodeType<kind>::BuiltinNodeType() +{ +} + +template <const QXmlNodeModelIndex::NodeKind kind> +bool BuiltinNodeType<kind>::xdtTypeMatches(const ItemType::Ptr &other) const +{ + if(!other->isNodeType()) + return false; + + return *static_cast<const BuiltinNodeType *>(other.data()) == *this + ? true + : xdtTypeMatches(other->xdtSuperType()); +} + +template <const QXmlNodeModelIndex::NodeKind kind> +bool BuiltinNodeType<kind>::itemMatches(const Item &item) const +{ + Q_ASSERT(item); + + return item.isNode() && + item.asNode().kind() == kind; +} + +template <const QXmlNodeModelIndex::NodeKind kind> +ItemType::Ptr BuiltinNodeType<kind>::atomizedType() const +{ + switch(kind) + { + /* Fallthrough all these. */ + case QXmlNodeModelIndex::Attribute: + case QXmlNodeModelIndex::Document: + case QXmlNodeModelIndex::Element: + case QXmlNodeModelIndex::Text: + return BuiltinTypes::xsUntypedAtomic; + case QXmlNodeModelIndex::ProcessingInstruction: + /* Fallthrough. */ + case QXmlNodeModelIndex::Comment: + return BuiltinTypes::xsString; + default: + { + Q_ASSERT_X(false, Q_FUNC_INFO, + "Encountered invalid XPath Data Model node type."); + return BuiltinTypes::xsUntypedAtomic; + } + } +} + +template <const QXmlNodeModelIndex::NodeKind kind> +QString BuiltinNodeType<kind>::displayName(const NamePool::Ptr &) const +{ + switch(kind) + { + case QXmlNodeModelIndex::Element: + return QLatin1String("element()"); + case QXmlNodeModelIndex::Document: + return QLatin1String("document()"); + case QXmlNodeModelIndex::Attribute: + return QLatin1String("attribute()"); + case QXmlNodeModelIndex::Text: + return QLatin1String("text()"); + case QXmlNodeModelIndex::ProcessingInstruction: + return QLatin1String("processing-instruction()"); + case QXmlNodeModelIndex::Comment: + return QLatin1String("comment()"); + default: + { + Q_ASSERT_X(false, Q_FUNC_INFO, + "Encountered invalid XPath Data Model node type."); + return QString(); + } + } +} + +template <const QXmlNodeModelIndex::NodeKind kind> +ItemType::Ptr BuiltinNodeType<kind>::xdtSuperType() const +{ + return BuiltinTypes::node; +} + +template <const QXmlNodeModelIndex::NodeKind kind> +QXmlNodeModelIndex::NodeKind BuiltinNodeType<kind>::nodeKind() const +{ + return kind; +} + +template <const QXmlNodeModelIndex::NodeKind kind> +PatternPriority BuiltinNodeType<kind>::patternPriority() const +{ + /* See XSL Transformations (XSLT) Version 2.0, 6.4 Conflict Resolution for + * Template Rules */ + switch(kind) + { + case QXmlNodeModelIndex::Text: + /* Fallthrough. */ + case QXmlNodeModelIndex::ProcessingInstruction: + /* Fallthrough. */ + case QXmlNodeModelIndex::Comment: + /* "If the pattern is any other NodeTest, optionally preceded by a + * PatternAxis, then the priority is 0.5." + * Fallthrough. */ + case QXmlNodeModelIndex::Attribute: + /* Fallthrough. */ + case QXmlNodeModelIndex::Element: + /* Fallthrough. */ + case QXmlNodeModelIndex::Document: + /* "If the pattern has the form /, then the priority is -0.5.". */ + return -0.5; + default: + { + Q_ASSERT_X(false, Q_FUNC_INFO, "Unknown node type"); + return 0; + } + } + +} + diff --git a/src/xmlpatterns/type/qbuiltinnodetype_p.h b/src/xmlpatterns/type/qbuiltinnodetype_p.h new file mode 100644 index 0000000..edb4c74 --- /dev/null +++ b/src/xmlpatterns/type/qbuiltinnodetype_p.h @@ -0,0 +1,110 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. + +#ifndef Patternist_BuiltinNodeType_H +#define Patternist_BuiltinNodeType_H + +#include "qitem_p.h" +#include "qanynodetype_p.h" +#include "qbuiltintypes_p.h" + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +namespace QPatternist +{ + + /** + * @short Instances of this class represents types that are sub-classes + * of <tt>node()</tt>, such as <tt>processing-instruction()</tt>. + * + * @ingroup Patternist_types + * @author Frans Englich <fenglich@trolltech.com> + */ + template <const QXmlNodeModelIndex::NodeKind kind> + class BuiltinNodeType : public AnyNodeType + { + public: + virtual bool xdtTypeMatches(const ItemType::Ptr &other) const; + virtual bool itemMatches(const Item &item) const; + + /** + * @returns for example "text()", depending on what the constructor was passed + */ + virtual QString displayName(const NamePool::Ptr &np) const; + + virtual ItemType::Ptr xdtSuperType() const; + virtual ItemType::Ptr atomizedType() const; + + QXmlNodeModelIndex::NodeKind nodeKind() const; + + PatternPriority patternPriority() const; + + protected: + friend class BuiltinTypes; + + /** + * This constructor does nothing, but exists in order to make it impossible to + * instantiate this class from anywhere but from BuiltinTypes. + */ + BuiltinNodeType(); + }; + +#include "qbuiltinnodetype.cpp" + +} + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif diff --git a/src/xmlpatterns/type/qbuiltintypes.cpp b/src/xmlpatterns/type/qbuiltintypes.cpp new file mode 100644 index 0000000..7c350ae --- /dev/null +++ b/src/xmlpatterns/type/qbuiltintypes.cpp @@ -0,0 +1,161 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qanyitemtype_p.h" +#include "qderivedinteger_p.h" + +#include "qbuiltinatomictypes_p.h" +#include "qbuiltinnodetype_p.h" +#include "qbuiltintypes_p.h" +#include "qxsltnodetest_p.h" + +/* Included here to avoid the static initialization failure. */ +#include "qatomiccasterlocators.cpp" +#include "qatomiccomparatorlocators.cpp" +#include "qatomicmathematicianlocators.cpp" + +QT_BEGIN_NAMESPACE + +using namespace QPatternist; + +// STATIC DATA +/* Special cases. */ +#define initType(var, cls) const cls::Ptr BuiltinTypes::var(new cls()) +initType(item, AnyItemType); +initType(node, AnyNodeType); +#undef initType + +#define initSType(var, cls) const SchemaType::Ptr BuiltinTypes::var(new cls()) +initSType(xsAnyType, AnyType); +initSType(xsAnySimpleType, AnySimpleType); +initSType(xsUntyped, Untyped); +#undef initSType + +/* The primitive atomic types. */ +#define at(className, varName) const AtomicType::Ptr BuiltinTypes::varName(new className()); +at(AnyAtomicType, xsAnyAtomicType) +at(UntypedAtomicType, xsUntypedAtomic) +at(DateTimeType, xsDateTime) +at(DateType, xsDate) +at(SchemaTimeType, xsTime) +at(DurationType, xsDuration) +at(YearMonthDurationType, xsYearMonthDuration) +at(DayTimeDurationType, xsDayTimeDuration) + +at(NumericType, numeric) +at(DecimalType, xsDecimal) +at(GYearMonthType, xsGYearMonth) +at(GYearType, xsGYear) +at(GMonthDayType, xsGMonthDay) +at(GDayType, xsGDay) +at(GMonthType, xsGMonth) + +at(BooleanType, xsBoolean) +at(Base64BinaryType, xsBase64Binary) +at(AnyURIType, xsAnyURI) + +#define it(className, varName) const ItemType::Ptr BuiltinTypes::varName(new className()); +at(QNameType, xsQName) +at(HexBinaryType, xsHexBinary) +at(FloatType, xsFloat) +at(DoubleType, xsDouble) +#undef it + +const AtomicType::Ptr BuiltinTypes::xsString(new StringType(BuiltinTypes::xsAnyAtomicType, + AtomicCasterLocator::Ptr(new ToStringCasterLocator()))); + +#define dsType(varName, parent) \ + const AtomicType::Ptr BuiltinTypes::xs ## varName \ + (new DerivedStringType<Type ## varName>(BuiltinTypes::parent, \ + AtomicCasterLocator::Ptr(new ToDerivedStringCasterLocator<Type ## varName>()))) + +dsType(NormalizedString, xsString); +dsType(Token, xsNormalizedString); +dsType(Language, xsToken); +dsType(NMTOKEN, xsToken); +dsType(Name, xsToken); +dsType(NCName, xsName); +dsType(ID, xsNCName); +dsType(IDREF, xsNCName); +dsType(ENTITY, xsNCName); +#undef sType + +const AtomicType::Ptr BuiltinTypes::xsInteger(new IntegerType(BuiltinTypes::xsDecimal, + AtomicCasterLocator::Ptr(new ToIntegerCasterLocator()))); + +#define iType(varName, parent) \ + const AtomicType::Ptr BuiltinTypes::xs ## varName \ + (new DerivedIntegerType<Type ## varName>(parent, \ + AtomicCasterLocator::Ptr(new ToDerivedIntegerCasterLocator<Type ## varName>()))) + +/* Initialize derived integers. The order of initialization is significant. */ +iType(NonPositiveInteger, xsInteger); +iType(NegativeInteger, xsNonPositiveInteger); +iType(Long, xsInteger); +iType(Int, xsLong); +iType(Short, xsInt); +iType(Byte, xsShort); +iType(NonNegativeInteger, xsInteger); +iType(UnsignedLong, xsNonNegativeInteger); +iType(UnsignedInt, xsUnsignedLong); +iType(UnsignedShort, xsUnsignedInt); +iType(UnsignedByte, xsUnsignedShort); +iType(PositiveInteger, xsNonNegativeInteger); +#undef iType + +at(NOTATIONType, xsNOTATION) +#undef at + +/* QXmlNodeModelIndex types */ +#define nt(var, enu) const ItemType::Ptr BuiltinTypes::var = \ + ItemType::Ptr(new BuiltinNodeType<QXmlNodeModelIndex::enu>()) + +nt(comment, Comment); +nt(attribute, Attribute); +nt(document, Document); +nt(element, Element); +nt(text, Text); +nt(pi, ProcessingInstruction); +#undef nt + +const ItemType::Ptr BuiltinTypes::xsltNodeTest(new XSLTNodeTest()); + +QT_END_NAMESPACE diff --git a/src/xmlpatterns/type/qbuiltintypes_p.h b/src/xmlpatterns/type/qbuiltintypes_p.h new file mode 100644 index 0000000..4271d7d --- /dev/null +++ b/src/xmlpatterns/type/qbuiltintypes_p.h @@ -0,0 +1,174 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. + +#ifndef Patternist_BuiltinTypes_H +#define Patternist_BuiltinTypes_H + +#include "qanynodetype_p.h" +#include "qanysimpletype_p.h" +#include "qanytype_p.h" +#include "qbuiltinatomictype_p.h" +#include "qitemtype_p.h" +#include "qnumerictype_p.h" +#include "quntyped_p.h" + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +namespace QPatternist +{ + + /** + * @short Provides access to singleton instances of ItemType and SchemaType sub-classes. + * + * @ingroup Patternist_types + * @author Frans Englich <fenglich@trolltech.com> + */ + class Q_AUTOTEST_EXPORT BuiltinTypes + { + public: + static const SchemaType::Ptr xsAnyType; + static const SchemaType::Ptr xsAnySimpleType; + static const SchemaType::Ptr xsUntyped; + + static const AtomicType::Ptr xsAnyAtomicType; + static const AtomicType::Ptr xsUntypedAtomic; + static const AtomicType::Ptr xsDateTime; + static const AtomicType::Ptr xsDate; + static const AtomicType::Ptr xsTime; + static const AtomicType::Ptr xsDuration; + static const AtomicType::Ptr xsYearMonthDuration; + static const AtomicType::Ptr xsDayTimeDuration; + + /** + * An artificial type for implementation purposes + * that represents the XPath type @c numeric. + */ + static const AtomicType::Ptr numeric; + static const AtomicType::Ptr xsFloat; + static const AtomicType::Ptr xsDouble; + static const AtomicType::Ptr xsInteger; + static const AtomicType::Ptr xsDecimal; + static const AtomicType::Ptr xsNonPositiveInteger; + static const AtomicType::Ptr xsNegativeInteger; + static const AtomicType::Ptr xsLong; + static const AtomicType::Ptr xsInt; + static const AtomicType::Ptr xsShort; + static const AtomicType::Ptr xsByte; + static const AtomicType::Ptr xsNonNegativeInteger; + static const AtomicType::Ptr xsUnsignedLong; + static const AtomicType::Ptr xsUnsignedInt; + static const AtomicType::Ptr xsUnsignedShort; + static const AtomicType::Ptr xsUnsignedByte; + static const AtomicType::Ptr xsPositiveInteger; + + + static const AtomicType::Ptr xsGYearMonth; + static const AtomicType::Ptr xsGYear; + static const AtomicType::Ptr xsGMonthDay; + static const AtomicType::Ptr xsGDay; + static const AtomicType::Ptr xsGMonth; + + static const AtomicType::Ptr xsBoolean; + + static const AtomicType::Ptr xsBase64Binary; + static const AtomicType::Ptr xsHexBinary; + static const AtomicType::Ptr xsAnyURI; + static const AtomicType::Ptr xsQName; + static const AtomicType::Ptr xsString; + static const AtomicType::Ptr xsNormalizedString; + static const AtomicType::Ptr xsToken; + static const AtomicType::Ptr xsLanguage; + static const AtomicType::Ptr xsNMTOKEN; + static const AtomicType::Ptr xsName; + static const AtomicType::Ptr xsNCName; + static const AtomicType::Ptr xsID; + static const AtomicType::Ptr xsIDREF; + static const AtomicType::Ptr xsENTITY; + + static const AtomicType::Ptr xsNOTATION; + static const ItemType::Ptr item; + + static const AnyNodeType::Ptr node; + + /** + * When the node test node() is used without axes in a pattern in + * XSL-T, it doesn't match document nodes. See 5.5.3 The Meaning of a + * Pattern. + * + * This node test does that. + */ + static const ItemType::Ptr xsltNodeTest; + + static const ItemType::Ptr attribute; + static const ItemType::Ptr comment; + static const ItemType::Ptr document; + static const ItemType::Ptr element; + static const ItemType::Ptr pi; + static const ItemType::Ptr text; + + private: + /** + * The constructor is protected because this class is not meant to be instantiated, + * but should only be used via its static const members. + */ + BuiltinTypes(); + Q_DISABLE_COPY(BuiltinTypes) + }; +} + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif + diff --git a/src/xmlpatterns/type/qcardinality.cpp b/src/xmlpatterns/type/qcardinality.cpp new file mode 100644 index 0000000..9d62d86 --- /dev/null +++ b/src/xmlpatterns/type/qcardinality.cpp @@ -0,0 +1,102 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qpatternistlocale_p.h" + +#include "qcardinality_p.h" + +QT_BEGIN_NAMESPACE + +using namespace QPatternist; + +QString Cardinality::displayName(const CustomizeDisplayName explain) const +{ + if(explain == IncludeExplanation) + { + if(isEmpty()) + return QString(QtXmlPatterns::tr("empty") + QLatin1String("(\"empty-sequence()\")")); + else if(isZeroOrOne()) + return QString(QtXmlPatterns::tr("zero or one") + QLatin1String("(\"?\")")); + else if(isExactlyOne()) + return QString(QtXmlPatterns::tr("exactly one")); + else if(isOneOrMore()) + return QString(QtXmlPatterns::tr("one or more") + QLatin1String("(\"+\")")); + else + return QString(QtXmlPatterns::tr("zero or more") + QLatin1String("(\"*\")")); + } + else + { + Q_ASSERT(explain == ExcludeExplanation); + + if(isEmpty() || isZeroOrOne()) + return QLatin1String("?"); + else if(isExactlyOne()) + return QString(); + else if(isExact()) + { + return QString(QLatin1Char('{')) + + QString::number(maximum()) + + QLatin1Char('}'); + } + else + { + if(m_max == -1) + { + if(isOneOrMore()) + return QChar::fromLatin1('+'); + else + return QChar::fromLatin1('*'); + } + else + { + /* We have a range. We use a RegExp-like syntax. */ + return QString(QLatin1Char('{')) + + QString::number(minimum()) + + QLatin1String(", ") + + QString::number(maximum()) + + QLatin1Char('}'); + + } + } + } +} + +QT_END_NAMESPACE diff --git a/src/xmlpatterns/type/qcardinality_p.h b/src/xmlpatterns/type/qcardinality_p.h new file mode 100644 index 0000000..9beecc3 --- /dev/null +++ b/src/xmlpatterns/type/qcardinality_p.h @@ -0,0 +1,544 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. + +#ifndef Patternist_Cardinality_H +#define Patternist_Cardinality_H + +#include <QtCore/QtGlobal> + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +class QString; + +namespace QPatternist +{ + /** + * @short Represents a cardinality, a possible , often represented by occurrence indicators. + * + * As opposed to the cardinality concept in the XQuery/XPath specifications, which + * only allows cardinalities to be expressed with kleene operators, this representation + * allows ranges. For example, the cardinality 10-11, describes a sequence containing + * ten or eleven items, inclusive. + * + * @ingroup Patternist_types + * @see ItemType + * @see SequenceType + * @see <a href="http://www.w3.org/TR/xpath20/#prod-xpath-SequenceType">XML Path Language + * (XPath) 2.0, The EBNF grammar for SequenceType</a> + * @author Frans Englich <fenglich@trolltech.com> + */ + class Cardinality + { + public: + /** + * This integer type, is what Cardinality uses for representing its ranges. + */ + typedef qint32 Count; + + /** + * Used with displayName(), and specifies + * how a display name for a Cardinality should be. + */ + enum CustomizeDisplayName + { + /** + * Includes a describing string in the return value of displayName(). + */ + IncludeExplanation = 1, + + /** + * Excludes a describing string in the return value of displayName(). + */ + ExcludeExplanation + }; + + /** + * A traditional copy constructor. This Cardinality becomes identical + * to @p other. + */ + inline Cardinality(const Cardinality &other) : m_min(other.m_min), + m_max(other.m_max) + { + } + + /** + * This default constructor constructs an invalid Cardinality. Using + * its operators and members yields undefined results. A value must + * first be assigned to it by creating a Cardinality with fromRange(), fromCount(), + * or one of the predefined cardinalities such as empty() or oneOrMore(). + */ + inline Cardinality() : m_min(-1), m_max(0) + { + } + + /** + * The cardinality assigned to the exprssion <tt>()</tt>, formally speaking. The + * cardinality part of <tt>empty-sequence()</tt>. + */ + static inline Cardinality empty() + { + return Cardinality(0, 0); + } + + /** + * The cardinality implicitly specified in for example the sequence type + * <tt>item()</tt>. It has no kleene operator. + */ + static inline Cardinality exactlyOne() + { + return Cardinality(1, 1); + } + + /** + * Allows both no item, as in empty(), and exactlyOne(). Represented + * by the kleene operator <tt>?</tt>. + */ + static inline Cardinality zeroOrOne() + { + return Cardinality(0, 1); + } + + /** + * Allows any amount. This is therefore the widest, an unconstrained + * cardinality. Represented by the kleene operator <tt>*</tt>. + */ + static inline Cardinality zeroOrMore() + { + return Cardinality(0, -1); + } + + /** + * Allows one or more. Represented by the kleene operator <tt>+</tt>. + */ + static inline Cardinality oneOrMore() + { + return Cardinality(1, -1); + } + + /** + * Allows one or more. This cardinality has no kleene operator and is used + * by the implementation in order to be able to know when a cardinality + * that at amximum allows one, is exceeded. + */ + static inline Cardinality twoOrMore() + { + return Cardinality(2, -1); + } + + /** + * Determines the cardinality from the count of a sequence. For example, if + * @p count is 11, a Cardinality is returned that allows at minimum and maximum + * 11 items. + * + * @p count must be positive or zero. If it is not, the result is undefined. + * When debugging is enabled, a Q_ASSERT() macro ensures this. + */ + static inline Cardinality fromCount(const Count count) + { + Q_ASSERT_X(count > -1, Q_FUNC_INFO, + "A count smaller than 0 makes no sense."); + return Cardinality(count, count); + } + + /** + * Creates a Cardinality that allows @p minimum and @p maximum + * items, inclusive. + * + * If @p maximum is -1, it signals infinity. + * + * If you before hand knows that a predefined Cardinality is needed, + * remember to use one of the factory functions empty(), zeroOrOne(), + * exactlyOne(), oneOrMore() or zeroOrMore(), since they improves + * readability, are safer, and slightly faster. + */ + static inline Cardinality fromRange(const Count minimum, const Count maximum) + { + Q_ASSERT_X(minimum > -1, Q_FUNC_INFO, + "minimum should never be less than 0."); + Q_ASSERT_X(minimum <= maximum || maximum == -1, Q_FUNC_INFO, + "minimum cannot be larger than maximum."); + + return Cardinality(minimum, maximum); + } + + static inline Cardinality fromExact(const Count count) + { + Q_ASSERT(count >= 0); + return Cardinality(count, count); + } + + /** + * @returns the minimum amount of items this Cardinality allows. For example, + * for zeroOrOne() is 0 returned. + */ + inline Count minimum() const + { + Q_ASSERT_X(m_min != -1, Q_FUNC_INFO, "The cardinality are invalid."); + return m_min; + } + + /** + * @returns the maximum amount of items this Cardinality allows. For example, + * for zeroOrOne() is 1 returned. + */ + inline Count maximum() const + { + Q_ASSERT_X(m_min != -1, Q_FUNC_INFO, "The cardinality are invalid."); + return m_max; + } + + /** + * @returns @c true if this Cardinality allows one or more items. For example, for + * zeroOrOne() is @c false returned, while for zeroOrMore() is @c true returned. + */ + inline bool allowsMany() const + { + Q_ASSERT_X(m_min != -1, Q_FUNC_INFO, "The cardinality are invalid."); + return m_max == -1 || m_max > 1; + } + + /** + * @returns @c true if this Cardinality allows no items. For example, for + * zeroOrOne() is @c true returned, while for oneOrMore() is @c false returned. + */ + inline bool allowsEmpty() const + { + Q_ASSERT_X(m_min != -1, Q_FUNC_INFO, "The cardinality are invalid."); + return m_min == 0; + } + + /** + * Maps directly to Formal Semantics' @c aggregate_quantifier function. + * + * @returns zeroOrOne() if this Cardinality allows the empty sequence, otherwise exactlyOne() + * @see <a href="http://www.w3.org/TR/xquery-semantics/#jd_quantifier">XQuery 1.0 and + * XPath 2.0 Formal Semantics, The function quantifier()</a> + */ + inline Cardinality toWithoutMany() const + { + return m_min == 0 ? Cardinality(0, 1) + : Cardinality(1, 1); + } + + /** + * Determines whether all the possible outcomes represented by @p other, + * will always match this Cardinality. For example, if this Cardinality + * is oneOrMore(), @c true will be returned if @p other is exactlyOne(), but + * false if @p other is zeroOrOne(). + */ + inline bool isMatch(const Cardinality &other) const + { + Q_ASSERT_X(m_min != -1 && other.m_min != -1, Q_FUNC_INFO, "One of the cardinalities are invalid."); + if(other.m_min < m_min) + return false; + else + { /* Ok, we now know the minimum will always be ok. */ + if(m_max == -1) + return true; /* We allow infinite, so anything can match. */ + else if(other.m_max == -1) + return false; /* other allows infinity, while we don't. */ + else + return m_max >= other.m_max; + } + } + + /** + * Determines whether at least one of the possible outcomes represented by @p other, + * can match this Cardinality. For example, if this Cardinality + * is oneOrMore(), @c true will be returned if @p other is exactlyOne() or zeroOrOne(). + */ + inline bool canMatch(const Cardinality &other) const + { + Q_ASSERT_X(m_min != -1 && other.m_min != -1, Q_FUNC_INFO, "One of the cardinalities are invalid."); + if(m_max == -1) + return m_min <= other.m_min || other.m_max >= m_min || other.m_max == -1; + else + { + if(m_max == other.m_min) + return true; + else if(m_max > other.m_min) + return other.m_max >= m_min || other.m_max == -1; + else /* m_max < other.m_min */ + return false; + } + } + + /** + * @returns @c true if this Cardinality is empty, the <tt>empty-sequence()</tt>, otherwise + * @c false. + */ + inline bool isEmpty() const + { + Q_ASSERT_X(m_min != -1, Q_FUNC_INFO, "The cardinality is invalid."); + return m_min == 0 && m_max == 0; + } + + /** + * @returns @c true if this Cardinality is zero-or-one, <tt>?</tt>, otherwise + * @c false. + */ + inline bool isZeroOrOne() const + { + Q_ASSERT_X(m_min != -1, Q_FUNC_INFO, "The cardinality is invalid."); + return m_min == 0 && m_max == 1; + } + + /** + * @returns @c true if this Cardinality only allows exactly one item, otherwise + * @c false. + */ + inline bool isExactlyOne() const + { + Q_ASSERT_X(m_min != -1, Q_FUNC_INFO, "The cardinality is invalid."); + return m_min == 1 && m_max == 1; + } + + /** + * @returns @c true if this Cardinality only allows one or more items, otherwise + * @c false. + */ + inline bool isOneOrMore() const + { + Q_ASSERT_X(m_min != -1, Q_FUNC_INFO, "The cardinality is invalid."); + return m_min > 0 && (m_max == -1 || m_max >= 1); + } + + /** + * Determines whether this Cardinality only allows a specific length. For example, + * empty() and exactlyOne() are exact, but oneOrMore() or zeroOrOne() is not. + */ + inline bool isExact() const + { + Q_ASSERT_X(m_min != -1, Q_FUNC_INFO, "The cardinality is invalid."); + return m_min == m_max; + } + + /** + * Returns a string representation of this Cardinality. + * + * If @p explain is ExcludeExplanation the kleene operator is returned. For example, if + * the Cardinality is zeroOrOne, is "?" returned. + * + * If explain is IncludeExplanation a string more suited for human interpretation is returned, + * which is appropriately translated. For example, when the locale is English and + * this Cardinality being zeroOrOne, then is 'zero or one("?")' returned. + * + * Typically, passing ExcludeExplanation is useful when generating function + * signatures and the like, while passing IncludeExplanation + * is suitable appropriate when generating error messages. + * + * @returns a string representation for this Cardinality. + */ + QString displayName(const CustomizeDisplayName explanation) const; + + /** + * Computes the Cardinality that comprises this Cardinality as well as @p other. For + * example, if this Cardinality is zeroOrOne() and @p other is oneOrMore(), then + * is zeroOrMore() returned. + */ + inline Cardinality operator|(const Cardinality &other) const + { + Q_ASSERT_X(m_min != -1 && other.m_min != -1, Q_FUNC_INFO, "One of the cardinalities are invalid."); + if(m_max == -1 || other.m_max == -1) + return Cardinality(qMin(m_min, other.m_min), -1); + else + return Cardinality(qMin(m_min, other.m_min), qMax(m_max, other.m_max)); + } + + /** + * Behaves as operator|() but assigns the result to this Cardinality. + */ + inline Cardinality &operator|=(const Cardinality &other) + { + Q_ASSERT_X(m_min != -1 && other.m_min != -1, Q_FUNC_INFO, "One of the cardinalities are invalid."); + m_min = qMin(m_min, other.m_min); + + if(m_max == -1) + return *this; + else if(other.m_max == -1) + m_max = -1; + else + m_max = qMax(m_max, other.m_max); + + return *this; + } + + /** + * Computes the intersection of this Cardinality and @p other, and returns + * the result. For example, the intersection between zeroOrOne() and + * oneOrMore() is exactlyOne(). + * + * If no intersection exists, such as the case in empty() and exactlyOne(), then + * is a default constructed Cardinality is returned. That is, an invalid Cardinality. + */ + inline Cardinality operator&(const Cardinality &other) const + { + Q_ASSERT_X(m_min != -1 && other.m_min != -1, Q_FUNC_INFO, "One of the cardinalities are invalid."); + + if(m_max < other.m_min) /* No intersection. */ + return empty(); + + const Count min = qMax(m_min, other.m_min); + + if(m_max == -1) + return Cardinality(min, other.m_max); + else if(other.m_max == -1) + return Cardinality(min, m_max); + else + return Cardinality(min, qMin(m_max, other.m_max)); + } + + /** + * Adds two cardinalities, as if two sequences represented by them were concatenated. + * For example, if this Cardinality allows the range 6-8 and @p other allows + * 0-1, the return Cardinality has a range of 6-9. + * + * @returns the result of the comparison. + */ + inline Cardinality operator+(const Cardinality &other) const + { + Q_ASSERT_X(m_min != -1 && other.m_min != -1, Q_FUNC_INFO, "One of the cardinalities are invalid."); + if(m_max == -1 || other.m_max == -1) + return Cardinality(m_min + other.m_min, -1); + else + return Cardinality(m_min + other.m_min, m_max + other.m_max); + } + + /** + * Behaves as operator+() but assigns the result to this Cardinality. + */ + inline Cardinality &operator+=(const Cardinality &other) + { + Q_ASSERT_X(m_min != -1 && other.m_min != -1, Q_FUNC_INFO, + "One of the cardinalities are invalid."); + m_min += other.m_min; + + if(m_max == -1) + return *this; + if(other.m_max == -1) + m_max = -1; + else + m_max += other.m_max; + + return *this; + } + + /** + * Multiplies this Cardinality with @p other, and returns the result. The minimum and maximum + * of each Cardinality is multiplied such that the new Cardinality represents the possible + * range of the two sequences being multiplied, length-wise. For example the Cardinality + * 4, 5 multiplied with 2, 3 becomes 8, 15. + */ + inline Cardinality operator*(const Cardinality &other) const + { + Q_ASSERT_X(m_min != -1 && other.m_min != -1, Q_FUNC_INFO, + "One of the cardinalities are invalid."); + if(m_max == -1 || other.m_max == -1) + return Cardinality(m_min * other.m_min, -1); + else + return Cardinality(m_min * other.m_min, m_max * other.m_max); + } + + /** + * A traditional assignment operator. Behaves as assignment + * operators typically do. + */ + inline Cardinality &operator=(const Cardinality &other) + { + Q_ASSERT_X(this != &other, Q_FUNC_INFO, "Assigning to oneself makes no sense."); + m_min = other.m_min; + m_max = other.m_max; + return *this; + } + + /** + * Determines whether @p other is equal to this Cardinality. + * + * For example, empty() is equal to empty(), but zeroOrOne() + * is not equal to exactlyOne(). + * + * @returns @c true if @p other is equal to this Cardinality. + */ + inline bool operator==(const Cardinality &other) const + { + return m_min == other.m_min && + m_max == other.m_max; + } + + /** + * @returns the opposite of operator==() + */ + inline bool operator!=(const Cardinality &other) const + { + return m_min != other.m_min || + m_max != other.m_max; + } + + private: + inline Cardinality(const Count min, const Count max) : m_min(min), + m_max(max) + { + } + + Count m_min; + Count m_max; + }; +} + +Q_DECLARE_TYPEINFO(QPatternist::Cardinality, Q_MOVABLE_TYPE); + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif diff --git a/src/xmlpatterns/type/qcommonsequencetypes.cpp b/src/xmlpatterns/type/qcommonsequencetypes.cpp new file mode 100644 index 0000000..42ca749 --- /dev/null +++ b/src/xmlpatterns/type/qcommonsequencetypes.cpp @@ -0,0 +1,132 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qebvtype_p.h" +#include "qgenericsequencetype_p.h" +#include "qnonetype_p.h" + +#include "qcommonsequencetypes_p.h" + +/* To avoid the static initialization fiasco, we put the builtin types in this compilation unit, since + * the sequence types depends on them. */ +#include "qbuiltintypes.cpp" + +QT_BEGIN_NAMESPACE + +using namespace QPatternist; + +// STATIC DATA +#define st(var, type, card) \ +const SequenceType::Ptr \ +CommonSequenceTypes::var(new GenericSequenceType(BuiltinTypes::type, \ + Cardinality::card())) + +/* Alphabetically. */ +st(ExactlyOneAnyURI, xsAnyURI, exactlyOne); +st(ExactlyOneAtomicType, xsAnyAtomicType, exactlyOne); +st(ExactlyOneAttribute, attribute, exactlyOne); +st(ExactlyOneBase64Binary, xsBase64Binary, exactlyOne); +st(ExactlyOneBoolean, xsBoolean, exactlyOne); +st(ExactlyOneComment, comment, exactlyOne); +st(ExactlyOneDateTime, xsDateTime, exactlyOne); +st(ExactlyOneDate, xsDate, exactlyOne); +st(ExactlyOneDayTimeDuration, xsDayTimeDuration, exactlyOne); +st(ExactlyOneDecimal, xsDecimal, exactlyOne); +st(ExactlyOneDocumentNode, document, exactlyOne); +st(OneOrMoreDocumentNodes, document, oneOrMore); +st(ExactlyOneDouble, xsDouble, exactlyOne); +st(ExactlyOneDuration, xsDuration, exactlyOne); +st(ExactlyOneElement, element, exactlyOne); +st(ExactlyOneFloat, xsFloat, exactlyOne); +st(ExactlyOneGDay, xsGDay, exactlyOne); +st(ExactlyOneGMonthDay, xsGMonthDay, exactlyOne); +st(ExactlyOneGMonth, xsGMonth, exactlyOne); +st(ExactlyOneGYearMonth, xsGYearMonth, exactlyOne); +st(ExactlyOneGYear, xsGYear, exactlyOne); +st(ExactlyOneHexBinary, xsHexBinary, exactlyOne); +st(ExactlyOneInteger, xsInteger, exactlyOne); +st(ExactlyOneItem, item, exactlyOne); +st(ExactlyOneNCName, xsNCName, exactlyOne); +st(ExactlyOneNode, node, exactlyOne); +st(ExactlyOneNumeric, numeric, exactlyOne); +st(ExactlyOneProcessingInstruction, pi, exactlyOne); +st(ExactlyOneQName, xsQName, exactlyOne); +st(ExactlyOneString, xsString, exactlyOne); +st(ExactlyOneTextNode, text, exactlyOne); +st(ExactlyOneTime, xsTime, exactlyOne); +st(ExactlyOneUntypedAtomic, xsUntypedAtomic, exactlyOne); +st(ExactlyOneYearMonthDuration, xsYearMonthDuration, exactlyOne); +st(OneOrMoreItems, item, oneOrMore); +st(ZeroOrMoreAtomicTypes, xsAnyAtomicType, zeroOrMore); +st(ZeroOrMoreElements, element, zeroOrMore); +st(ZeroOrMoreIntegers, xsInteger, zeroOrMore); +st(ZeroOrMoreItems, item, zeroOrMore); +st(ZeroOrMoreNodes, node, zeroOrMore); +st(ZeroOrMoreStrings, xsString, zeroOrMore); +st(ZeroOrOneAnyURI, xsAnyURI, zeroOrOne); +st(ZeroOrOneAtomicType, xsAnyAtomicType, zeroOrOne); +st(ZeroOrOneBoolean, xsBoolean, zeroOrOne); +st(ZeroOrOneDateTime, xsDateTime, zeroOrOne); +st(ZeroOrOneDate, xsDate, zeroOrOne); +st(ZeroOrOneDayTimeDuration, xsDayTimeDuration, zeroOrOne); +st(ZeroOrOneDecimal, xsDecimal, zeroOrOne); +st(ZeroOrOneDocumentNode, document, zeroOrOne); +st(ZeroOrOneDuration, xsDuration, zeroOrOne); +st(ZeroOrOneInteger, xsInteger, zeroOrOne); +st(ZeroOrOneItem, item, zeroOrOne); +st(ZeroOrOneNCName, xsNCName, zeroOrOne); +st(ZeroOrOneNode, node, zeroOrOne); +st(ZeroOrOneNumeric, numeric, zeroOrOne); +st(ZeroOrOneQName, xsQName, zeroOrOne); +st(ZeroOrOneString, xsString, zeroOrOne); +st(ZeroOrOneTextNode, text, zeroOrOne); +st(ZeroOrOneTime, xsTime, zeroOrOne); +st(ZeroOrOneYearMonthDuration, xsYearMonthDuration, zeroOrOne); + +#undef st + +/* Special cases. */ +const EmptySequenceType::Ptr CommonSequenceTypes::Empty (new EmptySequenceType()); +const NoneType::Ptr CommonSequenceTypes::None (new NoneType()); +const SequenceType::Ptr CommonSequenceTypes::EBV (new EBVType()); + + +QT_END_NAMESPACE diff --git a/src/xmlpatterns/type/qcommonsequencetypes_p.h b/src/xmlpatterns/type/qcommonsequencetypes_p.h new file mode 100644 index 0000000..a4e61ab --- /dev/null +++ b/src/xmlpatterns/type/qcommonsequencetypes_p.h @@ -0,0 +1,414 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. + +#ifndef Patternist_CommonSequenceTypes_H +#define Patternist_CommonSequenceTypes_H + +#include "qemptysequencetype_p.h" +#include "qnonetype_p.h" + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +namespace QPatternist +{ + /** + * @short Provides access to singleton instances of SequenceType sub-classes. + * + * @ingroup Patternist_types + * @author Frans Englich <fenglich@trolltech.com> + */ + class Q_AUTOTEST_EXPORT CommonSequenceTypes + { + public: + /** + * <tt>xs:anyAtomicType?</tt> + */ + static const SequenceType::Ptr ZeroOrOneAtomicType; + + /** + * <tt>xs:anyAtomicType</tt> + */ + static const SequenceType::Ptr ExactlyOneAtomicType; + + /** + * <tt>xs:anyAtomicType*</tt> + */ + static const SequenceType::Ptr ZeroOrMoreAtomicTypes; + + /** + * <tt>item()</tt> + */ + static const SequenceType::Ptr ExactlyOneItem; + + /** + * <tt>item()*</tt> + */ + static const SequenceType::Ptr ZeroOrMoreItems; + + /** + * <tt>item()?</tt> + */ + static const SequenceType::Ptr ZeroOrOneItem; + + /** + * <tt>item()+</tt> + */ + static const SequenceType::Ptr OneOrMoreItems; + + /** + * The empty sequence, <tt>empty-sequence()</tt>. + */ + static const EmptySequenceType::Ptr Empty; + + /** + * The special type @c none. Used for the function <tt>fn:error()</tt>, for example. + */ + static const NoneType::Ptr None; + + /** + * <tt>xs:anyURI</tt> + */ + static const SequenceType::Ptr ExactlyOneAnyURI; + + /** + * <tt>xs:boolean</tt> + */ + static const SequenceType::Ptr ExactlyOneBoolean; + + /** + * <tt>xs:boolean?</tt> + */ + static const SequenceType::Ptr ZeroOrOneBoolean; + + /** + * <tt>xs:untypedAtomic</tt> + */ + static const SequenceType::Ptr ExactlyOneUntypedAtomic; + + /** + * <tt>xs:integer</tt> + */ + static const SequenceType::Ptr ExactlyOneInteger; + + /** + * <tt>xs:integer?</tt> + */ + static const SequenceType::Ptr ZeroOrOneInteger; + + /** + * <tt>xs:decimal?</tt> + */ + static const SequenceType::Ptr ZeroOrOneDecimal; + + /** + * <tt>xs:integer*</tt> + */ + static const SequenceType::Ptr ZeroOrMoreIntegers; + + /** + * <tt>xs:double</tt> + */ + static const SequenceType::Ptr ExactlyOneDouble; + + /** + * <tt>xs:decimal</tt> + */ + static const SequenceType::Ptr ExactlyOneDecimal; + + /** + * <tt>xs:float</tt> + */ + static const SequenceType::Ptr ExactlyOneFloat; + + /** + * <tt>xs:QName</tt> + */ + static const SequenceType::Ptr ExactlyOneQName; + + /** + * <tt>xs:string</tt> + */ + static const SequenceType::Ptr ExactlyOneString; + + /** + * <tt>xs:string?</tt> + */ + static const SequenceType::Ptr ZeroOrOneString; + + /** + * <tt>xs:string*</tt> + */ + static const SequenceType::Ptr ZeroOrMoreStrings; + + /** + * <tt>xs:NCName?</tt> + */ + static const SequenceType::Ptr ZeroOrOneNCName; + + /** + * <tt>xs:NCName</tt> + */ + static const SequenceType::Ptr ExactlyOneNCName; + + /** + * <tt>xs:QName?</tt> + */ + static const SequenceType::Ptr ZeroOrOneQName; + + /** + * The artificial type in XPath 2.0 that covers @c xs:double, @c xs:float, + * @c xs:decimal, with cardinality zero or one. + * + * @see <a href="http://www.w3.org/TR/xpath20/#dt-numeric">XML Path Language + * (XPath) 2.0, definition for Numeric</a> + * @see <a href="http://www.w3.org/TR/xpath-functions/#func-signatures">XQuery 1.0 + * and XPath 2.0 Functions and Operators, 1.3 Function Signatures and Descriptions</a> + * @see BuiltinTypes::numeric + */ + static const SequenceType::Ptr ZeroOrOneNumeric; + + /** + * @c numeric + */ + static const SequenceType::Ptr ExactlyOneNumeric; + + /** + * <tt>node()?</tt> + */ + static const SequenceType::Ptr ZeroOrOneNode; + + /** + * <tt>node()</tt> + */ + static const SequenceType::Ptr ExactlyOneNode; + + /** + * <tt>node()*</tt> + */ + static const SequenceType::Ptr ZeroOrMoreNodes; + + /** + * <tt>element()</tt> + */ + static const SequenceType::Ptr ExactlyOneElement; + + /** + * <tt>processing-instruction()</tt> + */ + static const SequenceType::Ptr ExactlyOneProcessingInstruction; + + /** + * <tt>attribute()</tt> + */ + static const SequenceType::Ptr ExactlyOneAttribute; + + /** + * <tt>text()</tt> + */ + static const SequenceType::Ptr ExactlyOneTextNode; + + /** + * <tt>text()?</tt> + */ + static const SequenceType::Ptr ZeroOrOneTextNode; + + /** + * <tt>comment()</tt> + */ + static const SequenceType::Ptr ExactlyOneComment; + + /** + * <tt>element()*</tt> + */ + static const SequenceType::Ptr ZeroOrMoreElements; + + /** + * <tt>document-node()?</tt> + */ + static const SequenceType::Ptr ZeroOrOneDocumentNode; + + /** + * <tt>document-node()</tt> + */ + static const SequenceType::Ptr ExactlyOneDocumentNode; + + /** + * <tt>document-node()+</tt> + */ + static const SequenceType::Ptr OneOrMoreDocumentNodes; + + /** + * Identifiers all values which the Effective %Boolean Value + * can be extracted from. + */ + static const SequenceType::Ptr EBV; + + /** + * <tt>xs:anyURI?</tt> + */ + static const SequenceType::Ptr ZeroOrOneAnyURI; + + /** + * <tt>xs:hexBinary</tt> + */ + static const SequenceType::Ptr ExactlyOneHexBinary; + + /** + * <tt>xs:base64Binary</tt> + */ + static const SequenceType::Ptr ExactlyOneBase64Binary; + + /** + * <tt>xs:date</tt> + */ + static const SequenceType::Ptr ExactlyOneDate; + + /** + * <tt>xs:dateTime</tt> + */ + static const SequenceType::Ptr ExactlyOneDateTime; + + /** + * <tt>xs:dayTimeDuration</tt> + */ + static const SequenceType::Ptr ExactlyOneDayTimeDuration; + + /** + * <tt>xs:duration</tt> + */ + static const SequenceType::Ptr ExactlyOneDuration; + + /** + * <tt>xs:gDay</tt> + */ + static const SequenceType::Ptr ExactlyOneGDay; + + /** + * <tt>xs:gMonth</tt> + */ + static const SequenceType::Ptr ExactlyOneGMonth; + + /** + * <tt>xs:gMonthDay</tt> + */ + static const SequenceType::Ptr ExactlyOneGMonthDay; + + /** + * <tt>xs:gYear</tt> + */ + static const SequenceType::Ptr ExactlyOneGYear; + + /** + * <tt>xs:gYearMonth</tt> + */ + static const SequenceType::Ptr ExactlyOneGYearMonth; + + /** + * <tt>xs:yearMonthDuration</tt> + */ + static const SequenceType::Ptr ExactlyOneYearMonthDuration; + + /** + * <tt>xs:time</tt> + */ + static const SequenceType::Ptr ExactlyOneTime; + + /** + * <tt>xs:time?</tt> + */ + static const SequenceType::Ptr ZeroOrOneDate; + + /** + * <tt>xs:dateTime?</tt> + */ + static const SequenceType::Ptr ZeroOrOneDateTime; + + /** + * <tt>xs:dayTimeDuration?</tt> + */ + static const SequenceType::Ptr ZeroOrOneDayTimeDuration; + + /** + * <tt>xs:duration?</tt> + */ + static const SequenceType::Ptr ZeroOrOneDuration; + + /** + * <tt>xs:time?</tt> + */ + static const SequenceType::Ptr ZeroOrOneTime; + + /** + * <tt>xs:yearMonthDuration?</tt> + */ + static const SequenceType::Ptr ZeroOrOneYearMonthDuration; + + private: + /** + * The constructor is private and has no implementation, + * because this class is not meant to be instantiated. + * + * It should only be used via its static members. + */ + inline CommonSequenceTypes(); + + Q_DISABLE_COPY(CommonSequenceTypes) + }; +} + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif + diff --git a/src/xmlpatterns/type/qebvtype.cpp b/src/xmlpatterns/type/qebvtype.cpp new file mode 100644 index 0000000..0e240dc --- /dev/null +++ b/src/xmlpatterns/type/qebvtype.cpp @@ -0,0 +1,123 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qbuiltintypes_p.h" +#include "qcommonsequencetypes_p.h" +#include "qitem_p.h" + +#include "qebvtype_p.h" + +QT_BEGIN_NAMESPACE + +using namespace QPatternist; + +EBVType::EBVType() +{ +} + +bool EBVType::itemMatches(const Item &item) const +{ + if(item.isNode()) + return false; + + return BuiltinTypes::xsBoolean->itemMatches(item) || + BuiltinTypes::numeric->itemMatches(item) || + BuiltinTypes::xsString->itemMatches(item) || + BuiltinTypes::xsAnyURI->itemMatches(item) || + CommonSequenceTypes::Empty->itemMatches(item) || + BuiltinTypes::xsUntypedAtomic->itemMatches(item); +} + +bool EBVType::xdtTypeMatches(const ItemType::Ptr &t) const +{ + return BuiltinTypes::node->xdtTypeMatches(t) || + BuiltinTypes::xsBoolean->xdtTypeMatches(t) || + BuiltinTypes::numeric->xdtTypeMatches(t) || + BuiltinTypes::xsString->xdtTypeMatches(t) || + BuiltinTypes::xsAnyURI->xdtTypeMatches(t) || + *CommonSequenceTypes::Empty == *t || + BuiltinTypes::xsUntypedAtomic->xdtTypeMatches(t) || + /* Item & xs:anyAtomicType is ok, we do the checking at runtime. */ + *BuiltinTypes::item == *t || + *BuiltinTypes::xsAnyAtomicType == *t; +} + +QString EBVType::displayName(const NamePool::Ptr &) const +{ + /* Some QName-lexical is not used here because it makes little sense + * for this strange type. Instead the operand type of the fn:boolean()'s + * argument is used. */ + return QLatin1String("item()*(: EBV extractable type :)"); +} + +Cardinality EBVType::cardinality() const +{ + return Cardinality::zeroOrMore(); +} + +ItemType::Ptr EBVType::xdtSuperType() const +{ + return BuiltinTypes::item; +} + +ItemType::Ptr EBVType::itemType() const +{ + return ItemType::Ptr(const_cast<EBVType *>(this)); +} + +bool EBVType::isAtomicType() const +{ + return false; +} + +bool EBVType::isNodeType() const +{ + return true; +} + +ItemType::Ptr EBVType::atomizedType() const +{ + Q_ASSERT_X(false, Q_FUNC_INFO, + "That this function is called makes no sense."); + return AtomicType::Ptr(); +} + +QT_END_NAMESPACE diff --git a/src/xmlpatterns/type/qebvtype_p.h b/src/xmlpatterns/type/qebvtype_p.h new file mode 100644 index 0000000..555842e --- /dev/null +++ b/src/xmlpatterns/type/qebvtype_p.h @@ -0,0 +1,135 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. + +#ifndef Patternist_EBVType_H +#define Patternist_EBVType_H + +#include "qatomictype_p.h" +#include "qsequencetype_p.h" + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +namespace QPatternist +{ + + /** + * @short Represents the type for which a value of can an Effective %Boolean Value + * be extracted from. + * + * EBVType is an artificial type. It is not available to users of any host language + * or is specified in any specification. It is used for implementing static type + * checking for expressions such as IfThenClause and AndExpression. + * + * @ingroup Patternist_types + * @author Frans Englich <fenglich@trolltech.com> + */ + class EBVType : public ItemType, + public SequenceType + { + public: + typedef QExplicitlySharedDataPointer<EBVType> Ptr; + + /** + * @todo docs if it's an ebvable type, etc. + */ + virtual bool itemMatches(const Item &item) const; + virtual bool xdtTypeMatches(const ItemType::Ptr &other) const; + + virtual QString displayName(const NamePool::Ptr &np) const; + + /** + * @note The semantical meaning of this type's item type can + * surely be discussed. The function is provided due to + * it being mandated by the SequenceType base class. + * + * @returns always 'this' since EBVType is also an ItemType + */ + virtual ItemType::Ptr itemType() const; + + /** + * @note The semantical meaning of this type's cardinality + * can surely be discussed. The function is provided due to + * it being mandated by the SequenceType base class. + * + * @returns always Cardinality::zeroOrMore() + */ + virtual Cardinality cardinality() const; + + virtual bool isAtomicType() const; + + /** + * @returns always @c null + */ + virtual ItemType::Ptr atomizedType() const; + + /** + * @returns always BuiltinTypes::item + */ + virtual ItemType::Ptr xdtSuperType() const; + + /** + * @returns always @c false + */ + virtual bool isNodeType() const; + + protected: + friend class CommonSequenceTypes; + EBVType(); + }; +} + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif diff --git a/src/xmlpatterns/type/qemptysequencetype.cpp b/src/xmlpatterns/type/qemptysequencetype.cpp new file mode 100644 index 0000000..3696ef6 --- /dev/null +++ b/src/xmlpatterns/type/qemptysequencetype.cpp @@ -0,0 +1,101 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qbuiltintypes_p.h" +#include "qcommonsequencetypes_p.h" + +#include "qemptysequencetype_p.h" + +QT_BEGIN_NAMESPACE + +using namespace QPatternist; + +EmptySequenceType::EmptySequenceType() +{ +} + +bool EmptySequenceType::xdtTypeMatches(const ItemType::Ptr &other) const +{ + return *other == *this || + CommonSequenceTypes::None->xdtTypeMatches(other); +} + +bool EmptySequenceType::itemMatches(const Item &) const +{ + return false; +} + +QString EmptySequenceType::displayName(const NamePool::Ptr &) const +{ + return QLatin1String("empty-sequence()"); +} + +ItemType::Ptr EmptySequenceType::xdtSuperType() const +{ + return BuiltinTypes::item; +} + +Cardinality EmptySequenceType::cardinality() const +{ + return Cardinality::empty(); +} + +ItemType::Ptr EmptySequenceType::itemType() const +{ + return ItemType::Ptr(const_cast<EmptySequenceType *>(this)); +} + +bool EmptySequenceType::isNodeType() const +{ + return false; +} + +bool EmptySequenceType::isAtomicType() const +{ + return false; +} + +ItemType::Ptr EmptySequenceType::atomizedType() const +{ + return BuiltinTypes::xsAnyAtomicType; +} + +QT_END_NAMESPACE diff --git a/src/xmlpatterns/type/qemptysequencetype_p.h b/src/xmlpatterns/type/qemptysequencetype_p.h new file mode 100644 index 0000000..badd231 --- /dev/null +++ b/src/xmlpatterns/type/qemptysequencetype_p.h @@ -0,0 +1,124 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. + +#ifndef Patternist_EmptySequenceType_H +#define Patternist_EmptySequenceType_H + +#include "qatomictype_p.h" +#include "qsequencetype_p.h" + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +namespace QPatternist +{ + + /** + * @short Represents the <tt>empty-sequence()</tt> type. + * + * @ingroup Patternist_types + * @author Frans Englich <fenglich@trolltech.com> + */ + class EmptySequenceType : public ItemType, + public SequenceType + { + public: + typedef QExplicitlySharedDataPointer<EmptySequenceType> Ptr; + + /** + * Possibly surprisingly, this function also returns true for the @c none type. + * + * @returns @c true if @p other is NoneType or EmptySequenceType, otherwise @c false. + */ + virtual bool xdtTypeMatches(const ItemType::Ptr &other) const; + + /** + * @returns always @c false + */ + virtual bool itemMatches(const Item &item) const; + + /** + * @returns always "empty-sequence()" + */ + virtual QString displayName(const NamePool::Ptr &np) const; + + virtual ItemType::Ptr xdtSuperType() const; + + virtual bool isNodeType() const; + virtual bool isAtomicType() const; + + /** + * @return always Cardinality::empty() + */ + virtual Cardinality cardinality() const; + + /** + * @returns always 'this' since it is also an ItemType + */ + virtual ItemType::Ptr itemType() const; + + /** + * @returns always @c xs:anyAtomicType + */ + virtual ItemType::Ptr atomizedType() const; + + protected: + friend class CommonSequenceTypes; + EmptySequenceType(); + }; +} + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif diff --git a/src/xmlpatterns/type/qgenericsequencetype.cpp b/src/xmlpatterns/type/qgenericsequencetype.cpp new file mode 100644 index 0000000..4db2583 --- /dev/null +++ b/src/xmlpatterns/type/qgenericsequencetype.cpp @@ -0,0 +1,72 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QString> + +#include "qgenericsequencetype_p.h" + +QT_BEGIN_NAMESPACE + +using namespace QPatternist; + +GenericSequenceType::GenericSequenceType(const ItemType::Ptr &iType, + const Cardinality &card) : m_itemType(iType), + m_cardinality(card) +{ + Q_ASSERT(m_itemType); +} + +QString GenericSequenceType::displayName(const NamePool::Ptr &np) const +{ + return m_itemType->displayName(np) + m_cardinality.displayName(Cardinality::ExcludeExplanation); +} + +Cardinality GenericSequenceType::cardinality() const +{ + return m_cardinality; +} + +ItemType::Ptr GenericSequenceType::itemType() const +{ + return m_itemType; +} + +QT_END_NAMESPACE diff --git a/src/xmlpatterns/type/qgenericsequencetype_p.h b/src/xmlpatterns/type/qgenericsequencetype_p.h new file mode 100644 index 0000000..e4302cf --- /dev/null +++ b/src/xmlpatterns/type/qgenericsequencetype_p.h @@ -0,0 +1,115 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. + +#ifndef Patternist_GenericSequenceType_H +#define Patternist_GenericSequenceType_H + +#include "qcommonsequencetypes_p.h" +#include "qsequencetype_p.h" + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +namespace QPatternist +{ + /** + * @todo Documentation is missing. + * + * @ingroup Patternist_types + * @author Frans Englich <fenglich@trolltech.com> + */ + class GenericSequenceType : public SequenceType + { + public: + GenericSequenceType(const ItemType::Ptr &itemType, const Cardinality &card); + + /** + * Generates a name for the sequence type for display purposes. The + * prefix used for the QName identifying the schema type is conventional. + * An example of a display name for a GenericSequenceType is "xs:integer?". + */ + virtual QString displayName(const NamePool::Ptr &np) const; + + virtual Cardinality cardinality() const; + + virtual ItemType::Ptr itemType() const; + + private: + const ItemType::Ptr m_itemType; + const Cardinality m_cardinality; + }; + + /** + * @short An object generator for GenericSequenceType. + * + * makeGenericSequenceType() is a convenience function for avoiding invoking + * the @c new operator, and wrapping the result in GenericSequenceType::Ptr. + * + * @returns a smart pointer to to a GenericSequenceType instaniated from @p itemType and @p cardinality. + * @relates GenericSequenceType + */ + static inline SequenceType::Ptr + makeGenericSequenceType(const ItemType::Ptr &itemType, const Cardinality &cardinality) + { + /* An empty sequence of say integers, is the empty-sequence(). */ + if(cardinality.isEmpty()) + return CommonSequenceTypes::Empty; + else + return SequenceType::Ptr(new GenericSequenceType(itemType, cardinality)); + } +} + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif diff --git a/src/xmlpatterns/type/qitemtype.cpp b/src/xmlpatterns/type/qitemtype.cpp new file mode 100644 index 0000000..862f37f --- /dev/null +++ b/src/xmlpatterns/type/qitemtype.cpp @@ -0,0 +1,103 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QtGlobal> + +#include "qcommonsequencetypes_p.h" + +#include "qitemtype_p.h" + +QT_BEGIN_NAMESPACE + +using namespace QPatternist; + +ItemType::~ItemType() +{ +} + +const ItemType &ItemType::operator|(const ItemType &other) const +{ + const ItemType *ca = this; + + if(other == *CommonSequenceTypes::None) + return *ca; + + if(*ca == *CommonSequenceTypes::Empty) + return other; + else if(other == *CommonSequenceTypes::Empty) + return *ca; + + do + { + const ItemType *cb = &other; + do + { + if(*ca == *cb) + return *ca; + + cb = cb->xdtSuperType().data(); + } + while(cb); + + ca = ca->xdtSuperType().data(); + } + while(ca); + + Q_ASSERT_X(false, Q_FUNC_INFO, "We should never reach this line."); + return *this; +} + +ItemType::Category ItemType::itemTypeCategory() const +{ + return Other; +} + +bool ItemType::operator==(const ItemType &other) const +{ + return this == &other; +} + +ItemType::InstanceOf ItemType::instanceOf() const +{ + return ClassOther; +} + +QT_END_NAMESPACE diff --git a/src/xmlpatterns/type/qitemtype_p.h b/src/xmlpatterns/type/qitemtype_p.h new file mode 100644 index 0000000..c396149 --- /dev/null +++ b/src/xmlpatterns/type/qitemtype_p.h @@ -0,0 +1,286 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. + +#ifndef Patternist_ItemType_H +#define Patternist_ItemType_H + +#include <QSharedData> + +#include <QtXmlPatterns/private/qnamepool_p.h> + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +template<typename T> class QList; + +namespace QPatternist +{ + class Item; + + /** + * @short Base class for the XPath Data Model's type hierarchy. + * + * It can not be instantiated, but it's possible via ItemType's two subtypes: + * Nodes, represented by QXmlNodeModelIndex, and atom types, represented by AtomicType. + * + * ItemType tries to by its design stay close to the notation used in Formal Semantics. + * The operator|() is a good example, it allow typing code to be written + * similar to how inference rules in the specification are written. + * + * @ingroup Patternist_types + * @author Frans Englich <fenglich@trolltech.com> + */ + class ItemType : public virtual QSharedData + { + public: + /** + * A smart pointer wrapping ItemType instances. + */ + typedef QExplicitlySharedDataPointer<ItemType> Ptr; + /** + * A list of ItemType instances, each wrapped in a smart pointer. + */ + typedef QList<ItemType::Ptr> List; + + virtual ~ItemType(); + + enum Category + { + NodeNameTest = 1, + Other = 2 + }; + + /** + * Determines whether this ItemType is equal to @p other. + * + * Many types are represented by singleton instances. For example, there + * exists only one instance of IntegerType. This operator==() takes advantage + * of that and uses equalness of object addresses for determining semantic + * equalness. This function is as a result fast. + * + * However, it's overridden in some cases, such as for name tests, where + * it's not guaranteed that there exists two types. + * + * @returns @c true if this ItemType is equal to @p other, otherwise @c false. + */ + virtual bool operator==(const ItemType &other) const; + + /** + * @returns the result of operator==() negated. + */ + inline bool operator!=(const ItemType &other) const; + + /** + * @returns a string representing the type. Used for diagnostic purposes. For a + * type whose name is a QName, a lexical representation should be returned + * with the prefix being a conventional one. Examples of a display names + * are "item()" and "xs:nonPositiveInteger". + */ + virtual QString displayName(const NamePool::Ptr &np) const = 0; + + /** + * @param item the item that is to be matched. This is guaranteed by the caller + * to never be @c null. + */ + virtual bool itemMatches(const Item &item) const = 0; + + /** + * @short Returns @c true if @p other matches this type. That is, if @p + * other is equal to this type or a subtype of this type. + * + * For instance this statements evaluates to @c true: + * + * @code + * BuiltinTypes::xsAnyAtomicType->xdtTypeMatches(BuiltinTypes::xsString); + * @endcode + * + * but this evaluates to @c false: + * + * @code + * BuiltinTypes::attribute->xdtTypeMatches(BuiltinTypes::node); + * @endcode + * + * @param other the other ItemType that is to be matched. This is guaranteed by the caller + * to never be @c null. + */ + virtual bool xdtTypeMatches(const ItemType::Ptr &other) const = 0; + + virtual bool isNodeType() const = 0; + virtual bool isAtomicType() const = 0; + + /** + * Determines the type's parent type in the XPath Data Model hierarchy. For example, + * for the type xs:anyAtomicType, the super type in the XPath Data Model is item(), not + * xs:anySimpleType. SchemaType::xdtSuperType navigates the schema hierarchy. + * + * @see SchemaType::wxsSuperType() + * @returns the type's super type. + */ + virtual ItemType::Ptr xdtSuperType() const = 0; + + /** + * @todo docs mention union, give if-expression example. + * + * Determines the super type that is closest to this ItemType and @p other. That is, + * the parent type of them both. For example, for the type xs:integer and xs:string + * the parent type is xs:anyAtomicType. For xs:NOTATION and processing-instruction(), it + * is item(), to name another example. + * + * This function can be seen as the type function prime(Type), defined in Formal Semantics. + * + * This walks the XPath Data Model type hierarchy, not the W3C XML Schema hierarchy. + * @param other the item type 'this' object, should be compared with. Invoking xdtSuperType + * on 'this' object with @p other as argument yields the same result as invoking the + * function on @p other with 'this' + * as argument. + * @returns the parent type of 'this' and @p other + * @see <a href="http://www.w3.org/TR/xquery-semantics/\#jd_prime">XQuery 1.0 and XPath 2.0 + * Formal Semantics, Prime Types, type function prime(Type)</a> + */ + virtual const ItemType &operator|(const ItemType &other) const; + + /** + * Determines the atomic type that the resulting sequence after + * atomization of this node would be an instance of. For example, for document node, + * xs:untypedAtomic is returned. Phrased differently, the returned type is the + * type of the result of the typed-value accessor. + * + * If the type cannot be atomized, it returns @c null. + * + * This function is also defined on SchemaType, because some schema types can also be + * atomized. + * + * @see SchemaType::atomizedType() + * @see <a href="http://www.w3.org/TR/xpath-datamodel/\#dm-typed-value">XQuery 1.0 + * and XPath 2.0 Data Model, 5.15 typed-value Accessor</a> + * @see <a href="http://www.w3.org/TR/xquery-semantics/#jd_data">XQuery 1.0 + * and XPath 2.0 Formal Semantics, data on auxiliary judgment</a> + * @returns the atomic type that the resulting sequence + * when performing atomization is an instance of. + */ + virtual ItemType::Ptr atomizedType() const = 0; + + /** + * @returns always Other + */ + virtual Category itemTypeCategory() const; + + enum InstanceOf + { + ClassLocalNameTest, + ClassNamespaceNameTest, + ClassQNameTest, + ClassOther + }; + + /** + * Determines what class this ItemType is an instance of. This + * is in needed in some implementations of operator operator==(). By + * default, Other is returned. + */ + virtual InstanceOf instanceOf() const; + + inline ItemType() + { + } + + private: + Q_DISABLE_COPY(ItemType) + }; + + /** + * This operator exists for making it easier to use the ItemType class, which + * always are wrapped in ItemType::Ptr, by taking care of the dereferencing + * of ItemType::Ptr instances. Semantically, it performs the same as + * ItemType's operator of the same name. + * + * @relates ItemType + * @see ItemType::operator|() + * @see operator|=(ItemType::Ptr &, const ItemType::Ptr &) + */ + inline ItemType::Ptr operator|(const ItemType::Ptr &op1, + const ItemType::Ptr &op2) + { + return ItemType::Ptr(const_cast<ItemType *>(&(*op1 | *op2))); + } + + bool ItemType::operator!=(const ItemType &other) const + { + return this != &other; + } + + /** + * @short Computes the union type of @p op1 and @p op2, and assigns it to @p op1. + * + * This operator exists for making it easier to use the ItemType class, which + * always are wrapped in ItemType::Ptr, by taking care of the dereferencing + * of the ItemType::Ptr instances. + * + * @relates ItemType + * @see operator|(const ItemType::Ptr &, const ItemType::Ptr &) + * @param op1 if @c null, @p op2 is returned unchanged + * @param op2 the other operand + */ + inline void operator|=(ItemType::Ptr &op1, const ItemType::Ptr &op2) + { + op1 = op1 | op2; + } + +} + +Q_DECLARE_TYPEINFO(QPatternist::ItemType::Ptr, Q_MOVABLE_TYPE); + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif diff --git a/src/xmlpatterns/type/qlocalnametest.cpp b/src/xmlpatterns/type/qlocalnametest.cpp new file mode 100644 index 0000000..92f677a --- /dev/null +++ b/src/xmlpatterns/type/qlocalnametest.cpp @@ -0,0 +1,99 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QHash> + +#include "qbuiltintypes_p.h" +#include "qitem_p.h" +#include "qitem_p.h" +#include "qxpathhelper_p.h" + +#include "qlocalnametest_p.h" + +QT_BEGIN_NAMESPACE + +using namespace QPatternist; + +LocalNameTest::LocalNameTest(const ItemType::Ptr &primaryType, + const QXmlName::LocalNameCode &ncName) : AbstractNodeTest(primaryType), + m_ncName(ncName) +{ +} + +ItemType::Ptr LocalNameTest::create(const ItemType::Ptr &primaryType, const QXmlName::LocalNameCode localName) +{ + Q_ASSERT(primaryType); + + return ItemType::Ptr(new LocalNameTest(primaryType, localName)); +} + +bool LocalNameTest::itemMatches(const Item &item) const +{ + Q_ASSERT(item.isNode()); + return m_primaryType->itemMatches(item) && + item.asNode().name().localName() == m_ncName; +} + +QString LocalNameTest::displayName(const NamePool::Ptr &np) const +{ + QString displayOther(m_primaryType->displayName(np)); + + return displayOther.insert(displayOther.size() - 1, + QString::fromLatin1("*:") + np->stringForLocalName(m_ncName)); +} + +ItemType::InstanceOf LocalNameTest::instanceOf() const +{ + return ClassLocalNameTest; +} + +bool LocalNameTest::operator==(const ItemType &other) const +{ + return other.instanceOf() == ClassLocalNameTest && + static_cast<const LocalNameTest &>(other).m_ncName == m_ncName; +} + +PatternPriority LocalNameTest::patternPriority() const +{ + return -0.25; +} + +QT_END_NAMESPACE diff --git a/src/xmlpatterns/type/qlocalnametest_p.h b/src/xmlpatterns/type/qlocalnametest_p.h new file mode 100644 index 0000000..d15ccae --- /dev/null +++ b/src/xmlpatterns/type/qlocalnametest_p.h @@ -0,0 +1,102 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. + +#ifndef Patternist_LocalNameTest_H +#define Patternist_LocalNameTest_H + +#include "qabstractnodetest_p.h" + +template<typename Key, typename Value> class QHash; + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +namespace QPatternist +{ + /** + * @short A name test that is of the type <tt>*:local-name</tt>. + * + * @ingroup Patternist_types + * @author Frans Englich <fenglich@trolltech.com> + */ + class LocalNameTest : public AbstractNodeTest + { + public: + typedef QHash<QString, ItemType::Ptr> Hash; + + static ItemType::Ptr create(const ItemType::Ptr &primaryType, const QXmlName::LocalNameCode localName); + + /** + * @note This function assumes that @p item is a QXmlNodeModelIndex. + */ + virtual bool itemMatches(const Item &item) const; + + virtual QString displayName(const NamePool::Ptr &np) const; + + virtual bool operator==(const ItemType &other) const; + virtual PatternPriority patternPriority() const; + + protected: + virtual InstanceOf instanceOf() const; + + private: + LocalNameTest(const ItemType::Ptr &primaryType, const QXmlName::LocalNameCode &ncName); + + const QXmlName::LocalNameCode m_ncName; + }; +} + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif diff --git a/src/xmlpatterns/type/qmultiitemtype.cpp b/src/xmlpatterns/type/qmultiitemtype.cpp new file mode 100644 index 0000000..e7481ca --- /dev/null +++ b/src/xmlpatterns/type/qmultiitemtype.cpp @@ -0,0 +1,140 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qatomictype_p.h" + +#include "qmultiitemtype_p.h" + +QT_BEGIN_NAMESPACE + +using namespace QPatternist; + +MultiItemType::MultiItemType(const ItemType::List &list) : m_types(list), + m_end(list.constEnd()) +{ + Q_ASSERT_X(list.count() >= 2, Q_FUNC_INFO, + "It makes no sense to use MultiItemType for types less than two."); + Q_ASSERT_X(list.count(ItemType::Ptr()) == 0, Q_FUNC_INFO, + "No member in the list can be null."); +} + +QString MultiItemType::displayName(const NamePool::Ptr &np) const +{ + QString result; + ItemType::List::const_iterator it(m_types.constBegin()); + + while(true) + { + result += (*it)->displayName(np); + ++it; + + if(it != m_end) + result += QLatin1String(" | "); + else + break; + } + + return result; +} + +bool MultiItemType::itemMatches(const Item &item) const +{ + for(ItemType::List::const_iterator it(m_types.constBegin()); it != m_end; ++it) + if((*it)->itemMatches(item)) + return true; + + return false; +} + +bool MultiItemType::xdtTypeMatches(const ItemType::Ptr &type) const +{ + for(ItemType::List::const_iterator it(m_types.constBegin()); it != m_end; ++it) + if((*it)->xdtTypeMatches(type)) + return true; + + return false; +} + +bool MultiItemType::isNodeType() const +{ + for(ItemType::List::const_iterator it(m_types.constBegin()); it != m_end; ++it) + if((*it)->isNodeType()) + return true; + + return false; +} + +bool MultiItemType::isAtomicType() const +{ + for(ItemType::List::const_iterator it(m_types.constBegin()); it != m_end; ++it) + if((*it)->isAtomicType()) + return true; + + return false; +} + +ItemType::Ptr MultiItemType::xdtSuperType() const +{ + ItemType::List::const_iterator it(m_types.constBegin()); + /* Load the first one, and jump over it in the loop. */ + ItemType::Ptr result((*it)->xdtSuperType()); + ++it; + + for(; it != m_end; ++it) + result |= (*it)->xdtSuperType(); + + return result; +} + +ItemType::Ptr MultiItemType::atomizedType() const +{ + ItemType::List::const_iterator it(m_types.constBegin()); + /* Load the first one, and jump over it in the loop. */ + ItemType::Ptr result((*it)->atomizedType()); + ++it; + + for(; it != m_end; ++it) + result |= (*it)->atomizedType(); + + return result; +} + +QT_END_NAMESPACE diff --git a/src/xmlpatterns/type/qmultiitemtype_p.h b/src/xmlpatterns/type/qmultiitemtype_p.h new file mode 100644 index 0000000..06a1348 --- /dev/null +++ b/src/xmlpatterns/type/qmultiitemtype_p.h @@ -0,0 +1,146 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. + +#ifndef Patternist_MultiItemType_H +#define Patternist_MultiItemType_H + +#include <QList> + +#include "qitemtype_p.h" + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +namespace QPatternist +{ + /** + * @short Represents multiple types such as <tt>document()</tt> @em or <tt>xs:integer</tt>. + * + * In some situations two or more different types are allowed. For example, XQuery's + * @c validate expression accepts document or element nodes(but not attribute + * nodes, for example). MultiItemType is useful in such situations, its constructor + * takes a list of ItemType instances which its member functions treats as a wholeness. + * + * For example, xdtTypeMatches() returns @c true if any of the represented types matches. + * + * @ingroup Patternist_types + * @author Frans Englich <fenglich@trolltech.com> + */ + class MultiItemType : public ItemType + { + public: + /** + * Creates a MultiItemType representing the types in @p typeList. @p typeList must + * contain two or more types. + */ + MultiItemType(const ItemType::List &typeList); + + /** + * The display name are the names concatenated with "|" as separator. For example, + * if this MultiItemType represents the types <tt>document()</tt>, <tt>xs:integer</tt>, + * and <tt>xs:anyAtomicType</tt>, the display name is + * "document() | xs:integer | xs:anyAtomicType". + */ + virtual QString displayName(const NamePool::Ptr &np) const; + + /** + * If any of the types this MultiItemType represents matches @p item, it is + * considered a match. + * + * @returns @c true if any of the housed ItemType instances matches @p item, otherwise @c false + */ + virtual bool itemMatches(const Item &item) const; + + /** + * If any of the types this MultiItemType represents matches @p other, it is + * considered a match. + * + * @returns @c true if any of the housed ItemType instances matches @p other, otherwise @c false + */ + virtual bool xdtTypeMatches(const ItemType::Ptr &other) const; + + /** + * @returns @c true if any of the represented types is a node type. + */ + virtual bool isNodeType() const; + + /** + * @returns @c true if any of the represented types is an atomic type. + */ + virtual bool isAtomicType() const; + + /** + * Determines the union type of all the represented types super types. For example, + * if the represented types are <tt>xs:integer</tt>, <tt>document()</tt> + * and <tt>xs:string</tt>, <tt>item()</tt> is returned. + */ + virtual ItemType::Ptr xdtSuperType() const; + + /** + * Determines the union type of all the represented types atomized types. For example, + * if the represented types are <tt>xs:integer</tt> and <tt>document()</tt>, + * <tt>xs:anyAtomicType</tt> is returned, because that's the super type of <tt>xs:integer</tt> + * and <tt>xs:untypedAtomic</tt>. + */ + virtual ItemType::Ptr atomizedType() const; + + private: + const ItemType::List m_types; + const ItemType::List::const_iterator m_end; + }; +} + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif diff --git a/src/xmlpatterns/type/qnamespacenametest.cpp b/src/xmlpatterns/type/qnamespacenametest.cpp new file mode 100644 index 0000000..95f19a5 --- /dev/null +++ b/src/xmlpatterns/type/qnamespacenametest.cpp @@ -0,0 +1,95 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QHash> + +#include "qbuiltintypes_p.h" +#include "qitem_p.h" +#include "qitem_p.h" + +#include "qnamespacenametest_p.h" + +QT_BEGIN_NAMESPACE + +using namespace QPatternist; + +NamespaceNameTest::NamespaceNameTest(const ItemType::Ptr &primaryType, + const QXmlName::NamespaceCode namespaceURI) : AbstractNodeTest(primaryType), + m_namespaceURI(namespaceURI) +{ +} + +ItemType::Ptr NamespaceNameTest::create(const ItemType::Ptr &primaryType, const QXmlName::NamespaceCode namespaceURI) +{ + Q_ASSERT(primaryType); + + return ItemType::Ptr(new NamespaceNameTest(primaryType, namespaceURI)); +} + +bool NamespaceNameTest::itemMatches(const Item &item) const +{ + Q_ASSERT(item.isNode()); + return m_primaryType->itemMatches(item) && + item.asNode().name().namespaceURI() == m_namespaceURI; +} + +QString NamespaceNameTest::displayName(const NamePool::Ptr &np) const +{ + return QLatin1Char('{') + np->stringForNamespace(m_namespaceURI) + QLatin1String("}:*"); +} + +ItemType::InstanceOf NamespaceNameTest::instanceOf() const +{ + return ClassNamespaceNameTest; +} + +bool NamespaceNameTest::operator==(const ItemType &other) const +{ + return other.instanceOf() == ClassNamespaceNameTest && + static_cast<const NamespaceNameTest &>(other).m_namespaceURI == m_namespaceURI; +} + +PatternPriority NamespaceNameTest::patternPriority() const +{ + return -0.25; +} + +QT_END_NAMESPACE diff --git a/src/xmlpatterns/type/qnamespacenametest_p.h b/src/xmlpatterns/type/qnamespacenametest_p.h new file mode 100644 index 0000000..2b1ee46 --- /dev/null +++ b/src/xmlpatterns/type/qnamespacenametest_p.h @@ -0,0 +1,101 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. + +#ifndef Patternist_NamespaceNameTest_H +#define Patternist_NamespaceNameTest_H + +#include "qabstractnodetest_p.h" + +template<typename Key, typename Value> class QHash; + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +namespace QPatternist +{ + /** + * @short A name test that is of the type <tt>prefix:*</tt>. + * + * @ingroup Patternist_types + * @author Frans Englich <fenglich@trolltech.com> + */ + class NamespaceNameTest : public AbstractNodeTest + { + public: + typedef QHash<QString, ItemType::Ptr> Hash; + + static ItemType::Ptr create(const ItemType::Ptr &primaryType, const QXmlName::NamespaceCode namespaceURI); + + /** + * @note This function assumes that @p item is a QXmlNodeModelIndex. + */ + virtual bool itemMatches(const Item &item) const; + + virtual QString displayName(const NamePool::Ptr &np) const; + + virtual bool operator==(const ItemType &other) const; + PatternPriority patternPriority() const; + + protected: + virtual InstanceOf instanceOf() const; + + private: + NamespaceNameTest(const ItemType::Ptr &primaryType, const QXmlName::NamespaceCode namespaceURI); + const QXmlName::NamespaceCode m_namespaceURI; + }; +} + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif diff --git a/src/xmlpatterns/type/qnonetype.cpp b/src/xmlpatterns/type/qnonetype.cpp new file mode 100644 index 0000000..b7d42d8 --- /dev/null +++ b/src/xmlpatterns/type/qnonetype.cpp @@ -0,0 +1,104 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qbuiltintypes_p.h" + +#include "qnonetype_p.h" + +QT_BEGIN_NAMESPACE + +using namespace QPatternist; + +NoneType::NoneType() +{ +} + +bool NoneType::itemMatches(const Item &) const +{ + return false; +} + +bool NoneType::xdtTypeMatches(const ItemType::Ptr &t) const +{ + return *this == *t; +} + +const ItemType &NoneType::operator|(const ItemType &other) const +{ + return other; +} + +QString NoneType::displayName(const NamePool::Ptr &) const +{ + return QLatin1String("none"); +} + +Cardinality NoneType::cardinality() const +{ + return Cardinality::zeroOrMore(); +} + +ItemType::Ptr NoneType::itemType() const +{ + return ItemType::Ptr(const_cast<NoneType *>(this)); +} + +bool NoneType::isAtomicType() const +{ + return false; +} + +bool NoneType::isNodeType() const +{ + return false; +} + +ItemType::Ptr NoneType::atomizedType() const +{ + return BuiltinTypes::xsAnyAtomicType; +} + +ItemType::Ptr NoneType::xdtSuperType() const +{ + return BuiltinTypes::item; +} + +QT_END_NAMESPACE diff --git a/src/xmlpatterns/type/qnonetype_p.h b/src/xmlpatterns/type/qnonetype_p.h new file mode 100644 index 0000000..aa739d2 --- /dev/null +++ b/src/xmlpatterns/type/qnonetype_p.h @@ -0,0 +1,155 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. + +#ifndef Patternist_NoneType_H +#define Patternist_NoneType_H + +#include "qatomictype_p.h" +#include "qsequencetype_p.h" + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +namespace QPatternist +{ + + /** + * @short Represents the special <tt>none</tt> type. + * + * @ingroup Patternist_types + * @see <a href="http://www.w3.org/TR/xquery-semantics/#sec_content_models">XQuery 1.0 and + * XPath 2.0 Formal Semantics, 2.4.3 Content models</a> + * @see <a href="http://www.w3.org/TR/xquery-semantics/#sec_fnerror">XQuery 1.0 and XPath 2.0 + * Formal Semantics, 7.2.9 The fn:error function</a> + * @author Frans Englich <fenglich@trolltech.com> + */ + class NoneType : public ItemType, + public SequenceType + { + public: + typedef QExplicitlySharedDataPointer<NoneType> Ptr; + + virtual bool itemMatches(const Item &item) const; + virtual bool xdtTypeMatches(const ItemType::Ptr &other) const; + + /** + * @returns always "none". That is, no namespace prefix + */ + virtual QString displayName(const NamePool::Ptr &np) const; + + /** + * @note The semantical meaning of this type's item type can + * surely be discussed. The function is provided due to + * it being mandated by the SequenceType base class. + * + * @returns always 'this' since NoneType is also an ItemType + */ + virtual ItemType::Ptr itemType() const; + + /** + * @note The semantical meaning of this type's cardinality + * can surely be discussed. The function is provided due to + * it being mandated by the SequenceType base class. + * + * @returns always Cardinality::zeroOrMore() + */ + virtual Cardinality cardinality() const; + + /** + * @returns always @c false + */ + virtual bool isAtomicType() const; + + /** + * This can be thought to be a weird function for this type(none). There + * is no atomized type for none, perhaps the best from a conceptual perspective + * would be to return @c null. + * + * This function returns BuiltinTypes::xsAnyAtomicType because + * the generic type checking code inserts an Atomizer in the AST + * when an error() function(or other node which has type none) is part of + * an operator expression(value/general comparison, arithmetics). The Atomizer + * returns the atomizedType() of its child, and by here returning xsAnyAtomicType, + * static operator lookup is postponed to runtime. Subsequently, expressions like error() + * works properly with other XPath expressions. + */ + virtual ItemType::Ptr atomizedType() const; + + /** + * @returns always @c false + */ + virtual bool isNodeType() const; + + /** + * @returns always item() + */ + virtual ItemType::Ptr xdtSuperType() const; + + /** + * @returns always @p other. The none type can be thought as + * disappearing when attempting to find the union of it and + * another type. + */ + virtual const ItemType &operator|(const ItemType &other) const; + + protected: + + friend class CommonSequenceTypes; + NoneType(); + }; +} + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif diff --git a/src/xmlpatterns/type/qnumerictype.cpp b/src/xmlpatterns/type/qnumerictype.cpp new file mode 100644 index 0000000..6df26c2 --- /dev/null +++ b/src/xmlpatterns/type/qnumerictype.cpp @@ -0,0 +1,142 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qatomictype_p.h" +#include "qbuiltintypes_p.h" +#include "qitem_p.h" +#include "qschematype_p.h" + +#include "qnumerictype_p.h" + +QT_BEGIN_NAMESPACE + +using namespace QPatternist; + +NumericType::NumericType() +{ +} + +NumericType::~NumericType() +{ +} + +bool NumericType::itemMatches(const Item &item) const +{ + if(item.isNode()) + return false; + + return BuiltinTypes::xsDouble->itemMatches(item) || + BuiltinTypes::xsDecimal->itemMatches(item) || + BuiltinTypes::xsFloat->itemMatches(item); +} + +bool NumericType::xdtTypeMatches(const ItemType::Ptr &t) const +{ + return BuiltinTypes::xsDouble->xdtTypeMatches(t) || + BuiltinTypes::xsDecimal->xdtTypeMatches(t) || + BuiltinTypes::xsFloat->xdtTypeMatches(t) || + *t == *this; /* If it's NumericType */ +} + +QString NumericType::displayName(const NamePool::Ptr &) const +{ + return QLatin1String("numeric"); +} + +SchemaType::Ptr NumericType::wxsSuperType() const +{ + return BuiltinTypes::xsAnyAtomicType; +} + +ItemType::Ptr NumericType::xdtSuperType() const +{ + return BuiltinTypes::xsAnyAtomicType; +} + +bool NumericType::isAbstract() const +{ + return true; +} + +bool NumericType::isNodeType() const +{ + return false; +} + +bool NumericType::isAtomicType() const +{ + return true; +} + +ItemType::Ptr NumericType::atomizedType() const +{ + return AtomicType::Ptr(); +} + +AtomicTypeVisitorResult::Ptr NumericType::accept(const AtomicTypeVisitor::Ptr &, + const SourceLocationReflection *const) const +{ + return AtomicTypeVisitorResult::Ptr(); +} + +AtomicTypeVisitorResult::Ptr NumericType::accept(const ParameterizedAtomicTypeVisitor::Ptr &, + const qint16, + const SourceLocationReflection *const) const +{ + return AtomicTypeVisitorResult::Ptr(); +} + +AtomicComparatorLocator::Ptr NumericType::comparatorLocator() const +{ + return AtomicComparatorLocator::Ptr(); +} + +AtomicMathematicianLocator::Ptr NumericType::mathematicianLocator() const +{ + return AtomicMathematicianLocator::Ptr(); +} + +AtomicCasterLocator::Ptr NumericType::casterLocator() const +{ + return AtomicCasterLocator::Ptr(); +} + +QT_END_NAMESPACE diff --git a/src/xmlpatterns/type/qnumerictype_p.h b/src/xmlpatterns/type/qnumerictype_p.h new file mode 100644 index 0000000..a6e249b --- /dev/null +++ b/src/xmlpatterns/type/qnumerictype_p.h @@ -0,0 +1,174 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. + +#ifndef Patternist_NumericType_H +#define Patternist_NumericType_H + +#include "qatomictype_p.h" + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +namespace QPatternist +{ + /** + * @short Represents the internal and abstract type @c fs:numeric. + * + * @see <a href="http://www.w3.org/TR/xquery-semantics/#dt-fs_numeric">XQuery 1.0 + * and XPath 2.0 Formal Semantics, Definition: fs:numeric</a> + * @ingroup Patternist_types + * @author Frans Englich <fenglich@trolltech.com> + */ + class NumericType : public AtomicType + { + public: + virtual ~NumericType(); + + virtual bool itemMatches(const Item &item) const; + virtual bool xdtTypeMatches(const ItemType::Ptr &other) const; + + /** + * @returns always "numeric". That is, no namespace prefix + */ + virtual QString displayName(const NamePool::Ptr &np) const; + + /** + * @returns always @c true + */ + virtual bool isAbstract() const; + + /** + * @returns always @c false + */ + virtual bool isNodeType() const; + + /** + * @returns always @c true + */ + virtual bool isAtomicType() const; + + /** + * @returns always xs:anyAtomicType + */ + virtual SchemaType::Ptr wxsSuperType() const; + + /** + * @returns always xs:anyAtomicType + */ + virtual ItemType::Ptr xdtSuperType() const; + + /** + * @returns @c null. It makes no sense to atomize the abstract type @c fs:numeric. + */ + virtual ItemType::Ptr atomizedType() const; + + /** + * NumericType cannot be visited. This function is only implemented + * to satisfy the abstract super class's interface. + * + * @returns always a @c null pointer + */ + virtual AtomicTypeVisitorResult::Ptr accept(const AtomicTypeVisitor::Ptr &visitor, + const SourceLocationReflection *const) const; + + /** + * NumericType cannot be visited. This function is only implemented + * to satisfy the abstract super class's interface. + * + * @returns always a @c null pointer + */ + virtual AtomicTypeVisitorResult::Ptr accept(const ParameterizedAtomicTypeVisitor::Ptr &visitor, + const qint16 op, + const SourceLocationReflection *const) const; + + /** + * The type @c fs:numeric is an abstract type which therefore + * cannot be involved in comparisons. Hence, this function returns + * @c null. This function is only implemented to satisfy the abstract + * super class's interface. + * + * @returns always a @c null pointer + */ + virtual AtomicComparatorLocator::Ptr comparatorLocator() const; + + /** + * The type @c fs:numeric is an abstract type which therefore + * cannot be involved in arithmetics. Hence, this function returns + * @c null. This function is only implemented to satisfy the abstract + * super class's interface. + * + * @returns always a @c null pointer + */ + virtual AtomicMathematicianLocator::Ptr mathematicianLocator() const; + + + /** + * The type @c fs:numeric is an abstract type which therefore + * cannot be involved in casting. Hence, this function returns + * @c null. This function is only implemented to satisfy the abstract + * super class's interface. + * + * @returns always a @c null pointer + */ + virtual AtomicCasterLocator::Ptr casterLocator() const; + + protected: + friend class BuiltinTypes; + NumericType(); + }; +} + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif diff --git a/src/xmlpatterns/type/qprimitives_p.h b/src/xmlpatterns/type/qprimitives_p.h new file mode 100644 index 0000000..354b690 --- /dev/null +++ b/src/xmlpatterns/type/qprimitives_p.h @@ -0,0 +1,202 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. + +#ifndef Patternist_Primitives_H +#define Patternist_Primitives_H + +#include <QtGlobal> + +/** + * @file + * @short Contains enumerators and typedefs applying + * for Patternist on a global scale, as well as central documentation. + */ + +/** + * @short Contains Patternist, an XPath 2.0, XQuery 1.0 and XSL-T 2.0 implementation. + * + * @author Frans Englich <fenglich@trolltech.com> + */ +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +class QString; + +/** + * @short The namespace for the internal API of QtXmlPatterns + * @internal + */ +namespace QPatternist +{ + + /** + * @defgroup Patternist_cppWXSTypes C++ Primitives for W3C XML Schema Number Types + * + * The implementations of W3C XML Schema's(WXS) number types, more specifically + * their value spaces, must in the end be represented by primitive C++ types. + * In addition, there is an extensive range of functions and classes that in + * different ways deals with data that will end up as instances of the WXS + * types. For this reason, a set of typedefs for these primitives exists, that + * are used throughout the API. This ensures consistency, reduces the amount + * of conversions, and potentially precision loss in conversions. + * + * @author Frans Englich <fenglich@trolltech.com> + */ + + /** + * This is the native C++ scalar type holding the value space + * for atomic values of type xs:double. Taking this type, xsDouble, + * as parameter, is the most efficient way to integrate with xs:double. + * + * @ingroup Patternist_cppWXSTypes + */ + typedef qreal xsDouble; + + /** + * This is the native C++ scalar type holding the value space + * for atomic values of type xs:float. Taking this type, xsFloat, + * as parameter, is the most efficient way to integrate with xs:float. + * + * @ingroup Patternist_cppWXSTypes + */ + typedef xsDouble xsFloat; + + /** + * This is the native C++ scalar type holding the value space + * for atomic values of type xs:decimal. Taking this type, xsDecimal, + * as parameter, is the most efficient way to integrate with xs:decimal. + * + * @ingroup Patternist_cppWXSTypes + */ + typedef xsDouble xsDecimal; + + /** + * This is the native C++ scalar type holding the value space + * for atomic values of type xs:integer. Taking this type, xsInteger, + * as parameter, is the most efficient way to integrate with xs:integer. + * + * @ingroup Patternist_cppWXSTypes + */ + typedef qint64 xsInteger; + + /** + * This is the native C++ scalar type holding the value space + * for atomic values of type xs:integer. Taking this type, xsInteger, + * as parameter, is the most efficient way to integrate with xs:integer. + * + * @ingroup Patternist_cppWXSTypes + */ + typedef qint32 VariableSlotID; + + typedef qint32 DayCountProperty; + typedef qint32 HourCountProperty; + typedef qint32 MinuteCountProperty; + typedef qint32 MonthCountProperty; + typedef qint32 SecondCountProperty; + typedef qint64 MSecondCountProperty; + typedef qint32 SecondProperty; + typedef qint32 YearProperty; + typedef qint8 DayProperty; + typedef qint8 HourProperty; + typedef qint8 MinuteProperty; + typedef qint8 MonthProperty; + + /** + * Milliseconds. 1 equals 0.001 SecondProperty. + */ + typedef qint16 MSecondProperty; + + /** + * The hour property of a zone offset. For example, -13 in the + * zone offset "-13:08". + */ + typedef qint8 ZOHourProperty; + + /** + * The minute property of a zone offset. For example, -08 in the + * zone offset "-13:08". + */ + typedef qint8 ZOMinuteProperty; + + /** + * The full zone offset in minutes. + */ + typedef qint32 ZOTotal; + + typedef xsDouble PatternPriority; + + /** + * Signifies the import precedence of a template. For instance, the first + * stylesheet module has 1, the first import 2, and so forth. Smaller means + * higher import precedence. 0 is reserved for builtin templates. + */ + typedef int ImportPrecedence; + + /** + * @short Similar to Qt::escape(), but also escapes apostrophes and quotes, + * such that the result is suitable as attribute content too. + * + * Since Qt::escape() is in QtGui, using it creates a dependency on that + * library. This function does not. + * + * The implementation resides in qpatternistlocale.cpp. + * + * @see Qt::escape() + */ + QString Q_AUTOTEST_EXPORT escape(const QString &input); +} + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif diff --git a/src/xmlpatterns/type/qqnametest.cpp b/src/xmlpatterns/type/qqnametest.cpp new file mode 100644 index 0000000..929ed5a --- /dev/null +++ b/src/xmlpatterns/type/qqnametest.cpp @@ -0,0 +1,99 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QHash> + +#include "qbuiltintypes_p.h" +#include "qitem_p.h" +#include "qitem_p.h" + +#include "qqnametest_p.h" + +QT_BEGIN_NAMESPACE + +using namespace QPatternist; + +QNameTest::QNameTest(const ItemType::Ptr &primaryType, + const QXmlName qName) : AbstractNodeTest(primaryType) + , m_qName(qName) +{ + Q_ASSERT(!qName.isNull()); +} + +ItemType::Ptr QNameTest::create(const ItemType::Ptr &primaryType, const QXmlName qName) +{ + Q_ASSERT(!qName.isNull()); + Q_ASSERT(primaryType); + + return ItemType::Ptr(new QNameTest(primaryType, qName)); +} + +bool QNameTest::itemMatches(const Item &item) const +{ + Q_ASSERT(item.isNode()); + return m_primaryType->itemMatches(item) && + item.asNode().name() == m_qName; +} + +QString QNameTest::displayName(const NamePool::Ptr &np) const +{ + QString displayOther(m_primaryType->displayName(np)); + + return displayOther.insert(displayOther.size() - 1, np->displayName(m_qName)); +} + +ItemType::InstanceOf QNameTest::instanceOf() const +{ + return ClassQNameTest; +} + +bool QNameTest::operator==(const ItemType &other) const +{ + return other.instanceOf() == ClassQNameTest && + static_cast<const QNameTest &>(other).m_qName == m_qName; +} + +PatternPriority QNameTest::patternPriority() const +{ + return 0; +} + +QT_END_NAMESPACE diff --git a/src/xmlpatterns/type/qqnametest_p.h b/src/xmlpatterns/type/qqnametest_p.h new file mode 100644 index 0000000..9166c87 --- /dev/null +++ b/src/xmlpatterns/type/qqnametest_p.h @@ -0,0 +1,103 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. + +#ifndef Patternist_QNameTest_H +#define Patternist_QNameTest_H + +#include "qabstractnodetest_p.h" + +template<typename Key, typename Value> class QHash; + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +namespace QPatternist +{ + /** + * @short A name test that is of the type <tt>prefix:ncName</tt>. + * + * @ingroup Patternist_types + * @author Frans Englich <fenglich@trolltech.com> + */ + class QNameTest : public AbstractNodeTest + { + public: + typedef QHash<QString, QNameTest::Ptr> Hash; + + static ItemType::Ptr create(const ItemType::Ptr &primaryType, const QXmlName qName); + + /** + * @note This function assumes that @p item is a QXmlNodeModelIndex. + */ + virtual bool itemMatches(const Item &item) const; + + virtual QString displayName(const NamePool::Ptr &np) const; + + virtual bool operator==(const ItemType &other) const; + + virtual PatternPriority patternPriority() const; + + protected: + virtual InstanceOf instanceOf() const; + + private: + QNameTest(const ItemType::Ptr &primaryType, const QXmlName qName); + + const QXmlName m_qName; + }; +} + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif diff --git a/src/xmlpatterns/type/qschemacomponent.cpp b/src/xmlpatterns/type/qschemacomponent.cpp new file mode 100644 index 0000000..e828cac --- /dev/null +++ b/src/xmlpatterns/type/qschemacomponent.cpp @@ -0,0 +1,56 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qschemacomponent_p.h" + +QT_BEGIN_NAMESPACE + +using namespace QPatternist; + +SchemaComponent::SchemaComponent() +{ +} + +SchemaComponent::~SchemaComponent() +{ +} + +QT_END_NAMESPACE diff --git a/src/xmlpatterns/type/qschemacomponent_p.h b/src/xmlpatterns/type/qschemacomponent_p.h new file mode 100644 index 0000000..749210a --- /dev/null +++ b/src/xmlpatterns/type/qschemacomponent_p.h @@ -0,0 +1,85 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. + +#ifndef Patternist_SchemaComponent_H +#define Patternist_SchemaComponent_H + +#include <QSharedData> +#include <QtGlobal> + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +namespace QPatternist +{ + /** + * @short Base class for all constructs that can appear in a W3C XML Schema. + * + * @ingroup Patternist_types + * @author Frans Englich <fenglich@trolltech.com> + */ + class SchemaComponent : public virtual QSharedData + { + public: + SchemaComponent(); + virtual ~SchemaComponent(); + + private: + Q_DISABLE_COPY(SchemaComponent) + }; +} + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif diff --git a/src/xmlpatterns/type/qschematype.cpp b/src/xmlpatterns/type/qschematype.cpp new file mode 100644 index 0000000..b4d6bc0 --- /dev/null +++ b/src/xmlpatterns/type/qschematype.cpp @@ -0,0 +1,75 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qschematype_p.h" + +QT_BEGIN_NAMESPACE + +using namespace QPatternist; + +SchemaType::SchemaType() +{ +} + +SchemaType::~SchemaType() +{ +} + +bool SchemaType::isSimpleType() const +{ + switch(category()) + { + /* Fallthrough */ + case SimpleTypeAtomic: + case SimpleTypeList: + case SimpleTypeUnion: + return true; + default: + return false; + } +} + +bool SchemaType::isComplexType() const +{ + return category() == ComplexType; +} + +QT_END_NAMESPACE diff --git a/src/xmlpatterns/type/qschematype_p.h b/src/xmlpatterns/type/qschematype_p.h new file mode 100644 index 0000000..30f63c8 --- /dev/null +++ b/src/xmlpatterns/type/qschematype_p.h @@ -0,0 +1,222 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. + +#ifndef Patternist_SchemaType_H +#define Patternist_SchemaType_H + +#include "qnamepool_p.h" +#include "qschemacomponent_p.h" +#include "qxmlname.h" + +template<typename N, typename M> class QHash; + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +namespace QPatternist +{ + class AtomicType; + + /** + * @short Base class for W3C XML Schema types. + * + * This is the base class of all data types in a W3C XML Schema. + * + * @ingroup Patternist_types + * @author Frans Englich <fenglich@trolltech.com> + */ + class SchemaType : public SchemaComponent + { + public: + + typedef QExplicitlySharedDataPointer<SchemaType> Ptr; + typedef QHash<QXmlName, SchemaType::Ptr> Hash; + + /** + * Schema types are divided into different categories such as + * complex type, atomic imple type, union simple type, and so forth. This + * enumerator, which category() returns a value of, identifies what + * category the type belong to. + * + * @todo Add docs & links for the enums + */ + enum TypeCategory + { + None = 0, + /** + * A simple atomic type. These are also sometimes + * referred to as primitive types. An example of this type is + * xs:string. + * + * Formally speaking, a simple type with variety atomic. + */ + SimpleTypeAtomic, + SimpleTypeList, + SimpleTypeUnion, + ComplexType + }; + + enum DerivationMethod + { + DerivationRestriction = 1, + DerivationExtension = 2, + DerivationUnion = 4, + DerivationList = 8, + /** + * Used for <tt>xs:anyType</tt>. + */ + NoDerivation = 16 + }; + + SchemaType(); + virtual ~SchemaType(); + + /** + * Determines how this SchemaType is derived from its super type. + * + * @note Despite that DerivationMethod is designed for being + * used for bitwise OR'd value, this function may only return one enum + * value. If the type does not derive from any type, which is the case of + * <tt>xs:anyType</tt>, this function returns NoDerivation. + * + * @see SchemaType::wxsSuperType() + * @see <a href="http://www.w3.org/TR/DOM-Level-3-Core/core.html#TypeInfo-DerivationMethods">Document + * Object Model (DOM) Level 3 Core Specification, Definition group DerivationMethods</a> + * @returns a DerivationMethod enumerator signifiying how + * this SchemaType is derived from its base type + */ + virtual DerivationMethod derivationMethod() const = 0; + + /** + * Determines whether the type is an abstract type. + * + * @note It is important a correct value is returned, since + * abstract types must not be instantiated. + */ + virtual bool isAbstract() const = 0; + + /** + * @short Returns the name of the type. + * + * The reason to why we take the name pool argument, is that the basic + * types, @c xs:anySimpleType and so on, are stored globally in + * BuiltinTypes and ComonSequenceTypes, and therefore cannot be tied to + * a certain name pool. Type instances that knows they always will be + * used with a certain name pool, can therefore ignore @p np and return + * a QXmlName instance stored as a member. + * + * If the type code was refactored to not be store globally and + * therfore by design would be tied to a name pool, this argument could + * be removed. + */ + virtual QXmlName name(const NamePool::Ptr &np) const = 0; + + /** + * @short Returns a suitable display name for this type. + * + * See name() for an explanation to why we take a NamePool as argument. + */ + virtual QString displayName(const NamePool::Ptr &np) const = 0; + + /** + * @returns the W3C XML Schema base type that this type derives from. All types + * returns an instance, except for the xs:anyType since it + * is the very base type of all types, and it returns 0. Hence, + * one can walk the hierarchy of a schema type by recursively calling + * wxsSuperType, until zero is returned. + * + * This function walks the Schema hierarchy. Some simple types, the atomic types, + * is also part of the XPath Data Model hierarchy, and their super type in that + * hierarchy can be introspected with xdtSuperType(). + * + * wxsSuperType() can be said to correspond to the {base type definition} property + * in the Post Schema Valid Infoset(PSVI). + * + * @see ItemType::xdtSuperType() + */ + virtual SchemaType::Ptr wxsSuperType() const = 0; + + /** + * @returns @c true if @p other is identical to 'this' schema type or if @p other + * is either directly or indirectly a base type of 'this'. Hence, calling + * AnyType::wxsTypeMatches() with @p other as argument returns @c true for all types, + * since all types have @c xs:anyType as super type. + */ + virtual bool wxsTypeMatches(const SchemaType::Ptr &other) const = 0; + + virtual TypeCategory category() const = 0; + + /** + * Determines whether the type is a simple type, by introspecting + * the result of category(). + * + * @note Do not re-implement this function, but instead override category() + * and let it return an appropriate value. + */ + bool isSimpleType() const; + + /** + * Determines whether the type is a complex type, by introspecting + * the result of category(). + * + * @note Do not re-implement this function, but instead override category() + * and let it return an appropriate value. + */ + bool isComplexType() const; + }; +} + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif diff --git a/src/xmlpatterns/type/qschematypefactory.cpp b/src/xmlpatterns/type/qschematypefactory.cpp new file mode 100644 index 0000000..fae1c46 --- /dev/null +++ b/src/xmlpatterns/type/qschematypefactory.cpp @@ -0,0 +1,56 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qschematypefactory_p.h" + +QT_BEGIN_NAMESPACE + +using namespace QPatternist; + +SchemaTypeFactory::SchemaTypeFactory() +{ +} + +SchemaTypeFactory::~SchemaTypeFactory() +{ +} + +QT_END_NAMESPACE diff --git a/src/xmlpatterns/type/qschematypefactory_p.h b/src/xmlpatterns/type/qschematypefactory_p.h new file mode 100644 index 0000000..72ce9fe --- /dev/null +++ b/src/xmlpatterns/type/qschematypefactory_p.h @@ -0,0 +1,102 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. + +#ifndef Patternist_SchemaTypeFactory_H +#define Patternist_SchemaTypeFactory_H + +#include <QSharedData> + +#include "qreportcontext_p.h" +#include "qitemtype_p.h" +#include "qschematype_p.h" + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +namespace QPatternist +{ + /** + * @short A factory creating schema types. + * + * @ingroup Patternist_types + * @author Frans Englich <fenglich@trolltech.com> + */ + class SchemaTypeFactory : public QSharedData + { + public: + typedef QExplicitlySharedDataPointer<SchemaTypeFactory> Ptr; + + SchemaTypeFactory(); + virtual ~SchemaTypeFactory(); + + /** + * @returns a schema type for name @p name. If no schema type exists for @p name, @c null + * is returned + */ + virtual SchemaType::Ptr createSchemaType(const QXmlName name) const = 0; + + /** + * @returns a dictionary containing the types this factory serves. The key + * is the type's QName in Clark name syntax. + */ + virtual SchemaType::Hash types() const = 0; + + private: + Q_DISABLE_COPY(SchemaTypeFactory) + }; +} + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif diff --git a/src/xmlpatterns/type/qsequencetype.cpp b/src/xmlpatterns/type/qsequencetype.cpp new file mode 100644 index 0000000..31efa62 --- /dev/null +++ b/src/xmlpatterns/type/qsequencetype.cpp @@ -0,0 +1,65 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qsequencetype_p.h" + +QT_BEGIN_NAMESPACE + +using namespace QPatternist; + +SequenceType::~SequenceType() +{ +} + +bool SequenceType::matches(const SequenceType::Ptr other) const +{ + Q_ASSERT(other); + + return itemType()->xdtTypeMatches(other->itemType()) && + cardinality().isMatch(other->cardinality()); +} + +bool SequenceType::is(const SequenceType::Ptr &other) const +{ + return matches(other) && other->matches(Ptr(this)); +} + +QT_END_NAMESPACE diff --git a/src/xmlpatterns/type/qsequencetype_p.h b/src/xmlpatterns/type/qsequencetype_p.h new file mode 100644 index 0000000..016bffd --- /dev/null +++ b/src/xmlpatterns/type/qsequencetype_p.h @@ -0,0 +1,138 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. + +#ifndef Patternist_SequenceType_H +#define Patternist_SequenceType_H + +template<typename T> class QList; + +#include <QSharedData> + +#include "qcardinality_p.h" +#include "qitemtype_p.h" + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +namespace QPatternist +{ + class ItemType; + + /** + * @short A SequenceType instance represents the type of a sequence of Item + * instances. + * + * It carries a Cardinality and ItemType, and is hence conceptually + * identical to the SequenceType EBNF construct. + * + * @ingroup Patternist_types + * @author Frans Englich <fenglich@trolltech.com> + * @see <a href="http://www.w3.org/TR/xpath20/#id-sequencetype-syntax">XML + * Path Language (XPath) 2.0, 2.5.3 SequenceType Syntax</a> + */ + class SequenceType : public virtual QSharedData + { + public: + inline SequenceType() + { + } + + /** + * A smart pointer wrapping SequenceType instances. + */ + typedef QExplicitlySharedDataPointer<const SequenceType> Ptr; + + /** + * A list of SequenceType instances, each wrapped in a smart pointer. + */ + typedef QList<SequenceType::Ptr> List; + + virtual ~SequenceType(); + + /** + * Generates a name for the sequence type for display purposes. The + * prefix used for the QName identifying the schema type is conventional. + * An example of a display name for a SequenceType is "xs:integer?". + */ + virtual QString displayName(const NamePool::Ptr &np) const = 0; + + virtual Cardinality cardinality() const = 0; + + virtual ItemType::Ptr itemType() const = 0; + + /** + * Determines whether @p other is identical to, or a sub-type + * of this SequenceType. For example, if this SequenceType is + * <tt>xs:anyAtomicType</tt>, @c false is returned if @p other is <tt>element()</tt>, + * but @c true if @p other is <tt>xs:string</tt>. + * + * The return values of cardinality() and itemType() used with ItemType::xdtTypeMatches + * and Cardinality::isWithinScope() is used for achieving this. + * + * @see <a href="http://www.w3.org/TR/xquery/#id-sequencetype-matching">XQuery 1.0: + * An XML Query Language, 2.5.4 SequenceType Matching</a> + */ + bool matches(const SequenceType::Ptr other) const; + + bool is(const SequenceType::Ptr &other) const; + private: + Q_DISABLE_COPY(SequenceType) + }; +} + +Q_DECLARE_TYPEINFO(QPatternist::SequenceType::Ptr, Q_MOVABLE_TYPE); + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif diff --git a/src/xmlpatterns/type/qtypechecker.cpp b/src/xmlpatterns/type/qtypechecker.cpp new file mode 100644 index 0000000..c419af6 --- /dev/null +++ b/src/xmlpatterns/type/qtypechecker.cpp @@ -0,0 +1,296 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qargumentconverter_p.h" +#include "qatomictype_p.h" +#include "qatomizer_p.h" +#include "qbuiltintypes_p.h" +#include "qcardinalityverifier_p.h" +#include "qcommonsequencetypes_p.h" +#include "qfunctionfactory_p.h" +#include "qitemverifier_p.h" +#include "qpatternistlocale_p.h" +#include "quntypedatomicconverter_p.h" + +#include "qtypechecker_p.h" + +QT_BEGIN_NAMESPACE + +using namespace QPatternist; + +QString TypeChecker::wrongType(const NamePool::Ptr &np, + const ItemType::Ptr &reqType, + const ItemType::Ptr &opType) +{ + return QtXmlPatterns::tr("Required type is %1, but %2 was found.") + .arg(formatType(np, reqType), formatType(np, opType)); +} + +Expression::Ptr TypeChecker::applyFunctionConversion(const Expression::Ptr &operand, + const SequenceType::Ptr &reqType, + const StaticContext::Ptr &context, + const ReportContext::ErrorCode code, + const Options options) +{ + Q_ASSERT_X(!ReportContext::codeToString(code).isEmpty(), Q_FUNC_INFO, + "This test ensures 'code' exists, otherwise codeToString() would assert."); + Q_ASSERT(operand); + Q_ASSERT(reqType); + Q_ASSERT(context); + + /* Do it in two steps: verify type, and then cardinality. */ + const Expression::Ptr cardVerified(CardinalityVerifier::verifyCardinality(operand, reqType->cardinality(), context, code)); + return verifyType(cardVerified, reqType, context, code, options); +} + +bool TypeChecker::promotionPossible(const ItemType::Ptr &fromType, + const ItemType::Ptr &toType, + const StaticContext::Ptr &context) +{ + /* These types can be promoted to xs:string. xs:untypedAtomic should be + * cast when interpreting it formally, but implementing it as a promotion + * gives the same result(and is faster). */ + if(*toType == *BuiltinTypes::xsString && + (BuiltinTypes::xsUntypedAtomic->xdtTypeMatches(fromType) || + BuiltinTypes::xsAnyURI->xdtTypeMatches(fromType))) + return true; + + if(*toType == *BuiltinTypes::xsDouble && + BuiltinTypes::numeric->xdtTypeMatches(fromType)) + { + /* Any numeric can be promoted to xs:double. */ + return true; + } + + /* xs:decimal/xs:integer can be promoted to xs:float. */ + if(*toType == *BuiltinTypes::xsFloat && BuiltinTypes::xsDecimal->xdtTypeMatches(fromType)) + + { + context->warning(QtXmlPatterns::tr("Promoting %1 to %2 may cause loss of precision.") + .arg(formatType(context->namePool(), fromType)) + .arg(formatType(context->namePool(), BuiltinTypes::xsFloat))); + return true; + } + + return false; +} + +Expression::Ptr TypeChecker::typeCheck(Expression *const op, + const StaticContext::Ptr &context, + const SequenceType::Ptr &reqType) +{ + return Expression::Ptr(op->typeCheck(context, reqType)); +} + +Expression::Ptr TypeChecker::verifyType(const Expression::Ptr &operand, + const SequenceType::Ptr &reqSeqType, + const StaticContext::Ptr &context, + const ReportContext::ErrorCode code, + const Options options) +{ + const ItemType::Ptr reqType(reqSeqType->itemType()); + const Expression::Properties props(operand->properties()); + + /* If operand requires a focus, do the necessary type checking for that. */ + if(props.testFlag(Expression::RequiresFocus) && options.testFlag(CheckFocus)) + { + const ItemType::Ptr contextType(context->contextItemType()); + if(contextType) + { + if(props.testFlag(Expression::RequiresContextItem)) + { + Q_ASSERT_X(operand->expectedContextItemType(), Q_FUNC_INFO, + "When the Expression sets the RequiresContextItem property, it must " + "return a type in expectedContextItemType()"); + const ItemType::Ptr expectedContextType(operand->expectedContextItemType()); + + /* Allow the empty sequence. We don't want to trigger XPTY0020 on ()/... . */ + if(!expectedContextType->xdtTypeMatches(contextType) && contextType != CommonSequenceTypes::Empty) + { + context->error(wrongType(context->namePool(), operand->expectedContextItemType(), contextType), + ReportContext::XPTY0020, operand.data()); + return operand; + } + } + } + else + { + context->error(QtXmlPatterns::tr("The focus is undefined."), ReportContext::XPDY0002, operand.data()); + return operand; + } + } + + SequenceType::Ptr operandSeqType(operand->staticType()); + ItemType::Ptr operandType(operandSeqType->itemType()); + + /* This returns the operand if the types are identical or if operandType + * is a subtype of reqType. */ + if(reqType->xdtTypeMatches(operandType) || *operandType == *CommonSequenceTypes::Empty) + return operand; + + /* Since we haven't exited yet, it means that the operandType is a super type + * of reqType, and that there hence is a path down to it through the + * type hierachy -- but that doesn't neccessarily mean that a up-cast(down the + * hierarchy) would succeed. */ + + Expression::Ptr result(operand); + + if(reqType->isAtomicType()) + { + const Expression::ID opID = operand->id(); + if((opID == Expression::IDArgumentReference || + (opID == Expression::IDCardinalityVerifier && operand->operands().first()->is(Expression::IDArgumentReference))) + && *BuiltinTypes::item == *operandType) + return Expression::Ptr(new ArgumentConverter(result, reqType)); + + if(!operandType->isAtomicType()) + { + result = Expression::Ptr(new Atomizer(result)); + /* The atomizer might know more about the type. */ + operandType = result->staticType()->itemType(); + } + + if(reqType->xdtTypeMatches(operandType)) + { + /* Atomization was sufficient. Either the expected type is xs:anyAtomicType + * or the type the Atomizer knows it returns, matches the required type. */ + return result; + } + + const bool compatModeEnabled = context->compatModeEnabled(); + + if((options.testFlag(AutomaticallyConvert) && BuiltinTypes::xsUntypedAtomic->xdtTypeMatches(operandType)) || + (compatModeEnabled && BuiltinTypes::xsString->xdtTypeMatches(reqType))) + { + if(*reqType == *BuiltinTypes::numeric) + { + result = typeCheck(new UntypedAtomicConverter(result, BuiltinTypes::xsDouble, code), + context, reqSeqType); + } + else + result = typeCheck(new UntypedAtomicConverter(result, reqType, code), context, reqSeqType); + + /* The UntypedAtomicConverter might know more about the type, so reload. */ + operandType = result->staticType()->itemType(); + } + else if(compatModeEnabled && *reqType == *BuiltinTypes::xsDouble) + { + const FunctionFactory::Ptr functions(context->functionSignatures()); + Expression::List numberArgs; + numberArgs.append(operand); + + result = functions->createFunctionCall(QXmlName(StandardNamespaces::fn, StandardLocalNames::number), + numberArgs, + context, + operand.data())->typeCheck(context, reqSeqType); + operandType = result->staticType()->itemType(); + context->wrapExpressionWith(operand.data(), result); + } + + if(reqType->xdtTypeMatches(operandType)) + return result; + + /* Test if promotion will solve it; the xdtTypeMatches didn't + * do that. */ + if(options.testFlag(AutomaticallyConvert) && promotionPossible(operandType, reqType, context)) + { + if(options.testFlag(GeneratePromotion)) + return Expression::Ptr(new UntypedAtomicConverter(result, reqType)); + else + return result; + } + + if(operandType->xdtTypeMatches(reqType)) + { + /* For example, operandType is numeric, and reqType is xs:integer. */ + return Expression::Ptr(new ItemVerifier(result, reqType, code)); + } + else + { + context->error(wrongType(context->namePool(), reqType, operandType), code, operand.data()); + return result; + } + } + else if(reqType->isNodeType()) + { + + ReportContext::ErrorCode myCode; + + if(*reqType == *CommonSequenceTypes::EBV->itemType()) + myCode = ReportContext::FORG0006; + else + myCode = code; + + /* empty-sequence() is considered valid because it's ok to do + * for example nilled( () ). That is, to pass an empty sequence to a + * function requiring for example node()?. */ + if(*operandType == *CommonSequenceTypes::Empty) + return result; + else if(!operandType->xdtTypeMatches(reqType)) + { + context->error(wrongType(context->namePool(), reqType, operandType), myCode, operand.data()); + return result; + } + + /* Operand must be an item. Thus, the sequence can contain both + * nodes and atomic values: we have to verify. */ + return Expression::Ptr(new ItemVerifier(result, reqType, myCode)); + } + else + { + Q_ASSERT(*reqType == *CommonSequenceTypes::Empty); + + /* element() doesn't match empty-sequence(), but element()* does. */ + if(!reqType->xdtTypeMatches(operandType) && + !operandSeqType->cardinality().allowsEmpty()) + { + context->error(wrongType(context->namePool(), reqType, operandType), + code, operand.data()); + return result; + } + } + + /* This line should be reached if required type is + * EBVType, and the operand is compatible. */ + return result; +} + +QT_END_NAMESPACE diff --git a/src/xmlpatterns/type/qtypechecker_p.h b/src/xmlpatterns/type/qtypechecker_p.h new file mode 100644 index 0000000..d9ca1a1 --- /dev/null +++ b/src/xmlpatterns/type/qtypechecker_p.h @@ -0,0 +1,185 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. + +#ifndef Patternist_TypeChecker_H +#define Patternist_TypeChecker_H + +#include "qstaticcontext_p.h" +#include "qexpression_p.h" + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +namespace QPatternist +{ + /** + * @short Contains functions that applies Function Conversion Rules and other + * kinds of compile-time type checking tasks. + * + * @ingroup Patternist_types + * @author Frans Englich <fenglich@trolltech.com> + */ + class TypeChecker + { + public: + enum Option + { + /** + * @short When set, the function conversion rules are applied. + * + * For instance, this is type promotion and conversions from @c + * xs:untypedAtomic to @c xs:date. This is done for function calls, + * but not when binding an expression to a variable. + */ + AutomaticallyConvert = 1, + + /** + * @short Whether the focus should be checked or not. + * + * Sometimes the focus is unknown at the time + * applyFunctionConversion() is called, and therefore it is + * of interest to post pone the check to later on. + */ + CheckFocus = 2, + + /** + * When applyFunctionConversion() is passed AutomaticallyConvert + * and promotion is required, such as from @c xs:integer to + * @c xs:float, there will be no conversion performed, with the + * assumption that the receiver will call Numeric::toFloat() or + * similar. + * + * However, when GeneratePromotion is set, code will be generated + * that performs this conversion regardless of what any receiver + * do. + * + * This is useful in the case where one Expression only pipes the + * result of another. The only known case of that as of this + * writing is when UserFunctionCallsite evaluates its body. + */ + GeneratePromotion + }; + typedef QFlags<Option> Options; + + /** + * @short Builds a pipeline of artificial AST nodes that ensures @p operand + * conforms to the type @p reqType by applying the Function + * Conversion Rules. + * + * This new Expression is returned, or, if no conversions were necessary, + * @p operand as it is. + * + * applyFunctionConversion() also performs various checks, such as if + * @p operand needs the focus and that the focus is defined in the + * @p context. These checks are largely guided by @p operand's + * Expression::properties(). + * + * @see <a href="http://www.w3.org/TR/xpath20/\#id-function-calls">XML Path + * Language (XPath) 2.0, 3.1.5 Function Calls</a>, more specifically the + * Function Conversion Rules + */ + static Expression::Ptr + applyFunctionConversion(const Expression::Ptr &operand, + const SequenceType::Ptr &reqType, + const StaticContext::Ptr &context, + const ReportContext::ErrorCode code = ReportContext::XPTY0004, + const Options = Options(AutomaticallyConvert | CheckFocus)); + private: + + static inline Expression::Ptr typeCheck(Expression *const op, + const StaticContext::Ptr &context, + const SequenceType::Ptr &reqType); + /** + * @short Implements the type checking and promotion part of the Function Conversion Rules. + */ + static Expression::Ptr verifyType(const Expression::Ptr &operand, + const SequenceType::Ptr &reqSeqType, + const StaticContext::Ptr &context, + const ReportContext::ErrorCode code, + const Options options); + + /** + * Determines whether type promotion is possible from one type to another. False + * is returned when a promotion is not possible or if a promotion is not needed(as when + * the types are identical), since that can be considered to not be type promotion. + * + * @returns @c true if @p fromType can be promoted to @p toType. + * @see <a href="http://www.w3.org/TR/xpath20/#promotion">XML Path Language + * (XPath) 2.0, B.1 Type Promotion</a> + */ + static bool promotionPossible(const ItemType::Ptr &fromType, + const ItemType::Ptr &toType, + const StaticContext::Ptr &context); + + /** + * @short Centralizes a message-string to reduce work for translators + * and increase consistency. + */ + static inline QString wrongType(const NamePool::Ptr &np, + const ItemType::Ptr &reqType, + const ItemType::Ptr &opType); + + /** + * No implementation is provided for this constructor. This class + * is not supposed to be instantiated. + */ + inline TypeChecker(); + + Q_DISABLE_COPY(TypeChecker) + }; +} + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif diff --git a/src/xmlpatterns/type/quntyped.cpp b/src/xmlpatterns/type/quntyped.cpp new file mode 100644 index 0000000..33042c1 --- /dev/null +++ b/src/xmlpatterns/type/quntyped.cpp @@ -0,0 +1,79 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qbuiltintypes_p.h" + +#include "quntyped_p.h" + +QT_BEGIN_NAMESPACE + +using namespace QPatternist; + +Untyped::Untyped() +{ +} + +SchemaType::Ptr Untyped::wxsSuperType() const +{ + return BuiltinTypes::xsAnyType; +} + +QXmlName Untyped::name(const NamePool::Ptr &np) const +{ + return np->allocateQName(StandardNamespaces::xs, QLatin1String("untyped")); +} + +ItemType::Ptr Untyped::atomizedType() const +{ + return BuiltinTypes::xsUntypedAtomic; +} + +SchemaType::TypeCategory Untyped::category() const +{ + return SchemaType::ComplexType; +} + +SchemaType::DerivationMethod Untyped::derivationMethod() const +{ + return NoDerivation; +} + +QT_END_NAMESPACE diff --git a/src/xmlpatterns/type/quntyped_p.h b/src/xmlpatterns/type/quntyped_p.h new file mode 100644 index 0000000..1b7f48b --- /dev/null +++ b/src/xmlpatterns/type/quntyped_p.h @@ -0,0 +1,112 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. + +#ifndef Patternist_Untyped_H +#define Patternist_Untyped_H + +#include "qanytype_p.h" + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +namespace QPatternist +{ + class AtomicType; + + /** + * @short Represents the complex W3C XML Schema type <tt>xs:untyped</tt>. + * + * @ingroup Patternist_types + * @author Frans Englich <fenglich@trolltech.com> + * @see <a href="http://www.w3.org/TR/xpath-datamodel/#types-predefined">XQuery 1.0 and XPath 2.0 + * Data Model, 2.6.2 Predefined Types</a> + */ + class Untyped : public AnyType + { + public: + + typedef QExplicitlySharedDataPointer<Untyped> Ptr; + + /** + * @returns always BuiltinTypes::xsAnyType. + */ + virtual SchemaType::Ptr wxsSuperType() const; + + virtual QXmlName name(const NamePool::Ptr &np) const; + + /** + * @returns always <tt>xs:untypedAtomic</tt> + */ + virtual ItemType::Ptr atomizedType() const; + + /** + * @returns always SchemaType::ComplexType + */ + virtual TypeCategory category() const; + + /** + * @returns always NoDerivation + */ + virtual DerivationMethod derivationMethod() const; + + protected: + friend class BuiltinTypes; + + Untyped(); + }; +} + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif diff --git a/src/xmlpatterns/type/qxsltnodetest.cpp b/src/xmlpatterns/type/qxsltnodetest.cpp new file mode 100644 index 0000000..1ec67bf --- /dev/null +++ b/src/xmlpatterns/type/qxsltnodetest.cpp @@ -0,0 +1,72 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qbuiltintypes_p.h" +#include "qxsltnodetest_p.h" + +QT_BEGIN_NAMESPACE + +using namespace QPatternist; + +bool XSLTNodeTest::xdtTypeMatches(const ItemType::Ptr &other) const +{ + if(!other->isNodeType()) + return false; + + return *static_cast<const XSLTNodeTest *>(other.data()) == *this + ? true + : xdtTypeMatches(other->xdtSuperType()); +} + +bool XSLTNodeTest::itemMatches(const Item &item) const +{ + Q_ASSERT(item); + + return item.isNode() && + item.asNode().kind() != QXmlNodeModelIndex::Document; +} + +ItemType::Ptr XSLTNodeTest::xdtSuperType() const +{ + return BuiltinTypes::node; +} + +QT_END_NAMESPACE diff --git a/src/xmlpatterns/type/qxsltnodetest_p.h b/src/xmlpatterns/type/qxsltnodetest_p.h new file mode 100644 index 0000000..1f75a88 --- /dev/null +++ b/src/xmlpatterns/type/qxsltnodetest_p.h @@ -0,0 +1,100 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. + +#ifndef Patternist_XSLTNodeTest_H +#define Patternist_XSLTNodeTest_H + +#include "qanynodetype_p.h" + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +namespace QPatternist +{ + + /** + * @short Represents @c node() in patterns in XSL-T, which + * are just like how @c node() usually is, except that it doesn't + * match document nodes. + * + * @see <a href="http://www.w3.org/TR/xslt20/#pattern-semantics">XSL + * Transformations (XSLT) Version 2.0, 5.5.3 The Meaning of a Pattern</a> + * @ingroup Patternist_types + * @author Frans Englich <fenglich@trolltech.com> + * @since 4.5 + */ + class XSLTNodeTest : public AnyNodeType + { + public: + virtual bool xdtTypeMatches(const ItemType::Ptr &other) const; + virtual bool itemMatches(const Item &item) const; + + virtual ItemType::Ptr xdtSuperType() const; + + protected: + friend class BuiltinTypes; + + /** + * This constructor does nothing, but exists in order to make it impossible to + * instantiate this class from anywhere but from BuiltinTypes. + */ + inline XSLTNodeTest() + { + } + }; +} + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif diff --git a/src/xmlpatterns/type/type.pri b/src/xmlpatterns/type/type.pri new file mode 100644 index 0000000..ef5976a --- /dev/null +++ b/src/xmlpatterns/type/type.pri @@ -0,0 +1,70 @@ +HEADERS += $$PWD/qabstractnodetest_p.h \ + $$PWD/qanyitemtype_p.h \ + $$PWD/qanynodetype_p.h \ + $$PWD/qanysimpletype_p.h \ + $$PWD/qanytype_p.h \ + $$PWD/qatomiccasterlocator_p.h \ + $$PWD/qatomiccasterlocators_p.h \ + $$PWD/qatomiccomparatorlocator_p.h \ + $$PWD/qatomiccomparatorlocators_p.h \ + $$PWD/qatomicmathematicianlocator_p.h \ + $$PWD/qatomicmathematicianlocators_p.h \ + $$PWD/qatomictypedispatch_p.h \ + $$PWD/qatomictype_p.h \ + $$PWD/qbasictypesfactory_p.h \ + $$PWD/qbuiltinatomictype_p.h \ + $$PWD/qbuiltinatomictypes_p.h \ + $$PWD/qbuiltinnodetype_p.h \ + $$PWD/qbuiltintypes_p.h \ + $$PWD/qcardinality_p.h \ + $$PWD/qcommonsequencetypes_p.h \ + $$PWD/qebvtype_p.h \ + $$PWD/qemptysequencetype_p.h \ + $$PWD/qgenericsequencetype_p.h \ + $$PWD/qitemtype_p.h \ + $$PWD/qlocalnametest_p.h \ + $$PWD/qmultiitemtype_p.h \ + $$PWD/qnamespacenametest_p.h \ + $$PWD/qnonetype_p.h \ + $$PWD/qnumerictype_p.h \ + $$PWD/qprimitives_p.h \ + $$PWD/qqnametest_p.h \ + $$PWD/qschemacomponent_p.h \ + $$PWD/qschematypefactory_p.h \ + $$PWD/qschematype_p.h \ + $$PWD/qsequencetype_p.h \ + $$PWD/qtypechecker_p.h \ + $$PWD/quntyped_p.h \ + $$PWD/qxsltnodetest_p.h + +SOURCES += $$PWD/qabstractnodetest.cpp \ + $$PWD/qanyitemtype.cpp \ + $$PWD/qanynodetype.cpp \ + $$PWD/qanysimpletype.cpp \ + $$PWD/qanytype.cpp \ + $$PWD/qatomiccasterlocator.cpp \ + $$PWD/qatomiccomparatorlocator.cpp \ + $$PWD/qatomicmathematicianlocator.cpp \ + $$PWD/qatomictype.cpp \ + $$PWD/qbasictypesfactory.cpp \ + $$PWD/qbuiltinatomictype.cpp \ + $$PWD/qbuiltinatomictypes.cpp \ + $$PWD/qcardinality.cpp \ + $$PWD/qcommonsequencetypes.cpp \ + $$PWD/qebvtype.cpp \ + $$PWD/qemptysequencetype.cpp \ + $$PWD/qgenericsequencetype.cpp \ + $$PWD/qitemtype.cpp \ + $$PWD/qlocalnametest.cpp \ + $$PWD/qmultiitemtype.cpp \ + $$PWD/qnamespacenametest.cpp \ + $$PWD/qnonetype.cpp \ + $$PWD/qnumerictype.cpp \ + $$PWD/qqnametest.cpp \ + $$PWD/qschemacomponent.cpp \ + $$PWD/qschematype.cpp \ + $$PWD/qschematypefactory.cpp \ + $$PWD/qsequencetype.cpp \ + $$PWD/qtypechecker.cpp \ + $$PWD/quntyped.cpp \ + $$PWD/qxsltnodetest.cpp |