/****************************************************************************
**
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
** All rights reserved.
** Contact: Nokia Corporation (qt-info@nokia.com)
**
** This file is part of the QtXmlPatterns module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** GNU Lesser General Public License Usage
** 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.1, 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.
**
** Other Usage
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
**
**
**
**
** $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 <frans.englich@nokia.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 <frans.englich@nokia.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 <frans.englich@nokia.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
