forked from LeenkxTeam/LNXSDK
		
	
		
			
	
	
		
			109 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			109 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|  | #ifndef INCLUDED_cpp_FastIterator
 | ||
|  | #define INCLUDED_cpp_FastIterator
 | ||
|  | 
 | ||
|  | namespace cpp | ||
|  | { | ||
|  | 
 | ||
|  | class HXCPP_EXTERN_CLASS_ATTRIBUTES IteratorBase : public hx::Object | ||
|  | { | ||
|  | public: | ||
|  |    hx::Val __Field(const String &inString ,hx::PropertyAccess inCallProp); | ||
|  |    virtual bool hasNext() = 0; | ||
|  |    virtual Dynamic _dynamicNext() = 0; | ||
|  | 
 | ||
|  |    Dynamic hasNext_dyn( ); | ||
|  |    Dynamic next_dyn( ); | ||
|  |    Dynamic _dynamicNext_dyn( ); | ||
|  | }; | ||
|  | 
 | ||
|  | 
 | ||
|  | template<typename T> | ||
|  | class HXCPP_EXTERN_CLASS_ATTRIBUTES FastIterator_obj : public IteratorBase | ||
|  | { | ||
|  | public: | ||
|  |    virtual bool hasNext() = 0; | ||
|  |    virtual T next() = 0; | ||
|  | 
 | ||
|  |    virtual Dynamic _dynamicNext() { return next(); } | ||
|  | }; | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | template<typename T> | ||
|  | class HXCPP_EXTERN_CLASS_ATTRIBUTES DynamicIterator : public FastIterator_obj<T> | ||
|  | { | ||
|  | public: | ||
|  |    Dynamic mNext; | ||
|  |    Dynamic mHasNext; | ||
|  | 
 | ||
|  |    DynamicIterator(Dynamic inValue) | ||
|  |    { | ||
|  |       mNext = inValue->__Field(HX_CSTRING("next"), HX_PROP_ALWAYS); | ||
|  |       mHasNext = inValue->__Field(HX_CSTRING("hasNext"), HX_PROP_ALWAYS); | ||
|  |    } | ||
|  | 
 | ||
|  |    bool hasNext() { return mHasNext(); } | ||
|  |    T next() { return mNext(); } | ||
|  | 
 | ||
|  |    void __Mark(hx::MarkContext *__inCtx) | ||
|  |    { | ||
|  |       HX_MARK_MEMBER_NAME(mNext,"mNext"); | ||
|  |       HX_MARK_MEMBER_NAME(mHasNext,"mHasNext"); | ||
|  |    } | ||
|  | 
 | ||
|  |    #ifdef HXCPP_VISIT_ALLOCS
 | ||
|  |    void __Visit(hx::VisitContext *__inCtx) | ||
|  |    { | ||
|  |       HX_VISIT_MEMBER_NAME(mNext,"mNext"); | ||
|  |       HX_VISIT_MEMBER_NAME(mHasNext,"mHasNext"); | ||
|  |    } | ||
|  |    #endif
 | ||
|  | 
 | ||
|  | }; | ||
|  | 
 | ||
|  | 
 | ||
|  | template<typename T> | ||
|  | FastIterator_obj<T> *CreateFastIterator(Dynamic inValue) | ||
|  | { | ||
|  |    FastIterator_obj<T> *result = dynamic_cast< FastIterator_obj<T> *>(inValue.GetPtr()); | ||
|  |    if (result) return result; | ||
|  |    return new DynamicIterator<T>(inValue); | ||
|  | } | ||
|  | 
 | ||
|  | template<typename T> | ||
|  | class HXCPP_EXTERN_CLASS_ATTRIBUTES StringIterator : public cpp::FastIterator_obj<T> | ||
|  | { | ||
|  | public: | ||
|  |    String value; | ||
|  |    int    pos; | ||
|  | 
 | ||
|  |    StringIterator(const String &inValue) : value(inValue), pos(0) { } | ||
|  | 
 | ||
|  |    bool hasNext() { return pos<value.length; } | ||
|  |    void __Mark(hx::MarkContext *__inCtx) | ||
|  |    { | ||
|  |       cpp::FastIterator_obj<T>::__Mark(__inCtx); | ||
|  |       HX_MARK_MEMBER_NAME(value,"value"); | ||
|  |    } | ||
|  | 
 | ||
|  |    #ifdef HXCPP_VISIT_ALLOCS
 | ||
|  |    void __Visit(hx::VisitContext *__inCtx) | ||
|  |    { | ||
|  |       cpp::FastIterator_obj<T>::__Visit(__inCtx); | ||
|  |       HX_VISIT_MEMBER_NAME(value,"value"); | ||
|  |    } | ||
|  |    #endif
 | ||
|  | }; | ||
|  | 
 | ||
|  | } | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | #endif
 |