From ccb7d14a8b1ad6d80308c14a3f0b209d66c3c88d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=20Ankarstr=C3=B6m?= Date: Wed, 24 Aug 2022 03:01:10 +0200 Subject: Add FetchScreenwriters. Improve thread communication. --- c/util.h | 53 +++++++++++++++++++++++++++++++++++------------------ 1 file changed, 35 insertions(+), 18 deletions(-) (limited to 'c/util.h') diff --git a/c/util.h b/c/util.h index 7c2b293..7f704df 100644 --- a/c/util.h +++ b/c/util.h @@ -11,17 +11,14 @@ #define CONCAT(a, b) CONCAT_IMPL(a, b) #define _ CONCAT(unused_, __LINE__) -inline size_t Min(size_t a, size_t b) +template +struct Finally { - return a < b? a: b; -} - -inline int Cmp(const int a, const int b) -{ - if (a == b) return 0; - if (a > b) return 1; - return -1; -} + F f; + inline Finally(F f) : f(f) {} + inline ~Finally() { f(); } +}; +#define FINALLY Finally _ = [=]() /* Generic RAII type. */ template @@ -45,33 +42,53 @@ template struct Buf { T* data; - size_t size; - Buf(T* data, size_t size) : data(data), size(size) {} - Buf(std::basic_string& s) : data(s.data()), size(s.capacity()) {} - template Buf(T (&data)[N]) : data(data), size(N) {} + size_t c; + Buf(T* data, size_t c) : data(data), c(c) {} + Buf(std::basic_string& s) : data(s.data()), c(s.capacity()) {} + template Buf(T (&data)[N]) : data(data), c(N) {} operator T*() { return data; } T& operator *() { return *data; } T& operator [](size_t i) { return data[i]; } + Buf operator +(size_t i) { return {data+i, c-i}; } + //T operator -(size_t i) { return {data-i, c+i}; } }; +inline int Cmp(const int a, const int b) +{ + if (a == b) return 0; + if (a > b) return 1; + return -1; +} + +inline size_t Min(size_t a, size_t b) +{ + return a < b? a: b; +} + +template +inline size_t Len(T (&)[N]) +{ + return N-1; +} + /* Format wide string. */ template inline int Swprintf(Buf buf, const wchar_t* const fmt, T... xs) { - return _snwprintf_s(buf, buf.size, _TRUNCATE, fmt, xs...); + return _snwprintf_s(buf, buf.c, _TRUNCATE, fmt, xs...); } /* Format static narrow string. */ template inline int Sprintf(Buf buf, const char* const fmt, T... xs) { - return _snprintf_s(buf, buf.size, _TRUNCATE, fmt, xs...); + return _snprintf_s(buf, buf.c, _TRUNCATE, fmt, xs...); } /* Copy to static wide string buffer. */ inline wchar_t* Wcscpy(Buf dst, const wchar_t* const src) { - const size_t len = Min(dst.size, wcslen(src)+1); + const size_t len = Min(dst.c, wcslen(src)+1); memcpy(dst, src, len*sizeof(wchar_t)); dst[len-1] = 0; return dst; @@ -80,7 +97,7 @@ inline wchar_t* Wcscpy(Buf dst, const wchar_t* const src) /* Copy to static narrow string buffer. */ inline char* Strcpy(Buf dst, const char* const src) { - const size_t len = Min(dst.size, strlen(src)+1); + const size_t len = Min(dst.c, strlen(src)+1); memcpy(dst, src, len); dst[len-1] = 0; return dst; -- cgit v1.2.3