Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Один из двух случаев:
- // - valid = true и value содержит осмысленный результат
- // - valid = false и value может быть любым
- typedef struct
- {
- bool valid;
- int64_t value;
- } maybe_int64;
- // Первый случай; создаем функцию в помощь
- // Не бойтесь за производительность
- maybe_int64 some_int64(int64_t i)
- {
- return (maybe_int64){.value = i, .valid = true};
- }
- // Второй случай; можно создать не функцию,
- // а константный экземпляр структуры
- // Все поля инициализированы нулями
- // .value = 0, .valid = false
- const maybe_int64 none_int64 = {0};
- // упакованное число 42 выводится как "Some 42"
- // Ошибка выводится как None
- void maybe_int64_print(maybe_int64 i)
- {
- if (i.valid)
- {
- printf("Some %d", i.value);
- }
- else
- {
- printf("None");
- }
- }
- // Если обе упаковки содержат ошибку, то результат ошибка
- // Если ровно одна упаковка содержит ошибку, то результат -- вторая
- // Если обе упаковки содержат число, то результат это минимум из двух чисел.
- maybe_int64 maybe_int64_min(maybe_int64 a, maybe_int64 b)
- {
- if (a.valid && b.valid)
- {
- return a.value < b.value ? a : b;
- }
- if (a.valid ^ b.valid)
- {
- return a.valid ? a : b;
- }
- return none_int64;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement