Pull to refresh
3
Дамир@X-Ray_3D

Пользователь

Send message

Я себе смену "геометрического" ядра навайбкодил в GGEasy)))

У меня при переезде с boost::pfr на рефлексию библиотека де/сереализации xml в ~2.5 раза быстрее собирается и на ~15% производительнее. На форке p2996, GCC 16.2 не проверял пока.

Пишите проще))) Нечего константэвалюатор фронтенда лишней работой (constexpr auto& member : auto(members)) нагружать и код ненужными пространствами имён заполонять, когда meta::info в первую очередь само из своего пространства ищет.

struct enum_class_annotation {
    const char* annotation;
    consteval enum_class_annotation(std::string_view str)
        : annotation{std::define_static_string(str)} { }
};

enum class distribution_name : std::uint8_t {
    alt[[= enum_class_annotation{"Alt linux"}]],
    arch[[ = enum_class_annotation{"Arch linux"}, = enum_class_annotation{"Second annotation"} ]],
};

template <typename E> concept scoped_enum_json_type = std::is_enum_v<E>;

template <scoped_enum_json_type T>
constexpr std::pair<std::string_view, std::string_view> get_scoped_enum_value_name(T enum_obj) {
    static constexpr auto MEMBERS = std::define_static_array(enumerators_of(^^T));

    template for(constexpr auto MEMBER: MEMBERS) {
        if constexpr(has_identifier(MEMBER) && !is_function(MEMBER)) {
            constexpr auto MEMBER_NAME = identifier_of(MEMBER);
            if([:MEMBER:] == enum_obj) {
                static constexpr auto ANNOTATIONS = std::define_static_array(annotations_of(MEMBER));
                template for(constexpr auto ANN: ANNOTATIONS) {
                    return {MEMBER_NAME, [:constant_of(ANN):].annotation};
                }
            }
        }
    }

    // Inaccessible code
    return {"no_enum_representation", "none"};
}

int main() {
    std::println("{}", get_scoped_enum_value_name(distribution_name::alt));
    std::println("{}", get_scoped_enum_value_name(distribution_name::arch));
    return 0;
}

(“alt”, “Alt linux”)

(“arch”, “Arch linux”)

Ограничте жор ресурсов clangd.

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

Отличный пример, надо поразмышлять над этой темой, появилась задачка с SQLite.

Благо gcc-16.1.1 зарелизили, можно ковырять без танцев с бубном.

std::flat_map/set уже есть в gcc16.

Кто-то до сих пор сидит на DOSе, обмазанном костылями от Microslop?!..

Мы с выходом GCC-16 во внутрянке во всю его применять начали, местами в 1,5 раза код похудел.

Я просто в цикле по пакам и файлам бегал и в библиотеки собирал. До появления СМаке в кубе я СМаком парсил мэйкфайл и настраивал флаги и бинари в СМаке. По сравнению с мэйкфайлами СМаке — это как питон или lua, очередной скриптовый язык, в котором всё более-менее понятно. Само качает подключает и настраивает. Смотрю изобретателей велосипеда меньше не становиться.

cmake_minimum_required(VERSION 4.00)

set(CMAKE_CXX_STANDARD 26)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS ON)

project(F031K6 CXX ASM)

# Populate CMSIS using stm32
stm32_fetch_cmsis(F0)

find_package(CMSIS COMPONENTS STM32F0 REQUIRED)

include(FetchContent)

FetchContent_Declare(
  ctre
  GIT_REPOSITORY https://github.com/hanickadot/compile-time-regular-expressions.git
  GIT_TAG main
  GIT_SHALLOW ON)

FetchContent_Declare(
  pfr
  GIT_REPOSITORY https://github.com/boostorg/pfr.git
  GIT_TAG master
  GIT_SHALLOW ON)

FetchContent_MakeAvailable(pfr ctre)

# Project sources
file(GLOB_RECURSE SOURCES src/*.cpp src/*.c src/*.h)

# Add executable (firmware) target
add_executable(${PROJECT_NAME} ${SOURCES})

# Recommended options for stm32 dev
target_compile_options(${PROJECT_NAME} PRIVATE 
  $<$<COMPILE_LANGUAGE:CXX>:
  -Wno-volatile
  -fno-asynchronous-unwind-tables
  -fno-exceptions
  -fno-non-call-exceptions
  -fno-rtti
  -fno-use-cxa-atexit
  -fpermissive
  >
  # -ffast-math
  -Wall
  # -Wconversion
  -Werror
  -Wextra
  -Wimplicit-fallthrough
  -Wpedantic
  -g3
  -ffunction-sections
  -fdata-sections
  # -flto
)

# Link options
target_link_options(${PROJECT_NAME} PRIVATE
  # -flto
  -Wl,--print-memory-usage
  -Wl,--gc-sections
  "-Wl,-Map=${CMAKE_SOURCE_DIR}/${PROJECT_NAME}.map")

# Link CMSIS and other dependences here
target_link_libraries(${PROJECT_NAME} PRIVATE
  ctre::ctre
  pfr::pfr
  CMSIS::STM32::F031K6 
  STM32::NoSys 
  STM32::Nano
)

Руки чесались добавить в КЛанг или ГКК, но не потяну… Хотя малыми издержками есть мысли, как это добавить (вариант от ЭДГ). Или ЭДГ спереть с КЭ)))

Чем в городки с компилятором играть и приседать, использовали бы для вывода из компайлтайма в рантайм векторов и строк:

std::define_static_string(...);
std::define_static_array(...);
std::define_static_object(...);
 enum EngineeringUnitCodes : uint8_t {
    // Temperature
    DegreesCelsius      [[=TEMPERATURE, =u8"ºC"_sym      ]] = 32,
    DegreesFahrenheit   [[=TEMPERATURE, =u8"ºF"_sym      ]] = 33,
    DegreesRankine      [[=TEMPERATURE, =u8"ºR"_sym      ]] = 34,
    Kelvin              [[=TEMPERATURE, =u8"K"_sym       ]] = 35,
    // Pressure
    Pressure_1          [[=PRESSURE, =u8"inH2O"_sym      ]] = 1,   // inH2O        | inches of water at 68ºF / 20ºC
    Pressure_2          [[=PRESSURE, =u8"inHg"_sym       ]] = 2,   // inHg         | inches of mercury at 0ºC
    ...
    Pressure_238      [[=PRESSURE, =u8"inH2O (4ºC)"_sym  ]] = 238, // inH2O (4ºC)  | inches of water at 4ºC
    Pressure_239      [[=PRESSURE, =u8"mmH2O (4ºC)"_sym  ]] = 239, // mmH2O (4ºC)  | millimeters of water at 4ºC
    // Electromagnetic Unit of Electric Potential
    MilliVolts        [[=ELECTRIC_POTENTIAL, =u8"mV"_sym ]] = 36,
    Volts             [[=ELECTRIC_POTENTIAL, =u8"V"_sym  ]] = 58,
    // Electrostatic Unit of Current
    MilliAmperes      [[=CURRENT, =u8"mA"_sym            ]] = 39,
    // Electromagnetic Unit of Resistance
    Ohms              [[=RESISTANCE, =u8"Ω"_sym          ]] = 37,
    KiloOhms          [[=RESISTANCE, =u8"kΩ"_sym         ]] = 163,
    //Miscellaneous
    PotentialOfHydrogen [[=MISCELLANEOUS, =u8"pH "_sym   ]] = 59,  // (acidity or alkalinity)
    Hertz                      [[=FREQUENCY, =u8"Hz"_sym      ]] =	38,
    ...
    PercentLowerExplosionLevel [[=MISCELLANEOUS, =u8"%LEL"_sym]] = 161,
    PartsPerBillion            [[=MISCELLANEOUS, =u8"ppb"_sym ]] = 169,
};

C++26 с рефлексией по круче раста местами будет.


Curves toCurves(const QPainterPath& pPath) {
    using QPP = QPainterPath;
    using El = QPP::Element;
    Curves curves;
    for(auto&& elements: v::iota(0, pPath.elementCount())
            | v::transform(std::bind(&QPP::elementAt, pPath, _1))            // to Element
            | v::chunk_by(+[](const El&, const El& r) { return r.type; })) { // to Subpath Polygons

        // qInfo() << "elements" << elements.size();                         // count of elements

        constexpr auto splitPaths = +[](const El&, const El& r) { return r.type > QPP::CurveToElement; };
        auto subpaths = v::chunk_by(elements, splitPaths); // separate Curves

        Curve curve;
        for(auto&& [from, to]: v::pairwise(subpaths)) { // 'from' point to bezier Point in 'to' if
            if(curve.empty()) curve.emplace_back(static_cast<QPointF>(from.front()));

            if(to.front().type == QPP::CurveToElement) { // is arcTo
                // Проверка, является ли кривая Безье дугой окружности
                QPointF center;
                double radius;
                if(isArcOfCircle(from.back(), to[0], to[1], to[2], center, radius, 5e-3)) {
                    // qInfo() << "Arc 1" << radius << center;
                    curve.emplace_back(static_cast<QPointF>(to.back()), center, DIR(from.back(), center, to.back()));
                } else {                          // is lineTo
                    drawCross45(center, Qt::red); // debug
                    curve.emplace_back(static_cast<QPointF>(to.back()));
                }
            } else
                curve.emplace_back(static_cast<QPointF>(to.front()));
        }
        if(curve.size()) curves.emplace_back(std::move(curve));
    }
    return curves;
}

Хотелось бы, чтобы для лямбд try‑catch блоки, как для функций, разрешили без внешних {}, так как в рэнжах они частые гости. Раз разрешили кидать исключения в компилятайме, то для рефлексии это было бы полезным дополнением. Минус две фигурные скобки. Мне кажется, это легко реализуемо, и поправится лишь парсер и формулировка в стандарте.

Скорее всего и дальше не захочет понимать. Ямл какой-то замороченный (питонисты заразили наверно), ещё и версии его разные несовместимы. Как такой бред сотворить моги — моё "почтение"!!! JSON и XML как придумали, так 100 лет не меняли и работают как АК.

В функции get_members_inf() сортировка такая

std::ranges::sort(res, std::greater{}, &MemberInfo::align);

должна быть. Но и с возрастанием тесты тоже проходит...

Что-то такое будет примерно.

https://godbolt.org/z/j8qnfe98f

auto print = [](auto&& array) {
    for (auto&& [name, val] : array)
        std::println("{: <15}:{:13.6f}", name, val);
};
std::println("============ VPN ============");
std::println("Count          : {}", 131184);
std::println("\nFill");
print(Fill);
std::println("\nSearch");
print(Search);

Можно ещё и так хранилище объявить.

https://godbolt.org/z/4Y8o6fW7M

struct storage;
consteval {
    // Получаем всю необходимую нам информацию о типах
    constexpr auto info = get_members_info();
    meta::info members[sizeof...(Ts)];
    template for(constexpr std::size_t I: 
        std::define_static_array(std::views::iota(0u, sizeof...(Ts))))
        members[I] =
            meta::data_member_spec(^^Ts...[info[I].original_idx]);
    // Создаём поля структуры storage для хранения данных
    meta::define_aggregate(^^storage, members);
}
alignas(Ts...) storage data;

Information

Rating
5,647-th
Location
Зеленоград, Москва и Московская обл., Россия
Registered
Activity