1 /****************************************************************************
2 **
3 ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
4 ** Contact: http://www.qt-project.org/legal
5 **
6 ** This file is part of the Qt Solutions component.
7 **
8 ** $QT_BEGIN_LICENSE:BSD$
9 ** You may use this file under the terms of the BSD license as follows:
10 **
11 ** "Redistribution and use in source and binary forms, with or without
12 ** modification, are permitted provided that the following conditions are
13 ** met:
14 **   * Redistributions of source code must retain the above copyright
15 **     notice, this list of conditions and the following disclaimer.
16 **   * Redistributions in binary form must reproduce the above copyright
17 **     notice, this list of conditions and the following disclaimer in
18 **     the documentation and/or other materials provided with the
19 **     distribution.
20 **   * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names
21 **     of its contributors may be used to endorse or promote products derived
22 **     from this software without specific prior written permission.
23 **
24 **
25 ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26 ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27 ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
28 ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
29 ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
30 ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
31 ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32 ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33 ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34 ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35 ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
36 **
37 ** $QT_END_LICENSE$
38 **
39 ****************************************************************************/
40 
41 
42 #ifndef QSCRIPTEXTENUMERATION_P_H
43 #define QSCRIPTEXTENUMERATION_P_H
44 
45 //
46 //  W A R N I N G
47 //  -------------
48 //
49 // This file is not part of the Qt API.  It exists purely as an
50 // implementation detail.  This header file may change from version to
51 // version without notice, or even be removed.
52 //
53 // We mean it.
54 //
55 
56 #include "qscriptecmacore_p.h"
57 
58 QT_BEGIN_NAMESPACE
59 
60 
61 class QScriptValueIteratorImpl;
62 
63 namespace QScript { namespace Ext {
64 
65 class EnumerationClassData: public QScriptClassData
66 {
67     QScriptClassInfo *m_classInfo;
68 
69 public:
70     EnumerationClassData(QScriptClassInfo *classInfo);
71     virtual ~EnumerationClassData();
72 
classInfo()73     inline QScriptClassInfo *classInfo() const
74         { return m_classInfo; }
75 
76     virtual void mark(const QScriptValueImpl &object, int generation);
77 };
78 
79 class Enumeration: public QScript::Ecma::Core
80 {
81 public:
82     Enumeration(QScriptEnginePrivate *engine);
83     virtual ~Enumeration();
84 
85     virtual void execute(QScriptContextPrivate *context);
86 
87     class Instance: public QScriptObjectData {
88     public:
Instance()89         Instance() : it(0) {}
90         virtual ~Instance();
91 
92         static Instance *get(const QScriptValueImpl &object,
93                              QScriptClassInfo *klass);
94 
95         void toFront();
96         void hasNext(QScriptContextPrivate *context, QScriptValueImpl *result);
97         void next(QScriptContextPrivate *context, QScriptValueImpl *result);
98 
99     public: // attributes
100         QScriptValueIteratorImpl *it;
101         QScriptValueImpl object;
102     };
103 
104     void newEnumeration(QScriptValueImpl *result, const QScriptValueImpl &value);
105 
get(const QScriptValueImpl & object)106     inline Instance *get(const QScriptValueImpl &object) const
107     {
108         return Instance::get(object, classInfo());
109     }
110 
111 protected:
112     static QScriptValueImpl method_toFront(QScriptContextPrivate *context, QScriptEnginePrivate *eng,
113                                            QScriptClassInfo *classInfo);
114     static QScriptValueImpl method_hasNext(QScriptContextPrivate *context, QScriptEnginePrivate *eng,
115                                            QScriptClassInfo *classInfo);
116     static QScriptValueImpl method_next(QScriptContextPrivate *context, QScriptEnginePrivate *eng,
117                                         QScriptClassInfo *classInfo);
118 };
119 
120 } } // namespace QScript::Ext
121 
122 QT_END_NAMESPACE
123 
124 #endif
125