![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Indexing supportBoost , Boost.Python Reference Manual , Chapter 8. Topics
|
Параметры шаблона |
Требования |
Семантика |
По умолчанию |
---|---|---|---|
Контейнер |
Тип класса |
Тип контейнера должен быть обернут на 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); };
Статья Indexing support раздела Boost.Python Reference Manual Chapter 8. Topics может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: Chapter 8. Topics ::
реклама |