cpp_utils.h
37 lines
| 1.8 KiB
| text/x-c
|
CLexer
r38 | #ifndef CPP_UTILS_H | |||
#define CPP_UTILS_H | ||||
r84 | #include <functional> | |||
#include <tuple> | ||||
r38 | #include <type_traits> | |||
r84 | template<class...> using void_t = void; | |||
r38 | ||||
r84 | #define HAS_METHOD(method) \ | |||
template<class T, class = void> struct _has_##method : std::false_type \ | ||||
{}; \ | ||||
\ | ||||
template<class T> \ | ||||
struct _has_##method< \ | ||||
T, void_t<std::is_member_function_pointer<decltype(&T::method)>>> \ | ||||
: std::true_type \ | ||||
{}; \ | ||||
\ | ||||
template<class T> \ | ||||
static inline constexpr bool has_##method = _has_##method<T>::value; | ||||
r38 | ||||
r84 | // taken from here https://www.fluentcpp.com/2017/10/27/function-aliases-cpp/ | |||
#define ALIAS_TEMPLATE_FUNCTION(highLevelF, lowLevelF) \ | ||||
template<typename... Args> \ | ||||
inline auto highLevelF(Args&&... args) \ | ||||
->decltype(lowLevelF(std::forward<Args>(args)...)) \ | ||||
{ \ | ||||
return lowLevelF(std::forward<Args>(args)...); \ | ||||
} | ||||
r39 | ||||
r84 | template<typename T> constexpr T diff(const std::pair<T, T>& p) | |||
{ | ||||
return p.second - p.first; | ||||
} | ||||
r38 | ||||
#endif // CPP_UTILS_H | ||||