/// <summary> /// Retrieves a value being pointed by an array intrinsic enumerator. /// </summary> /// <param name="array">The array which current value to return.</param> /// <returns><b>False</b>, if the intrinsic enumerator is behind the last item of <paramref name="array"/>, /// otherwise the value being pointed by the enumerator (beware of values which are <b>false</b>!).</returns> /// <remarks>The value returned is dereferenced.</remarks> public static PhpValue current(IPhpEnumerable array) { if (array == null) { //PhpException.ReferenceNull("array"); //return null; throw new ArgumentNullException(); } if (array.IntrinsicEnumerator.AtEnd) return PhpValue.False; // TODO: dereferences result since enumerator doesn't do so: return array.IntrinsicEnumerator.CurrentValue; }
public EnumerableIteratorEntry(IPhpEnumerable/*!*/obj) { Debug.Assert(obj != null); this.isValid = false; this.enumerator = null; this.currentKey = this.currentValue = null; this.obj = obj; }
/// <summary> /// Retrieves the current entry and advances array intrinsic enumerator one item forward. /// </summary> /// <param name="array">The array which entry get and which intrinsic enumerator to advance.</param> /// <returns> /// The instance of <see cref="PhpArray"/>(0 => key, 1 => value, "key" => key, "value" => value) /// where key and value are pointed by the enumerator before it is advanced /// or <b>false</b> if the enumerator has been behind the last item of <paramref name="array"/> /// before the call. /// </returns> //[return: CastToFalse, PhpDeepCopy] public static PhpArray each(IPhpEnumerable array) { if (array == null) { //PhpException.ReferenceNull("array"); return null; } if (array.IntrinsicEnumerator.AtEnd) return null; var entry = array.IntrinsicEnumerator.Current; array.IntrinsicEnumerator.MoveNext(); // dereferences result since enumerator doesn't do so: var key = entry.Key; var value = entry.Value; // PhpVariable.Dereference(entry.Value); // creates the resulting array: PhpArray result = new PhpArray(2); result.Add(1, value); result.Add("value", value); result.Add(0, key); result.Add("key", key); // keys and values should be inplace deeply copied: // TODO: result.InplaceCopyOnReturn = true; return result; }
/// <summary> /// Moves array intrinsic enumerator so it will point to the first item of the array. /// </summary> /// <param name="array">The array which intrinsic enumerator to move.</param> /// <returns>The first value in the <paramref name="array"/> or <b>false</b> if <paramref name="array"/> /// is empty.</returns> /// <remarks>The value returned is dereferenced.</remarks> public static PhpValue reset(IPhpEnumerable array) { if (array == null) { //PhpException.ReferenceNull("array"); return PhpValue.Null; } // moves to the last item and returns false if there is no such item: // TODO: dereferences result since enumerator doesn't do so: return (array.IntrinsicEnumerator.MoveFirst()) ? array.IntrinsicEnumerator.CurrentValue : PhpValue.False; }
/// <summary> /// Moves array intrinsic enumerator one item backward. /// </summary> /// <param name="array">The array which intrinsic enumerator to move.</param> /// <returns> /// The value being pointed by the enumerator after it has been moved /// or <b>false</b> if the enumerator has moved before the first item of <paramref name="array"/>. /// </returns> /// <remarks>The value returned is dereferenced.</remarks> public static PhpValue prev(IPhpEnumerable array) { if (array == null) { //PhpException.ReferenceNull("array"); //return null; throw new ArgumentNullException(); } // moves to the previous item and returns false if there is no such item: // TODO: dereferences result since enumerator doesn't do so: return (array.IntrinsicEnumerator.MovePrevious()) ? array.IntrinsicEnumerator.CurrentValue : PhpValue.False; }
/// <summary> /// Retrieves a key being pointed by an array intrinsic enumerator. /// </summary> /// <param name="array">The array which current key to return.</param> /// <returns> /// <b>Null</b>, if the intrinsic enumerator is behind the last item of <paramref name="array"/>, /// otherwise the key being pointed by the enumerator. /// </returns> public static PhpValue key(IPhpEnumerable array) { if (array == null) { //PhpException.ReferenceNull("array"); //return null; throw new ArgumentNullException(); } if (array.IntrinsicEnumerator.AtEnd) return PhpValue.Null; // note, key can't be of type PhpReference, hence no dereferencing follows: return array.IntrinsicEnumerator.CurrentKey.GetValue(); }
/// <summary> /// Retrieves a value being pointed by an array intrinsic enumerator. /// </summary> /// <param name="array">The array which current value to return.</param> /// <returns> /// <b>False</b> if the intrinsic enumerator is behind the last item of <paramref name="array"/>, /// otherwise the value being pointed by the enumerator (beware of values which are <b>false</b>!). /// </returns> /// <remarks> /// Alias of <see cref="current"/>. The value returned is dereferenced. /// </remarks> public static object pos(IPhpEnumerable array) => current(array);