Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Indexing support

Boost , Boost.Python Reference Manual , Chapter 8. Topics

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

Индексирование - это объект Боост Python для легкого экспорта индексируемых контейнеров C++ на Python. Указательные контейнеры - это контейнеры, которые допускают случайный доступ через оператор[] (например, std::vector).

В то время как Boost Python имеет все возможности, необходимые для размещения индексируемых контейнеров C++, таких как ubiquitous std::vector to Python, процедура не так проста, как мы хотели бы. Контейнеры Python не легко отображаются в контейнерах C++. Изоляционирование контейнеров Python на C++ (см. Справочное руководство по Python, Emulating container types) с использованием Boost.Python не является тривиальным. Есть много проблем, которые нужно рассмотреть, прежде чем мы сможем картировать контейнер C++ на Python. Они включают выполнение оберточных функций для методов __len__, __getitem__, __setitem__, __delitem__, __iter__ и __contains__.

Цели:

  • Делать индексируемые контейнеры C++ ведут себя точно так же, как можно ожидать, что контейнер Python будет вести себя.
  • Предоставьте исходную семантику по умолчанию для индексации контейнерных элементов (__getitem__), так что c[i] может быть смутным. Требование:

    val = c[i]c[3>i].m() val == ci 
    > <00>, где m не является мутным (мутным).

  • Возвращать безопасные ссылки из __getitem__ таким образом, что последующее добавление и удаление в контейнер и из него не приведет к разгадке ссылок (не будет крушению Python).
  • Поддерживать индексы срезов.
  • Принимать контейнерные аргументы Python (например, lists, tuples), где это уместно.
  • Разрешение на расширяемость посредством переопределенных классов политики.
  • Обеспечить предопределенную поддержку для наиболее распространенных STL и STL-подобных указательных контейнеров.

Класс indexing_suite является базовым классом для управления контейнерами C++, предназначенными для интеграции в Python. Цель состоит в том, чтобы сделать контейнер C++ выглядеть и чувствовать и вести себя точно так, как мы ожидаем контейнера Python. Класс автоматически обертывает эти специальные методы Python (полученные из ссылки на Python: Измерение типов контейнеров):

__len__(self)

Призван к реализации встроенной функции len(). Следует вернуть длину объекта, целое число >= 0. Кроме того, объект, который не определяет метод __nonzero__() и __len__() метод возвращает ноль считается ложным в контексте Boolean.

__getitem__(self, key)

Призваны к реализации оценки Себя[key]. Для типов последовательности допустимыми ключами должны быть целые числа и срезные объекты. Обратите внимание, что специальная интерпретация отрицательных индексов (если класс желает эмулировать тип последовательности) соответствует методу __getitem__(). Если ключ имеет неподходящий тип, TypeError может быть поднят; если значение за пределами набора индексов для последовательности (после какой-либо специальной интерпретации отрицательных значений), IndexError должен быть поднят. [Примечание: для петли ожидайте, что IndexError будет поднят для незаконных индексов, чтобы обеспечить надлежащее обнаружение конца последовательности.]

__setitem__(self, key, value)

Призван к выполнению задания на себя. __getitem__(). Это должно быть реализовано только для карт, если объекты поддерживают изменения в значениях для ключей, или если могут быть добавлены новые ключи, или для последовательностей, если элементы могут быть заменены. Такие же исключения должны быть сделаны для неправильных ключевых значений, как для метода __getitem__().

__delitem__(self, key)

Призывается к реализации удаления себя [ключа]. __getitem__(). Это должно быть реализовано только для карт, если объекты поддерживают удаление ключей или для последовательностей, если элементы могут быть удалены из последовательности. Такие же исключения должны быть сделаны для неправильных ключевых значений, как для метода __getitem__().

__iter__(self)

Этот метод называется, когда для контейнера требуется итератор. Этот метод должен вернуть новый итераторный объект, который может итерировать все объекты в контейнере. Для картирования он должен итерировать на клавишах контейнера, а также должен быть доступен в виде метода iterkeys().

Итераторные объекты также должны реализовать этот метод; они должны вернуться. Дополнительные сведения об итераторных объектах см. в разделе Типы генераторов в справке библиотеки Python.

__contains__(self, item)

Призваны к внедрению тестовых операторов членства. Если вещь в себе, ложная в противном случае. Для картирования объектов это должно учитывать ключи картирования, а не значения или пары ключевых элементов.

indexing_suite не предназначен для использования так, как есть. Пара политических функций должна быть поставлена подклассами indexing_suite. Тем не менее, будет представлен набор индексов_suite подклассов для стандартных индексируемых контейнеров STL, В большинстве случаев мы можем просто использовать доступные заранее определенные наборы. В некоторых случаях мы можем усовершенствовать предопределенные наборы для удовлетворения наших потребностей.

vector_indexing_suite класс является предопределенным индексирование_suite производный класс предназначен для упаковки std::vectorstd::vector-подобный [т.е. класс с std::vectorинтерфейс]. Он предоставляет всю политику, требуемую indexing_suite.

Пример использования:

class X {...};
...
class_<std::vector<X> >("XVec")
  .def(vector_indexing_suite<std::vector<X> >())
;

XVec теперь является полноценным контейнером Python (см. пример в полном объеме, вместе с тестом python).

map_indexing_suite класс является предопределенным индексинг_suite производный класс предназначен для обертывания std::mapstd::mapmap-подобный [i.e. класс с std::mapинтерфейс] Он предоставляет всю политику, требуемую indexing_suite.

Пример использования:

class X {...};
...
class_<std::map<X> >("XMap")
    .def(map_indexing_suite<std::map<X> >())
;

По умолчанию индексированные элементы возвращаются по прокси. Это может быть отключено, поставляя True в параметре шаблона NoProxy. XMap теперь является полноценным контейнером Python (см. пример в полном объеме, вместе с тестом python).

Параметры шаблона

Требования

Семантика

По умолчанию

Контейнер

Тип класса

Тип контейнера должен быть обернут на Python.

Выведенная политика

Подкласс индексации

Derived classes provide the policy hooks. See DerivedPolicies below.

NoProxy

Булеан

По умолчанию индексированные элементы имеют семантику ссылок на Python и возвращаются по прокси. Это может быть отключено, поставляя верно в параметре шаблона NoProxy.

ложные

NoSlice

Булеан

Не позволяйте щелкать.

ложные

Данные

Тип данных контейнера.

Контейнер:: value_type

Индекс

Тип индекса контейнера.

Контейнер::size_type

Ключ

Основной тип контейнера.

Контейнер:: value_type

template <class Container,
	  class DerivedPolicies,
	   bool NoProxy = false,
	   bool NoSlice = false,
	   class Data = typename Container::value_type,
	   class Index = typename Container::size_type,
	   class Key = typename Container::value_type>
class indexing_suite : unspecified
{
public:
  indexing_suite(); // default constructor
}

Выведенные классы обеспечивают крючки, необходимые для индексирования_suite:

data_type&
get_item(Container& container, index_type i);
static object
get_slice(Container& container, index_type from, index_type to);
static void
set_item(Container& container, index_type i, data_type const& v);
static void
set_slice(
    Container& container, index_type from,
    index_type to, data_type const& v
);
template <class Iter>
static void
set_slice(Container& container, index_type from,
    index_type to, Iter first, Iter last
);
static void
delete_item(Container& container, index_type i);
static void
delete_slice(Container& container, index_type from, index_type to);
static size_t
size(Container& container);
template <class T>
static bool
contains(Container& container, T const& val);
static index_type
convert_index(Container& container, PyObject* i);
static index_type
adjust_index(index_type current, index_type from,
    index_type to, size_type len);

Большинство этих стратегий являются самообъяснительными. Однако, Convert_index и adapt_index заслуживают некоторых объяснений.

convert_index преобразует индекс Python в индекс C++, который может обрабатываться контейнером. Например, отрицательные индексы на Python, по конвенции, начинают считать справа (например, C1 индексирует самый правильный элемент в C). Convert_index должен обрабатывать необходимое преобразование для C++ контейнера (например, конвертировать -1 в C.size()-1). Convert_index также должен быть в состоянии конвертировать тип индекса (динамический тип Python) в фактический тип, который ожидает контейнер C++.

Когда контейнер расширяется или заключает контракты, удерживаемые индексы к его элементам должны быть скорректированы с учетом перемещения данных. Например, если мы стерем 3 элемента, начиная с индекса 0 из вектора 5 элементов, то, что раньше было в индексе 4, теперь будет у индекса 1:

[a][b][c][d][e] ---> [d][e]
              ^           ^
              4           1

adjusted_index заботится о корректировке. Учитывая текущий индекс, функция должна возвращать скорректированный индекс, когда данные в контейнере по индексу от..to заменяются len элементами.

Параметры шаблона

Требования

Семантика

По умолчанию

Контейнер

Тип класса

Тип контейнера должен быть обернут на Python.

NoProxy

Булеан

По умолчанию индексированные элементы имеют семантику ссылок на Python и возвращаются по прокси. Это может быть отключено, поставляя верно в параметре шаблона NoProxy.

ложные

Выведенная политика

Подкласс индексации

Вектор_индексинг_suite все еще может быть получен для дальнейшего изменения любой из предопределенных политик. Статический полиморфизм через CRTP (James Coplien). Curiously Recurring Template Pattern (англ.). C++ Report, Feb. 1995) позволяет классу базовых индексов называть программную функцию наиболее производного класса

template <class Container,
	  bool NoProxy = false,
          class DerivedPolicies = unspecified_default>
class vector_indexing_suite : unspecified_base
{
public:
    typedef typename Container::value_type data_type;
    typedef typename Container::value_type key_type;
    typedef typename Container::size_type index_type;
    typedef typename Container::size_type size_type;
    typedef typename Container::difference_type difference_type;
    data_type&
    get_item(Container& container, index_type i);
    static object
    get_slice(Container& container, index_type from, index_type to);
    static void
    set_item(Container& container, index_type i, data_type const& v);
    static void
    set_slice(Container& container, index_type from,
        index_type to, data_type const& v);
    template <class Iter>
    static void
    set_slice(Container& container, index_type from,
        index_type to, Iter first, Iter last);
    static void
    delete_item(Container& container, index_type i);
    static void
    delete_slice(Container& container, index_type from, index_type to);
    static size_t
    size(Container& container);
    static bool
    contains(Container& container, key_type const& key);
    static index_type
    convert_index(Container& container, PyObject* i);
    static index_type
    adjust_index(index_type current, index_type from,
        index_type to, size_type len);
};

Параметры шаблона

Требования

Семантика

По умолчанию

Контейнер

Тип класса

Тип контейнера должен быть обернут на Python.

NoProxy

Булеан

По умолчанию индексированные элементы имеют семантику ссылок на Python и возвращаются по прокси. Это может быть отключено, поставляя верно в параметре шаблона NoProxy.

ложные

Выведенная политика

Подкласс индексации

Вектор_индексинг_suite все еще может быть получен для дальнейшего изменения любой из предопределенных политик. Статический полиморфизм через CRTP (James Coplien). Curiously Recurring Template Pattern (англ.). C++ Report, Feb. 1995) позволяет классу базовых индексов называть программную функцию наиболее производного класса

template <class Container,
          bool NoProxy = false,
          class DerivedPolicies = unspecified_default>
class map_indexing_suite : unspecified_base
{
public:
    typedef typename Container::value_type value_type;
    typedef typename Container::value_type::second_type data_type;
    typedef typename Container::key_type key_type;
    typedef typename Container::key_type index_type;
    typedef typename Container::size_type size_type;
    typedef typename Container::difference_type difference_type;
    static data_type&
    get_item(Container& container, index_type i);
    static void
    set_item(Container& container, index_type i, data_type const& v);
    static void
    delete_item(Container& container, index_type i);
    static size_t
    size(Container& container);
    static bool
    contains(Container& container, key_type const& key);
    static bool
    compare_index(Container& container, index_type a, index_type b);
    static index_type
    convert_index(Container& container, PyObject* i);
};

PrevUpHomeNext

Статья Indexing support раздела Boost.Python Reference Manual Chapter 8. Topics может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Chapter 8. Topics ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 22:24:18/0.012634992599487/1