// ========================================================================== // This software is subject to the provisions of the Zope Public License, // Version 2.0 (ZPL). A copy of the ZPL should accompany this distribution. // THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED // WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS // FOR A PARTICULAR PURPOSE. // ========================================================================== using System; using System.Collections; namespace Python.Runtime { /// /// Represents a generic Python sequence. The methods of this class are /// equivalent to the Python "abstract sequence API". See /// http://www.python.org/doc/current/api/sequence.html for details. /// public class PySequence : PyObject, IEnumerable { protected PySequence(IntPtr ptr) : base(ptr) {} protected PySequence() : base() {} /// /// IsSequenceType Method /// /// /// /// Returns true if the given object implements the sequence protocol. /// public static bool IsSequenceType(PyObject value) { return Runtime.PySequence_Check(value.obj); } /// /// GetSlice Method /// /// /// /// Return the slice of the sequence with the given indices. /// public PyObject GetSlice(int i1, int i2) { IntPtr op = Runtime.PySequence_GetSlice(obj, i1, i2); if (op == IntPtr.Zero) { throw new PythonException(); } return new PyObject(op); } /// /// SetSlice Method /// /// /// /// Sets the slice of the sequence with the given indices. /// public void SetSlice(int i1, int i2, PyObject v) { int r = Runtime.PySequence_SetSlice(obj, i1, i2, v.obj); if (r < 0) { throw new PythonException(); } } /// /// DelSlice Method /// /// /// /// Deletes the slice of the sequence with the given indices. /// public void DelSlice(int i1, int i2) { int r = Runtime.PySequence_DelSlice(obj, i1, i2); if (r < 0) { throw new PythonException(); } } /// /// Index Method /// /// /// /// Return the index of the given item in the sequence, or -1 if /// the item does not appear in the sequence. /// public int Index(PyObject item) { int r = Runtime.PySequence_Index(obj, item.obj); if (r < 0) { Runtime.PyErr_Clear(); return -1; } return r; } /// /// Contains Method /// /// /// /// Return true if the sequence contains the given item. This method /// throws a PythonException if an error occurs during the check. /// public bool Contains(PyObject item) { int r = Runtime.PySequence_Contains(obj, item.obj); if (r < 0) { throw new PythonException(); } return (r != 0); } /// /// Concat Method /// /// /// /// Return the concatenation of the sequence object with the passed in /// sequence object. /// public PyObject Concat(PyObject other) { IntPtr op = Runtime.PySequence_Concat(obj, other.obj); if (op == IntPtr.Zero) { throw new PythonException(); } return new PyObject(op); } /// /// Repeat Method /// /// /// /// Return the sequence object repeated N times. This is equivalent /// to the Python expression "object * count". /// public PyObject Repeat(int count) { IntPtr op = Runtime.PySequence_Repeat(obj, count); if (op == IntPtr.Zero) { throw new PythonException(); } return new PyObject(op); } #region IEnumerable Members public IEnumerator GetEnumerator() { return new PyIter(this); } #endregion } }