Skip to content

Instantly share code, notes, and snippets.

@hutorny
hutorny / ch340.c
Created January 24, 2016 14:36 — forked from z4yx/ch340.c
//libusb+ch340 data transfer demo
//gcc usb.c `pkg-config libusb-1.0 --libs --cflags` -o usb
#include <errno.h>
#include <signal.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <unistd.h>
#include <sys/select.h>
/* container_of, inspired by AndrewTsao */
template <class T, typename M>
constexpr T* container_of(M *m, const M T::*p) noexcept {
return reinterpret_cast<T*>(reinterpret_cast<char*>(m)
- reinterpret_cast<const ptrdiff_t>(
&(static_cast<const T *>(nullptr)->*p)));
}
/** assign - assigns a value to all array elements
* usage: short arr[77]; assign(arr,88);
* License: MIT */
template<typename T, size_t N, typename V>
static inline void assign(T (&a)[N], V v) noexcept {
for(size_t i=0; i<N; ++i) a[i] = v;
}
@hutorny
hutorny / list.hpp
Created March 23, 2017 09:41
Simple doubly linked list imlementation
/* simple doubly linked list imlementation */
template<typename T>
class list {
public:
inline T* pfront() noexcept { return head ? &head->data : nullptr; }
inline T* pback() noexcept { return tail ? &tail->data : nullptr; }
template<typename ... Args>
inline T* construct(Args ... __args) noexcept {
return &append(new item(__args ...))->data;
}
@hutorny
hutorny / miculog.config
Created March 24, 2017 09:47
Minimalistic C++11 logger with per-user-class configuration
/**
* This file is intended for miculog per-class configuration
*/
/* remove this message from your own copy of miculog.config */
#pragma message "Default miculog configuration is in use"
/* add forward declaration of your classes here,
* embrace classes in namespaces, as needed
@hutorny
hutorny / anotherclass.ccs
Created April 4, 2017 11:11
Cascaded Configuration Sets for C++1y
/************************************************************************/
/* anotherclass.ccs definition of configuration options and sets for */
/* MyAnotherClass */
/************************************************************************/
#include <ccs>
#pragma once
class MyAnotherClass;
namespace configuration {
template<>
struct Configuration<MyAnotherClass, Default> {
@hutorny
hutorny / enumnames.hpp
Created January 21, 2017 18:05
Zero-dependency allocation-free mapping enum values to names for C++11
/** zero-dependency allocation-free mapping enum values to names */
namespace enumnames {
typedef const char* (*name)();
bool match(const char*, const char*) noexcept; /* to be provided by the user */
template<typename T, T K, name V>
struct tuple {
typedef T key_t;
static constexpr T key = K;
/* constexpr any_of against a list of constants */
/** type_of_list<...>::type - helper structure for determining type of the first item in the list */
template<auto ... List> struct type_of_list;
template<auto List> struct type_of_list<List> { using type = decltype(List); };
template<auto First, auto ... List > struct type_of_list<First, List...> : type_of_list<First> {};
/** type_of<...>::type - determines type of the first item in the list */
template<auto ... List>
using type_of = typename type_of_list<List...>::type;
#include <type_traits>
#if __cplusplus > 201709L
#include <bit>
template<typename T>
constexpr int countr_zero(T val) noexcept { return std::countr_zero(val); }
template<typename T>
constexpr int popcount(T val) noexcept { return std::popcount(val); }
#else
template<typename T, typename = std::enable_if_t<std::is_integral<T>::value,T>>
@hutorny
hutorny / multidispatcher.cpp
Created January 16, 2021 08:40
Multimethods for C++, example 1, calculus multidispatcher
#include <iostream>
#include <stdexcept>
#define TRACE() \
std::cout << __PRETTY_FUNCTION__ << std::endl;
namespace details {
template<class Parameter>
struct expected {
template<class Argument>