КонцепцияDesign by Contract, первоначально разработанная как частьЭйфелеваязыка Бертрана Мейера, вращается вокруг формулировкиконтрактамежду пользователем библиотеки и исполнителем, по которому от первого требуется соблюдение некоторыхпредварительных условийна значениях, пройденных при использовании методов библиотеки, и исполнитель гарантирует взамен, что определенные ограничения на результаты выполняются (постусловия), а также соблюдение определенных правил внутренней согласованности, называемыхинвариантами.. Эйфель изначально поддерживает три части контракта, только что описанные с помощью конструкций<require>,<ensure>и<invariant>соответственно.
C++ не пользуется прямой поддержкой методов Design by Contract: они обычно реализуются в виде кода утверждения, часто выключаемого в режиме выпуска по причинам производительности. Следуя этому подходу, Boost. MultiIndex предоставляет два различных режима отладки:
Безопасный, чтобыпрорвать переговорный процесс,
Пояснительная записка]]]]]]]][
Эти два режима независимы друг от друга и могут быть включены или выключены индивидуально. Важно отметить, что ошибки, обнаруженные в безопасном режиме, в принципе обусловлены неисправным кодом в программе пользователя, в то время как режим инвариантной проверки обнаруживает потенциальныевнутренниеошибки в реализации Boost. MultiIndex.Безопасный режимпроверяет предварительные условия на обращения в помещения библиотеки,
в режиме инвариантной проверкипроводятся проверки после исполнения, направленные на сохранение внутренней согласованности библиотеки.
These two modes are independent of each other and can be set on or off
individually. It is important to note that errors detected by safe mode are
due in principle to faulty code in the user's program, while
invariant-checking mode detects potential internal bugs in the
implementation of Boost.MultiIndex.
[ORIG_END] -->
Идея добавления предварительных условий проверки в STL в качестве отладочной помощи была впервые введена Кей С. Хорстманном в его. Безопасная библиотека STL, а затем принятаSTLport Debug Mode. Точно так же, буст. MultiIndex имеет так называемыйбезопасный режим, в котором проверяются всевозможные предварительные условия при работе с итераторами и функциями библиотеки.
Повышаю. Безопасный режим MultiIndex устанавливается путем глобального определения макроса<BOOST_MULTI_INDEX_ENABLE_SAFE_MODE>. Условия ошибок проверяются через макрос<BOOST_MULTI_INDEX_SAFE_MODE_ASSERT>, который по умолчанию разрешает вызов<BOOST_ASSERT>.
Если пользователь решает определить свою собственную версию<BOOST_MULTI_INDEX_SAFE_MODE_ASSERT>, он должен принять форму
где<expr>проверяется состояние и<error_code>является одним из значений<safe_mode::error_code>перечисления:
namespaceboost{namespacemulti_index{namespacesafe_mode{enumerror_code{invalid_iterator,// vg. default cted or pointing to erased elementnot_dereferenceable_iterator,// iterator is not dereferenceablenot_incrementable_iterator,// iterator points to end of sequencenot_decrementable_iterator,// iterator points to beginning of sequencenot_owner,// iterator does not belong to the containernot_same_owner,// iterators belong to different containersinvalid_range,// last not reachable from firstinside_range,// iterator lies within a range (and it mustn't)out_of_bounds,// move attempted beyond container limitssame_container// containers ought to be different};}// namespace multi_index::safe_mode}// namespace multi_index}// namespace boost
Например, следующая замена<BOOST_MULTI_INDEX_SAFE_MODE_ASSERT>делает исключение вместо утверждения:
#include<boost/multi_index_container/safe_mode_errors.hpp>structsafe_mode_exception{safe_mode_exception(boost::multi_index::safe_mode::error_codeerror_code):error_code(error_code){}boost::multi_index::safe_mode::error_codeerror_code;};#defineBOOST_MULTI_INDEX_SAFE_MODE_ASSERT(expr,error_code)\if(!(expr)){throwsafe_mode_exception(error_code);}// This has to go before the inclusion of any header from Boost.MultiIndex,
// except possibly safe_error_codes.hpp.
Другие поссибилиты, такие как вывод на бревно или запуск какого-либо предупреждения, также реализуемы.
Предупреждение:Безопасный режим добавляет очень важные накладные расходы на программу как с точки зрения используемого пространства, так и времени, поэтому в целом его не следует устанавливать для<NDEBUG>сборок. Кроме того, этот режим предназначен исключительно для отладки, и программы не должны полагаться на него как на часть их нормального потока выполнения: в частности, не гарантируется, что все возможные ошибки предварительного условия диагностируются или что проверки остаются стабильными в разных версиях библиотеки.
Итераторы, восстановленные из архива, не подлежат проверке в безопасном режиме. Это связано с тем, что невозможно автоматически узнать ассоциированный<multi_index_container>итератор только из информации о сериализации. Однако при желании восстановленный итератор можно преобразовать в проверенное значение, используя следующий обходной путь:
employee_setes;employee_set::nth_index<1>::iteratorit;// restore es and it from an archive arar>>es;ar>>it;// it won't benefit from safe mode checks
// Turn it into a checked value by providing Boost.MultiIndex
// with info about the associated container.
// This statement has virtually zero cost if safe mode is turned off.it=es.project<1>(it);
Так называемыйрежим инвариантной проверкиBoost. MultiIndex может быть установлен путем глобального определения макроса<BOOST_MULTI_INDEX_ENABLE_INVARIANT_CHECKING>. При таком режиме действуют все публичные функции Boost. MultiIndex будет проводить послеоперационные тесты, направленные на сохранение основных внутренних инвариантов управляемых структур данных.
Если инвариантный тест не срабатывает, увеличивайте. MultiIndex будет указывать на сбой с помощью унарного макроса<BOOST_MULTI_INDEX_INVARIANT_ASSERT>. Если пользователь не предоставляет определение для этого макроса, он по умолчанию соответствует<BOOST_ASSERT>. Любое утверждение такого рода должно рассматриваться в принципе как ошибка в библиотеке. Пожалуйста, сообщите об этих проблемах, а также как можно больше контекстной информации администратору библиотеки.
Рекомендуется пользователям Boost. MultiIndex всегда устанавливает режим инвариантной проверки в сборках отладки.
Статья Boost.MultiIndex Documentation - Tutorial -Debugging support раздела Boost.MultiIndex Documentation - Tutorial может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.