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