среда, 27 ноября 2024 г.

Boost, Reflection, Lib, C++14

Boost, Reflection, Lib, C++14

https://www.boost.org/doc/libs/1_86_0/libs/describe/doc/html/describe.html#example_hash_value

Overview

This library enables authors of user-defined types (enums, structs and classes) to describe their enumerators, base classes, data members and member functions. This information can later be queried by other code portions, possibly written by a different author, using the supplied primitives describe_enumeratorsdescribe_bases, and describe_members.

To learn how to describe enumeration types, see Describing Enumeration Types.

To learn how to describe class types, including structs, see Describing Class Types.

For examples how this functionality is useful, see Usage Examples.

The purpose of the library is to establish a standard way of providing these reflection abilities. Many existing libraries provide their own way of describing enums or classes, but without a standard, code written by different people cannot interoperate.

Eventually, one might hope for the primitives to end up in the C++ standard, with the compiler automatically supplying the metadata necessary to describe the types, making manual macro annotation unnecessary.

Эта библиотека позволяет авторам пользовательских типов (перечисления, структуры и классы) описывать свои перечислители, базовые классы, элементы данных и функции-члены. Эту информацию позже могут запрашивать другие части кода, возможно, написанные другим автором, используя предоставленные примитивы describe_enumerators, describe_bases и describe_members.

Чтобы узнать, как описывать типы перечислений, см. Описание типов перечислений.

Чтобы узнать, как описывать типы классов, включая структуры, см. Описание типов классов.

Примеры того, как эта функциональность полезна, см. Примеры использования.

Цель библиотеки — установить стандартный способ предоставления этих возможностей отражения. Многие существующие библиотеки предоставляют свой собственный способ описания перечислений или классов, но без стандарта код, написанный разными людьми, не сможет взаимодействовать.

В конечном итоге можно надеяться, что примитивы окажутся в стандарте C++, а компилятор автоматически предоставит метаданные, необходимые для описания типов, что сделает ручное аннотирование макросов ненужным.

Reflection, Enum

Describe: A C++14 Reflection Library

D:\VC24\Cpp\CppClassic\Ca_Boost_Enum_02\Ca_Boost_Enum_02.vcxproj

Boost, boost::hash_combine, VS, Project

Boost, boost::hash_combine, 

D:\VC24\Cpp\CppClassic\Ca_Hash_Boost_01\Ca_Hash_Boost_01.vcxproj

When using boost::hash_combine the order of the calls matters.

    std::size_t seed = 0;
    boost::hash_combine(seed, 1);
    boost::hash_combine(seed, 2);

results in a different seed to:

    std::size_t seed = 0;
    boost::hash_combine(seed, 2);
    boost::hash_combine(seed, 1);

If you are calculating a hash value for data where the order of the data doesn't matter in comparisons (e.g. a set) you will have to ensure that the data is always supplied in the same order.

понедельник, 23 сентября 2024 г.

Boost.Test

В библиотеке Boost.Test используются макросы для написания юнит-тестов на C++. Вот краткое описание каждого из указанных вами макросов:

1. BOOST_TEST_MODULE


Этот макрос определяет название модуля тестов. Его нужно объявить перед использованием других макросов тестирования. Обычно он указывается в начале файла, и его использование необходимо, чтобы корректно настроить окружение для тестирования.


Пример:


#define BOOST_TEST_MODULE MyTestModule

#include <boost/test/included/unit_test.hpp>


2. BOOST_AUTO_TEST_CASE


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


Пример:


BOOST_AUTO_TEST_CASE(test_addition) {

    BOOST_CHECK(1 + 1 == 2);

}


3. BOOST_AUTO_TEST_SUITE


Этот макрос используется для группировки нескольких тестов в один "свит" (suite). Это позволяет организовать тесты по логическим категориям и улучшает читаемость отчетов о выполнении тестов.


Пример:


BOOST_AUTO_TEST_SUITE(MathTests)


BOOST_AUTO_TEST_CASE(test_addition) {

    BOOST_CHECK(1 + 1 == 2);

}


BOOST_AUTO_TEST_CASE(test_subtraction) {

    BOOST_CHECK(5 - 3 == 2);

}


BOOST_AUTO_TEST_SUITE_END()  // Закрывает определение тестового свита


Полный пример


Вот пример того, как могут выглядеть тесты с использованием всех трех макросов:


#define BOOST_TEST_MODULE MyTestModule

#include <boost/test/included/unit_test.hpp>


BOOST_AUTO_TEST_SUITE(MathTests)


BOOST_AUTO_TEST_CASE(test_addition) {

    BOOST_CHECK(1 + 1 == 2);

}


BOOST_AUTO_TEST_CASE(test_subtraction) {

    BOOST_CHECK(5 - 3 == 2);

}


BOOST_AUTO_TEST_SUITE_END()


Заключение


Использование этих макросов позволяет легко и эффективно организовать и запускать тесты в вашем проекте. Boost.Test предоставляет богатый функционал, включая самую простую проверку условий, а также более сложные механизмы ассертов и управления тестами.

В библиотеке Boost.Test используются макросы для написания юнит-тестов на C++. Вот краткое описание каждого из указанных вами макросов:

1. BOOST_TEST_MODULE


Этот макрос определяет название модуля тестов. Его нужно объявить перед использованием других макросов тестирования. Обычно он указывается в начале файла, и его использование необходимо, чтобы корректно настроить окружение для тестирования.


Пример:


#define BOOST_TEST_MODULE MyTestModule

#include <boost/test/included/unit_test.hpp>


2. BOOST_AUTO_TEST_CASE


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


Пример:


BOOST_AUTO_TEST_CASE(test_addition) {

    BOOST_CHECK(1 + 1 == 2);

}


3. BOOST_AUTO_TEST_SUITE


Этот макрос используется для группировки нескольких тестов в один "свит" (suite). Это позволяет организовать тесты по логическим категориям и улучшает читаемость отчетов о выполнении тестов.


Пример:


BOOST_AUTO_TEST_SUITE(MathTests)


BOOST_AUTO_TEST_CASE(test_addition) {

    BOOST_CHECK(1 + 1 == 2);

}


BOOST_AUTO_TEST_CASE(test_subtraction) {

    BOOST_CHECK(5 - 3 == 2);

}


BOOST_AUTO_TEST_SUITE_END()  // Закрывает определение тестового свита


Полный пример


Вот пример того, как могут выглядеть тесты с использованием всех трех макросов:


#define BOOST_TEST_MODULE MyTestModule

#include <boost/test/included/unit_test.hpp>


BOOST_AUTO_TEST_SUITE(MathTests)


BOOST_AUTO_TEST_CASE(test_addition) {

    BOOST_CHECK(1 + 1 == 2);

}


BOOST_AUTO_TEST_CASE(test_subtraction) {

    BOOST_CHECK(5 - 3 == 2);

}


BOOST_AUTO_TEST_SUITE_END()


Заключение


Использование этих макросов позволяет легко и эффективно организовать и запускать тесты в вашем проекте. Boost.Test предоставляет богатый функционал, включая самую простую проверку условий, а также более сложные механизмы ассертов и управления тестами.

Да, библиотека Boost.Test является частью более широкой библиотеки Boost, которая представляет собой набор мощных и полезных библиотек для языка программирования C++. Boost предоставляет инструменты для работы с различными аспектами программирования, такими как работа со строками, многопоточностью, файловой системой, алгоритмами и многие другие.

Связь с Boost


    Часть Boost: Boost.Test — это одна из множества библиотек, входящих в пакет Boost. Она предназначена специально для юнит-тестирования C++ кода и предоставляет разработчикам удобные и мощные средства для написания, организации и запуска тестов.

    Совместимость: Использование Boost.Test требует наличия самой библиотеки Boost. Boost активно используется в индустрии, и многие разработчики предпочитают его для написания тестов из-за его богатого функционала и гибкости.

    Поддержка стандартов: Boost.Test поддерживает современные стандарты C++, что позволяет разработчикам использовать его вместе с другими стандартными и сторонними библиотеками без конфликтов.

    Функционал: Boost.Test предлагает множество возможностей, таких как поддержка различных уровней логирования, структуры тестов, проверки на наличие ошибок и многое другое, что делает её мощным инструментом для обеспечения качества кода.


Таким образом, Boost.Test является неотъемлемой частью экосистемы Boost, обеспечивая разработчиков необходимыми инструментами для эффективного тестирования их C++ приложений.

воскресенье, 22 сентября 2024 г.

NOMINMAX

#define NOMINMAX

Fibers

https://habr.com/ru/companies/piter/articles/491996/

#define NOMINMAX

#include <cstdlib>
#include <iostream>z
#include <memory>
#include <string>
#include <thread>

#include <boost/intrusive_ptr.hpp>

#include <boost/fiber/all.hpp>

inline
void fn( std::string const& str, int n) {
for ( int i = 0; i < n; ++i) {
std::cout << i << ": " << str << std::endl;
boost::this_fiber::yield();
}
}

int main() {
try {
boost::fibers::fiber f1( fn, "abc", 5);
std::cerr << "f1 : " << f1.get_id() << std::endl;
f1.join();
std::cout << "done." << std::endl;

return EXIT_SUCCESS;
} catch ( std::exception const& e) {
std::cerr << "exception: " << e.what() << std::endl;
} catch (...) {
std::cerr << "unhandled exception" << std::endl;
}
return EXIT_FAILURE;
}

Boost, Asio, Github

Boost, Asio, Github https://github.com/ru-cpp-tutorials/asio-tutorial/ https://github.com/freeacetone/BoostAsioBookRussian