mirror of
https://github.com/boostorg/python.git
synced 2026-01-22 17:32:55 +00:00
Compare commits
4 Commits
boost-1.31
...
svn-branch
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
50385a46c4 | ||
|
|
3d8b4ffa15 | ||
|
|
78344bf0b8 | ||
|
|
486fff38c2 |
@@ -83,9 +83,9 @@
|
||||
interface applies to <code>array</code> instances as well.</p>
|
||||
|
||||
<p><a name="default_search"></a>The default behavior is to use
|
||||
<code>Numeric.ArrayType</code> as the associated Python type if the
|
||||
<code>Numeric</code> module is installed in the default location.
|
||||
Otherwise it falls back to use <code>numarray.NDArray</code>. If neither
|
||||
<code>numarray.NDArray</code> as the associated Python type if the
|
||||
<code>numarray</code> module is installed in the default location.
|
||||
Otherwise it falls back to use <code>Numeric.ArrayType</code>. If neither
|
||||
extension module is installed, conversions to arguments of type
|
||||
<code>numeric::array</code> will cause overload resolution to reject the
|
||||
overload, and other attempted uses of <code>numeric::array</code> will <a
|
||||
|
||||
@@ -570,15 +570,40 @@ namespace boost { namespace python { namespace detail {
|
||||
base_get_slice_data(
|
||||
Container& container, PySliceObject* slice, Index& from, Index& to)
|
||||
{
|
||||
if (Py_None != slice->step) {
|
||||
PyErr_SetString( PyExc_IndexError, "slice step size not supported.");
|
||||
throw_error_already_set();
|
||||
}
|
||||
|
||||
Index min_index = DerivedPolicies::get_min_index(container);
|
||||
Index max_index = DerivedPolicies::get_max_index(container);
|
||||
|
||||
|
||||
if (Py_None == slice->start)
|
||||
from = DerivedPolicies::get_min_index(container);
|
||||
else
|
||||
from = DerivedPolicies::convert_index(container, slice->start);
|
||||
from = min_index;
|
||||
else {
|
||||
from = extract<long>( slice->start);
|
||||
if (from < 0) // Negative slice index
|
||||
from += max_index;
|
||||
if (from < 0) // Clip lower bounds to zero
|
||||
from = 0;
|
||||
if (from > max_index) // Clip upper bounds to max_index.
|
||||
from = max_index;
|
||||
|
||||
}
|
||||
|
||||
if (Py_None == slice->stop)
|
||||
to = DerivedPolicies::get_max_index(container);
|
||||
else
|
||||
to = DerivedPolicies::convert_index(container, slice->stop);
|
||||
else {
|
||||
to = extract<long>( slice->stop);
|
||||
if (to < 0)
|
||||
to += max_index;
|
||||
if (to < 0)
|
||||
to = 0;
|
||||
if (to > max_index)
|
||||
to = max_index;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static void
|
||||
|
||||
@@ -81,6 +81,8 @@ namespace boost { namespace python {
|
||||
static object
|
||||
get_slice(Container& container, index_type from, index_type to)
|
||||
{
|
||||
if (from > to)
|
||||
return object(Container());
|
||||
return object(Container(container.begin()+from, container.begin()+to));
|
||||
}
|
||||
|
||||
@@ -94,8 +96,13 @@ namespace boost { namespace python {
|
||||
set_slice(Container& container, index_type from,
|
||||
index_type to, data_type const& v)
|
||||
{
|
||||
container.erase(container.begin()+from, container.begin()+to);
|
||||
container.insert(container.begin()+from, v);
|
||||
if (from > to) {
|
||||
return;
|
||||
}
|
||||
else {
|
||||
container.erase(container.begin()+from, container.begin()+to);
|
||||
container.insert(container.begin()+from, v);
|
||||
}
|
||||
}
|
||||
|
||||
template <class Iter>
|
||||
@@ -103,8 +110,13 @@ namespace boost { namespace python {
|
||||
set_slice(Container& container, index_type from,
|
||||
index_type to, Iter first, Iter last)
|
||||
{
|
||||
container.erase(container.begin()+from, container.begin()+to);
|
||||
container.insert(container.begin()+from, first, last);
|
||||
if (from > to) {
|
||||
container.insert(container.begin()+from, first, last);
|
||||
}
|
||||
else {
|
||||
container.erase(container.begin()+from, container.begin()+to);
|
||||
container.insert(container.begin()+from, first, last);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -116,6 +128,10 @@ namespace boost { namespace python {
|
||||
static void
|
||||
delete_slice(Container& container, index_type from, index_type to)
|
||||
{
|
||||
if (from > to) {
|
||||
// A null-op.
|
||||
return;
|
||||
}
|
||||
container.erase(container.begin()+from, container.begin()+to);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user