This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//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> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* 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))); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** 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; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** 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; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* 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; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* 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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/************************************************************************/ | |
/* anotherclass.ccs definition of configuration options and sets for */ | |
/* MyAnotherClass */ | |
/************************************************************************/ | |
#include <ccs> | |
#pragma once | |
class MyAnotherClass; | |
namespace configuration { | |
template<> | |
struct Configuration<MyAnotherClass, Default> { |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <iterator> | |
#include <utility> | |
// see live example on http://coliru.stacked-crooked.com/a/591f4db5a008cb5a | |
template<class Stream, class Vector, class Begin = decltype(std::begin(std::declval<Vector>()))> | |
inline Stream& operator<<(Stream& stream, const Vector& vect) { | |
const char* dlm = ""; | |
for(const auto& i : vect) { stream << dlm << i; dlm = ", "; } | |
return stream; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* 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; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#pragma once | |
#include <cstdint> | |
#include <string_view> | |
namespace fnv1b { | |
/* FNV-1b hash function with extra rotation | |
* https://en.wikipedia.org/wiki/Fowler–Noll–Vo_hash_function | |
*/ | |
template<typename T = std::size_t> | |
inline T hash(const char* str, std::size_t size) noexcept; |
OlderNewer