20#ifndef WG14_RESULT_STATUS_CODE_DOMAIN_H
21#define WG14_RESULT_STATUS_CODE_DOMAIN_H
33#if defined(__GNUC__) && !defined(__clang__)
34#pragma GCC diagnostic push
35#pragma GCC diagnostic ignored "-Wclass-memaccess"
40#pragma warning(disable : 4996)
44 typedef unsigned long long
48 typedef struct WG14_RESULT_PREFIX(status_code_domain_string_ref_s)
60 typedef struct WG14_RESULT_PREFIX(status_code_domain_string_ref_thunk_args_s)
73 struct WG14_RESULT_PREFIX(status_code_domain_string_ref_s)
82 WG14_RESULT_PREFIX(status_code_domain_string_ref_is_empty)(
99 return src->thunk(&args);
101 memcpy(dest, src,
sizeof(*dest));
107 WG14_RESULT_PREFIX(status_code_domain_string_ref_move)(
116 const int errcode = src->thunk(&args);
120 "status_code_domain_string_ref_move failed due to %d (%s)", errcode,
125 memcpy(dest, src,
sizeof(*dest));
126 memset(src, 0,
sizeof(*src));
131 WG14_RESULT_PREFIX(status_code_domain_string_ref_destroy)(
142 const int errcode = src->thunk(&args);
146 "status_code_domain_string_ref_destroy failed due to %d (%s)", errcode,
151 memset(src, 0,
sizeof(*src));
157 WG14_RESULT_PREFIX(status_code_domain_string_ref_from_static_string_slice)(
158 const char *s,
size_t len)
171 WG14_RESULT_PREFIX(status_code_domain_string_ref_from_static_string)(
174 return WG14_RESULT_PREFIX(
175 status_code_domain_string_ref_from_static_string_slice)(s, strlen(s));
192 status_code_domain_string_ref_atomic_refcounted_from_string)(
const char *s)
194 return WG14_RESULT_PREFIX(
204 typedef const struct WG14_RESULT_PREFIX(status_code_domain_s)
208 typedef struct WG14_RESULT_PREFIX(status_code_domain_payload_info)
216#define STATUS_CODE_DOMAIN_PAYLOAD_INFO_INIT_INNARDS(T) \
217 sizeof(T), sizeof(WG14_RESULT_PREFIX(status_code_domain) *) + sizeof(T), \
218 (__alignof(T) > __alignof(WG14_RESULT_PREFIX(status_code_domain) *)) ? \
220 __alignof(WG14_RESULT_PREFIX(status_code_domain) *)
224#define STATUS_CODE_DOMAIN_PAYLOAD_INFO_INIT(T) \
225 {STATUS_CODE_DOMAIN_PAYLOAD_INFO_INIT_INNARDS(T)}
229 WG14_RESULT_PREFIX(status_code_domain_payload_info_make)(
230 size_t payload_size,
size_t total_size,
size_t total_alignment)
233 ret = {payload_size, total_size, total_alignment};
237#define STATUS_CODE_DOMAIN_PAYLOAD_INFO_MAKE(T) \
238 WG14_RESULT_PREFIX(status_code_domain_payload_info_make) \
239 (STATUS_CODE_DOMAIN_PAYLOAD_INFO_INIT_INNARDS(T))
242 typedef struct WG14_RESULT_PREFIX(status_code_untyped)
248 typedef struct WG14_RESULT_PREFIX(status_code_generic_s)
283#ifndef WG14_RESULT_VTABLE_API
284#define WG14_RESULT_VTABLE_API_GLUE2(x, y) x##y
285#define WG14_RESULT_VTABLE_API_GLUE(x, y) WG14_RESULT_VTABLE_API_GLUE2(x, y)
286#define WG14_RESULT_VTABLE_API_UNIQUE_NAME \
287 WG14_RESULT_VTABLE_API_GLUE(_wg14_result_vtable_api_unique_name_temporary, \
293#define WG14_RESULT_VTABLE_API(name, ...) __stdcall name(__VA_ARGS__)
294#define WG14_RESULT_VTABLE_DECL(name, ...) (__stdcall name)(__VA_ARGS__)
301 __declspec(thread)
struct WG14_RESULT_PREFIX(win32_invoke_with_this_storage_s)
306 } WG14_RESULT_PREFIX(win32_invoke_with_this_storage);
307 inline int __declspec(naked) WG14_RESULT_PREFIX(win32_invoke_with_this)(
308 struct WG14_RESULT_PREFIX(win32_invoke_with_this_storage_s) * tls,
void *func,
351 inline bool __declspec(naked) WG14_RESULT_PREFIX(win32_invoke_with_this_bool)(
352 struct WG14_RESULT_PREFIX(win32_invoke_with_this_storage_s) * tls,
void *func,
398template <
class T>
struct WG14_RESULT_PREFIX(win32_invoke_with_this_impl)
400 static constexpr auto value = WG14_RESULT_PREFIX(win32_invoke_with_this);
402template <>
struct WG14_RESULT_PREFIX(win32_invoke_with_this_impl)<bool>
404 static constexpr auto value = WG14_RESULT_PREFIX(win32_invoke_with_this_bool);
408#define WG14_RESULT_VTABLE_INVOKE_API(domain, name, ...) \
409 WG14_RESULT_PREFIX( \
410 win32_invoke_with_this_impl<decltype((domain)->vptr->name( \
411 __VA_ARGS__))>)::value(&WG14_RESULT_PREFIX(win32_invoke_with_this_storage), \
412 (void *) (domain)->vptr->name, (domain), __VA_ARGS__)
414#define WG14_RESULT_VTABLE_INVOKE_API(domain, name, ...) \
415 (_Generic((domain)->vptr->name(__VA_ARGS__), \
416 bool: WG14_RESULT_PREFIX(win32_invoke_with_this_bool)( \
417 &WG14_RESULT_PREFIX(win32_invoke_with_this_storage), \
418 (void *) (domain)->vptr->name, (domain), __VA_ARGS__), \
419 default: WG14_RESULT_PREFIX(win32_invoke_with_this)( \
420 &WG14_RESULT_PREFIX(win32_invoke_with_this_storage), \
421 (void *) (domain)->vptr->name, (domain), __VA_ARGS__)))
424#define WG14_RESULT_VTABLE_API(name, ...) \
425 name(__pragma(warning(suppress : 4100)) \
426 const void *WG14_RESULT_VTABLE_API_UNIQUE_NAME , \
428#define WG14_RESULT_VTABLE_DECL(name, ...) \
429 (name)(__pragma(warning(suppress : 4100)) \
430 const void *WG14_RESULT_VTABLE_API_UNIQUE_NAME , \
432#define WG14_RESULT_VTABLE_INVOKE_API(domain, name, ...) \
433 (domain)->vptr->name((domain), __VA_ARGS__)
437#define WG14_RESULT_VTABLE_API(name, ...) \
438 name(__attribute__((unused)) \
439 const void *WG14_RESULT_VTABLE_API_UNIQUE_NAME , \
441#define WG14_RESULT_VTABLE_DECL(name, ...) \
442 (name)(__attribute__((unused)) \
443 const void *WG14_RESULT_VTABLE_API_UNIQUE_NAME , \
445#define WG14_RESULT_VTABLE_INVOKE_API(domain, name, ...) \
446 (domain)->vptr->name((domain), __VA_ARGS__)
451 struct WG14_RESULT_PREFIX(status_code_domain_vtable_name_args)
458 struct WG14_RESULT_PREFIX(status_code_domain_vtable_payload_info_args)
464 struct WG14_RESULT_PREFIX(status_code_domain_vtable_generic_code_args);
467 struct WG14_RESULT_PREFIX(status_code_domain_vtable_message_args)
475 typedef const struct WG14_RESULT_PREFIX(status_code_domain_vtable_s)
479 struct WG14_RESULT_PREFIX(
484 struct WG14_RESULT_PREFIX(
500 struct WG14_RESULT_PREFIX(
506 struct WG14_RESULT_PREFIX(
532 struct WG14_RESULT_PREFIX(status_code_domain_s)
550 struct WG14_RESULT_PREFIX(status_code_domain_vtable_payload_info_args) args;
551 memset(&args, 0,
sizeof(args));
552 args.domain = src->
domain;
558 const size_t tocopy = (dstinfo.
total_size > args.ret.total_size) ?
559 args.ret.total_size :
561 memcpy(dst, src, tocopy);
584#define STATUS_CODE_DOMAIN_UNIQUE_ID_FROM_UUID_ABORT(msg) (msg, 1 / 0)
586#define STATUS_CODE_DOMAIN_UNIQUE_ID_FROM_UUID_ABORT(msg) (0)
589#define STATUS_CODE_DOMAIN_UNIQUE_ID_FROM_UUID_PARSE_HEX_BYTE(c) \
590 (('0' <= (c) && (c) <= '9') ? (unsigned long long) ((c) - '0') : \
591 ('a' <= (c) && (c) <= 'f') ? (unsigned long long) (10 + (c) - 'a') : \
592 ('A' <= (c) && (c) <= 'F') ? (unsigned long long) (10 + (c) - 'A') : \
593 STATUS_CODE_DOMAIN_UNIQUE_ID_FROM_UUID_ABORT( \
594 "Invalid character in UUID"))
598#define STATUS_CODE_DOMAIN_UNIQUE_ID_FROM_UUID(uuid) \
599 (((STATUS_CODE_DOMAIN_UNIQUE_ID_FROM_UUID_PARSE_HEX_BYTE(uuid[0]) ^ \
600 STATUS_CODE_DOMAIN_UNIQUE_ID_FROM_UUID_PARSE_HEX_BYTE(uuid[19])) \
602 ((STATUS_CODE_DOMAIN_UNIQUE_ID_FROM_UUID_PARSE_HEX_BYTE(uuid[1]) ^ \
603 STATUS_CODE_DOMAIN_UNIQUE_ID_FROM_UUID_PARSE_HEX_BYTE(uuid[20])) \
605 ((STATUS_CODE_DOMAIN_UNIQUE_ID_FROM_UUID_PARSE_HEX_BYTE(uuid[2]) ^ \
606 STATUS_CODE_DOMAIN_UNIQUE_ID_FROM_UUID_PARSE_HEX_BYTE(uuid[21])) \
608 ((STATUS_CODE_DOMAIN_UNIQUE_ID_FROM_UUID_PARSE_HEX_BYTE(uuid[3]) ^ \
609 STATUS_CODE_DOMAIN_UNIQUE_ID_FROM_UUID_PARSE_HEX_BYTE(uuid[22])) \
611 ((STATUS_CODE_DOMAIN_UNIQUE_ID_FROM_UUID_PARSE_HEX_BYTE(uuid[4]) ^ \
612 STATUS_CODE_DOMAIN_UNIQUE_ID_FROM_UUID_PARSE_HEX_BYTE(uuid[24])) \
614 ((STATUS_CODE_DOMAIN_UNIQUE_ID_FROM_UUID_PARSE_HEX_BYTE(uuid[5]) ^ \
615 STATUS_CODE_DOMAIN_UNIQUE_ID_FROM_UUID_PARSE_HEX_BYTE(uuid[25])) \
617 ((STATUS_CODE_DOMAIN_UNIQUE_ID_FROM_UUID_PARSE_HEX_BYTE(uuid[6]) ^ \
618 STATUS_CODE_DOMAIN_UNIQUE_ID_FROM_UUID_PARSE_HEX_BYTE(uuid[26])) \
620 ((STATUS_CODE_DOMAIN_UNIQUE_ID_FROM_UUID_PARSE_HEX_BYTE(uuid[7]) ^ \
621 STATUS_CODE_DOMAIN_UNIQUE_ID_FROM_UUID_PARSE_HEX_BYTE(uuid[27])) \
623 ((STATUS_CODE_DOMAIN_UNIQUE_ID_FROM_UUID_PARSE_HEX_BYTE(uuid[9]) ^ \
624 STATUS_CODE_DOMAIN_UNIQUE_ID_FROM_UUID_PARSE_HEX_BYTE(uuid[28])) \
626 ((STATUS_CODE_DOMAIN_UNIQUE_ID_FROM_UUID_PARSE_HEX_BYTE(uuid[10]) ^ \
627 STATUS_CODE_DOMAIN_UNIQUE_ID_FROM_UUID_PARSE_HEX_BYTE(uuid[29])) \
629 ((STATUS_CODE_DOMAIN_UNIQUE_ID_FROM_UUID_PARSE_HEX_BYTE(uuid[11]) ^ \
630 STATUS_CODE_DOMAIN_UNIQUE_ID_FROM_UUID_PARSE_HEX_BYTE(uuid[30])) \
632 ((STATUS_CODE_DOMAIN_UNIQUE_ID_FROM_UUID_PARSE_HEX_BYTE(uuid[12]) ^ \
633 STATUS_CODE_DOMAIN_UNIQUE_ID_FROM_UUID_PARSE_HEX_BYTE(uuid[31])) \
635 ((STATUS_CODE_DOMAIN_UNIQUE_ID_FROM_UUID_PARSE_HEX_BYTE(uuid[14]) ^ \
636 STATUS_CODE_DOMAIN_UNIQUE_ID_FROM_UUID_PARSE_HEX_BYTE(uuid[32])) \
638 ((STATUS_CODE_DOMAIN_UNIQUE_ID_FROM_UUID_PARSE_HEX_BYTE(uuid[15]) ^ \
639 STATUS_CODE_DOMAIN_UNIQUE_ID_FROM_UUID_PARSE_HEX_BYTE(uuid[33])) \
641 ((STATUS_CODE_DOMAIN_UNIQUE_ID_FROM_UUID_PARSE_HEX_BYTE(uuid[16]) ^ \
642 STATUS_CODE_DOMAIN_UNIQUE_ID_FROM_UUID_PARSE_HEX_BYTE(uuid[34])) \
644 ((STATUS_CODE_DOMAIN_UNIQUE_ID_FROM_UUID_PARSE_HEX_BYTE(uuid[17]) ^ \
645 STATUS_CODE_DOMAIN_UNIQUE_ID_FROM_UUID_PARSE_HEX_BYTE(uuid[35])) \
653 WG14_RESULT_PREFIX(status_code_domain_name)(
656 struct WG14_RESULT_PREFIX(status_code_domain_vtable_name_args) args;
657 memset(&args, 0,
sizeof(args));
658 args.domain = domain;
674 struct WG14_RESULT_PREFIX(status_code_domain_vtable_payload_info_args) args;
675 memset(&args, 0,
sizeof(args));
676 args.domain = domain;
686#if defined(__GNUC__) && !defined(__clang__)
687#pragma GCC diagnostic pop
692#if WG14_RESULT_ENABLE_HEADER_ONLY
693#include "../../src/wg14_result/status_code_domain.c"
#define WG14_RESULT_NULLPTR
#define WG14_RESULT_INLINE
#define WG14_RESULT_EXTERN
#define WG14_RESULT_ABORTF(...)
status_code_domain_unique_id_type status_code_domain_unique_id_from_uuid(const char *uuid)
Parse a uuid input string to yield a status code domain unique id.
status_code_domain_string_ref status_code_domain_string_ref_atomic_refcounted_from_buffer(const char *s, size_t len)
Make an atomic refcounted string ref which tracks living copies using an atomic reference count,...
#define WG14_RESULT_VTABLE_API(name,...)
#define WG14_RESULT_VTABLE_INVOKE_API(domain, name,...)
unsigned long long status_code_domain_unique_id_type
Type of a unique id of a domain.
int(* status_code_domain_string_ref_thunk_spec)(const status_code_domain_string_ref_thunk_args *args)
Type of a string ref thunk function. Returns an errno value. Copies can fail. Nothing else can.
status_code_domain_string_ref_thunk_op
Type of a string ref thunk op.
@ status_code_domain_string_ref_thunk_op_move
@ status_code_domain_string_ref_thunk_op_copy
@ status_code_domain_string_ref_thunk_op_destruct
#define WG14_RESULT_VTABLE_DECL(name,...)
Type of a payload info of a domain.
size_t total_size
The total status code size in bytes (includes domain pointer and mixins state)
size_t payload_size
The payload size in bytes.
size_t total_alignment
The total status code alignment in bytes.
The functions defined by a status code domain, kept ABI compatible with a C++ vtable.
status_code_domain_vtable *const vptr
C++ ABI compatible vptr.
const status_code_domain_unique_id_type id
The unique id used to identify identical category instances.
Type of a string ref of a domain.
status_code_domain_string_ref_thunk_spec thunk
Type of the arguments to a string ref thunk function.
enum status_code_domain_string_ref_thunk_op op
status_code_domain_string_ref * dest
status_code_domain_string_ref * src
The arguments for status_code_domain_vtable.generic_code
The arguments for status_code_domain_vtable.message
const status_code_untyped * code
status_code_domain_string_ref ret
The arguments for status_code_domain_vtable.name
status_code_domain * domain
status_code_domain_string_ref ret
The arguments for status_code_domain_vtable.payload_info
status_code_domain * domain
status_code_domain_payload_info_t ret
The functions defined by a status code domain, kept ABI compatible with a C++ vtable.
Type of an untyped status code.
status_code_domain * domain