Skip to content

Commit

Permalink
Merge pull request #891 from Aurel300/issue/871
Browse files Browse the repository at this point in the history
Add keyValueIterator to arrays
  • Loading branch information
hughsando authored Apr 6, 2020
2 parents e2213b2 + 301f531 commit d32d80a
Show file tree
Hide file tree
Showing 8 changed files with 86 additions and 2 deletions.
1 change: 1 addition & 0 deletions Changes.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
4.0.19
------------------------------------------------------------

* Add Array.keyValueIterator
* General Utf16 string improvements
* Limit the amount of recursion in toString function
* Add float32 support to cppia
Expand Down
37 changes: 37 additions & 0 deletions include/Array.h
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,34 @@ class ArrayIterator : public cpp::FastIterator_obj<TO>
Array<FROM> mArray;
};

// --- ArrayKeyValueIterator -------------------------------------------
template<typename FROM,typename TO>
class ArrayKeyValueIterator : public cpp::FastIterator_obj<Dynamic>
{
public:
HX_IS_INSTANCE_OF enum { _hx_ClassId = hx::clsIdArrayIterator };

ArrayKeyValueIterator(Array<FROM> inArray) : mArray(inArray), mIdx(0) { }

bool hasNext() { return mIdx < mArray->length; }

inline TO toTo(const Dynamic &inD) { return inD.StaticCast<TO>(); }

template<typename T>
inline TO toTo(T inT) { return inT; }


Dynamic next();

void __Mark(hx::MarkContext *__inCtx) { HX_MARK_MEMBER_NAME(mArray,"mArray"); }
#ifdef HXCPP_VISIT_ALLOCS
void __Visit(hx::VisitContext *__inCtx) { HX_VISIT_MEMBER_NAME(mArray,"mArray"); }
#endif

int mIdx;
Array<FROM> mArray;
};

}

namespace hx
Expand Down Expand Up @@ -224,6 +252,7 @@ class HXCPP_EXTERN_CLASS_ATTRIBUTES ArrayBase : public ArrayCommon
virtual Dynamic __copy() = 0;
virtual Dynamic __insert(const Dynamic &a0,const Dynamic &a1) = 0;
virtual Dynamic __iterator() = 0;
virtual Dynamic __keyValueIterator() = 0;
virtual Dynamic __join(const Dynamic &a0) = 0;
virtual Dynamic __pop() = 0;
virtual Dynamic __push(const Dynamic &a0) = 0;
Expand Down Expand Up @@ -260,6 +289,7 @@ class HXCPP_EXTERN_CLASS_ATTRIBUTES ArrayBase : public ArrayCommon
virtual hx::ArrayBase *__copy() = 0;
virtual void __insert(int inIndex,const Dynamic &a1) = 0;
virtual Dynamic __iterator() = 0;
virtual Dynamic __keyValueIterator() = 0;
virtual ::String __join(::String a0) = 0;
virtual Dynamic __pop() = 0;
virtual int __push(const Dynamic &a0) = 0;
Expand Down Expand Up @@ -291,6 +321,7 @@ class HXCPP_EXTERN_CLASS_ATTRIBUTES ArrayBase : public ArrayCommon
Dynamic copy_dyn();
Dynamic insert_dyn();
Dynamic iterator_dyn();
Dynamic keyValueIterator_dyn();
Dynamic join_dyn();
Dynamic pop_dyn();
Dynamic push_dyn();
Expand Down Expand Up @@ -826,9 +857,13 @@ class Array_obj : public hx::ArrayBase
}

Dynamic iterator() { return new hx::ArrayIterator<ELEM_,ELEM_>(this); }
Dynamic keyValueIterator() { return new hx::ArrayKeyValueIterator<ELEM_,ELEM_>(this); }

template<typename TO>
Dynamic iteratorFast() { return new hx::ArrayIterator<ELEM_,TO>(this); }

template<typename TO>
Dynamic keyValueIteratorFast() { return new hx::ArrayKeyValueIterator<ELEM_,TO>(this); }

virtual hx::ArrayStore getStoreType() const
{
Expand All @@ -849,6 +884,7 @@ class Array_obj : public hx::ArrayBase
virtual Dynamic __copy() { return copy(); }
virtual Dynamic __insert(const Dynamic &a0,const Dynamic &a1) { insert(a0,a1); return null(); }
virtual Dynamic __iterator() { return iterator(); }
virtual Dynamic __keyValueIterator() { return keyValueIterator(); }
virtual Dynamic __join(const Dynamic &a0) { return join(a0); }
virtual Dynamic __pop() { return pop(); }
virtual Dynamic __push(const Dynamic &a0) { return push(a0);}
Expand All @@ -875,6 +911,7 @@ class Array_obj : public hx::ArrayBase
virtual hx::ArrayBase *__copy() { return copy().mPtr; }
virtual void __insert(int inIndex,const Dynamic &a1) { insert(inIndex,a1);}
virtual Dynamic __iterator() { return iterator(); }
virtual Dynamic __keyValueIterator() { return keyValueIterator(); }
virtual ::String __join(::String a0) { return join(a0); }
virtual Dynamic __pop() { return pop(); }
virtual int __push(const Dynamic &a0) { return push(a0);}
Expand Down
3 changes: 3 additions & 0 deletions include/cpp/VirtualArray.h
Original file line number Diff line number Diff line change
Expand Up @@ -510,6 +510,8 @@ class HXCPP_EXTERN_CLASS_ATTRIBUTES VirtualArray_obj : public hx::ArrayCommon
Dynamic iterator() { checkBase(); return !base ? getEmptyIterator() : base->__iterator(); }
static Dynamic getEmptyIterator();

Dynamic keyValueIterator() { checkBase(); return !base ? getEmptyIterator() : base->__keyValueIterator(); }

bool IsByteArray() const { checkBase(); return store!=hx::arrayEmpty && base->IsByteArray(); }

void zero(Dynamic inFirst, Dynamic inCount) { checkBase(); if (store!=hx::arrayEmpty) base->zero(inFirst,inCount); }
Expand Down Expand Up @@ -538,6 +540,7 @@ class HXCPP_EXTERN_CLASS_ATTRIBUTES VirtualArray_obj : public hx::ArrayCommon
Dynamic copy_dyn();
Dynamic insert_dyn();
Dynamic iterator_dyn();
Dynamic keyValueIterator_dyn();
Dynamic join_dyn();
Dynamic pop_dyn();
Dynamic push_dyn();
Expand Down
11 changes: 10 additions & 1 deletion include/hx/Operators.h
Original file line number Diff line number Diff line change
Expand Up @@ -431,7 +431,16 @@ Dynamic String::keyValueIterator()
return new hx::StringKeyValueIterator(*this);
}


namespace hx
{
template<typename FROM, typename TO> Dynamic hx::ArrayKeyValueIterator<FROM, TO>::next()
{
int p = mIdx++;
return
hx::AnonStruct2_obj< int,TO >::Create(HX_("key",9f,89,51,00),p,
HX_("value",71,7f,b8,31), toTo(mArray->__get(p)) );
}
}



Expand Down
5 changes: 5 additions & 0 deletions src/Array.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -615,6 +615,7 @@ DEFINE_ARRAY_FUNC1(return,resize);

DEFINE_ARRAY_FUNC1(return,concat);
DEFINE_ARRAY_FUNC0(return,iterator);
DEFINE_ARRAY_FUNC0(return,keyValueIterator);
DEFINE_ARRAY_FUNC1(return,join);
DEFINE_ARRAY_FUNC0(return,pop);
DEFINE_ARRAY_FUNC0(return,copy);
Expand Down Expand Up @@ -644,6 +645,7 @@ hx::Val ArrayBase::__Field(const String &inString, hx::PropertyAccess inCallProp
if (inString==HX_CSTRING("insert")) return insert_dyn();
if (inString==HX_CSTRING("copy")) return copy_dyn();
if (inString==HX_CSTRING("iterator")) return iterator_dyn();
if (inString==HX_CSTRING("keyValueIterator")) return keyValueIterator_dyn();
if (inString==HX_CSTRING("join")) return join_dyn();
if (inString==HX_CSTRING("pop")) return pop_dyn();
if (inString==HX_CSTRING("push")) return push_dyn();
Expand Down Expand Up @@ -681,6 +683,7 @@ static String sArrayFields[] = {
HX_CSTRING("concat"),
HX_CSTRING("insert"),
HX_CSTRING("iterator"),
HX_CSTRING("keyValueIterator"),
HX_CSTRING("join"),
HX_CSTRING("copy"),
HX_CSTRING("pop"),
Expand Down Expand Up @@ -804,6 +807,7 @@ Dynamic VirtualArray_obj::func##_dyn() { return new VirtualArray_##func(this);
DEFINE_VARRAY_FUNC1(return,concat);
DEFINE_VARRAY_FUNC2(,insert);
DEFINE_VARRAY_FUNC0(return,iterator);
DEFINE_VARRAY_FUNC0(return,keyValueIterator);
DEFINE_VARRAY_FUNC1(return,join);
DEFINE_VARRAY_FUNC0(return,pop);
DEFINE_VARRAY_FUNC0(return,copy);
Expand Down Expand Up @@ -877,6 +881,7 @@ hx::Val VirtualArray_obj::__Field(const String &inString, hx::PropertyAccess inC
if (inString==HX_CSTRING("insert")) return insert_dyn();
if (inString==HX_CSTRING("copy")) return copy_dyn();
if (inString==HX_CSTRING("iterator")) return iterator_dyn();
if (inString==HX_CSTRING("keyValueIterator")) return keyValueIterator_dyn();
if (inString==HX_CSTRING("join")) return join_dyn();
if (inString==HX_CSTRING("pop")) return pop_dyn();
if (inString==HX_CSTRING("push")) return push_dyn();
Expand Down
24 changes: 23 additions & 1 deletion src/hx/cppia/ArrayBuiltin.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ const char *gArrayFuncNames[] =
"afCopy",
"afInsert",
"afIterator",
"afKeyValueIterator",
"afJoin",
"afPop",
"afPush",
Expand Down Expand Up @@ -41,6 +42,7 @@ int gArrayArgCount[] =
0, //afCopy,
2, //afInsert,
0, //afIterator,
0, //afKeyValueIterator,
1, //afJoin,
0, //afPop,
1, //afPush,
Expand Down Expand Up @@ -804,6 +806,12 @@ struct ArrayBuiltin : public ArrayBuiltinBase
BCR_CHECK;
return thisVal->iterator().mPtr;
}
if (FUNC==afKeyValueIterator)
{
Array_obj<ELEM> *thisVal = (Array_obj<ELEM>*)thisExpr->runObject(ctx);
BCR_CHECK;
return thisVal->keyValueIterator().mPtr;
}

if (FUNC==afPush || FUNC==afContains || FUNC==afRemove || FUNC==afIndexOf || FUNC==afLastIndexOf)
return Dynamic(runInt(ctx)).mPtr;
Expand Down Expand Up @@ -1148,6 +1156,11 @@ struct ArrayBuiltin : public ArrayBuiltinBase
return inArray->iterator().mPtr;
}

static hx::Object *SLJIT_CALL runGetKeyValueIteratator( Array_obj<ELEM> *inArray )
{
return inArray->keyValueIterator().mPtr;
}

static void SLJIT_CALL runSetSizeExact( Array_obj<ELEM> *inArray, int size )
{
inArray->__SetSizeExact(size);
Expand Down Expand Up @@ -1702,13 +1715,20 @@ struct ArrayBuiltin : public ArrayBuiltinBase


// Array<ELEM>
case afIterator:
case afIterator:
{
thisExpr->genCode(compiler, sJitTemp0, etObject);
compiler->callNative( (void *)runGetIteratator, sJitTemp0.as(jtPointer) );
compiler->convertReturnReg(etObject, inDest, destType);
break;
}
case afKeyValueIterator:
{
thisExpr->genCode(compiler, sJitTemp0, etObject);
compiler->callNative( (void *)runGetKeyValueIteratator, sJitTemp0.as(jtPointer) );
compiler->convertReturnReg(etObject, inDest, destType);
break;
}

// Array<ELEM>
case afInsert:
Expand Down Expand Up @@ -2108,6 +2128,8 @@ CppiaExpr *createArrayBuiltin(CppiaExpr *src, ArrayType inType, CppiaExpr *inThi
return TCreateArrayBuiltin<afInsert,NoCrement>(src, inType, inThisExpr, ioExpressions);
if (field==HX_CSTRING("iterator"))
return TCreateArrayBuiltin<afIterator,NoCrement>(src, inType, inThisExpr, ioExpressions);
if (field==HX_CSTRING("keyValueIterator"))
return TCreateArrayBuiltin<afKeyValueIterator,NoCrement>(src, inType, inThisExpr, ioExpressions);
if (field==HX_CSTRING("join"))
return TCreateArrayBuiltin<afJoin,NoCrement>(src, inType, inThisExpr, ioExpressions);
if (field==HX_CSTRING("pop"))
Expand Down
6 changes: 6 additions & 0 deletions src/hx/cppia/ArrayVirtual.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -404,6 +404,10 @@ struct ArrayBuiltinAny : public ArrayBuiltinBase
{
return thisVal->CALL(iterator)().mPtr;
}
if (FUNC==afKeyValueIterator)
{
return thisVal->CALL(keyValueIterator)().mPtr;
}

return 0;
}
Expand Down Expand Up @@ -914,6 +918,8 @@ CppiaExpr *createArrayAnyBuiltin(CppiaExpr *src, CppiaExpr *inThisExpr, String f
return TCreateArrayAnyBuiltin<afInsert>(src, inThisExpr, ioExpressions);
if (field==HX_CSTRING("iterator"))
return TCreateArrayAnyBuiltin<afIterator>(src, inThisExpr, ioExpressions);
if (field==HX_CSTRING("keyValueIterator"))
return TCreateArrayAnyBuiltin<afKeyValueIterator>(src, inThisExpr, ioExpressions);
if (field==HX_CSTRING("join"))
return TCreateArrayAnyBuiltin<afJoin>(src, inThisExpr, ioExpressions);
if (field==HX_CSTRING("pop"))
Expand Down
1 change: 1 addition & 0 deletions src/hx/cppia/Cppia.h
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,7 @@ enum ArrayFunc
afCopy,
afInsert,
afIterator,
afKeyValueIterator,
afJoin,
afPop,
afPush,
Expand Down

0 comments on commit d32d80a

Please sign in to comment.