Skip to content

Instantly share code, notes, and snippets.

View Nekrolm's full-sized avatar

Dmitry Sviridkin Nekrolm

View GitHub Profile
@Nekrolm
Nekrolm / ugly_c_callback.md
Last active March 2, 2024 18:54
How to deal with ugly C callbacks

Мерзкий С-callback

Итак вы программист на высокоуровневых языках: Python, Java, C++ (прости господи)... И вот однажды вам, по долгу службы, выпадает необходимость взять и написать код на C/C++ с использованием прекрасной чистой C библиотеки... мы будем ее звать X.

В этой замечательной библиотеке есть функция

struct power_management_ctx_t; // opaque struct
@Nekrolm
Nekrolm / move_the_vector.md
Created January 14, 2024 00:05
How to move vectors of different types

Как перекладывают вектора

При работе над разными числодробилками, анализирующими последовательности, применяющими фильтры к картинкам, cчитающим свертки и проч, периодически возникает необходимость преобразовать массив целых чисел в массив чисел с плавающей точкой и наоборот.

На C++ это может выглядеть так

std::vector<float> to_floats(std::vector<int> input) {
    std::vector<float> result(input.size());
    std::transform(begin(input), end(input), begin(result), [](int x) -> float { return x; });
@Nekrolm
Nekrolm / magic_handlers.cpp
Created May 30, 2023 22:37
Magic handlers in C++20
#include <memory>
#include <type_traits>
#include <concepts>
#include <span>
#include <functional>
#include <iostream>
struct Context {
std::string_view body;
std::string_view headers;
@Nekrolm
Nekrolm / cxxconcept17.hpp
Last active November 23, 2020 15:22
cxxconcept17
#pragma once
#include <type_traits>
namespace cxxconcept17 {
namespace detail {
enum class RequiredE { kRequired = 0 };
}
@Nekrolm
Nekrolm / cpp14_17_traits_4.md
Last active November 4, 2020 08:10
cpp14_17_traits_4

C++14/17 type_traits. Часть 4.

в предыдущей серии мы изобретали CRTP. А в этой серии мы вернемся обратно к тому с чего начинали и изобретем удивительно прекрасную синтаксическую конструкцию, сравнимую по красоте с концептами.

Пусть наша задача написать свой собственный std::bit_cast. C++20, конечно, вышел, но до продакшена везде и повсюду ему далеко, так что такая задача вполне может быть.

bit_cast позволяет посмотреть на значение одного типа, как будто бы это значение совершенно другого типа. Как reinterpret_cast, только без нарушения strict aliasing rule и провоцирования UB.

В простейшем и очень не правильном виде, bit_cast реализуется так:

@Nekrolm
Nekrolm / cpp_11_17_lifelime_check.md
Last active February 21, 2024 12:48
cpp_11_17_avoid_dangling_reference

std::dangling, или как хоть иногда не отстрелить себе ногу

- А можно нам lifetime checker?

- У нас есть lifetime checker дома

Lifetime checker дома:

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

@Nekrolm
Nekrolm / cpp14_traits_3.md
Last active August 25, 2020 21:45
cpp14_17_traits_part3

C++14/17 type_traits Часть 3.

В предыдущей серии мы изобретали нечто, называемое XXX_traits, где под XXX скрывается какой-то концепт. А сам трейт описывает, какие операции доступны для типов, реализующих данный концепт. И все взаимодействие с шаблонными параметрами происходило с помощью вспомогательной структуры.

template <class T, class S>
auto accumulate(const std::vector<T>& arr, S&& op) 
    -> RESULT<T>::REQUIRES<SummatorTraits<S>::value> {
    using STraits = SummatorTraits<S>;
@Nekrolm
Nekrolm / cdfs.cpp
Created February 22, 2020 12:14
compile-time dfs
#include <iostream>
#include <cstring>
#include <type_traits>
#include <utility>
#include <tuple>
// graph descriptions
template <int... Next>
using AdjacentList = std::integer_sequence<int, Next...>;
@Nekrolm
Nekrolm / cpp20_concepts.cpp
Created January 11, 2020 15:12
c++20 concepts example
#include <type_traits>
template <class From, class To>
concept is_convertible = requires(From f){
{ static_cast<To>(f) } -> To;
};
template <typename Fst>
concept BaseFst = requires {
@Nekrolm
Nekrolm / cpp14_traits_2.md
Last active August 25, 2020 21:45
cpp14_traits_part2

C++14/17 type_traits Часть 2.

В предыдущей серии мы пытались сделать нечто, напоминающее проверку концепции C++20 средствами C++14/17.

У нас была функция sum, от типов аргументов которой мы требовали применимости операции +. И выглядело в конечном итоге это так:

template<typename T>
auto sum(T a, T b) -&gt; RESULT::REQUIRES&gt; {