Skip to content

Instantly share code, notes, and snippets.

View Nekrolm's full-sized avatar

Dmitry Sviridkin Nekrolm

View GitHub Profile
@Nekrolm
Nekrolm / my_std_function.cpp
Created November 2, 2024 15:20
std::function type erasure example
#include <stdlib.h>
#include <cstdint>
#include <string>
#include <vector>
#include <map>
#include <iostream>
#include <functional>
#include <utility>
#include <memory>
@Nekrolm
Nekrolm / constexpr_maze_gen.cpp
Last active October 20, 2024 16:54
Constexpr Maze Generator C++23
// https://godbolt.org/z/hfcnTfaz8
#include <cstdint>
#include <array>
#include <cstddef>
#include <ranges>
#include <algorithm>
#include <utility>
#include <format>
#include <string_view>
#include <print>
@Nekrolm
Nekrolm / cpp23_options_list.cpp
Last active July 24, 2024 23:49
compile time boolean option list with C++23
#include <string>
#include <string_view>
#include <iostream>
#include <concepts>
void check_length(std::string_view sv)
{ std::cout << "check len\n"; }
void check_content(std::string_view sv)
{ std::cout << "check content\n"; }
@Nekrolm
Nekrolm / option.cpp
Created June 22, 2024 15:12
C++ optional with destructive move
// https://godbolt.org/z/cfE7sh3jT
#include <type_traits>
#include <utility>
#include <new>
#include <stdexcept>
#include <functional>
#include <print>
#include <string>
#include <vector>
@Nekrolm
Nekrolm / ugly_c_callback.md
Last active June 16, 2024 12:25
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 стандарта, есть механизмы, позволяющие немного снизить вероятность влететь в проблему с обращением по ссылкам к уже мертвым объектам